mirror of
https://github.com/nArnoSNES/tcc-65816.git
synced 2024-06-02 19:42:59 +00:00
145 lines
3.6 KiB
C
145 lines
3.6 KiB
C
/* Test arithmetics on bitfields. */
|
|
#ifndef T
|
|
|
|
extern void abort (void);
|
|
extern void exit (int);
|
|
|
|
#ifndef FIELDS1
|
|
#define FIELDS1
|
|
#endif
|
|
#ifndef FIELDS2
|
|
#define FIELDS2
|
|
#endif
|
|
|
|
struct { FIELDS1 unsigned int i : 6, j : 11, k : 15; FIELDS2 } b;
|
|
struct { FIELDS1 unsigned int i : 5, j : 1, k : 16; FIELDS2 } c;
|
|
struct { FIELDS1 unsigned int i : 16, j : 8, k : 8; FIELDS2 } d;
|
|
|
|
unsigned int ret1 (void) { return b.i; }
|
|
unsigned int ret2 (void) { return b.j; }
|
|
unsigned int ret3 (void) { return b.k; }
|
|
unsigned int ret4 (void) { return c.i; }
|
|
unsigned int ret5 (void) { return c.j; }
|
|
unsigned int ret6 (void) { return c.k; }
|
|
unsigned int ret7 (void) { return d.i; }
|
|
unsigned int ret8 (void) { return d.j; }
|
|
unsigned int ret9 (void) { return d.k; }
|
|
|
|
#define T(n, pre, post, op) \
|
|
void fn1_##n (unsigned int x) { pre b.i post; } \
|
|
void fn2_##n (unsigned int x) { pre b.j post; } \
|
|
void fn3_##n (unsigned int x) { pre b.k post; } \
|
|
void fn4_##n (unsigned int x) { pre c.i post; } \
|
|
void fn5_##n (unsigned int x) { pre c.j post; } \
|
|
void fn6_##n (unsigned int x) { pre c.k post; } \
|
|
void fn7_##n (unsigned int x) { pre d.i post; } \
|
|
void fn8_##n (unsigned int x) { pre d.j post; } \
|
|
void fn9_##n (unsigned int x) { pre d.k post; }
|
|
|
|
#include "20040629-1.c"
|
|
#undef T
|
|
|
|
#define FAIL(n, i) abort ()
|
|
|
|
//#define bigding 33554432
|
|
#define bigding 32354
|
|
//#define smallding 264151
|
|
#define smallding 2641
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
#define T(n, pre, post, op) \
|
|
b.i = 51; \
|
|
b.j = 636; \
|
|
b.k = 31278; \
|
|
c.i = 21; \
|
|
c.j = 1; \
|
|
c.k = bigding; \
|
|
d.i = 26812; \
|
|
d.j = 156; \
|
|
d.k = 187; \
|
|
fn1_##n (3); \
|
|
if (ret1 () != (op (51, 3) & ((1 << 6) - 1))) \
|
|
FAIL (n, 1); \
|
|
b.i = 51; \
|
|
fn2_##n (251); \
|
|
if (ret2 () != (op (636, 251) & ((1 << 11) - 1))) \
|
|
FAIL (n, 2); \
|
|
b.j = 636; \
|
|
fn3_##n (13279); \
|
|
if (ret3 () != (op (31278, 13279) & ((1 << 15) - 1))) \
|
|
FAIL (n, 3); \
|
|
b.j = 31278; \
|
|
fn4_##n (24); \
|
|
if (ret4 () != (op (21, 24) & ((1 << 5) - 1))) \
|
|
FAIL (n, 4); \
|
|
c.i = 21; \
|
|
fn5_##n (1); \
|
|
if (ret5 () != (op (1, 1) & ((1 << 1) - 1))) \
|
|
FAIL (n, 5); \
|
|
c.j = 1; \
|
|
fn6_##n (264151); \
|
|
if (ret6 () != (op (bigding, 264151) & ((1 << 26) - 1))) \
|
|
FAIL (n, 6); \
|
|
c.k = bigding; \
|
|
fn7_##n (713); \
|
|
if (ret7 () != (op (26812, 713) & ((1 << 16) - 1))) \
|
|
FAIL (n, 7); \
|
|
d.i = 26812; \
|
|
fn8_##n (17); \
|
|
if (ret8 () != (op (156, 17) & ((1 << 8) - 1))) \
|
|
FAIL (n, 8); \
|
|
d.j = 156; \
|
|
fn9_##n (199); \
|
|
if (ret9 () != (op (187, 199) & ((1 << 8) - 1))) \
|
|
FAIL (n, 9); \
|
|
d.k = 187;
|
|
|
|
#include "20040629-1.c"
|
|
#undef T
|
|
return 0;
|
|
}
|
|
|
|
#else
|
|
|
|
#ifndef opadd
|
|
#define opadd(x, y) (x + y)
|
|
#define opsub(x, y) (x - y)
|
|
#define opinc(x, y) (x + 1)
|
|
#define opdec(x, y) (x - 1)
|
|
#define opand(x, y) (x & y)
|
|
#define opior(x, y) (x | y)
|
|
#define opxor(x, y) (x ^ y)
|
|
#define opdiv(x, y) (x / y)
|
|
#define oprem(x, y) (x % y)
|
|
#define opadd3(x, y) (x + 3)
|
|
#define opsub7(x, y) (x - 7)
|
|
#define opand21(x, y) (x & 21)
|
|
#define opior19(x, y) (x | 19)
|
|
#define opxor37(x, y) (x ^ 37)
|
|
#define opdiv17(x, y) (x / 17)
|
|
#define oprem19(x, y) (x % 19)
|
|
#endif
|
|
|
|
T(1, , += x, opadd)
|
|
T(2, ++, , opinc)
|
|
T(3, , ++, opinc)
|
|
T(4, , -= x, opsub)
|
|
T(5, --, , opdec)
|
|
T(6, , --, opdec)
|
|
T(7, , &= x, opand)
|
|
T(8, , |= x, opior)
|
|
T(9, , ^= x, opxor)
|
|
T(a, , /= x, opdiv)
|
|
T(b, , %= x, oprem)
|
|
T(c, , += 3, opadd3)
|
|
T(d, , -= 7, opsub7)
|
|
T(e, , &= 21, opand21)
|
|
T(f, , |= 19, opior19)
|
|
T(g, , ^= 37, opxor37)
|
|
T(h, , /= 17, opdiv17)
|
|
T(i, , %= 19, oprem19)
|
|
|
|
#endif
|