From 59b63cf58d78ccb7462d2f095b4e6d61b73ff96a Mon Sep 17 00:00:00 2001 From: Chih-Min Chao Date: Wed, 20 May 2026 05:46:26 -0700 Subject: [PATCH] rvp: helper macro doesn't fit some nclip operation also refine writing path to RD Signed-off-by: Chih-Min Chao --- riscv/insns/nclip.h | 2 +- riscv/insns/nclipi.h | 2 +- riscv/insns/nclipiu.h | 7 +++++-- riscv/insns/nclipr.h | 2 +- riscv/insns/nclipri.h | 6 +++--- riscv/insns/nclipriu.h | 14 +++++++------- riscv/insns/nclipru.h | 16 ++++++++-------- riscv/insns/nclipu.h | 8 ++++++-- 8 files changed, 32 insertions(+), 25 deletions(-) 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));