summaryrefslogtreecommitdiff
path: root/chapter24/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-17 15:15:00 -0700
committerCliff Click <cliffc@acm.org>2026-09-17 15:15:00 -0700
commit5eb00d3306e6e8738b8033c5ba8401770f9d7ffd (patch)
treef59554f4d82ea7960b0c4d49ad73591efb96a454 /chapter24/src/main/java/com/seaofnodes
parent8331098d1904538a3a97d22e4d847cf2cc94e57d (diff)
downloadSimple-5eb00d3306e6e8738b8033c5ba8401770f9d7ffd.tar.gz
Simple-5eb00d3306e6e8738b8033c5ba8401770f9d7ffd.zip
Backport x86 Not encoding
Diffstat (limited to 'chapter24/src/main/java/com/seaofnodes')
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NotX86.java17
1 files changed, 7 insertions, 10 deletions
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NotX86.java b/chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NotX86.java
index d9056be9..7db80299 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NotX86.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NotX86.java
@@ -17,23 +17,20 @@ public class NotX86 extends MachConcreteNode implements MachNode {
short dst = enc.reg(this );
short src = enc.reg(in(1));
- // Pre-zero using XOR dst,dst; since zero'd will not have a
- // byte-dependency from the setz. Can skip REX is dst is low 8, makes
- // this a 32b xor, which will also zero the high bits.
- if( dst >= 8 ) enc.add1(x86_64_v2.rex(dst, dst, 0));
- enc.add1(0x33); // opcode
- enc.add1(x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, dst, dst));
-
// test rdi,rdi
enc.add1(x86_64_v2.rex(src, src, 0));
enc.add1(0x85);
enc.add1(x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, src, src));
- // setz (sete dil)
- enc.add1(x86_64_v2.rex(dst, 0, 0));
+ // setz dstb; then zero-extend the low byte into the full register.
+ if( dst >= 4 ) enc.add1(x86_64_v2.rex(0, dst, 0, false));
enc.add1(0x0F);
enc.add1(0x94);
- enc.add1(x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, dst, 0));
+ enc.add1(x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, 0, dst));
+ if( dst >= 4 ) enc.add1(x86_64_v2.rex(dst, dst, 0, false));
+ enc.add1(0x0F);
+ enc.add1(0xB6);
+ enc.add1(x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, dst, dst));
}
@Override public void asm(CodeGen code, SB sb) { sb.p(code.reg(this)); }
}