//===- subzero/crosstest/test_strengthreduce_main.cpp - Driver for tests --===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Driver for crosstesting arithmetic strength-reducing optimizations.
//
//===----------------------------------------------------------------------===//

/* crosstest.py --test=test_strengthreduce.cpp \
   --driver=test_strengthreduce_main.cpp \
   --prefix=Subzero_ --clang-opt=0 --output=test_strengthreduce */

#include <iostream>

// Include test_strengthreduce.h twice - once normally, and once
// within the Subzero_ namespace, corresponding to the llc and Subzero
// translated object files, respectively.
#include "test_strengthreduce.h"
namespace Subzero_ {
#include "test_strengthreduce.h"
}

#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else  // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
  size_t TotalTests = 0;
  size_t Passes = 0;
  size_t Failures = 0;
  static int32_t Values[] = {-100, -50, 0, 1, 8, 123, 0x33333333, 0x77777777};
  for (size_t i = 0; i < sizeof(Values) / sizeof(*Values); ++i) {
    int32_t SVal = Values[i];
    int32_t ResultLlcS, ResultSzS;
    uint32_t UVal = (uint32_t)Values[i];
    int32_t ResultLlcU, ResultSzU;

#define X(constant, suffix)                                                    \
  ResultLlcS = multiplyByConst##suffix(UVal);                                  \
  ResultSzS = Subzero_::multiplyByConst##suffix(UVal);                         \
  if (ResultLlcS == ResultSzS) {                                               \
    ++Passes;                                                                  \
  } else {                                                                     \
    ++Failures;                                                                \
    std::cout << "multiplyByConstS" STR(suffix) "(" << SVal                    \
              << "): sz=" << ResultSzS << " llc=" << ResultLlcS << "\n";       \
  }                                                                            \
  ResultLlcU = multiplyByConst##suffix(UVal);                                  \
  ResultSzU = Subzero_::multiplyByConst##suffix(UVal);                         \
  if (ResultLlcU == ResultSzU) {                                               \
    ++Passes;                                                                  \
  } else {                                                                     \
    ++Failures;                                                                \
    std::cout << "multiplyByConstU" STR(suffix) "(" << UVal                    \
              << "): sz=" << ResultSzU << " llc=" << ResultLlcU << "\n";       \
  }
    CONST_TABLE
#undef X
  }

  std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes
            << " Failures=" << Failures << "\n";
  return Failures;
}
