Store a pointer instead of an array index.
Reviewed-by: Alistair Francis <[email protected]>
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 342e2db3cc..9d05e86c09 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) &(const rv_comp_data){ X, rvcc_true }
+#define DECOMP(X) &(const rv_comp_data){ &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