tcg/ppc: Use ADDPCIS in tcg_out_movi_int
authorRichard Henderson <richard.henderson@linaro.org>
Tue, 15 Aug 2023 17:19:37 +0000 (17:19 +0000)
committerRichard Henderson <richard.henderson@linaro.org>
Sun, 22 Oct 2023 23:32:27 +0000 (16:32 -0700)
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
tcg/ppc/tcg-target.c.inc

index b0b8cd2390fcb32123d7e1cd97c26f49ba6a0d19..226b5598ac7e3ddf81257d42da7da5aafe664ce8 100644 (file)
@@ -1055,6 +1055,19 @@ static void tcg_out_movi_int(TCGContext *s, TCGType type, TCGReg ret,
         return;
     }
 
+    /* Load addresses within 2GB with 2 insns. */
+    if (have_isa_3_00) {
+        intptr_t hi = tcg_pcrel_diff(s, (void *)arg) - 4;
+        int16_t lo = hi;
+
+        hi -= lo;
+        if (hi == (int32_t)hi) {
+            tcg_out_addpcis(s, TCG_REG_TMP2, hi);
+            tcg_out32(s, ADDI | TAI(ret, TCG_REG_TMP2, lo));
+            return;
+        }
+    }
+
     /* Load addresses within 2GB of TB with 2 (or rarely 3) insns.  */
     if (!in_prologue && USE_REG_TB && tb_diff == (int32_t)tb_diff) {
         tcg_out_mem_long(s, ADDI, ADD, ret, TCG_REG_TB, tb_diff);