* src/SDCCicode.c (operandOperation): really fixed problem with bitops
[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
11 #define _{type}
12
13 #if defined(_bit)
14 #  define MASK 1
15 #  define idata
16 #elif defined(_char)
17 #  define MASK 0xff
18 #elif defined(_short)
19 #  define MASK 0xffff
20 #elif defined(_long)
21 #  define MASK 0xffffffff
22 #else
23 #  warn Unknow type
24 #endif
25
26 #if defined(PORT_HOST) || defined(SDCC_z80) || defined(SDCC_gbz80)
27 # define idata
28 # define code
29 #endif
30
31 /* the variable 'mask' is only define to see if MASK is correctly set up */
32 code unsigned long mask = MASK;
33
34       volatile          {type}  v;
35       volatile unsigned {type} uv;
36 /* an array would be nicer, but an array of bits isn't possible */
37 idata                   {type}  a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9 ,
38                                 a10, a11, a12, a13, a14, a15, a16, a17, a18, a19,
39                                 a20;
40 idata          unsigned {type} ua0, ua1, ua2, ua3, ua4, ua5, ua6;
41 idata                   {type}  b;
42 idata volatile unsigned {type} ub = 0xbe;
43
44 void
45 testcse(void)
46 {
47    b = 0xeb;
48   ub = 0xbe;
49    v = 0x33;
50   uv = 0xab;
51
52    a0   =    0 & b;
53    a1   =    0 & v;
54
55    a2   = MASK &  b;
56    a3   = MASK &  v;
57   ua0   = MASK & ub;
58   ua1   = MASK & uv;
59
60    a4   =    b & b;
61    a5   =    v & v;
62
63    a6  &= 0;
64    v   &= 0;
65    a7  &= MASK;
66    v   &= MASK;
67   ua2  &= MASK;
68   uv   &= MASK;
69
70
71    a8   =    0 | b;
72    a9   =    0 | v;
73
74    a10  = MASK |  b;
75    a11  = MASK |  v;
76   ua3   = MASK | ub;
77   ua4   = MASK | uv;
78
79    a12  =   b | b;
80    a13  =   v | v;
81
82    a14 |= 0;
83    v   |= 0;
84    a15 |= MASK;
85    v   |= MASK;
86   ua5  |= MASK;
87   uv   |= MASK;
88
89
90    a16  = 0 ^ b;
91    a17  = 0 ^ v;
92
93    a18  = b ^ b;
94    a19  = v ^ v;
95
96    a20 ^= 0;
97    v   ^= 0;
98
99    ASSERT( a0  ==  0);
100    ASSERT( a1  ==  0);
101    ASSERT( a2  ==  b);
102 #if defined(_bit)
103    ASSERT( a3  == 1);
104 #else
105    ASSERT( a3  == ({type}) 0x33);
106 #endif
107    ASSERT(ua0  == ub);
108 #if defined(_bit)
109    ASSERT(ua1  == 1);
110 #else
111    ASSERT(ua1  == ({type}) 0xab);
112 #endif
113    ASSERT( a4  ==  b);
114 #if defined(_bit)
115    ASSERT( a5  == 1);
116 #else
117    ASSERT( a5  == ({type}) 0x33);
118 #endif
119    ASSERT( a6  ==  0);
120    // ASSERT( a7 == );
121    // ASSERT(ua2 == );
122    ASSERT( a8  ==  b);
123    ASSERT( a9  ==  0);
124    ASSERT( a10 == ({type}) MASK);
125    ASSERT( a11  == ({type}) MASK);
126    ASSERT(ua3  == MASK);
127    ASSERT(ua4  == MASK);
128    ASSERT( a12 ==  b);
129    ASSERT( a13 ==  0);
130    // ASSERT( a14 == );
131    ASSERT( a15 == ({type}) MASK);
132    ASSERT(ua5 == MASK);
133    ASSERT( a16 == b);
134    ASSERT( a17 == ({type}) MASK);
135    ASSERT( a18 == 0);
136    ASSERT( a19 == 0);
137    // ASSERT( a20 == );
138    ASSERT( v   == ({type}) MASK);
139    ASSERT(uv   == MASK);
140 }