summaryrefslogtreecommitdiff
path: root/chapter20/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'chapter20/src/main/java/com')
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallRRARM.java7
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java7
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java7
3 files changed, 15 insertions, 6 deletions
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallRRARM.java b/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallRRARM.java
index db85a9a9..ee49df41 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallRRARM.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallRRARM.java
@@ -1,5 +1,6 @@
package com.seaofnodes.simple.node.cpus.arm;
+import com.seaofnodes.simple.type.TypeFunPtr;
import com.seaofnodes.simple.*;
import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.codegen.RegMask;
@@ -7,12 +8,14 @@ import com.seaofnodes.simple.node.*;
import java.io.ByteArrayOutputStream;
public class CallRRARM extends CallNode implements MachNode {
- CallRRARM(CallNode call) {super(call);}
+ final TypeFunPtr _tfp;
+ CallRRARM( CallNode call ) { super(call); _tfp = call.tfp(); }
+ @Override public TypeFunPtr tfp() { return _tfp; }
@Override public String op() { return "callr"; }
@Override public String label() { return op(); }
@Override public RegMask regmap(int i) {
// Todo: float or int?
- return i==_inputs._len
+ return i==_inputs._len-1
? arm.RMASK // Function call target
: arm.callInMask(tfp(),i); // Normal argument
}
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java b/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java
index 3bae656d..621e4ad4 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java
@@ -1,5 +1,6 @@
package com.seaofnodes.simple.node.cpus.riscv;
+import com.seaofnodes.simple.type.TypeFunPtr;
import com.seaofnodes.simple.*;
import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.codegen.RegMask;
@@ -7,12 +8,14 @@ import com.seaofnodes.simple.node.*;
import java.io.ByteArrayOutputStream;
public class CallRRISC extends CallNode implements MachNode{
- CallRRISC( CallNode call ) { super(call); }
+ final TypeFunPtr _tfp;
+ CallRRISC( CallNode call ) { super(call); _tfp = call.tfp(); }
+ @Override public TypeFunPtr tfp() { return _tfp; }
@Override public String label() { return op(); }
@Override public RegMask regmap(int i) {
// Todo: float or int?
- return i==_inputs._len
+ return i==_inputs._len-1
? riscv.RMASK // Function call target
: riscv.callInMask(tfp(),i); // Normal argument
}
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java b/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java
index ac35d17b..254bf6fa 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java
@@ -1,5 +1,6 @@
package com.seaofnodes.simple.node.cpus.x86_64_v2;
+import com.seaofnodes.simple.type.TypeFunPtr;
import com.seaofnodes.simple.SB;
import com.seaofnodes.simple.Utils;
import com.seaofnodes.simple.codegen.CodeGen;
@@ -9,11 +10,13 @@ import com.seaofnodes.simple.node.MachNode;
import java.io.ByteArrayOutputStream;
public class CallRX86 extends CallNode implements MachNode {
- CallRX86( CallNode call ) { super(call); }
+ final TypeFunPtr _tfp;
+ CallRX86( CallNode call ) { super(call); _tfp = call.tfp(); }
+ @Override public TypeFunPtr tfp() { return _tfp; }
@Override public String label() { return op(); }
@Override public RegMask regmap(int i) {
- return i==_inputs._len
+ return i==_inputs._len-1
? x86_64_v2.WMASK // Function call target
: x86_64_v2.callInMask(tfp(),i); // Normal argument
}