|
|
@@ -39,7 +39,6 @@ namespace SIMDRegister_test_internal |
|
|
|
{
|
|
|
|
return static_cast<type> (std::is_signed<type>::value ? (random.nextFloat() * 16.0) - 8.0
|
|
|
|
: (random.nextFloat() * 8.0));
|
|
|
|
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
@@ -49,59 +48,32 @@ namespace SIMDRegister_test_internal |
|
|
|
static type next (Random& random)
|
|
|
|
{
|
|
|
|
return static_cast<type> (random.nextInt64());
|
|
|
|
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <typename type> struct RandomValue { static type next (Random& random) { return RandomPrimitive<type>::next (random); } };
|
|
|
|
template <typename type>
|
|
|
|
struct RandomValue<std::complex<type>>
|
|
|
|
{
|
|
|
|
static std::complex<type> next (Random& random)
|
|
|
|
{
|
|
|
|
return {RandomPrimitive<type>::next (random), RandomPrimitive<type>::next (random)};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
template <typename type>
|
|
|
|
struct VecFiller
|
|
|
|
struct RandomValue
|
|
|
|
{
|
|
|
|
static void fill (type* dst, const int size, Random& random)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < size; ++i)
|
|
|
|
dst[i] = RandomValue<type>::next (random);
|
|
|
|
}
|
|
|
|
static type next (Random& random) { return RandomPrimitive<type>::next (random); }
|
|
|
|
};
|
|
|
|
|
|
|
|
// We need to specialise for complex types: otherwise GCC 6 gives
|
|
|
|
// us an ICE internal compiler error after which the compiler seg faults.
|
|
|
|
template <typename type>
|
|
|
|
struct VecFiller<std::complex<type>>
|
|
|
|
struct RandomValue<std::complex<type>>
|
|
|
|
{
|
|
|
|
static void fill (std::complex<type>* dst, const int size, Random& random)
|
|
|
|
static std::complex<type> next (Random& random)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < size; ++i)
|
|
|
|
dst[i] = std::complex<type> (RandomValue<type>::next (random), RandomValue<type>::next (random));
|
|
|
|
return {RandomPrimitive<type>::next (random), RandomPrimitive<type>::next (random)};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <typename type>
|
|
|
|
struct VecFiller<SIMDRegister<type>>
|
|
|
|
static void fillVec (type* dst, Random& random)
|
|
|
|
{
|
|
|
|
static SIMDRegister<type> fill (Random& random)
|
|
|
|
std::generate_n (dst, SIMDRegister<type>::SIMDNumElements, [&]
|
|
|
|
{
|
|
|
|
constexpr int size = (int) SIMDRegister<type>::SIMDNumElements;
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
__declspec(align(sizeof (SIMDRegister<type>))) type elements[size];
|
|
|
|
#else
|
|
|
|
type elements[(size_t) size] __attribute__((aligned(sizeof (SIMDRegister<type>))));
|
|
|
|
#endif
|
|
|
|
|
|
|
|
VecFiller<type>::fill (elements, size, random);
|
|
|
|
return SIMDRegister<type>::fromRawArray (elements);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
return RandomValue<type>::next (random);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Avoid visual studio warning
|
|
|
|
template <typename type>
|
|
|
@@ -127,7 +99,7 @@ namespace SIMDRegister_test_internal |
|
|
|
{
|
|
|
|
return difference (a - b);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // namespace SIMDRegister_test_internal
|
|
|
|
|
|
|
|
// These tests need to be strictly run on all platforms supported by JUCE as the
|
|
|
|
// SIMD code is highly platform dependent.
|
|
|
@@ -135,6 +107,8 @@ namespace SIMDRegister_test_internal |
|
|
|
class SIMDRegisterUnitTests : public UnitTest
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
template <typename> struct Tag {};
|
|
|
|
|
|
|
|
SIMDRegisterUnitTests()
|
|
|
|
: UnitTest ("SIMDRegister UnitTests", UnitTestCategories::dsp)
|
|
|
|
{}
|
|
|
@@ -290,7 +264,7 @@ public: |
|
|
|
struct InitializationTest
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
u.expect (allValuesEqualTo<type> (SIMDRegister<type>::expand (static_cast<type> (23)), 23));
|
|
|
|
|
|
|
@@ -300,7 +274,7 @@ public: |
|
|
|
#else
|
|
|
|
type elements[SIMDRegister<type>::SIMDNumElements] __attribute__((aligned(sizeof (SIMDRegister<type>))));
|
|
|
|
#endif
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (elements, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (elements, random);
|
|
|
|
SIMDRegister<type> a (SIMDRegister<type>::fromRawArray (elements));
|
|
|
|
|
|
|
|
u.expect (vecEqualToArray (a, elements));
|
|
|
@@ -316,13 +290,13 @@ public: |
|
|
|
struct AccessTest
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
// set-up
|
|
|
|
SIMDRegister<type> a;
|
|
|
|
type array [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array, random);
|
|
|
|
|
|
|
|
// Test non-const access operator
|
|
|
|
for (size_t i = 0; i < SIMDRegister<type>::SIMDNumElements; ++i)
|
|
|
@@ -342,7 +316,7 @@ public: |
|
|
|
struct OperatorTests
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
for (int n = 0; n < 100; ++n)
|
|
|
|
{
|
|
|
@@ -355,9 +329,9 @@ public: |
|
|
|
type array_b [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
type array_c [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_b, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_c, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_c, random);
|
|
|
|
|
|
|
|
copy (a, array_a); copy (b, array_b); copy (c, array_c);
|
|
|
|
|
|
|
@@ -370,9 +344,9 @@ public: |
|
|
|
u.expect (vecEqualToArray (a, array_a));
|
|
|
|
u.expect (vecEqualToArray (b, array_b));
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_b, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_c, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_c, random);
|
|
|
|
|
|
|
|
copy (a, array_a); copy (b, array_b); copy (c, array_c);
|
|
|
|
|
|
|
@@ -386,9 +360,9 @@ public: |
|
|
|
u.expect (vecEqualToArray (b, array_b));
|
|
|
|
|
|
|
|
// set-up again
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_b, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_c, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_c, random);
|
|
|
|
copy (a, array_a); copy (b, array_b); copy (c, array_c);
|
|
|
|
|
|
|
|
// test out-of-place with both params being vectors
|
|
|
@@ -418,7 +392,7 @@ public: |
|
|
|
struct BitOperatorTests
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
typedef typename SIMDRegister<type>::vMaskType vMaskType;
|
|
|
|
typedef typename SIMDRegister<type>::MaskType MaskType;
|
|
|
@@ -438,7 +412,7 @@ public: |
|
|
|
} a, b;
|
|
|
|
|
|
|
|
vMaskType bitmask = vMaskType::expand (static_cast<MaskType> (1) << (sizeof (MaskType) - 1));
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_a, random);
|
|
|
|
copy (a.floatVersion, array_a);
|
|
|
|
copy (b.floatVersion, array_a);
|
|
|
|
|
|
|
@@ -466,9 +440,9 @@ public: |
|
|
|
type float_a [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
type float_c [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (float_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<MaskType>::fill (array_b, SIMDRegister<MaskType>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (float_c, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (float_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (float_c, random);
|
|
|
|
|
|
|
|
memcpy (array_a, float_a, sizeof (type) * SIMDRegister<type>::SIMDNumElements);
|
|
|
|
memcpy (array_c, float_c, sizeof (type) * SIMDRegister<type>::SIMDNumElements);
|
|
|
@@ -484,9 +458,9 @@ public: |
|
|
|
u.expect (vecEqualToArray (a, float_a));
|
|
|
|
u.expect (vecEqualToArray (b, array_b));
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (float_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<MaskType>::fill (array_b, SIMDRegister<MaskType>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (float_c, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (float_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (float_c, random);
|
|
|
|
memcpy (array_a, float_a, sizeof (type) * SIMDRegister<type>::SIMDNumElements);
|
|
|
|
memcpy (array_c, float_c, sizeof (type) * SIMDRegister<type>::SIMDNumElements);
|
|
|
|
copy (a, float_a); copy (b, array_b); copy (c, float_c);
|
|
|
@@ -502,9 +476,9 @@ public: |
|
|
|
u.expect (vecEqualToArray (b, array_b));
|
|
|
|
|
|
|
|
// set-up again
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (float_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<MaskType>::fill (array_b, SIMDRegister<MaskType>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (float_c, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (float_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (float_c, random);
|
|
|
|
memcpy (array_a, float_a, sizeof (type) * SIMDRegister<type>::SIMDNumElements);
|
|
|
|
memcpy (array_c, float_c, sizeof (type) * SIMDRegister<type>::SIMDNumElements);
|
|
|
|
copy (a, float_a); copy (b, array_b); copy (c, float_c);
|
|
|
@@ -542,7 +516,7 @@ public: |
|
|
|
struct CheckComparisonOps
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
typedef typename SIMDRegister<type>::vMaskType vMaskType;
|
|
|
|
typedef typename SIMDRegister<type>::MaskType MaskType;
|
|
|
@@ -560,8 +534,8 @@ public: |
|
|
|
MaskType array_ge [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_b, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
|
|
|
|
// do check
|
|
|
|
for (size_t j = 0; j < SIMDRegister<type>::SIMDNumElements; ++j)
|
|
|
@@ -598,8 +572,8 @@ public: |
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_b, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
} while (std::equal (array_a, array_a + SIMDRegister<type>::SIMDNumElements, array_b));
|
|
|
|
|
|
|
|
copy (a, array_a);
|
|
|
@@ -609,7 +583,7 @@ public: |
|
|
|
u.expect (! (a == b));
|
|
|
|
u.expect (! (b == a));
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_a, random);
|
|
|
|
copy (a, array_a);
|
|
|
|
copy (b, array_a);
|
|
|
|
|
|
|
@@ -635,7 +609,7 @@ public: |
|
|
|
struct CheckMultiplyAdd
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
// set-up
|
|
|
|
type array_a [SIMDRegister<type>::SIMDNumElements];
|
|
|
@@ -643,10 +617,10 @@ public: |
|
|
|
type array_c [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
type array_d [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_a, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_b, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_c, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array_d, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_a, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_b, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_c, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array_d, random);
|
|
|
|
|
|
|
|
// check
|
|
|
|
for (size_t i = 0; i < SIMDRegister<type>::SIMDNumElements; ++i)
|
|
|
@@ -667,7 +641,7 @@ public: |
|
|
|
struct CheckMinMax
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 100; ++i)
|
|
|
|
{
|
|
|
@@ -717,17 +691,14 @@ public: |
|
|
|
struct CheckSum
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
type array [SIMDRegister<type>::SIMDNumElements];
|
|
|
|
type sumCheck = 0;
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array, random);
|
|
|
|
|
|
|
|
for (size_t j = 0; j < SIMDRegister<type>::SIMDNumElements; ++j)
|
|
|
|
{
|
|
|
|
sumCheck += array[j];
|
|
|
|
}
|
|
|
|
using AddedType = decltype (type{} + type{});
|
|
|
|
const auto sumCheck = (type) std::accumulate (std::begin (array), std::end (array), AddedType{});
|
|
|
|
|
|
|
|
SIMDRegister<type> a;
|
|
|
|
copy (a, array);
|
|
|
@@ -739,12 +710,12 @@ public: |
|
|
|
struct CheckAbs
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
type inArray[SIMDRegister<type>::SIMDNumElements];
|
|
|
|
type outArray[SIMDRegister<type>::SIMDNumElements];
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (inArray, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (inArray, random);
|
|
|
|
|
|
|
|
SIMDRegister<type> a;
|
|
|
|
copy (a, inArray);
|
|
|
@@ -762,12 +733,12 @@ public: |
|
|
|
struct CheckTruncate
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
type inArray[SIMDRegister<type>::SIMDNumElements];
|
|
|
|
type outArray[SIMDRegister<type>::SIMDNumElements];
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (inArray, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (inArray, random);
|
|
|
|
|
|
|
|
SIMDRegister<type> a;
|
|
|
|
copy (a, inArray);
|
|
|
@@ -783,7 +754,7 @@ public: |
|
|
|
struct CheckBoolEquals
|
|
|
|
{
|
|
|
|
template <typename type>
|
|
|
|
static void run (UnitTest& u, Random& random)
|
|
|
|
static void run (UnitTest& u, Random& random, Tag<type>)
|
|
|
|
{
|
|
|
|
bool is_signed = std::is_signed<type>::value;
|
|
|
|
type array [SIMDRegister<type>::SIMDNumElements];
|
|
|
@@ -802,14 +773,14 @@ public: |
|
|
|
u.expect (a != value);
|
|
|
|
u.expect (! (a == value));
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array, random);
|
|
|
|
copy (a, array);
|
|
|
|
copy (b, array);
|
|
|
|
|
|
|
|
u.expect (a == b);
|
|
|
|
u.expect (! (a != b));
|
|
|
|
|
|
|
|
SIMDRegister_test_internal::VecFiller<type>::fill (array, SIMDRegister<type>::SIMDNumElements, random);
|
|
|
|
SIMDRegister_test_internal::fillVec (array, random);
|
|
|
|
copy (b, array);
|
|
|
|
|
|
|
|
u.expect (a != b);
|
|
|
@@ -819,96 +790,96 @@ public: |
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
template <class TheTest>
|
|
|
|
void runTestFloatingPoint (const char* unitTestName)
|
|
|
|
void runTestFloatingPoint (const char* unitTestName, TheTest)
|
|
|
|
{
|
|
|
|
beginTest (unitTestName);
|
|
|
|
|
|
|
|
Random random = getRandom();
|
|
|
|
|
|
|
|
TheTest::template run<float> (*this, random);
|
|
|
|
TheTest::template run<double> (*this, random);
|
|
|
|
TheTest::run (*this, random, Tag<float> {});
|
|
|
|
TheTest::run (*this, random, Tag<double>{});
|
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
template <class TheTest>
|
|
|
|
void runTestForAllTypes (const char* unitTestName)
|
|
|
|
void runTestForAllTypes (const char* unitTestName, TheTest)
|
|
|
|
{
|
|
|
|
beginTest (unitTestName);
|
|
|
|
|
|
|
|
Random random = getRandom();
|
|
|
|
|
|
|
|
TheTest::template run<float> (*this, random);
|
|
|
|
TheTest::template run<double> (*this, random);
|
|
|
|
TheTest::template run<int8_t> (*this, random);
|
|
|
|
TheTest::template run<uint8_t> (*this, random);
|
|
|
|
TheTest::template run<int16_t> (*this, random);
|
|
|
|
TheTest::template run<uint16_t>(*this, random);
|
|
|
|
TheTest::template run<int32_t> (*this, random);
|
|
|
|
TheTest::template run<uint32_t>(*this, random);
|
|
|
|
TheTest::template run<int64_t> (*this, random);
|
|
|
|
TheTest::template run<uint64_t>(*this, random);
|
|
|
|
TheTest::template run<std::complex<float>> (*this, random);
|
|
|
|
TheTest::template run<std::complex<double>> (*this, random);
|
|
|
|
TheTest::run (*this, random, Tag<float> {});
|
|
|
|
TheTest::run (*this, random, Tag<double> {});
|
|
|
|
TheTest::run (*this, random, Tag<int8_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<uint8_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<int16_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<uint16_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<int32_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<uint32_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<int64_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<uint64_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<std::complex<float>> {});
|
|
|
|
TheTest::run (*this, random, Tag<std::complex<double>>{});
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class TheTest>
|
|
|
|
void runTestNonComplex (const char* unitTestName)
|
|
|
|
void runTestNonComplex (const char* unitTestName, TheTest)
|
|
|
|
{
|
|
|
|
beginTest (unitTestName);
|
|
|
|
|
|
|
|
Random random = getRandom();
|
|
|
|
|
|
|
|
TheTest::template run<float> (*this, random);
|
|
|
|
TheTest::template run<double> (*this, random);
|
|
|
|
TheTest::template run<int8_t> (*this, random);
|
|
|
|
TheTest::template run<uint8_t> (*this, random);
|
|
|
|
TheTest::template run<int16_t> (*this, random);
|
|
|
|
TheTest::template run<uint16_t>(*this, random);
|
|
|
|
TheTest::template run<int32_t> (*this, random);
|
|
|
|
TheTest::template run<uint32_t>(*this, random);
|
|
|
|
TheTest::template run<int64_t> (*this, random);
|
|
|
|
TheTest::template run<uint64_t>(*this, random);
|
|
|
|
TheTest::run (*this, random, Tag<float> {});
|
|
|
|
TheTest::run (*this, random, Tag<double> {});
|
|
|
|
TheTest::run (*this, random, Tag<int8_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<uint8_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<int16_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<uint16_t>{});
|
|
|
|
TheTest::run (*this, random, Tag<int32_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<uint32_t>{});
|
|
|
|
TheTest::run (*this, random, Tag<int64_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<uint64_t>{});
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class TheTest>
|
|
|
|
void runTestSigned (const char* unitTestName)
|
|
|
|
void runTestSigned (const char* unitTestName, TheTest)
|
|
|
|
{
|
|
|
|
beginTest (unitTestName);
|
|
|
|
|
|
|
|
Random random = getRandom();
|
|
|
|
|
|
|
|
TheTest::template run<float> (*this, random);
|
|
|
|
TheTest::template run<double> (*this, random);
|
|
|
|
TheTest::template run<int8_t> (*this, random);
|
|
|
|
TheTest::template run<int16_t> (*this, random);
|
|
|
|
TheTest::template run<int32_t> (*this, random);
|
|
|
|
TheTest::template run<int64_t> (*this, random);
|
|
|
|
TheTest::run (*this, random, Tag<float> {});
|
|
|
|
TheTest::run (*this, random, Tag<double> {});
|
|
|
|
TheTest::run (*this, random, Tag<int8_t> {});
|
|
|
|
TheTest::run (*this, random, Tag<int16_t>{});
|
|
|
|
TheTest::run (*this, random, Tag<int32_t>{});
|
|
|
|
TheTest::run (*this, random, Tag<int64_t>{});
|
|
|
|
}
|
|
|
|
|
|
|
|
void runTest()
|
|
|
|
{
|
|
|
|
runTestForAllTypes<InitializationTest> ("InitializationTest");
|
|
|
|
runTestForAllTypes ("InitializationTest", InitializationTest{});
|
|
|
|
|
|
|
|
runTestForAllTypes<AccessTest> ("AccessTest");
|
|
|
|
runTestForAllTypes ("AccessTest", AccessTest{});
|
|
|
|
|
|
|
|
runTestForAllTypes<OperatorTests<Addition>> ("AdditionOperators");
|
|
|
|
runTestForAllTypes<OperatorTests<Subtraction>> ("SubtractionOperators");
|
|
|
|
runTestForAllTypes<OperatorTests<Multiplication>> ("MultiplicationOperators");
|
|
|
|
runTestForAllTypes ("AdditionOperators", OperatorTests<Addition>{});
|
|
|
|
runTestForAllTypes ("SubtractionOperators", OperatorTests<Subtraction>{});
|
|
|
|
runTestForAllTypes ("MultiplicationOperators", OperatorTests<Multiplication>{});
|
|
|
|
|
|
|
|
runTestForAllTypes<BitOperatorTests<BitAND>> ("BitANDOperators");
|
|
|
|
runTestForAllTypes<BitOperatorTests<BitOR>> ("BitOROperators");
|
|
|
|
runTestForAllTypes<BitOperatorTests<BitXOR>> ("BitXOROperators");
|
|
|
|
runTestForAllTypes ("BitANDOperators", BitOperatorTests<BitAND>{});
|
|
|
|
runTestForAllTypes ("BitOROperators", BitOperatorTests<BitOR>{});
|
|
|
|
runTestForAllTypes ("BitXOROperators", BitOperatorTests<BitXOR>{});
|
|
|
|
|
|
|
|
runTestNonComplex<CheckComparisonOps> ("CheckComparisons");
|
|
|
|
runTestNonComplex<CheckBoolEquals> ("CheckBoolEquals");
|
|
|
|
runTestNonComplex<CheckMinMax> ("CheckMinMax");
|
|
|
|
runTestNonComplex ("CheckComparisons", CheckComparisonOps{});
|
|
|
|
runTestNonComplex ("CheckBoolEquals", CheckBoolEquals{});
|
|
|
|
runTestNonComplex ("CheckMinMax", CheckMinMax{});
|
|
|
|
|
|
|
|
runTestForAllTypes<CheckMultiplyAdd> ("CheckMultiplyAdd");
|
|
|
|
runTestForAllTypes<CheckSum> ("CheckSum");
|
|
|
|
runTestForAllTypes ("CheckMultiplyAdd", CheckMultiplyAdd{});
|
|
|
|
runTestForAllTypes ("CheckSum", CheckSum{});
|
|
|
|
|
|
|
|
runTestSigned<CheckAbs> ("CheckAbs");
|
|
|
|
runTestSigned ("CheckAbs", CheckAbs{});
|
|
|
|
|
|
|
|
runTestFloatingPoint<CheckTruncate> ("CheckTruncate");
|
|
|
|
runTestFloatingPoint ("CheckTruncate", CheckTruncate{});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|