This patch improves code generation for shifts with subtract instructions where the first operand to the subtract is equal to the bit-size of the operation.
long f1(long x, int i)
{
return x >> (64 - i);
}
int f2(int x, int i)
{
return x << (32 - i);
}
With trunk at -O2 we generate:
f1:
mov w2, 64
sub w1, w2, w1
asr x0, x0, x1
ret
f2:
mov w2, 32
sub w1, w2, w1
lsl w0, w0, w1
ret
with the patch we generate:
f1:
neg w2, w1
asr x0, x0, x2
ret
.size f1, .-f1
.align 2
.p2align 3,,7
.global f2
.type f2, %function
f2:
neg w2, w1
lsl w0, w0, w2
ret
Okay for trunk?
2017-08-07 Michael Collison <[email protected]>
* config/aarch64/aarch64.md (*aarch64_reg_<optab>_minus<mode>3):
New pattern.
2016-08-07 Michael Collison <[email protected]>
* gcc.target/aarch64/var_shift_mask_2.c: New test.
pr7313v6.patch
Description: pr7313v6.patch
