Re: [PATCH 39/56] disas/riscv: Store op pointer in rv_comp_data
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: > 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++; > }