Skip to content

Commit

Permalink
tcg/optimize: Fix sign_mask for logical right-shift
Browse files Browse the repository at this point in the history
The 'sign' computation is attempting to locate the sign bit that has
been repeated, so that we can test if that bit is known zero.  That
computation can be zero if there are no known sign repetitions.

Cc: qemu-stable@nongnu.org
Fixes: 93a967f ("tcg/optimize: Propagate sign info for shifting")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2248
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
  • Loading branch information
rth7680 committed Mar 29, 2024
1 parent 889cd5a commit 2911e9b
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
2 changes: 1 addition & 1 deletion tcg/optimize.c
Original file line number Diff line number Diff line change
Expand Up @@ -2376,7 +2376,7 @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
* will not reduced the number of input sign repetitions.
*/
sign = (s_mask & -s_mask) >> 1;
if (!(z_mask & sign)) {
if (sign && !(z_mask & sign)) {
ctx->s_mask = s_mask;
}
break;
Expand Down
1 change: 1 addition & 0 deletions tests/tcg/aarch64/Makefile.target
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ VPATH += $(AARCH64_SRC)

# Base architecture tests
AARCH64_TESTS=fcvt pcalign-a64 lse2-fault
AARCH64_TESTS += test-2248

fcvt: LDFLAGS+=-lm

Expand Down
28 changes: 28 additions & 0 deletions tests/tcg/aarch64/test-2248.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See https://gitlab.com/qemu-project/qemu/-/issues/2248 */

#include <assert.h>

__attribute__((noinline))
long test(long x, long y, long sh)
{
long r;
asm("cmp %1, %2\n\t"
"cset x12, lt\n\t"
"and w11, w12, #0xff\n\t"
"cmp w11, #0\n\t"
"csetm x14, ne\n\t"
"lsr x13, x14, %3\n\t"
"sxtb %0, w13"
: "=r"(r)
: "r"(x), "r"(y), "r"(sh)
: "x11", "x12", "x13", "x14");
return r;
}

int main()
{
long r = test(0, 1, 2);
assert(r == -1);
return 0;
}

0 comments on commit 2911e9b

Please sign in to comment.