/* { 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; __int128 e; int d (u16 g) { u64 f = __builtin_bswap64 (c); f = g == a; #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ __builtin_memmove (&f, &e, 1); #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ __builtin_memmove ((char *) &f + sizeof (f) - 1, (char *) &e + sizeof (e) - 1, 1); #elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__ __builtin_memmove ((char *) &f + sizeof (f) - 2, (char *) &e + sizeof (e) - 2, 1); #else #error "endian unknown?" #endif e >>= b; return a + f; } int main (void) { __int128 x = d (0); if (x != 0) __builtin_abort (); return 0; }