* support/regression/tests/bug-895992.c,
[fw/sdcc] / support / regression / tests / onebyte.c
1 /** test one byte mul/div/mod operations.
2
3   attrL: volatile,
4   attrR: volatile,
5 */
6 #include <testfwk.h>
7
8 void
9 testMul (void)
10 {
11   {attrL}            char  cL;
12   {attrL}  unsigned  char ucL;
13   {attrR}            char  cR;
14   {attrR}  unsigned  char ucR;
15   volatile           char   r8 , r8b;
16   volatile unsigned  char  ur8, ur8b;
17   volatile           short r16, r16b;
18
19   cL = -127; cR =   -5; r16 =  cL * cR; r16b = cR *  cL; ASSERT (r16 ==  635); ASSERT (r16b ==  635);
20   cL =  127; cR =   -5; r16 =  cL * cR; r16b = cR *  cL; ASSERT (r16 == -635); ASSERT (r16b == -635);
21   cL = -127; cR =    5; r16 =  cL * cR; r16b = cR *  cL; ASSERT (r16 == -635); ASSERT (r16b == -635);
22   cL =  127; cR =    5; r16 =  cL * cR; r16b = cR *  cL; ASSERT (r16 ==  635); ASSERT (r16b ==  635);
23
24   cL = -128; cR =   -1; ur8  =  cL * cR; ur8b  = cR *  cL; ASSERT (ur8  ==  128); ASSERT (ur8b  ==  128);
25   cL =  128; cR =   -1;  r8  =  cL * cR;  r8b  = cR *  cL; ASSERT ( r8  == -128); ASSERT ( r8b  == -128);
26   cL = -128; cR =    1;  r8  =  cL * cR;  r8b  = cR *  cL; ASSERT ( r8  == -128); ASSERT ( r8b  == -128);
27   cL =  128; cR =    1; ur8  =  cL * cR; ur8b  = cR *  cL; ASSERT (ur8  ==  128); ASSERT (ur8b  ==  128);
28
29 #ifndef SDCC_z80
30   ucL = 128; cR =   -5; r16 = ucL * cR; r16b = cR * ucL; ASSERT (r16 == -640); ASSERT (r16b == -640);
31   ucL = 128; cR =    5; r16 = ucL * cR; r16b = cR * ucL; ASSERT (r16 ==  640); ASSERT (r16b ==  640);
32 #endif
33
34   ucL = 127;  cR =  -1;  r8 = ucL * cR;   r8b  = cR * ucL; ASSERT ( r8 == -127); ASSERT ( r8b  == -127);
35   ucL = 128;  cR =   1; ur8 = ucL * cR;  ur8b  = cR * ucL; ASSERT (ur8 ==  128); ASSERT (ur8b  ==  128);
36   ucL = 128; ucR =   5; r16 = ucL * ucR; r16b = ucR * ucL; ASSERT (r16 ==  640); ASSERT (r16b ==  640);
37   ucL = 128; ucR =   1; ur8 = ucL * ucR; ur8b = ucR * ucL; ASSERT (ur8 ==  128); ASSERT (ur8b ==  128);
38 }
39
40 void
41 testDiv (void)
42 {
43   {attrL}           char  cL;
44   {attrL}  unsigned char ucL;
45   {attrR}           char  cR;
46   {attrR}  unsigned char ucR;
47   volatile          char  r8;
48   volatile unsigned char ur8;
49   volatile         short r16;
50
51    cL = -128;  cR =   -2; r8  = cL / cR; ASSERT (r8  ==  64);
52    cL = -128;  cR =   -2; r16 = cL / cR; ASSERT (r16 ==  64);
53
54   ucL =  255; ucR =    3; r8 = ucL / ucR; ASSERT (r8 ==  85);
55   ucL =  255; ucR =  255; r8 = ucL / ucR; ASSERT (r8 ==   1);
56   ucL =    3; ucR =  255; r8 = ucL / ucR; ASSERT (r8 ==   0);
57
58    cL =  127;  cR =    3; r8 =  cL /  cR; ASSERT (r8 ==  42);
59    cL = -127;  cR =    3; r8 =  cL /  cR; ASSERT (r8 == -42);
60    cL =  127;  cR =   -3; r8 =  cL /  cR; ASSERT (r8 == -42);
61    cL = -127;  cR =   -3; r8 =  cL /  cR; ASSERT (r8 ==  42);
62
63   ucL =  127;  cR =    3; r8 = ucL /  cR; ASSERT (r8 ==  42);
64   ucL =  255;  cR =    3; r8 = ucL /  cR; ASSERT (r8 ==  85);
65 #ifndef SDCC_z80
66   ucL =  127;  cR =   -3; r8 = ucL /  cR; ASSERT (r8 == -42);
67   ucL =  255;  cR =   -3; r8 = ucL /  cR; ASSERT (r8 == -85);
68 #endif
69
70    cL =  127; ucR =    3; r8 =  cL / ucR; ASSERT (r8 ==  42);
71    cL = -127; ucR =    3; r8 =  cL / ucR; ASSERT (r8 == -42);
72    cL =  127; ucR =  128; r8 =  cL / ucR; ASSERT (r8 ==   0);
73    cL = -127; ucR =  128; r8 =  cL / ucR; ASSERT (r8 ==   0);
74
75    cL =  127;  cR =    1; r8  =  cL /  cR; ASSERT (r8  == 127);
76    cL =  127;  cR =    1; r16 =  cL /  cR; ASSERT (r16 == 127);
77
78   ucL = 251;   cR =    1; ur8 = ucL /  cR; ASSERT (ur8 == 251);
79   ucL = 251;   cR =    1; r16 = ucL /  cR; ASSERT (r16 == 251);
80
81 #ifndef SDCC_z80
82   ucL = 253;   cR =   -3; r8  = ucL /  cR; ASSERT (r8  == -84);
83   ucL = 253;   cR =   -3; r16 = ucL /  cR; ASSERT (r16 == -84);
84
85   ucL =  254;  cR =   -1; r16 = ucL /  cR; ASSERT (r16 == -254);
86 #endif
87    cL = -128;  cR =   -1; r16 =  cL /  cR; ASSERT (r16 ==  128);
88 }
89
90 void
91 testMod (void)
92 {
93   {attrL}           char  cL;
94   {attrL}  unsigned char ucL;
95   {attrR}           char  cR;
96   {attrR}  unsigned char ucR;
97   volatile          char  r8;
98   volatile unsigned char ur8;
99   volatile         short r16;
100
101   ucL =  128;  cR =    5; r16 = ucL %  cR; ASSERT (r16 ==  3);
102 #ifndef SDCC_z80
103   ucL =  128;  cR =   -5; r16 = ucL %  cR; ASSERT (r16 ==  3);
104 #endif
105   ucL =  128; ucR =    5; r16 = ucL % ucR; ASSERT (r16 ==  3);
106
107   ucL =  128; ucR =  255; ur8 = ucL % ucR; ASSERT (ur8 == 128);
108   ucL =  128; ucR =  255; r16 = ucL % ucR; ASSERT (r16 == 128);
109
110   ucL =  128;  cR =  127; r8  = ucL %  cR; ASSERT (r8  ==  1);
111
112    cL =  127;  cR =    5; r16 =  cL %  cR; ASSERT (r16 ==  2);
113    r16 = -1;
114    cL =  127;  cR =   -5; r16 =  cL %  cR; ASSERT (r16 ==  2);
115    r16 = -1;
116    cL =  127; ucR =    5; r16 =  cL % ucR; ASSERT (r16 ==  2);
117
118    cL = -128;  cR =    5; r16 =  cL %  cR; ASSERT (r16 == -3);
119    r16 = 0;
120    cL = -128;  cR =   -5; r16 =  cL %  cR; ASSERT (r16 == -3);
121    r16 = 0;
122    cL = -128; ucR =    5; r16 =  cL % ucR; ASSERT (r16 == -3);
123 }
124
125 void
126 testOr (void)
127 {
128   {attrL}           char  cL;
129   {attrL}  unsigned char ucL;
130   {attrR}           char  cR;
131   {attrR}  unsigned char ucR;
132   volatile         short r16, r16b;
133
134    cL = 0x00;  cR = 0x80; r16 =  cL |  cR; r16b =  cR |  cL; ASSERT (r16 == (short) 0xff80); ASSERT (r16b == (short) 0xff80);
135   ucL = 0x80;  cR = 0x00; r16 = ucL |  cR; r16b =  cR | ucL; ASSERT (r16 ==           0x80); ASSERT (r16b ==           0x80);
136   ucL = 0x80; ucR = 0x80; r16 = ucL | ucR; r16b = ucR | ucL; ASSERT (r16 ==           0x80); ASSERT (r16b ==           0x80);
137 }
138
139 void
140 testXor (void)
141 {
142   {attrL}           char  cL;
143   {attrL}  unsigned char ucL;
144   {attrR}           char  cR;
145   {attrR}  unsigned char ucR;
146   volatile         short r16, r16b;
147
148    cL = 0x80;  cR = 0x80; r16 =  cL ^  cR; r16b =  cR ^  cL; ASSERT (r16 ==              0); ASSERT (r16b ==              0);
149    cL = 0x80;  cR = 0x00; r16 =  cL ^  cR; r16b =  cR ^  cL; ASSERT (r16 == (short) 0xff80); ASSERT (r16b == (short) 0xff80);
150
151   ucL = 0x80;  cR = 0x80; r16 = ucL ^  cR; r16b =  cR ^ ucL; ASSERT (r16 == (short) 0xff00); ASSERT (r16b == (short) 0xff00);
152   ucL = 0x80;  cR =    0; r16 = ucL ^  cR; r16b =  cR ^ ucL; ASSERT (r16 ==           0x80); ASSERT (r16b ==           0x80);
153   ucL =    0;  cR = 0x80; r16 = ucL ^  cR; r16b =  cR ^ ucL; ASSERT (r16 == (short) 0xff80); ASSERT (r16b == (short) 0xff80);
154
155   ucL = 0x80; ucR = 0x80; r16 = ucL ^ ucR; r16b = ucR ^ ucL; ASSERT (r16 ==      0); ASSERT (r16b ==      0);
156   ucL =    0; ucR = 0x80; r16 = ucL ^ ucR; r16b = ucR ^ ucL; ASSERT (r16 ==   0x80); ASSERT (r16b ==   0x80);
157 }
158
159 void
160 testAnd (void)
161 {
162   {attrL}           char  cL;
163   {attrL}  unsigned char ucL;
164   {attrR}           char  cR;
165   {attrR}  unsigned char ucR;
166   volatile         short r16, r16b;
167
168    cL = 0x80;  cR = 0x80; r16 =  cL &  cR; r16b =  cR &  cL; ASSERT (r16 == (short) 0xff80); ASSERT (r16b == (short) 0xff80);
169   ucL = 0x80;  cR = 0x80; r16 = ucL &  cR; r16b =  cR & ucL; ASSERT (r16 ==           0x80); ASSERT (r16b ==           0x80);
170   ucL = 0x80; ucR = 0x80; r16 = ucL & ucR; r16b = ucR & ucL; ASSERT (r16 ==           0x80); ASSERT (r16b ==           0x80);
171 }
172
173 void
174 testComplement (void)
175 {
176   {attrR}           char  c;
177   {attrR}  unsigned char uc;
178   volatile         short r16;
179
180    c = 0x00;  r16 = ~ c; ASSERT (r16    == (short) 0xffff); ASSERT (~ c < 0);
181   uc = 0x00;  r16 = ~uc; ASSERT (r16    == (short) 0xffff); ASSERT (~uc < 0);
182   ASSERT (~ (char)          0x00 == (short) 0xffff); ASSERT (~ (char)          0x00 < 0);
183   ASSERT (~ (unsigned char) 0x00 == (short) 0xffff); ASSERT (~ (unsigned char) 0x00 < 0);
184    c = 0x80;  r16 = ~ c; ASSERT (r16 == (short) 0x007f); ASSERT (~ c > 0);
185   uc = 0x80;  r16 = ~uc; ASSERT (r16 == (short) 0xff7f); ASSERT (~uc < 0);
186   ASSERT (~ (char)          0x80 == (short) 0x007f); ASSERT (~ (char)          0x80 > 0);
187   ASSERT (~ (unsigned char) 0x80 == (short) 0xff7f); ASSERT (~ (unsigned char) 0x80 < 0);
188
189   ASSERT (~ 1   < 0);
190   ASSERT (~ 1u  > 0);
191   ASSERT (~ 1l  < 0);
192   ASSERT (~ 1ul > 0);
193 }
194
195 void
196 testCompare (void)
197 {
198   {attrL}   signed char  c;
199   {attrR} unsigned char uc;
200
201    c = 0x80; /* -128 */
202   uc = 0x80; /* +128 */
203
204   ASSERT (!(c == uc));
205   ASSERT (  c != uc );
206   ASSERT (  c <  uc );
207   ASSERT (  c <= uc );
208   ASSERT (!(c >  uc));
209   ASSERT (!(c >= uc));
210 }
211
212 void
213 testUMinus (void)
214 {
215     signed char  {attrL} sc;
216   unsigned char  {attrL} uc;
217     signed int   {attrL} si;
218   unsigned int   {attrL} ui;
219     signed long  {attrL} sl;
220   unsigned long  {attrL} ul;
221
222   ASSERT (-(53l ) < 0);
223   ASSERT (-(53ul) > 0);
224   ul = 53;
225   ASSERT (-ul > 0);
226   sl = 53;
227   ASSERT (-sl < 0);
228
229   ASSERT (-(53  ) < 0);
230   ASSERT (-(53u ) > 0);
231   ui = 53;
232   ASSERT (-ui > 0);
233   si = 53;
234   ASSERT (-si < 0);
235
236   ASSERT (-( 250 ) == -250);
237   uc = 250;
238   ASSERT (-uc == -250);
239
240   ASSERT (-(-128 ) ==  128);
241   sc = -128;
242   ASSERT (-sc == 128);
243 }
244
245 void
246 testBug1571231 (void)
247 {
248   unsigned char  {attrL} uc;
249
250   /* bug-1571231 */
251   uc = 0x80;
252   if (uc + 0x80)
253     ASSERT (1);
254   else
255     ASSERT (0);
256 }