diff options
author | Tamar Christina <tamar.christina@arm.com> | 2021-11-04 17:32:09 +0000 |
---|---|---|
committer | Tamar Christina <tamar.christina@arm.com> | 2021-11-04 17:32:09 +0000 |
commit | d70720c2382e687e192a9d666e80acb41bfda856 (patch) | |
tree | af6adf8a4e4441b83b55e63e81b52026d4ca02ad /gcc/DATESTAMP | |
parent | 004afb984beb6efbe25f44a5857b1c27ebc2ec82 (diff) | |
download | gcc-d70720c2382e687e192a9d666e80acb41bfda856.zip gcc-d70720c2382e687e192a9d666e80acb41bfda856.tar.gz gcc-d70720c2382e687e192a9d666e80acb41bfda856.tar.bz2 |
middle-end: convert negate + right shift into compare greater.
This turns an inversion of the sign bit + arithmetic right shift into a
comparison with 0.
i.e.
void fun1(int32_t *x, int n)
{
for (int i = 0; i < (n & -16); i++)
x[i] = (-x[i]) >> 31;
}
now generates:
.L3:
ldr q0, [x0]
cmgt v0.4s, v0.4s, #0
str q0, [x0], 16
cmp x0, x1
bne .L3
instead of:
.L3:
ldr q0, [x0]
neg v0.4s, v0.4s
sshr v0.4s, v0.4s, 31
str q0, [x0], 16
cmp x0, x1
bne .L3
gcc/ChangeLog:
* match.pd: New negate+shift pattern.
gcc/testsuite/ChangeLog:
* gcc.dg/signbit-2.c: New test.
* gcc.dg/signbit-3.c: New test.
* gcc.dg/signbit-4.c: New test.
* gcc.dg/signbit-5.c: New test.
* gcc.dg/signbit-6.c: New test.
* gcc.target/aarch64/signbit-1.c: New test.
Diffstat (limited to 'gcc/DATESTAMP')
0 files changed, 0 insertions, 0 deletions