51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
/* { 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;
|
|
}
|