From: Richard Henderson Date: Thu, 18 Aug 2022 19:07:28 +0000 (-0700) Subject: target/riscv: Add MAX_INSN_LEN and insn_len X-Git-Tag: v7.2.0-rc0~94^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ef6e987b64343e0dc9e8526c80ee8d27d0654549;p=thirdparty%2Fqemu.git target/riscv: Add MAX_INSN_LEN and insn_len These will be useful in properly ending the TB. Reviewed-by: Alistair Francis Acked-by: Ilya Leoshkevich Tested-by: Ilya Leoshkevich Signed-off-by: Richard Henderson --- diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 38666ddc91a..a719aa6e630 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -1022,6 +1022,14 @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc) /* Include decoders for factored-out extensions */ #include "decode-XVentanaCondOps.c.inc" +/* The specification allows for longer insns, but not supported by qemu. */ +#define MAX_INSN_LEN 4 + +static inline int insn_len(uint16_t first_word) +{ + return (first_word & 3) == 3 ? 4 : 2; +} + static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode) { /* @@ -1037,7 +1045,7 @@ static void decode_opc(CPURISCVState *env, DisasContext *ctx, uint16_t opcode) }; /* Check for compressed insn */ - if (extract16(opcode, 0, 2) != 3) { + if (insn_len(opcode) == 2) { if (!has_ext(ctx, RVC)) { gen_exception_illegal(ctx); } else {