summaryrefslogtreecommitdiff
path: root/isa/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-28 13:39:05 -0700
committerCliff Click <cliffc@acm.org>2026-10-28 13:39:05 -0700
commit86ce5bc5d5018dcb62054d214b23f7a59b9c0d7d (patch)
tree7b564b142c32924db354edfd8553d34cb66fff3e /isa/src
parente481e3d215882faa82b19f29cfde5746d4e51863 (diff)
downloadSimple-86ce5bc5d5018dcb62054d214b23f7a59b9c0d7d.tar.gz
Simple-86ce5bc5d5018dcb62054d214b23f7a59b9c0d7d.zip
Fix bugs x86 storing only 32bits of a large constant
Missed field narrowing in a few cases
Diffstat (limited to 'isa/src')
-rw-r--r--isa/src/test-support/java/com/seaofnodes/isa/eval/EvalRisc5.java2
-rw-r--r--isa/src/test/java/com/seaofnodes/isa/RiscTest.java10
2 files changed, 11 insertions, 1 deletions
diff --git a/isa/src/test-support/java/com/seaofnodes/isa/eval/EvalRisc5.java b/isa/src/test-support/java/com/seaofnodes/isa/eval/EvalRisc5.java
index e6860ccd..6c3659ef 100644
--- a/isa/src/test-support/java/com/seaofnodes/isa/eval/EvalRisc5.java
+++ b/isa/src/test-support/java/com/seaofnodes/isa/eval/EvalRisc5.java
@@ -176,7 +176,7 @@ public class EvalRisc5 {
case 3: rval = ld8 ( rsval ); break;
case 4: rval = ld1z( rsval ); break;
case 5: rval = ld2z( rsval ); break;
- case 6: rval = ld4s( rsval ); break;
+ case 6: rval = ld4s( rsval ) & 0xFFFFFFFFL; break;
default: trap = (2+1);
}
}
diff --git a/isa/src/test/java/com/seaofnodes/isa/RiscTest.java b/isa/src/test/java/com/seaofnodes/isa/RiscTest.java
index 5b354036..4f49cdd2 100644
--- a/isa/src/test/java/com/seaofnodes/isa/RiscTest.java
+++ b/isa/src/test/java/com/seaofnodes/isa/RiscTest.java
@@ -44,6 +44,16 @@ public class RiscTest {
assert unsigned.step(1)==0;
assert unsigned.regs[3]==(value==0 ? 1 : 0);
}
+ for( int value : new int[]{0,1,Integer.MAX_VALUE,Integer.MIN_VALUE,-1} ) {
+ var loads = new EvalRisc5(new byte[1024],512);
+ loads.st4(4,0x00012183); // lw x3,0(x2)
+ loads.st4(8,0x00016203); // lwu x4,0(x2)
+ loads.st4(512,value);
+ loads._pc = 4;
+ assert loads.step(2)==0;
+ assert loads.regs[3]==value;
+ assert loads.regs[4]==(value & 0xFFFFFFFFL);
+ }
var logical=new EvalArm64(new byte[1024],512);
logical.st4(4,0xB27F0020); // orr x0,x1,#2
logical.st4(8,0x9A9F17E2); // cset x2,eq; false must not retain prior result