summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-03-16 10:41:20 -0700
committerCliff Click <cliffc@acm.org>2025-03-16 10:41:20 -0700
commitd15e43400bb7c7d0d27257d4c907206257c912b3 (patch)
tree248ddae12f000c2e715ff7cf4e08f121fb92a9b2
parent30cea7d810dd9460fa7bd40d1dfb1393c71a0ee9 (diff)
downloadSimple-d15e43400bb7c7d0d27257d4c907206257c912b3.tar.gz
Simple-d15e43400bb7c7d0d27257d4c907206257c912b3.zip
Unconditional jumps
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java3
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java14
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java6
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/Node.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java8
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java7
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java33
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java14
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java26
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java8
-rw-r--r--chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java2
49 files changed, 122 insertions, 77 deletions
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java
index c5cd95f0..37d08fb0 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/CFGNode.java
@@ -170,12 +170,11 @@ public abstract class CFGNode extends Node {
return pre;
}
- boolean skip(CFGNode usecfg) {
+ private boolean skip(CFGNode usecfg) {
// Only walk control users that are alive.
// Do not walk from a Call to linked Fun's.
return usecfg instanceof XCtrlNode ||
(this instanceof CallNode && usecfg instanceof FunNode) ||
(this instanceof ReturnNode && usecfg instanceof CallEndNode);
}
-
}
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 ccb68fee..d004bb31 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java
@@ -50,7 +50,7 @@ public class Encoding {
return _code._regAlloc.regnum(n);
}
- public void add1( int op ) { _bits.write(op); }
+ public Encoding add1( int op ) { _bits.write(op); return this; }
// Little endian write of a 32b opcode
public void add4( int op ) {
@@ -85,7 +85,7 @@ public class Encoding {
assert t.isConstant();
// TODO:
}
- public void jump( IfNode jmp, CProjNode target ) {
+ public void jump( CFGNode jmp, CFGNode target ) {
// TDOO: also support 1-byte offset and short jump and compressing the binary
// TODO: record and patch
}
@@ -124,12 +124,20 @@ public class Encoding {
// minimizes actual branches, takes advantage of fall-through edges, and
// tries to help simple branch predictions: back branches are predicted
// taken, forward not-taken.
- private static void _rpo_cfg(CFGNode bb, BitSet visit, Ary<CFGNode> rpo) {
+ private void _rpo_cfg(CFGNode bb, BitSet visit, Ary<CFGNode> rpo) {
if( visit.get(bb._nid) ) return;
visit.set(bb._nid);
if( bb.nOuts()==0 ) return; // StopNode
if( !(bb instanceof IfNode iff) ) {
CFGNode next = bb instanceof ReturnNode ? (CFGNode)bb.out(bb.nOuts()-1) : bb.uctrl();
+ // If the *next* BB has already been visited, we require an
+ // unconditional backwards jump here
+ if( visit.get(next._nid) ) {
+ CFGNode jmp = _code._mach.jump();
+ jmp.setDefX(0,bb);
+ next.setDef(next._inputs.find(bb),jmp);
+ rpo.add(jmp);
+ }
_rpo_cfg(next,visit,rpo);
} else {
boolean invert = false;
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java
index 7d4e2910..792da62e 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/AddFNode.java
@@ -13,7 +13,7 @@ public class AddFNode extends Node {
@Override public String glabel() { return "+"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append("+"), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java
index bc65e79a..01d31aa2 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -15,7 +15,7 @@ public class AddNode extends Node {
@Override public String glabel() { return "+"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append("+"), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java
index e6b87ce8..f5f6a1de 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/BoolNode.java
@@ -21,7 +21,7 @@ abstract public class BoolNode extends Node {
public String glabel() { return op(); }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append(op()), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java
index 86d4a52b..5c44f49f 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CFGNode.java
@@ -170,7 +170,7 @@ public abstract class CFGNode extends Node {
return pre;
}
- boolean skip(CFGNode usecfg) {
+ private boolean skip(CFGNode usecfg) {
// Only walk control users that are alive.
// Do not walk from a Call to linked Fun's.
return usecfg instanceof XCtrlNode ||
@@ -178,4 +178,8 @@ public abstract class CFGNode extends Node {
(this instanceof ReturnNode && usecfg instanceof CallEndNode);
}
+
+ public String label( CFGNode target ) {
+ return (target instanceof LoopNode ? "LOOP" : "L")+target._nid;
+ }
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java
index f0a8e78a..d95ea227 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CProjNode.java
@@ -24,7 +24,7 @@ public class CProjNode extends CFGNode {
@Override public String label() { return _label; }
- @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(_label); }
+ @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(_label); }
@Override public boolean blockHead() { return true; }
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
index 03a4462d..c98b2ff9 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
@@ -23,7 +23,7 @@ public class CallEndNode extends CFGNode implements MultiNode {
public CallNode call() { return (CallNode)in(0); }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
sb.append("cend( ");
sb.append( in(0) instanceof CallNode ? "Call, " : "----, ");
for( int i=1; i<nIns()-1; i++ )
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java
index c9bbcc52..f8f34422 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CallNode.java
@@ -21,7 +21,7 @@ public class CallNode extends CFGNode {
@Override public String label() { return "Call"; }
- @Override StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) {
String fname = name();
if( fname == null ) fptr()._print0(sb,visited);
else sb.append(fname);
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java
index 5a92802c..939a5c97 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CastNode.java
@@ -31,7 +31,7 @@ public class CastNode extends Node {
@Override public boolean isConst() { return true; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
return in(1)._print0(sb.append(label()), visited);
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
index 699ee76f..27d6f39e 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
@@ -42,7 +42,7 @@ public class ConstantNode extends Node {
public String uniqueName() { return "Con_" + _nid; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
if( _con instanceof TypeFunPtr tfp && tfp.isConstant() ) {
FunNode fun = CodeGen.CODE.link(tfp);
if( fun._name != null )
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java
index 61d9c310..eda7d684 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/CtrlNode.java
@@ -8,7 +8,7 @@ import java.util.BitSet;
public class CtrlNode extends CFGNode {
public CtrlNode() { super(CodeGen.CODE._start); }
@Override public String label() { return "Ctrl"; }
- @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("Cctrl"); }
+ @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("Cctrl"); }
@Override public boolean isConst() { return true; }
@Override public Type compute() { return Type.CONTROL; }
@Override public Node idealize() { return null; }
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java
index a6e459c9..633f3224 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/DivFNode.java
@@ -13,7 +13,7 @@ public class DivFNode extends Node {
@Override public String glabel() { return "/"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append("/"), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java
index 0d5ed297..41518311 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -12,7 +12,7 @@ public class DivNode extends Node {
@Override public String glabel() { return "//"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append("/"), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java
index f0c4045d..e9df25f9 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/FRefNode.java
@@ -19,7 +19,7 @@ public class FRefNode extends ConstantNode {
@Override public String uniqueName() { return "FRef_" + _nid; }
- @Override StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) {
return sb.append("FRef_").append(_n);
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index b70a938d..e5174823 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -29,7 +29,7 @@ public class LoadNode extends MemOpNode {
@Override public String glabel() { return "." +_name; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(".").append(_name); }
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append(".").append(_name); }
@Override
public Type compute() {
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java
index 8c3452bf..e8552789 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/LogicalNode.java
@@ -13,7 +13,7 @@ public abstract class LogicalNode extends Node {
abstract String op();
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append(op()), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
index 1495a703..5729aea2 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
@@ -30,7 +30,7 @@ public class MemMergeNode extends Node {
@Override public boolean isMem() { return true; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
sb.append(_inProgress ? "Merge[" : "MEM[ ");
for( int j=2; j<nIns(); j++ ) {
sb.append(j);
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
index cba4dc1b..de27bc75 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
@@ -47,7 +47,7 @@ public abstract class MemOpNode extends Node {
public Node ptr() { return in(2); }
public Node off() { return in(3); }
- @Override StringBuilder _print1( StringBuilder sb, BitSet visited ) { return _printMach(sb,visited); }
+ @Override public StringBuilder _print1( StringBuilder sb, BitSet visited ) { return _printMach(sb,visited); }
public StringBuilder _printMach( StringBuilder sb, BitSet visited ) { throw Utils.TODO(); }
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java
index 2b749ba3..99fc3144 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusFNode.java
@@ -13,7 +13,7 @@ public class MinusFNode extends Node {
@Override public String glabel() { return "-"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("(-"), visited);
return sb.append(")");
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index dd2cbd26..e06e0c69 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -14,7 +14,7 @@ public class MinusNode extends Node {
@Override public String glabel() { return "-"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("(-"), visited);
return sb.append(")");
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java
index 2d44a9fb..6fbf4bbb 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MulFNode.java
@@ -13,7 +13,7 @@ public class MulFNode extends Node {
@Override public String glabel() { return "*"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append("*"), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java
index 80f8c319..384dbace 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -13,7 +13,7 @@ public class MulNode extends Node {
@Override public String glabel() { return "*"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append("*"), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java
index 80545d66..5ce0c1fb 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/NewNode.java
@@ -39,7 +39,7 @@ public class NewNode extends Node implements MultiNode {
}
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
sb.append("new ");
return sb.append(_ptr._obj.str());
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java
index b3d6c94e..3201ff3b 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -120,7 +120,7 @@ public abstract class Node {
: _print1(sb, visited);
}
// Every Node implements this; a partial-line recursive print
- abstract StringBuilder _print1(StringBuilder sb, BitSet visited);
+ abstract public StringBuilder _print1(StringBuilder sb, BitSet visited);
public String p(int depth) { return IRPrinter.prettyPrint(this,depth); }
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java
index b454de66..0314841d 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/NotNode.java
@@ -12,7 +12,7 @@ public class NotNode extends Node {
@Override public String glabel() { return "!"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("(!"), visited);
return sb.append(")");
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java
index 8d7c4205..9e11a129 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ParmNode.java
@@ -22,7 +22,7 @@ public class ParmNode extends PhiNode {
public FunNode fun() { return (FunNode)in(0); }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
if( "main".equals(fun()._name) && _label.equals("arg") )
return sb.append("arg");
sb.append("Parm_").append(_label).append("(");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java
index 16f38d45..6c51b613 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/PhiNode.java
@@ -29,7 +29,7 @@ public class PhiNode extends Node {
@Override public String glabel() { return "&phi;_"+_label; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
if( !(region() instanceof RegionNode r) || r.inProgress() )
sb.append("Z");
sb.append("Phi(");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java
index 3d9db4ed..6ad5326d 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ProjNode.java
@@ -24,7 +24,7 @@ public class ProjNode extends Node {
@Override public String label() { return _label; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
if( _label != null ) return sb.append(_label);
if( in(0) instanceof CallEndNode cend && cend.call()!=null )
return cend.call()._print0(sb,visited);
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java
index b755af3f..e9c25f47 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java
@@ -14,7 +14,7 @@ public class ReadOnlyNode extends Node {
@Override public String label() { return "ReadOnly"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
return in(1)._print0(sb.append("(const)"),visited);
}
@Override public Type compute() {
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java
index fb6539ae..0186ae45 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/RegionNode.java
@@ -17,7 +17,7 @@ public class RegionNode extends CFGNode {
public String label() { return "Region"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
return sb.append(label());
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
index 809dd1e1..f0b7d49e 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
@@ -35,7 +35,7 @@ public class ReturnNode extends CFGNode {
public String label() { return "Return"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
sb.append("return ");
if( expr()==null ) sb.append("----");
else expr()._print0(sb, visited);
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java b/chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java
index 44d3a587..7936086d 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java
@@ -13,7 +13,7 @@ public class RoundF32Node extends Node {
@Override public String glabel() { return "(f32)"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
return in(1)._print0(sb.append("((f32)"), visited).append(")");
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
index f193e55a..38a5d968 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
@@ -44,7 +44,7 @@ public class ScopeNode extends MemMergeNode {
@Override public String label() { return "Scope"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
sb.append("Scope[ ");
int j=1;
for( int i=0; i<nIns(); i++ ) {
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java
index 22a1750d..4bd76f50 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StartNode.java
@@ -25,7 +25,7 @@ public class StartNode extends LoopNode implements MultiNode {
@Override public String label() { return "Start"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
return sb.append(label());
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java
index b4cb002b..953324e7 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StopNode.java
@@ -21,7 +21,7 @@ public class StopNode extends CFGNode {
}
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
// For the sake of many old tests, and single value prints as "return val"
if( ret()!=null ) return ret()._print0(sb,visited);
sb.append("Stop[ ");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java
index 93294dba..2d553810 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java
@@ -33,7 +33,7 @@ public class StoreNode extends MemOpNode {
public Node val() { return in(4); }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
return sb.append(".").append(_name).append("=").append( val()).append(";");
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java
index 076b342a..9cb3a820 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StructNode.java
@@ -14,7 +14,7 @@ public class StructNode extends Node {
@Override public String label() { return _ts==null ? "STRUCT?" : _ts.str(); }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
if( _ts==null ) return sb.append("STRUCT?");
sb.append(_ts._name).append(" {");
for( int i=0; i<nIns(); i++ ) {
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java
index b591718d..5c7e969f 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/SubFNode.java
@@ -13,7 +13,7 @@ public class SubFNode extends Node {
@Override public String glabel() { return "-"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append("-"), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 339c65ca..4290ff9b 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -13,7 +13,7 @@ public class SubNode extends Node {
@Override public String glabel() { return "-"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
in(1)._print0(sb.append("("), visited);
in(2)._print0(sb.append("-"), visited);
return sb.append(")");
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java
index 1f4d67e0..c098ad99 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java
@@ -14,7 +14,7 @@ public class ToFloatNode extends Node {
@Override public String glabel() { return "(flt)"; }
@Override
- StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ public StringBuilder _print1(StringBuilder sb, BitSet visited) {
return in(1)._print0(sb.append("(flt)"), visited);
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java
index da021246..8c620a04 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java
@@ -8,7 +8,7 @@ import java.util.BitSet;
public class XCtrlNode extends CFGNode {
public XCtrlNode() { super(new Node[]{CodeGen.CODE._start}); }
@Override public String label() { return "Xctrl"; }
- @Override StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("Xctrl"); }
+ @Override public StringBuilder _print1(StringBuilder sb, BitSet visited) { return sb.append("Xctrl"); }
@Override public boolean isConst() { return true; }
@Override public Type compute() { return Type.XCONTROL; }
@Override public Node idealize() { return null; }
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 db4c7523..b0a517b0 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
@@ -40,11 +40,11 @@ public class BranchARM extends IfNode implements MachNode{
}
@Override public void asm(CodeGen code, SB sb) {
String src = code.reg(in(1));
- if( src!="flags" ) sb.p(src);
- Node prj = cproj(0);
+ if( src!="flags" ) sb.p(src).p(" ");
+ CFGNode prj = cproj(0);
while( prj.nOuts() == 1 )
- prj = prj.out(0); // Skip empty blocks
- sb.p(prj instanceof LoopNode ? " LOOP" : " L").p(prj._nid);
+ prj = prj.uctrl(); // Skip empty blocks
+ sb.p(label(prj));
}
@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 9cea79e6..b0283ae9 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
@@ -3,7 +3,6 @@ package com.seaofnodes.simple.node.cpus.riscv;
import com.seaofnodes.simple.*;
import com.seaofnodes.simple.codegen.*;
import com.seaofnodes.simple.node.*;
-
import java.util.BitSet;
// Conditional branch such as: BEQ
@@ -46,9 +45,9 @@ public class BranchRISC extends IfNode implements MachNode {
}
@Override public void asm(CodeGen code, SB sb) {
sb.p(code.reg(in(1))).p(" ").p(_bop).p(" ").p(in(2)==null ? "#0" : code.reg(in(2))).p(" ");
- Node prj = cproj(0);
+ CFGNode prj = cproj(0);
while( prj.nOuts() == 1 )
- prj = prj.out(0); // Skip empty blocks
- sb.p(prj instanceof LoopNode ? " LOOP" : " L").p(prj._nid);
+ prj = prj.uctrl(); // Skip empty blocks
+ sb.p(label(prj));
}
}
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
new file mode 100644
index 00000000..97a8c224
--- /dev/null
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java
@@ -0,0 +1,33 @@
+package com.seaofnodes.simple.node.cpus.riscv;
+
+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 UJmpRISC extends CFGNode implements MachNode {
+ UJmpRISC() { }
+ @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());
+ //int body = riscv.b_type(0x63, 0, riscv.jumpop(_bop), src1, src2, 0);
+ //enc.add4(body);
+ throw Utils.TODO();
+ }
+
+ @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/x86_64_v2/JmpX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java
index ae5635b8..d15c0177 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java
@@ -11,10 +11,8 @@ public class JmpX86 extends IfNode implements MachNode {
super(iff);
_bop = bop;
}
-
@Override public String op() { return "j"+_bop; }
@Override public String label() { return op(); }
-
@Override public void postSelect() {
Node set = in(1);
Node cmp = set.in(1);
@@ -31,19 +29,17 @@ public class JmpX86 extends IfNode implements MachNode {
// Encoding is appended into the byte array; size is returned
@Override public void encoding( Encoding enc ) {
enc.jump(this,cproj(0));
- // common opcode
- enc.add1(0x0F);
- enc.add1(x86_64_v2.jumpop(_bop));
+ enc.add1(0x0F).add1(x86_64_v2.jumpop(_bop));
enc.add4(0); // Offset patched later
}
@Override public void asm(CodeGen code, SB sb) {
String src = code.reg(in(1));
- if( src!="flags" ) sb.p(src);
- Node prj = cproj(0); // 0 is True is jump target
+ if( src!="flags" ) sb.p(src).p(" ");
+ CFGNode prj = cproj(0); // 0 is True is jump target
while( prj.nOuts() == 1 )
- prj = prj.out(0); // Skip empty blocks
- sb.p(prj instanceof LoopNode ? " LOOP" : " L").p(prj._nid);
+ prj = prj.uctrl(); // Skip empty blocks
+ sb.p(label(prj));
}
@Override public String comment() { return "L"+cproj(1)._nid; }
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java
index 6d52df9d..a6e51856 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java
@@ -3,22 +3,30 @@ package com.seaofnodes.simple.node.cpus.x86_64_v2;
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
-// E9 cd JMP rel32
-public class UJmpX86 implements MachNode {
+public class UJmpX86 extends CFGNode implements MachNode {
UJmpX86() { }
@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; }
- // Encoding is appended into the byte array; size is returned
+ @Override public Type compute() { throw Utils.TODO(); }
+ @Override public Node idealize() { throw Utils.TODO(); }
@Override public void encoding( Encoding enc ) {
- //enc.jump();
- //// E9 cd JMP rel32
- //enc.add1(0xE9);
- //enc.add4(0);
- throw Utils.TODO();
+ enc.jump(this,uctrl());
+ // E9 cd JMP rel32
+ enc.add1(0xE9).add4(0);
}
- @Override public void asm(CodeGen code, SB sb) { }
+ @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/x86_64_v2/x86_64_v2.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java
index 8cd7128d..70d03a12 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java
@@ -312,15 +312,13 @@ public class x86_64_v2 extends Machine {
}
// Create a split op; any register to any register, including stack slots
- @Override
- public SplitNode split(String kind, byte round, LRG lrg) {
+ @Override public SplitNode split(String kind, byte round, LRG lrg) {
return new SplitX86(kind, round);
}
// Return a MachNode unconditional branch
- @Override
- public CFGNode jump() {
- throw Utils.TODO();
+ @Override public CFGNode jump() {
+ return new UJmpX86();
}
// Break an infinite loop
diff --git a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
index eee4ceb7..648edbe1 100644
--- a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
+++ b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
@@ -78,6 +78,6 @@ return sqrt(farg) + sqrt(farg+2.0);
""";
testCPU(src,"x86_64_v2", "SystemV",3,"return .[];");
testCPU(src,"riscv" , "SystemV",1,"return (add,.[],(mul,.[],1000));");
- testCPU(src,"arm" , "SystemV",1,"return (add,.[],(muli,.[]));");
+ testCPU(src,"arm" , "SystemV",1,"return (add,.[],(mul,.[],1000));");
}
}