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/arm/FloatARM.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java18
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java9
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 ) {