diff options
| author | Cliff Click <cliffc@acm.org> | 2025-03-16 10:50:13 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-03-16 10:50:13 -0700 |
| commit | 248ac2317de092ea5f302266962fdbec17045d42 (patch) | |
| tree | 32af9c590072daa5560038a557fb214142678db4 | |
| parent | d15e43400bb7c7d0d27257d4c907206257c912b3 (diff) | |
| download | Simple-248ac2317de092ea5f302266962fdbec17045d42.tar.gz Simple-248ac2317de092ea5f302266962fdbec17045d42.zip | |
Add unconditional arm,risc
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 |
