diff options
| author | Cliff Click <cliffc@acm.org> | 2025-04-11 20:52:50 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-04-11 20:52:50 -0700 |
| commit | 4e467263058c015ec0838487d1523b51fb42fcfd (patch) | |
| tree | 12db22e38bf42066601ccff3385c7d33a88395f3 | |
| parent | 3f97f091c40ab92b8ea0def108e1db870b5a6f09 (diff) | |
| download | Simple-4e467263058c015ec0838487d1523b51fb42fcfd.tar.gz Simple-4e467263058c015ec0838487d1523b51fb42fcfd.zip | |
Encoding bugs
NewX86 using wrong killmap.
Split: moving from xmm to gpr inverted REX bits
5 files changed, 20 insertions, 10 deletions
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; } diff --git a/chapter21/src/test/java/com/seaofnodes/simple/Chapter20Test.java b/chapter21/src/test/java/com/seaofnodes/simple/Chapter20Test.java index 6dcd21dd..fc2f23b0 100644 --- a/chapter21/src/test/java/com/seaofnodes/simple/Chapter20Test.java +++ b/chapter21/src/test/java/com/seaofnodes/simple/Chapter20Test.java @@ -82,7 +82,7 @@ return sqrt(arg) + sqrt(arg+2); @Test public void testAlloc2() { String src = "int[] !xs = new int[3]; xs[arg]=1; return xs[arg&1];"; - testCPU(src,"x86_64_v2", "SystemV",3,"return .[];"); + testCPU(src,"x86_64_v2", "SystemV",0,"return .[];"); testCPU(src,"riscv" , "SystemV",6,"return .[];"); testCPU(src,"arm" , "SystemV",4,"return .[];"); } @@ -92,7 +92,7 @@ return sqrt(arg) + sqrt(arg+2); @Test public void testArray1() throws IOException { String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/array1.smp")); - testCPU(src,"x86_64_v2", "SystemV",7,"return .[];"); + testCPU(src,"x86_64_v2", "SystemV",4,"return .[];"); testCPU(src,"riscv" , "SystemV",8,"return (add,.[],(mul,.[],1000));"); testCPU(src,"arm" , "SystemV",5,"return (add,.[],(mul,.[],1000));"); } diff --git a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java index 9d10ed6a..4bd46a81 100644 --- a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java +++ b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java @@ -41,7 +41,7 @@ public class Chapter21Test { @Test public void testArray1() throws IOException { String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/array1.smp")); - testCPU(src,"x86_64_v2", "SystemV",7,"return .[];"); + testCPU(src,"x86_64_v2", "SystemV",4,"return .[];"); testCPU(src,"riscv" , "SystemV",7,"return (add,.[],(mul,.[],1000));"); testCPU(src,"arm" , "SystemV",5,"return (add,.[],(mul,.[],1000));"); } |
