summaryrefslogtreecommitdiff
path: root/chapter22/src/test/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-05-09 21:05:24 -0700
committerCliff Click <cliffc@acm.org>2025-05-09 21:05:24 -0700
commit05afabd5152b06295e16c65b5a249229a4ead996 (patch)
treef6083c53c7519e516db18e3ec5ab895a15b585e1 /chapter22/src/test/java/com/seaofnodes
parent05c529f379c9c82387916aba7f83f7a215829e37 (diff)
downloadSimple-05afabd5152b06295e16c65b5a249229a4ead996.tar.gz
Simple-05afabd5152b06295e16c65b5a249229a4ead996.zip
Bugs for BubbleSort
Encoding picking up extra function padding if needing another round for X86 short jumps. GCM failed to late schedule around loop backedges. X86 Div was using AX/DX as *source* registers. X86 kills more flags.
Diffstat (limited to 'chapter22/src/test/java/com/seaofnodes')
-rw-r--r--chapter22/src/test/java/com/seaofnodes/simple/BrainFuckTest.java2
-rw-r--r--chapter22/src/test/java/com/seaofnodes/simple/Chapter22Test.java2
-rw-r--r--chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp79
3 files changed, 74 insertions, 9 deletions
diff --git a/chapter22/src/test/java/com/seaofnodes/simple/BrainFuckTest.java b/chapter22/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
index 2733620e..1e1a1dc3 100644
--- a/chapter22/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
+++ b/chapter22/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
@@ -16,7 +16,7 @@ public class BrainFuckTest {
String brain_fuck = "Hello World!\n";
TestC.run("brain_fuck", brain_fuck, 40);
- EvalRisc5 R5 = TestRisc5.build("brain_fuck", 0, 44, false);
+ EvalRisc5 R5 = TestRisc5.build("brain_fuck", 0, 28, false);
int trap = R5.step(100000);
assertEquals(0,trap);
int ptr = (int)R5.regs[riscv.A0];
diff --git a/chapter22/src/test/java/com/seaofnodes/simple/Chapter22Test.java b/chapter22/src/test/java/com/seaofnodes/simple/Chapter22Test.java
index 55ab97ca..304fb1cf 100644
--- a/chapter22/src/test/java/com/seaofnodes/simple/Chapter22Test.java
+++ b/chapter22/src/test/java/com/seaofnodes/simple/Chapter22Test.java
@@ -16,7 +16,7 @@ public class Chapter22Test {
@Test @Ignore
public void testJig() throws IOException {
//String src = Files.readString(Path.of("src/test/java/com/seaofnodes/simple/progs/jig.smp"));
- String src = Files.readString(Path.of("doc/examples/BubbleSort.smp"));
+ String src = Files.readString(Path.of("docs/examples/BubbleSort.smp"));
testCPU(src,"x86_64_v2", "Win64" ,-1,null);
testCPU(src,"riscv" , "SystemV",-1,null);
testCPU(src,"arm" , "SystemV",-1,null);
diff --git a/chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp b/chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp
index 0f28dfce..70f45717 100644
--- a/chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp
+++ b/chapter22/src/test/java/com/seaofnodes/simple/progs/jig.smp
@@ -1,23 +1,88 @@
// -*- mode: java; -*-
+
val _exit = { u8[~] msg ->
sys.io.p(msg);
sys.libc._exit(1);
};
+val usage = { -> _exit("stdin must look like [4, 3, 2, 1]"); };
+// Scanner
struct Scan {
int !x;
u8[~] buf;
};
+// Skip whitespace
+val skip = { Scan s ->
+ while( s.buf[s.x] <= 32 )
+ s.x++;
+};
+
+// Require specific syntax or usage
+val require = { Scan s, u8 c ->
+ skip(s);
+ if( s.buf[s.x++] != c )
+ usage();
+};
+
+val peek = { Scan s, u8 c ->
+ skip(s);
+ if( s.buf[s.x] != c ) return false;
+ s.x++;
+ return true;
+};
+
+val number = { Scan s ->
+ skip(s);
+ i32 n = 0;
+ while( '0' <= s.buf[s.x] & s.buf[s.x] <= '9' )
+ n = n*10 + (s.buf[s.x++] - '0');
+ return n;
+};
+
// Read from stdin a line of the form "[ 4, 3, 2, 1]" and print it sorted.
val main = { ->
Scan !s = new Scan{ buf = sys.io.stdin(); };
- var junk = new u8[1];
- while( s.x < s.buf# ) {
- sys.io.p("scan ");
- junk[0] = s.buf[s.x++];
- sys.io.p(junk);
- };
- return 0;
+ require(s,'[');
+ // Array of parsed results
+ int[] !ns = new int[16];
+ i32 num = 0;
+ // Parse a list of numbers
+ if( !peek(s,']') ) { // Handle the empty list
+ // Parse "123, " until a something else
+ while( s.x < s.buf# ) {
+ int n = number(s);
+ i32 q=n;
+ ns[num++] = n;
+ if( !peek(s,',') )
+ break;
+ };
+ require(s,']'); // Close the list
+ }
+
+ // Print a list of numbers
+ sys.io.p("[ ");
+ u8[] !buf = new u8[20];
+ for( int i=0; i<num; i++ ) {
+ int x = ns[i];
+ if( !x ) { sys.io.p("0, "); continue; }
+
+ u32 log=0, q=x;
+ while( q>0 )
+ { q/=10; log++; }
+ i32 raw=log;
+ sys.libc._exit(raw);
+ // for( int j=0, a=x; j<log; j++ ) {
+ // q = x/10;
+ // buf[log-j] = '0'+(x-q*10);
+ // x = q;
+ // }
+ // int raw = buf;
+ // sys.libc.write(1,raw,log);
+ // sys.io.p(", ");
+ }
+ sys.io.p("]");
+
+ return num;
};