Yet again, signed comparisons to literals has been fixed.
[fw/sdcc] / src / regression / compare8.c
1 // Signed comparisons of the form:  (variable>LIT)
2 //
3 // This regression test exercises all of the boundary
4 // conditions in literal less than comparisons. There
5 // are numerous opportunities to optimize these comparison
6 // and each one has an astonishing capability of failing
7 // a boundary condition.
8
9 unsigned char success = 0;
10 unsigned char failures = 0;
11 unsigned char dummy = 0;
12 unsigned char result = 0;
13
14 //bit bit0 = 0;
15 int int0 = 0;
16 int int1 = 0;
17 unsigned char uchar0 = 0;
18 unsigned char uchar1 = 0;
19 signed char char0 = 0;
20 signed char char1 = 0;
21 char long0 = 0;
22 char long1 = 0;
23
24 void
25 done ()
26 {
27   dummy++;
28 }
29
30
31 void c_char_gt_lit1(unsigned char expected_result)
32 {
33   result = 0;
34
35   if(char0 > -0x7f)
36     result |= 1;
37
38
39   if(char0 > -1)
40     result |= 2;
41
42   if(char0 > 0)
43     result |= 4;
44
45   if(char0 > 1)
46     result |= 8;
47
48   if(char0 > 0x7e)
49     result |= 0x10;
50   
51   if(char0 > 0x7f)
52     result |= 0x20;
53   
54   if(result != expected_result)
55     failures++;
56 }
57
58
59 void char_compare(void)
60 {
61   char0 = 0x7f;
62   c_char_gt_lit1(0x1f);
63
64   char0 = 0x7e;
65   c_char_gt_lit1(0x0f);
66
67   char0 = 0x40;
68   c_char_gt_lit1(0x0f);
69
70   char0 = 0x2;
71   c_char_gt_lit1(0x0f);
72
73   char0 = 0x1;
74   c_char_gt_lit1(0x07);
75
76   char0 = 0;
77   c_char_gt_lit1(0x03);
78
79   char0 = -1;
80   c_char_gt_lit1(0x01);
81
82   char0 = -2;
83   c_char_gt_lit1(0x01);
84
85   char0 = -0x40;
86   c_char_gt_lit1(0x01);
87
88   char0 = -0x7e;
89   c_char_gt_lit1(0x01);
90
91   char0 = -0x7f;
92   c_char_gt_lit1(0x00);
93
94   char0 = 0x80;
95   c_char_gt_lit1(0x00);
96
97
98   /* Now test entire range */
99
100   for(char0=2; char0 != 0x7f; char0++)
101     c_char_gt_lit1(0x0f);
102
103
104   for(char0=-0x7e; char0 != -1; char0++)
105     c_char_gt_lit1(0x01);
106
107
108 }
109
110
111 void c_int_gt_lit1(unsigned char expected_result)
112 {
113   result = 0;
114
115   if(int0 > 0)
116     result |= 1;
117
118   if(int0 > 1)
119     result |= 2;
120
121
122   if(int0 > 0xff)
123     result |= 4;
124
125   if(int0 > 0x100)
126     result |= 8;
127
128   if(int0 > 0x0101)
129     result |= 0x10;
130   
131   if(int0 > 0x01ff)
132     result |= 0x20;
133   
134   if(int0 > 0x0200)
135     result |= 0x40;
136
137   if(int0 > 0x0201)
138     result |= 0x80;
139
140   if(result != expected_result)
141     failures=1;
142
143 }
144
145
146 void int_compare1(void)
147 {
148   int0 = -1;
149   c_int_gt_lit1(0x00);
150
151   int0 = 0;
152   c_int_gt_lit1(0x00);
153
154   int0 = 1;
155   c_int_gt_lit1(0x01);
156
157   int0 = 2;
158   c_int_gt_lit1(0x03);
159
160   int0 = 0xfe;
161   c_int_gt_lit1(0x03);
162
163   int0 = 0xff;
164   c_int_gt_lit1(0x03);
165
166   int0 = 0x100;
167   c_int_gt_lit1(0x07);
168
169   int0 = 0x101;
170   c_int_gt_lit1(0x0f);
171
172   int0 = 0x102;
173   c_int_gt_lit1(0x1f);
174
175   int0 = 0x1fe;
176   c_int_gt_lit1(0x1f);
177
178   int0 = 0x1ff;
179   c_int_gt_lit1(0x1f);
180
181   int0 = 0x200;
182   c_int_gt_lit1(0x3f);
183
184   int0 = 0x201;
185   c_int_gt_lit1(0x7f);
186
187   int0 = 0x7f00;
188   c_int_gt_lit1(0xff);
189
190   /* now check contiguous ranges */
191
192   for(int0 = -0x7fff; int0 != -1; int0++)
193     c_int_gt_lit1(0x00);
194
195   for(int0 = 2; int0 != 0xff; int0++)
196     c_int_gt_lit1(0x03);
197
198   for(int0 = 0x202; int0 != 0x7fff; int0++)
199     c_int_gt_lit1(0xff);
200
201 }
202
203
204 void c_int_gt_lit2(unsigned char expected_result)
205 {
206   result = 0;
207
208   if(int0 > -0x7fff)
209     result |= 1;
210
211   if(int0 > -0x7f00)
212     result |= 2;
213
214   if(int0 > -0x7eff)
215     result |= 4;
216
217   if(int0 > -0x7e00)
218     result |= 8;
219
220   if(int0 > -0x0101)
221     result |= 0x10;
222   
223   if(int0 > -0x0100)
224     result |= 0x20;
225   
226   if(int0 > -0xff)
227     result |= 0x40;
228
229   if(int0 > -1)
230     result |= 0x80;
231
232   if(result != expected_result)
233     failures=1;
234 }
235
236 void int_compare2(void)
237 {
238   int0 = -0x7fff;
239   c_int_gt_lit2(0x00);
240
241   int0 = -0x7f00;
242   c_int_gt_lit2(0x01);
243
244   int0 = -0x7eff;
245   c_int_gt_lit2(0x03);
246
247   int0 = -0x7e00;
248   c_int_gt_lit2(0x07);
249
250   int0 = -0x7dff;
251   c_int_gt_lit2(0x0f);
252
253   int0 = -0x4567;
254   c_int_gt_lit2(0x0f);
255
256   int0 = -0x200;
257   c_int_gt_lit2(0x0f);
258
259   int0 = -0x102;
260   c_int_gt_lit2(0x0f);
261
262   int0 = -0x101;
263   c_int_gt_lit2(0x0f);
264
265   int0 = -0x100;
266   c_int_gt_lit2(0x1f);
267
268   int0 = -0xff;
269   c_int_gt_lit2(0x3f);
270
271   int0 = -0x02;
272   c_int_gt_lit2(0x7f);
273
274   int0 = -0x01;
275   c_int_gt_lit2(0x7f);
276
277   int0 = 0;
278   c_int_gt_lit2(0xff);
279
280   int0 = 1;
281   c_int_gt_lit2(0xff);
282
283   int0 = 0x7fff;
284   c_int_gt_lit2(0xff);
285
286   /* now check contiguous ranges */
287
288   for(int0 = -0x7ffe; int0 != -0x7f01; int0++)
289     c_int_gt_lit2(0x01);
290
291   for(int0 = -0x7dff; int0 != -0x101; int0++)
292     c_int_gt_lit2(0x0f);
293
294   for(int0 = 0; int0 != 0x7fff; int0++)
295     c_int_gt_lit2(0xff);
296
297 }
298
299
300
301
302 void
303 main (void)
304 {
305   char_compare();
306   int_compare1();
307   int_compare2();
308
309   success = failures;
310   done ();
311 }