49 lines
1.8 KiB
Diff
49 lines
1.8 KiB
Diff
|
From 4a886245fce97b79af5841d6b0849124c8d30243 Mon Sep 17 00:00:00 2001
|
||
|
From: Peter Maydell <peter.maydell@linaro.org>
|
||
|
Date: Wed, 8 Apr 2015 20:57:09 +0100
|
||
|
Subject: [PATCH] tcg/tcg-op.c: Fix ld/st of 64 bit values on 32-bit bigendian
|
||
|
hosts
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
Commit 951c6300f7 out-of-lined the 32-bit-host versions of
|
||
|
tcg_gen_{ld,st}_i64, but in the process it inadvertently changed
|
||
|
an #ifdef HOST_WORDS_BIGENDIAN to #ifdef TCG_TARGET_WORDS_BIGENDIAN.
|
||
|
Since the latter doesn't get defined anywhere this meant we always
|
||
|
took the "LE host" codepath, and stored the two halves of the value
|
||
|
in the wrong order on BE hosts. This typically breaks any 64-bit
|
||
|
guest on a 32-bit BE host completely, and will have possibly more
|
||
|
subtle effects even for 32-bit guests.
|
||
|
|
||
|
Switch the ifdef back to HOST_WORDS_BIGENDIAN.
|
||
|
|
||
|
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||
|
---
|
||
|
tcg/tcg-op.c | 4 ++--
|
||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
|
||
|
index f7a2767..2b6be75 100644
|
||
|
--- a/tcg/tcg-op.c
|
||
|
+++ b/tcg/tcg-op.c
|
||
|
@@ -808,7 +808,7 @@ void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset)
|
||
|
{
|
||
|
/* Since arg2 and ret have different types,
|
||
|
they cannot be the same temporary */
|
||
|
-#ifdef TCG_TARGET_WORDS_BIGENDIAN
|
||
|
+#ifdef HOST_WORDS_BIGENDIAN
|
||
|
tcg_gen_ld_i32(TCGV_HIGH(ret), arg2, offset);
|
||
|
tcg_gen_ld_i32(TCGV_LOW(ret), arg2, offset + 4);
|
||
|
#else
|
||
|
@@ -819,7 +819,7 @@ void tcg_gen_ld_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset)
|
||
|
|
||
|
void tcg_gen_st_i64(TCGv_i64 arg1, TCGv_ptr arg2, tcg_target_long offset)
|
||
|
{
|
||
|
-#ifdef TCG_TARGET_WORDS_BIGENDIAN
|
||
|
+#ifdef HOST_WORDS_BIGENDIAN
|
||
|
tcg_gen_st_i32(TCGV_HIGH(arg1), arg2, offset);
|
||
|
tcg_gen_st_i32(TCGV_LOW(arg1), arg2, offset + 4);
|
||
|
#else
|