summaryrefslogtreecommitdiff
path: root/chapter21
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-03-15 16:42:13 -0700
committerCliff Click <cliffc@acm.org>2025-03-15 16:42:13 -0700
commit251622b0111f9f49e04528a11e4ea4f19376b3ef (patch)
tree5d0c603cabec17e4fbd9a20e9f98a99eab509f93 /chapter21
parentd4c1895977755a94602d9cbbe8ee743e6bdeb894 (diff)
downloadSimple-251622b0111f9f49e04528a11e4ea4f19376b3ef.tar.gz
Simple-251622b0111f9f49e04528a11e4ea4f19376b3ef.zip
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 >,>=
Diffstat (limited to 'chapter21')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java15
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java12
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java5
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java6
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 && t.out(0)!=t.loop()) ||
// Jump to an empty block and fall into a busy block
(fld==bld && f.nOuts()==1)) ) {
- // Invert test and Proj fields
- iff.invert();
- t.invert();
- f.invert();
- CProjNode tmp=f; f=t; t=tmp; // Swap t/f
+ invert = true;
} // Else nothing
} else if( tld > 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);