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


Reply via email to