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