59 changed files with 155 additions and 137 deletions
@ -1,2 +1 @@ |
|||
require64; |
|||
RD = RS1 + RS2; |
|||
RD = sext_xprlen(RS1 + RS2); |
|||
|
|||
@ -1,2 +1 @@ |
|||
require64; |
|||
RD = SIMM + RS1; |
|||
RD = sext_xprlen(RS1 + SIMM); |
|||
|
|||
@ -1 +1,2 @@ |
|||
require_xpr64; |
|||
RD = sext32(SIMM + RS1); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require64; |
|||
require_xpr64; |
|||
reg_t v = mmu.load_uint64(RS1); |
|||
mmu.store_uint64(RS1, RS2 + v); |
|||
RD = v; |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require64; |
|||
require_xpr64; |
|||
reg_t v = mmu.load_uint64(RS1); |
|||
mmu.store_uint64(RS1, RS2 & v); |
|||
RD = v; |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require64; |
|||
require_xpr64; |
|||
sreg_t v = mmu.load_int64(RS1); |
|||
mmu.store_uint64(RS1, std::max(sreg_t(RS2),v)); |
|||
RD = v; |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require64; |
|||
require_xpr64; |
|||
reg_t v = mmu.load_uint64(RS1); |
|||
mmu.store_uint64(RS1, std::max(RS2,v)); |
|||
RD = v; |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require64; |
|||
require_xpr64; |
|||
sreg_t v = mmu.load_int64(RS1); |
|||
mmu.store_uint64(RS1, std::min(sreg_t(RS2),v)); |
|||
RD = v; |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require64; |
|||
require_xpr64; |
|||
reg_t v = mmu.load_uint64(RS1); |
|||
mmu.store_uint64(RS1, std::min(RS2,v)); |
|||
RD = v; |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require64; |
|||
require_xpr64; |
|||
reg_t v = mmu.load_uint64(RS1); |
|||
mmu.store_uint64(RS1, RS2 | v); |
|||
RD = v; |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require64; |
|||
require_xpr64; |
|||
reg_t v = mmu.load_uint64(RS1); |
|||
mmu.store_uint64(RS1, RS2); |
|||
RD = v; |
|||
|
|||
@ -1,5 +1,9 @@ |
|||
require64; |
|||
if(RS2 == 0 || (sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)) |
|||
RD = sreg_t(RS1) < 0 ? INT64_MIN : INT64_MAX; |
|||
{ |
|||
if(xpr64) |
|||
RD = sreg_t(RS1) < 0 ? INT64_MIN : INT64_MAX; |
|||
else |
|||
RD = sreg_t(RS1) < 0 ? sext32(INT32_MIN) : INT32_MAX; |
|||
} |
|||
else |
|||
RD = sreg_t(RS1) / sreg_t(RS2); |
|||
RD = sext_xprlen(sreg_t(RS1) / sreg_t(RS2)); |
|||
|
|||
@ -1,5 +1,4 @@ |
|||
require64; |
|||
if(RS2 == 0) |
|||
RD = UINT64_MAX; |
|||
else |
|||
RD = RS1 / RS2; |
|||
RD = sext_xprlen(RS1 / RS2); |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
if(uint32_t(RS2) == 0) |
|||
RD = sext32(UINT32_MAX); |
|||
require_xpr64; |
|||
if(RS2 == 0) |
|||
RD = UINT64_MAX; |
|||
else |
|||
RD = sext32(uint32_t(RS1)/uint32_t(RS2)); |
|||
RD = sext32(RS1 / RS2); |
|||
|
|||
@ -1,4 +1,7 @@ |
|||
if(int32_t(RS2) == 0 || (int32_t(RS1) == INT32_MIN && int32_t(RS2) == -1)) |
|||
RD = sext32(int32_t(RS1) < 0 ? INT32_MIN : INT32_MAX); |
|||
require_xpr64; |
|||
// INT64_MIN/-1 corner case shouldn't occur in correct code, since
|
|||
// INT64_MIN is not a proper 32-bit signed value
|
|||
if(RS2 == 0 || (sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)) |
|||
RD = sext32(sreg_t(RS1) < 0 ? INT32_MIN : INT32_MAX); |
|||
else |
|||
RD = sext32(int32_t(RS1)/int32_t(RS2)); |
|||
RD = sext32(sreg_t(RS1) / sreg_t(RS2)); |
|||
|
|||
@ -1,2 +1,2 @@ |
|||
require64; |
|||
require_xpr64; |
|||
RD = mmu.load_int64(RS1+SIMM); |
|||
|
|||
@ -1,3 +1,3 @@ |
|||
require64; |
|||
require_xpr64; |
|||
require_fp; |
|||
RD = FRS2; |
|||
|
|||
@ -1,3 +1,3 @@ |
|||
require64; |
|||
require_xpr64; |
|||
require_fp; |
|||
FRD = RS1; |
|||
|
|||
@ -1,2 +1 @@ |
|||
require64; |
|||
RD = RS1 * RS2; |
|||
RD = sext_xprlen(RS1 * RS2); |
|||
|
|||
@ -1,4 +1,8 @@ |
|||
require64; |
|||
int64_t rb = RS1; |
|||
int64_t ra = RS2; |
|||
RD = (int128_t(rb) * int128_t(ra)) >> 64; |
|||
if(xpr64) |
|||
{ |
|||
int64_t a = RS1; |
|||
int64_t b = RS2; |
|||
RD = (int128_t(a) * int128_t(b)) >> 64; |
|||
} |
|||
else |
|||
RD = sext32((sreg_t(RS1) * sreg_t(RS2)) >> 32); |
|||
|
|||
@ -1,2 +1,4 @@ |
|||
require64; |
|||
RD = (uint128_t(RS1) * uint128_t(RS2)) >> 64; |
|||
if(xpr64) |
|||
RD = (uint128_t(RS1) * uint128_t(RS2)) >> 64; |
|||
else |
|||
RD = sext32((RS1 * RS2) >> 32); |
|||
|
|||
@ -1,2 +0,0 @@ |
|||
RD = sext32((RS1 * RS2) >> 32); |
|||
|
|||
@ -1,2 +0,0 @@ |
|||
RD = sext32((sreg_t(RS1) * sreg_t(RS2)) >> 32); |
|||
|
|||
@ -1,5 +1,6 @@ |
|||
require64; |
|||
if(RS2 == 0 || (sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)) |
|||
if(RS2 == 0) |
|||
RD = RS1; |
|||
else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1) |
|||
RD = 0; |
|||
else |
|||
RD = sreg_t(RS1) % sreg_t(RS2); |
|||
RD = sext_xprlen(sreg_t(RS1) % sreg_t(RS2)); |
|||
|
|||
@ -1,5 +1,4 @@ |
|||
require64; |
|||
if(RS2 == 0) |
|||
RD = 0; |
|||
RD = RS1; |
|||
else |
|||
RD = RS1 % RS2; |
|||
RD = sext_xprlen(RS1 % RS2); |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
if(uint32_t(RS2) == 0) |
|||
RD = 0; |
|||
require_xpr64; |
|||
if(RS2 == 0) |
|||
RD = RS1; |
|||
else |
|||
RD = sext32(uint32_t(RS1) % uint32_t(RS2)); |
|||
RD = sext32(RS1 % RS2); |
|||
|
|||
@ -1,4 +1,9 @@ |
|||
if(int32_t(RS2) == 0 || (int32_t(RS1) == INT32_MIN && int32_t(RS2) == -1)) |
|||
require_xpr64; |
|||
// INT64_MIN/-1 corner case shouldn't occur in correct code, since
|
|||
// INT64_MIN is not a proper 32-bit signed value
|
|||
if(RS2 == 0) |
|||
RD = RS1; |
|||
else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1) |
|||
RD = 0; |
|||
else |
|||
RD = sext32(int32_t(RS1) % int32_t(RS2)); |
|||
RD = sext32(sreg_t(RS1) % sreg_t(RS2)); |
|||
|
|||
@ -1,2 +1,2 @@ |
|||
require64; |
|||
require_xpr64; |
|||
mmu.store_uint64(RS1+BIMM, RS2); |
|||
|
|||
@ -1,2 +1 @@ |
|||
require64; |
|||
RD = RS1 << (RS2 & 0x3F); |
|||
RD = sext_xprlen(RS1 << (RS2 & (xprlen-1))); |
|||
|
|||
@ -1,2 +1,8 @@ |
|||
require64; |
|||
RD = RS1 << SHAMT; |
|||
if(xpr64) |
|||
RD = RS1 << SHAMT; |
|||
else |
|||
{ |
|||
if(SHAMT & 0x20) |
|||
throw trap_illegal_instruction; |
|||
RD = sext32(RS1 << SHAMT); |
|||
} |
|||
|
|||
@ -1 +1,2 @@ |
|||
require_xpr64; |
|||
RD = sext32(RS1 << SHAMTW); |
|||
|
|||
@ -1 +1,2 @@ |
|||
require_xpr64; |
|||
RD = sext32(RS1 << (RS2 & 0x1F)); |
|||
|
|||
@ -1,2 +1 @@ |
|||
require64; |
|||
RD = sreg_t(RS1) >> (RS2 & 0x3F); |
|||
RD = sext_xprlen(sreg_t(RS1) >> (RS2 & (xprlen-1))); |
|||
|
|||
@ -1,2 +1,8 @@ |
|||
require64; |
|||
RD = sreg_t(RS1) >> SHAMT; |
|||
if(xpr64) |
|||
RD = sreg_t(RS1) >> SHAMT; |
|||
else |
|||
{ |
|||
if(SHAMT & 0x20) |
|||
throw trap_illegal_instruction; |
|||
RD = sext32(sreg_t(RS1) >> SHAMT); |
|||
} |
|||
|
|||
@ -1 +1,2 @@ |
|||
require_xpr64; |
|||
RD = sext32(sreg_t(RS1) >> SHAMTW); |
|||
|
|||
@ -1 +1,2 @@ |
|||
require_xpr64; |
|||
RD = sext32(sreg_t(RS1) >> (RS2 & 0x1F)); |
|||
|
|||
@ -1,2 +1,4 @@ |
|||
require64; |
|||
RD = RS1 >> (RS2 & 0x3F); |
|||
if(xpr64) |
|||
RD = RS1 >> (RS2 & 0x3F); |
|||
else |
|||
RD = sext32((uint32_t)RS1 >> (RS2 & 0x1F)); |
|||
|
|||
@ -1,2 +1,8 @@ |
|||
require64; |
|||
RD = RS1 >> SHAMT; |
|||
if(xpr64) |
|||
RD = RS1 >> SHAMT; |
|||
else |
|||
{ |
|||
if(SHAMT & 0x20) |
|||
throw trap_illegal_instruction; |
|||
RD = sext32((uint32_t)RS1 >> SHAMT); |
|||
} |
|||
|
|||
@ -1 +1,2 @@ |
|||
require_xpr64; |
|||
RD = sext32((uint32_t)RS1 >> SHAMTW); |
|||
|
|||
@ -1 +1,2 @@ |
|||
require_xpr64; |
|||
RD = sext32((uint32_t)RS1 >> (RS2 & 0x1F)); |
|||
|
|||
@ -1,2 +1 @@ |
|||
require64; |
|||
RD = RS1 - RS2; |
|||
RD = sext_xprlen(RS1 - RS2); |
|||
|
|||
@ -1,2 +1,3 @@ |
|||
require_xpr64; |
|||
RD = sext32(RS1 - RS2); |
|||
|
|||
|
|||
Loading…
Reference in new issue