blob: b9c03300d8463ed8f9090b13847951ad536704f2 [file] [log] [blame]
/* { dg-do run { target { powerpc*-*-* && lp64 } } } */
/* { dg-options "-O2 -fno-inline" } */
union U {
__int128 i128;
struct {
long l1;
long l2;
} s;
};
union U u1,u2;
__int128
create_128 (long most_sig, long least_sig)
{
union U u;
#if __LITTLE_ENDIAN__
u.s.l1 = least_sig;
u.s.l2 = most_sig;
#else
u.s.l1 = most_sig;
u.s.l2 = least_sig;
#endif
return u.i128;
}
long most_sig (union U * u)
{
#if __LITTLE_ENDIAN__
return (*u).s.l2;
#else
return (*u).s.l1;
#endif
}
long least_sig (union U * u)
{
#if __LITTLE_ENDIAN__
return (*u).s.l1;
#else
return (*u).s.l2;
#endif
}
__int128
add_128 (__int128 *ptr, __int128 val)
{
return (*ptr + val);
}
__int128
sub_128 (__int128 *ptr, __int128 val)
{
return (*ptr - val);
}
int
main (void)
{
/* Do a simple add/sub to make sure carry is happening between the dwords
and that dwords are in correct endian order. */
u1.i128 = create_128 (1, -1);
u2.i128 = add_128 (&u1.i128, 1);
if ((most_sig (&u2) != 2) || (least_sig (&u2) != 0))
__builtin_abort ();
u2.i128 = sub_128 (&u2.i128, 1);
if ((most_sig (&u2) != 1) || (least_sig (&u2) != -1))
__builtin_abort ();
return 0;
}