26 changed files with 43 additions and 37 deletions
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD((RS1 + RS2)>>1); |
WRITE_RD(sext32((RS1 + RS2)>>1)); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD((0ULL + (uint32_t)RS1 + (uint32_t)RS2)>>1); |
WRITE_RD(sext32((0ULL + (uint32_t)RS1 + (uint32_t)RS2)>>1)); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD((RS1 - RS2)>>1); |
WRITE_RD(sext32((RS1 - RS2)>>1)); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD((0ULL + (uint32_t)RS1 - (uint32_t)RS2)>>1); |
WRITE_RD((sext32(0ULL + (uint32_t)RS1 - (uint32_t)RS2)>>1)); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16)) >> 15)); |
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16)) >> 15))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16)) >> 15)); |
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16)) >> 15))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16)) >> 15)); |
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16)) >> 15))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16) + 0x4000) >> 15)); |
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16) + 0x4000) >> 15))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15)); |
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15)); |
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15))); |
||||
|
|||||
@ -1,4 +1,4 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
int64_t mres = sext(RS1,64) * sext(P_FIELD(RS2, 0, 16),64); |
int64_t mres = sext(RS1,64) * sext(P_FIELD(RS2, 0, 16),64); |
||||
WRITE_RD(mres>>32); |
WRITE_RD(sext32(mres>>16)); |
||||
|
|||||
@ -1,4 +1,4 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
int64_t mres = sext(RS1,64) * sext(P_FIELD(RS2, 1, 16),64); |
int64_t mres = sext(RS1,64) * sext(P_FIELD(RS2, 1, 16),64); |
||||
WRITE_RD(mres>>32); |
WRITE_RD(sext32(mres>>16)); |
||||
|
|||||
@ -1,4 +1,4 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 0, 16); |
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 0, 16); |
||||
WRITE_RD(mres >> 32); |
WRITE_RD(sext32(mres >> 16)); |
||||
|
|||||
@ -1,4 +1,4 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 1, 16); |
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 1, 16); |
||||
WRITE_RD(mres >> 32); |
WRITE_RD(sext32(mres >> 16)); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD((sreg_t)P_RS1_PAIR >> (RS2 & 0x3f)); |
WRITE_RD(sext32((sreg_t)P_RS1_PAIR >> (RS2 & 0x3f))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD((sreg_t)P_RS1_PAIR >> insn.shamtd()); |
WRITE_RD(sext32((sreg_t)P_RS1_PAIR >> insn.shamtd())); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(P_RS1_PAIR >> (RS2 & 0x3f)); |
WRITE_RD(sext32(P_RS1_PAIR >> (RS2 & 0x3f))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(P_RS1_PAIR >> insn.shamtd()); |
WRITE_RD(sext32(P_RS1_PAIR >> insn.shamtd())); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(P_SAT(xlen, sext_xlen((RS1 << 1) + RS2))); |
WRITE_RD(sext32(P_SAT(xlen, (RS1 + RS2)))); |
||||
|
|||||
@ -1,4 +1,7 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
bool sat = false; |
bool sat = false; |
||||
WRITE_RD(sat_addu<uint32_t>(RS1, RS2, sat)); |
reg_t tmp = sat_addu<uint32_t>(RS1, RS2, sat); |
||||
|
if (sat) |
||||
|
P.set_vxsat(); |
||||
|
WRITE_RD(sext32(tmp)); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
WRITE_RD(P_SAT(xlen, sext_xlen((RS1 << 1) + RS2))); |
WRITE_RD(sext32(P_SAT(xlen, ((RS1 << 1) + RS2)))); |
||||
|
|||||
@ -1,13 +1,16 @@ |
|||||
require_extension('P'); |
require_extension('P'); |
||||
require_rv32; |
require_rv32; |
||||
sreg_t sshamt = P_FIELD(RS2, 0, 8); |
sreg_t sshamt = P_FIELD(RS2, 0, 8); |
||||
if (RS1 == 0) |
sreg_t val; |
||||
WRITE_RD(0); |
if (RS1 == 0) { |
||||
else if (sshamt >= 32) { |
val = 0; |
||||
WRITE_RD((RS1 & 0x80000000) ? 0x80000000 : 0x7fffffff); |
} else if (sshamt >= 32) { |
||||
|
val = (RS1 & 0x80000000) ? 0x80000000 : 0x7fffffff; |
||||
P.set_vxsat(); |
P.set_vxsat(); |
||||
|
} else if (sshamt <= -32) { |
||||
|
val = (RS1 & 0x80000000) ? 0xffffffff : 0; |
||||
|
} else { |
||||
|
val = sshamt >= 0 ? P_SAT(32, static_cast<sreg_t> (RS1) << sshamt) : (RS1 >> -sshamt); |
||||
} |
} |
||||
else if (sshamt <= -32) |
|
||||
WRITE_RD((RS1 & 0x80000000) ? 0xffffffff : 0); |
WRITE_RD(sext32(val)); |
||||
else |
|
||||
WRITE_RD(sshamt >= 0 ? P_SAT(32, static_cast<sreg_t> (RS1) << sshamt) : (RS1 >> -sshamt)); |
|
||||
|
|||||
Loading…
Reference in new issue