@samitouri / QOSamiQemu / commits / 850708045a

disas/riscv: Return rv_opcode_data pointer from decoders

Rather than putting array + index into rv_decode, return the pointer to the object directly. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20260812223142.349142-36-richard.henderson@linaro.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Richard Henderson committed Aug 12, 2026 at 15:31 UTC 850708045ab30e2252e30a647a822a5d0e6f2cbd
8 files changed +48 -68
disas/riscv-xlrbr.c
+2 -3
@@ -36,7 +36,7 @@ static const rv_opcode_data xlrbr_opcode_data[] = {
36 { "crc32c.d", rv_codec_r, rv_fmt_rd_rs1 },
37 };
38
39 -void decode_xlrbr(rv_decode *dec, rv_isa isa)
39 +const rv_opcode_data *decode_xlrbr(rv_decode *dec, rv_isa isa)
40 {
41 rv_inst inst = dec->inst;
42 rv_opcode op = rv_op_illegal;
@@ -76,6 +76,5 @@ void decode_xlrbr(rv_decode *dec, rv_isa isa)
76 break;
77 }
78
79 - dec->opcode_data = xlrbr_opcode_data;
80 - dec->op = op;
79 + return op == rv_op_illegal ? NULL : &xlrbr_opcode_data[op];
80 }
disas/riscv-xlrbr.h
+1 -1
@@ -12,6 +12,6 @@
12
13 #include "disas/riscv.h"
14
15 -void decode_xlrbr(rv_decode *, rv_isa);
15 +const rv_opcode_data *decode_xlrbr(rv_decode *, rv_isa);
16
17 #endif /* DISAS_RISCV_XLRBR_H */
disas/riscv-xthead.c
+22 -33
@@ -246,7 +246,7 @@ static const rv_opcode_data xthead_opcode_data[] = {
246 { "th.sync.s", rv_codec_none, rv_fmt_none },
247 };
248
249 -void decode_xtheadba(rv_decode *dec, rv_isa isa)
249 +const rv_opcode_data *decode_xtheadba(rv_decode *dec, rv_isa isa)
250 {
251 rv_inst inst = dec->inst;
252 rv_opcode op = rv_op_illegal;
@@ -272,11 +272,10 @@ void decode_xtheadba(rv_decode *dec, rv_isa isa)
272 break;
273 }
274
275 - dec->opcode_data = xthead_opcode_data;
276 - dec->op = op;
275 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
276 }
277
279 -void decode_xtheadbb(rv_decode *dec, rv_isa isa)
278 +const rv_opcode_data *decode_xtheadbb(rv_decode *dec, rv_isa isa)
279 {
280 rv_inst inst = dec->inst;
281 rv_opcode op = rv_op_illegal;
@@ -331,11 +330,10 @@ void decode_xtheadbb(rv_decode *dec, rv_isa isa)
330 break;
331 }
332
334 - dec->opcode_data = xthead_opcode_data;
335 - dec->op = op;
333 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
334 }
335
338 -void decode_xtheadbs(rv_decode *dec, rv_isa isa)
336 +const rv_opcode_data *decode_xtheadbs(rv_decode *dec, rv_isa isa)
337 {
338 rv_inst inst = dec->inst;
339 rv_opcode op = rv_op_illegal;
@@ -358,11 +356,10 @@ void decode_xtheadbs(rv_decode *dec, rv_isa isa)
356 break;
357 }
358
361 - dec->opcode_data = xthead_opcode_data;
362 - dec->op = op;
359 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
360 }
361
365 -void decode_xtheadcmo(rv_decode *dec, rv_isa isa)
362 +const rv_opcode_data *decode_xtheadcmo(rv_decode *dec, rv_isa isa)
363 {
364 rv_inst inst = dec->inst;
365 rv_opcode op = rv_op_illegal;
@@ -437,11 +434,10 @@ void decode_xtheadcmo(rv_decode *dec, rv_isa isa)
434 break;
435 }
436
440 - dec->opcode_data = xthead_opcode_data;
441 - dec->op = op;
437 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
438 }
439
444 -void decode_xtheadcondmov(rv_decode *dec, rv_isa isa)
440 +const rv_opcode_data *decode_xtheadcondmov(rv_decode *dec, rv_isa isa)
441 {
442 rv_inst inst = dec->inst;
443 rv_opcode op = rv_op_illegal;
@@ -465,11 +461,10 @@ void decode_xtheadcondmov(rv_decode *dec, rv_isa isa)
461 break;
462 }
463
468 - dec->opcode_data = xthead_opcode_data;
469 - dec->op = op;
464 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
465 }
466
472 -void decode_xtheadfmemidx(rv_decode *dec, rv_isa isa)
467 +const rv_opcode_data *decode_xtheadfmemidx(rv_decode *dec, rv_isa isa)
468 {
469 rv_inst inst = dec->inst;
470 rv_opcode op = rv_op_illegal;
@@ -503,11 +498,10 @@ void decode_xtheadfmemidx(rv_decode *dec, rv_isa isa)
498 break;
499 }
500
506 - dec->opcode_data = xthead_opcode_data;
507 - dec->op = op;
501 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
502 }
503
510 -void decode_xtheadfmv(rv_decode *dec, rv_isa isa)
504 +const rv_opcode_data *decode_xtheadfmv(rv_decode *dec, rv_isa isa)
505 {
506 rv_inst inst = dec->inst;
507 rv_opcode op = rv_op_illegal;
@@ -539,11 +533,10 @@ void decode_xtheadfmv(rv_decode *dec, rv_isa isa)
533 break;
534 }
535
542 - dec->opcode_data = xthead_opcode_data;
543 - dec->op = op;
536 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
537 }
538
546 -void decode_xtheadmac(rv_decode *dec, rv_isa isa)
539 +const rv_opcode_data *decode_xtheadmac(rv_decode *dec, rv_isa isa)
540 {
541 rv_inst inst = dec->inst;
542 rv_opcode op = rv_op_illegal;
@@ -571,11 +564,10 @@ void decode_xtheadmac(rv_decode *dec, rv_isa isa)
564 break;
565 }
566
574 - dec->opcode_data = xthead_opcode_data;
575 - dec->op = op;
567 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
568 }
569
578 -void decode_xtheadmemidx(rv_decode *dec, rv_isa isa)
570 +const rv_opcode_data *decode_xtheadmemidx(rv_decode *dec, rv_isa isa)
571 {
572 rv_inst inst = dec->inst;
573 rv_opcode op = rv_op_illegal;
@@ -646,11 +638,10 @@ void decode_xtheadmemidx(rv_decode *dec, rv_isa isa)
638 break;
639 }
640
649 - dec->opcode_data = xthead_opcode_data;
650 - dec->op = op;
641 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
642 }
643
653 -void decode_xtheadmempair(rv_decode *dec, rv_isa isa)
644 +const rv_opcode_data *decode_xtheadmempair(rv_decode *dec, rv_isa isa)
645 {
646 rv_inst inst = dec->inst;
647 rv_opcode op = rv_op_illegal;
@@ -681,11 +672,10 @@ void decode_xtheadmempair(rv_decode *dec, rv_isa isa)
672 break;
673 }
674
684 - dec->opcode_data = xthead_opcode_data;
685 - dec->op = op;
675 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
676 }
677
688 -void decode_xtheadsync(rv_decode *dec, rv_isa isa)
678 +const rv_opcode_data *decode_xtheadsync(rv_decode *dec, rv_isa isa)
679 {
680 rv_inst inst = dec->inst;
681 rv_opcode op = rv_op_illegal;
@@ -716,6 +706,5 @@ void decode_xtheadsync(rv_decode *dec, rv_isa isa)
706 break;
707 }
708
719 - dec->opcode_data = xthead_opcode_data;
720 - dec->op = op;
709 + return op == rv_op_illegal ? NULL : &xthead_opcode_data[op];
710 }
disas/riscv-xthead.h
+11 -11
@@ -11,16 +11,16 @@
11
12 #include "disas/riscv.h"
13
14 -void decode_xtheadba(rv_decode *, rv_isa);
15 -void decode_xtheadbb(rv_decode *, rv_isa);
16 -void decode_xtheadbs(rv_decode *, rv_isa);
17 -void decode_xtheadcmo(rv_decode *, rv_isa);
18 -void decode_xtheadcondmov(rv_decode *, rv_isa);
19 -void decode_xtheadfmemidx(rv_decode *, rv_isa);
20 -void decode_xtheadfmv(rv_decode *, rv_isa);
21 -void decode_xtheadmac(rv_decode *, rv_isa);
22 -void decode_xtheadmemidx(rv_decode *, rv_isa);
23 -void decode_xtheadmempair(rv_decode *, rv_isa);
24 -void decode_xtheadsync(rv_decode *, rv_isa);
14 +const rv_opcode_data *decode_xtheadba(rv_decode *, rv_isa);
15 +const rv_opcode_data *decode_xtheadbb(rv_decode *, rv_isa);
16 +const rv_opcode_data *decode_xtheadbs(rv_decode *, rv_isa);
17 +const rv_opcode_data *decode_xtheadcmo(rv_decode *, rv_isa);
18 +const rv_opcode_data *decode_xtheadcondmov(rv_decode *, rv_isa);
19 +const rv_opcode_data *decode_xtheadfmemidx(rv_decode *, rv_isa);
20 +const rv_opcode_data *decode_xtheadfmv(rv_decode *, rv_isa);
21 +const rv_opcode_data *decode_xtheadmac(rv_decode *, rv_isa);
22 +const rv_opcode_data *decode_xtheadmemidx(rv_decode *, rv_isa);
23 +const rv_opcode_data *decode_xtheadmempair(rv_decode *, rv_isa);
24 +const rv_opcode_data *decode_xtheadsync(rv_decode *, rv_isa);
25
26 #endif /* DISAS_RISCV_XTHEAD_H */
disas/riscv-xventana.c
+2 -3
@@ -20,7 +20,7 @@ static const rv_opcode_data ventana_opcode_data[] = {
20 { "vt.maskcn", rv_codec_r, rv_fmt_rd_rs1_rs2 },
21 };
22
23 -void decode_xventanacondops(rv_decode *dec, rv_isa isa)
23 +const rv_opcode_data *decode_xventanacondops(rv_decode *dec, rv_isa isa)
24 {
25 rv_inst inst = dec->inst;
26 rv_opcode op = rv_op_illegal;
@@ -38,6 +38,5 @@ void decode_xventanacondops(rv_decode *dec, rv_isa isa)
38 break;
39 }
40
41 - dec->opcode_data = ventana_opcode_data;
42 - dec->op = op;
41 + return op == rv_op_illegal ? NULL : &ventana_opcode_data[op];
42 }
disas/riscv-xventana.h
+1 -1
@@ -11,6 +11,6 @@
11
12 #include "disas/riscv.h"
13
14 -void decode_xventanacondops(rv_decode*, rv_isa);
14 +const rv_opcode_data *decode_xventanacondops(rv_decode*, rv_isa);
15
16 #endif /* DISAS_RISCV_XVENTANA_H */
disas/riscv.c
+9 -14
@@ -2846,7 +2846,7 @@ static const char *csr_name(int csrno)
2846
2847 /* decode opcode */
2848
2849 -static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
2849 +static const rv_opcode_data *decode_inst_opcode(rv_decode *dec, rv_isa isa)
2850 {
2851 rv_inst inst = dec->inst;
2852 rv_opcode op = rv_op_illegal;
@@ -4541,8 +4541,7 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
4541 break;
4542 }
4543
4544 - dec->opcode_data = rvi_opcode_data;
4545 - dec->op = op;
4544 + return op == rv_op_illegal ? NULL : &rvi_opcode_data[op];
4545 }
4546
4547 /* decode operands */
@@ -5291,14 +5290,12 @@ static GString *disasm_inst(rv_isa isa, uint64_t pc, rv_inst inst,
5290 .inst = inst,
5291 .cfg = cfg,
5292 };
5294 - const rv_opcode_data *op;
5293 + const rv_opcode_data *op = decode_inst_opcode(&dec, isa);
5294
5296 - decode_inst_opcode(&dec, isa);
5297 -
5298 - if (dec.op == rv_op_illegal && cfg) {
5295 + if (!op && cfg) {
5296 static const struct {
5297 bool (*guard_func)(const RISCVCPUConfig *);
5301 - void (*decode_func)(rv_decode *, rv_isa);
5298 + const rv_opcode_data *(*decode_func)(rv_decode *, rv_isa);
5299 } decoders[] = {
5300 { has_xtheadba_p, decode_xtheadba },
5301 { has_xtheadbb_p, decode_xtheadbb },
@@ -5317,19 +5314,17 @@ static GString *disasm_inst(rv_isa isa, uint64_t pc, rv_inst inst,
5314
5315 for (size_t i = 0; i < ARRAY_SIZE(decoders); i++) {
5316 if (decoders[i].guard_func(cfg)) {
5320 - decoders[i].decode_func(&dec, isa);
5321 - if (dec.op != rv_op_illegal) {
5317 + op = decoders[i].decode_func(&dec, isa);
5318 + if (op) {
5319 break;
5320 }
5321 }
5322 }
5323 }
5327 -
5328 - if (dec.op == rv_op_illegal) {
5329 - dec.opcode_data = rvi_opcode_data;
5324 + if (!op) {
5325 + op = &rvi_opcode_data[rv_op_illegal];
5326 }
5327
5332 - op = &dec.opcode_data[dec.op];
5328 decode_inst_operands(&dec, isa, op);
5329 op = decode_inst_lift_pseudo(&dec, op);
5330 return format_inst(24, &dec, op);
disas/riscv.h
-2
@@ -182,10 +182,8 @@ typedef struct {
182 const RISCVCPUConfig *cfg;
183 uint64_t pc;
184 uint64_t inst;
185 - const rv_opcode_data *opcode_data;
185 int32_t imm;
186 int32_t imm1;
188 - uint16_t op;
187 uint8_t rd;
188 uint8_t rs1;
189 uint8_t rs2;