1 /* { dg-do run { target { powerpc*-*-* && lp64 } } } */
2 /* { dg-options "-O2 -fno-inline" } */
3 
4 union U {
5   __int128 i128;
6   struct {
7     long l1;
8     long l2;
9   } s;
10 };
11 
12 union U u1,u2;
13 
14 __int128
create_128(long most_sig,long least_sig)15 create_128 (long most_sig, long least_sig)
16 {
17   union U u;
18 
19 #if __LITTLE_ENDIAN__
20   u.s.l1 = least_sig;
21   u.s.l2 = most_sig;
22 #else
23   u.s.l1 = most_sig;
24   u.s.l2 = least_sig;
25 #endif
26   return u.i128;
27 }
28 
most_sig(union U * u)29 long most_sig (union U * u)
30 {
31 #if __LITTLE_ENDIAN__
32   return (*u).s.l2;
33 #else
34   return (*u).s.l1;
35 #endif
36 }
37 
least_sig(union U * u)38 long least_sig (union U * u)
39 {
40 #if __LITTLE_ENDIAN__
41   return (*u).s.l1;
42 #else
43   return (*u).s.l2;
44 #endif
45 }
46 
47 __int128
add_128(__int128 * ptr,__int128 val)48 add_128 (__int128 *ptr, __int128 val)
49 {
50 	return (*ptr + val);
51 }
52 
53 __int128
sub_128(__int128 * ptr,__int128 val)54 sub_128 (__int128 *ptr, __int128 val)
55 {
56 	return (*ptr - val);
57 }
58 
59 int
main(void)60 main (void)
61 {
62   /* Do a simple add/sub to make sure carry is happening between the dwords
63      and that dwords are in correct endian order. */
64   u1.i128 = create_128 (1, -1);
65   u2.i128 = add_128 (&u1.i128, 1);
66   if ((most_sig (&u2) != 2) || (least_sig (&u2) != 0))
67     __builtin_abort ();
68   u2.i128 = sub_128 (&u2.i128, 1);
69   if ((most_sig (&u2) != 1) || (least_sig (&u2) != -1))
70     __builtin_abort ();
71   return 0;
72 }
73 
74