From: Philippe Mathieu-Daudé <[email protected]> Decode the destination with xlat(), and the immediate with li16_imm7() (0x7f encodes -1), then call gen_li().
Reviewed-by: Richard Henderson <[email protected]> Signed-off-by: Philippe Mathieu-Daudé <[email protected]> Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- Since v3: - Rename simm7() as li16_imm7(), drop the single-use format - Helpers no longer declared inline --- target/mips/tcg/micromips16.decode | 7 +++++++ target/mips/tcg/micromips_translate.c | 12 ++++++++++++ target/mips/tcg/micromips_translate.c.inc | 10 ---------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/target/mips/tcg/micromips16.decode b/target/mips/tcg/micromips16.decode index 4b1f04299132..e4f193c79989 100644 --- a/target/mips/tcg/micromips16.decode +++ b/target/mips/tcg/micromips16.decode @@ -9,3 +9,10 @@ # (Document Number: MD00582) # microMIPS64 Instruction Set # (Document Number: MD00594) + +&rd_imm rd imm + +%rd3 7:3 !function=gpr3_m16 +%li16_imm7 0:7 !function=li16_imm7 + +LI 111011 ... ....... &rd_imm rd=%rd3 imm=%li16_imm7 # LI16 diff --git a/target/mips/tcg/micromips_translate.c b/target/mips/tcg/micromips_translate.c index 2a2b5aaa4530..8d9b31a5ddf8 100644 --- a/target/mips/tcg/micromips_translate.c +++ b/target/mips/tcg/micromips_translate.c @@ -14,6 +14,11 @@ static int plus_1(DisasContext *ctx, int x) return x + 1; } +static int li16_imm7(DisasContext *ctx, int x) +{ + return x == 0x7f ? -1 : x; +} + /* Include the auto-generated decoders. */ #include "decode-micromips16.c.inc" #include "decode-micromips32.c.inc" @@ -23,3 +28,10 @@ static bool trans_LSA(DisasContext *ctx, arg_r *a) { return gen_lsa(ctx, a->rd, a->rt, a->rs, a->sa); } + +static bool trans_LI(DisasContext *ctx, arg_rd_imm *a) +{ + gen_li(ctx, a->rd, a->imm); + + return true; +} diff --git a/target/mips/tcg/micromips_translate.c.inc b/target/mips/tcg/micromips_translate.c.inc index 88ec1668bd8b..d6a5c2263b56 100644 --- a/target/mips/tcg/micromips_translate.c.inc +++ b/target/mips/tcg/micromips_translate.c.inc @@ -113,7 +113,6 @@ enum { BLTZALC = 0x38, BLTUC = 0x38, SW16 = 0x3a, - LI16 = 0x3b, JALX32 = 0x3c, JAL32 = 0x3d, BLEZC = 0x3d, @@ -3223,15 +3222,6 @@ static int decode_isa_micromips(CPUMIPSState *env, DisasContext *ctx) (ctx->insn_flags & ISA_MIPS_R6) ? 0 : 4); break; - case LI16: - { - int reg = gpr3_m16(ctx, uMIPS_RD(ctx->opcode)); - int imm = ZIMM(ctx->opcode, 0, 7); - - imm = (imm == 0x7f ? -1 : imm); - tcg_gen_movi_tl(cpu_gpr[reg], imm); - } - break; case RES_29: case RES_31: case RES_39: -- 2.55.0
