/* { dg-do run } */ /* { dg-require-effective-target int128 } */ /* { dg-require-effective-target stdint_types } */ /* { dg-options "-Wall" } */ #include <stdint.h> #define MAKE_FUN(suffix, type) \ type my_bswap##suffix(type x) { \ type result = 0; \ int shift; \ for (shift = 0; shift < 8 * sizeof (type); shift += 8) \ { \ result <<= 8; \ result |= (x >> shift) & 0xff; \ } \ return result; \ } \ MAKE_FUN(128, __uint128_t); extern void abort (void); typedef union { struct { uint64_t lo; uint64_t hi; } s; __uint128_t n; } u; #define NUMS128 \ { \ { .s = { 0x0000000000000000ULL, 0x1122334455667788ULL } }, \ { .s = { 0x1122334455667788ULL, 0xffffffffffffffffULL } }, \ { .s = { 0xffffffffffffffffULL, 0x0000000000000000ULL } } \ } u uint128_ts[] = NUMS128; #define N(table) (sizeof (table) / sizeof (table[0])) int main (void) { int i; for (i = 0; i < N(uint128_ts); i++) if (__builtin_bswap128 (uint128_ts[i].n) != my_bswap128 (uint128_ts[i].n)) abort (); return 0; }