summaryrefslogtreecommitdiff
path: root/chapter21/src/main
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-04-06 14:43:39 -0700
committerCliff Click <cliffc@acm.org>2025-04-06 14:43:39 -0700
commit4c4778f8cc3dd4fd354832bfb0ba1a8c03ee744d (patch)
tree41904acc974b07aa967d7309fa0a1e7fa77268b4 /chapter21/src/main
parent819963deb617ea622a27918101867aab3c522c3c (diff)
downloadSimple-4c4778f8cc3dd4fd354832bfb0ba1a8c03ee744d.tar.gz
Simple-4c4778f8cc3dd4fd354832bfb0ba1a8c03ee744d.zip
Fix store ref/0x66 prefix
Diffstat (limited to 'chapter21/src/main')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java36
1 files changed, 22 insertions, 14 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java
index 6886a363..5fbd1f02 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java
@@ -31,16 +31,20 @@ public class StoreX86 extends MemOpX86 {
short src = enc.reg(val());
if( src == -1 ) {
- // return opcode for optimised immediate store
- if( x86_64_v2.imm8(_imm) ) enc.add1(0xC6);
- else if( x86_64_v2.imm32(_imm) ) enc.add1(0xC7);
- else enc.add1(x86_64_v2.rex(-1, ptr, idx)).add1(0xC7);
+ int log = _declaredType.log_size();
+ x86_64_v2.rexF(-1, ptr, idx, log==3, enc);
+ switch( log ) {
+ case 0: enc .add1(0xC6); break;
+ case 1: enc.add1(0x66).add1(0xC7); break;
+ case 2: enc .add1(0xC7); break;
+ case 3: enc .add1(0xC7); break;
+ }
x86_64_v2.indirectAdr(_scale, idx, ptr, _off, src, enc);
- switch (x86_64_v2.imm_size(_imm)) {
- case 8: enc.add1(_imm); break;
- case 16: enc.add2(_imm); break;
- case 32: enc.add4(_imm); break;
- case 64: enc.add8(_imm); break;
+ switch( log ) {
+ case 0: enc.add1(_imm); break;
+ case 1: enc.add2(_imm); break;
+ case 2: enc.add4(_imm); break;
+ case 3: enc.add8(_imm); break;
}
} else {
encVal(enc,_declaredType,ptr,idx,src,_off,_scale);
@@ -52,12 +56,16 @@ public class StoreX86 extends MemOpX86 {
if( decl instanceof TypeFloat ) {
src -= (short)x86_64_v2.XMM_OFFSET;
enc.add1( decl==TypeFloat.F32 ? 0xF3 : 0xF2 ).add1(0x0F).add1(0x11);
+ } else {
+ int log = decl.log_size();
+ x86_64_v2.rexF(src,ptr,idx,log==3,enc);
+ switch( log ) {
+ case 0: enc .add1(0x88); break;
+ case 1: enc.add1(0x66).add1(0x89); break;
+ case 2: enc .add1(0x89); break;
+ case 3: enc .add1(0x89); break;
+ }
}
- else if( decl.log_size() == 0 ) enc.add1(0x88);
- else if( decl.log_size() == 1 ) enc.add1(0x89);
- else if( decl.log_size() == 2 ) enc.add1(0x89);
- else if( decl.log_size() == 3 ) enc.add1(x86_64_v2.rex(src, ptr, idx)).add1(0x89);
-
x86_64_v2.indirectAdr(scale, idx, ptr, off, src, enc);
}