diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/regression/tests/bitwise.c | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'support/regression/tests/bitwise.c')
| -rw-r--r-- | support/regression/tests/bitwise.c | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/support/regression/tests/bitwise.c b/support/regression/tests/bitwise.c new file mode 100644 index 0000000..7da181d --- /dev/null +++ b/support/regression/tests/bitwise.c @@ -0,0 +1,327 @@ +/** Test the bitwise operators. + + type: char, short, long + attr: volatile, + storage: static, + */ +#include <testfwk.h> + +void +testTwoOpBitwise(void) +{ + {storage} {attr} {type} left, right; + + left = ({type})0x3df7; + right = ({type})0xc1ec; + + ASSERT(({type})(left & right) == ({type})0x1E4); + ASSERT(({type})(right & left) == ({type})0x1E4); + ASSERT(({type})(left & 0xc1ec) == ({type})0x1E4); + ASSERT(({type})(0x3df7 & right) == ({type})0x1E4); + +#ifndef __SDCC_pdk14 // Lack of memory + ASSERT(({type})(left | right) == ({type})0xFDFF); + ASSERT(({type})(right | left) == ({type})0xFDFF); + ASSERT(({type})(left | 0xc1ec) == ({type})0xFDFF); + ASSERT(({type})(0x3df7 | right) == ({type})0xFDFF); + + ASSERT(({type})(left ^ right) == ({type})0xFC1B); + ASSERT(({type})(right ^ left) == ({type})0xFC1B); + ASSERT(({type})(left ^ 0xc1ec) == ({type})0xFC1B); + ASSERT(({type})(0x3df7 ^ right) == ({type})0xFC1B); + +#if defined (__alpha__) || defined (__x86_64__) || defined(__sparc64__) || defined(__PPC64__) || defined (__aarch64__) + /* long is 64 bits on 64 bit machines */ + ASSERT(({type})(~left) == ({type})0xFFFFFFFFFFFFC208); +#else + ASSERT(({type})(~left) == ({type})0xFFFFC208); +#endif +#endif +} + +void +testAnd(void) +{ + char res; + {attr} int a; + + /* always false if right literal == 0 */ +#if 0 + // fails on pic16 + if (a & 0) + res = 1; + else + res = 0; + ASSERT(res = 0); + + a = 0x1234; + + if (a & 0) + res = 1; + else + res = 0; + ASSERT(res = 0); +#endif + + /* + * result: if, left: var, right: literal + */ + a = 0x1234; + + if (a & 0x4321) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (a & 0x4321) + /* nothing for true */ + ; + else + res = 0; + ASSERT(res == 1); + + if (!(a & 0x4321)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + if (!(a & 0x4321)) + /* nothing for true */ + ; + else + res = 0; + ASSERT(res == 0); + + /* bitmask literal */ + a = 0xffff; + + if (a & 0x1004) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (!(a & 0x1004)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + a = 0x0000; + + if (a & 0x1004) + res = 1; + else + res = 0; + ASSERT(res == 0); + + if (!(a & 0x1004)) + res = 1; + else + res = 0; + ASSERT(res == 1); + + a = 0x00ff; + + if (a & 0x1004) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (!(a & 0x1004)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + a = 0xff00; + + if (a & 0x1004) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (!(a & 0x1004)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + /* literal with zero bytes */ + a = 0x1234; + + if (a & 0x4300) + res = 1; + else + res = 0; + ASSERT(res == 1); +#ifndef __SDCC_pdk14 // Lack of memory + if (a & 0x0012) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (!(a & 0x4300)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + if (!(a & 0x0012)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + /* + * result: bit, left: var, right: literal + */ +#endif +} + +void +testOr(void) +{ + char res; + {attr} int a = 0x1234; + + /* + * result: if, left: var, right: literal + */ + res = 1; + if (a | 0x4321) + /* nothing for true */ + ; + else + res = 0; + ASSERT(res == 1); + + if (!(a | 0x4321)) + /* nothing for true */ + ; + else + res = 0; + ASSERT(res == 0); +#ifndef __SDCC_pdk14 // Lack of memory + if (a | 0x4321) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (!(a | 0x4321)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + /* or with zero: result is left */ + res = 1; + + if (a | 0) + /* nothing for true */ + ; + else + res = 0; + ASSERT(res == 1); + + res = 1; + + if (!(a | 0)) + /* nothing for true */ + ; + else + res = 0; + ASSERT(res == 0); + + if (a | 0) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (!(a | 0)) + res = 1; + else + res = 0; + ASSERT(res == 0); +#endif +} + +void +testXor(void) +{ + char res; + {attr} int a = 0x1234; + + /* + * result: if, left: var, right: literal + */ + if (a ^ 0x4321) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (a ^ 0x4321) + /* nothing for true */ + ; + else + res = 0; + ASSERT(res == 1); +#ifndef __SDCC_pdk14 // Lack of memory + if (!(a ^ 0x4321)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + if (!(a ^ 0x4321)) + /* nothing for true */ + ; + else + res = 0; + ASSERT(res == 0); + + /* literal with 0xff bytes */ + if (a ^ 0xff04) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (!(a ^ 0xff04)) + res = 1; + else + res = 0; + ASSERT(res == 0); + + /* literal with zero bytes */ + if (a ^ 0x0004) + res = 1; + else + res = 0; + ASSERT(res == 1); + + if (!(a ^ 0x0004)) + res = 1; + else + res = 0; + ASSERT(res == 0); +#endif +} + +static void +testBug_1777758(void) +{ + char ep = -1; + + ep &= ~0x80; + + ASSERT(ep == 127); +} |
