Re: [PATCH 52/56] disas/riscv: Merge all c.mop.n to one pattern
Alistair <[email protected]>
| Newsgroups | org.nongnu.qemu-riscv,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
On Sun, 2026-08-09 at 15:35 -0700, Richard Henderson wrote: > Avoid performing arithmetic on rv_op_c_mop_1. > Treat the 'n' as an immediate. > Create a codec and format to match. > > Signed-off-by: Richard Henderson <[email protected]> Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > disas/riscv.h | 2 ++ > disas/riscv.c | 10 +++++++++- > disas/riscv-op.c.inc | 9 +-------- > 3 files changed, 12 insertions(+), 9 deletions(-) > > diff --git a/disas/riscv.h b/disas/riscv.h > index 47647f750f..b0269bb709 100644 > --- a/disas/riscv.h > +++ b/disas/riscv.h > @@ -159,6 +159,7 @@ typedef enum { > rv_codec_r2_imm2_imm5, > rv_codec_fli, > rv_codec_lp, > + rv_codec_cmop, > rv_codec_cmop_ss, > rv_codec_mop_r, > rv_codec_mop_rr, > @@ -286,6 +287,7 @@ typedef struct { > #define rv_fmt_rd_rs1_immh_imml_addr "O\t0,(1),i,j" > #define rv_fmt_rd2_imm "O\t0,2,(1),i" > #define rv_fmt_fli "O\t3,h" > +#define rv_fmt_cmop "O.i" > #define rv_fmt_mop_r "O.i\t0,1" > #define rv_fmt_mop_rr "O.i\t0,1,2" > > diff --git a/disas/riscv.c b/disas/riscv.c > index 6ec62a5830..89c2e63941 100644 > --- a/disas/riscv.c > +++ b/disas/riscv.c > @@ -643,6 +643,11 @@ static uint32_t operand_lpl(rv_inst inst) > return extract32(inst, 12, 20); > } > > +static uint32_t operand_cmop_imm(rv_inst inst) > +{ > + return extract32(inst, 8, 3) * 2 + 1; > +} > + > static uint32_t operand_mop_r_imm(rv_inst inst) > { > return (extract32(inst, 30, 1) << 4) | > @@ -1027,7 +1032,7 @@ static const rv_opcode_data > *decode_inst_opcode(rv_decode *dec, rv_isa isa) > (((inst >> 11) & 0b11) == 0b0)) { > unsigned int cmop_code = 0; > cmop_code = ((inst >> 8) & 0b111); > - op = rv_op_c_mop_1 + cmop_code; > + op = rv_op_c_mop; > if (dec->cfg->ext_zicfiss) { > op = (cmop_code == 0) ? rv_op_c_sspush : op; > op = (cmop_code == 2) ? rv_op_c_sspopchk : > op; > @@ -3056,6 +3061,9 @@ static void decode_inst_operands(rv_decode > *dec, rv_isa isa, > case rv_codec_lp: > dec->imm = operand_lpl(inst); > break; > + case rv_codec_cmop: > + dec->imm = operand_cmop_imm(inst); > + break; > case rv_codec_cmop_ss: > dec->rd = rv_ireg_zero; > dec->rs1 = dec->rs2 = operand_crs1(inst); > diff --git a/disas/riscv-op.c.inc b/disas/riscv-op.c.inc > index 2100e54475..802a521bca 100644 > --- a/disas/riscv-op.c.inc > +++ b/disas/riscv-op.c.inc > @@ -875,14 +875,7 @@ OP(amocas_d, "amocas.d", rv_codec_r_a, > rv_fmt_aqrl_rd_rs2_rs1) > OP(amocas_q, "amocas.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1) > OP(mop_r, "mop.r", rv_codec_mop_r, rv_fmt_mop_r) > OP(mop_rr, "mop.rr", rv_codec_mop_rr, rv_fmt_mop_rr) > -OP(c_mop_1, "c.mop.1", rv_codec_ci_none, rv_fmt_none) > -OP(c_mop_3, "c.mop.3", rv_codec_ci_none, rv_fmt_none) > -OP(c_mop_5, "c.mop.5", rv_codec_ci_none, rv_fmt_none) > -OP(c_mop_7, "c.mop.7", rv_codec_ci_none, rv_fmt_none) > -OP(c_mop_9, "c.mop.9", rv_codec_ci_none, rv_fmt_none) > -OP(c_mop_11, "c.mop.11", rv_codec_ci_none, rv_fmt_none) > -OP(c_mop_13, "c.mop.13", rv_codec_ci_none, rv_fmt_none) > -OP(c_mop_15, "c.mop.15", rv_codec_ci_none, rv_fmt_none) > +OP(c_mop, "c.mop", rv_codec_cmop, rv_fmt_cmop) > OP(amoswap_b, "amoswap.b", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1) > OP(amoadd_b, "amoadd.b", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1) > OP(amoxor_b, "amoxor.b", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1)