summaryrefslogtreecommitdiff
path: root/isa/src/test-support/java/com
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-07 12:57:31 -0700
committerCliff Click <cliffc@acm.org>2026-10-07 12:57:31 -0700
commitaaec6f8136df6f7020bfc05f79ff5273adf73de1 (patch)
tree5df4aae069bd88dd09f45d957c85161e571b7a46 /isa/src/test-support/java/com
parent514b3147bf08817d17aacc492be255621209ec8b (diff)
downloadSimple-aaec6f8136df6f7020bfc05f79ff5273adf73de1.tar.gz
Simple-aaec6f8136df6f7020bfc05f79ff5273adf73de1.zip
flt->int conversion
Diffstat (limited to 'isa/src/test-support/java/com')
-rw-r--r--isa/src/test-support/java/com/seaofnodes/isa/eval/EvalArm64.java9
-rw-r--r--isa/src/test-support/java/com/seaofnodes/isa/eval/EvalRisc5.java20
2 files changed, 25 insertions, 4 deletions
diff --git a/isa/src/test-support/java/com/seaofnodes/isa/eval/EvalArm64.java b/isa/src/test-support/java/com/seaofnodes/isa/eval/EvalArm64.java
index 2a4a2708..2fa4aec1 100644
--- a/isa/src/test-support/java/com/seaofnodes/isa/eval/EvalArm64.java
+++ b/isa/src/test-support/java/com/seaofnodes/isa/eval/EvalArm64.java
@@ -404,10 +404,13 @@ public class EvalArm64 {
break;
}
case 0x9E: {
- // scvtf
- is_f = true;
int rs1 = (ir >> 5) & 0x1F;
- frval = (double)regs[rs1];
+ if( (ir & 0xFFFFFC00)==0x9E780000 ) { // FCVTZS Xd,Dn
+ rval = (long)fregs[rs1];
+ } else { // SCVTF
+ is_f = true;
+ frval = (double)regs[rs1];
+ }
break;
}
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 f618075d..46baf447 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
@@ -334,7 +334,25 @@ public class EvalRisc5 {
default -> throw new UnsupportedOperationException();
};
break;
- case 26: frval = (double)regs[rs1]; break; // fcvt.w.d
+ case 24: // FCVT.L.D, RTZ
+ if( rs2!=2 || ((ir>>12)&7)!=1 ) throw new UnsupportedOperationException();
+ is_f = false;
+ rval = Double.isNaN(lhs) ? Long.MAX_VALUE : (long)lhs;
+ break;
+ case 26: frval = (double)regs[rs1]; break; // fcvt.d.l
+ case 28: { // FCLASS.D
+ if( rs2!=0 || ((ir>>12)&7)!=1 ) throw new UnsupportedOperationException();
+ is_f = false;
+ long bits = Double.doubleToRawLongBits(lhs);
+ boolean neg = bits<0;
+ int kind = Double.isNaN(lhs) ? ((bits&(1L<<51))==0 ? 8 : 9)
+ : Double.isInfinite(lhs) ? (neg ? 0 : 7)
+ : lhs==0 ? (neg ? 3 : 4)
+ : Math.abs(lhs)<Double.MIN_NORMAL ? (neg ? 2 : 5)
+ : (neg ? 1 : 6);
+ rval = 1L<<kind;
+ break;
+ }
default:
trap = (2+1); // Fault: Invalid opcode.
throw new UnsupportedOperationException();