diff options
| author | Cliff Click <cliffc@acm.org> | 2025-03-18 11:37:26 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-03-18 11:37:26 -0700 |
| commit | 5cab242acdb68045e5993b75fc67b54901002072 (patch) | |
| tree | 0d11800f2c3809d621b09bf194478385a1882a5c /chapter21/src | |
| parent | e625a921d8fc9540a277e5becc8fe49b557c49fc (diff) | |
| download | Simple-5cab242acdb68045e5993b75fc67b54901002072.tar.gz Simple-5cab242acdb68045e5993b75fc67b54901002072.zip | |
Fix comment printing
Minor encoding bugs for large- x86 jumps and arm external call
Diffstat (limited to 'chapter21/src')
7 files changed, 10 insertions, 8 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java index 8a465b66..fff5dac2 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java @@ -19,6 +19,6 @@ public class NewARM extends NewNode implements MachNode { } @Override public void asm(CodeGen code, SB sb) { - sb.p(code.reg(size())); + sb.p("#calloc, ").p(code.reg(size())); } } 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 d90ea15e..d2f50e45 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 @@ -212,7 +212,7 @@ public class arm extends Machine { public static void imm_inst(Encoding enc, Node n, int opcode, int imm12) { short self = enc.reg(n); short reg1 = enc.reg(n.in(1)); - int body = imm_inst(opcode, imm12, reg1, self); + int body = imm_inst(opcode, imm12&0xFFF, reg1, self); enc.add4(body); } 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 2d27e5c7..d325189a 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 @@ -48,9 +48,10 @@ public class JmpX86 extends IfNode implements MachNode, RIPRelSize { assert (byte)delta==delta; bits[opStart+1] = (byte)delta; } else { - assert bits[opStart ] == 0x0F; - assert bits[opStart+1] == x86_64_v2.jumpop(_bop); + assert bits[opStart] == x86_64_v2.jumpop(_bop)-16; delta -= 6; // Offset from opcode END + bits[opStart] = 0x0F; + bits[opStart+1] = (byte)x86_64_v2.jumpop(_bop); enc.patch4(opStart+2,delta); } } 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 c846f341..6263213d 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 @@ -25,7 +25,7 @@ public class NewX86 extends NewNode implements MachNode { // General form: "alloc #bytes" @Override public void asm(CodeGen code, SB sb) { - sb.p(code.reg(size())); + sb.p("#calloc, ").p(code.reg(size())); } } 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 143383a6..c2c804a2 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 @@ -38,7 +38,8 @@ public class UJmpX86 extends CFGNode implements MachNode, RIPRelSize { assert (byte)delta==delta; bits[opStart+1] = (byte)delta; } else { - assert bits[opStart ] == (byte)0xE9; + assert bits[opStart] == (byte)0xEB; + bits[opStart] = (byte)0xE9; // Long form delta -= 5; // Offset from opcode END enc.patch4(opStart+1,delta); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java b/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java index 9b0074c5..2ac94b46 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java @@ -138,7 +138,7 @@ public abstract class ASMPrinter { mach.asm(code,sb); int len = sb.len(); isMultiOp = isMultiOp(sb,old,len); - sb.fix(argWidth-len,""); // Pad out + sb.fix(argWidth-(len-old),""); // Pad out } else if( !(n._type instanceof TypeMem) ) { // Room for some inputs diff --git a/chapter21/src/test/java/com/seaofnodes/simple/BrainFuckTest.java b/chapter21/src/test/java/com/seaofnodes/simple/BrainFuckTest.java index 8b23a0ca..856baac4 100644 --- a/chapter21/src/test/java/com/seaofnodes/simple/BrainFuckTest.java +++ b/chapter21/src/test/java/com/seaofnodes/simple/BrainFuckTest.java @@ -64,7 +64,7 @@ for( int pc = 0; pc < program#; pc++ ) { return output; """; Chapter21Test.testCPU(src,"x86_64_v2", "SystemV",28,null); - Chapter21Test.testCPU(src,"riscv" , "SystemV",14,null); + Chapter21Test.testCPU(src,"riscv" , "SystemV",12,null); Chapter21Test.testCPU(src,"arm" , "SystemV",12,null); //assertEquals("Hello World!\n", Eval2.eval(code, 0, 10000)); } |
