diff --git a/riscv/insns/pssh1sadd_w.h b/riscv/insns/pssh1sadd_w.h index a84c17b0..325be89e 100644 --- a/riscv/insns/pssh1sadd_w.h +++ b/riscv/insns/pssh1sadd_w.h @@ -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); } ) diff --git a/riscv/insns/pssha_hs.h b/riscv/insns/pssha_hs.h index 6d3b9746..6fe871d3 100644 --- a/riscv/insns/pssha_hs.h +++ b/riscv/insns/pssha_hs.h @@ -3,11 +3,11 @@ P_RD_RS1_LOOP(16, 16, { if (p_rs1 == 0) p_rd = 0; else if (sshamt >= 16) { - p_rd = (p_rs1 & 0x8000) ? 0x8000 : 0x7fff; + p_rd = (p_rs1 & 0x8000) ? INT16_MIN : INT16_MAX; P.set_vxsat(); } else if (sshamt <= -16) - p_rd = (p_rs1 & 0x8000) ? 0xffff : 0; + p_rd = (p_rs1 & 0x8000) ? (int16_t)UINT16_MAX : 0; else p_rd = sshamt >= 0 ? P_SAT(16, sext32(p_rs1) << sshamt) : (p_rs1 >> -sshamt); -}) \ No newline at end of file +}) diff --git a/riscv/insns/pssha_ws.h b/riscv/insns/pssha_ws.h index 129079e2..e98311aa 100644 --- a/riscv/insns/pssha_ws.h +++ b/riscv/insns/pssha_ws.h @@ -4,11 +4,11 @@ P_RD_RS1_LOOP(32, 32, { if (p_rs1 == 0) p_rd = 0; else if (sshamt >= 32) { - p_rd = (p_rs1 & 0x80000000) ? 0x80000000 : 0x7fffffff; + p_rd = (p_rs1 & 0x80000000) ? INT32_MIN : INT32_MAX; P.set_vxsat(); } else if (sshamt <= -32) - p_rd = (p_rs1 & 0x80000000) ? 0xffffffff : 0; + p_rd = (p_rs1 & 0x80000000) ? (int32_t)UINT32_MAX : 0; else p_rd = sshamt >= 0 ? P_SAT(32, sext32(p_rs1) << sshamt) : (p_rs1 >> -sshamt); } diff --git a/riscv/insns/psshar_hs.h b/riscv/insns/psshar_hs.h index c23fa3bf..dffc6082 100644 --- a/riscv/insns/psshar_hs.h +++ b/riscv/insns/psshar_hs.h @@ -3,11 +3,11 @@ P_RD_RS1_LOOP(16, 16, { if (p_rs1 == 0) p_rd = 0; else if (sshamt >= 16) { - p_rd = (p_rs1 & 0x8000) ? 0x8000 : 0x7fff; + p_rd = (p_rs1 & 0x8000) ? INT16_MIN : INT16_MAX; P.set_vxsat(); } else if (sshamt <= -16) p_rd = 0; else p_rd = sshamt >= 0 ? P_SAT(16, sext32(p_rs1) << sshamt) : ((p_rs1 >> -sshamt) + ((p_rs1 >> (-sshamt - 1)) & 1)); -}) \ No newline at end of file +}) diff --git a/riscv/insns/psshar_ws.h b/riscv/insns/psshar_ws.h index 87e3aa4f..ad7f5af3 100644 --- a/riscv/insns/psshar_ws.h +++ b/riscv/insns/psshar_ws.h @@ -4,7 +4,7 @@ P_RD_RS1_LOOP(32, 32, { if (p_rs1 == 0) p_rd = 0; else if (sshamt >= 32) { - p_rd = (p_rs1 & 0x80000000) ? 0x80000000 : 0x7fffffff; + p_rd = (p_rs1 & 0x80000000) ? INT32_MIN : INT32_MAX; P.set_vxsat(); } else if (sshamt <= -32) diff --git a/riscv/insns/psshl_dhs.h b/riscv/insns/psshl_dhs.h index 9ea07474..f2821b80 100644 --- a/riscv/insns/psshl_dhs.h +++ b/riscv/insns/psshl_dhs.h @@ -1,16 +1,13 @@ require_rv32; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); P_RD_RS1_DW_LOOP(16, 16, { if (sshamt < 0) { - if (sshamt <= -16) - p_rd = 0; - else - p_rd = (uint16_t)p_rs1 >> (-sshamt); + p_rd = (uint32_t)(uint16_t)p_rs1 >> std::min(-sshamt, 16); } else { - uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt); - if (shx > 0xFFFF) { + uint32_t shx = (uint32_t)(uint16_t)p_rs1 << std::min(sshamt, 16); + if (shx > UINT16_MAX) { P.set_vxsat(); - p_rd = 0xFFFF; + p_rd = (uint16_t)UINT16_MAX; } else { p_rd = (uint16_t)shx; } diff --git a/riscv/insns/psshl_dws.h b/riscv/insns/psshl_dws.h index 2b905db0..ca5a4b3d 100644 --- a/riscv/insns/psshl_dws.h +++ b/riscv/insns/psshl_dws.h @@ -1,16 +1,13 @@ require_rv32; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); P_RD_RS1_DW_LOOP(32, 32, { if (sshamt < 0) { - if (sshamt <= -32) - p_rd = 0; - else - p_rd = (uint32_t)p_rs1 >> (-sshamt); + p_rd = (uint64_t)(uint32_t)p_rs1 >> std::min(-sshamt, 32); } else { - uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt); - if (shx > 0xFFFFFFFFULL) { + uint64_t shx = (uint64_t)(uint32_t)p_rs1 << std::min(sshamt, 32); + if (shx > UINT32_MAX) { P.set_vxsat(); - p_rd = 0xFFFFFFFF; + p_rd = UINT32_MAX; } else { p_rd = (uint32_t)shx; } diff --git a/riscv/insns/psshl_hs.h b/riscv/insns/psshl_hs.h index 291c727c..17e6192e 100644 --- a/riscv/insns/psshl_hs.h +++ b/riscv/insns/psshl_hs.h @@ -1,15 +1,12 @@ -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); P_RD_RS1_LOOP(16, 16, { if (sshamt < 0) { - if (sshamt <= -16) - p_rd = 0; - else - p_rd = (uint16_t)p_rs1 >> (-sshamt); + p_rd = (uint32_t)(uint16_t)p_rs1 >> std::min(-sshamt, 16); } else { - uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt); - if (shx > 0xFFFF) { + uint32_t shx = (uint32_t)(uint16_t)p_rs1 << std::min(sshamt, 16); + if (shx > UINT16_MAX) { P.set_vxsat(); - p_rd = 0xFFFF; + p_rd = (uint16_t)UINT16_MAX; } else { p_rd = (uint16_t)shx; } diff --git a/riscv/insns/psshl_ws.h b/riscv/insns/psshl_ws.h index 483cec71..69422611 100644 --- a/riscv/insns/psshl_ws.h +++ b/riscv/insns/psshl_ws.h @@ -1,16 +1,13 @@ require_rv64; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); P_RD_RS1_LOOP(32, 32, { if (sshamt < 0) { - if (sshamt <= -32) - p_rd = 0; - else - p_rd = (uint32_t)p_rs1 >> (-sshamt); + p_rd = (uint64_t)(uint32_t)p_rs1 >> std::min(-sshamt, 32); } else { - uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt); - if (shx > 0xFFFFFFFFULL) { + uint64_t shx = (uint64_t)(uint32_t)p_rs1 << std::min(sshamt, 32); + if (shx > UINT32_MAX) { P.set_vxsat(); - p_rd = 0xFFFFFFFF; + p_rd = UINT32_MAX; } else { p_rd = (uint32_t)shx; } diff --git a/riscv/insns/psshlr_dhs.h b/riscv/insns/psshlr_dhs.h index f61d4a63..7c9b39bb 100644 --- a/riscv/insns/psshlr_dhs.h +++ b/riscv/insns/psshlr_dhs.h @@ -1,20 +1,14 @@ require_rv32; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); P_RD_RS1_DW_LOOP(16, 16, { if (sshamt < 0) { - uint32_t shx; - if (sshamt < -16) - shx = 0; - else if (sshamt == -16) - shx = ((uint16_t)p_rs1 >> 15) & 1; - else - shx = ((uint32_t)(uint16_t)p_rs1 << 1) >> (-sshamt); + uint32_t shx = ((uint32_t)(uint16_t)p_rs1 << 1) >> std::min(-sshamt, 16); p_rd = (uint16_t)((shx + 1) >> 1); } else { - uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt); - if (shx > 0xFFFF) { + uint32_t shx = (uint32_t)(uint16_t)p_rs1 << std::min(sshamt, 16); + if (shx > UINT16_MAX) { P.set_vxsat(); - p_rd = 0xFFFF; + p_rd = (uint16_t)UINT16_MAX; } else { p_rd = (uint16_t)shx; } diff --git a/riscv/insns/psshlr_dws.h b/riscv/insns/psshlr_dws.h index 60b0e2dd..380ea40e 100644 --- a/riscv/insns/psshlr_dws.h +++ b/riscv/insns/psshlr_dws.h @@ -1,20 +1,14 @@ require_rv32; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); P_RD_RS1_DW_LOOP(32, 32, { if (sshamt < 0) { - uint64_t shx; - if (sshamt < -32) - shx = 0; - else if (sshamt == -32) - shx = ((uint32_t)p_rs1 >> 31) & 1; - else - shx = ((uint64_t)(uint32_t)p_rs1 << 1) >> (-sshamt); + uint64_t shx = ((uint64_t)(uint32_t)p_rs1 << 1) >> std::min(-sshamt, 32); p_rd = (uint32_t)((shx + 1) >> 1); } else { - uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt); - if (shx > 0xFFFFFFFFULL) { + uint64_t shx = (uint64_t)(uint32_t)p_rs1 << std::min(sshamt, 32); + if (shx > UINT32_MAX) { P.set_vxsat(); - p_rd = 0xFFFFFFFF; + p_rd = UINT32_MAX; } else { p_rd = (uint32_t)shx; } diff --git a/riscv/insns/psshlr_hs.h b/riscv/insns/psshlr_hs.h index 9573dc79..08c859be 100644 --- a/riscv/insns/psshlr_hs.h +++ b/riscv/insns/psshlr_hs.h @@ -1,19 +1,13 @@ -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); P_RD_RS1_LOOP(16, 16, { if (sshamt < 0) { - uint32_t shx; - if (sshamt < -16) - shx = 0; - else if (sshamt == -16) - shx = ((uint16_t)p_rs1 >> 15) & 1; - else - shx = ((uint32_t)(uint16_t)p_rs1 << 1) >> (-sshamt); + uint32_t shx = ((uint32_t)(uint16_t)p_rs1 << 1) >> std::min(-sshamt, 16); p_rd = (uint16_t)((shx + 1) >> 1); } else { - uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt); - if (shx > 0xFFFF) { + uint32_t shx = (uint32_t)(uint16_t)p_rs1 << std::min(sshamt, 16); + if (shx > UINT16_MAX) { P.set_vxsat(); - p_rd = 0xFFFF; + p_rd = (uint16_t)UINT16_MAX; } else { p_rd = (uint16_t)shx; } diff --git a/riscv/insns/psshlr_ws.h b/riscv/insns/psshlr_ws.h index de832f56..895ad00e 100644 --- a/riscv/insns/psshlr_ws.h +++ b/riscv/insns/psshlr_ws.h @@ -1,20 +1,14 @@ require_rv64; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); P_RD_RS1_LOOP(32, 32, { if (sshamt < 0) { - uint64_t shx; - if (sshamt < -32) - shx = 0; - else if (sshamt == -32) - shx = ((uint32_t)p_rs1 >> 31) & 1; - else - shx = ((uint64_t)(uint32_t)p_rs1 << 1) >> (-sshamt); + uint64_t shx = ((uint64_t)(uint32_t)p_rs1 << 1) >> std::min(-sshamt, 32); p_rd = (uint32_t)((shx + 1) >> 1); } else { - uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt); - if (shx > 0xFFFFFFFFULL) { + uint64_t shx = (uint64_t)(uint32_t)p_rs1 << std::min(sshamt, 32); + if (shx > UINT32_MAX) { P.set_vxsat(); - p_rd = 0xFFFFFFFF; + p_rd = UINT32_MAX; } else { p_rd = (uint32_t)shx; } diff --git a/riscv/insns/shl.h b/riscv/insns/shl.h index ef112422..171f31c3 100644 --- a/riscv/insns/shl.h +++ b/riscv/insns/shl.h @@ -1,15 +1,10 @@ require_extension('P'); require_rv64; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); +uint128_t shx = RS1; if (sshamt < 0) { - if (sshamt <= -64) - WRITE_RD(0); - else - WRITE_RD(RS1 >> (-sshamt)); + WRITE_RD(shx >> std::min(-sshamt, 64)); } else { - if (sshamt >= 64) - WRITE_RD(0); - else - WRITE_RD(RS1 << sshamt); + WRITE_RD(shx << std::min(sshamt, 64)); } diff --git a/riscv/insns/shlr.h b/riscv/insns/shlr.h index 29801fa9..7ebce992 100644 --- a/riscv/insns/shlr.h +++ b/riscv/insns/shlr.h @@ -1,19 +1,10 @@ require_extension('P'); require_rv64; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); if (sshamt < 0) { - __uint128_t shx; - if (sshamt < -64) - shx = 0; - else if (sshamt == -64) - shx = (RS1 >> 63) & 1; - else - shx = ((__uint128_t)RS1 << 1) >> (-sshamt); + uint128_t shx = ((uint128_t)RS1 << 1) >> std::min(-sshamt, 64); WRITE_RD((uint64_t)((shx + 1) >> 1)); } else { - if (sshamt >= 64) - WRITE_RD(0); - else - WRITE_RD(RS1 << sshamt); + WRITE_RD((uint128_t)RS1 << std::min(sshamt, 64)); } diff --git a/riscv/insns/sshar.h b/riscv/insns/sshar.h index c902ab3a..3a8b3b07 100644 --- a/riscv/insns/sshar.h +++ b/riscv/insns/sshar.h @@ -1,13 +1,16 @@ require_extension('P'); require_rv32; sreg_t sshamt = P_FIELD(RS2, 0, 8); -if (RS1 == 0) - WRITE_RD(0); -else if (sshamt >= 32) { - WRITE_RD((RS1 & 0x80000000) ? 0x80000000 : 0x7fffffff); +sreg_t val; +if (RS1 == 0) { + val = 0; +} else if (sshamt >= 32) { + val = (RS1 & 0x80000000) ? 0x80000000 : 0x7fffffff; P.set_vxsat(); +} else if (sshamt <= -32) { + val = 0; +} else { + val = sshamt >= 0 ? P_SAT(32, static_cast (RS1) << sshamt) : ((RS1 >> -sshamt) + ((RS1 >> (-sshamt - 1)) & 1)); } -else if (sshamt <= -32) - WRITE_RD(0); -else - WRITE_RD(sshamt >= 0 ? P_SAT(32, static_cast (RS1) << sshamt) : ((RS1 >> -sshamt) + ((RS1 >> (-sshamt - 1)) & 1))); \ No newline at end of file + +WRITE_RD(sext32(val)); diff --git a/riscv/insns/sshl.h b/riscv/insns/sshl.h index 8d3d473a..68cb4b80 100644 --- a/riscv/insns/sshl.h +++ b/riscv/insns/sshl.h @@ -1,18 +1,15 @@ require_extension('P'); require_rv32; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); +uint64_t shx; if (sshamt < 0) { - if (sshamt <= -32) - WRITE_RD(0); - else - WRITE_RD(RS1 >> (-sshamt)); + shx = ((uint64_t)(uint32_t)RS1) >> std::min(-sshamt, 32); } else { - uint64_t shx = (sshamt >= 32) ? ((uint64_t)RS1 << 32) : ((uint64_t)RS1 << sshamt); - if (shx > 0xFFFFFFFFULL) { + shx = (uint64_t)RS1 << std::min(sshamt, 32); + if (shx > UINT32_MAX) { P.set_vxsat(); - WRITE_RD(0xFFFFFFFF); - } else { - WRITE_RD((uint32_t)shx); + shx = UINT32_MAX; } } +WRITE_RD(sext32(shx)); diff --git a/riscv/insns/sshlr.h b/riscv/insns/sshlr.h index 06f8e15d..9738f88d 100644 --- a/riscv/insns/sshlr.h +++ b/riscv/insns/sshlr.h @@ -1,22 +1,16 @@ require_extension('P'); require_rv32; -sreg_t sshamt = P_FIELD(RS2, 0, 8); +int sshamt = P_FIELD(RS2, 0, 8); +uint64_t shx; if (sshamt < 0) { - uint64_t shx; - if (sshamt < -32) - shx = 0; - else if (sshamt == -32) - shx = (RS1 >> 31) & 1; - else - shx = ((uint64_t)RS1 << 1) >> (-sshamt); - WRITE_RD((uint32_t)((shx + 1) >> 1)); + shx = ((uint64_t)(uint32_t)RS1 << 1) >> std::min(-sshamt, 32); + shx = (shx + 1) >> 1; } else { - uint64_t shx = (sshamt >= 32) ? ((uint64_t)RS1 << 32) : ((uint64_t)RS1 << sshamt); - if (shx > 0xFFFFFFFFULL) { + shx = (uint64_t)RS1 << std::min(sshamt, 32); + if (shx > UINT32_MAX) { P.set_vxsat(); - WRITE_RD(0xFFFFFFFF); - } else { - WRITE_RD((uint32_t)shx); + shx = UINT32_MAX; } } +WRITE_RD(sext32(shx));