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