Okay I will take a look at this. Michael Collison
> On Jun 30, 2017, at 11:04 AM, Andreas Schwab <sch...@linux-m68k.org> wrote: > >> On Jun 23 2017, Michael Collison <michael.colli...@arm.com> wrote: >> >> diff --git a/gcc/testsuite/gcc.target/aarch64/var_shift_mask_1.c >> b/gcc/testsuite/gcc.target/aarch64/var_shift_mask_1.c >> new file mode 100644 >> index 0000000..e2b020e >> --- /dev/null >> +++ b/gcc/testsuite/gcc.target/aarch64/var_shift_mask_1.c >> @@ -0,0 +1,61 @@ >> +/* { dg-do compile } */ >> +/* { dg-options "-O2" } */ >> + >> +/* The integer variable shift and rotate instructions truncate their >> + shift amounts by the datasize. Make sure that we don't emit a redundant >> + masking operation. */ >> + >> +unsigned >> +f1 (unsigned x, int y) >> +{ >> + return x << (y & 31); >> +} >> + >> +unsigned long >> +f2 (unsigned long x, int y) >> +{ >> + return x << (y & 63); >> +} >> + >> +unsigned long >> +f3 (unsigned long bit_addr, int y) >> +{ >> + unsigned long bitnumb = bit_addr & 63; >> + return (1L << bitnumb); >> +} >> + >> +unsigned int >> +f4 (unsigned int x, unsigned int y) >> +{ >> + y &= 31; >> + return x >> y | (x << (32 - y)); >> +} >> + >> +unsigned long >> +f5 (unsigned long x, unsigned long y) >> +{ >> + y &= 63; >> + return x >> y | (x << (64 - y)); >> +} >> + >> +unsigned long >> +f6 (unsigned long x, unsigned long y) >> +{ >> + >> + return (x << (64 - (y & 63))); >> + >> +} >> + >> +unsigned long >> +f7 (unsigned long x, unsigned long y) >> +{ >> + return (x << -(y & 63)); >> +} >> + >> +/* { dg-final { scan-assembler-times "lsl\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" >> 1 } } */ >> +/* { dg-final { scan-assembler-times "lsl\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" >> 4 } } */ >> +/* { dg-final { scan-assembler-times "ror\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" >> 1 } } */ >> +/* { dg-final { scan-assembler-times "ror\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" >> 1 } } */ >> +/* { dg-final { scan-assembler-not "and\tw\[0-9\]+, w\[0-9\]+, 31" } } */ >> +/* { dg-final { scan-assembler-not "and\tx\[0-9\]+, x\[0-9\]+, 63" } } */ >> +/* { dg-final { scan-assembler-not "sub\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } >> } */ > > That fails with -mabi=ilp32. > > Andreas. > > -- > Andreas Schwab, sch...@linux-m68k.org > GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 > "And now for something completely different."