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;