From b2d75f49553c81190a22ce2edf453b2acc312b7a Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 8 Aug 2019 19:24:58 -0400 Subject: [PATCH] tcg: Fix constant folding of INDEX_op_extract2_i32 On a 64-bit host, discard any replications of the 32-bit sign bit when performing the shift and merge. Backports commit 80f4d7c3ae216c191fb403e149bcba88d6aa40bb from qemu --- qemu/tcg/optimize.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qemu/tcg/optimize.c b/qemu/tcg/optimize.c index 6483bcf8..8ae4922f 100644 --- a/qemu/tcg/optimize.c +++ b/qemu/tcg/optimize.c @@ -1213,8 +1213,8 @@ void tcg_optimize(TCGContext *s) if (opc == INDEX_op_extract2_i64) { tmp = (v1 >> op->args[3]) | (v2 << (64 - op->args[3])); } else { - tmp = (v1 >> op->args[3]) | (v2 << (32 - op->args[3])); - tmp = (int32_t)tmp; + tmp = (int32_t)(((uint32_t)v1 >> op->args[3]) | + ((uint32_t)v2 << (32 - op->args[3]))); } tcg_opt_gen_movi(s, op, op->args[0], tmp); break;