| #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. |
| |
| #endif // TEST_ARITH_DEF |