diff options
Diffstat (limited to 'chapter21/src/main/java')
6 files changed, 17 insertions, 8 deletions
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 9ec69f62..daa212f5 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,7 +46,10 @@ 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); + if( src!="flags" ) sb.p(src); + else sb.p(" "); + Node prj = cproj(0); + sb.p(prj instanceof LoopNode ? "LOOP" : "L").p(prj._nid); } @Override public String comment() { return "L"+cproj(1)._nid+", L"+cproj(0)._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 fec15b55..a7c0b7c7 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 @@ -39,6 +39,8 @@ public class BranchRISC extends IfNode implements MachNode { enc.add4(body); } @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))); + sb.p(code.reg(in(1))).p(" ").p(_bop).p(" ").p(in(2)==null ? "#0" : code.reg(in(2))).p(" "); + Node prj = cproj(0); + sb.p(prj instanceof LoopNode ? "LOOP" : "L").p(prj._nid); } } 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 5faf17f5..9b6eb98e 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 @@ -11,9 +11,13 @@ public class NewRISC extends NewNode implements MachNode { _inputs.add(auipc); // Add high-half address } @Override public String op() { return "alloc"; } - // Size and pointer result in standard calling convention; null for all the - // memory aliases edges - @Override public RegMask regmap(int i) { return i == 1 ? riscv.A0_MASK : null; } + @Override public RegMask regmap(int i) { + if( i == 1 ) return riscv.A0_MASK; // Size input + // Last call input is AUIPC + if( i == nIns()-1 ) return riscv.RMASK; + // In-between are mem aliases? + return null; + } @Override public RegMask outregmap(int i) { return i == 1 ? riscv.A0_MASK : null; } @Override public RegMask outregmap() { return null; } @Override public RegMask killmap() { return riscv.riscCallerSave(); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java index ca3ef758..4c03e07a 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java @@ -9,6 +9,7 @@ public class CmpX86 extends RegX86 { @Override public String op() { return "cmp"; } @Override int opcode() { return 0x3B; } @Override public RegMask outregmap() { return x86_64_v2.FLAGS_MASK; } + @Override public int twoAddress() { return 0; } @Override public void asm(CodeGen code, SB sb) { String dst = code.reg(this); if( dst!="flags" ) sb.p(dst).p(" = "); 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 5790d294..2971ae82 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 @@ -39,6 +39,7 @@ public class JmpX86 extends IfNode implements MachNode { @Override public void asm(CodeGen code, SB sb) { String src = code.reg(in(1)); if( src!="flags" ) sb.p(src); + else sb.p(" "); Node prj = cproj(0); sb.p(prj instanceof LoopNode ? "LOOP" : "L").p(prj._nid); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java index ea05e14c..19ebcbcf 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java @@ -1,9 +1,7 @@ package com.seaofnodes.simple.node.cpus.x86_64_v2; import com.seaofnodes.simple.*; -import com.seaofnodes.simple.codegen.CodeGen; -import com.seaofnodes.simple.codegen.Encoding; -import com.seaofnodes.simple.codegen.RegMask; +import com.seaofnodes.simple.codegen.*; import com.seaofnodes.simple.node.*; public class NewX86 extends NewNode implements MachNode { |
