Imported Upstream version 2.9.0
[debian/cc1111] / support / regression / tests / bitwise.c
1 /** Test the bitwise operators.
2
3     type: char, short, long
4     attr: volatile,
5     storage: static,
6  */
7 #include <testfwk.h>
8
9 static void
10 testTwoOpBitwise(void)
11 {
12   {storage} {attr} {type} left, right;
13
14   left = ({type})0x3df7;
15   right = ({type})0xc1ec;
16
17   ASSERT(({type})(left & right) == ({type})0x1E4);
18   ASSERT(({type})(right & left) == ({type})0x1E4);
19   ASSERT(({type})(left & 0xc1ec) == ({type})0x1E4);
20   ASSERT(({type})(0x3df7 & right) == ({type})0x1E4);
21
22   ASSERT(({type})(left | right) == ({type})0xFDFF);
23   ASSERT(({type})(right | left) == ({type})0xFDFF);
24   ASSERT(({type})(left | 0xc1ec) == ({type})0xFDFF);
25   ASSERT(({type})(0x3df7 | right) == ({type})0xFDFF);
26
27   ASSERT(({type})(left ^ right) == ({type})0xFC1B);
28   ASSERT(({type})(right ^ left) == ({type})0xFC1B);
29   ASSERT(({type})(left ^ 0xc1ec) == ({type})0xFC1B);
30   ASSERT(({type})(0x3df7 ^ right) == ({type})0xFC1B);
31
32 #if defined (__alpha__) || defined (__x86_64__)
33   /* long is 64 bits on 64 bit machines */
34   ASSERT(({type})(~left) == ({type})0xFFFFFFFFFFFFC208);
35 #else
36   ASSERT(({type})(~left) == ({type})0xFFFFC208);
37 #endif
38 }
39
40 void
41 testAnd(void)
42 {
43   char res;
44   {attr} int a;
45
46   /* always false if right literal == 0 */
47 #if 0
48   // fails on pic16
49   if (a & 0)
50     res = 1;
51   else
52     res = 0;
53   ASSERT(res = 0);
54
55   a = 0x1234;
56
57   if (a & 0)
58     res = 1;
59   else
60     res = 0;
61   ASSERT(res = 0);
62 #endif
63
64   /*
65    * result: if, left: var, right: literal
66    */
67   a = 0x1234;
68
69   if (a & 0x4321)
70     res = 1;
71   else
72     res = 0;
73   ASSERT(res == 1);
74
75   if (a & 0x4321)
76     /* nothing for true */
77     ;
78   else
79     res = 0;
80   ASSERT(res == 1);
81
82   if (!(a & 0x4321))
83     res = 1;
84   else
85     res = 0;
86   ASSERT(res == 0);
87
88   if (!(a & 0x4321))
89     /* nothing for true */
90     ;
91   else
92     res = 0;
93   ASSERT(res == 0);
94
95   /* bitmask literal */
96   a = 0xffff;
97
98   if (a & 0x1004)
99     res = 1;
100   else
101     res = 0;
102   ASSERT(res == 1);
103
104   if (!(a & 0x1004))
105     res = 1;
106   else
107     res = 0;
108   ASSERT(res == 0);
109
110   a = 0x0000;
111
112   if (a & 0x1004)
113     res = 1;
114   else
115     res = 0;
116   ASSERT(res == 0);
117
118   if (!(a & 0x1004))
119     res = 1;
120   else
121     res = 0;
122   ASSERT(res == 1);
123
124   a = 0x00ff;
125
126   if (a & 0x1004)
127     res = 1;
128   else
129     res = 0;
130   ASSERT(res == 1);
131
132   if (!(a & 0x1004))
133     res = 1;
134   else
135     res = 0;
136   ASSERT(res == 0);
137
138   a = 0xff00;
139
140   if (a & 0x1004)
141     res = 1;
142   else
143     res = 0;
144   ASSERT(res == 1);
145
146   if (!(a & 0x1004))
147     res = 1;
148   else
149     res = 0;
150   ASSERT(res == 0);
151
152   /* literal with zero bytes */
153   a = 0x1234;
154
155   if (a & 0x4300)
156     res = 1;
157   else
158     res = 0;
159   ASSERT(res == 1);
160
161   if (a & 0x0012)
162     res = 1;
163   else
164     res = 0;
165   ASSERT(res == 1);
166
167   if (!(a & 0x4300))
168     res = 1;
169   else
170     res = 0;
171   ASSERT(res == 0);
172
173   if (!(a & 0x0012))
174     res = 1;
175   else
176     res = 0;
177   ASSERT(res == 0);
178
179   /*
180    * result: bit, left: var, right: literal
181    */
182 }
183
184 void
185 testOr(void)
186 {
187   char res;
188   {attr} int a = 0x1234;
189
190   /*
191    * result: if, left: var, right: literal
192    */
193   res = 1;
194   if (a | 0x4321)
195     /* nothing for true */
196     ;
197   else
198     res = 0;
199   ASSERT(res == 1);
200
201   if (!(a | 0x4321))
202     /* nothing for true */
203     ;
204   else
205     res = 0;
206   ASSERT(res == 0);
207
208   if (a | 0x4321)
209     res = 1;
210   else
211     res = 0;
212   ASSERT(res == 1);
213
214   if (!(a | 0x4321))
215     res = 1;
216   else
217     res = 0;
218   ASSERT(res == 0);
219
220   /* or with zero: result is left */
221   res = 1;
222
223   if (a | 0)
224     /* nothing for true */
225     ;
226   else
227     res = 0;
228   ASSERT(res == 1);
229
230   res = 1;
231
232   if (!(a | 0))
233     /* nothing for true */
234     ;
235   else
236     res = 0;
237   ASSERT(res == 0);
238
239   if (a | 0)
240     res = 1;
241   else
242     res = 0;
243   ASSERT(res == 1);
244
245   if (!(a | 0))
246     res = 1;
247   else
248     res = 0;
249   ASSERT(res == 0);
250 }
251
252 void
253 testXor(void)
254 {
255   char res;
256   {attr} int a = 0x1234;
257
258   /*
259    * result: if, left: var, right: literal
260    */
261   if (a ^ 0x4321)
262     res = 1;
263   else
264     res = 0;
265   ASSERT(res == 1);
266
267   if (a ^ 0x4321)
268     /* nothing for true */
269     ;
270   else
271     res = 0;
272   ASSERT(res == 1);
273
274   if (!(a ^ 0x4321))
275     res = 1;
276   else
277     res = 0;
278   ASSERT(res == 0);
279
280   if (!(a ^ 0x4321))
281     /* nothing for true */
282     ;
283   else
284     res = 0;
285   ASSERT(res == 0);
286
287   /* literal with 0xff bytes */
288   if (a ^ 0xff04)
289     res = 1;
290   else
291     res = 0;
292   ASSERT(res == 1);
293
294   if (!(a ^ 0xff04))
295     res = 1;
296   else
297     res = 0;
298   ASSERT(res == 0);
299
300   /* literal with zero bytes */
301   if (a ^ 0x0004)
302     res = 1;
303   else
304     res = 0;
305   ASSERT(res == 1);
306
307   if (!(a ^ 0x0004))
308     res = 1;
309   else
310     res = 0;
311   ASSERT(res == 0);
312 }
313
314 static void
315 testBug_1777758(void)
316 {
317   char ep = -1;
318
319   ep &= ~0x80;
320
321   ASSERT(ep == 127);
322 }