
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: 93a967fbb57 ("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>
29 lines
596 B
C
29 lines
596 B
C
/* 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;
|
|
}
|