X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=support%2Fregression%2Ftests%2Fbitfields.c;h=7007741142d02d80e72e5cbbf18dd29f8df8c824;hb=2445815caa572f0151cbb551b2d7b55ef95786ba;hp=4ed42e256a3b36e2f6e15c9bef874ed7a133e00b;hpb=53c9b327792b000f06d162ceb30460ca5fa76aab;p=fw%2Fsdcc diff --git a/support/regression/tests/bitfields.c b/support/regression/tests/bitfields.c index 4ed42e25..70077411 100644 --- a/support/regression/tests/bitfields.c +++ b/support/regression/tests/bitfields.c @@ -85,6 +85,13 @@ struct { } size3a_bf; +struct { + signed int s0_7 : 7; + signed int s7_1 : 1; + signed int s8_9 : 9; +} s_bf; + + void testBitfieldSizeof(void) { @@ -95,19 +102,11 @@ testBitfieldSizeof(void) ASSERT( sizeof(size1a_bf) >= 1); ASSERT( sizeof(size1b_bf) >= 1); ASSERT( sizeof(size1c_bf) >= 1); -#if !defined (__amd64__) - /* assertion fails on amd64 */ - ASSERT( sizeof(size2a_bf) >= 2); -#endif ASSERT( sizeof(size2b_bf) >= 2); ASSERT( sizeof(size2c_bf) >= 2); ASSERT( sizeof(size2d_bf) >= 2); ASSERT( sizeof(size3a_bf) >= 2); ASSERT( sizeof(size1a_bf) <= sizeof(size1b_bf)); -#if !defined (__amd64__) - /* assertion fails on amd64 */ - ASSERT( sizeof(size1a_bf) < sizeof(size2a_bf)); -#endif /* Some SDCC specific assertions. SDCC uses 8 bit storage units. Bitfields that are less than 8 bits, but would (due to earlier @@ -132,16 +131,16 @@ testBitfieldSizeof(void) void testBitfieldsSingleBitLiteral(void) { - size2b_bf.b0 = 0; - size2b_bf.b1 = 0; - size2b_bf.b2 = 0; - size2b_bf.b3 = 0; - size2b_bf.b4 = 0; - size2b_bf.b5 = 0; - size2b_bf.b6 = 0; - size2b_bf.b7 = 0; - size2b_bf.b8 = 0; - size2b_bf.b9 = 0; + size2b_bf.b0 = 0; + size2b_bf.b1 = 0; + size2b_bf.b2 = 0; + size2b_bf.b3 = 0; + size2b_bf.b4 = 0; + size2b_bf.b5 = 0; + size2b_bf.b6 = 0; + size2b_bf.b7 = 0; + size2b_bf.b8 = 0; + size2b_bf.b9 = 0; /* make sure modulo 2 truncation works */ size2b_bf.b0 = 0x3fe; @@ -187,16 +186,16 @@ testBitfieldsSingleBit(void) volatile unsigned char c; c = 0; - size2b_bf.b0 = c; - size2b_bf.b1 = c; - size2b_bf.b2 = c; - size2b_bf.b3 = c; - size2b_bf.b4 = c; - size2b_bf.b5 = c; - size2b_bf.b6 = c; - size2b_bf.b7 = c; - size2b_bf.b8 = c; - size2b_bf.b9 = c; + size2b_bf.b0 = c; + size2b_bf.b1 = c; + size2b_bf.b2 = c; + size2b_bf.b3 = c; + size2b_bf.b4 = c; + size2b_bf.b5 = c; + size2b_bf.b6 = c; + size2b_bf.b7 = c; + size2b_bf.b8 = c; + size2b_bf.b9 = c; /* make sure modulo 2 truncation works */ c = 0xfe; @@ -251,6 +250,11 @@ testBitfieldsMultibitLiteral(void) ASSERT(size2c_bf.b0==0); ASSERT(size2c_bf.b1==0x1f); + size2c_bf.b0 = 0xff; /* should truncate to 0x0f */ + size2c_bf.b1 = 0xff; /* should truncate to 0x1f */ + ASSERT(size2c_bf.b0==0x0f); + ASSERT(size2c_bf.b1==0x1f); + size2d_bf.b0 = 0xffff; /* should truncate to 0x0fff */ size2d_bf.b1 = 0; ASSERT(size2d_bf.b0==0x0fff); @@ -261,6 +265,11 @@ testBitfieldsMultibitLiteral(void) ASSERT(size2d_bf.b0==0); ASSERT(size2d_bf.b1==0x07); + size2d_bf.b0 = 0xffff; /* should truncate to 0x0fff */ + size2d_bf.b1 = 0xffff; /* should truncate to 0x07 */ + ASSERT(size2d_bf.b0==0x0fff); + ASSERT(size2d_bf.b1==0x07); + size2d_bf.b0 = 0x0321; size2d_bf.b1 = 1; ASSERT(size2d_bf.b0==0x0321); @@ -278,7 +287,7 @@ testBitfieldsMultibit(void) volatile int allones = 0xffff; volatile int zero = 0; volatile int x; - + size2c_bf.b0 = allones; /* should truncate to 0x0f */ size2c_bf.b1 = zero; ASSERT(size2c_bf.b0==0x0f); @@ -317,18 +326,41 @@ testBitfieldsMultibit(void) void testBitfields(void) { -#if 0 // not yet - c_bitfield.c0_3 = 2; - c_bitfield.c3_5 = 3; - ASSERT(*(char *)(&c_bitfield) == (2 + (3<<3)) ); + c_bf.c0_3 = 2; + c_bf.c3_5 = 3; + ASSERT(*(char *)(&c_bf) == (2 + (3<<3)) ); - i_bitfield.i0_7 = 23; - i_bitfield.i7_9 = 234; - ASSERT(*(int *)(&i_bitfield) == (23 + (234<<7)) ); +#if 0 // not yet + i_bf.i0_7 = 23; + i_bf.i7_9 = 234; + ASSERT(*(int *)(&i_bf) == (23 + (234<<7)) ); l_bitfield.l0_7 = 23; l_bitfield.l7_10 = 234; l_bitfield.l17_15 = 2345; - ASSERT(*(long *)(&l_bitfield) == (23 + (234<<7) + (2345<<17)) ); + ASSERT(*(long *)(&l_bf) == (23 + (234<<7) + (2345<<17)) ); #endif } + +void +testSignedBitfields(void) +{ + s_bf.s0_7 = 0xf0; + s_bf.s7_1 = 1; + s_bf.s8_9 = 0xfff8; + ASSERT(s_bf.s0_7 == -16); + ASSERT(s_bf.s7_1 == - 1); + ASSERT(s_bf.s8_9 == - 8); + ASSERT(s_bf.s0_7 < 0); + ASSERT(s_bf.s7_1 < 0); + ASSERT(s_bf.s8_9 < 0); + + s_bf.s0_7 = 0x3f; + s_bf.s7_1 = 2; + s_bf.s8_9 = 0x00ff; + ASSERT(s_bf.s0_7 == 0x3f); + ASSERT(s_bf.s7_1 == 0); + ASSERT(s_bf.s8_9 == 0xff); + ASSERT(s_bf.s0_7 > 0); + ASSERT(s_bf.s8_9 > 0); +}