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