committed by
GitHub
123 changed files with 446 additions and 536 deletions
@ -1,3 +1,3 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
WRITE_RD((RS1 + RS2)>>1); |
|||
WRITE_RD(sext32((RS1 + RS2)>>1)); |
|||
|
|||
@ -1,3 +1,3 @@ |
|||
require_extension('P'); |
|||
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_rv32; |
|||
WRITE_RD((RS1 - RS2)>>1); |
|||
WRITE_RD(sext32((RS1 - RS2)>>1)); |
|||
|
|||
@ -1,3 +1,3 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
WRITE_RD((0ULL + (uint32_t)RS1 - (uint32_t)RS2)>>1); |
|||
WRITE_RD((sext32(0ULL + (uint32_t)RS1 - (uint32_t)RS2)>>1)); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
sreg_t mres = sext32(RS1) * sext32(RS2); |
|||
WRITE_RD(RD + (mres >> 32)); |
|||
WRITE_RD(sext32(RD + (mres >> 32))); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
sreg_t mres = sext32(RS1) * sext32(P_FIELD(RS2, 0, 16)); |
|||
WRITE_RD(RD + (mres >> 32)); |
|||
WRITE_RD(sext32(RD + (mres >> 16))); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
sreg_t mres = sext32(RS1) * sext32(P_FIELD(RS2, 1, 16)); |
|||
WRITE_RD(RD + (mres >> 32)); |
|||
WRITE_RD(sext32(RD + (mres >> 16))); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
sreg_t mres = sext32(RS1) * reg_t((uint32_t)RS2); |
|||
WRITE_RD(RD + (mres >> 32)); |
|||
WRITE_RD(sext32(RD + (mres >> 32))); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 0, 16); |
|||
WRITE_RD(RD + (mres >> 32)); |
|||
WRITE_RD(sext32(RD + (mres >> 16))); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 1, 16); |
|||
WRITE_RD(RD + (mres >> 32)); |
|||
WRITE_RD(sext32(RD + (mres >> 16))); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
uint64_t mres = reg_t((uint32_t)RS1) * reg_t((uint32_t)RS2); |
|||
WRITE_RD(RD + (mres >> 32)); |
|||
WRITE_RD(sext32(RD + (mres >> 32))); |
|||
|
|||
@ -1,3 +1,3 @@ |
|||
require_extension('P'); |
|||
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_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_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_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_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_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,3 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
WRITE_P_RD_PAIR(P_RD_PAIR + (((sreg_t)RS1*(sreg_t)RS2 + 0x40000000) >> 31)); |
|||
int64_t tmp = (((int128_t)(int32_t)RS1 * (int32_t)RS2) + (1 << 30)) >> 31; |
|||
WRITE_P_RD_PAIR(P_RD_PAIR + tmp); |
|||
|
|||
@ -1,3 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
WRITE_P_RD_PAIR(P_RD_PAIR + (((sreg_t)RS1*(sreg_t)RS2) >> 31)); |
|||
int64_t tmp = (((int128_t)(int32_t)RS1 * (int32_t)RS2)) >> 31; |
|||
WRITE_P_RD_PAIR((P_RD_PAIR + tmp)); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
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_rv32; |
|||
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_rv32; |
|||
int64_t mres = sext(RS1,64) * sext(RS2,64); |
|||
WRITE_RD(((mres >> 31) + 1) >> 1); |
|||
WRITE_RD(sext32(((mres >> 31) + 1) >> 1)); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
sreg_t mres = sext(RS1,64) * reg_t((uint32_t)RS2); |
|||
WRITE_RD(((mres >> 31) + 1) >> 1); |
|||
WRITE_RD(sext32(((mres >> 31) + 1) >> 1)); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
sreg_t mres = reg_t((uint32_t)RS1) * reg_t((uint32_t)RS2); |
|||
WRITE_RD(((mres >> 31) + 1) >> 1); |
|||
WRITE_RD(sext32(((mres >> 31) + 1) >> 1)); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
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_rv32; |
|||
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 1, 16); |
|||
WRITE_RD(mres >> 32); |
|||
WRITE_RD(sext32(mres >> 16)); |
|||
|
|||
@ -1,5 +1,8 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
reg_t tmp = (reg_t)P_RS1_PAIR >> insn.shamtd(); |
|||
uint32_t result = P_USAT_FULL(32, (sreg_t)tmp); |
|||
WRITE_RD(result); |
|||
if (tmp > UINT32_MAX) { |
|||
tmp = UINT32_MAX; |
|||
P.set_vxsat(); |
|||
} |
|||
WRITE_RD(sext32(tmp)); |
|||
|
|||
@ -1,11 +1,11 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
reg_t val = (reg_t)P_RS1_PAIR; |
|||
uint32_t shamt = insn.shamtd(); |
|||
reg_t result; |
|||
if (shamt == 0) { |
|||
result = P_USAT_FULL(32, (sreg_t)val); |
|||
} else { |
|||
result = P_USAT_FULL(32, (sreg_t)((val >> shamt) + ((val >> (shamt - 1)) & 1))); |
|||
reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1; |
|||
|
|||
if (tmp > UINT32_MAX) { |
|||
tmp = UINT32_MAX; |
|||
P.set_vxsat(); |
|||
} |
|||
WRITE_RD(result); |
|||
WRITE_RD(sext32(tmp)); |
|||
|
|||
|
|||
@ -1,11 +1,11 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
reg_t val = (reg_t)P_RS1_PAIR; |
|||
uint32_t shamt = RS2 & 0x3f; |
|||
reg_t result; |
|||
if (shamt == 0) { |
|||
result = P_USAT_FULL(32, (sreg_t)val); |
|||
} else { |
|||
result = P_USAT_FULL(32, (sreg_t)((val >> shamt) + ((val >> (shamt - 1)) & 1))); |
|||
reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1; |
|||
|
|||
if (tmp > UINT32_MAX) { |
|||
tmp = UINT32_MAX; |
|||
P.set_vxsat(); |
|||
} |
|||
WRITE_RD(result); |
|||
WRITE_RD(sext32(tmp)); |
|||
|
|||
|
|||
@ -1,5 +1,9 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
reg_t tmp = (reg_t)P_RS1_PAIR >> (RS2 & 0x3f); |
|||
uint32_t result = P_USAT_FULL(32, (sreg_t)tmp); |
|||
WRITE_RD(result); |
|||
if (tmp > UINT32_MAX) { |
|||
tmp = UINT32_MAX; |
|||
P.set_vxsat(); |
|||
} |
|||
|
|||
WRITE_RD(sext32(tmp)); |
|||
|
|||
@ -1,3 +1,3 @@ |
|||
require_extension('P'); |
|||
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_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_rv32; |
|||
WRITE_RD(P_RS1_PAIR >> (RS2 & 0x3f)); |
|||
WRITE_RD(sext32(P_RS1_PAIR >> (RS2 & 0x3f))); |
|||
|
|||
@ -1,3 +1,3 @@ |
|||
require_extension('P'); |
|||
require_rv32; |
|||
WRITE_RD(P_RS1_PAIR >> insn.shamtd()); |
|||
WRITE_RD(sext32(P_RS1_PAIR >> insn.shamtd())); |
|||
|
|||
@ -1,7 +1,7 @@ |
|||
require_rv32; |
|||
P_WIDEN_REDUCTION_LOOP(32, 16, false, false, { |
|||
if (j & 1) |
|||
p_res += p_rs1 * p_rs2; |
|||
else |
|||
p_res -= p_rs1 * p_rs2; |
|||
else |
|||
p_res += p_rs1 * p_rs2; |
|||
}) |
|||
@ -1,7 +1,7 @@ |
|||
require_rv32; |
|||
P_WIDEN_REDUCTION_CROSS_LOOP(32, 16, false, false, { |
|||
if (j & 1) |
|||
p_res += p_rs1 * p_rs2; |
|||
p_res -= (int64_t)p_rs1 * p_rs2; |
|||
else |
|||
p_res -= p_rs1 * p_rs2; |
|||
p_res += (int64_t)p_rs1 * p_rs2; |
|||
}) |
|||
@ -1,7 +1,7 @@ |
|||
require_rv32; |
|||
P_WIDEN_REDUCTION_LOOP(32, 16, true, false, { |
|||
if (j & 1) |
|||
p_res += p_rs1 * p_rs2; |
|||
else |
|||
p_res -= p_rs1 * p_rs2; |
|||
else |
|||
p_res += p_rs1 * p_rs2; |
|||
}) |
|||
@ -1,7 +1,7 @@ |
|||
require_rv32; |
|||
P_WIDEN_REDUCTION_CROSS_LOOP(32, 16, true, false, { |
|||
if (j & 1) |
|||
p_res += p_rs1 * p_rs2; |
|||
else |
|||
p_res -= p_rs1 * p_rs2; |
|||
else |
|||
p_res += p_rs1 * p_rs2; |
|||
}) |
|||
@ -1,4 +1,4 @@ |
|||
P_RD_RS1_RS2_E_LOOP(16,16,8, { |
|||
int32_t mres = sext32(p_rs1) * sext32(p_rs2); |
|||
p_rd += mres>>16; |
|||
p_rd += mres>>8; |
|||
}) |
|||
@ -1,4 +1,4 @@ |
|||
P_RD_RS1_RS2_O_LOOP(16,16,8, { |
|||
int32_t mres = sext32(p_rs1) * sext32(p_rs2); |
|||
p_rd += mres>>16; |
|||
p_rd += mres>>8; |
|||
}) |
|||
@ -1,6 +1,6 @@ |
|||
require_rv64; |
|||
P_RD_RS1_RS2_E_LOOP(32,32,16, { |
|||
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
|||
p_rd += mres>>32; |
|||
p_rd += mres>>16; |
|||
} |
|||
) |
|||
|
|||
@ -1,6 +1,6 @@ |
|||
require_rv64; |
|||
P_RD_RS1_RS2_O_LOOP(32,32,16, { |
|||
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
|||
p_rd += mres>>32; |
|||
p_rd += mres>>16; |
|||
} |
|||
) |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
P_RD_RS1_RS2_E_SULOOP(16,16,8, { |
|||
int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); |
|||
p_rd += mres>>16; |
|||
p_rd += mres>>8; |
|||
}) |
|||
@ -1,4 +1,4 @@ |
|||
P_RD_RS1_RS2_O_SULOOP(16,16,8, { |
|||
int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); |
|||
p_rd += mres>>16; |
|||
p_rd += mres>>8; |
|||
}) |
|||
@ -1,6 +1,6 @@ |
|||
require_rv64; |
|||
P_RD_RS1_RS2_E_SULOOP(32,32,16, { |
|||
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
|||
p_rd += mres>>32; |
|||
p_rd += mres>>16; |
|||
} |
|||
) |
|||
|
|||
@ -1,6 +1,6 @@ |
|||
require_rv64; |
|||
P_RD_RS1_RS2_O_SULOOP(32,32,16, { |
|||
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
|||
p_rd += mres>>32; |
|||
p_rd += mres>>16; |
|||
} |
|||
) |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
require_rv32; |
|||
P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { |
|||
p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; |
|||
int64_t val = ((int64_t)(int16_t)p_rs1 * (int64_t)(int16_t)p_rs2 + 0x4000) >> 15; |
|||
p_rd += val; |
|||
}) |
|||
@ -1,4 +1,5 @@ |
|||
require_rv32; |
|||
P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { |
|||
p_rd += (p_rs1 * p_rs2) >> 15; |
|||
int64_t val = ((int64_t)(int16_t)p_rs1 * (int64_t)(int16_t)p_rs2) >> 15; |
|||
p_rd += val; |
|||
}) |
|||
@ -1,4 +1,4 @@ |
|||
P_RD_RS1_RS2_E_LOOP(16,16,8, { |
|||
int32_t mres = sext(p_rs1,32) * sext(p_rs2,32); |
|||
p_rd = mres >> 16; |
|||
p_rd = mres >> 8; |
|||
}) |
|||
@ -1,4 +1,4 @@ |
|||
P_RD_RS1_RS2_O_LOOP(16,16,8, { |
|||
int32_t mres = sext(p_rs1,32) * sext(p_rs2,32); |
|||
p_rd = mres >> 16; |
|||
p_rd = mres >> 8; |
|||
}) |
|||
@ -1,6 +1,6 @@ |
|||
require_rv64; |
|||
P_RD_RS1_RS2_E_LOOP(32,32,16, { |
|||
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
|||
p_rd = mres >> 32; |
|||
p_rd = mres >> 16; |
|||
} |
|||
) |
|||
|
|||
@ -1,6 +1,6 @@ |
|||
require_rv64; |
|||
P_RD_RS1_RS2_O_LOOP(32,32,16, { |
|||
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
|||
p_rd = mres >> 32; |
|||
p_rd = mres >> 16; |
|||
} |
|||
) |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
P_RD_RS1_RS2_E_SULOOP(16,16,8, { |
|||
int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); |
|||
p_rd = mres >> 16; |
|||
p_rd = mres >> 8; |
|||
}) |
|||
@ -1,4 +1,4 @@ |
|||
P_RD_RS1_RS2_O_SULOOP(16,16,8, { |
|||
int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); |
|||
p_rd = mres >> 16; |
|||
p_rd = mres >> 8; |
|||
}) |
|||
@ -1,6 +1,6 @@ |
|||
require_rv64; |
|||
P_RD_RS1_RS2_O_SULOOP(32,32,16, { |
|||
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
|||
p_rd = mres >> 32; |
|||
p_rd = mres >> 16; |
|||
} |
|||
) |
|||
|
|||
@ -1,4 +1,6 @@ |
|||
P_RD_RS1_RS2_LOOP(8,8,8, { |
|||
bool sat = false; |
|||
p_rd = (sat_add<int8_t, uint8_t>(p_rs1, p_rs2, sat)); |
|||
if (sat) |
|||
P.set_vxsat(); |
|||
}) |
|||
@ -1,4 +1,6 @@ |
|||
P_RD_RS1_RS2_LOOP(16,16,16, { |
|||
bool sat = false; |
|||
p_rd = (sat_add<int16_t, uint16_t>(p_rs1, p_rs2, sat)); |
|||
if (sat) |
|||
P.set_vxsat(); |
|||
}) |
|||
@ -1,4 +1,6 @@ |
|||
P_RD_RS1_RS2_ULOOP(8,8,8, { |
|||
bool sat = false; |
|||
p_rd = (sat_addu<uint8_t>(p_rs1, p_rs2, sat)); |
|||
if (sat) |
|||
P.set_vxsat(); |
|||
}) |
|||
@ -1,4 +1,6 @@ |
|||
P_RD_RS1_RS2_ULOOP(16,16,16, { |
|||
bool sat = false; |
|||
p_rd = (sat_addu<uint16_t>(p_rs1, p_rs2, sat)); |
|||
if (sat) |
|||
P.set_vxsat(); |
|||
}) |
|||
@ -1,7 +1,6 @@ |
|||
require_rv32; |
|||
P_RD_RS1_DW_LOOP(32, 32, { |
|||
uint8_t m = P_FIELD(RS2, 0, 8); |
|||
uint8_t m = RS2 & 0x1F; |
|||
const uint64_t maskN = 0xFFFFFFFFull; |
|||
if (m >= 32) p_rd = 0; |
|||
else p_rd = (uint32_t)((p_rs1 << m) & maskN); |
|||
p_rd = (uint32_t)((p_rs1 << m) & maskN); |
|||
}) |
|||
@ -1,5 +1,5 @@ |
|||
require_rv64; |
|||
P_RD_RS1_RS2_LOOP(32, 32, 32, { |
|||
p_rd = P_SAT(32, P_SAT(32, p_rs1 << 1) + p_rs2); |
|||
p_rd = P_SAT(32, P_SAT(32, (int64_t)p_rs1 << 1) + p_rs2); |
|||
} |
|||
) |
|||
|
|||
@ -1,45 +1,26 @@ |
|||
require_rv32; |
|||
P_RD_RS1_DW_LOOP(16, 16, { |
|||
uint64_t bits_SMIN = (uint64_t{1} << (16 - 1)); |
|||
uint64_t bits_SMAX = ((uint64_t{1} << (16 - 1)) - 1); |
|||
bool ov = false; |
|||
int8_t m = P_FIELD(RS2, 0, 8); |
|||
int8_t rev = static_cast<int8_t>(m); |
|||
rev = (m < 0) ? static_cast<uint8_t>(~m + 1u) : m; |
|||
uint64_t mask = ((uint64_t{1} << 16) - 1); |
|||
p_rs1 &= mask; |
|||
if(m < 0){ |
|||
unsigned sh = ((unsigned)(uint8_t)rev > 255u) ? 255u : (unsigned)(uint8_t)rev; |
|||
uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; |
|||
|
|||
if(sh >= 16) p_rd = (uint16_t)(sign ? mask : 0u); |
|||
else{ |
|||
uint64_t shifted = (p_rs1 >> sh); |
|||
uint64_t fill = (~uint64_t{0}) << (16 - sh); |
|||
shifted |= fill; |
|||
p_rd = (uint16_t)(shifted & mask); |
|||
} |
|||
} |
|||
else{ |
|||
if(rev==0) p_rd = (uint16_t)p_rs1; |
|||
else if(rev >= 16){ |
|||
if(p_rs1==0) p_rd = 0; |
|||
else{ |
|||
ov = true; |
|||
uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; |
|||
p_rd = (uint16_t)(sign ? bits_SMIN : bits_SMAX); |
|||
} |
|||
} |
|||
else{ |
|||
uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; |
|||
uint64_t top = (p_rs1 >> (16 - rev)); |
|||
uint64_t need = sign ? ((uint64_t{1} << rev) - 1) : 0u; |
|||
ov = (top != need); |
|||
if(ov) |
|||
p_rd = (uint16_t)(sign ? bits_SMIN : bits_SMAX); |
|||
else |
|||
p_rd = (uint16_t)((p_rs1 << rev) & mask); |
|||
int8_t sshamt = P_FIELD(RS2, 0, 8); |
|||
int32_t val = p_rs1; |
|||
if (sshamt < 0) { |
|||
val = (int16_t)(val >> std::min(-sshamt, 16)); |
|||
} else if (sshamt >= 16 && val != 0){ |
|||
val = val > 0 ? INT16_MAX : INT16_MIN; |
|||
ov = true; |
|||
} else if (val != 0) { |
|||
int32_t tmp = (int32_t)val << sshamt; |
|||
if (tmp > INT16_MAX) { |
|||
val = INT16_MAX; |
|||
ov = true; |
|||
} else if (tmp < INT16_MIN) { |
|||
val = INT16_MIN; |
|||
ov = true; |
|||
} else { |
|||
val = tmp; |
|||
} |
|||
} |
|||
p_rd = val; |
|||
|
|||
if (ov) P.set_vxsat(); |
|||
}) |
|||
@ -1,45 +1,26 @@ |
|||
require_rv32; |
|||
P_RD_RS1_DW_LOOP(32, 32, { |
|||
uint64_t bits_SMIN = (uint64_t{1} << (32 - 1)); |
|||
uint64_t bits_SMAX = ((uint64_t{1} << (32 - 1)) - 1); |
|||
bool ov = false; |
|||
int8_t m = P_FIELD(RS2, 0, 8); |
|||
int8_t rev = static_cast<int8_t>(m); |
|||
rev = (m < 0) ? static_cast<uint8_t>(~m + 1u) : m; |
|||
uint64_t mask = ((uint64_t{1} << 32) - 1); |
|||
p_rs1 &= mask; |
|||
if(m < 0){ |
|||
unsigned sh = ((unsigned)(uint8_t)rev > 255u) ? 255u : (unsigned)(uint8_t)rev; |
|||
uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; |
|||
|
|||
if(sh >= 32) p_rd = (uint32_t)(sign ? mask : 0u); |
|||
else{ |
|||
uint64_t shifted = (p_rs1 >> sh); |
|||
uint64_t fill = (~uint64_t{0}) << (32 - sh); |
|||
shifted |= fill; |
|||
p_rd = (uint32_t)(shifted & mask); |
|||
} |
|||
} |
|||
else{ |
|||
if(rev==0) p_rd = (uint32_t)p_rs1; |
|||
else if(rev >= 32){ |
|||
if(p_rs1==0) p_rd = 0; |
|||
else{ |
|||
ov = true; |
|||
uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; |
|||
p_rd = (uint32_t)(sign ? bits_SMIN : bits_SMAX); |
|||
} |
|||
} |
|||
else{ |
|||
uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; |
|||
uint64_t top = (p_rs1 >> (32 - rev)); |
|||
uint64_t need = sign ? ((uint64_t{1} << rev) - 1) : 0u; |
|||
ov = (top != need); |
|||
if(ov) |
|||
p_rd = (uint32_t)(sign ? bits_SMIN : bits_SMAX); |
|||
else |
|||
p_rd = (uint32_t)((p_rs1 << rev) & mask); |
|||
int8_t sshamt = P_FIELD(RS2, 0, 8); |
|||
int64_t val = p_rs1; |
|||
if (sshamt < 0) { |
|||
val = (int32_t)(val >> std::min(-sshamt, 32)); |
|||
} else if (sshamt >= 32 && val != 0){ |
|||
val = val > 0 ? INT32_MAX : INT32_MIN; |
|||
ov = true; |
|||
} else if (val != 0) { |
|||
int64_t tmp = (int64_t)val << sshamt; |
|||
if (tmp > INT32_MAX) { |
|||
val = INT32_MAX; |
|||
ov = true; |
|||
} else if (tmp < INT32_MIN) { |
|||
val = INT32_MIN; |
|||
ov = true; |
|||
} else { |
|||
val = tmp; |
|||
} |
|||
} |
|||
p_rd = val; |
|||
|
|||
if (ov) P.set_vxsat(); |
|||
}) |
|||
|
|||
@ -1,64 +1,27 @@ |
|||
require_rv32; |
|||
P_RD_RS1_DW_LOOP(16, 16, { |
|||
uint64_t bits_SMIN = (uint64_t{1} << (16 - 1)); |
|||
uint64_t bits_SMAX = ((uint64_t{1} << (16 - 1)) - 1); |
|||
bool ov = false; |
|||
int8_t m = P_FIELD(RS2, 0, 8); |
|||
int8_t rev = static_cast<int8_t>(m); |
|||
rev = (m < 0) ? static_cast<uint8_t>(~m + 1u) : m; |
|||
uint64_t mask = ((uint64_t{1} << 16) - 1); |
|||
p_rs1 &= mask; |
|||
if(m < 0){ |
|||
if ((rev & 0xFFu) == 0u) |
|||
p_rd = (uint16_t)p_rs1; |
|||
else{ |
|||
int128_t v_sext; |
|||
bool neg = ((p_rs1 >> (16 - 1)) & 1u); |
|||
if(!neg) v_sext = static_cast<int128_t>(p_rs1); |
|||
else v_sext = static_cast<int128_t>((~static_cast<uint128_t>(0) << 16) | static_cast<uint128_t>(p_rs1)); |
|||
int128_t v_cat0 = v_sext << 1; |
|||
|
|||
unsigned sh = ((unsigned)(uint8_t)rev > 255u) ? 255u : (unsigned)(uint8_t)rev; |
|||
|
|||
int128_t sra_val; |
|||
if(sh == 0) |
|||
sra_val = v_cat0; |
|||
else if(sh >=127) |
|||
sra_val = (v_cat0 < 0) ? static_cast<int128_t>(-1) : static_cast<int128_t>(0); |
|||
else{ |
|||
int128_t ux = static_cast<uint128_t>(v_cat0); |
|||
int128_t shifted = ux >> sh; |
|||
if(v_cat0 < 0) |
|||
shifted |= (~static_cast<uint128_t>(0)) << (128 - sh); |
|||
sra_val = static_cast<int128_t>(shifted); |
|||
} |
|||
|
|||
int128_t plus1 = sra_val + static_cast<int128_t>(1); |
|||
uint128_t ures = static_cast<uint128_t>(plus1); |
|||
p_rd = (uint16_t)(static_cast<uint64_t>((ures >> 1) & static_cast<uint128_t>(mask))); |
|||
} |
|||
} |
|||
else{ |
|||
if(rev==0) p_rd = (uint16_t)p_rs1; |
|||
else if(rev >= 16){ |
|||
if(p_rs1==0) |
|||
p_rd = 0; |
|||
else{ |
|||
ov = true; |
|||
uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; |
|||
p_rd = (uint16_t)(sign ? bits_SMIN : bits_SMAX); |
|||
} |
|||
} |
|||
else{ |
|||
uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; |
|||
uint64_t top = (p_rs1 >> (16 - rev)); |
|||
uint64_t need = sign ? ((uint64_t{1} << rev) - 1) : 0u; |
|||
ov = (top != need); |
|||
if(ov) |
|||
p_rd = (uint16_t)(sign ? bits_SMIN : bits_SMAX); |
|||
else |
|||
p_rd = (uint16_t)((p_rs1 << rev) & mask); |
|||
} |
|||
bool ov = false; |
|||
int8_t sshamt = P_FIELD(RS2, 0, 8); |
|||
int32_t val = p_rs1; |
|||
if (sshamt < 0) { |
|||
val = (val << 1) >> std::min(-sshamt, 16); |
|||
val = (int16_t)((val + 1) >> 1); |
|||
} else if (sshamt >= 16 && val != 0){ |
|||
val = val > 0 ? INT16_MAX : INT16_MIN; |
|||
ov = true; |
|||
} else if (val != 0) { |
|||
int32_t tmp = (int32_t)val << sshamt; |
|||
if (tmp > INT16_MAX) { |
|||
val = INT16_MAX; |
|||
ov = true; |
|||
} else if (tmp < INT16_MIN) { |
|||
val = INT16_MIN; |
|||
ov = true; |
|||
} else { |
|||
val = tmp; |
|||
} |
|||
} |
|||
p_rd = val; |
|||
|
|||
if (ov) P.set_vxsat(); |
|||
}) |
|||
|
|||
@ -1,64 +1,27 @@ |
|||
require_rv32; |
|||
P_RD_RS1_DW_LOOP(32, 32, { |
|||
uint64_t bits_SMIN = (uint64_t{1} << (32 - 1)); |
|||
uint64_t bits_SMAX = ((uint64_t{1} << (32 - 1)) - 1); |
|||
bool ov = false; |
|||
int8_t m = P_FIELD(RS2, 0, 8); |
|||
int8_t rev = static_cast<int8_t>(m); |
|||
rev = (m < 0) ? static_cast<uint8_t>(~m + 1u) : m; |
|||
uint64_t mask = ((uint64_t{1} << 32) - 1); |
|||
p_rs1 &= mask; |
|||
if(m < 0){ |
|||
if ((rev & 0xFFu) == 0u) |
|||
p_rd = (uint32_t)p_rs1; |
|||
else{ |
|||
int128_t v_sext; |
|||
bool neg = ((p_rs1 >> (32 - 1)) & 1u); |
|||
if(!neg) v_sext = static_cast<int128_t>(p_rs1); |
|||
else v_sext = static_cast<int128_t>((~static_cast<uint128_t>(0) << 32) | static_cast<uint128_t>(p_rs1)); |
|||
int128_t v_cat0 = v_sext << 1; |
|||
|
|||
unsigned sh = ((unsigned)(uint8_t)rev > 255u) ? 255u : (unsigned)(uint8_t)rev; |
|||
|
|||
int128_t sra_val; |
|||
if(sh == 0) |
|||
sra_val = v_cat0; |
|||
else if(sh >=127) |
|||
sra_val = (v_cat0 < 0) ? static_cast<int128_t>(-1) : static_cast<int128_t>(0); |
|||
else{ |
|||
int128_t ux = static_cast<uint128_t>(v_cat0); |
|||
int128_t shifted = ux >> sh; |
|||
if(v_cat0 < 0) |
|||
shifted |= (~static_cast<uint128_t>(0)) << (128 - sh); |
|||
sra_val = static_cast<int128_t>(shifted); |
|||
} |
|||
|
|||
int128_t plus1 = sra_val + static_cast<int128_t>(1); |
|||
uint128_t ures = static_cast<uint128_t>(plus1); |
|||
p_rd = (uint32_t)(static_cast<uint64_t>((ures >> 1) & static_cast<uint128_t>(mask))); |
|||
} |
|||
} |
|||
else{ |
|||
if(rev==0) p_rd = (uint32_t)p_rs1; |
|||
else if(rev >= 32){ |
|||
if(p_rs1==0) |
|||
p_rd = 0; |
|||
else{ |
|||
ov = true; |
|||
uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; |
|||
p_rd = (uint32_t)(sign ? bits_SMIN : bits_SMAX); |
|||
} |
|||
} |
|||
else{ |
|||
uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; |
|||
uint64_t top = (p_rs1 >> (32 - rev)); |
|||
uint64_t need = sign ? ((uint64_t{1} << rev) - 1) : 0u; |
|||
ov = (top != need); |
|||
if(ov) |
|||
p_rd = (uint32_t)(sign ? bits_SMIN : bits_SMAX); |
|||
else |
|||
p_rd = (uint32_t)((p_rs1 << rev) & mask); |
|||
} |
|||
bool ov = false; |
|||
int8_t sshamt = P_FIELD(RS2, 0, 8); |
|||
int64_t val = p_rs1; |
|||
if (sshamt < 0) { |
|||
val = (val << 1) >> std::min(-sshamt, 32); |
|||
val = (int32_t)((val + 1) >> 1); |
|||
} else if (sshamt >= 32 && val != 0){ |
|||
val = val > 0 ? INT32_MAX : INT32_MIN; |
|||
ov = true; |
|||
} else if (val != 0) { |
|||
int64_t tmp = (int64_t)val << sshamt; |
|||
if (tmp > INT32_MAX) { |
|||
val = INT32_MAX; |
|||
ov = true; |
|||
} else if (tmp < INT32_MIN) { |
|||
val = INT32_MIN; |
|||
ov = true; |
|||
} else { |
|||
val = tmp; |
|||
} |
|||
} |
|||
p_rd = val; |
|||
|
|||
if (ov) P.set_vxsat(); |
|||
}) |
|||
|
|||
@ -1,4 +1,6 @@ |
|||
P_RD_RS1_RS2_LOOP(8,8,8, { |
|||
bool sat = false; |
|||
p_rd = (sat_sub<int8_t, uint8_t>(p_rs1, p_rs2, sat)); |
|||
if (sat) |
|||
P.set_vxsat(); |
|||
}) |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue