From 36c40b4853cd711ce7b897db531b579b22affa27 Mon Sep 17 00:00:00 2001 From: Chih-Min Chao Date: Wed, 27 May 2026 07:59:33 -0700 Subject: [PATCH] rvp: add missing vxsat updating Signed-off-by: Chih-Min Chao --- riscv/insns/psadd_b.h | 4 +++- riscv/insns/psadd_db.h | 4 +++- riscv/insns/psadd_dh.h | 4 +++- riscv/insns/psadd_dw.h | 4 +++- riscv/insns/psadd_h.h | 4 +++- riscv/insns/psadd_w.h | 2 ++ riscv/insns/psaddu_b.h | 4 +++- riscv/insns/psaddu_db.h | 4 +++- riscv/insns/psaddu_dh.h | 4 +++- riscv/insns/psaddu_dw.h | 4 +++- riscv/insns/psaddu_h.h | 4 +++- riscv/insns/psaddu_w.h | 2 ++ riscv/insns/pssub_b.h | 4 +++- riscv/insns/pssub_db.h | 4 +++- riscv/insns/pssub_dh.h | 4 +++- riscv/insns/pssub_dw.h | 4 +++- riscv/insns/pssub_h.h | 4 +++- riscv/insns/pssub_w.h | 2 ++ riscv/insns/pssubu_b.h | 4 +++- riscv/insns/pssubu_db.h | 4 +++- riscv/insns/pssubu_dh.h | 4 +++- riscv/insns/pssubu_dw.h | 4 +++- riscv/insns/pssubu_h.h | 4 +++- riscv/insns/pssubu_w.h | 2 ++ riscv/insns/saddu.h | 1 + riscv/insns/ssub.h | 4 +++- riscv/insns/ssubu.h | 5 ++++- 27 files changed, 76 insertions(+), 22 deletions(-) diff --git a/riscv/insns/psadd_b.h b/riscv/insns/psadd_b.h index a024d4d0..43998751 100644 --- a/riscv/insns/psadd_b.h +++ b/riscv/insns/psadd_b.h @@ -1,4 +1,6 @@ P_RD_RS1_RS2_LOOP(8,8,8, { bool sat = false; p_rd = (sat_add(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psadd_db.h b/riscv/insns/psadd_db.h index 3c297868..f2a6c52e 100644 --- a/riscv/insns/psadd_db.h +++ b/riscv/insns/psadd_db.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_LOOP(8,8,8, { bool sat = false; p_rd = (sat_add(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psadd_dh.h b/riscv/insns/psadd_dh.h index bd14a581..7549d86c 100644 --- a/riscv/insns/psadd_dh.h +++ b/riscv/insns/psadd_dh.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_LOOP(16,16,16, { bool sat = false; p_rd = (sat_add(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psadd_dw.h b/riscv/insns/psadd_dw.h index 5ec3466d..dfe0f130 100644 --- a/riscv/insns/psadd_dw.h +++ b/riscv/insns/psadd_dw.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_LOOP(32,32,32, { bool sat = false; p_rd = (sat_add(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psadd_h.h b/riscv/insns/psadd_h.h index 47af97ad..ba5af96e 100644 --- a/riscv/insns/psadd_h.h +++ b/riscv/insns/psadd_h.h @@ -1,4 +1,6 @@ P_RD_RS1_RS2_LOOP(16,16,16, { bool sat = false; p_rd = (sat_add(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psadd_w.h b/riscv/insns/psadd_w.h index 7702b936..e170e9c8 100644 --- a/riscv/insns/psadd_w.h +++ b/riscv/insns/psadd_w.h @@ -2,5 +2,7 @@ require_rv64; P_RD_RS1_RS2_LOOP(32,32,32, { bool sat = false; p_rd = (sat_add(p_rs1, p_rs2, sat)); + if (sat) + P.set_vxsat(); } ) diff --git a/riscv/insns/psaddu_b.h b/riscv/insns/psaddu_b.h index 491fc2d3..535c99a0 100644 --- a/riscv/insns/psaddu_b.h +++ b/riscv/insns/psaddu_b.h @@ -1,4 +1,6 @@ P_RD_RS1_RS2_ULOOP(8,8,8, { bool sat = false; p_rd = (sat_addu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psaddu_db.h b/riscv/insns/psaddu_db.h index a181f24a..c9acd5bd 100644 --- a/riscv/insns/psaddu_db.h +++ b/riscv/insns/psaddu_db.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_ULOOP(8,8,8, { bool sat = false; p_rd = (sat_addu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psaddu_dh.h b/riscv/insns/psaddu_dh.h index 035d91fc..31aa12f5 100644 --- a/riscv/insns/psaddu_dh.h +++ b/riscv/insns/psaddu_dh.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_ULOOP(16,16,16, { bool sat = false; p_rd = (sat_addu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psaddu_dw.h b/riscv/insns/psaddu_dw.h index ebc4d8bb..cfc92178 100644 --- a/riscv/insns/psaddu_dw.h +++ b/riscv/insns/psaddu_dw.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_ULOOP(32,32,32, { bool sat = false; p_rd = (sat_addu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psaddu_h.h b/riscv/insns/psaddu_h.h index f28d0f32..67f2df23 100644 --- a/riscv/insns/psaddu_h.h +++ b/riscv/insns/psaddu_h.h @@ -1,4 +1,6 @@ P_RD_RS1_RS2_ULOOP(16,16,16, { bool sat = false; p_rd = (sat_addu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/psaddu_w.h b/riscv/insns/psaddu_w.h index 4ff52136..eb7453ac 100644 --- a/riscv/insns/psaddu_w.h +++ b/riscv/insns/psaddu_w.h @@ -2,5 +2,7 @@ require_rv64; P_RD_RS1_RS2_ULOOP(32,32,32, { bool sat = false; p_rd = (sat_addu(p_rs1, p_rs2, sat)); + if (sat) + P.set_vxsat(); } ) diff --git a/riscv/insns/pssub_b.h b/riscv/insns/pssub_b.h index 91a89aa1..d90fb6e7 100644 --- a/riscv/insns/pssub_b.h +++ b/riscv/insns/pssub_b.h @@ -1,4 +1,6 @@ P_RD_RS1_RS2_LOOP(8,8,8, { bool sat = false; p_rd = (sat_sub(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssub_db.h b/riscv/insns/pssub_db.h index 1fd3d79e..82c47870 100644 --- a/riscv/insns/pssub_db.h +++ b/riscv/insns/pssub_db.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_LOOP(8,8,8, { bool sat = false; p_rd = (sat_sub(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssub_dh.h b/riscv/insns/pssub_dh.h index 8c16a47c..5014e450 100644 --- a/riscv/insns/pssub_dh.h +++ b/riscv/insns/pssub_dh.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_LOOP(16,16,16, { bool sat = false; p_rd = (sat_sub(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssub_dw.h b/riscv/insns/pssub_dw.h index be55dc5a..af3583b0 100644 --- a/riscv/insns/pssub_dw.h +++ b/riscv/insns/pssub_dw.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_LOOP(32,32,32, { bool sat = false; p_rd = (sat_sub(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssub_h.h b/riscv/insns/pssub_h.h index db88d680..d05622a0 100644 --- a/riscv/insns/pssub_h.h +++ b/riscv/insns/pssub_h.h @@ -1,4 +1,6 @@ P_RD_RS1_RS2_LOOP(16,16,16, { bool sat = false; p_rd = (sat_sub(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssub_w.h b/riscv/insns/pssub_w.h index 0cfa1072..87336aeb 100644 --- a/riscv/insns/pssub_w.h +++ b/riscv/insns/pssub_w.h @@ -2,5 +2,7 @@ require_rv64; P_RD_RS1_RS2_LOOP(32,32,32, { bool sat = false; p_rd = (sat_sub(p_rs1, p_rs2, sat)); + if (sat) + P.set_vxsat(); } ) diff --git a/riscv/insns/pssubu_b.h b/riscv/insns/pssubu_b.h index 3fd44bee..5d1f54ef 100644 --- a/riscv/insns/pssubu_b.h +++ b/riscv/insns/pssubu_b.h @@ -1,4 +1,6 @@ P_RD_RS1_RS2_ULOOP(8,8,8, { bool sat = false; p_rd = (sat_subu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssubu_db.h b/riscv/insns/pssubu_db.h index fd564a5f..20034963 100644 --- a/riscv/insns/pssubu_db.h +++ b/riscv/insns/pssubu_db.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_ULOOP(8,8,8, { bool sat = false; p_rd = (sat_subu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssubu_dh.h b/riscv/insns/pssubu_dh.h index b910ce5d..c20949c9 100644 --- a/riscv/insns/pssubu_dh.h +++ b/riscv/insns/pssubu_dh.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_ULOOP(16,16,16, { bool sat = false; p_rd = (sat_subu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssubu_dw.h b/riscv/insns/pssubu_dw.h index aa9063a2..4c6ecaf9 100644 --- a/riscv/insns/pssubu_dw.h +++ b/riscv/insns/pssubu_dw.h @@ -2,4 +2,6 @@ require_rv32; P_RD_RS1_RS2_DW_ULOOP(32,32,32, { bool sat = false; p_rd = (sat_subu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssubu_h.h b/riscv/insns/pssubu_h.h index de3ff72a..b90222a2 100644 --- a/riscv/insns/pssubu_h.h +++ b/riscv/insns/pssubu_h.h @@ -1,4 +1,6 @@ P_RD_RS1_RS2_ULOOP(16,16,16, { bool sat = false; p_rd = (sat_subu(p_rs1, p_rs2, sat)); -}) \ No newline at end of file + if (sat) + P.set_vxsat(); +}) diff --git a/riscv/insns/pssubu_w.h b/riscv/insns/pssubu_w.h index e4a42adc..8f1ad943 100644 --- a/riscv/insns/pssubu_w.h +++ b/riscv/insns/pssubu_w.h @@ -2,5 +2,7 @@ require_rv64; P_RD_RS1_RS2_ULOOP(32,32,32, { bool sat = false; p_rd = (sat_subu(p_rs1, p_rs2, sat)); + if (sat) + P.set_vxsat(); } ) diff --git a/riscv/insns/saddu.h b/riscv/insns/saddu.h index 3128bc28..e01d77c3 100644 --- a/riscv/insns/saddu.h +++ b/riscv/insns/saddu.h @@ -4,4 +4,5 @@ bool sat = false; reg_t tmp = sat_addu(RS1, RS2, sat); if (sat) P.set_vxsat(); + WRITE_RD(sext32(tmp)); diff --git a/riscv/insns/ssub.h b/riscv/insns/ssub.h index f3db9b4b..40f147f3 100644 --- a/riscv/insns/ssub.h +++ b/riscv/insns/ssub.h @@ -2,4 +2,6 @@ require_extension('P'); require_rv32; bool sat = false; int32_t p_rd = sat_sub(RS1, RS2, sat); -WRITE_RD(p_rd); \ No newline at end of file +if (sat) + P.set_vxsat(); +WRITE_RD(sext32(p_rd)); diff --git a/riscv/insns/ssubu.h b/riscv/insns/ssubu.h index c4aac5d3..fde181ef 100644 --- a/riscv/insns/ssubu.h +++ b/riscv/insns/ssubu.h @@ -1,4 +1,7 @@ require_extension('P'); require_rv32; bool sat = false; -WRITE_RD(sat_subu(RS1, RS2, sat)); \ No newline at end of file +uint32_t p_rd = sat_subu(RS1, RS2, sat); +if (sat) + P.set_vxsat(); +WRITE_RD(sext32(p_rd));