From 72cbc4c065494f12f43dc1c9115429a216a6df0e Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 15 Nov 2014 22:31:08 +0100 Subject: [PATCH] Fixed uaddCarray and updated tests #253 --- glm/detail/func_integer.inl | 4 +- test/core/core_func_integer.cpp | 67 +++++++++++---------------------- 2 files changed, 24 insertions(+), 47 deletions(-) diff --git a/glm/detail/func_integer.inl b/glm/detail/func_integer.inl index a93d1a08..81b5d5af 100644 --- a/glm/detail/func_integer.inl +++ b/glm/detail/func_integer.inl @@ -95,7 +95,7 @@ namespace detail uint64 const Value64(static_cast(x) + static_cast(y)); uint64 const Max32(static_cast(std::numeric_limits::max())); Carry = Value64 > Max32 ? 1 : 0; - return static_cast(Value64 % Max32); + return static_cast(Value64 % (Max32 + static_cast(1))); } template class vecType> @@ -104,7 +104,7 @@ namespace detail vecType Value64(vecType(x) + vecType(y)); vecType Max32(static_cast(std::numeric_limits::max())); Carry = mix(vecType(0), vecType(1), greaterThan(Value64, Max32)); - return vecType(Value64 % Max32); + return vecType(Value64 % (Max32 + static_cast(1))); } // usubBorrow diff --git a/test/core/core_func_integer.cpp b/test/core/core_func_integer.cpp index 119017b6..66825b18 100644 --- a/test/core/core_func_integer.cpp +++ b/test/core/core_func_integer.cpp @@ -898,71 +898,48 @@ namespace findLSB namespace uaddCarry { - void test_instance(unsigned int n) - { - glm::uint a = std::numeric_limits::max() - 4, - b = n, - carry = 0; - glm::uint result = glm::uaddCarry(a, b, carry); - } - int test() { int Error(0); { - glm::uint x = 16; - glm::uint y = 17; + glm::uint x = std::numeric_limits::max(); + glm::uint y = 0; glm::uint Carry = 0; glm::uint Result = glm::uaddCarry(x, y, Carry); - Error += Carry == 1 ? 0 : 1; - Error += Result == 33 ? 0 : 1; - } - - { - glm::uvec1 x(16); - glm::uvec1 y(17); - glm::uvec1 Carry(0); - glm::uvec1 Result(glm::uaddCarry(x, y, Carry)); - - Error += glm::all(glm::equal(Carry, glm::uvec1(1))) ? 0 : 1; - Error += glm::all(glm::equal(Result, glm::uvec1(33))) ? 0 : 1; + Error += Carry == 0 ? 0 : 1; + Error += Result == std::numeric_limits::max() ? 0 : 1; } { - glm::uvec2 x(16); - glm::uvec2 y(17); - glm::uvec2 Carry(0); - glm::uvec2 Result(glm::uaddCarry(x, y, Carry)); + glm::uint x = std::numeric_limits::max(); + glm::uint y = 1; + glm::uint Carry = 0; + glm::uint Result = glm::uaddCarry(x, y, Carry); - Error += glm::all(glm::equal(Carry, glm::uvec2(1))) ? 0 : 1; - Error += glm::all(glm::equal(Result, glm::uvec2(33))) ? 0 : 1; + Error += Carry == 1 ? 0 : 1; + Error += Result == 0 ? 0 : 1; } { - glm::uvec3 x(16); - glm::uvec3 y(17); - glm::uvec3 Carry(0); - glm::uvec3 Result(glm::uaddCarry(x, y, Carry)); + glm::uvec1 x(std::numeric_limits::max()); + glm::uvec1 y(0); + glm::uvec1 Carry(0); + glm::uvec1 Result(glm::uaddCarry(x, y, Carry)); - Error += glm::all(glm::equal(Carry, glm::uvec3(1))) ? 0 : 1; - Error += glm::all(glm::equal(Result, glm::uvec3(33))) ? 0 : 1; + Error += glm::all(glm::equal(Carry, glm::uvec1(0))) ? 0 : 1; + Error += glm::all(glm::equal(Result, glm::uvec1(std::numeric_limits::max()))) ? 0 : 1; } { - glm::uvec4 x(16); - glm::uvec4 y(17); - glm::uvec4 Carry(0); - glm::uvec4 Result(glm::uaddCarry(x, y, Carry)); - - Error += glm::all(glm::equal(Carry, glm::uvec4(1))) ? 0 : 1; - Error += glm::all(glm::equal(Result, glm::uvec4(33))) ? 0 : 1; - } + glm::uvec1 x(std::numeric_limits::max()); + glm::uvec1 y(1); + glm::uvec1 Carry(0); + glm::uvec1 Result(glm::uaddCarry(x, y, Carry)); - { - for(unsigned int i = 0; i < 10; ++i) - test_instance(i); + Error += glm::all(glm::equal(Carry, glm::uvec1(1))) ? 0 : 1; + Error += glm::all(glm::equal(Result, glm::uvec1(0))) ? 0 : 1; } return Error;