| /* { 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; |
| } |
| |