| Index: crosstest/test_arith_main.cpp
|
| diff --git a/crosstest/test_arith_main.cpp b/crosstest/test_arith_main.cpp
|
| index d9bbbe9c7490e1a725412dc40946a9de94e9923d..c87c93506cbbb1debbbd8d56ca8d3b1625c1f979 100644
|
| --- a/crosstest/test_arith_main.cpp
|
| +++ b/crosstest/test_arith_main.cpp
|
| @@ -11,6 +11,8 @@
|
| #include <cstring> // memcmp
|
| #include <iostream>
|
|
|
| +#include "vectors.h"
|
| +
|
| // Include test_arith.h twice - once normally, and once within the
|
| // Subzero_ namespace, corresponding to the llc and Subzero translated
|
| // object files, respectively.
|
| @@ -124,40 +126,15 @@ void testsInt(size_t &TotalTests, size_t &Passes, size_t &Failures) {
|
| }
|
| }
|
|
|
| -// Vectors are deterministically constructed by selecting elements from
|
| -// a pool of scalar values based on a pseudorandom sequence. Testing
|
| -// all possible combinations of scalar values from the value table is
|
| -// not tractable.
|
| -// TODO: Replace with a portable PRNG from C++11.
|
| -class PRNG {
|
| -public:
|
| - PRNG(uint32_t Seed = 1) : State(Seed) {}
|
| -
|
| - uint32_t operator()() {
|
| - // Lewis, Goodman, and Miller (1969)
|
| - State = (16807 * State) % 2147483647;
|
| - return State;
|
| - }
|
| -
|
| -private:
|
| - uint32_t State;
|
| -};
|
| -
|
| const static size_t MaxTestsPerFunc = 100000;
|
|
|
| -template <typename Type, typename ElementType, typename CastType>
|
| -void outputVector(const Type Vect) {
|
| - const static size_t NumElementsInType = sizeof(Type) / sizeof(ElementType);
|
| - for (size_t i = 0; i < NumElementsInType; ++i) {
|
| - if (i > 0)
|
| - std::cout << ", ";
|
| - std::cout << (CastType) Vect[i];
|
| - }
|
| -}
|
| -
|
| -template <typename TypeUnsigned, typename TypeSigned,
|
| - typename ElementTypeUnsigned, typename ElementTypeSigned>
|
| +template <typename TypeUnsignedLabel, typename TypeSignedLabel>
|
| void testsVecInt(size_t &TotalTests, size_t &Passes, size_t &Failures) {
|
| + typedef typename Vectors<TypeUnsignedLabel>::Ty TypeUnsigned;
|
| + typedef typename Vectors<TypeSignedLabel>::Ty TypeSigned;
|
| + typedef typename Vectors<TypeUnsignedLabel>::ElementTy ElementTypeUnsigned;
|
| + typedef typename Vectors<TypeSignedLabel>::ElementTy ElementTypeSigned;
|
| +
|
| typedef TypeUnsigned (*FuncTypeUnsigned)(TypeUnsigned, TypeUnsigned);
|
| typedef TypeSigned (*FuncTypeSigned)(TypeSigned, TypeSigned);
|
| static struct {
|
| @@ -184,8 +161,7 @@ void testsVecInt(size_t &TotalTests, size_t &Passes, size_t &Failures) {
|
| #undef X
|
| };
|
| const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs);
|
| - const static size_t NumElementsInType =
|
| - sizeof(TypeUnsigned) / sizeof(ElementTypeUnsigned);
|
| + const static size_t NumElementsInType = Vectors<TypeUnsigned>::NumElements;
|
| for (size_t f = 0; f < NumFuncs; ++f) {
|
| PRNG Index;
|
| for (size_t i = 0; i < MaxTestsPerFunc; ++i) {
|
| @@ -208,16 +184,14 @@ void testsVecInt(size_t &TotalTests, size_t &Passes, size_t &Failures) {
|
| if (!memcmp(&ResultSz, &ResultLlc, sizeof(ResultSz))) {
|
| ++Passes;
|
| } else {
|
| + ++Failures;
|
| std::cout << "test" << Funcs[f].Name << "v" << NumElementsInType << "i"
|
| - << (CHAR_BIT * sizeof(ElementTypeUnsigned)) << "(";
|
| - outputVector<TypeUnsigned, ElementTypeUnsigned, unsigned>(Value1);
|
| - std::cout << ", ";
|
| - outputVector<TypeUnsigned, ElementTypeUnsigned, unsigned>(Value2);
|
| - std::cout << "): sz=";
|
| - outputVector<TypeUnsigned, ElementTypeUnsigned, unsigned>(ResultSz);
|
| - std::cout << " llc=";
|
| - outputVector<TypeUnsigned, ElementTypeUnsigned, unsigned>(ResultLlc);
|
| - std::cout << std::endl;
|
| + << (CHAR_BIT * sizeof(ElementTypeUnsigned)) << "("
|
| + << vectAsString<TypeUnsignedLabel>(Value1) << ","
|
| + << vectAsString<TypeUnsignedLabel>(Value2)
|
| + << "): sz=" << vectAsString<TypeUnsignedLabel>(ResultSz)
|
| + << " llc=" << vectAsString<TypeUnsignedLabel>(ResultLlc)
|
| + << std::endl;
|
| }
|
| }
|
| }
|
| @@ -321,16 +295,11 @@ void testsVecFp(size_t &TotalTests, size_t &Passes, size_t &Failures) {
|
| ++Passes;
|
| } else {
|
| ++Failures;
|
| - std::cout << std::fixed << "test" << Funcs[f].Name << "v4f32"
|
| - << "(";
|
| - outputVector<v4f32, float, float>(Value1);
|
| - std::cout << ", ";
|
| - outputVector<v4f32, float, float>(Value2);
|
| - std::cout << "): sz=";
|
| - outputVector<v4f32, float, float>(ResultSz);
|
| - std::cout << " llc=";
|
| - outputVector<v4f32, float, float>(ResultLlc);
|
| - std::cout << std::endl;
|
| + std::cout << "test" << Funcs[f].Name << "v4f32"
|
| + << "(" << vectAsString<v4f32>(Value1) << ","
|
| + << vectAsString<v4f32>(Value2)
|
| + << "): sz=" << vectAsString<v4f32>(ResultSz) << " llc"
|
| + << vectAsString<v4f32>(ResultLlc) << std::endl;
|
| }
|
| }
|
| }
|
| @@ -345,9 +314,9 @@ int main(int argc, char **argv) {
|
| testsInt<uint16_t, int16_t>(TotalTests, Passes, Failures);
|
| testsInt<uint32_t, int32_t>(TotalTests, Passes, Failures);
|
| testsInt<uint64_t, int64_t>(TotalTests, Passes, Failures);
|
| - testsVecInt<v4ui32, v4si32, uint32_t, int32_t>(TotalTests, Passes, Failures);
|
| - testsVecInt<v8ui16, v8si16, uint16_t, int16_t>(TotalTests, Passes, Failures);
|
| - testsVecInt<v16ui8, v16si8, uint8_t, int8_t>(TotalTests, Passes, Failures);
|
| + testsVecInt<v4ui32, v4si32>(TotalTests, Passes, Failures);
|
| + testsVecInt<v8ui16, v8si16>(TotalTests, Passes, Failures);
|
| + testsVecInt<v16ui8, v16si8>(TotalTests, Passes, Failures);
|
| testsFp<float>(TotalTests, Passes, Failures);
|
| testsFp<double>(TotalTests, Passes, Failures);
|
| testsVecFp(TotalTests, Passes, Failures);
|
|
|