1 /* Test operandOperation() in SDCCicode.c
3 type: char, short, LONG
8 #if defined(__alpha__) || defined(__x86_64__)
14 typedef signed {type} stype;
15 typedef unsigned {type} utype;
17 #if defined(PORT_HOST) || defined(SDCC_z80) || defined(SDCC_gbz80)
22 volatile char is8 = 8;
30 volatile signed char vsc;
31 volatile signed short vss;
32 volatile signed LONG vsl;
33 volatile unsigned char vuc;
34 volatile unsigned short vus;
35 volatile unsigned LONG vul;
44 mulWrapper(int a, int b)
52 /* mul signedness: usualBinaryConversions() */
68 ASSERT(ss == (short) 0xfc04);
69 /* after promotion the result of the multiplication is 'signed int', which overflows! */
70 if (sizeof (int) == 2)
71 ASSERT(vuc * vuc < 1);
75 ASSERT(vus * vus < 1);
78 /* mul ast: valMult() */
79 ASSERT((stype) -3 * (stype) -1 == (stype) 3);
80 ASSERT((stype) -3 * (stype) 1 == (stype) -3);
81 ASSERT((stype) 3 * (stype) -1 == (stype) -3);
83 ASSERT((stype) 1 * (utype) 0xfffffff7 == (utype) 0xfffffff7);
85 ASSERT((unsigned char ) 0xfffffff8 * (unsigned char ) 0xfffffff7 == 0xef48);
86 ASSERT(mulWrapper((unsigned short) 0xfffffff8, (unsigned short) 0xfffffff7) == (sizeof(int) == 2 ? 0x0048 : (unsigned int)0xffef0048));
87 ASSERT((unsigned LONG ) 0xfffffff8 * (unsigned LONG ) 0xfffffff7 == 0x0048);
89 ASSERT((stype ) 0xfffffff8 * (stype ) 0xfffffff7 == 72);
91 ASSERT((signed char ) -1 * (unsigned char ) 0xfffffff7 == (sizeof(int) == 2 ? 0xff09 : 0xffffff09));
92 ASSERT((signed short) -1 * (unsigned short) 0xfffffff7 == (sizeof(int) == 2 ? 9u : 0xffff0009));
93 ASSERT((signed LONG ) -1 * (unsigned LONG ) 0xfffffff7 == 9u);
95 ASSERT((signed char ) -2 * (unsigned char ) 0x8004 == (sizeof(int) == 2 ? 0xfff8 : 0xfffffff8));
96 ASSERT((signed short) -2 * (unsigned short) 0x8004 == (sizeof(int) == 2 ? 0xfff8 : 0xfffefff8));
97 ASSERT((signed LONG ) -2 * (unsigned LONG ) 0x8004 == 0xfffefff8);
99 ASSERT(-1 * 0xfff7 == (sizeof(int) == 2 ? 9 : 0xffff0009)); // 0xfff7 is stored in 'unsigned int'
101 ASSERT(-1 * 65527 == -65527); // 65527 (== 0xfff7) is stored in 'signed LONG'
102 ASSERT(-1 * 33000 == -33000);
104 ASSERT(1 * 10000 * is8 == (sizeof(int) == 2 ? 14464 : 80000)); /* int */
105 ASSERT(1 * 10000l * is8 == 80000); /* LONG */
106 ASSERT(1 * 40000u * is8 == (sizeof(int) == 2 ? 57856u : 320000)); /* unsigned */
107 ASSERT(1 * 40000 * is8 == 320000); /* LONG */
108 ASSERT(1 * 0x4000 * is8 == (sizeof(int) == 2 ? 0 : 0x20000)); /* unsigned */
110 ASSERT(-2 * 1 < 1); /* comparison with 0 is optimized, so let's use 1 instead */
112 ASSERT(0x7fffu * 2 > 1);
113 ASSERT(0x7fffffffu * 2 > 1);
114 if (sizeof (int) == 2)
115 ASSERT(0x7fff * (unsigned char) 2 < 1);
117 ASSERT(mulWrapper(0x7fffffff, (unsigned char) 2) < 1);
118 ASSERT(mulWrapper(0x7fffffff, (unsigned short) 2) < 1);
120 /* mul icode: operandOperation() */
122 ASSERT(s * (stype) -1 == (stype) 3);
123 ASSERT(s * (stype) 1 == (stype) -3);
125 ASSERT(s * (stype) -1 == (stype) -3);
128 ASSERT(s * (utype) 0xfffffff7 == (utype) 0xfffffff7);
129 uc = (unsigned char ) 0xfffffff8;
130 ASSERT(uc * (unsigned char ) 0xfffffff7 == 0xef48);
131 us = (unsigned short) 0xfffffff8;
132 ASSERT(us * (unsigned short) 0xfffffff7 == (sizeof(int) == 2 ? 0x0048 : 0xffef0048));
133 ul = (unsigned LONG ) 0xfffffff8;
134 ASSERT(ul * (unsigned LONG ) 0xfffffff7 == 0x0048);
135 ul = (unsigned LONG ) 0xfffffff8;
137 ASSERT((stype ) 0xfffffff8 * (stype ) 0xfffffff7 == 72);
139 ASSERT((signed char ) -1 * (unsigned char ) 0xfffffff7 == (sizeof(int) == 2 ? 0xff09 : 0xffffff09));
140 ASSERT((signed short) -1 * (unsigned short) 0xfffffff7 == (sizeof(int) == 2 ? 9u : 0xffff0009));
141 ASSERT((signed LONG ) -1 * (unsigned LONG ) 0xfffffff7 == 9u);
143 ASSERT((signed char ) -2 * (unsigned char ) 0x8004 == (sizeof(int) == 2 ? 0xfff8 : 0xfffffff8));
144 ASSERT((signed short) -2 * (unsigned short) 0x8004 == (sizeof(int) == 2 ? 0xfff8 : 0xfffefff8));
145 ASSERT((signed LONG ) -2 * (unsigned LONG ) 0x8004 == 0xfffefff8);
147 /* div ast: valDiv() */
148 ASSERT((stype) -12 / (stype) -3 == (stype) 4);
149 ASSERT((stype) -12 / (stype) 3 == (stype) -4);
150 ASSERT((stype) 12 / (stype) -3 == (stype) -4);
152 ASSERT((unsigned char ) -12 / (signed char ) -3 == (sizeof(int) == 2 ? 0xffaf : 0xffffffaf));
153 ASSERT((unsigned short) -12 / (signed short) -3 == (sizeof(int) == 2 ? 0 : 0xffffaaaf));
154 ASSERT((unsigned LONG ) -12 / (signed LONG ) -3 == 0);
155 ASSERT((utype) -12 / (stype) 3 == (stype) 0x55555551);
156 ASSERT((unsigned char ) 12 / (signed char ) -3 == -4);
157 ASSERT((unsigned short) 12 / (signed short) -3 == (sizeof(int) == 2 ? 0 : 0xfffffffc));
158 ASSERT((unsigned LONG ) 12 / (signed LONG ) -3 == 0);
160 ASSERT((stype) -12 / (utype) -3 == 0);
161 ASSERT((signed char ) -12 / (unsigned char ) 3 == -4);
162 ASSERT((signed short) -12 / (unsigned short) 3 == (sizeof(int) == 2 ? 0x5551 : -4));
163 ASSERT((signed LONG ) -12 / (unsigned LONG ) 3 == 0x55555551);
164 ASSERT((stype) 12 / (utype) -3 == 0);
166 ASSERT(12u / 3 * 10000 == 40000);
170 /* div icode: operandOperation() */
172 ASSERT(s / (stype) -3 == (stype) 4);
174 ASSERT(s / (stype) 3 == (stype) -4);
176 ASSERT(s / (stype) -3 == (stype) -4);
179 ASSERT(uc / (signed char ) -3 == (sizeof(int) == 2 ? 0xffaf : 0xffffffaf));
181 ASSERT(us / (signed short) -3 == (sizeof(int) == 2 ? 0 : 0xffffaaaf));
183 ASSERT(ul / (signed LONG ) -3 == 0);
185 ASSERT(u / (stype) 3 == (stype) 0x55555551);
187 ASSERT(uc / (signed char ) -3 == -4);
189 ASSERT(us / (signed short) -3 == (sizeof(int) == 2 ? 0 : 0xfffffffc));
191 ASSERT(ul / (signed LONG ) -3 == 0);
194 ASSERT(s / (utype) -3 == 0);
196 ASSERT(sc / (unsigned char ) 3 == -4);
198 ASSERT(ss / (unsigned short) 3 == (sizeof(int) == 2 ? 0x5551 : -4));
200 ASSERT(sl / (unsigned LONG ) 3 == 0x55555551);
202 ASSERT(s / (utype) -3 == 0);
205 /* mod ast: valMod() */
208 ASSERT((stype) -17 % (stype) -11 == (stype) -6);
209 ASSERT((stype) -17 % (stype) 11 == (stype) -6);
210 ASSERT((stype) 17 % (stype) -11 == (stype) 6);
211 ASSERT((unsigned char ) -17 % (signed char ) -11 == 8);
212 ASSERT((unsigned short) -17 % (signed short) -11 == (sizeof(int) == 2 ? -17 : 3));
213 ASSERT((unsigned LONG ) -17 % (signed LONG ) -11 == -17);
214 ASSERT((unsigned char ) -17 % (signed char ) 11 == 8);
215 ASSERT((unsigned short) -17 % (signed short) 11 == 3);
216 ASSERT((unsigned LONG ) -17 % (signed LONG ) 11 == 9);
217 ASSERT((unsigned char ) 17 % (signed char ) -11 == 6);
218 ASSERT((unsigned short) 17 % (signed short) -11 == (sizeof(int) == 2 ? 17 : 6));
219 ASSERT((unsigned LONG ) 17 % (signed LONG ) -11 == 17);
225 ASSERT( 80 + 80 == 160);
226 ASSERT(150 + 150 == 300);
227 ASSERT(160u + 160u == 320);