On Thu, May 28, 2026 at 6:05 AM Daniel Henrique Barboza <[email protected]> wrote: > > inst_length() can return 0 if 'inst' happens to not match any known > encoding (like [1]). Returning 0 is not desirable, even for unknown > encodings, given that it will cause a loop in target_disas() later on. > > The most recent version of the RISC-V unpriv spec ditched the > sophisticated instruction-length encoding. We're now supporting only > 16-bit and 32-bit length instructions, where: > > "All the 32-bit instructions in the base ISA have their lowest two bits > set to 11. The optional compressed 16-bit instruction-set extensions > have their lowest two bits equal to 00, 01, or 10." > > So the code is now simpler, never returning 0, and in fact it's the same > thing we're already doing in insn_len() from target/riscv/internals.h. > Due to include shenarigans we can't use that function in disas/riscv.c, > but I believe we can cut ourselves some slack this time and not lose > sleep over a 1 line of duplicated logic. We're documenting it though! > > [1] https://gitlab.com/qemu-project/qemu/-/work_items/3479 > > Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3479 > Signed-off-by: Daniel Henrique Barboza <[email protected]>
Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > disas/riscv.c | 20 ++------------------ > 1 file changed, 2 insertions(+), 18 deletions(-) > > diff --git a/disas/riscv.c b/disas/riscv.c > index d416a4d6b3..fbdb24fcea 100644 > --- a/disas/riscv.c > +++ b/disas/riscv.c > @@ -5057,26 +5057,10 @@ static bool check_constraints(rv_decode *dec, const > rvc_constraint *c) > return true; > } > > -/* instruction length */ > - > +/* Same as insn_len() from target/riscv/internals.h */ > static size_t inst_length(rv_inst inst) > { > - /* NOTE: supports maximum instruction size of 64-bits */ > - > - /* > - * instruction length coding > - * > - * aa - 16 bit aa != 11 > - * bbb11 - 32 bit bbb != 111 > - * 011111 - 48 bit > - * 0111111 - 64 bit > - */ > - > - return (inst & 0b11) != 0b11 ? 2 > - : (inst & 0b11100) != 0b11100 ? 4 > - : (inst & 0b111111) == 0b011111 ? 6 > - : (inst & 0b1111111) == 0b0111111 ? 8 > - : 0; > + return (inst & 3) == 3 ? 4 : 2; > } > > /* format instruction */ > -- > 2.43.0 > >
