[PATCH 39/56] disas/riscv: Store op pointer in rv_comp_data
Richard Henderson <[email protected]>
| Newsgroups | org.nongnu.qemu-devel,org.nongnu.qemu-riscv |
|---|---|
| Message-ID | <[email protected]> |
Store a pointer instead of an array index. Signed-off-by: Richard Henderson <[email protected]> --- 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++; } -- 2.43.0