diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2021-08-05 04:34:20 +0300 |
---|---|---|
committer | Richard Henderson <richard.henderson@linaro.org> | 2022-02-09 09:00:00 +1100 |
commit | c834b8d81b0ee597d185a4d8127dfc76230307c8 (patch) | |
tree | 83e27a87d025864b2c90701724fc1f045a86e841 /tcg | |
parent | 6a6bfa3c60ba70e870f8355b9d3508915c90c13a (diff) | |
download | qemu-c834b8d81b0ee597d185a4d8127dfc76230307c8.zip qemu-c834b8d81b0ee597d185a4d8127dfc76230307c8.tar.gz qemu-c834b8d81b0ee597d185a4d8127dfc76230307c8.tar.bz2 |
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>
Diffstat (limited to 'tcg')
-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 213aba4..e78945d 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; |