From aabd524142625647fdad84ecf2401ba6cadfcfa6 Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Sun, 9 Mar 2014 14:27:04 +0100 Subject: Add more tests for Common and Core/MMIO --- Source/UnitTests/Common/MathUtilTest.cpp | 56 ++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Source/UnitTests/Common/MathUtilTest.cpp (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp new file mode 100644 index 0000000000..a6924f9cf7 --- /dev/null +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -0,0 +1,56 @@ +// Copyright 2014 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include +#include + +#include "Common/MathUtil.h" + +template +T ClampAndReturn(const T& val, const T& min, const T& max) +{ + T ret = val; + MathUtil::Clamp(&ret, min, max); + return ret; +} + +TEST(MathUtil, Clamp) +{ + EXPECT_EQ(1, ClampAndReturn(1, 0, 2)); + EXPECT_EQ(1.0, ClampAndReturn(1.0, 0.0, 2.0)); + + EXPECT_EQ(2, ClampAndReturn(4, 0, 2)); + EXPECT_EQ(2.0, ClampAndReturn(4.0, 0.0, 2.0)); + + EXPECT_EQ(0, ClampAndReturn(-1, 0, 2)); + EXPECT_EQ(0.0, ClampAndReturn(-1.0, 0.0, 2.0)); +} + +TEST(MathUtil, IsNAN) +{ + EXPECT_TRUE(MathUtil::IsNAN(nan(""))); +} + +TEST(MathUtil, IsQNAN) +{ + // TODO +} + +TEST(MathUtil, IsSNAN) +{ + // TODO +} + +TEST(MathUtil, Log2) +{ + EXPECT_EQ(0, Log2(1)); + EXPECT_EQ(1, Log2(2)); + EXPECT_EQ(2, Log2(4)); + EXPECT_EQ(3, Log2(8)); + EXPECT_EQ(63, Log2(0x8000000000000000ull)); + + // Rounding behavior. + EXPECT_EQ(3, Log2(15)); + EXPECT_EQ(63, Log2(0xFFFFFFFFFFFFFFFFull)); +} -- cgit v1.2.3 From 9ef64245fa164b20db592fa866f846feb9559b14 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 9 Mar 2014 19:34:58 +0100 Subject: MathUtil: fix IsQNAN() The constants were one nibble too short and the lower 51 bits don't actually have to be zero. --- Source/UnitTests/Common/MathUtilTest.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index a6924f9cf7..56ade34522 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -2,8 +2,8 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include #include +#include #include "Common/MathUtil.h" @@ -27,19 +27,28 @@ TEST(MathUtil, Clamp) EXPECT_EQ(0.0, ClampAndReturn(-1.0, 0.0, 2.0)); } +TEST(MathUtil, IsINF) +{ + EXPECT_TRUE(MathUtil::IsINF( std::numeric_limits::infinity())); + EXPECT_TRUE(MathUtil::IsINF(-std::numeric_limits::infinity())); +} + TEST(MathUtil, IsNAN) { - EXPECT_TRUE(MathUtil::IsNAN(nan(""))); + EXPECT_TRUE(MathUtil::IsNAN(std::numeric_limits::quiet_NaN())); + EXPECT_TRUE(MathUtil::IsNAN(std::numeric_limits::signaling_NaN())); } TEST(MathUtil, IsQNAN) { - // TODO + EXPECT_TRUE(MathUtil::IsQNAN(std::numeric_limits::quiet_NaN())); + EXPECT_FALSE(MathUtil::IsQNAN(std::numeric_limits::signaling_NaN())); } TEST(MathUtil, IsSNAN) { - // TODO + EXPECT_FALSE(MathUtil::IsSNAN(std::numeric_limits::quiet_NaN())); + EXPECT_TRUE(MathUtil::IsSNAN(std::numeric_limits::signaling_NaN())); } TEST(MathUtil, Log2) -- cgit v1.2.3 From e0baed850fcf75c6920e41f627fb06048a85985a Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Mon, 24 Mar 2014 03:11:11 +0100 Subject: MathUtilTest: add test for FlushToZero --- Source/UnitTests/Common/MathUtilTest.cpp | 43 +++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index 56ade34522..d2056df3f9 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "Common/MathUtil.h" @@ -29,7 +30,7 @@ TEST(MathUtil, Clamp) TEST(MathUtil, IsINF) { - EXPECT_TRUE(MathUtil::IsINF( std::numeric_limits::infinity())); + EXPECT_TRUE(MathUtil::IsINF(+std::numeric_limits::infinity())); EXPECT_TRUE(MathUtil::IsINF(-std::numeric_limits::infinity())); } @@ -63,3 +64,43 @@ TEST(MathUtil, Log2) EXPECT_EQ(3, Log2(15)); EXPECT_EQ(63, Log2(0xFFFFFFFFFFFFFFFFull)); } + +TEST(MathUtil, FlushToZero) +{ + // To test the software implementation we need to make sure FTZ and DAZ are disabled. + // Using volatile here to ensure the compiler doesn't constant-fold it, + // we want the multiplication to occur at test runtime. + volatile float s = std::numeric_limits::denorm_min(); + volatile double d = std::numeric_limits::denorm_min(); + EXPECT_LT(0, s * 2); + EXPECT_LT(0, d * 2); + + EXPECT_EQ(+0, MathUtil::FlushToZero(+std::numeric_limits::denorm_min())); + EXPECT_EQ(-0, MathUtil::FlushToZero(-std::numeric_limits::denorm_min())); + EXPECT_EQ(+0, MathUtil::FlushToZero(+std::numeric_limits::min() / 2)); + EXPECT_EQ(-0, MathUtil::FlushToZero(-std::numeric_limits::min() / 2)); + EXPECT_EQ(std::numeric_limits::min(), MathUtil::FlushToZero(std::numeric_limits::min())); + EXPECT_EQ(std::numeric_limits::max(), MathUtil::FlushToZero(std::numeric_limits::max())); + EXPECT_EQ(+std::numeric_limits::infinity(), MathUtil::FlushToZero(+std::numeric_limits::infinity())); + EXPECT_EQ(-std::numeric_limits::infinity(), MathUtil::FlushToZero(-std::numeric_limits::infinity())); + + // Test all subnormals as well as an equally large set of random normal floats. + std::default_random_engine engine(0); + std::uniform_int_distribution dist(0x00800000u, 0x7fffffffu); + for (u32 i = 0; i <= 0x007fffffu; ++i) + { + MathUtil::IntFloat x(i); + EXPECT_EQ(+0, MathUtil::FlushToZero(x.f)); + + x.i = i | 0x80000000u; + EXPECT_EQ(-0, MathUtil::FlushToZero(x.f)); + + x.i = dist(engine); + MathUtil::IntFloat y(MathUtil::FlushToZero(x.f)); + EXPECT_EQ(x.i, y.i); + + x.i |= 0x80000000u; + y.f = MathUtil::FlushToZero(x.f); + EXPECT_EQ(x.i, y.i); + } +} -- cgit v1.2.3 From b8695a57da067bc1776c8310bb7cd68f5706d320 Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Tue, 15 Jul 2014 00:42:33 +1200 Subject: Fix incorrect clamping in SWRenderer. A previous PR changed a whole lot of min/maxes to std::min/std::max but made a mistake here and used a templated min which cast it's arguments to unsigned instead of casting return value. This resulted in glitchy artifacts in bright areas (See issue 7439) I rewrote the code to use a proper clamping function so it's cleaner to read. --- Source/UnitTests/Common/MathUtilTest.cpp | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index d2056df3f9..3df22847be 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -8,24 +8,16 @@ #include "Common/MathUtil.h" -template -T ClampAndReturn(const T& val, const T& min, const T& max) -{ - T ret = val; - MathUtil::Clamp(&ret, min, max); - return ret; -} - TEST(MathUtil, Clamp) { - EXPECT_EQ(1, ClampAndReturn(1, 0, 2)); - EXPECT_EQ(1.0, ClampAndReturn(1.0, 0.0, 2.0)); + EXPECT_EQ(1, MathUtil::Clamp(1, 0, 2)); + EXPECT_EQ(1.0, MathUtil::Clamp(1.0, 0.0, 2.0)); - EXPECT_EQ(2, ClampAndReturn(4, 0, 2)); - EXPECT_EQ(2.0, ClampAndReturn(4.0, 0.0, 2.0)); + EXPECT_EQ(2, MathUtil::Clamp(4, 0, 2)); + EXPECT_EQ(2.0, MathUtil::Clamp(4.0, 0.0, 2.0)); - EXPECT_EQ(0, ClampAndReturn(-1, 0, 2)); - EXPECT_EQ(0.0, ClampAndReturn(-1.0, 0.0, 2.0)); + EXPECT_EQ(0, MathUtil::Clamp(-1, 0, 2)); + EXPECT_EQ(0.0, MathUtil::Clamp(-1.0, 0.0, 2.0)); } TEST(MathUtil, IsINF) -- cgit v1.2.3 From 647dc998e483334cdbd8883aa655ea8e0e9014de Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Mon, 1 Sep 2014 05:57:03 -0700 Subject: unittests: correct some integers which should have been floating point types --- Source/UnitTests/Common/MathUtilTest.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index 3df22847be..8ae757962c 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -64,13 +64,15 @@ TEST(MathUtil, FlushToZero) // we want the multiplication to occur at test runtime. volatile float s = std::numeric_limits::denorm_min(); volatile double d = std::numeric_limits::denorm_min(); - EXPECT_LT(0, s * 2); - EXPECT_LT(0, d * 2); - - EXPECT_EQ(+0, MathUtil::FlushToZero(+std::numeric_limits::denorm_min())); - EXPECT_EQ(-0, MathUtil::FlushToZero(-std::numeric_limits::denorm_min())); - EXPECT_EQ(+0, MathUtil::FlushToZero(+std::numeric_limits::min() / 2)); - EXPECT_EQ(-0, MathUtil::FlushToZero(-std::numeric_limits::min() / 2)); + // Casting away the volatile attribute is required in order for msvc to resolve this to the + // correct instance of the comparison function. + EXPECT_LT(0.f, (float)(s * 2)); + EXPECT_LT(0.0, (double)(d * 2)); + + EXPECT_EQ(+0.0, MathUtil::FlushToZero(+std::numeric_limits::denorm_min())); + EXPECT_EQ(-0.0, MathUtil::FlushToZero(-std::numeric_limits::denorm_min())); + EXPECT_EQ(+0.0, MathUtil::FlushToZero(+std::numeric_limits::min() / 2)); + EXPECT_EQ(-0.0, MathUtil::FlushToZero(-std::numeric_limits::min() / 2)); EXPECT_EQ(std::numeric_limits::min(), MathUtil::FlushToZero(std::numeric_limits::min())); EXPECT_EQ(std::numeric_limits::max(), MathUtil::FlushToZero(std::numeric_limits::max())); EXPECT_EQ(+std::numeric_limits::infinity(), MathUtil::FlushToZero(+std::numeric_limits::infinity())); @@ -82,10 +84,10 @@ TEST(MathUtil, FlushToZero) for (u32 i = 0; i <= 0x007fffffu; ++i) { MathUtil::IntFloat x(i); - EXPECT_EQ(+0, MathUtil::FlushToZero(x.f)); + EXPECT_EQ(+0.f, MathUtil::FlushToZero(x.f)); x.i = i | 0x80000000u; - EXPECT_EQ(-0, MathUtil::FlushToZero(x.f)); + EXPECT_EQ(-0.f, MathUtil::FlushToZero(x.f)); x.i = dist(engine); MathUtil::IntFloat y(MathUtil::FlushToZero(x.f)); -- cgit v1.2.3 From b51aa4fa89c819f12c718a794ee8a62969e8b2d2 Mon Sep 17 00:00:00 2001 From: Fiora Date: Sun, 24 Aug 2014 11:03:07 -0700 Subject: Rename Log2 and add IsPow2 to MathUtils for future use Also remove unused pow2/pow2f functions. --- Source/UnitTests/Common/MathUtilTest.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index 8ae757962c..9549039304 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -44,17 +44,17 @@ TEST(MathUtil, IsSNAN) EXPECT_TRUE(MathUtil::IsSNAN(std::numeric_limits::signaling_NaN())); } -TEST(MathUtil, Log2) +TEST(MathUtil, IntLog2) { - EXPECT_EQ(0, Log2(1)); - EXPECT_EQ(1, Log2(2)); - EXPECT_EQ(2, Log2(4)); - EXPECT_EQ(3, Log2(8)); - EXPECT_EQ(63, Log2(0x8000000000000000ull)); + EXPECT_EQ(0, IntLog2(1)); + EXPECT_EQ(1, IntLog2(2)); + EXPECT_EQ(2, IntLog2(4)); + EXPECT_EQ(3, IntLog2(8)); + EXPECT_EQ(63, IntLog2(0x8000000000000000ull)); // Rounding behavior. - EXPECT_EQ(3, Log2(15)); - EXPECT_EQ(63, Log2(0xFFFFFFFFFFFFFFFFull)); + EXPECT_EQ(3, IntLog2(15)); + EXPECT_EQ(63, IntLog2(0xFFFFFFFFFFFFFFFFull)); } TEST(MathUtil, FlushToZero) -- cgit v1.2.3 From 07e0c917c679f3170a3057fad68bed05b87b754d Mon Sep 17 00:00:00 2001 From: Fiora Date: Fri, 5 Sep 2014 10:26:30 -0700 Subject: Revert "JIT64: optimize CA calculations" --- Source/UnitTests/Common/MathUtilTest.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index 9549039304..8ae757962c 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -44,17 +44,17 @@ TEST(MathUtil, IsSNAN) EXPECT_TRUE(MathUtil::IsSNAN(std::numeric_limits::signaling_NaN())); } -TEST(MathUtil, IntLog2) +TEST(MathUtil, Log2) { - EXPECT_EQ(0, IntLog2(1)); - EXPECT_EQ(1, IntLog2(2)); - EXPECT_EQ(2, IntLog2(4)); - EXPECT_EQ(3, IntLog2(8)); - EXPECT_EQ(63, IntLog2(0x8000000000000000ull)); + EXPECT_EQ(0, Log2(1)); + EXPECT_EQ(1, Log2(2)); + EXPECT_EQ(2, Log2(4)); + EXPECT_EQ(3, Log2(8)); + EXPECT_EQ(63, Log2(0x8000000000000000ull)); // Rounding behavior. - EXPECT_EQ(3, IntLog2(15)); - EXPECT_EQ(63, IntLog2(0xFFFFFFFFFFFFFFFFull)); + EXPECT_EQ(3, Log2(15)); + EXPECT_EQ(63, Log2(0xFFFFFFFFFFFFFFFFull)); } TEST(MathUtil, FlushToZero) -- cgit v1.2.3 From 94c20db36968bfcef67d43203ad19c4876f439d3 Mon Sep 17 00:00:00 2001 From: Fiora Date: Sun, 24 Aug 2014 11:03:07 -0700 Subject: Rename Log2 and add IsPow2 to MathUtils for future use Also remove unused pow2/pow2f functions. --- Source/UnitTests/Common/MathUtilTest.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index 8ae757962c..9549039304 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -44,17 +44,17 @@ TEST(MathUtil, IsSNAN) EXPECT_TRUE(MathUtil::IsSNAN(std::numeric_limits::signaling_NaN())); } -TEST(MathUtil, Log2) +TEST(MathUtil, IntLog2) { - EXPECT_EQ(0, Log2(1)); - EXPECT_EQ(1, Log2(2)); - EXPECT_EQ(2, Log2(4)); - EXPECT_EQ(3, Log2(8)); - EXPECT_EQ(63, Log2(0x8000000000000000ull)); + EXPECT_EQ(0, IntLog2(1)); + EXPECT_EQ(1, IntLog2(2)); + EXPECT_EQ(2, IntLog2(4)); + EXPECT_EQ(3, IntLog2(8)); + EXPECT_EQ(63, IntLog2(0x8000000000000000ull)); // Rounding behavior. - EXPECT_EQ(3, Log2(15)); - EXPECT_EQ(63, Log2(0xFFFFFFFFFFFFFFFFull)); + EXPECT_EQ(3, IntLog2(15)); + EXPECT_EQ(63, IntLog2(0xFFFFFFFFFFFFFFFFull)); } TEST(MathUtil, FlushToZero) -- cgit v1.2.3 From b0bde31ac08d41c279944d13ffd95fefa39a3ca8 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 1 Mar 2015 14:52:09 +0100 Subject: Fix include order of files outside of Source/Core --- Source/UnitTests/Common/MathUtilTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index 9549039304..0f27ed1ea1 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -2,9 +2,9 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include #include #include +#include #include "Common/MathUtil.h" -- cgit v1.2.3 From cefcb0ace9d363b3679b4e93bcc9ec05f1e5f4f8 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Mon, 18 May 2015 01:08:10 +0200 Subject: Update license headers to GPLv2+ --- Source/UnitTests/Common/MathUtilTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/UnitTests/Common/MathUtilTest.cpp') diff --git a/Source/UnitTests/Common/MathUtilTest.cpp b/Source/UnitTests/Common/MathUtilTest.cpp index 0f27ed1ea1..c5f2f20b65 100644 --- a/Source/UnitTests/Common/MathUtilTest.cpp +++ b/Source/UnitTests/Common/MathUtilTest.cpp @@ -1,5 +1,5 @@ // Copyright 2014 Dolphin Emulator Project -// Licensed under GPLv2 +// Licensed under GPLv2+ // Refer to the license.txt file included. #include -- cgit v1.2.3