/** Bitfield tests.
+ SDCC pic16 port currently does not support bitfields of size > 8,
+ so they are ifdefed out.
*/
#include <testfwk.h>
char c3_5 : 5;
} c_bf;
+#if !defined(SDCC_pic16)
struct {
int i0_7 : 7;
int i7_9 : 9;
unsigned int b8 : 1;
unsigned int b9 : 1;
} sb_bf;
+#endif /* !SDCC_pic16 */
struct {
unsigned int b0 : 1;
unsigned int b1 : 1;
} size2a_bf;
+#if !defined(SDCC_pic16)
struct {
unsigned int b0 : 1;
unsigned int b1 : 1;
signed int s7_1 : 1;
signed int s8_9 : 9;
} s_bf;
-
+#endif /* !SDCC_pic16 */
void
testBitfieldSizeof(void)
ASSERT( sizeof(size1a_bf) >= 1);
ASSERT( sizeof(size1b_bf) >= 1);
ASSERT( sizeof(size1c_bf) >= 1);
-#if !defined (__amd64__) && !defined(__CYGWIN32__) && !defined(__MINGW32__)
- /* assertion fails on amd64, cygwin and mingw.
- Maybe it depends on gcc version?
- */
- ASSERT( sizeof(size2a_bf) >= 2);
-#endif
+#if !defined(SDCC_pic16)
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__) && !defined(__CYGWIN32__) && !defined(__MINGW32__)
- /* assertion fails on amd64, cygwin and mingw.
- Maybe it depends on gcc version?
- */
- ASSERT( sizeof(size1a_bf) < sizeof(size2a_bf));
-#endif
-
+#endif /* !SDCC_pic16 */
/* Some SDCC specific assertions. SDCC uses 8 bit storage units.
Bitfields that are less than 8 bits, but would (due to earlier
bitfield declarations) span a storage unit boundary are
ASSERT( sizeof(size1b_bf) == 1);
ASSERT( sizeof(size1c_bf) == 1);
ASSERT( sizeof(size2a_bf) == 2);
+#if !defined(SDCC_pic16)
ASSERT( sizeof(size2b_bf) == 2);
ASSERT( sizeof(size2c_bf) == 2);
ASSERT( sizeof(size2d_bf) == 2);
ASSERT( sizeof(size3a_bf) == 3);
+#endif /* !SDCC_pic16 */
#endif
}
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;
+#if !defined(SDCC_pic16)
+ 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;
ASSERT(size2b_bf.b7==0);
ASSERT(size2b_bf.b8==0);
ASSERT(size2b_bf.b9==1);
+#endif /* !SDCC_pic16 */
}
void
testBitfieldsSingleBit(void)
{
+#if !defined(SDCC_pic16)
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;
ASSERT(size2b_bf.b7==0);
ASSERT(size2b_bf.b8==0);
ASSERT(size2b_bf.b9==1);
+#endif /* !SDCC_pic16 */
}
void
testBitfieldsMultibitLiteral(void)
{
+#if !defined(SDCC_pic16)
size2c_bf.b0 = 0xff; /* should truncate to 0x0f */
size2c_bf.b1 = 0;
ASSERT(size2c_bf.b0==0x0f);
size2d_bf.b1 = 5;
ASSERT(size2d_bf.b0==0x0a46);
ASSERT(size2d_bf.b1==5);
+#endif /* !SDCC_pic16 */
}
void
testBitfieldsMultibit(void)
{
+#if !defined(SDCC_pic16)
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);
size2d_bf.b1 = x;
ASSERT(size2d_bf.b0==0x0a46);
ASSERT(size2d_bf.b1==5);
+#endif /* !SDCC_pic16 */
}
void
{
c_bf.c0_3 = 2;
c_bf.c3_5 = 3;
+#if defined(PORT_HOST) && (defined(__ppc__) || defined(__PPC__))
+ /* bitfields on powerpc architecture are allocated from left to right */
+ ASSERT(*(char *)(&c_bf) == ((2<<(8-3)) + 3) );
+#else
ASSERT(*(char *)(&c_bf) == (2 + (3<<3)) );
+#endif
#if 0 // not yet
i_bf.i0_7 = 23;
void
testSignedBitfields(void)
{
-#if !defined(SDCC_hc08) && !defined(SDCC_z80) && !defined(SDCC_gbz80)
+#if !defined(SDCC_pic16)
s_bf.s0_7 = 0xf0;
s_bf.s7_1 = 1;
s_bf.s8_9 = 0xfff8;
ASSERT(s_bf.s8_9 == 0xff);
ASSERT(s_bf.s0_7 > 0);
ASSERT(s_bf.s8_9 > 0);
-#endif
+#endif /* !SDCC_pic16 */
}