disas/riscv: Merge all mop.r.n to one pattern
Avoid performing arithmetic on rv_op_mop_r_0. Treat the 'n' as an immediate. Create a codec and format to match. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20260812223142.349142-47-richard.henderson@linaro.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Richard Henderson committed
Aug 12, 2026 at 15:31 UTC
1a13fad072fb39876627b3a20b1a423a92813688
3 files changed
+17
-33
disas/riscv-op.c.inc
+1
-32
@@ -873,38 +873,7 @@ OP(vwsll_vi, "vwsll.vi", rv_codec_v_i_u, rv_fmt_vd_vs2_uimm_vm)
873
OP(amocas_w, "amocas.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1)
874
OP(amocas_d, "amocas.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1)
875
OP(amocas_q, "amocas.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1)
876
-OP(mop_r_0, "mop.r.0", rv_codec_r, rv_fmt_rd_rs1)
877
-OP(mop_r_1, "mop.r.1", rv_codec_r, rv_fmt_rd_rs1)
878
-OP(mop_r_2, "mop.r.2", rv_codec_r, rv_fmt_rd_rs1)
879
-OP(mop_r_3, "mop.r.3", rv_codec_r, rv_fmt_rd_rs1)
880
-OP(mop_r_4, "mop.r.4", rv_codec_r, rv_fmt_rd_rs1)
881
-OP(mop_r_5, "mop.r.5", rv_codec_r, rv_fmt_rd_rs1)
882
-OP(mop_r_6, "mop.r.6", rv_codec_r, rv_fmt_rd_rs1)
883
-OP(mop_r_7, "mop.r.7", rv_codec_r, rv_fmt_rd_rs1)
884
-OP(mop_r_8, "mop.r.8", rv_codec_r, rv_fmt_rd_rs1)
885
-OP(mop_r_9, "mop.r.9", rv_codec_r, rv_fmt_rd_rs1)
886
-OP(mop_r_10, "mop.r.10", rv_codec_r, rv_fmt_rd_rs1)
887
-OP(mop_r_11, "mop.r.11", rv_codec_r, rv_fmt_rd_rs1)
888
-OP(mop_r_12, "mop.r.12", rv_codec_r, rv_fmt_rd_rs1)
889
-OP(mop_r_13, "mop.r.13", rv_codec_r, rv_fmt_rd_rs1)
890
-OP(mop_r_14, "mop.r.14", rv_codec_r, rv_fmt_rd_rs1)
891
-OP(mop_r_15, "mop.r.15", rv_codec_r, rv_fmt_rd_rs1)
892
-OP(mop_r_16, "mop.r.16", rv_codec_r, rv_fmt_rd_rs1)
893
-OP(mop_r_17, "mop.r.17", rv_codec_r, rv_fmt_rd_rs1)
894
-OP(mop_r_18, "mop.r.18", rv_codec_r, rv_fmt_rd_rs1)
895
-OP(mop_r_19, "mop.r.19", rv_codec_r, rv_fmt_rd_rs1)
896
-OP(mop_r_20, "mop.r.20", rv_codec_r, rv_fmt_rd_rs1)
897
-OP(mop_r_21, "mop.r.21", rv_codec_r, rv_fmt_rd_rs1)
898
-OP(mop_r_22, "mop.r.22", rv_codec_r, rv_fmt_rd_rs1)
899
-OP(mop_r_23, "mop.r.23", rv_codec_r, rv_fmt_rd_rs1)
900
-OP(mop_r_24, "mop.r.24", rv_codec_r, rv_fmt_rd_rs1)
901
-OP(mop_r_25, "mop.r.25", rv_codec_r, rv_fmt_rd_rs1)
902
-OP(mop_r_26, "mop.r.26", rv_codec_r, rv_fmt_rd_rs1)
903
-OP(mop_r_27, "mop.r.27", rv_codec_r, rv_fmt_rd_rs1)
904
-OP(mop_r_28, "mop.r.28", rv_codec_r, rv_fmt_rd_rs1)
905
-OP(mop_r_29, "mop.r.29", rv_codec_r, rv_fmt_rd_rs1)
906
-OP(mop_r_30, "mop.r.30", rv_codec_r, rv_fmt_rd_rs1)
907
-OP(mop_r_31, "mop.r.31", rv_codec_r, rv_fmt_rd_rs1)
876
+OP(mop_r, "mop.r", rv_codec_mop_r, rv_fmt_mop_r)
877
OP(mop_rr_0, "mop.rr.0", rv_codec_r, rv_fmt_rd_rs1_rs2)
878
OP(mop_rr_1, "mop.rr.1", rv_codec_r, rv_fmt_rd_rs1_rs2)
879
OP(mop_rr_2, "mop.rr.2", rv_codec_r, rv_fmt_rd_rs1_rs2)
disas/riscv.c
+14
-1
@@ -643,6 +643,13 @@ static uint32_t operand_lpl(rv_inst inst)
643
return extract32(inst, 12, 20);
644
}
645
646
+static uint32_t operand_mop_r_imm(rv_inst inst)
647
+{
648
+ return (extract32(inst, 30, 1) << 4) |
649
+ (extract32(inst, 26, 2) << 2) |
650
+ extract32(inst, 20, 2);
651
+}
652
+
653
/* instruction metadata */
654
655
static const rv_opcode_data rvi_opcode_data[] = {
@@ -2546,7 +2553,7 @@ static const rv_opcode_data *decode_inst_opcode(rv_decode *dec, rv_isa isa)
2553
2, 2,
2554
extract32(inst, 26, 2)),
2555
4, 1, extract32(inst, 30, 1));
2549
- op = rv_op_mop_r_0 + imm_mop5;
2556
+ op = rv_op_mop_r;
2557
/* if zicfiss enabled and mop5 is shadow stack */
2558
if (dec->cfg->ext_zicfiss &&
2559
((imm_mop5 & 0b11100) == 0b11100)) {
@@ -3049,6 +3056,11 @@ static void decode_inst_operands(rv_decode *dec, rv_isa isa,
3056
dec->rs1 = dec->rs2 = operand_crs1(inst);
3057
dec->imm = 0;
3058
break;
3059
+ case rv_codec_mop_r:
3060
+ dec->rd = operand_rd(inst);
3061
+ dec->rs1 = operand_rs1(inst);
3062
+ dec->imm = operand_mop_r_imm(inst);
3063
+ break;
3064
default:
3065
g_assert_not_reached();
3066
}
@@ -3134,6 +3146,7 @@ static GString *format_inst(size_t tab, rv_decode *dec,
3146
g_string_append(buf, op->name);
3147
break;
3148
case '(':
3149
+ case '.':
3150
case ',':
3151
case ')':
3152
case '-':
disas/riscv.h
+2
@@ -160,6 +160,7 @@ typedef enum {
160
rv_codec_fli,
161
rv_codec_lp,
162
rv_codec_cmop_ss,
163
+ rv_codec_mop_r,
164
} rv_codec;
165
166
/* structures */
@@ -284,5 +285,6 @@ typedef struct {
285
#define rv_fmt_rd_rs1_immh_imml_addr "O\t0,(1),i,j"
286
#define rv_fmt_rd2_imm "O\t0,2,(1),i"
287
#define rv_fmt_fli "O\t3,h"
288
+#define rv_fmt_mop_r "O.i\t0,1"
289
290
#endif /* DISAS_RISCV_H */