summaryrefslogtreecommitdiff
path: root/chapter21/src/test
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-19 19:11:14 -0700
committerCliff Click <cliffc@acm.org>2026-09-19 19:11:14 -0700
commita8c96e04c59d37fe561319e86474f55c497705bb (patch)
treef5136e51bbf713aff85490ff3c3de7d46902368b /chapter21/src/test
parent2f779dd115acf1fc99c7b3b416273fdb66ad48cb (diff)
downloadSimple-a8c96e04c59d37fe561319e86474f55c497705bb.tar.gz
Simple-a8c96e04c59d37fe561319e86474f55c497705bb.zip
Fixed st8 on arm/risc evals
Diffstat (limited to 'chapter21/src/test')
-rw-r--r--chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java28
-rw-r--r--chapter21/src/test/java/com/seaofnodes/simple/EvalArm64.java2
-rw-r--r--chapter21/src/test/java/com/seaofnodes/simple/EvalRisc5.java2
3 files changed, 30 insertions, 2 deletions
diff --git a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
index d8a5cebc..a5d86fa5 100644
--- a/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
+++ b/chapter21/src/test/java/com/seaofnodes/simple/Chapter21Test.java
@@ -11,6 +11,34 @@ import org.junit.Test;
import static org.junit.Assert.*;
public class Chapter21Test {
+ @Test public void testRisc64BitStore() {
+ byte[] mem = new byte[24];
+ EvalRisc5 cpu = new EvalRisc5(mem,mem.length);
+ check64BitStore(mem,cpu::st8,cpu::ld8);
+ }
+
+ @Test public void testArm64BitStore() {
+ byte[] mem = new byte[24];
+ EvalArm64 cpu = new EvalArm64(mem,mem.length);
+ check64BitStore(mem,cpu::st8,cpu::ld8);
+ }
+
+ // Check bytes independently of ld8, including overwrite and adjacent memory.
+ private static void check64BitStore(byte[] mem,
+ java.util.function.BiConsumer<Integer,Long> store,
+ java.util.function.IntToLongFunction load) {
+ java.util.Arrays.fill(mem,(byte)0xA5);
+ for( long value : new long[]{0x0123456789ABCDEFL,0xFEDCBA9876543210L,
+ -1L,0L,Long.MIN_VALUE,Long.MAX_VALUE} ) {
+ store.accept(8,value);
+ for( int i=0; i<mem.length; i++ ) {
+ int expected = i>=8 && i<16 ? (int)(value >>> (8*(i-8)))&0xFF : 0xA5;
+ assertEquals("byte "+i,expected,mem[i]&0xFF);
+ }
+ assertEquals(value,load.applyAsLong(8));
+ }
+ }
+
@Test @Ignore
public void testJig() throws IOException {
diff --git a/chapter21/src/test/java/com/seaofnodes/simple/EvalArm64.java b/chapter21/src/test/java/com/seaofnodes/simple/EvalArm64.java
index 3ea9bea0..c10eccde 100644
--- a/chapter21/src/test/java/com/seaofnodes/simple/EvalArm64.java
+++ b/chapter21/src/test/java/com/seaofnodes/simple/EvalArm64.java
@@ -50,7 +50,7 @@ public class EvalArm64 {
public void st1(int x, int val) { _buf[x] = (byte)val; }
public void st2(int x, int val) { st1(x,val); st1(x+1,val>> 8); }
public void st4(int x, int val) { st2(x,val); st2(x+2,val>>16); }
- public void st8(int x, long val) { st4(x,(int)val); st2(x+4,(int)(val>>32)); }
+ public void st8(int x, long val) { st4(x,(int)val); st4(x+4,(int)(val>>32)); }
public int step(int maxops) {
int trap = 0;
diff --git a/chapter21/src/test/java/com/seaofnodes/simple/EvalRisc5.java b/chapter21/src/test/java/com/seaofnodes/simple/EvalRisc5.java
index fd953342..aa9702f1 100644
--- a/chapter21/src/test/java/com/seaofnodes/simple/EvalRisc5.java
+++ b/chapter21/src/test/java/com/seaofnodes/simple/EvalRisc5.java
@@ -55,7 +55,7 @@ import java.util.Arrays;
public void st1(int x, int val) { _buf[x] = (byte)val; }
public void st2(int x, int val) { st1(x,val); st1(x+1,val>> 8); }
public void st4(int x, int val) {st2(x,val); st2(x+2,val>>16); }
- public void st8(int x, long val) { st4(x,(int)val); st2(x+4,(int)(val>>32)); }
+ public void st8(int x, long val) { st4(x,(int)val); st4(x+4,(int)(val>>32)); }
// Note: only a few bits are used. (Machine = 3, User = 0)
// Bits 0..1 = privilege.