diff options
author | Richard Henderson | 2021-08-05 03:34:20 +0200 |
---|---|---|
committer | Richard Henderson | 2022-02-08 23:00:00 +0100 |
commit | c834b8d81b0ee597d185a4d8127dfc76230307c8 (patch) | |
tree | 83e27a87d025864b2c90701724fc1f045a86e841 | |
parent | tcg/sparc: Convert patch_reloc to return bool (diff) | |
download | qemu-c834b8d81b0ee597d185a4d8127dfc76230307c8.tar.gz qemu-c834b8d81b0ee597d185a4d8127dfc76230307c8.tar.xz qemu-c834b8d81b0ee597d185a4d8127dfc76230307c8.zip |
tcg/sparc: Use the constant pool for 64-bit constants
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
-rw-r--r-- | tcg/sparc/tcg-target.c.inc | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index 213aba4be6..e78945d153 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -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; |