Re: [PATCH 10/56] disas/riscv: Pass rv_opcode_data pointer to/from decode_inst_decompress
Alistair <[email protected]>
| Newsgroups | org.nongnu.qemu-riscv,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
On Sun, 2026-08-09 at 15:34 -0700, Richard Henderson wrote: > Unify 4 functions, sharing code. > > Signed-off-by: Richard Henderson <[email protected]> Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > disas/riscv.c | 70 ++++++++++++++++--------------------------------- > -- > 1 file changed, 21 insertions(+), 49 deletions(-) > > diff --git a/disas/riscv.c b/disas/riscv.c > index af43940732..47fae7316c 100644 > --- a/disas/riscv.c > +++ b/disas/riscv.c > @@ -5377,64 +5377,36 @@ static void decode_inst_lift_pseudo(rv_decode > *dec) > > /* decompress instruction */ > > -static void decode_inst_decompress_rv32(rv_decode *dec) > +static const rv_opcode_data *decode_inst_decompress(rv_decode *dec, > rv_isa isa, > + const > rv_opcode_data *op) > { > - const rv_opcode_data *opcode_data = dec->opcode_data; > - int decomp_op = opcode_data[dec->op].decomp_rv32; > - if (decomp_op != rv_op_illegal) { > - if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz) > - && dec->imm == 0) { > - dec->op = rv_op_illegal; > - } else { > - dec->op = decomp_op; > - dec->codec = opcode_data[decomp_op].codec; > - } > - } > -} > + int decomp_op; > > -static void decode_inst_decompress_rv64(rv_decode *dec) > -{ > - const rv_opcode_data *opcode_data = dec->opcode_data; > - int decomp_op = opcode_data[dec->op].decomp_rv64; > - if (decomp_op != rv_op_illegal) { > - if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz) > - && dec->imm == 0) { > - dec->op = rv_op_illegal; > - } else { > - dec->op = decomp_op; > - dec->codec = opcode_data[decomp_op].codec; > - } > - } > -} > - > -static void decode_inst_decompress_rv128(rv_decode *dec) > -{ > - const rv_opcode_data *opcode_data = dec->opcode_data; > - int decomp_op = opcode_data[dec->op].decomp_rv128; > - if (decomp_op != rv_op_illegal) { > - if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz) > - && dec->imm == 0) { > - dec->op = rv_op_illegal; > - } else { > - dec->op = decomp_op; > - dec->codec = opcode_data[decomp_op].codec; > - } > - } > -} > - > -static void decode_inst_decompress(rv_decode *dec, rv_isa isa) > -{ > switch (isa) { > case rv32: > - decode_inst_decompress_rv32(dec); > + decomp_op = op->decomp_rv32; > break; > case rv64: > - decode_inst_decompress_rv64(dec); > + decomp_op = op->decomp_rv64; > break; > case rv128: > - decode_inst_decompress_rv128(dec); > + decomp_op = op->decomp_rv128; > break; > + default: > + g_assert_not_reached(); > } > + > + if (decomp_op != rv_op_illegal) { > + if ((op->decomp_data & rvcd_imm_nz) && dec->imm == 0) { > + dec->opcode_data = rvi_opcode_data; > + dec->op = rv_op_illegal; > + } else { > + dec->op = decomp_op; > + } > + op = &dec->opcode_data[decomp_op]; > + dec->codec = op->codec; > + } > + return op; > } > > /* disassemble instruction */ > @@ -5491,7 +5463,7 @@ static GString *disasm_inst(rv_isa isa, > uint64_t pc, rv_inst inst, > > op = &dec.opcode_data[dec.op]; > decode_inst_operands(&dec, isa, op); > - decode_inst_decompress(&dec, isa); > + op = decode_inst_decompress(&dec, isa, op); > decode_inst_lift_pseudo(&dec); > return format_inst(24, &dec); > }