Imported Upstream version 2.9.0
[debian/cc1111] / support / regression / tests / bitopcse.c
1 /* Test CSE with |&^
2
3     type: bool, char, short, long
4  */
5 #include <testfwk.h>
6 #include <stdbool.h>
7
8 /* This is not only a regression test, the focus of this test
9    is more on the generated code (volatile!). */
10
11 #define TYPE_{type}
12
13 #if defined(TYPE_bool) && !defined(SDCC)
14 #  define UNSIGNED
15 #else
16 #  define UNSIGNED unsigned
17 #endif
18
19 #if defined(TYPE_bool)
20 #  define _data
21 #else
22 #  define _data idata
23 #endif
24
25 #if defined(TYPE_bool) && defined(__bool_true_false_are_defined)
26 #  define MASK 1
27 #elif defined(TYPE_bool) && !defined(__bool_true_false_are_defined)
28 #  if defined(PORT_HOST)
29 #    define MASK 0xffffffff
30 #  else
31 #    define MASK 0xffff
32 #  endif
33 #  define bool int
34 #elif defined(TYPE_char)
35 #  define MASK 0xff
36 #elif defined(TYPE_short)
37 #  define MASK 0xffff
38 #elif defined(TYPE_long)
39 #  define MASK 0xffffffff
40 #else
41 #  warning Unknown type
42 #endif
43
44 /* the variable 'mask' is only defined to see if MASK is correctly set up */
45 const unsigned long mask = MASK;
46
47       volatile          {type}  v;
48       volatile UNSIGNED {type} uv;
49 /* an array would be nicer, but an array of bits isn't possible */
50 _data                   {type}  a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9 ,
51                                 a10, a11, a12, a13, a14, a15, a16, a17, a18, a19,
52                                 a20;
53 _data          UNSIGNED {type} ua0, ua1, ua2, ua3, ua4, ua5, ua6;
54 _data                   {type}  b;
55 _data volatile UNSIGNED {type} ub = 0xbe;
56
57 void
58 testcse(void)
59 {
60    b = 0xeb;
61   ub = 0xbe;
62    v = 0x33;
63   uv = 0x7b;
64
65    a0   =    0 & b;
66    a1   =    0 & v;
67
68    a2   = MASK &  b;
69    a3   = MASK &  v;
70   ua0   = MASK & ub;
71   ua1   = MASK & uv;
72
73    a4   =    b & b;
74    a5   =    v & v;
75
76    a6  &= 0;
77    v   &= 0;
78    a7  &= MASK;
79    v   &= MASK;
80   ua2  &= MASK;
81   uv   &= MASK;
82
83
84    a8   =    0 | b;
85    a9   =    0 | v;
86
87    a10  = MASK |  b;
88    a11  = MASK |  v;
89   ua3   = MASK | ub;
90   ua4   = MASK | uv;
91
92    a12  =   b | b;
93    a13  =   v | v;
94
95    a14 |= 0;
96    v   |= 0;
97    a15 |= MASK;
98    v   |= MASK;
99   ua5  |= MASK;
100   uv   |= MASK;
101
102
103    a16  = 0 ^ b;
104    a17  = 0 ^ v;
105
106    a18  = b ^ b;
107    a19  = v ^ v;
108
109    a20 ^= 0;
110    v   ^= 0;
111
112    ASSERT( a0  ==  0);
113    ASSERT( a1  ==  0);
114    ASSERT( a2  ==  b);
115 #if defined(TYPE_bool) && defined(__bool_true_false_are_defined)
116    ASSERT( a3  == 1);
117    ASSERT(ua1  == 1);
118    ASSERT( a5  == 1);
119 #else
120    ASSERT( a3  == ({type}) 0x33);
121    ASSERT(ua1  == ({type}) 0x7b);
122    ASSERT( a5  == ({type}) 0x33);
123 #endif
124    ASSERT(ua0  == ub);
125    ASSERT( a4  ==  b);
126    ASSERT( a6  ==  0);
127    // ASSERT( a7 == );
128    // ASSERT(ua2 == );
129    ASSERT( a8  ==  b);
130    ASSERT( a9  ==  0);
131    ASSERT( a10 == ({type}) MASK);
132    ASSERT( a11  == ({type}) MASK);
133    ASSERT(ua3  == MASK);
134    ASSERT(ua4  == MASK);
135    ASSERT( a12 ==  b);
136    ASSERT( a13 ==  0);
137    // ASSERT( a14 == );
138    ASSERT( a15 == ({type}) MASK);
139    ASSERT(ua5 == MASK);
140    ASSERT( a16 == b);
141    ASSERT( a17 == ({type}) MASK);
142    ASSERT( a18 == 0);
143    ASSERT( a19 == 0);
144    // ASSERT( a20 == );
145    ASSERT( v   == ({type}) MASK);
146    ASSERT(uv   == MASK);
147 }