summaryrefslogtreecommitdiff
path: root/chapter21/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-03-18 11:37:26 -0700
committerCliff Click <cliffc@acm.org>2025-03-18 11:37:26 -0700
commit5cab242acdb68045e5993b75fc67b54901002072 (patch)
tree0d11800f2c3809d621b09bf194478385a1882a5c /chapter21/src
parente625a921d8fc9540a277e5becc8fe49b557c49fc (diff)
downloadSimple-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')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java5
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java3
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java2
-rw-r--r--chapter21/src/test/java/com/seaofnodes/simple/BrainFuckTest.java2
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));
}