1/* { dg-require-effective-target int32plus } */
2
3/* Test arithmetics on bitfields.  */
4
5extern void abort (void);
6extern void exit (int);
7
8unsigned int
9myrnd (void)
10{
11  static unsigned int s = 1388815473;
12  s *= 1103515245;
13  s += 12345;
14  return (s / 65536) % 2048;
15}
16
17#define T(S)					\
18struct S s##S;					\
19struct S retme##S (struct S x)			\
20{						\
21  return x;					\
22}						\
23						\
24unsigned int fn1##S (unsigned int x)		\
25{						\
26  struct S y = s##S;				\
27  y.k += x;					\
28  y = retme##S (y);				\
29  return y.k;					\
30}						\
31						\
32unsigned int fn2##S (unsigned int x)		\
33{						\
34  struct S y = s##S;				\
35  y.k += x;					\
36  y.k %= 15;					\
37  return y.k;					\
38}						\
39						\
40unsigned int retit##S (void)			\
41{						\
42  return s##S.k;				\
43}						\
44						\
45unsigned int fn3##S (unsigned int x)		\
46{						\
47  s##S.k += x;					\
48  return retit##S ();				\
49}						\
50						\
51void test##S (void)				\
52{						\
53  int i;					\
54  unsigned int mask, v, a, r;			\
55  struct S x;					\
56  char *p = (char *) &s##S;			\
57  for (i = 0; i < sizeof (s##S); ++i)		\
58    *p++ = myrnd ();				\
59  if (__builtin_classify_type (s##S.l) == 8)	\
60    s##S.l = 5.25;				\
61  s##S.k = -1;					\
62  mask = s##S.k;				\
63  v = myrnd ();					\
64  a = myrnd ();					\
65  s##S.k = v;					\
66  x = s##S;					\
67  r = fn1##S (a);				\
68  if (x.i != s##S.i || x.j != s##S.j		\
69      || x.k != s##S.k || x.l != s##S.l		\
70      || ((v + a) & mask) != r)			\
71    abort ();					\
72  v = myrnd ();					\
73  a = myrnd ();					\
74  s##S.k = v;					\
75  x = s##S;					\
76  r = fn2##S (a);				\
77  if (x.i != s##S.i || x.j != s##S.j		\
78      || x.k != s##S.k || x.l != s##S.l		\
79      || ((((v + a) & mask) % 15) & mask) != r)	\
80    abort ();					\
81  v = myrnd ();					\
82  a = myrnd ();					\
83  s##S.k = v;					\
84  x = s##S;					\
85  r = fn3##S (a);				\
86  if (x.i != s##S.i || x.j != s##S.j		\
87      || s##S.k != r || x.l != s##S.l		\
88      || ((v + a) & mask) != r)			\
89    abort ();					\
90}
91
92struct A { unsigned int i : 6, l : 1, j : 10, k : 15; }; T(A)
93struct B { unsigned int i : 6, j : 11, k : 15; unsigned int l; }; T(B)
94struct C { unsigned int l; unsigned int i : 6, j : 11, k : 15; }; T(C)
95struct D { unsigned long long l : 6, i : 6, j : 23, k : 29; }; T(D)
96struct E { unsigned long long l, i : 12, j : 23, k : 29; }; T(E)
97struct F { unsigned long long i : 12, j : 23, k : 29, l; }; T(F)
98struct G { unsigned int i : 12, j : 13, k : 7; unsigned long long l; }; T(G)
99struct H { unsigned int i : 12, j : 11, k : 9; unsigned long long l; }; T(H)
100struct I { unsigned short i : 1, j : 6, k : 9; unsigned long long l; }; T(I)
101struct J { unsigned short i : 1, j : 8, k : 7; unsigned short l; }; T(J)
102struct K { unsigned int k : 6, l : 1, j : 10, i : 15; }; T(K)
103struct L { unsigned int k : 6, j : 11, i : 15; unsigned int l; }; T(L)
104struct M { unsigned int l; unsigned int k : 6, j : 11, i : 15; }; T(M)
105struct N { unsigned long long l : 6, k : 6, j : 23, i : 29; }; T(N)
106struct O { unsigned long long l, k : 12, j : 23, i : 29; }; T(O)
107struct P { unsigned long long k : 12, j : 23, i : 29, l; }; T(P)
108struct Q { unsigned int k : 12, j : 13, i : 7; unsigned long long l; }; T(Q)
109struct R { unsigned int k : 12, j : 11, i : 9; unsigned long long l; }; T(R)
110struct S { unsigned short k : 1, j : 6, i : 9; unsigned long long l; }; T(S)
111struct T { unsigned short k : 1, j : 8, i : 7; unsigned short l; }; T(T)
112struct U { unsigned short j : 6, k : 1, i : 9; unsigned long long l; }; T(U)
113struct V { unsigned short j : 8, k : 1, i : 7; unsigned short l; }; T(V)
114struct W { long double l; unsigned int k : 12, j : 13, i : 7; }; T(W)
115struct X { unsigned int k : 12, j : 13, i : 7; long double l; }; T(X)
116struct Y { unsigned int k : 12, j : 11, i : 9; long double l; }; T(Y)
117struct Z { long double l; unsigned int j : 13, i : 7, k : 12; }; T(Z)
118
119int
120main (void)
121{
122  testA ();
123  testB ();
124  testC ();
125  testD ();
126  testE ();
127  testF ();
128  testG ();
129  testH ();
130  testI ();
131  testJ ();
132  testK ();
133  testL ();
134  testM ();
135  testN ();
136  testO ();
137  testP ();
138  testQ ();
139  testR ();
140  testS ();
141  testT ();
142  testU ();
143  testV ();
144  testW ();
145  testX ();
146  testY ();
147  testZ ();
148  exit (0);
149}
150