1 /*
2 !!DESCRIPTION!! Substraction Test
3 !!ORIGIN!! SDCC regression tests
4 !!LICENCE!! GPL, read COPYING.GPL
5 */
6
7 #include <stdio.h>
8 #include <limits.h>
9
10 unsigned char success=0;
11 unsigned char failures=0;
12 unsigned char dummy=0;
13
14 #if SUPPORT_BIT_TYPES
15
16 bit bit0 = 0;
17 bit bit1 = 0;
18 bit bit2 = 0;
19 bit bit3 = 0;
20 bit bit4 = 0;
21 bit bit5 = 0;
22 bit bit6 = 0;
23 bit bit7 = 0;
24 bit bit8 = 0;
25 bit bit9 = 0;
26 bit bit10 = 0;
27 bit bit11 = 0;
28
29 #endif
30
31 #ifdef SIZEOF_INT_16BIT
32 #if defined(__LINUX__) || defined(LINUX)
33 unsigned short aint0 = 0;
34 unsigned short aint1 = 0;
35 #else
36 unsigned int aint0 = 0;
37 unsigned int aint1 = 0;
38 #endif
39
40 #else
41 unsigned int aint0 = 0;
42 unsigned int aint1 = 0;
43 #endif
44 unsigned char achar0 = 0;
45 unsigned char achar1 = 0;
46 unsigned char achar2 = 0;
47 unsigned char achar3 = 0;
48 unsigned char *acharP = 0;
49
done()50 void done()
51 {
52 dummy++;
53 }
54
sub_lit_from_uchar(void)55 void sub_lit_from_uchar(void)
56 {
57 achar0 = achar0 - 5;
58
59 if(achar0 != 0xfb)
60 failures++;
61
62 achar0 -= 10;
63
64 if(achar0 != 0xf1)
65 failures++;
66
67 achar0 = achar0 -1; /* Should be a decrement */
68 if(achar0 != 0xf0)
69 failures++;
70
71 for(achar1 = 0; achar1 < 100; achar1++)
72 achar0 -= 2;
73
74 if(achar0 != 40)
75 failures++;
76 }
77
78 /* achar0 = 1
79 achar1 = 100
80 */
81
sub_uchar2uchar(void)82 void sub_uchar2uchar(void)
83 {
84 achar1 = achar1 - achar0;
85
86 if(achar1 != 99)
87 failures++;
88
89 for(achar2 = 0; achar2<7; achar2++)
90 achar1 -= achar0;
91
92 if(achar1 != 92)
93 failures++;
94 }
95
96 /* assumes
97 achar0 = 10
98 achar1 = 32
99 achar2, achar3 can be anything.
100 */
sub_uchar2uchar2(void)101 void sub_uchar2uchar2(void)
102 {
103 achar0--;
104 achar0 = achar0 - 1;
105 achar0 = achar0 - 2;
106 achar0 = achar0 - 3;
107 if(achar0 != 3)
108 failures++;
109
110 achar1 -= achar0;
111 if(achar1 != 29)
112 failures++;
113
114 achar2 = achar1 - achar0;
115 if(achar2 != 26)
116 failures++;
117
118 achar3 = achar2 - achar1 - achar0;
119 if(achar3 != 0xfa)
120 failures++;
121 }
122
123 /* sub_bits
124 all bit variables are 0 upon entry.
125 */
126 #if SUPPORT_BIT_TYPES
sub_bits(void)127 void sub_bits(void)
128 {
129 bit1 = bit0;
130
131 bit0 = 1;
132
133 if(bit1 != 0)
134 failures++;
135
136 bit1 = bit0-bit1; /* 1 - 0 => 1 */
137 if(bit1 != 1)
138 failures++;
139
140 #if SUPPORT_BIT_ARITHMETIC
141 bit2 = bit1-bit0; /* 1 - 1 => 0 */
142 if(bit2)
143 failures++;
144
145 bit7 = bit4-bit5;
146 bit6 = bit4+bit5;
147 bit3 = bit4-bit5-bit6-bit7-bit0; /* 0-0-0-0-1 => 1 */
148 if(!bit3)
149 failures++;
150 #endif
151 }
152
153 /* sub_bit2uchar(void) - assumes bit0 = 1, achar0 = 7 */
154
sub_bit2uchar(void)155 void sub_bit2uchar(void)
156 {
157 achar0 -= bit0;
158
159 if(achar0 != 6)
160 failures++;
161
162 if(achar0 == bit0)
163 failures++;
164 }
165
sub_bit2uint(void)166 void sub_bit2uint(void)
167 {
168 if(aint0 != bit11)
169 failures++;
170
171 aint0 -= bit0;
172 if(aint0!=0xffff)
173 failures++;
174 }
175 #endif
176
sub_ucharFromLit(void)177 void sub_ucharFromLit(void)
178 {
179 achar0 = 2 - achar0;
180
181 if(achar0 != 2)
182 {
183 printf("%x != %x\n",0x02,achar0);
184 failures++;
185 }
186
187 aint0 = 2 - aint0;
188
189 if(aint0 != 2)
190 {
191 printf("%x != %x\n",0x02,aint0);
192 failures++;
193 }
194
195 aint0--;
196
197 if(aint0 != 1)
198 {
199 printf("%x != %x\n",0x01,aint0);
200 failures++;
201 }
202
203 aint0 = 0x100 - aint0;
204
205 if(aint0 != 0xff)
206 {
207 printf("%x != %x\n",0xff,aint0);
208 failures++;
209 }
210
211 aint0 = 0xff00 - aint0;
212
213 if(aint0 != 0xfe01)
214 {
215 printf("%x != %x\n",0xfe01,aint0);
216 failures++;
217 }
218
219 aint0 = 0x0e01 - aint0;
220
221 if(aint0 != 0x1000)
222 {
223 printf("%x != %x\n",0x1000,aint0);
224 failures++;
225 }
226
227 aint0 = 0x10ff - aint0;
228
229 if(aint0 != 0xff)
230 {
231 printf("%x != %x\n",0xff,aint0);
232 failures++;
233 }
234 }
235
main(void)236 int main(void)
237 {
238 sub_lit_from_uchar();
239 printf("failures: %d\n",failures);
240
241 achar0=1;
242 achar1=100;
243 sub_uchar2uchar();
244 printf("failures: %d\n",failures);
245
246 achar0 = 10;
247 achar1 = 32;
248 sub_uchar2uchar2();
249 printf("failures: %d\n",failures);
250
251 #if SUPPORT_BIT_TYPES
252 sub_bits();
253
254 achar0 = 7;
255 bit0 = 1;
256 sub_bit2uchar();
257 printf("failures: %d\n",failures);
258 sub_bit2uint();
259 printf("failures: %d\n",failures);
260 #endif
261
262 aint0 = 0;
263 achar0 = 0;
264 sub_ucharFromLit();
265
266 success = failures;
267 done();
268
269 printf("failures: %d\n",failures);
270
271 return failures;
272 }
273