| /* PR target/85582 */ |
| |
| #ifdef __SIZEOF_INT128__ |
| typedef __int128 S; |
| typedef unsigned __int128 U; |
| #else |
| typedef long long S; |
| typedef unsigned long long U; |
| #endif |
| |
| __attribute__((noipa)) U |
| f1 (U x, int y) |
| { |
| return x << (y & -2); |
| } |
| |
| __attribute__((noipa)) S |
| f2 (S x, int y) |
| { |
| return x >> (y & -2); |
| } |
| |
| __attribute__((noipa)) U |
| f3 (U x, int y) |
| { |
| return x >> (y & -2); |
| } |
| |
| int |
| main () |
| { |
| U a = (U) 1 << (sizeof (U) * __CHAR_BIT__ - 7); |
| if (f1 (a, 5) != ((U) 1 << (sizeof (S) * __CHAR_BIT__ - 3))) |
| __builtin_abort (); |
| S b = (U) 0x101 << (sizeof (S) * __CHAR_BIT__ / 2 - 7); |
| if (f1 (b, sizeof (S) * __CHAR_BIT__ / 2) != (U) 0x101 << (sizeof (S) * __CHAR_BIT__ - 7)) |
| __builtin_abort (); |
| if (f1 (b, sizeof (S) * __CHAR_BIT__ / 2 + 2) != (U) 0x101 << (sizeof (S) * __CHAR_BIT__ - 5)) |
| __builtin_abort (); |
| S c = (U) 1 << (sizeof (S) * __CHAR_BIT__ - 1); |
| if ((U) f2 (c, 5) != ((U) 0x1f << (sizeof (S) * __CHAR_BIT__ - 5))) |
| __builtin_abort (); |
| if ((U) f2 (c, sizeof (S) * __CHAR_BIT__ / 2) != ((U) -1 << (sizeof (S) * __CHAR_BIT__ / 2 - 1))) |
| __builtin_abort (); |
| if ((U) f2 (c, sizeof (S) * __CHAR_BIT__ / 2 + 2) != ((U) -1 << (sizeof (S) * __CHAR_BIT__ / 2 - 3))) |
| __builtin_abort (); |
| U d = (U) 1 << (sizeof (S) * __CHAR_BIT__ - 1); |
| if (f3 (c, 5) != ((U) 0x1 << (sizeof (S) * __CHAR_BIT__ - 5))) |
| __builtin_abort (); |
| if (f3 (c, sizeof (S) * __CHAR_BIT__ / 2) != ((U) 1 << (sizeof (S) * __CHAR_BIT__ / 2 - 1))) |
| __builtin_abort (); |
| if (f3 (c, sizeof (S) * __CHAR_BIT__ / 2 + 2) != ((U) 1 << (sizeof (S) * __CHAR_BIT__ / 2 - 3))) |
| __builtin_abort (); |
| return 0; |
| } |