disas/riscv: Store op pointer in rv_comp_data
Store a pointer instead of an array index. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20260812223142.349142-35-richard.henderson@linaro.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Richard Henderson committed
Aug 12, 2026 at 15:31 UTC
6a238ffe354505ad1dd3354a90caa7c64eac6092
2 files changed
+40
-37
disas/riscv.c
+35
-34
@@ -1068,138 +1068,140 @@ static const rvc_constraint rvcc_true[] = { rvc_end };
1068
1069
/* pseudo-instruction metadata */
1070
1071
+static const rv_opcode_data rvi_opcode_data[];
1072
+
1073
static const rv_comp_data rvcp_jal[] = {
1072
- { rv_op_j, rvcc_j },
1073
- { rv_op_jal_ra, rvcc_jal_ra },
1074
+ { &rvi_opcode_data[rv_op_j], rvcc_j },
1075
+ { &rvi_opcode_data[rv_op_jal_ra], rvcc_jal_ra },
1076
{ },
1077
};
1078
1079
static const rv_comp_data rvcp_jalr[] = {
1078
- { rv_op_jr, rvcc_jr },
1079
- { rv_op_jalr_ra, rvcc_jalr_ra },
1080
+ { &rvi_opcode_data[rv_op_jr], rvcc_jr },
1081
+ { &rvi_opcode_data[rv_op_jalr_ra], rvcc_jalr_ra },
1082
{ },
1083
};
1084
1085
static const rv_comp_data rvcp_jr[] = {
1084
- { rv_op_ret, rvcc_ret },
1086
+ { &rvi_opcode_data[rv_op_ret], rvcc_ret },
1087
{ },
1088
};
1089
1090
static const rv_comp_data rvcp_beq[] = {
1089
- { rv_op_beqz, rvcc_beqz },
1091
+ { &rvi_opcode_data[rv_op_beqz], rvcc_beqz },
1092
{ },
1093
};
1094
1095
static const rv_comp_data rvcp_bne[] = {
1094
- { rv_op_bnez, rvcc_bnez },
1096
+ { &rvi_opcode_data[rv_op_bnez], rvcc_bnez },
1097
{ },
1098
};
1099
1100
static const rv_comp_data rvcp_blt[] = {
1099
- { rv_op_bltz, rvcc_bltz },
1100
- { rv_op_bgtz, rvcc_bgtz },
1101
+ { &rvi_opcode_data[rv_op_bltz], rvcc_bltz },
1102
+ { &rvi_opcode_data[rv_op_bgtz], rvcc_bgtz },
1103
{ },
1104
};
1105
1106
static const rv_comp_data rvcp_bge[] = {
1105
- { rv_op_blez, rvcc_blez },
1106
- { rv_op_bgez, rvcc_bgez },
1107
+ { &rvi_opcode_data[rv_op_blez], rvcc_blez },
1108
+ { &rvi_opcode_data[rv_op_bgez], rvcc_bgez },
1109
{ },
1110
};
1111
1112
static const rv_comp_data rvcp_addi[] = {
1111
- { rv_op_mv, rvcc_mv },
1113
+ { &rvi_opcode_data[rv_op_mv], rvcc_mv },
1114
{ },
1115
};
1116
1117
static const rv_comp_data rvcp_mv[] = {
1116
- { rv_op_nop, rvcc_nop },
1118
+ { &rvi_opcode_data[rv_op_nop], rvcc_nop },
1119
{ },
1120
};
1121
1122
static const rv_comp_data rvcp_sltiu[] = {
1121
- { rv_op_seqz, rvcc_seqz },
1123
+ { &rvi_opcode_data[rv_op_seqz], rvcc_seqz },
1124
{ },
1125
};
1126
1127
static const rv_comp_data rvcp_xori[] = {
1126
- { rv_op_not, rvcc_not },
1128
+ { &rvi_opcode_data[rv_op_not], rvcc_not },
1129
{ },
1130
};
1131
1132
static const rv_comp_data rvcp_sub[] = {
1131
- { rv_op_neg, rvcc_neg },
1133
+ { &rvi_opcode_data[rv_op_neg], rvcc_neg },
1134
{ },
1135
};
1136
1137
static const rv_comp_data rvcp_slt[] = {
1136
- { rv_op_sltz, rvcc_sltz },
1137
- { rv_op_sgtz, rvcc_sgtz },
1138
+ { &rvi_opcode_data[rv_op_sltz], rvcc_sltz },
1139
+ { &rvi_opcode_data[rv_op_sgtz], rvcc_sgtz },
1140
{ },
1141
};
1142
1143
static const rv_comp_data rvcp_sltu[] = {
1142
- { rv_op_snez, rvcc_snez },
1144
+ { &rvi_opcode_data[rv_op_snez], rvcc_snez },
1145
{ },
1146
};
1147
1148
static const rv_comp_data rvcp_addiw[] = {
1147
- { rv_op_sext_w, rvcc_sext_w },
1149
+ { &rvi_opcode_data[rv_op_sext_w], rvcc_sext_w },
1150
{ },
1151
};
1152
1153
static const rv_comp_data rvcp_subw[] = {
1152
- { rv_op_negw, rvcc_negw },
1154
+ { &rvi_opcode_data[rv_op_negw], rvcc_negw },
1155
{ },
1156
};
1157
1158
static const rv_comp_data rvcp_fsgnj_s[] = {
1157
- { rv_op_fmv_s, rvcc_fmv_s },
1159
+ { &rvi_opcode_data[rv_op_fmv_s], rvcc_fmv_s },
1160
{ },
1161
};
1162
1163
static const rv_comp_data rvcp_fsgnjn_s[] = {
1162
- { rv_op_fneg_s, rvcc_fneg_s },
1164
+ { &rvi_opcode_data[rv_op_fneg_s], rvcc_fneg_s },
1165
{ },
1166
};
1167
1168
static const rv_comp_data rvcp_fsgnjx_s[] = {
1167
- { rv_op_fabs_s, rvcc_fabs_s },
1169
+ { &rvi_opcode_data[rv_op_fabs_s], rvcc_fabs_s },
1170
{ },
1171
};
1172
1173
static const rv_comp_data rvcp_fsgnj_d[] = {
1172
- { rv_op_fmv_d, rvcc_fmv_d },
1174
+ { &rvi_opcode_data[rv_op_fmv_d], rvcc_fmv_d },
1175
{ },
1176
};
1177
1178
static const rv_comp_data rvcp_fsgnjn_d[] = {
1177
- { rv_op_fneg_d, rvcc_fneg_d },
1179
+ { &rvi_opcode_data[rv_op_fneg_d], rvcc_fneg_d },
1180
{ },
1181
};
1182
1183
static const rv_comp_data rvcp_fsgnjx_d[] = {
1182
- { rv_op_fabs_d, rvcc_fabs_d },
1184
+ { &rvi_opcode_data[rv_op_fabs_d], rvcc_fabs_d },
1185
{ },
1186
};
1187
1188
static const rv_comp_data rvcp_fsgnj_q[] = {
1187
- { rv_op_fmv_q, rvcc_fmv_q },
1189
+ { &rvi_opcode_data[rv_op_fmv_q], rvcc_fmv_q },
1190
{ },
1191
};
1192
1193
static const rv_comp_data rvcp_fsgnjn_q[] = {
1192
- { rv_op_fneg_q, rvcc_fneg_q },
1194
+ { &rvi_opcode_data[rv_op_fneg_q], rvcc_fneg_q },
1195
{ },
1196
};
1197
1198
static const rv_comp_data rvcp_fsgnjx_q[] = {
1197
- { rv_op_fabs_q, rvcc_fabs_q },
1199
+ { &rvi_opcode_data[rv_op_fabs_q], rvcc_fabs_q },
1200
{ },
1201
};
1202
1203
/* Convert compressed insns into normal insns via pseudo expansion. */
1202
-#define DECOMP(X) &(const rv_comp_data){ X, rvcc_true }
1204
+#define DECOMP(X) &(const rv_comp_data){ &rvi_opcode_data[X], rvcc_true }
1205
1206
/* operand extractors */
1207
@@ -5270,9 +5272,8 @@ static const rv_opcode_data *decode_inst_lift_pseudo(rv_decode *dec,
5272
if (comp_data) {
5273
while (comp_data->constraints) {
5274
if (check_constraints(dec, comp_data->constraints)) {
5273
- const rv_opcode_data *new_op = &dec->opcode_data[comp_data->op];
5274
- assert(new_op != op);
5275
- return decode_inst_lift_pseudo(dec, new_op);
5275
+ assert(op != comp_data->op);
5276
+ return decode_inst_lift_pseudo(dec, comp_data->op);
5277
}
5278
comp_data++;
5279
}
disas/riscv.h
+5
-3
@@ -164,17 +164,19 @@ typedef enum {
164
165
/* structures */
166
167
+typedef struct rv_opcode_data rv_opcode_data;
168
+
169
typedef struct {
168
- int op;
170
+ const rv_opcode_data *op;
171
const rvc_constraint *constraints;
172
} rv_comp_data;
173
172
-typedef struct {
174
+struct rv_opcode_data {
175
const char *name;
176
rv_codec codec;
177
const char *format;
178
const rv_comp_data *pseudo;
177
-} rv_opcode_data;
179
+};
180
181
typedef struct {
182
const RISCVCPUConfig *cfg;