1ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//===- subzero/crosstest/test_fcmp_main.cpp - Driver for tests ------------===//
2ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//
3ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//                        The Subzero Code Generator
4ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//
5ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala// This file is distributed under the University of Illinois Open Source
6ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala// License. See LICENSE.TXT for details.
7ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//
8ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//===----------------------------------------------------------------------===//
9ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//
10ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala// Driver for cross testing the fcmp bitcode instruction
11ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//
12ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala//===----------------------------------------------------------------------===//
13ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala
145bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth/* crosstest.py --test=test_fcmp.pnacl.ll --driver=test_fcmp_main.cpp \
155bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth   --prefix=Subzero_ --output=test_fcmp */
165bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
175bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include <cassert>
185bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include <cfloat>
195bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include <cmath>
20ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala#include <cstring>
215bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include <iostream>
225bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
23ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala#include "vectors.h"
24109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung#include "test_arith.def"
255bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#include "test_fcmp.def"
265bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
275bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#define X(cmp)                                                                 \
285bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  extern "C" bool fcmp##cmp##Float(float a, float b);                          \
295bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  extern "C" bool fcmp##cmp##Double(double a, double b);                       \
30e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr  extern "C" int fcmpSelect##cmp##Float(float a, float b, int c, int d);       \
31e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr  extern "C" int fcmpSelect##cmp##Double(double a, double b, int c, int d);    \
32ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  extern "C" v4si32 fcmp##cmp##Vector(v4f32 a, v4f32 b);                       \
335bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  extern "C" bool Subzero_fcmp##cmp##Float(float a, float b);                  \
34ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  extern "C" bool Subzero_fcmp##cmp##Double(double a, double b);               \
35e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr  extern "C" int Subzero_fcmpSelect##cmp##Float(float a, float b, int c,       \
36e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr                                                int d);                        \
37e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr  extern "C" int Subzero_fcmpSelect##cmp##Double(double a, double b, int c,    \
38e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr                                                 int d);                       \
39ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  extern "C" v4si32 Subzero_fcmp##cmp##Vector(v4f32 a, v4f32 b);
405bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim StichnothFCMP_TABLE;
415bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#undef X
425bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
43ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Walavolatile double *Values;
44ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Walasize_t NumValues;
45ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala
46ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Walavoid initializeValues() {
475bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  static const double NegInf = -1.0 / 0.0;
485bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  static const double Zero = 0.0;
495bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  static const double PosInf = 1.0 / 0.0;
505bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  static const double Nan = 0.0 / 0.0;
51f37fbbe924edccd340b7448a7482c45a9fccda5bJan Voung  static const double NegNan = -0.0 / 0.0;
525bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  assert(std::fpclassify(NegInf) == FP_INFINITE);
535bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  assert(std::fpclassify(PosInf) == FP_INFINITE);
545bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  assert(std::fpclassify(Nan) == FP_NAN);
55f37fbbe924edccd340b7448a7482c45a9fccda5bJan Voung  assert(std::fpclassify(NegNan) == FP_NAN);
565bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  assert(NegInf < Zero);
575bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  assert(NegInf < PosInf);
585bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  assert(Zero < PosInf);
59109fa15292072057ebcb12f8a69c496dd2486bf1Jan Voung  static volatile double InitValues[] =
60dd842dbb57b825ed0dd6400648d0602b74c90affJim Stichnoth      FP_VALUE_ARRAY(NegInf, PosInf, NegNan, Nan);
61ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  NumValues = sizeof(InitValues) / sizeof(*InitValues);
62ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  Values = InitValues;
63ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala}
645bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
65ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Walavoid testsScalar(size_t &TotalTests, size_t &Passes, size_t &Failures) {
665bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  typedef bool (*FuncTypeFloat)(float, float);
675bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  typedef bool (*FuncTypeDouble)(double, double);
68e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr  typedef int (*FuncTypeFloatSelect)(float, float, int, int);
69e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr  typedef int (*FuncTypeDoubleSelect)(double, double, int, int);
705bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  static struct {
715bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth    const char *Name;
725bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth    FuncTypeFloat FuncFloatSz;
735bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth    FuncTypeFloat FuncFloatLlc;
745bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth    FuncTypeDouble FuncDoubleSz;
755bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth    FuncTypeDouble FuncDoubleLlc;
76e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr    FuncTypeFloatSelect FuncFloatSelectSz;
77e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr    FuncTypeFloatSelect FuncFloatSelectLlc;
78e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr    FuncTypeDoubleSelect FuncDoubleSelectSz;
79e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr    FuncTypeDoubleSelect FuncDoubleSelectLlc;
805bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  } Funcs[] = {
815bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#define X(cmp)                                                                 \
825bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  {                                                                            \
835bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth    "fcmp" STR(cmp), Subzero_fcmp##cmp##Float, fcmp##cmp##Float,               \
84e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        Subzero_fcmp##cmp##Double, fcmp##cmp##Double,                          \
85e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        Subzero_fcmpSelect##cmp##Float, fcmpSelect##cmp##Float,                \
86e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        Subzero_fcmpSelect##cmp##Double, fcmpSelect##cmp##Double               \
875bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  }                                                                            \
885bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  ,
89d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth      FCMP_TABLE
905bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth#undef X
91d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth  };
925bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs);
935bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
945bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  bool ResultSz, ResultLlc;
955bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
96ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  assert(Values && NumValues);
975bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
985bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  for (size_t f = 0; f < NumFuncs; ++f) {
995bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth    for (size_t i = 0; i < NumValues; ++i) {
1005bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth      for (size_t j = 0; j < NumValues; ++j) {
1015bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        ++TotalTests;
1025bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        float Value1Float = Values[i];
1035bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        float Value2Float = Values[j];
1045bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        ResultSz = Funcs[f].FuncFloatSz(Value1Float, Value2Float);
1055bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        ResultLlc = Funcs[f].FuncFloatLlc(Value1Float, Value2Float);
1065bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        if (ResultSz == ResultLlc) {
1075bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth          ++Passes;
1085bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        } else {
1095bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth          ++Failures;
1105bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth          std::cout << Funcs[f].Name << "Float(" << Value1Float << ", "
1115bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth                    << Value2Float << "): sz=" << ResultSz
112ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala                    << " llc=" << ResultLlc << "\n";
1135bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        }
1145bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        ++TotalTests;
1155bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        double Value1Double = Values[i];
1165bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        double Value2Double = Values[j];
1175bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        ResultSz = Funcs[f].FuncDoubleSz(Value1Double, Value2Double);
1185bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        ResultLlc = Funcs[f].FuncDoubleLlc(Value1Double, Value2Double);
1195bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        if (ResultSz == ResultLlc) {
1205bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth          ++Passes;
1215bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        } else {
1225bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth          ++Failures;
1235bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth          std::cout << Funcs[f].Name << "Double(" << Value1Double << ", "
1245bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth                    << Value2Double << "): sz=" << ResultSz
125ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala                    << " llc=" << ResultLlc << "\n";
1265bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth        }
127e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        ++TotalTests;
128e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        float Value1SelectFloat = Values[i];
129e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        float Value2SelectFloat = Values[j];
130e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        ResultSz = Funcs[f].FuncFloatSelectSz(Value1Float, Value2Float, 1, 2);
131e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        ResultLlc = Funcs[f].FuncFloatSelectLlc(Value1Float, Value2Float, 1, 2);
132e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        if (ResultSz == ResultLlc) {
133e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr          ++Passes;
134e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        } else {
135e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr          ++Failures;
136e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr          std::cout << Funcs[f].Name << "SelectFloat(" << Value1Float << ", "
137e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr                    << Value2Float << "): sz=" << ResultSz
138e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr                    << " llc=" << ResultLlc << "\n";
139e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        }
140e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        ++TotalTests;
141e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        double Value1SelectDouble = Values[i];
142e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        double Value2SelectDouble = Values[j];
143e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        ResultSz =
144e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr            Funcs[f].FuncDoubleSelectSz(Value1Double, Value2Double, 1, 2);
145e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        ResultLlc =
146e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr            Funcs[f].FuncDoubleSelectLlc(Value1Double, Value2Double, 1, 2);
147e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        if (ResultSz == ResultLlc) {
148e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr          ++Passes;
149e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        } else {
150e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr          ++Failures;
151e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr          std::cout << Funcs[f].Name << "SelectDouble(" << Value1Double << ", "
152e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr                    << Value2Double << "): sz=" << ResultSz
153e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr                    << " llc=" << ResultLlc << "\n";
154e398428c3ef8ed2339c0f334dd30a7d3f0ed4b6eDavid Sehr        }
1555bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth      }
1565bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth    }
1575bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  }
158ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala}
159ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala
160ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Walavoid testsVector(size_t &TotalTests, size_t &Passes, size_t &Failures) {
161ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  typedef v4si32 (*FuncTypeVector)(v4f32, v4f32);
162ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  static struct {
163ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala    const char *Name;
164ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala    FuncTypeVector FuncVectorSz;
165ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala    FuncTypeVector FuncVectorLlc;
166ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  } Funcs[] = {
167ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala#define X(cmp)                                                                 \
168ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  { "fcmp" STR(cmp), Subzero_fcmp##cmp##Vector, fcmp##cmp##Vector }            \
169ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  ,
170d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth      FCMP_TABLE
171ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala#undef X
172d9dc82e4168ff4ed29857f7d970ee3fa4e172245Jim Stichnoth  };
173ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs);
174ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  const static size_t NumElementsInType = 4;
175ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  const static size_t MaxTestsPerFunc = 100000;
176ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala
177ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  assert(Values && NumValues);
178ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala
179ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  for (size_t f = 0; f < NumFuncs; ++f) {
180ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala    PRNG Index;
181ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala    for (size_t i = 0; i < MaxTestsPerFunc; ++i) {
182ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      v4f32 Value1, Value2;
183ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      for (size_t j = 0; j < NumElementsInType; ++j) {
184ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala        Value1[j] = Values[Index() % NumValues];
185ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala        Value2[j] = Values[Index() % NumValues];
186ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      }
187ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      ++TotalTests;
188ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      v4si32 ResultSz, ResultLlc;
189ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      ResultSz = Funcs[f].FuncVectorSz(Value1, Value2);
190ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      ResultLlc = Funcs[f].FuncVectorLlc(Value1, Value2);
191ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      if (!memcmp(&ResultSz, &ResultLlc, sizeof(ResultSz))) {
192ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala        ++Passes;
193ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      } else {
194ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala        ++Failures;
195ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala        std::cout << Funcs[f].Name << "Vector(" << vectAsString<v4f32>(Value1)
196ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala                  << ", " << vectAsString<v4f32>(Value2)
197ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala                  << "): sz=" << vectAsString<v4si32>(ResultSz)
198ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala                  << " llc=" << vectAsString<v4si32>(ResultLlc) << "\n";
199ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala      }
200ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala    }
201ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  }
202ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala}
203ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala
2041d235425dab1f3dd059973fc53f1b1d5879469e3John Portoint main(int argc, char *argv[]) {
205ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  size_t TotalTests = 0;
206ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  size_t Passes = 0;
207ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  size_t Failures = 0;
208ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala
209ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  initializeValues();
210ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala
211ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  testsScalar(TotalTests, Passes, Failures);
212ce0ca8f8ea1a859cba5f295f1f942eaba9dfe703Matt Wala  testsVector(TotalTests, Passes, Failures);
2135bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth
2145bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes
2155bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth            << " Failures=" << Failures << "\n";
2165bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth  return Failures;
2175bc2b1d163123ef17e0a14f50aae3bc8e4cd243eJim Stichnoth}
218