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)

Reply via email to