@@ -722,6 +722,17 @@ static void tcg_out_call(TCGContext *s, tcg_target_long arg,
#else
TCGReg reg = arg;
if (const_arg) {
+ uintptr_t tgt = ((uintptr_t *)arg)[0];
+ uintptr_t toc = ((uintptr_t *)arg)[1];
+
+ /* Look through the function descriptor, if profitable. */
+ if (tgt == (int32_t)tgt && toc == (int32_t)toc) {
+ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, toc);
+ tcg_out_b(s, lk, tgt);
+ return;
+ }
+
+ /* Avoid generating two full 64-bit constants. */
reg = TCG_REG_R2;
tcg_out_movi(s, TCG_TYPE_I64, reg, arg);
}
Loading 32-bit immediates instead of memory will be faster. Don't attempt to generate full 64-bit immediates. Signed-off-by: Richard Henderson <rth@twiddle.net> --- tcg/ppc64/tcg-target.c | 11 +++++++++++ 1 file changed, 11 insertions(+)