@samitouri / QOSamiQemu / commits / 6a238ffe35

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;