summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-03-16 10:50:13 -0700
committerCliff Click <cliffc@acm.org>2025-03-16 10:50:13 -0700
commit248ac2317de092ea5f302266962fdbec17045d42 (patch)
tree32af9c590072daa5560038a557fb214142678db4
parentd15e43400bb7c7d0d27257d4c907206257c912b3 (diff)
downloadSimple-248ac2317de092ea5f302266962fdbec17045d42.tar.gz
Simple-248ac2317de092ea5f302266962fdbec17045d42.zip
Add unconditional arm,risc
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/UJmpARM.java33
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java6
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java2
4 files changed, 38 insertions, 5 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/UJmpARM.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/UJmpARM.java
new file mode 100644
index 00000000..cc0b2085
--- /dev/null
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/UJmpARM.java
@@ -0,0 +1,33 @@
+package com.seaofnodes.simple.node.cpus.arm;
+
+import com.seaofnodes.simple.*;
+import com.seaofnodes.simple.codegen.*;
+import com.seaofnodes.simple.node.*;
+import com.seaofnodes.simple.type.Type;
+import java.util.BitSet;
+
+// unconditional jump
+public class UJmpARM extends CFGNode implements MachNode {
+ UJmpARM() { }
+ @Override public String op() { return "jmp"; }
+ @Override public String label() { return op(); }
+ @Override public StringBuilder _print1( StringBuilder sb, BitSet visited ) {
+ return sb.append("jmp ");
+ }
+ @Override public RegMask regmap(int i) {return null; }
+ @Override public RegMask outregmap() { return null; }
+ @Override public Type compute() { throw Utils.TODO(); }
+ @Override public Node idealize() { throw Utils.TODO(); }
+ @Override public void encoding( Encoding enc ) {
+ enc.jump(this,uctrl());
+ // TODO: unconditional jump
+ int body = arm.b_cond(0b01010100, 0, arm.make_condition("<"));
+ enc.add4(body);
+ }
+
+ @Override public void asm(CodeGen code, SB sb) {
+ CFGNode target = uctrl();
+ assert target.nOuts() > 1; // Should optimize jmp to empty targets
+ sb.p(label(target));
+ }
+}
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 2ebcd781..c6bb1973 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
@@ -431,7 +431,7 @@ public class arm extends Machine {
// Return a MachNode unconditional branch
@Override public CFGNode jump() {
- throw Utils.TODO();
+ return new UJmpARM();
}
// Break an infinite loop
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java
index 97a8c224..bcffa544 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java
@@ -20,9 +20,9 @@ public class UJmpRISC extends CFGNode implements MachNode {
@Override public Node idealize() { throw Utils.TODO(); }
@Override public void encoding( Encoding enc ) {
enc.jump(this,uctrl());
- //int body = riscv.b_type(0x63, 0, riscv.jumpop(_bop), src1, src2, 0);
- //enc.add4(body);
- throw Utils.TODO();
+ // TODO: Unconditional jump
+ int body = riscv.b_type(0x63, 0, riscv.jumpop("<"), 0, 0, 0);
+ enc.add4(body);
}
@Override public void asm(CodeGen code, SB sb) {
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
index 5c0b2f45..08239288 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
@@ -262,7 +262,7 @@ public class riscv extends Machine {
// Return a MachNode unconditional branch
@Override public CFGNode jump() {
- throw Utils.TODO();
+ return new UJmpRISC();
}
// Create a split op; any register to any register, including stack slots