| /* { dg-do run } */ |
| /* { dg-options "-O2 -save-temps" } */ |
| |
| extern void abort (void); |
| |
| #define GEN_TEST_CASE(x, y, z)\ |
| __uint128_t __attribute__ ((noinline))\ |
| ushift_##x##_##z (unsigned y data)\ |
| {\ |
| return (__uint128_t) data << x;\ |
| }\ |
| __int128_t __attribute__ ((noinline)) \ |
| shift_##x##_##z (y data) \ |
| {\ |
| return (__int128_t) data << x;\ |
| } |
| |
| GEN_TEST_CASE (53, int, i) |
| GEN_TEST_CASE (3, long long, ll) |
| GEN_TEST_CASE (13, long long, ll) |
| GEN_TEST_CASE (53, long long, ll) |
| |
| int |
| main (int argc, char **argv) |
| { |
| |
| #define SHIFT_CHECK(x, y, z, p) \ |
| if (ushift_##y##_##p (x)\ |
| != ((__uint128_t) (unsigned z) x << y)) \ |
| abort ();\ |
| if (shift_##y##_##p (x)\ |
| != ((__uint128_t) (signed z) x << y)) \ |
| abort (); |
| |
| SHIFT_CHECK (0x12345678, 53, int, i) |
| SHIFT_CHECK (0xcafecafe, 53, int, i) |
| |
| SHIFT_CHECK (0x1234567890abcdefLL, 3, long long, ll) |
| SHIFT_CHECK (0x1234567890abcdefLL, 13, long long, ll) |
| SHIFT_CHECK (0x1234567890abcdefLL, 53, long long, ll) |
| SHIFT_CHECK (0xcafecafedeaddeadLL, 3, long long, ll) |
| SHIFT_CHECK (0xcafecafedeaddeadLL, 13, long long, ll) |
| SHIFT_CHECK (0xcafecafedeaddeadLL, 53, long long, ll) |
| |
| return 0; |
| } |
| |
| /* { dg-final { scan-assembler-times "asr" 3 } } */ |
| /* { dg-final { scan-assembler-not "extr\t" } } */ |