1 /* { dg-require-effective-target int32plus } */
2 
3 /* Test arithmetics on bitfields.  */
4 #ifndef T
5 
6 extern void abort (void);
7 extern void exit (int);
8 
9 #ifndef FIELDS1
10 #define FIELDS1
11 #endif
12 #ifndef FIELDS2
13 #define FIELDS2
14 #endif
15 
16 struct { FIELDS1 unsigned int i : 6, j : 11, k : 15; FIELDS2 } b;
17 struct { FIELDS1 unsigned int i : 5, j : 1, k : 26; FIELDS2 } c;
18 struct { FIELDS1 unsigned int i : 16, j : 8, k : 8; FIELDS2 } d;
19 
ret1(void)20 unsigned int ret1 (void) { return b.i; }
ret2(void)21 unsigned int ret2 (void) { return b.j; }
ret3(void)22 unsigned int ret3 (void) { return b.k; }
ret4(void)23 unsigned int ret4 (void) { return c.i; }
ret5(void)24 unsigned int ret5 (void) { return c.j; }
ret6(void)25 unsigned int ret6 (void) { return c.k; }
ret7(void)26 unsigned int ret7 (void) { return d.i; }
ret8(void)27 unsigned int ret8 (void) { return d.j; }
ret9(void)28 unsigned int ret9 (void) { return d.k; }
29 
30 #define T(n, pre, post, op) 					\
31 void fn1_##n (unsigned int x) { pre b.i post; }			\
32 void fn2_##n (unsigned int x) { pre b.j post; }			\
33 void fn3_##n (unsigned int x) { pre b.k post; }			\
34 void fn4_##n (unsigned int x) { pre c.i post; }			\
35 void fn5_##n (unsigned int x) { pre c.j post; }			\
36 void fn6_##n (unsigned int x) { pre c.k post; }			\
37 void fn7_##n (unsigned int x) { pre d.i post; }			\
38 void fn8_##n (unsigned int x) { pre d.j post; }			\
39 void fn9_##n (unsigned int x) { pre d.k post; }
40 
41 #include "20040629-1.c"
42 #undef T
43 
44 #define FAIL(n, i) abort ()
45 
46 int
main(void)47 main (void)
48 {
49 #define T(n, pre, post, op)					\
50   b.i = 51;							\
51   b.j = 636;							\
52   b.k = 31278;							\
53   c.i = 21;							\
54   c.j = 1;							\
55   c.k = 33554432;						\
56   d.i = 26812;							\
57   d.j = 156;							\
58   d.k = 187;							\
59   fn1_##n (3);							\
60   if (ret1 () != (op (51, 3) & ((1 << 6) - 1)))			\
61     FAIL (n, 1);						\
62   b.i = 51;							\
63   fn2_##n (251);						\
64   if (ret2 () != (op (636, 251) & ((1 << 11) - 1)))		\
65     FAIL (n, 2);						\
66   b.j = 636;							\
67   fn3_##n (13279);						\
68   if (ret3 () != (op (31278, 13279) & ((1 << 15) - 1)))		\
69     FAIL (n, 3);						\
70   b.j = 31278;							\
71   fn4_##n (24);							\
72   if (ret4 () != (op (21, 24) & ((1 << 5) - 1)))		\
73     FAIL (n, 4);						\
74   c.i = 21;							\
75   fn5_##n (1);							\
76   if (ret5 () != (op (1, 1) & ((1 << 1) - 1)))			\
77     FAIL (n, 5);						\
78   c.j = 1;							\
79   fn6_##n (264151);						\
80   if (ret6 () != (op (33554432, 264151) & ((1 << 26) - 1)))	\
81     FAIL (n, 6);						\
82   c.k = 33554432;						\
83   fn7_##n (713);						\
84   if (ret7 () != (op (26812, 713) & ((1 << 16) - 1)))		\
85     FAIL (n, 7);						\
86   d.i = 26812;							\
87   fn8_##n (17);							\
88   if (ret8 () != (op (156, 17) & ((1 << 8) - 1)))		\
89     FAIL (n, 8);						\
90   d.j = 156;							\
91   fn9_##n (199);						\
92   if (ret9 () != (op (187, 199) & ((1 << 8) - 1)))		\
93     FAIL (n, 9);						\
94   d.k = 187;
95 
96 #include "20040629-1.c"
97 #undef T
98   return 0;
99 }
100 
101 #else
102 
103 #ifndef opadd
104 #define opadd(x, y) (x + y)
105 #define opsub(x, y) (x - y)
106 #define opinc(x, y) (x + 1)
107 #define opdec(x, y) (x - 1)
108 #define opand(x, y) (x & y)
109 #define opior(x, y) (x | y)
110 #define opxor(x, y) (x ^ y)
111 #define opdiv(x, y) (x / y)
112 #define oprem(x, y) (x % y)
113 #define opadd3(x, y) (x + 3)
114 #define opsub7(x, y) (x - 7)
115 #define opand21(x, y) (x & 21)
116 #define opior19(x, y) (x | 19)
117 #define opxor37(x, y) (x ^ 37)
118 #define opdiv17(x, y) (x / 17)
119 #define oprem19(x, y) (x % 19)
120 #endif
121 
122 T(1, , += x, opadd)
123 T(2, ++, , opinc)
124 T(3, , ++, opinc)
125 T(4, , -= x, opsub)
126 T(5, --, , opdec)
127 T(6, , --, opdec)
128 T(7, , &= x, opand)
129 T(8, , |= x, opior)
130 T(9, , ^= x, opxor)
131 T(a, , /= x, opdiv)
132 T(b, , %= x, oprem)
133 T(c, , += 3, opadd3)
134 T(d, , -= 7, opsub7)
135 T(e, , &= 21, opand21)
136 T(f, , |= 19, opior19)
137 T(g, , ^= 37, opxor37)
138 T(h, , /= 17, opdiv17)
139 T(i, , %= 19, oprem19)
140 
141 #endif
142