From 4e467263058c015ec0838487d1523b51fb42fcfd Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 11 Apr 2025 20:52:50 -0700 Subject: Encoding bugs NewX86 using wrong killmap. Split: moving from xmm to gpr inverted REX bits --- .../java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java | 9 +++++++-- .../com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java | 5 +++-- .../src/main/java/com/seaofnodes/simple/print/ASMPrinter.java | 10 +++++++--- 3 files changed, 17 insertions(+), 7 deletions(-) (limited to 'chapter21/src/main/java') diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java index 5b17e850..c3d7e6b0 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java @@ -24,14 +24,19 @@ public class NewX86 extends NewNode implements MachNode { } @Override public RegMask outregmap(int i) { return i == 1 ? x86_64_v2.RAX_MASK : null; } @Override public RegMask outregmap() { return null; } - @Override public RegMask killmap() { return x86_64_v2.x86CallerSave(); } + @Override public RegMask killmap() { + return OS.startsWith("Windows") + ? x86_64_v2. WIN64_CALLER_SAVE_MASK + : x86_64_v2.SYSTEM5_CALLER_SAVE_MASK; + //return x86_64_v2.x86CallerSave(); + } @Override public void encoding( Encoding enc ) { System.err.println("OS: "+OS+", arg2="+ARG2+", arg3="+ARG3+", compiled for "+enc._code._callingConv); enc.external(this,"calloc"); - // This has to call the *native* ABI, irregardless of how Simple is + // This has to call the *native* ABI, regardless of how Simple is // being compiled, because it links against the native calloc. // ldi rcx,#1 // number of elements to calloc enc.add1(0xB8 + ARG3.firstReg()).add4(1); diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java index c7685ae1..35e58e85 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java @@ -67,6 +67,8 @@ public class SplitX86 extends SplitNode { // 0x66 if moving between register classes if( dstX ^ srcX ) enc.add1(0x66); + if( !dstX && srcX ) + { short tmp=src; src=dst; dst=tmp; } enc.add1(x86_64_v2.rex(dst, src, 0)); // pick opcode based on regs @@ -85,7 +87,6 @@ public class SplitX86 extends SplitNode { // xmm->reg(66 0F 7E /r MOVQ r/m64, xmm) enc.add1(0x0F); enc.add1(0x7E); - short tmp=src; src=dst; dst=tmp; } enc.add1(x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, dst, src)); @@ -93,7 +94,7 @@ public class SplitX86 extends SplitNode { // General form: "mov dst = src" @Override public void asm(CodeGen code, SB sb) { - FunNode fun = code._encoding._fun; + FunNode fun = code._encoding==null ? null : code._encoding._fun; sb.p(code.reg(this,fun)).p(" = ").p(code.reg(in(1),fun)); } } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java b/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java index 0d7dd57e..2c5b138d 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java @@ -64,8 +64,11 @@ public abstract class ASMPrinter { } private static int print(int iadr, SB sb, CodeGen code, FunNode fun, int cfgidx) { - FunNode old = code._encoding._fun; - code._encoding._fun = fun; // Useful printing after RA + FunNode old=null; + if( code._encoding!=null ) { + old = code._encoding._fun; + code._encoding._fun = fun; // Useful printing after RA + } // Function header sb.nl().p("---"); if( fun._name != null ) sb.p(fun._name).p(" "); @@ -81,7 +84,8 @@ public abstract class ASMPrinter { sb.p("---"); fun.sig().print(sb); sb.p("---------------------------").nl(); - code._encoding._fun = old; + if( code._encoding != null ) + code._encoding._fun = old; return iadr; } -- cgit v1.2.3