]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
tcg/sparc: Use the constant pool for 64-bit constants
authorRichard Henderson <richard.henderson@linaro.org>
Thu, 5 Aug 2021 01:34:20 +0000 (04:34 +0300)
committerRichard Henderson <richard.henderson@linaro.org>
Tue, 8 Feb 2022 22:00:00 +0000 (09:00 +1100)
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
tcg/sparc/tcg-target.c.inc

index 213aba4be68a0d5e101ae0b54f7489129bc7a0da..e78945d153c076a8319cd36c3315eead099c5d90 100644 (file)
@@ -336,6 +336,13 @@ static bool patch_reloc(tcg_insn_unit *src_rw, int type,
         insn &= ~INSN_OFF19(-1);
         insn |= INSN_OFF19(pcrel);
         break;
+    case R_SPARC_13:
+        if (!check_fit_ptr(value, 13)) {
+            return false;
+        }
+        insn &= ~INSN_IMM13(-1);
+        insn |= INSN_IMM13(value);
+        break;
     default:
         g_assert_not_reached();
     }
@@ -479,6 +486,14 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret,
         return;
     }
 
+    /* Use the constant pool, if possible. */
+    if (!in_prologue && USE_REG_TB) {
+        new_pool_label(s, arg, R_SPARC_13, s->code_ptr,
+                       tcg_tbrel_diff(s, NULL));
+        tcg_out32(s, LDX | INSN_RD(ret) | INSN_RS1(TCG_REG_TB));
+        return;
+    }
+
     /* A 64-bit constant decomposed into 2 32-bit pieces.  */
     if (check_fit_i32(lo, 13)) {
         hi = (arg - lo) >> 32;