summaryrefslogtreecommitdiff
path: root/chapter21/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'chapter21/src/main/java')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java9
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java5
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java10
3 files changed, 17 insertions, 7 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;
}