On Sun, 2026-08-09 at 15:35 -0700, Richard Henderson wrote:
> Store a pointer instead of an array index.
> 
> Signed-off-by: Richard Henderson <[email protected]>

Reviewed-by: Alistair Francis <[email protected]>

Alistair

> ---
>  disas/riscv.h |  8 +++---
>  disas/riscv.c | 69 ++++++++++++++++++++++++++-----------------------
> --
>  2 files changed, 40 insertions(+), 37 deletions(-)
> 
> diff --git a/disas/riscv.h b/disas/riscv.h
> index ea7141d3b5..ab62c0db94 100644
> --- a/disas/riscv.h
> +++ b/disas/riscv.h
> @@ -164,17 +164,19 @@ typedef enum {
>  
>  /* structures */
>  
> +typedef struct rv_opcode_data rv_opcode_data;
> +
>  typedef struct {
> -    int op;
> +    const rv_opcode_data *op;
>      const rvc_constraint *constraints;
>  } rv_comp_data;
>  
> -typedef struct {
> +struct rv_opcode_data {
>      const char *name;
>      rv_codec codec;
>      const char *format;
>      const rv_comp_data *pseudo;
> -} rv_opcode_data;
> +};
>  
>  typedef struct {
>      const RISCVCPUConfig *cfg;
> diff --git a/disas/riscv.c b/disas/riscv.c
> index 9a528803e8..171c60238f 100644
> --- a/disas/riscv.c
> +++ b/disas/riscv.c
> @@ -1068,138 +1068,140 @@ static const rvc_constraint rvcc_true[] = {
> rvc_end };
>  
>  /* pseudo-instruction metadata */
>  
> +static const rv_opcode_data rvi_opcode_data[];
> +
>  static const rv_comp_data rvcp_jal[] = {
> -    { rv_op_j, rvcc_j },
> -    { rv_op_jal_ra, rvcc_jal_ra },
> +    { &rvi_opcode_data[rv_op_j], rvcc_j },
> +    { &rvi_opcode_data[rv_op_jal_ra], rvcc_jal_ra },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_jalr[] = {
> -    { rv_op_jr, rvcc_jr },
> -    { rv_op_jalr_ra, rvcc_jalr_ra },
> +    { &rvi_opcode_data[rv_op_jr], rvcc_jr },
> +    { &rvi_opcode_data[rv_op_jalr_ra], rvcc_jalr_ra },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_jr[] = {
> -    { rv_op_ret, rvcc_ret },
> +    { &rvi_opcode_data[rv_op_ret], rvcc_ret },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_beq[] = {
> -    { rv_op_beqz, rvcc_beqz },
> +    { &rvi_opcode_data[rv_op_beqz], rvcc_beqz },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_bne[] = {
> -    { rv_op_bnez, rvcc_bnez },
> +    { &rvi_opcode_data[rv_op_bnez], rvcc_bnez },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_blt[] = {
> -    { rv_op_bltz, rvcc_bltz },
> -    { rv_op_bgtz, rvcc_bgtz },
> +    { &rvi_opcode_data[rv_op_bltz], rvcc_bltz },
> +    { &rvi_opcode_data[rv_op_bgtz], rvcc_bgtz },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_bge[] = {
> -    { rv_op_blez, rvcc_blez },
> -    { rv_op_bgez, rvcc_bgez },
> +    { &rvi_opcode_data[rv_op_blez], rvcc_blez },
> +    { &rvi_opcode_data[rv_op_bgez], rvcc_bgez },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_addi[] = {
> -    { rv_op_mv, rvcc_mv },
> +    { &rvi_opcode_data[rv_op_mv], rvcc_mv },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_mv[] = {
> -    { rv_op_nop, rvcc_nop },
> +    { &rvi_opcode_data[rv_op_nop], rvcc_nop },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_sltiu[] = {
> -    { rv_op_seqz, rvcc_seqz },
> +    { &rvi_opcode_data[rv_op_seqz], rvcc_seqz },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_xori[] = {
> -    { rv_op_not, rvcc_not },
> +    { &rvi_opcode_data[rv_op_not], rvcc_not },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_sub[] = {
> -    { rv_op_neg, rvcc_neg },
> +    { &rvi_opcode_data[rv_op_neg], rvcc_neg },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_slt[] = {
> -    { rv_op_sltz, rvcc_sltz },
> -    { rv_op_sgtz, rvcc_sgtz },
> +    { &rvi_opcode_data[rv_op_sltz], rvcc_sltz },
> +    { &rvi_opcode_data[rv_op_sgtz], rvcc_sgtz },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_sltu[] = {
> -    { rv_op_snez, rvcc_snez },
> +    { &rvi_opcode_data[rv_op_snez], rvcc_snez },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_addiw[] = {
> -    { rv_op_sext_w, rvcc_sext_w },
> +    { &rvi_opcode_data[rv_op_sext_w], rvcc_sext_w },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_subw[] = {
> -    { rv_op_negw, rvcc_negw },
> +    { &rvi_opcode_data[rv_op_negw], rvcc_negw },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnj_s[] = {
> -    { rv_op_fmv_s, rvcc_fmv_s },
> +    { &rvi_opcode_data[rv_op_fmv_s], rvcc_fmv_s },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnjn_s[] = {
> -    { rv_op_fneg_s, rvcc_fneg_s },
> +    { &rvi_opcode_data[rv_op_fneg_s], rvcc_fneg_s },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnjx_s[] = {
> -    { rv_op_fabs_s, rvcc_fabs_s },
> +    { &rvi_opcode_data[rv_op_fabs_s], rvcc_fabs_s },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnj_d[] = {
> -    { rv_op_fmv_d, rvcc_fmv_d },
> +    { &rvi_opcode_data[rv_op_fmv_d], rvcc_fmv_d },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnjn_d[] = {
> -    { rv_op_fneg_d, rvcc_fneg_d },
> +    { &rvi_opcode_data[rv_op_fneg_d], rvcc_fneg_d },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnjx_d[] = {
> -    { rv_op_fabs_d, rvcc_fabs_d },
> +    { &rvi_opcode_data[rv_op_fabs_d], rvcc_fabs_d },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnj_q[] = {
> -    { rv_op_fmv_q, rvcc_fmv_q },
> +    { &rvi_opcode_data[rv_op_fmv_q], rvcc_fmv_q },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnjn_q[] = {
> -    { rv_op_fneg_q, rvcc_fneg_q },
> +    { &rvi_opcode_data[rv_op_fneg_q], rvcc_fneg_q },
>      { },
>  };
>  
>  static const rv_comp_data rvcp_fsgnjx_q[] = {
> -    { rv_op_fabs_q, rvcc_fabs_q },
> +    { &rvi_opcode_data[rv_op_fabs_q], rvcc_fabs_q },
>      { },
>  };
>  
>  /* Convert compressed insns into normal insns via pseudo expansion.
> */
> -#define DECOMP(X) (static const rv_comp_data[1]){ { X, rvcc_true } }
> +#define DECOMP(X) (static const rv_comp_data[1]){ {
> &rvi_opcode_data[X], rvcc_true } }
>  
>  /* operand extractors */
>  
> @@ -5270,9 +5272,8 @@ static const rv_opcode_data
> *decode_inst_lift_pseudo(rv_decode *dec,
>      if (comp_data) {
>          while (comp_data->constraints) {
>              if (check_constraints(dec, comp_data->constraints)) {
> -                const rv_opcode_data *new_op = &dec-
> >opcode_data[comp_data->op];
> -                assert(new_op != op);
> -                return decode_inst_lift_pseudo(dec, new_op);
> +                assert(op != comp_data->op);
> +                return decode_inst_lift_pseudo(dec, comp_data->op);
>              }
>              comp_data++;
>          }

Reply via email to