diff --git a/riscv/insns/nclip.h b/riscv/insns/nclip.h index f1ecfc76..fb553d43 100644 --- a/riscv/insns/nclip.h +++ b/riscv/insns/nclip.h @@ -2,4 +2,4 @@ require_extension('P'); require_rv32; sreg_t tmp = (sreg_t)P_RS1_PAIR >> (RS2 & 0x3f); int32_t result = P_SAT(32, tmp); -WRITE_RD(result); \ No newline at end of file +WRITE_RD(sext32(result)); diff --git a/riscv/insns/nclipi.h b/riscv/insns/nclipi.h index 79bc1f2a..191e2163 100644 --- a/riscv/insns/nclipi.h +++ b/riscv/insns/nclipi.h @@ -2,4 +2,4 @@ require_extension('P'); require_rv32; sreg_t tmp = (sreg_t)P_RS1_PAIR >> insn.shamtd(); int32_t result = P_SAT(32, tmp); -WRITE_RD(result); \ No newline at end of file +WRITE_RD(sext32(result)); diff --git a/riscv/insns/nclipiu.h b/riscv/insns/nclipiu.h index d8608d10..c83f5549 100644 --- a/riscv/insns/nclipiu.h +++ b/riscv/insns/nclipiu.h @@ -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); \ No newline at end of file +if (tmp > UINT32_MAX) { + tmp = UINT32_MAX; + P.set_vxsat(); +} +WRITE_RD(sext32(tmp)); diff --git a/riscv/insns/nclipr.h b/riscv/insns/nclipr.h index e9aca14e..7e88b66b 100644 --- a/riscv/insns/nclipr.h +++ b/riscv/insns/nclipr.h @@ -8,4 +8,4 @@ if (shamt == 0) { } else { result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1)); } -WRITE_RD(result); \ No newline at end of file +WRITE_RD(sext32(result)); diff --git a/riscv/insns/nclipri.h b/riscv/insns/nclipri.h index 17528201..6ce8715b 100644 --- a/riscv/insns/nclipri.h +++ b/riscv/insns/nclipri.h @@ -4,8 +4,8 @@ sreg_t val = (sreg_t)P_RS1_PAIR; uint32_t shamt = insn.shamtd(); sreg_t result; if (shamt == 0) { - result = P_SAT(32, val); + result = P_SAT(32, val); } else { - result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1)); + result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1)); } -WRITE_RD(result); \ No newline at end of file +WRITE_RD(sext32(result)); diff --git a/riscv/insns/nclipriu.h b/riscv/insns/nclipriu.h index 2595dbc8..eb34bde8 100644 --- a/riscv/insns/nclipriu.h +++ b/riscv/insns/nclipriu.h @@ -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); \ No newline at end of file +WRITE_RD(sext32(tmp)); + diff --git a/riscv/insns/nclipru.h b/riscv/insns/nclipru.h index c8044ed0..6dd660db 100644 --- a/riscv/insns/nclipru.h +++ b/riscv/insns/nclipru.h @@ -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))); -} -WRITE_RD(result); \ No newline at end of file +reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1; + +if (tmp > UINT32_MAX) { + tmp = UINT32_MAX; + P.set_vxsat(); +} +WRITE_RD(sext32(tmp)); + diff --git a/riscv/insns/nclipu.h b/riscv/insns/nclipu.h index a1e6099d..4838b835 100644 --- a/riscv/insns/nclipu.h +++ b/riscv/insns/nclipu.h @@ -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); \ No newline at end of file +if (tmp > UINT32_MAX) { + tmp = UINT32_MAX; + P.set_vxsat(); +} + +WRITE_RD(sext32(tmp));