| Index: crosstest/test_arith_main.cpp
|
| diff --git a/crosstest/test_arith_main.cpp b/crosstest/test_arith_main.cpp
|
| index 1c67b6bd61cecc1764da6d9cda6c7519c7bd2e73..682fce88955820c1a1a770555e4d11d276ec9d5c 100644
|
| --- a/crosstest/test_arith_main.cpp
|
| +++ b/crosstest/test_arith_main.cpp
|
| @@ -1,3 +1,16 @@
|
| +//===- subzero/crosstest/test_arith_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 operations
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +
|
| /* crosstest.py --test=test_arith.cpp --test=test_arith_frem.ll \
|
| --test=test_arith_sqrt.ll --driver=test_arith_main.cpp \
|
| --prefix=Subzero_ --output=test_arith */
|
| @@ -123,40 +136,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);
|
| volatile unsigned Values[] = INT_VALUE_ARRAY;
|
| @@ -185,8 +173,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) {
|
| @@ -209,16 +196,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;
|
| }
|
| }
|
| }
|
| @@ -322,16 +307,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;
|
| }
|
| }
|
| }
|
| @@ -346,9 +326,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);
|
|
|