From 248ac2317de092ea5f302266962fdbec17045d42 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sun, 16 Mar 2025 10:50:13 -0700 Subject: Add unconditional arm,risc --- .../seaofnodes/simple/node/cpus/arm/UJmpARM.java | 33 ++++++++++++++++++++++ .../com/seaofnodes/simple/node/cpus/arm/arm.java | 2 +- .../simple/node/cpus/riscv/UJmpRISC.java | 6 ++-- .../seaofnodes/simple/node/cpus/riscv/riscv.java | 2 +- 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/UJmpARM.java 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 -- cgit v1.2.3