diff options
| author | Cliff Click <cliffc@acm.org> | 2026-10-07 12:57:31 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-10-07 12:57:31 -0700 |
| commit | aaec6f8136df6f7020bfc05f79ff5273adf73de1 (patch) | |
| tree | 5df4aae069bd88dd09f45d957c85161e571b7a46 /isa/src/test-support/java | |
| parent | 514b3147bf08817d17aacc492be255621209ec8b (diff) | |
| download | Simple-aaec6f8136df6f7020bfc05f79ff5273adf73de1.tar.gz Simple-aaec6f8136df6f7020bfc05f79ff5273adf73de1.zip | |
flt->int conversion
Diffstat (limited to 'isa/src/test-support/java')
| -rw-r--r-- | isa/src/test-support/java/com/seaofnodes/isa/eval/EvalArm64.java | 9 | ||||
| -rw-r--r-- | isa/src/test-support/java/com/seaofnodes/isa/eval/EvalRisc5.java | 20 |
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(); |
