From ed605126a8d826e60587cc21d9e7b95e8c49b6f6 Mon Sep 17 00:00:00 2001 From: Aurelien Jarno Date: Sun, 21 Apr 2013 00:42:56 +0200 Subject: tcg: fix deposit_i64 op on 32-bit targets On 32-bit TCG targets, when emulating deposit_i64 with a mov_i32 + deposit_i32, care should be taken to not overwrite the low part of the second argument before the deposit when it is the same the destination. This fixes the shld instruction in qemu-system-x86_64, which in turns fixes booting "system rescue CD version 2.8.0" on this target. Reported-by: Michael S. Tsirkin Reviewed-by: Richard Henderson Signed-off-by: Aurelien Jarno --- tcg/tcg-op.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tcg/tcg-op.h') diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h index d70b2eba33..94f6043786 100644 --- a/tcg/tcg-op.h +++ b/tcg/tcg-op.h @@ -2188,9 +2188,9 @@ static inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1, #if TCG_TARGET_REG_BITS == 32 if (ofs >= 32) { - tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg1)); tcg_gen_deposit_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_LOW(arg2), ofs - 32, len); + tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg1)); return; } if (ofs + len <= 32) { -- cgit v1.2.3