softfloat_exceptionFlags = 0; })
#define require_rvc if(!(sr & SR_EC)) throw trap_illegal_instruction
+#define insn_length(x) (((x).bits & 0x3) < 0x3 ? 2 : 4)
#define sext32(x) ((sreg_t)(int32_t)(x))
-#define insn_length(x) (((x).bits & 0x3) < 0x3 ? 2 : 4)
+#define zext32(x) ((reg_t)(uint32_t)(x))
#define sext_xprlen(x) ((sreg_t(x) << (64-xprlen)) >> (64-xprlen))
+#define zext_xprlen(x) ((reg_t(x) << (64-xprlen)) >> (64-xprlen))
// RVC stuff
else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)
RD = RS1;
else
- RD = sext_xprlen(sreg_t(RS1) / sreg_t(RS2));
+ RD = sext_xprlen(sext_xprlen(RS1) / sext_xprlen(RS2));
if(RS2 == 0)
RD = UINT64_MAX;
else
- RD = sext_xprlen(RS1 / RS2);
+ RD = sext_xprlen(zext_xprlen(RS1) / zext_xprlen(RS2));
if(RS2 == 0)
RD = UINT64_MAX;
else
- RD = sext32(RS1 / RS2);
+ RD = sext32(zext32(RS1) / zext32(RS2));
else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)
RD = RS1;
else
- RD = sext32(sreg_t(RS1) / sreg_t(RS2));
+ RD = sext32(int32_t(RS1) / int32_t(RS2));
RD = (int128_t(a) * int128_t(b)) >> 64;
}
else
- RD = sext32((sreg_t(RS1) * sreg_t(RS2)) >> 32);
+ RD = sext32((sext32(RS1) * sext32(RS2)) >> 32);
RD = (int128_t(a) * uint128_t(b)) >> 64;
}
else
- RD = sext32((sreg_t(RS1) * reg_t((uint32_t)RS2)) >> 32);
+ RD = sext32((sext32(RS1) * reg_t((uint32_t)RS2)) >> 32);
else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)
RD = 0;
else
- RD = sext_xprlen(sreg_t(RS1) % sreg_t(RS2));
+ RD = sext_xprlen(sext_xprlen(RS1) % sext_xprlen(RS2));
if(RS2 == 0)
RD = RS1;
else
- RD = sext_xprlen(RS1 % RS2);
+ RD = sext_xprlen(zext_xprlen(RS1) % zext_xprlen(RS2));
if(RS2 == 0)
RD = RS1;
else
- RD = sext32(RS1 % RS2);
+ RD = sext32(zext_xprlen(RS1) % zext_xprlen(RS2));
else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)
RD = 0;
else
- RD = sext32(sreg_t(RS1) % sreg_t(RS2));
+ RD = sext32(int32_t(RS1) % int32_t(RS2));
-RD = sext_xprlen(sreg_t(RS1) >> (RS2 & (xprlen-1)));
+RD = sext_xprlen(sext_xprlen(RS1) >> (RS2 & (xprlen-1)));
require_xpr64;
-RD = sext32(sreg_t(RS1) >> (RS2 & 0x1F));
+RD = sext32(int32_t(RS1) >> (RS2 & 0x1F));