diff options
Diffstat (limited to 'chapter21/src/main/java/com')
3 files changed, 25 insertions, 4 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/FloatARM.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/FloatARM.java index dc125af2..6de65b03 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/FloatARM.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/FloatARM.java @@ -31,7 +31,7 @@ public class FloatARM extends ConstantNode implements MachNode, RIPRelSize { // Delta is from opcode start @Override public void patch( Encoding enc, int opStart, int opLen, int delta ) { short dst = (short)(enc.reg(this) - arm.D_OFFSET); - enc.add4(arm.load_pc(arm.OPF_ARM, delta, dst)); + enc.patch4(opStart, arm.load_pc(arm.OPF_ARM, delta, dst)); } // Human-readable form appended to the SB. Things like the encoding, diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java index f2804437..967847a9 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java @@ -4,11 +4,25 @@ import com.seaofnodes.simple.*; import com.seaofnodes.simple.codegen.*; import com.seaofnodes.simple.node.*; -public class NewARM extends NewNode implements MachNode { +public class NewARM extends NewNode implements MachNode, RIPRelSize { // A pre-zeroed chunk of memory. NewARM(NewNode nnn) { super(nnn); } @Override public void encoding( Encoding enc ) { - // bl + // BL(branch with link) enc.external(this,"calloc").add4(arm.b(arm.OP_CALL, 0)); } + + // Patch is for running "new" in a JIT. + // Delta is from opcode start + @Override public byte encSize(int delta) { return 4; } + + // Patch is for running "new" in a JIT. + // Delta is from opcode start + @Override public void patch(Encoding enc, int opStart, int opLen, int delta ) { + if((delta & 3) != 0) { + enc.patch4(opStart, arm.b_calloc(arm.OP_CALL, delta)); + } else { + throw Utils.TODO(); + } + } } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java index 4a42b117..fabfe2fe 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java @@ -99,7 +99,6 @@ public class arm extends Machine { public static int OP_LSL = 0b1000; public static int OPI_LSL =0b1101001101; - public static int OP_LSR = 0b1001; public static int OPI_LSR = 0b1101001101; @@ -432,6 +431,7 @@ public class arm extends Machine { // share same encoding with LDR (literal, SIMD&FP) flavour public static int load_pc(int opcode, int offset, int rt) { + offset>>=2; return (opcode << 24) | (offset << 5) | rt; } // int l @@ -523,6 +523,13 @@ public class arm extends Machine { delta &= (1L<<26)-1; // Zero extend return (opcode << 26) | delta; } + // no aligned assert + public static int b_calloc(int opcode, int delta) { + assert -(1<<26) <= delta && delta < (1<<26); + delta>>=2; + delta &= (1L<<26)-1; // Zero extend + return (opcode << 26) | delta; + } @Override public RegMask callArgMask(TypeFunPtr tfp, int idx ) { return callInMask(tfp,idx); } static RegMask callInMask(TypeFunPtr tfp, int idx ) { |
