@samitouri / QOSamiQemu / commits / 9803e82773

disas/riscv: Handle aliases of csrrwi during decode

Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20260812223142.349142-25-richard.henderson@linaro.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Richard Henderson committed Aug 12, 2026 at 15:31 UTC 9803e8277307e153dbbb1757c083167f882a9ef8
2 files changed +8 -22
disas/riscv.c
+8 -20
@@ -1063,8 +1063,6 @@ static const rvc_constraint rvcc_ret[] = { rvc_rd_eq_x0, rvc_rs1_eq_ra,
1063 rvc_end };
1064 static const rvc_constraint rvcc_jr[] = { rvc_rd_eq_x0, rvc_imm_eq_zero,
1065 rvc_end };
1066 -static const rvc_constraint rvcc_fsrmi[] = { rvc_csr_eq_0x002, rvc_end };
1067 -static const rvc_constraint rvcc_fsflagsi[] = { rvc_csr_eq_0x001, rvc_end };
1066
1067 /* pseudo-instruction metadata */
1068
@@ -1145,12 +1143,6 @@ static const rv_comp_data rvcp_subw[] = {
1143 { rv_op_illegal, NULL }
1144 };
1145
1148 -static const rv_comp_data rvcp_csrrwi[] = {
1149 - { rv_op_fsrmi, rvcc_fsrmi },
1150 - { rv_op_fsflagsi, rvcc_fsflagsi },
1151 - { rv_op_illegal, NULL }
1152 -};
1153 -
1146 static const rv_comp_data rvcp_fsgnj_s[] = {
1147 { rv_op_fmv_s, rvcc_fmv_s },
1148 { rv_op_illegal, NULL }
@@ -1722,7 +1714,7 @@ static const rv_opcode_data rvi_opcode_data[] = {
1714 { "csrrw", rv_codec_i_csr, rv_fmt_rd_csr_rs1 },
1715 { "csrrs", rv_codec_i_csr, rv_fmt_rd_csr_rs1 },
1716 { "csrrc", rv_codec_i_csr, rv_fmt_rd_csr_rs1 },
1725 - { "csrrwi", rv_codec_i_csr, rv_fmt_rd_csr_zimm, rvcp_csrrwi },
1717 + { "csrrwi", rv_codec_i_csr, rv_fmt_rd_csr_zimm },
1718 { "csrrsi", rv_codec_i_csr, rv_fmt_rd_csr_zimm },
1719 { "csrrci", rv_codec_i_csr, rv_fmt_rd_csr_zimm },
1720 { "flw", rv_codec_i, rv_fmt_frd_offset_rs1 },
@@ -4469,7 +4461,13 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
4461 }
4462 }
4463 break;
4472 - case 5: op = rv_op_csrrwi; break;
4464 + case 5:
4465 + switch (operand_csr12(inst)) {
4466 + case 1: op = rv_op_fsflagsi; break;
4467 + case 2: op = rv_op_fsrmi; break;
4468 + default: op = rv_op_csrrwi; break;
4469 + }
4470 + break;
4471 case 6: op = rv_op_csrrsi; break;
4472 case 7: op = rv_op_csrrci; break;
4473 }
@@ -4991,16 +4989,6 @@ static bool check_constraints(rv_decode *dec, const rvc_constraint *c)
4989 return false;
4990 }
4991 break;
4994 - case rvc_csr_eq_0x001:
4995 - if (!(imm == 0x001)) {
4996 - return false;
4997 - }
4998 - break;
4999 - case rvc_csr_eq_0x002:
5000 - if (!(imm == 0x002)) {
5001 - return false;
5002 - }
5003 - break;
4992 default: break;
4993 }
4994 c++;
disas/riscv.h
-2
@@ -84,8 +84,6 @@ typedef enum {
84 rvc_imm_eq_zero,
85 rvc_imm_eq_n1,
86 rvc_imm_eq_p1,
87 - rvc_csr_eq_0x001,
88 - rvc_csr_eq_0x002,
87 } rvc_constraint;
88
89 typedef enum {