From 251622b0111f9f49e04528a11e4ea4f19376b3ef Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sat, 15 Mar 2025 16:42:13 -0700 Subject: Fixed the array1 test encodings Clean up branch invert logic during BB layout Cleanup branch target printing for RISC,ARM ImmRISC ops mask imm12 to 12 bits Fix NewRISC; hardcode RPC as part of call Fix RISC inverting branchs >,>= --- .../main/java/com/seaofnodes/simple/codegen/Encoding.java | 15 +++++++-------- .../com/seaofnodes/simple/node/cpus/arm/BranchARM.java | 2 +- .../com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java | 12 ++++++++---- .../com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java | 2 +- .../com/seaofnodes/simple/node/cpus/riscv/NewRISC.java | 5 ++--- .../java/com/seaofnodes/simple/node/cpus/riscv/riscv.java | 6 ++++-- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java index 4971624d..ccb68fee 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java @@ -132,6 +132,7 @@ public class Encoding { CFGNode next = bb instanceof ReturnNode ? (CFGNode)bb.out(bb.nOuts()-1) : bb.uctrl(); _rpo_cfg(next,visit,rpo); } else { + boolean invert = false; // Pick out the T/F projections CProjNode t = (CProjNode)bb.out(bb.nOuts()-1); CProjNode f = (CProjNode)bb.out(bb.nOuts()-2); @@ -145,22 +146,20 @@ public class Encoding { ((fld bld ) { // True enters a deeper loop throw Utils.TODO(); - } else if( fld == bld && f.out(0) instanceof LoopNode ) { // Else True exits a loop, always forward and good + } else if( fld == bld && f.out(0) instanceof LoopNode ) { // Else True exits a loop // if false is the loop backedge, make sure its true/taken - // Invert test and Proj fields + invert = true; + } // always forward and good + // Invert test and Proj fields + if( invert ) { iff.invert(); t.invert(); f.invert(); CProjNode tmp=f; f=t; t=tmp; // Swap t/f - } // Always visit the False side last (so True side first), so that diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java index 6b87a2a5..db4c7523 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java @@ -46,5 +46,5 @@ public class BranchARM extends IfNode implements MachNode{ prj = prj.out(0); // Skip empty blocks sb.p(prj instanceof LoopNode ? " LOOP" : " L").p(prj._nid); } - @Override public String comment() { return "L"+cproj(1)._nid+", L"+cproj(0)._nid; } + @Override public String comment() { return "L"+cproj(1)._nid; } } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java index f000a5d3..9cea79e6 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java @@ -19,10 +19,15 @@ public class BranchRISC extends IfNode implements MachNode { @Override public String op() { return "b"+_bop; } @Override public String label() { return op(); } - @Override public String comment() { return "L"+cproj(1)._nid+", L"+cproj(0)._nid; } + @Override public String comment() { return "L"+cproj(1)._nid; } @Override public RegMask regmap(int i) { return riscv.RMASK; } @Override public RegMask outregmap() { return null; } - @Override public void invert() { _bop = invert(_bop); } + @Override public void invert() { + if( _bop.equals("<") || _bop.equals("<=") ) + swap12(); // Cannot invert the test, so swap the operands + else + _bop = invert(_bop); + } @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { in(1)._print0(sb.append("if( "),visited).append(_bop); @@ -31,7 +36,6 @@ public class BranchRISC extends IfNode implements MachNode { return sb.append(" )"); } - // Encoding is appended into the byte array; size is returned @Override public void encoding( Encoding enc ) { enc.jump(this,cproj(0)); // Todo: relocs (for offset - immf) @@ -45,6 +49,6 @@ public class BranchRISC extends IfNode implements MachNode { Node prj = cproj(0); while( prj.nOuts() == 1 ) prj = prj.out(0); // Skip empty blocks - sb.p(prj instanceof LoopNode ? "LOOP" : "L").p(prj._nid); + sb.p(prj instanceof LoopNode ? " LOOP" : " L").p(prj._nid); } } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java index 5374eae8..1d258e74 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java @@ -40,7 +40,7 @@ abstract public class ImmRISC extends MachConcreteNode implements MachNode { @Override public void encoding( Encoding enc ) { short dst = enc.reg(this ); short src = enc.reg(in(1)); - int body = riscv.i_type(opcode(), dst, func3(), src, _imm12); + int body = riscv.i_type(opcode(), dst, func3(), src, _imm12 & 0xFFF); enc.add4(body); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java index 7002e0a8..2bdfc262 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java @@ -25,10 +25,9 @@ public class NewRISC extends NewNode implements MachNode { // Encoding is appended into the byte array; size is returned @Override public void encoding( Encoding enc ) { enc.relo(this); - short rpc = enc.reg(this); // High half is where the TFP constant used to be, the last input - short auipc = enc.reg(in(_inputs._len-1)); - int body = riscv.i_type(0x67, rpc, 0/*JALR.C*/, auipc, 0); + short auipc = enc.reg(in(nIns()-1)); + int body = riscv.i_type(0x67, riscv.RPC, 0, auipc, 0); enc.add4(body); } 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 8d44fe34..5c0b2f45 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 @@ -425,8 +425,10 @@ public class riscv extends Machine { private Node jmp( IfNode iff ) { if( iff.in(1) instanceof BoolNode bool && !bool.isFloat() ) { // if less than or equal switch inputs - if (bool.op().equals("<=")) return new BranchRISC(iff, bool.op(), bool.in(2), bool.in(1)); - return new BranchRISC(iff, bool.op(), bool.in(1), bool.in(2)); + String bop = bool.op(); + if( bop.equals(">=") || bop.equals(">") ) + return new BranchRISC(iff, IfNode.invert(bop), bool.in(2), bool.in(1)); + return new BranchRISC(iff, bop, bool.in(1), bool.in(2)); } // Vs zero return new BranchRISC(iff, "==", iff.in(1), null); -- cgit v1.2.3