//===- subzero/crosstest/test_arith.def - macros for tests ----*- C++ -*---===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines macros for crosstesting arithmetic operations.
//
//===----------------------------------------------------------------------===//

#ifndef TEST_ARITH_DEF
#define TEST_ARITH_DEF

#define XSTR(s) STR(s)
#define STR(s) #s

#define UINTOP_TABLE                                                           \
  /* inst, operator, div, shift */                                             \
  X(Add,   +,        0,   0)                                                   \
  X(Sub,   -,        0,   0)                                                   \
  X(Mul,   *,        0,   0)                                                   \
  X(Udiv,  /,        1,   0)                                                   \
  X(Urem,  %,        1,   0)                                                   \
  X(Shl,   <<,       0,   1)                                                   \
  X(Lshr,  >>,       0,   1)                                                   \
  X(And,   &,        0,   0)                                                   \
  X(Or,    |,        0,   0)                                                   \
  X(Xor,   ^,        0,   0)                                                   \
//#define X(inst, op, isdiv, isshift)

#define SINTOP_TABLE                                                           \
  /* inst, operator, div, shift */                                             \
  X(Sdiv,  /,        1,   0)                                                   \
  X(Srem,  %,        1,   0)                                                   \
  X(Ashr,  >>,       0,   1)                                                   \
//#define X(inst, op, isdiv, isshift)

#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,                              \
  0x1e, 0x1f, 0x20, 0x21, 0x3e, 0x3f, 0x40, 0x41,                              \
  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,                    1.4,                             \
  1.5,                  1.6,                  -1.4,                            \
  -1.5,                 -1.6,                 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,                            \
  10.0,                 FLT_MIN,              FLT_MAX,                         \
  DBL_MIN,              DBL_MAX }

#define MULIMM_TABLE                                                           \
   /* mult_by */                                                               \
  X(         0)                                                                \
  X(         1)                                                                \
  X(         2)                                                                \
  X(         3)                                                                \
  X(         4)                                                                \
  X(         5)                                                                \
  X(         7)                                                                \
  X(         8)                                                                \
  X(         9)                                                                \
  X(        10)                                                                \
  X(        25)                                                                \
  X(       100)                                                                \
  X(       232)                                                                \
  X(0x00FFF001)                                                                \
  X(0x01000000)                                                                \
  X(0x7FFFF07F)                                                                \
  X(0x80000000)                                                                \
//#define X(mult_by)

#endif // TEST_ARITH_DEF
