65 lines
3.0 KiB
Diff
65 lines
3.0 KiB
Diff
From 0b95df52ecad351c916108e9f3a9d1bc3327b495 Mon Sep 17 00:00:00 2001
|
|
From: Aurelien Jarno <aurelien@aurel32.net>
|
|
Date: Sat, 8 Sep 2012 03:45:43 +0000
|
|
Subject: [PATCH] tcg/s390: fix ld/st with CONFIG_TCG_PASS_AREG0
|
|
|
|
The load/store slow path has been broken in e141ab52d:
|
|
- We need to move 4 registers for store functions and 3 registers for
|
|
load functions and not the reverse.
|
|
- According to the s390x calling convention the arguments of a function
|
|
should be zero extended. This means that the register shift should be
|
|
done with TCG_TYPE_I64 to ensure the higher word is correctly zero
|
|
extended when needed.
|
|
|
|
I am aware that CONFIG_TCG_PASS_AREG0 is being removed and thus that
|
|
this patch can be improved, but doing so means it can also be applied to
|
|
the 1.1 and 1.2 stable branches.
|
|
|
|
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
|
|
---
|
|
tcg/s390/tcg-target.c | 14 +++++++-------
|
|
1 file changed, 7 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/tcg/s390/tcg-target.c b/tcg/s390/tcg-target.c
|
|
index 04662c1..99b5339 100644
|
|
--- a/tcg/s390/tcg-target.c
|
|
+++ b/tcg/s390/tcg-target.c
|
|
@@ -1509,11 +1509,13 @@ static void tcg_prepare_qemu_ldst(TCGContext* s, TCGReg data_reg,
|
|
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R4, mem_index);
|
|
#ifdef CONFIG_TCG_PASS_AREG0
|
|
/* XXX/FIXME: suboptimal */
|
|
- tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[2],
|
|
+ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[3],
|
|
+ tcg_target_call_iarg_regs[2]);
|
|
+ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[2],
|
|
tcg_target_call_iarg_regs[1]);
|
|
- tcg_out_mov(s, TCG_TYPE_TL, tcg_target_call_iarg_regs[1],
|
|
+ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[1],
|
|
tcg_target_call_iarg_regs[0]);
|
|
- tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0],
|
|
+ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[0],
|
|
TCG_AREG0);
|
|
#endif
|
|
tgen_calli(s, (tcg_target_ulong)qemu_st_helpers[s_bits]);
|
|
@@ -1521,13 +1523,11 @@ static void tcg_prepare_qemu_ldst(TCGContext* s, TCGReg data_reg,
|
|
tcg_out_movi(s, TCG_TYPE_I32, arg1, mem_index);
|
|
#ifdef CONFIG_TCG_PASS_AREG0
|
|
/* XXX/FIXME: suboptimal */
|
|
- tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3],
|
|
- tcg_target_call_iarg_regs[2]);
|
|
tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[2],
|
|
tcg_target_call_iarg_regs[1]);
|
|
- tcg_out_mov(s, TCG_TYPE_TL, tcg_target_call_iarg_regs[1],
|
|
+ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[1],
|
|
tcg_target_call_iarg_regs[0]);
|
|
- tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0],
|
|
+ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[0],
|
|
TCG_AREG0);
|
|
#endif
|
|
tgen_calli(s, (tcg_target_ulong)qemu_ld_helpers[s_bits]);
|
|
--
|
|
1.7.12.1
|
|
|