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)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.