3 SDCC pic16 port currently does not support bitfields of size > 8,
4 so they are ifdefed out.
13 #if !defined(SDCC_pic16)
38 #endif /* !SDCC_pic16 */
63 #if !defined(SDCC_pic16)
98 #endif /* !SDCC_pic16 */
101 testBitfieldSizeof(void)
103 /* Although bitfields are extremely implementation dependant, these
104 assertions should hold for all implementations with storage units
105 of 8 bits or larger (nearly universal).
107 ASSERT( sizeof(size1a_bf) >= 1);
108 ASSERT( sizeof(size1b_bf) >= 1);
109 ASSERT( sizeof(size1c_bf) >= 1);
110 #if !defined(SDCC_pic16)
111 ASSERT( sizeof(size2b_bf) >= 2);
112 ASSERT( sizeof(size2c_bf) >= 2);
113 ASSERT( sizeof(size2d_bf) >= 2);
114 ASSERT( sizeof(size3a_bf) >= 2);
115 ASSERT( sizeof(size1a_bf) <= sizeof(size1b_bf));
116 #endif /* !SDCC_pic16 */
117 /* Some SDCC specific assertions. SDCC uses 8 bit storage units.
118 Bitfields that are less than 8 bits, but would (due to earlier
119 bitfield declarations) span a storage unit boundary are
120 realigned to the next storage unit boundary. Bitfields of
121 8 or greater bits are always aligned to start on a storage
125 ASSERT( sizeof(size1a_bf) == 1);
126 ASSERT( sizeof(size1b_bf) == 1);
127 ASSERT( sizeof(size1c_bf) == 1);
128 ASSERT( sizeof(size2a_bf) == 2);
129 #if !defined(SDCC_pic16)
130 ASSERT( sizeof(size2b_bf) == 2);
131 ASSERT( sizeof(size2c_bf) == 2);
132 ASSERT( sizeof(size2d_bf) == 2);
133 ASSERT( sizeof(size3a_bf) == 3);
134 #endif /* !SDCC_pic16 */
140 testBitfieldsSingleBitLiteral(void)
142 #if !defined(SDCC_pic16)
154 /* make sure modulo 2 truncation works */
155 size2b_bf.b0 = 0x3fe;
156 ASSERT(size2b_bf.b0==0);
157 ASSERT(size2b_bf.b1==0);
158 ASSERT(size2b_bf.b2==0);
159 ASSERT(size2b_bf.b3==0);
160 ASSERT(size2b_bf.b4==0);
161 ASSERT(size2b_bf.b5==0);
162 ASSERT(size2b_bf.b6==0);
163 ASSERT(size2b_bf.b7==0);
164 ASSERT(size2b_bf.b8==0);
165 ASSERT(size2b_bf.b9==0);
166 size2b_bf.b0 = 0x3ff;
167 ASSERT(size2b_bf.b0==1);
168 ASSERT(size2b_bf.b1==0);
169 ASSERT(size2b_bf.b2==0);
170 ASSERT(size2b_bf.b3==0);
171 ASSERT(size2b_bf.b4==0);
172 ASSERT(size2b_bf.b5==0);
173 ASSERT(size2b_bf.b6==0);
174 ASSERT(size2b_bf.b7==0);
175 ASSERT(size2b_bf.b8==0);
176 ASSERT(size2b_bf.b9==0);
178 /* make sure both bytes work */
179 size2b_bf.b9 = 0x3ff;
180 ASSERT(size2b_bf.b0==1);
181 ASSERT(size2b_bf.b1==0);
182 ASSERT(size2b_bf.b2==0);
183 ASSERT(size2b_bf.b3==0);
184 ASSERT(size2b_bf.b4==0);
185 ASSERT(size2b_bf.b5==0);
186 ASSERT(size2b_bf.b6==0);
187 ASSERT(size2b_bf.b7==0);
188 ASSERT(size2b_bf.b8==0);
189 ASSERT(size2b_bf.b9==1);
190 #endif /* !SDCC_pic16 */
194 testBitfieldsSingleBit(void)
196 #if !defined(SDCC_pic16)
197 volatile unsigned char c;
211 /* make sure modulo 2 truncation works */
214 ASSERT(size2b_bf.b0==0);
215 ASSERT(size2b_bf.b1==0);
216 ASSERT(size2b_bf.b2==0);
217 ASSERT(size2b_bf.b3==0);
218 ASSERT(size2b_bf.b4==0);
219 ASSERT(size2b_bf.b5==0);
220 ASSERT(size2b_bf.b6==0);
221 ASSERT(size2b_bf.b7==0);
222 ASSERT(size2b_bf.b8==0);
223 ASSERT(size2b_bf.b9==0);
226 ASSERT(size2b_bf.b0==1);
227 ASSERT(size2b_bf.b1==0);
228 ASSERT(size2b_bf.b2==0);
229 ASSERT(size2b_bf.b3==0);
230 ASSERT(size2b_bf.b4==0);
231 ASSERT(size2b_bf.b5==0);
232 ASSERT(size2b_bf.b6==0);
233 ASSERT(size2b_bf.b7==0);
234 ASSERT(size2b_bf.b8==0);
235 ASSERT(size2b_bf.b9==0);
237 /* make sure both bytes work */
239 ASSERT(size2b_bf.b0==1);
240 ASSERT(size2b_bf.b1==0);
241 ASSERT(size2b_bf.b2==0);
242 ASSERT(size2b_bf.b3==0);
243 ASSERT(size2b_bf.b4==0);
244 ASSERT(size2b_bf.b5==0);
245 ASSERT(size2b_bf.b6==0);
246 ASSERT(size2b_bf.b7==0);
247 ASSERT(size2b_bf.b8==0);
248 ASSERT(size2b_bf.b9==1);
249 #endif /* !SDCC_pic16 */
253 testBitfieldsMultibitLiteral(void)
255 #if !defined(SDCC_pic16)
256 size2c_bf.b0 = 0xff; /* should truncate to 0x0f */
258 ASSERT(size2c_bf.b0==0x0f);
259 ASSERT(size2c_bf.b1==0);
261 size2c_bf.b1 = 0xff; /* should truncate to 0x1f */
263 ASSERT(size2c_bf.b0==0);
264 ASSERT(size2c_bf.b1==0x1f);
266 size2c_bf.b0 = 0xff; /* should truncate to 0x0f */
267 size2c_bf.b1 = 0xff; /* should truncate to 0x1f */
268 ASSERT(size2c_bf.b0==0x0f);
269 ASSERT(size2c_bf.b1==0x1f);
271 size2d_bf.b0 = 0xffff; /* should truncate to 0x0fff */
273 ASSERT(size2d_bf.b0==0x0fff);
274 ASSERT(size2d_bf.b1==0);
276 size2d_bf.b1 = 0xffff; /* should truncate to 0x07 */
278 ASSERT(size2d_bf.b0==0);
279 ASSERT(size2d_bf.b1==0x07);
281 size2d_bf.b0 = 0xffff; /* should truncate to 0x0fff */
282 size2d_bf.b1 = 0xffff; /* should truncate to 0x07 */
283 ASSERT(size2d_bf.b0==0x0fff);
284 ASSERT(size2d_bf.b1==0x07);
286 size2d_bf.b0 = 0x0321;
288 ASSERT(size2d_bf.b0==0x0321);
289 ASSERT(size2d_bf.b1==1);
291 size2d_bf.b0 = 0x0a46;
293 ASSERT(size2d_bf.b0==0x0a46);
294 ASSERT(size2d_bf.b1==5);
295 #endif /* !SDCC_pic16 */
299 testBitfieldsMultibit(void)
301 #if !defined(SDCC_pic16)
302 volatile int allones = 0xffff;
303 volatile int zero = 0;
306 size2c_bf.b0 = allones; /* should truncate to 0x0f */
308 ASSERT(size2c_bf.b0==0x0f);
309 ASSERT(size2c_bf.b1==0);
311 size2c_bf.b1 = allones; /* should truncate to 0x1f */
313 ASSERT(size2c_bf.b0==0);
314 ASSERT(size2c_bf.b1==0x1f);
316 size2d_bf.b0 = allones; /* should truncate to 0x0fff */
318 ASSERT(size2d_bf.b0==0x0fff);
319 ASSERT(size2d_bf.b1==0);
321 size2d_bf.b1 = allones; /* should truncate to 0x07 */
323 ASSERT(size2d_bf.b0==0);
324 ASSERT(size2d_bf.b1==0x07);
330 ASSERT(size2d_bf.b0==0x0321);
331 ASSERT(size2d_bf.b1==1);
337 ASSERT(size2d_bf.b0==0x0a46);
338 ASSERT(size2d_bf.b1==5);
339 #endif /* !SDCC_pic16 */
347 #if defined(PORT_HOST) && (defined(__ppc__) || defined(__PPC__))
348 /* bitfields on powerpc architecture are allocated from left to right */
349 ASSERT(*(char *)(&c_bf) == ((2<<(8-3)) + 3) );
351 ASSERT(*(char *)(&c_bf) == (2 + (3<<3)) );
357 ASSERT(*(int *)(&i_bf) == (23 + (234<<7)) );
359 l_bitfield.l0_7 = 23;
360 l_bitfield.l7_10 = 234;
361 l_bitfield.l17_15 = 2345;
362 ASSERT(*(long *)(&l_bf) == (23 + (234<<7) + (2345<<17)) );
367 testSignedBitfields(void)
369 #if !defined(SDCC_pic16)
373 ASSERT(s_bf.s0_7 == -16);
374 ASSERT(s_bf.s7_1 == - 1);
375 ASSERT(s_bf.s8_9 == - 8);
376 ASSERT(s_bf.s0_7 < 0);
377 ASSERT(s_bf.s7_1 < 0);
378 ASSERT(s_bf.s8_9 < 0);
383 ASSERT(s_bf.s0_7 == 0x3f);
384 ASSERT(s_bf.s7_1 == 0);
385 ASSERT(s_bf.s8_9 == 0xff);
386 ASSERT(s_bf.s0_7 > 0);
387 ASSERT(s_bf.s8_9 > 0);
388 #endif /* !SDCC_pic16 */