1 /* { dg-do run { target int128 } } */ 2 /* { dg-additional-options "-fgcse-after-reload" } */ 3 4 typedef unsigned char u8; 5 typedef unsigned short u16; 6 typedef unsigned int u32; 7 typedef unsigned long long u64; 8 int a, b, c; 9 int d(u16 e,u64 f)10d (u16 e, u64 f) 11 { 12 b |= e; 13 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 14 __builtin_memset (&f, e, 2); 15 #elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ \ 16 || __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__) 17 __builtin_memset ((char *) &f + sizeof (f) - 2, e, 2); 18 #else 19 #error "endian unknown?" 20 #endif 21 a = (u16) - e >= 2 ? : __builtin_popcountll (f); 22 return a + c; 23 } 24 25 int main(void)26main (void) 27 { 28 __int128 x = d (~0, 0); 29 if (x != 16) 30 __builtin_abort (); 31 return 0; 32 } 33