blob: 019eb7773c3e920eb8694445ec83fbc888675f5c [file] [log] [blame]
#ifndef TEST_ARITH_DEF
#define TEST_ARITH_DEF
#define XSTR(s) STR(s)
#define STR(s) #s
#define UINTOP_TABLE \
/* inst, operator, div */ \
X(Add, +, 0 ) \
X(Sub, -, 0 ) \
X(Mul, *, 0 ) \
X(Udiv, /, 1 ) \
X(Urem, %, 1 ) \
X(Shl, <<, 0) \
X(Lshr, >>, 0) \
X(And, &, 0 ) \
X(Or, |, 0 ) \
X(Xor, ^, 0 ) \
//#define X(inst, op, isdiv)
#define SINTOP_TABLE \
/* inst, operator, div */ \
X(Sdiv, /, 1) \
X(Srem, %, 1) \
X(Ashr, >>, 0) \
//#define X(inst, op, isdiv)
#define COMMA ,
#define FPOP_TABLE \
/* inst, infix_op, func */ \
X(Fadd, +, ) \
X(Fsub, -, ) \
X(Fmul, *, ) \
X(Fdiv, /, ) \
X(Frem, COMMA, myFrem) \
//#define X(inst, op, func)
// Note: The above definition of COMMA, plus the "func" argument to
// the X macro, are because C++ does not allow the % operator on
// floating-point primitive types. To work around this, the expansion
// is "func(a infix_op b)", which becomes "myFrem(a , b)" for the Frem
// instruction and "(a + b)" for the Fadd instruction. The two
// versions of myFrem() are defined in a separate bitcode file.
#define INT_VALUE_ARRAY \
{ 0x0, 0x1, 0x7ffffffe, 0x7fffffff, \
0x80000000, 0x80000001, 0xfffffffe, 0xffffffff, \
0x7e, 0x7f, 0x80, 0x81, \
0xfe, 0xff, 0x100, 0x101, \
0x7ffe, 0x7fff, 0x8000, 0x8001, \
0xfffe, 0xffff, 0x10000, 0x10001 }
#define FP_VALUE_ARRAY(NegInf, PosInf, NegNan, NaN) \
{ 0, 1, 0x7e, \
0x7f, 0x80, 0x81, \
0xfe, 0xff, 0x7ffe, \
0x7fff, 0x8000, 0x8001, \
0xfffe, 0xffff, 0x7ffffffe, \
0x7fffffff, 0x80000000, 0x80000001, \
0xfffffffe, 0xffffffff, 0x100000000ll, \
0x100000001ll, 0x7ffffffffffffffell, 0x7fffffffffffffffll, \
0x8000000000000000ll, 0x8000000000000001ll, 0xfffffffffffffffell, \
0xffffffffffffffffll, NegInf, PosInf, \
Nan, NegNan, -0.0, \
FLT_MIN, FLT_MAX, DBL_MIN, \
DBL_MAX }
#endif // TEST_ARITH_DEF