| /* { dg-do run { target int128 } } */ |
| /* { dg-additional-options "-fgcse-after-reload" } */ |
| |
| typedef unsigned char u8; |
| typedef unsigned short u16; |
| typedef unsigned int u32; |
| typedef unsigned long long u64; |
| int a, b, c; |
| int |
| d (u16 e, u64 f) |
| { |
| b |= e; |
| #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
| __builtin_memset (&f, e, 2); |
| #elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ \ |
| || __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__) |
| __builtin_memset ((char *) &f + sizeof (f) - 2, e, 2); |
| #else |
| #error "endian unknown?" |
| #endif |
| a = (u16) - e >= 2 ? : __builtin_popcountll (f); |
| return a + c; |
| } |
| |
| int |
| main (void) |
| { |
| __int128 x = d (~0, 0); |
| if (x != 16) |
| __builtin_abort (); |
| return 0; |
| } |