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