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>
(cherry picked from commit 2911e9b)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
(Mjt: trivial context fixup in tests/tcg/aarch64/Makefile.target)
  • Loading branch information
rth7680 authored and Michael Tokarev committed Apr 5, 2024
1 parent 55ec0bf commit 469af45
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 @@ -1907,7 +1907,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
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 469af45

Please sign in to comment.