From 431cc9e67246be6afe1b5f1166ddc57dd90f435b Mon Sep 17 00:00:00 2001 From: Alexander Shabalin Date: Mon, 14 Aug 2023 18:38:25 +0200 Subject: [PATCH] [K/N] Add division to kotlin::saturating Additionally refactor unit tests. --- .../runtime/src/main/cpp/Saturating.hpp | 34 +- .../runtime/src/main/cpp/SaturatingTest.cpp | 4223 +++-------------- 2 files changed, 574 insertions(+), 3683 deletions(-) diff --git a/kotlin-native/runtime/src/main/cpp/Saturating.hpp b/kotlin-native/runtime/src/main/cpp/Saturating.hpp index c49f74470d5..a0065991ba5 100644 --- a/kotlin-native/runtime/src/main/cpp/Saturating.hpp +++ b/kotlin-native/runtime/src/main/cpp/Saturating.hpp @@ -188,6 +188,21 @@ constexpr auto saturating_mul(T lhs, U rhs) noexcept { return result; } +template +constexpr auto saturating_div(T lhs, U rhs) noexcept { + static_assert(std::is_integral_v, "T must be integral"); + static_assert(std::is_integral_v, "U must be integral"); + static_assert(std::is_signed_v == std::is_signed_v, "T and U must have the same sign"); + using Result = internal::wider_t; + // TODO: What to do with rhs==0? + if constexpr (std::is_signed_v) { + if (lhs == std::numeric_limits::min() && rhs == -1) { + return std::numeric_limits::max(); + } + } + return static_cast(static_cast(lhs) / static_cast(rhs)); +} + template struct saturating { static_assert(std::is_integral_v, "saturating is only defined for integers."); @@ -281,7 +296,24 @@ constexpr saturating& operator*=(saturating& lhs, saturating rhs) noexc return lhs; } -// TODO: Saturated division and modulo. (there are no builtins for that) +// Saturated division. +template +constexpr auto operator/(saturating lhs, saturating rhs) noexcept { + return saturating(saturating_div(lhs.value, rhs.value)); +} + +// Saturated division. +template +constexpr saturating& operator/=(saturating& lhs, saturating rhs) noexcept { + auto result = lhs / rhs; + lhs = saturating(result); + return lhs; +} + +// TODO: Saturated modulo: how to handle -MIN % -1? To satisfy +// `(lhs / rhs) * rhs + lhs % rhs == lhs` from +// https://en.cppreference.com/w/cpp/language/operator_arithmetic#Multiplicative_operators +// we'll need to return `-1`, which is weird because it's equal to rhs. // TODO: Saturated negation: for signed types -MIN overflows MAX; but what to do for unsigned types? using int_sat8_t = saturating; diff --git a/kotlin-native/runtime/src/main/cpp/SaturatingTest.cpp b/kotlin-native/runtime/src/main/cpp/SaturatingTest.cpp index 503f1a85dee..452b351187c 100644 --- a/kotlin-native/runtime/src/main/cpp/SaturatingTest.cpp +++ b/kotlin-native/runtime/src/main/cpp/SaturatingTest.cpp @@ -46,6 +46,15 @@ TEST(SaturatingSanityTest, SaturatingMul) { EXPECT_THAT(saturating_mul(int8_t(-127), int16_t(-1000)), 32767); } +TEST(SaturatingSanityTest, SaturatingDiv) { + EXPECT_THAT(saturating_div(14, 4), 3); + EXPECT_THAT(saturating_div(-14, 4), -3); + EXPECT_THAT(saturating_div(int8_t(-128), int8_t(-1)), 127); + EXPECT_THAT(saturating_div(int8_t(-128), int16_t(-1)), 128); + EXPECT_THAT(saturating_div(int16_t(-128), int8_t(-1)), 128); + EXPECT_THAT(saturating_div(int16_t(-128), int16_t(-1)), 128); +} + TEST(SaturatingSanityTest, SaturatingComparison) { EXPECT_TRUE(saturating(1) == saturating(1)); EXPECT_FALSE(saturating(1) == saturating(2)); @@ -515,6 +524,48 @@ TEST(SaturatingTest, Multiplication) { static_assert(std::is_same_v); } +TEST(SaturatingTest, Division) { + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); +} + TEST(SaturatingTest, CommonType) { static_assert(std::is_same_v, int_sat8_t>); static_assert(std::is_same_v, int_sat16_t>); @@ -626,39 +677,24 @@ constexpr inline T min_v = std::numeric_limits::min(); template constexpr inline T minr_v = min_v + T(1); -template -constexpr inline T minrr_v = min_v + T(2); - template constexpr inline T max_v = std::numeric_limits::max(); template constexpr inline T maxl_v = max_v - T(1); -template -constexpr inline T maxll_v = max_v - T(2); - template constexpr inline T zero_v = T(0); template constexpr inline T zeror_v = T(1); -template -constexpr inline T zerorr_v = T(2); - template constexpr inline T zerol_v = [] { static_assert(std::is_signed_v, "Only available for signed types"); return T(-1); }(); -template -constexpr inline T zeroll_v = [] { - static_assert(std::is_signed_v, "Only available for signed types"); - return T(-2); -}(); - #define EXPECT_SATURATING_CAST(IntoType, FromValue, IntoValue) EXPECT_THAT(saturating_cast(FromValue), IntoType(IntoValue)) } // namespace @@ -1087,3746 +1123,569 @@ TEST(SaturatingCastTest, Into_64) { EXPECT_SATURATING_CAST(uint64_t, maxl_v, maxl_v); } -TEST(SaturatingAddTest, Test_8_8) { - EXPECT_THAT(saturating_add(min_v, min_v), int8_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int8_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), int8_t(zeroll_v)); - EXPECT_THAT(saturating_add(min_v, zero_v), int8_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int8_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int8_t(min_v)); +namespace { - EXPECT_THAT(saturating_add(minr_v, min_v), int8_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int8_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int8_t(zero_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_add(minr_v, zero_v), int8_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int8_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int8_t(min_v)); +class SaturatingBinOpTestNames { +public: + template + static std::string GetName(int) noexcept { + std::string result; + result += typeName>(); + result += "_"; + result += typeName>(); + return result; + } - EXPECT_THAT(saturating_add(max_v, min_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), int8_t(zero_v)); - EXPECT_THAT(saturating_add(max_v, max_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int8_t(maxl_v)); +private: + template + static const char* typeName() noexcept { + if constexpr (std::is_same_v) { + return "i8"; + } else if constexpr (std::is_same_v) { + return "i16"; + } else if constexpr (std::is_same_v) { + return "i32"; + } else if constexpr (std::is_same_v) { + return "i64"; + } else if constexpr (std::is_same_v) { + return "u8"; + } else if constexpr (std::is_same_v) { + return "u16"; + } else if constexpr (std::is_same_v) { + return "u32"; + } else if constexpr (std::is_same_v) { + return "u64"; + } else { + return "unknown"; + } + } +}; - EXPECT_THAT(saturating_add(maxl_v, min_v), int8_t(zeroll_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int8_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int8_t(maxll_v)); +using SaturatingBinOpSignedTestTypes = testing::Types< + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple>; - EXPECT_THAT(saturating_add(zero_v, min_v), int8_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int8_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int8_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int8_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int8_t(zerol_v)); +using SaturatingBinOpUnsignedTestTypes = testing::Types< + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple, + std::tuple>; - EXPECT_THAT(saturating_add(zeror_v, min_v), int8_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int8_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int8_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int8_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int8_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int8_t(zero_v)); +} // namespace - EXPECT_THAT(saturating_add(zerol_v, min_v), int8_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int8_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int8_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int8_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int8_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int8_t(zeroll_v)); +template +class SaturatingBinOpTest : public testing::Test { +public: + using Lhs = std::tuple_element_t<0, T>; + using Rhs = std::tuple_element_t<1, T>; + using Result = internal::wider_t; +}; - EXPECT_THAT(saturating_add(min_v, min_v), uint8_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint8_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint8_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint8_t(maxl_v)); +template +class SaturatingBinOpSignedTest : public SaturatingBinOpTest {}; - EXPECT_THAT(saturating_add(minr_v, min_v), uint8_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint8_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint8_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint8_t(max_v)); +TYPED_TEST_SUITE(SaturatingBinOpSignedTest, SaturatingBinOpSignedTestTypes, SaturatingBinOpTestNames); - EXPECT_THAT(saturating_add(max_v, min_v), uint8_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint8_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint8_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint8_t(max_v)); +template +class SaturatingBinOpUnsignedTest : public SaturatingBinOpTest {}; - EXPECT_THAT(saturating_add(maxl_v, min_v), uint8_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint8_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint8_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint8_t(max_v)); +TYPED_TEST_SUITE(SaturatingBinOpUnsignedTest, SaturatingBinOpUnsignedTestTypes, SaturatingBinOpTestNames); + +#define EXPECT_REG_BIN_OP(name, op, lhs, rhs, Result) \ + EXPECT_THAT(saturating_##name((lhs), (rhs)), static_cast((lhs)) op static_cast((rhs))) + +#define EXPECT_SAT_BIN_OP(name, lhs, rhs, actual) EXPECT_THAT(saturating_##name((lhs), (rhs)), (actual)) + +TYPED_TEST(SaturatingBinOpSignedTest, SaturatingAdd) { + using Lhs = typename TestFixture::Lhs; + using Rhs = typename TestFixture::Rhs; + using Result = typename TestFixture::Result; + +#define EXPECT_REG(lhs, rhs) EXPECT_REG_BIN_OP(add, +, lhs, rhs, Result) +#define EXPECT_MAX(lhs, rhs) EXPECT_SAT_BIN_OP(add, lhs, rhs, max_v) +#define EXPECT_MIN(lhs, rhs) EXPECT_SAT_BIN_OP(add, lhs, rhs, min_v) + + EXPECT_MIN(min_v, min_v); + EXPECT_MIN(min_v, minr_v); + EXPECT_REG(min_v, max_v); + EXPECT_REG(min_v, maxl_v); + EXPECT_REG(min_v, zero_v); + EXPECT_REG(min_v, zeror_v); + if constexpr (sizeof(Rhs) > sizeof(Lhs)) { + EXPECT_REG(min_v, zerol_v); + } else { + EXPECT_MIN(min_v, zerol_v); + } + + EXPECT_MIN(minr_v, min_v); + EXPECT_MIN(minr_v, minr_v); + EXPECT_REG(minr_v, max_v); + EXPECT_REG(minr_v, maxl_v); + EXPECT_REG(minr_v, zero_v); + EXPECT_REG(minr_v, zeror_v); + EXPECT_REG(minr_v, zerol_v); + + EXPECT_REG(max_v, min_v); + EXPECT_REG(max_v, minr_v); + EXPECT_MAX(max_v, max_v); + EXPECT_MAX(max_v, maxl_v); + EXPECT_REG(max_v, zero_v); + if constexpr (sizeof(Rhs) > sizeof(Lhs)) { + EXPECT_REG(max_v, zeror_v); + } else { + EXPECT_MAX(max_v, zeror_v); + } + EXPECT_REG(max_v, zerol_v); + + EXPECT_REG(maxl_v, min_v); + EXPECT_REG(maxl_v, minr_v); + EXPECT_MAX(maxl_v, max_v); + EXPECT_MAX(maxl_v, maxl_v); + EXPECT_REG(maxl_v, zero_v); + EXPECT_REG(maxl_v, zeror_v); + EXPECT_REG(maxl_v, zerol_v); + + EXPECT_REG(zero_v, min_v); + EXPECT_REG(zero_v, minr_v); + EXPECT_REG(zero_v, max_v); + EXPECT_REG(zero_v, maxl_v); + EXPECT_REG(zero_v, zero_v); + EXPECT_REG(zero_v, zeror_v); + EXPECT_REG(zero_v, zerol_v); + + EXPECT_REG(zeror_v, min_v); + EXPECT_REG(zeror_v, minr_v); + if constexpr (sizeof(Lhs) > sizeof(Rhs)) { + EXPECT_REG(zeror_v, max_v); + } else { + EXPECT_MAX(zeror_v, max_v); + } + EXPECT_REG(zeror_v, maxl_v); + EXPECT_REG(zeror_v, zero_v); + EXPECT_REG(zeror_v, zeror_v); + EXPECT_REG(zeror_v, zerol_v); + + if constexpr (sizeof(Lhs) > sizeof(Rhs)) { + EXPECT_REG(zerol_v, min_v); + } else { + EXPECT_MIN(zerol_v, min_v); + } + EXPECT_REG(zerol_v, minr_v); + EXPECT_REG(zerol_v, max_v); + EXPECT_REG(zerol_v, maxl_v); + EXPECT_REG(zerol_v, zero_v); + EXPECT_REG(zerol_v, zeror_v); + EXPECT_REG(zerol_v, zerol_v); + +#undef EXPECT_REG +#undef EXPECT_MAX +#undef EXPECT_MIN } -TEST(SaturatingAddTest, Test_8_16) { - EXPECT_THAT(saturating_add(min_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int16_t(min_v) + max_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int16_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int16_t(min_v) + zerol_v); +TYPED_TEST(SaturatingBinOpUnsignedTest, SaturatingAdd) { + using Lhs = typename TestFixture::Lhs; + using Rhs = typename TestFixture::Rhs; + using Result = typename TestFixture::Result; - EXPECT_THAT(saturating_add(minr_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int16_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int16_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int16_t(min_v)); +#define EXPECT_REG(lhs, rhs) EXPECT_REG_BIN_OP(add, +, lhs, rhs, Result) +#define EXPECT_MAX(lhs, rhs) EXPECT_SAT_BIN_OP(add, lhs, rhs, max_v) +#define EXPECT_MIN(lhs, rhs) EXPECT_SAT_BIN_OP(add, lhs, rhs, min_v) - EXPECT_THAT(saturating_add(max_v, min_v), int16_t(max_v) + min_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int16_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(max_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int16_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, zerol_v), int16_t(maxl_v)); + EXPECT_REG(min_v, min_v); + EXPECT_REG(min_v, minr_v); + EXPECT_REG(min_v, max_v); + EXPECT_REG(min_v, maxl_v); - EXPECT_THAT(saturating_add(maxl_v, min_v), int16_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int16_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int16_t(maxll_v)); + EXPECT_REG(minr_v, min_v); + EXPECT_REG(minr_v, minr_v); + if constexpr (sizeof(Lhs) > sizeof(Rhs)) { + EXPECT_REG(minr_v, max_v); + } else { + EXPECT_MAX(minr_v, max_v); + } + EXPECT_REG(minr_v, maxl_v); - EXPECT_THAT(saturating_add(zero_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int16_t(zerol_v)); + EXPECT_REG(max_v, min_v); + if constexpr (sizeof(Rhs) > sizeof(Lhs)) { + EXPECT_REG(max_v, minr_v); + } else { + EXPECT_MAX(max_v, minr_v); + } + EXPECT_MAX(max_v, max_v); + EXPECT_MAX(max_v, maxl_v); - EXPECT_THAT(saturating_add(zeror_v, min_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int16_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int16_t(zero_v)); + EXPECT_REG(maxl_v, min_v); + EXPECT_REG(maxl_v, minr_v); + EXPECT_MAX(maxl_v, max_v); + EXPECT_MAX(maxl_v, maxl_v); - EXPECT_THAT(saturating_add(zerol_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int16_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int16_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint16_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint16_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint16_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint16_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint16_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint16_t(max_v)); +#undef EXPECT_REG +#undef EXPECT_MAX +#undef EXPECT_MIN } -TEST(SaturatingAddTest, Test_8_32) { - EXPECT_THAT(saturating_add(min_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int32_t(min_v) + max_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int32_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int32_t(min_v) + zerol_v); +TYPED_TEST(SaturatingBinOpSignedTest, SaturatingSub) { + using Lhs = typename TestFixture::Lhs; + using Rhs = typename TestFixture::Rhs; + using Result = typename TestFixture::Result; - EXPECT_THAT(saturating_add(minr_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int32_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int32_t(min_v)); +#define EXPECT_REG(lhs, rhs) EXPECT_REG_BIN_OP(sub, -, lhs, rhs, Result) +#define EXPECT_MAX(lhs, rhs) EXPECT_SAT_BIN_OP(sub, lhs, rhs, max_v) +#define EXPECT_MIN(lhs, rhs) EXPECT_SAT_BIN_OP(sub, lhs, rhs, min_v) - EXPECT_THAT(saturating_add(max_v, min_v), int32_t(max_v) + min_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, zerol_v), int32_t(maxl_v)); + EXPECT_REG(min_v, min_v); + EXPECT_REG(min_v, minr_v); + EXPECT_MIN(min_v, max_v); + EXPECT_MIN(min_v, maxl_v); + EXPECT_REG(min_v, zero_v); + if constexpr (sizeof(Rhs) > sizeof(Lhs)) { + EXPECT_REG(min_v, zeror_v); + } else { + EXPECT_MIN(min_v, zeror_v); + } + EXPECT_REG(min_v, zerol_v); - EXPECT_THAT(saturating_add(maxl_v, min_v), int32_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int32_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int32_t(maxll_v)); + EXPECT_REG(minr_v, min_v); + EXPECT_REG(minr_v, minr_v); + EXPECT_MIN(minr_v, max_v); + EXPECT_MIN(minr_v, maxl_v); + EXPECT_REG(minr_v, zero_v); + EXPECT_REG(minr_v, zeror_v); + EXPECT_REG(minr_v, zerol_v); - EXPECT_THAT(saturating_add(zero_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int32_t(zerol_v)); + EXPECT_MAX(max_v, min_v); + EXPECT_MAX(max_v, minr_v); + EXPECT_REG(max_v, max_v); + EXPECT_REG(max_v, maxl_v); + EXPECT_REG(max_v, zero_v); + EXPECT_REG(max_v, zeror_v); + if constexpr (sizeof(Rhs) > sizeof(Lhs)) { + EXPECT_REG(max_v, zerol_v); + } else { + EXPECT_MAX(max_v, zerol_v); + } - EXPECT_THAT(saturating_add(zeror_v, min_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int32_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int32_t(zero_v)); + EXPECT_MAX(maxl_v, min_v); + EXPECT_MAX(maxl_v, minr_v); + EXPECT_REG(maxl_v, max_v); + EXPECT_REG(maxl_v, maxl_v); + EXPECT_REG(maxl_v, zero_v); + EXPECT_REG(maxl_v, zeror_v); + EXPECT_REG(maxl_v, zerol_v); - EXPECT_THAT(saturating_add(zerol_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int32_t(zeroll_v)); + if constexpr (sizeof(Lhs) > sizeof(Rhs)) { + EXPECT_REG(zero_v, min_v); + } else { + EXPECT_MAX(zero_v, min_v); + } + EXPECT_REG(zero_v, minr_v); + EXPECT_REG(zero_v, max_v); + EXPECT_REG(zero_v, maxl_v); + EXPECT_REG(zero_v, zero_v); + EXPECT_REG(zero_v, zeror_v); + EXPECT_REG(zero_v, zerol_v); - EXPECT_THAT(saturating_add(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint32_t(maxl_v)); + if constexpr (sizeof(Lhs) > sizeof(Rhs)) { + EXPECT_REG(zeror_v, min_v); + EXPECT_REG(zeror_v, minr_v); + } else { + EXPECT_MAX(zeror_v, min_v); + EXPECT_MAX(zeror_v, minr_v); + } + EXPECT_REG(zeror_v, max_v); + EXPECT_REG(zeror_v, maxl_v); + EXPECT_REG(zeror_v, zero_v); + EXPECT_REG(zeror_v, zeror_v); + EXPECT_REG(zeror_v, zerol_v); - EXPECT_THAT(saturating_add(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint32_t(max_v)); + EXPECT_REG(zerol_v, min_v); + EXPECT_REG(zerol_v, minr_v); + EXPECT_REG(zerol_v, max_v); + EXPECT_REG(zerol_v, maxl_v); + EXPECT_REG(zerol_v, zero_v); + EXPECT_REG(zerol_v, zeror_v); + EXPECT_REG(zerol_v, zerol_v); - EXPECT_THAT(saturating_add(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint32_t(max_v)); +#undef EXPECT_REG +#undef EXPECT_MAX +#undef EXPECT_MIN } -TEST(SaturatingAddTest, Test_8_64) { - EXPECT_THAT(saturating_add(min_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int64_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int64_t(min_v) + zerol_v); +TYPED_TEST(SaturatingBinOpUnsignedTest, SaturatingSub) { + using Lhs = typename TestFixture::Lhs; + using Rhs = typename TestFixture::Rhs; + using Result = typename TestFixture::Result; - EXPECT_THAT(saturating_add(minr_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int64_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int64_t(min_v)); +#define EXPECT_REG(lhs, rhs) EXPECT_REG_BIN_OP(sub, -, lhs, rhs, Result) +#define EXPECT_MAX(lhs, rhs) EXPECT_SAT_BIN_OP(sub, lhs, rhs, max_v) +#define EXPECT_MIN(lhs, rhs) EXPECT_SAT_BIN_OP(sub, lhs, rhs, min_v) - EXPECT_THAT(saturating_add(max_v, min_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, zerol_v), int64_t(maxl_v)); + EXPECT_REG(min_v, min_v); + EXPECT_MIN(min_v, minr_v); + EXPECT_MIN(min_v, max_v); + EXPECT_MIN(min_v, maxl_v); - EXPECT_THAT(saturating_add(maxl_v, min_v), int64_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int64_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int64_t(maxll_v)); + EXPECT_REG(minr_v, min_v); + EXPECT_REG(minr_v, minr_v); + EXPECT_MIN(minr_v, max_v); + EXPECT_MIN(minr_v, maxl_v); - EXPECT_THAT(saturating_add(zero_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int64_t(zerol_v)); + EXPECT_REG(max_v, min_v); + EXPECT_REG(max_v, minr_v); + if constexpr (sizeof(Lhs) >= sizeof(Rhs)) { + EXPECT_REG(max_v, max_v); + EXPECT_REG(max_v, maxl_v); + } else { + EXPECT_MIN(max_v, max_v); + EXPECT_MIN(max_v, maxl_v); + } - EXPECT_THAT(saturating_add(zeror_v, min_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int64_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int64_t(zero_v)); + EXPECT_REG(maxl_v, min_v); + EXPECT_REG(maxl_v, minr_v); + if constexpr (sizeof(Lhs) > sizeof(Rhs)) { + EXPECT_REG(maxl_v, max_v); + EXPECT_REG(maxl_v, maxl_v); + } else { + EXPECT_MIN(maxl_v, max_v); + EXPECT_MIN(maxl_v, maxl_v); + } - EXPECT_THAT(saturating_add(zerol_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int64_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint64_t(max_v)); +#undef EXPECT_REG +#undef EXPECT_MAX +#undef EXPECT_MIN } -TEST(SaturatingAddTest, Test_16_8) { - EXPECT_THAT(saturating_add(min_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int16_t(max_v) + min_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int16_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int16_t(min_v)); +TYPED_TEST(SaturatingBinOpSignedTest, SaturatingMul) { + using Lhs = typename TestFixture::Lhs; + using Rhs = typename TestFixture::Rhs; + using Result = typename TestFixture::Result; - EXPECT_THAT(saturating_add(minr_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int16_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int16_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int16_t(min_v)); +#define EXPECT_REG(lhs, rhs) EXPECT_REG_BIN_OP(mul, *, lhs, rhs, Result) +#define EXPECT_MAX(lhs, rhs) EXPECT_SAT_BIN_OP(mul, lhs, rhs, max_v) +#define EXPECT_MIN(lhs, rhs) EXPECT_SAT_BIN_OP(mul, lhs, rhs, min_v) - EXPECT_THAT(saturating_add(max_v, min_v), int16_t(min_v) + max_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int16_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(max_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int16_t(maxl_v)); + EXPECT_MAX(min_v, min_v); + EXPECT_MAX(min_v, minr_v); + EXPECT_MIN(min_v, max_v); + EXPECT_MIN(min_v, maxl_v); + EXPECT_REG(min_v, zero_v); + EXPECT_REG(min_v, zeror_v); + if constexpr (sizeof(Rhs) > sizeof(Lhs)) { + EXPECT_REG(min_v, zerol_v); + } else { + EXPECT_MAX(min_v, zerol_v); + } - EXPECT_THAT(saturating_add(maxl_v, min_v), int16_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int16_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int16_t(maxll_v)); + EXPECT_MAX(minr_v, min_v); + EXPECT_MAX(minr_v, minr_v); + EXPECT_MIN(minr_v, max_v); + EXPECT_MIN(minr_v, maxl_v); + EXPECT_REG(minr_v, zero_v); + EXPECT_REG(minr_v, zeror_v); + EXPECT_REG(minr_v, zerol_v); - EXPECT_THAT(saturating_add(zero_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int16_t(zerol_v)); + EXPECT_MIN(max_v, min_v); + EXPECT_MIN(max_v, minr_v); + EXPECT_MAX(max_v, max_v); + EXPECT_MAX(max_v, maxl_v); + EXPECT_REG(max_v, zero_v); + EXPECT_REG(max_v, zeror_v); + EXPECT_REG(max_v, zerol_v); - EXPECT_THAT(saturating_add(zeror_v, min_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int16_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int16_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int16_t(zero_v)); + EXPECT_MIN(maxl_v, min_v); + EXPECT_MIN(maxl_v, minr_v); + EXPECT_MAX(maxl_v, max_v); + EXPECT_MAX(maxl_v, maxl_v); + EXPECT_REG(maxl_v, zero_v); + EXPECT_REG(maxl_v, zeror_v); + EXPECT_REG(maxl_v, zerol_v); - EXPECT_THAT(saturating_add(zerol_v, min_v), int16_t(min_v) + zerol_v); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int16_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int16_t(zeroll_v)); + EXPECT_REG(zero_v, min_v); + EXPECT_REG(zero_v, minr_v); + EXPECT_REG(zero_v, max_v); + EXPECT_REG(zero_v, maxl_v); + EXPECT_REG(zero_v, zero_v); + EXPECT_REG(zero_v, zeror_v); + EXPECT_REG(zero_v, zerol_v); - EXPECT_THAT(saturating_add(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint16_t(maxl_v)); + EXPECT_REG(zeror_v, min_v); + EXPECT_REG(zeror_v, minr_v); + EXPECT_REG(zeror_v, max_v); + EXPECT_REG(zeror_v, maxl_v); + EXPECT_REG(zeror_v, zero_v); + EXPECT_REG(zeror_v, zeror_v); + EXPECT_REG(zeror_v, zerol_v); - EXPECT_THAT(saturating_add(minr_v, min_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint16_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint16_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint16_t(max_v)); + if constexpr (sizeof(Lhs) > sizeof(Rhs)) { + EXPECT_REG(zerol_v, min_v); + } else { + EXPECT_MAX(zerol_v, min_v); + } + EXPECT_REG(zerol_v, minr_v); + EXPECT_REG(zerol_v, max_v); + EXPECT_REG(zerol_v, maxl_v); + EXPECT_REG(zerol_v, zero_v); + EXPECT_REG(zerol_v, zeror_v); + EXPECT_REG(zerol_v, zerol_v); - EXPECT_THAT(saturating_add(max_v, min_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint16_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint16_t(max_v)); +#undef EXPECT_REG +#undef EXPECT_MAX +#undef EXPECT_MIN } -TEST(SaturatingAddTest, Test_16_16) { - EXPECT_THAT(saturating_add(min_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), int16_t(zeroll_v)); - EXPECT_THAT(saturating_add(min_v, zero_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int16_t(min_v)); +TYPED_TEST(SaturatingBinOpUnsignedTest, SaturatingMul) { + using Lhs = typename TestFixture::Lhs; + using Rhs = typename TestFixture::Rhs; + using Result = typename TestFixture::Result; - EXPECT_THAT(saturating_add(minr_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int16_t(zero_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_add(minr_v, zero_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int16_t(min_v)); +#define EXPECT_REG(lhs, rhs) EXPECT_REG_BIN_OP(mul, *, lhs, rhs, Result) +#define EXPECT_MAX(lhs, rhs) EXPECT_SAT_BIN_OP(mul, lhs, rhs, max_v) +#define EXPECT_MIN(lhs, rhs) EXPECT_SAT_BIN_OP(mul, lhs, rhs, min_v) - EXPECT_THAT(saturating_add(max_v, min_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), int16_t(zero_v)); - EXPECT_THAT(saturating_add(max_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int16_t(maxl_v)); + EXPECT_REG(min_v, min_v); + EXPECT_REG(min_v, minr_v); + EXPECT_REG(min_v, max_v); + EXPECT_REG(min_v, maxl_v); - EXPECT_THAT(saturating_add(maxl_v, min_v), int16_t(zeroll_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int16_t(maxll_v)); + EXPECT_REG(minr_v, min_v); + EXPECT_REG(minr_v, minr_v); + EXPECT_REG(minr_v, max_v); + EXPECT_REG(minr_v, maxl_v); - EXPECT_THAT(saturating_add(zero_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int16_t(zerol_v)); + EXPECT_REG(max_v, min_v); + EXPECT_REG(max_v, minr_v); + EXPECT_MAX(max_v, max_v); + EXPECT_MAX(max_v, maxl_v); - EXPECT_THAT(saturating_add(zeror_v, min_v), int16_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int16_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int16_t(zero_v)); + EXPECT_REG(maxl_v, min_v); + EXPECT_REG(maxl_v, minr_v); + EXPECT_MAX(maxl_v, max_v); + EXPECT_MAX(maxl_v, maxl_v); - EXPECT_THAT(saturating_add(zerol_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int16_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int16_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint16_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint16_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint16_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint16_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint16_t(max_v)); +#undef EXPECT_REG +#undef EXPECT_MAX +#undef EXPECT_MIN } -TEST(SaturatingAddTest, Test_16_32) { - EXPECT_THAT(saturating_add(min_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int32_t(min_v) + max_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int32_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int32_t(min_v) + zerol_v); +TYPED_TEST(SaturatingBinOpSignedTest, SaturatingDiv) { + using Lhs = typename TestFixture::Lhs; + using Rhs = typename TestFixture::Rhs; + using Result = typename TestFixture::Result; - EXPECT_THAT(saturating_add(minr_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int32_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int32_t(min_v)); +#define EXPECT_REG(lhs, rhs) EXPECT_REG_BIN_OP(div, /, lhs, rhs, Result) +#define EXPECT_MAX(lhs, rhs) EXPECT_SAT_BIN_OP(div, lhs, rhs, max_v) +#define EXPECT_MIN(lhs, rhs) EXPECT_SAT_BIN_OP(div, lhs, rhs, min_v) - EXPECT_THAT(saturating_add(max_v, min_v), int32_t(max_v) + min_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, zerol_v), int32_t(maxl_v)); + EXPECT_REG(min_v, min_v); + EXPECT_REG(min_v, minr_v); + EXPECT_REG(min_v, max_v); + EXPECT_REG(min_v, maxl_v); + EXPECT_REG(min_v, zeror_v); + if constexpr (sizeof(Rhs) > sizeof(Lhs)) { + EXPECT_REG(min_v, zerol_v); + } else { + EXPECT_MAX(min_v, zerol_v); + } - EXPECT_THAT(saturating_add(maxl_v, min_v), int32_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int32_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int32_t(maxll_v)); + EXPECT_REG(minr_v, min_v); + EXPECT_REG(minr_v, minr_v); + EXPECT_REG(minr_v, max_v); + EXPECT_REG(minr_v, maxl_v); + EXPECT_REG(minr_v, zeror_v); + EXPECT_REG(minr_v, zerol_v); - EXPECT_THAT(saturating_add(zero_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int32_t(zerol_v)); + EXPECT_REG(max_v, min_v); + EXPECT_REG(max_v, minr_v); + EXPECT_REG(max_v, max_v); + EXPECT_REG(max_v, maxl_v); + EXPECT_REG(max_v, zeror_v); + EXPECT_REG(max_v, zerol_v); - EXPECT_THAT(saturating_add(zeror_v, min_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int32_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int32_t(zero_v)); + EXPECT_REG(maxl_v, min_v); + EXPECT_REG(maxl_v, minr_v); + EXPECT_REG(maxl_v, max_v); + EXPECT_REG(maxl_v, maxl_v); + EXPECT_REG(maxl_v, zeror_v); + EXPECT_REG(maxl_v, zerol_v); - EXPECT_THAT(saturating_add(zerol_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int32_t(zeroll_v)); + EXPECT_REG(zero_v, min_v); + EXPECT_REG(zero_v, minr_v); + EXPECT_REG(zero_v, max_v); + EXPECT_REG(zero_v, maxl_v); + EXPECT_REG(zero_v, zeror_v); + EXPECT_REG(zero_v, zerol_v); - EXPECT_THAT(saturating_add(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint32_t(maxl_v)); + EXPECT_REG(zeror_v, min_v); + EXPECT_REG(zeror_v, minr_v); + EXPECT_REG(zeror_v, max_v); + EXPECT_REG(zeror_v, maxl_v); + EXPECT_REG(zeror_v, zeror_v); + EXPECT_REG(zeror_v, zerol_v); - EXPECT_THAT(saturating_add(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint32_t(max_v)); + EXPECT_REG(zerol_v, min_v); + EXPECT_REG(zerol_v, minr_v); + EXPECT_REG(zerol_v, max_v); + EXPECT_REG(zerol_v, maxl_v); + EXPECT_REG(zerol_v, zeror_v); + EXPECT_REG(zerol_v, zerol_v); - EXPECT_THAT(saturating_add(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint32_t(max_v)); +#undef EXPECT_REG +#undef EXPECT_MAX +#undef EXPECT_MIN } -TEST(SaturatingAddTest, Test_16_64) { - EXPECT_THAT(saturating_add(min_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int64_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int64_t(min_v) + zerol_v); +TYPED_TEST(SaturatingBinOpUnsignedTest, SaturatingDiv) { + using Lhs = typename TestFixture::Lhs; + using Rhs = typename TestFixture::Rhs; + using Result = typename TestFixture::Result; - EXPECT_THAT(saturating_add(minr_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int64_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int64_t(min_v)); +#define EXPECT_REG(lhs, rhs) EXPECT_REG_BIN_OP(div, /, lhs, rhs, Result) +#define EXPECT_MAX(lhs, rhs) EXPECT_SAT_BIN_OP(div, lhs, rhs, max_v) +#define EXPECT_MIN(lhs, rhs) EXPECT_SAT_BIN_OP(div, lhs, rhs, min_v) - EXPECT_THAT(saturating_add(max_v, min_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, zerol_v), int64_t(maxl_v)); + EXPECT_REG(min_v, minr_v); + EXPECT_REG(min_v, max_v); + EXPECT_REG(min_v, maxl_v); - EXPECT_THAT(saturating_add(maxl_v, min_v), int64_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int64_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int64_t(maxll_v)); + EXPECT_REG(minr_v, minr_v); + EXPECT_REG(minr_v, max_v); + EXPECT_REG(minr_v, maxl_v); - EXPECT_THAT(saturating_add(zero_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int64_t(zerol_v)); + EXPECT_REG(max_v, minr_v); + EXPECT_REG(max_v, max_v); + EXPECT_REG(max_v, maxl_v); - EXPECT_THAT(saturating_add(zeror_v, min_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int64_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int64_t(zero_v)); + EXPECT_REG(maxl_v, minr_v); + EXPECT_REG(maxl_v, max_v); + EXPECT_REG(maxl_v, maxl_v); - EXPECT_THAT(saturating_add(zerol_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int64_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingAddTest, Test_32_8) { - EXPECT_THAT(saturating_add(min_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int32_t(max_v) + min_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int32_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int32_t(min_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int32_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int32_t(min_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), int32_t(min_v) + max_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int32_t(maxl_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), int32_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int32_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int32_t(maxll_v)); - - EXPECT_THAT(saturating_add(zero_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int32_t(zerol_v)); - - EXPECT_THAT(saturating_add(zeror_v, min_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int32_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_add(zerol_v, min_v), int32_t(min_v) + zerol_v); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int32_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint32_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint32_t(max_v)); -} - -TEST(SaturatingAddTest, Test_32_16) { - EXPECT_THAT(saturating_add(min_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int32_t(max_v) + min_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int32_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int32_t(min_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int32_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int32_t(min_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), int32_t(min_v) + max_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int32_t(maxl_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), int32_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int32_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int32_t(maxll_v)); - - EXPECT_THAT(saturating_add(zero_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int32_t(zerol_v)); - - EXPECT_THAT(saturating_add(zeror_v, min_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int32_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_add(zerol_v, min_v), int32_t(min_v) + zerol_v); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int32_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint32_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint32_t(max_v)); -} - -TEST(SaturatingAddTest, Test_32_32) { - EXPECT_THAT(saturating_add(min_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), int32_t(zeroll_v)); - EXPECT_THAT(saturating_add(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int32_t(min_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int32_t(min_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int32_t(maxl_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), int32_t(zeroll_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int32_t(maxll_v)); - - EXPECT_THAT(saturating_add(zero_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int32_t(zerol_v)); - - EXPECT_THAT(saturating_add(zeror_v, min_v), int32_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int32_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_add(zerol_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int32_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint32_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint32_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint32_t(max_v)); -} - -TEST(SaturatingAddTest, Test_32_64) { - EXPECT_THAT(saturating_add(min_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int64_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int64_t(min_v) + zerol_v); - - EXPECT_THAT(saturating_add(minr_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int64_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, zerol_v), int64_t(maxl_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), int64_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int64_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int64_t(maxll_v)); - - EXPECT_THAT(saturating_add(zero_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_add(zeror_v, min_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int64_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_add(zerol_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int64_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingAddTest, Test_64_8) { - EXPECT_THAT(saturating_add(min_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int64_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int64_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int64_t(maxl_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), int64_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int64_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int64_t(maxll_v)); - - EXPECT_THAT(saturating_add(zero_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_add(zeror_v, min_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int64_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_add(zerol_v, min_v), int64_t(min_v) + zerol_v); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int64_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingAddTest, Test_64_16) { - EXPECT_THAT(saturating_add(min_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int64_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int64_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int64_t(maxl_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), int64_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int64_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int64_t(maxll_v)); - - EXPECT_THAT(saturating_add(zero_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_add(zeror_v, min_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int64_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_add(zerol_v, min_v), int64_t(min_v) + zerol_v); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int64_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingAddTest, Test_64_32) { - EXPECT_THAT(saturating_add(min_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_add(min_v, maxl_v), int64_t(maxl_v) + min_v); - EXPECT_THAT(saturating_add(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int64_t(maxl_v) + minr_v); - EXPECT_THAT(saturating_add(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_add(max_v, minr_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_add(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int64_t(maxl_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), int64_t(min_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int64_t(minr_v) + maxl_v); - EXPECT_THAT(saturating_add(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int64_t(maxll_v)); - - EXPECT_THAT(saturating_add(zero_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_add(zeror_v, min_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int64_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_add(zerol_v, min_v), int64_t(min_v) + zerol_v); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int64_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingAddTest, Test_64_64) { - EXPECT_THAT(saturating_add(min_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, max_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_add(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, zeror_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, zerol_v), int64_t(min_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, zerol_v), int64_t(maxl_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, zerol_v), int64_t(maxll_v)); - - EXPECT_THAT(saturating_add(zero_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zero_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zero_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zero_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zero_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zero_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_add(zeror_v, min_v), int64_t(minr_v)); - EXPECT_THAT(saturating_add(zeror_v, minr_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_add(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_add(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_add(zeror_v, zeror_v), int64_t(zerorr_v)); - EXPECT_THAT(saturating_add(zeror_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_add(zerol_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_add(zerol_v, max_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_add(zerol_v, maxl_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_add(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_add(zerol_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_add(zerol_v, zerol_v), int64_t(zeroll_v)); - - EXPECT_THAT(saturating_add(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_add(min_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(min_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(min_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_add(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_add(minr_v, minr_v), uint64_t(minrr_v)); - EXPECT_THAT(saturating_add(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(minr_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_add(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_add(maxl_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_add(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingSubTest, Test_8_8) { - EXPECT_THAT(saturating_sub(min_v, min_v), int8_t(zero_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), int8_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int8_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int8_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int8_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int8_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int8_t(zeror_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int8_t(zero_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), int8_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int8_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int8_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int8_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int8_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int8_t(zero_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int8_t(zeror_v)); - EXPECT_THAT(saturating_sub(max_v, zero_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int8_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int8_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int8_t(zero_v)); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int8_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int8_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int8_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int8_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int8_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int8_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int8_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int8_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int8_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int8_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int8_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int8_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int8_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int8_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int8_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int8_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int8_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint8_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint8_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint8_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint8_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint8_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint8_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint8_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint8_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint8_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint8_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint8_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint8_t(minr_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint8_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint8_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint8_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint8_t(min_v)); -} - -TEST(SaturatingSubTest, Test_8_16) { - EXPECT_THAT(saturating_sub(min_v, min_v), int16_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int16_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int16_t(min_v) - zeror_v); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int16_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int16_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int16_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int16_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int16_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int16_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int16_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int16_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int16_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int16_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int16_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int16_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int16_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int16_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int16_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint16_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint16_t(min_v)); -} - -TEST(SaturatingSubTest, Test_8_32) { - EXPECT_THAT(saturating_sub(min_v, min_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int32_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int32_t(min_v) - zeror_v); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int32_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int32_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int32_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int32_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int32_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int32_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int32_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint32_t(min_v)); -} - -TEST(SaturatingSubTest, Test_8_64) { - EXPECT_THAT(saturating_sub(min_v, min_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int64_t(min_v) - zeror_v); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int64_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int64_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int64_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int64_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int64_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint64_t(min_v)); -} - -TEST(SaturatingSubTest, Test_16_8) { - EXPECT_THAT(saturating_sub(min_v, min_v), int16_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int16_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int16_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int16_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int16_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int16_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int16_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int16_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int16_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int16_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int16_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int16_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int16_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int16_t(max_v) + zerorr_v); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int16_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int16_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int16_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int16_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int16_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), max_v - uint16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), max_v - uint16_t(maxl_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint16_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), maxl_v - uint16_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), max_v - uint16_t(max_v)); -} - -TEST(SaturatingSubTest, Test_16_16) { - EXPECT_THAT(saturating_sub(min_v, min_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int16_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int16_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_sub(max_v, zero_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int16_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int16_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int16_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int16_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int16_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int16_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int16_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint16_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint16_t(minr_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint16_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint16_t(min_v)); -} - -TEST(SaturatingSubTest, Test_16_32) { - EXPECT_THAT(saturating_sub(min_v, min_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int32_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int32_t(min_v) - zeror_v); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int32_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int32_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int32_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int32_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int32_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int32_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int32_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint32_t(min_v)); -} - -TEST(SaturatingSubTest, Test_16_64) { - EXPECT_THAT(saturating_sub(min_v, min_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int64_t(min_v) - zeror_v); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int64_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int64_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int64_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int64_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int64_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint64_t(min_v)); -} - -TEST(SaturatingSubTest, Test_32_8) { - EXPECT_THAT(saturating_sub(min_v, min_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int32_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int32_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int32_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int32_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int32_t(max_v) + zerorr_v); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int32_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int32_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int32_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), max_v - uint32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), max_v - uint32_t(maxl_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), maxl_v - uint32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), max_v - uint32_t(max_v)); -} - -TEST(SaturatingSubTest, Test_32_16) { - EXPECT_THAT(saturating_sub(min_v, min_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int32_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int32_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int32_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int32_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int32_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int32_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int32_t(max_v) + zerorr_v); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int32_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int32_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int32_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), max_v - uint32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), max_v - uint32_t(maxl_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), maxl_v - uint32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), max_v - uint32_t(max_v)); -} - -TEST(SaturatingSubTest, Test_32_32) { - EXPECT_THAT(saturating_sub(min_v, min_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_sub(max_v, zero_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int32_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int32_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int32_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int32_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint32_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint32_t(minr_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint32_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint32_t(min_v)); -} - -TEST(SaturatingSubTest, Test_32_64) { - EXPECT_THAT(saturating_sub(min_v, min_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int64_t(min_v) - zeror_v); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int64_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int64_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int64_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int64_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int64_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint64_t(min_v)); -} - -TEST(SaturatingSubTest, Test_64_8) { - EXPECT_THAT(saturating_sub(min_v, min_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int64_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int64_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int64_t(max_v) + zerorr_v); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int64_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int64_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), max_v - uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), max_v - uint64_t(maxl_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), maxl_v - uint64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), max_v - uint64_t(max_v)); -} - -TEST(SaturatingSubTest, Test_64_16) { - EXPECT_THAT(saturating_sub(min_v, min_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int64_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int64_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int64_t(max_v) + zerorr_v); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int64_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int64_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), max_v - uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), max_v - uint64_t(maxl_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), maxl_v - uint64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), max_v - uint64_t(max_v)); -} - -TEST(SaturatingSubTest, Test_64_32) { - EXPECT_THAT(saturating_sub(min_v, min_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(min_v, minr_v), int64_t(max_v) + min_v); - EXPECT_THAT(saturating_sub(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int64_t(max_v) + minrr_v); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int64_t(max_v) + minr_v); - EXPECT_THAT(saturating_sub(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int64_t(minrr_v) + max_v); - EXPECT_THAT(saturating_sub(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int64_t(min_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int64_t(minr_v) + max_v); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int64_t(max_v) + zerorr_v); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int64_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int64_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), max_v - uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), max_v - uint64_t(maxl_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), maxl_v - uint64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), max_v - uint64_t(max_v)); -} - -TEST(SaturatingSubTest, Test_64_64) { - EXPECT_THAT(saturating_sub(min_v, min_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zero_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zero_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(max_v, zero_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(maxl_v, zero_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, zeror_v), int64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_sub(zero_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zero_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zero_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zero_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zero_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_sub(zeror_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zeror_v, max_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_sub(zeror_v, maxl_v), int64_t(minrr_v) + zeror_v); - EXPECT_THAT(saturating_sub(zeror_v, zero_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_sub(zeror_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_sub(zeror_v, zerol_v), int64_t(zerorr_v)); - - EXPECT_THAT(saturating_sub(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_sub(zerol_v, minr_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_sub(zerol_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_sub(zerol_v, maxl_v), int64_t(minr_v)); - EXPECT_THAT(saturating_sub(zerol_v, zero_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_sub(zerol_v, zeror_v), int64_t(zeroll_v)); - EXPECT_THAT(saturating_sub(zerol_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_sub(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(minr_v, min_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_sub(minr_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(minr_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_sub(max_v, min_v), uint64_t(max_v)); - EXPECT_THAT(saturating_sub(max_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(max_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(max_v, maxl_v), uint64_t(minr_v)); - - EXPECT_THAT(saturating_sub(maxl_v, min_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_sub(maxl_v, minr_v), uint64_t(maxll_v)); - EXPECT_THAT(saturating_sub(maxl_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_sub(maxl_v, maxl_v), uint64_t(min_v)); -} - -TEST(SaturatingMulTest, Test_8_8) { - EXPECT_THAT(saturating_mul(min_v, min_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int8_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int8_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int8_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int8_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int8_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int8_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int8_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int8_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int8_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int8_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int8_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int8_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int8_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int8_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int8_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int8_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int8_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int8_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint8_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint8_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint8_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint8_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint8_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint8_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint8_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint8_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint8_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint8_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint8_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint8_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint8_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint8_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint8_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint8_t(max_v)); -} - -TEST(SaturatingMulTest, Test_8_16) { - EXPECT_THAT(saturating_mul(min_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int16_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int16_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int16_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int16_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int16_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int16_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint16_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint16_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint16_t(max_v)); -} - -TEST(SaturatingMulTest, Test_8_32) { - EXPECT_THAT(saturating_mul(min_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int32_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int32_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint32_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint32_t(max_v)); -} - -TEST(SaturatingMulTest, Test_8_64) { - EXPECT_THAT(saturating_mul(min_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int64_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingMulTest, Test_16_8) { - EXPECT_THAT(saturating_mul(min_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int16_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int16_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int16_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int16_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int16_t(max_v) + zeror_v); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int16_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint16_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint16_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint16_t(max_v)); -} - -TEST(SaturatingMulTest, Test_16_16) { - EXPECT_THAT(saturating_mul(min_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int16_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int16_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int16_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int16_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int16_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int16_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int16_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int16_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int16_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int16_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int16_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int16_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int16_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int16_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint16_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint16_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint16_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint16_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint16_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint16_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint16_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint16_t(max_v)); -} - -TEST(SaturatingMulTest, Test_16_32) { - EXPECT_THAT(saturating_mul(min_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int32_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int32_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint32_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint32_t(max_v)); -} - -TEST(SaturatingMulTest, Test_16_64) { - EXPECT_THAT(saturating_mul(min_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int64_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingMulTest, Test_32_8) { - EXPECT_THAT(saturating_mul(min_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int32_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint32_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint32_t(max_v)); -} - -TEST(SaturatingMulTest, Test_32_16) { - EXPECT_THAT(saturating_mul(min_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int32_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int32_t(max_v) + zeror_v); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint32_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint32_t(max_v)); -} - -TEST(SaturatingMulTest, Test_32_32) { - EXPECT_THAT(saturating_mul(min_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int32_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int32_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int32_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int32_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int32_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int32_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int32_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int32_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int32_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int32_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int32_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int32_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int32_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int32_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint32_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint32_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint32_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint32_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint32_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint32_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint32_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint32_t(max_v)); -} - -TEST(SaturatingMulTest, Test_32_64) { - EXPECT_THAT(saturating_mul(min_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int64_t(max_v) + zeror_v); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingMulTest, Test_64_8) { - EXPECT_THAT(saturating_mul(min_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingMulTest, Test_64_16) { - EXPECT_THAT(saturating_mul(min_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingMulTest, Test_64_32) { - EXPECT_THAT(saturating_mul(min_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int64_t(max_v) + zeror_v); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint64_t(max_v)); -} - -TEST(SaturatingMulTest, Test_64_64) { - EXPECT_THAT(saturating_mul(min_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(min_v, zeror_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(minr_v, zeror_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, zerol_v), int64_t(max_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(max_v, zeror_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, zerol_v), int64_t(minr_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(maxl_v, zeror_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, zerol_v), int64_t(minrr_v)); - - EXPECT_THAT(saturating_mul(zero_v, min_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, minr_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, max_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, maxl_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zeror_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zero_v, zerol_v), int64_t(zero_v)); - - EXPECT_THAT(saturating_mul(zeror_v, min_v), int64_t(min_v)); - EXPECT_THAT(saturating_mul(zeror_v, minr_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zeror_v, max_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zeror_v, maxl_v), int64_t(maxl_v)); - EXPECT_THAT(saturating_mul(zeror_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zeror_v, zeror_v), int64_t(zeror_v)); - EXPECT_THAT(saturating_mul(zeror_v, zerol_v), int64_t(zerol_v)); - - EXPECT_THAT(saturating_mul(zerol_v, min_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, minr_v), int64_t(max_v)); - EXPECT_THAT(saturating_mul(zerol_v, max_v), int64_t(minr_v)); - EXPECT_THAT(saturating_mul(zerol_v, maxl_v), int64_t(minrr_v)); - EXPECT_THAT(saturating_mul(zerol_v, zero_v), int64_t(zero_v)); - EXPECT_THAT(saturating_mul(zerol_v, zeror_v), int64_t(zerol_v)); - EXPECT_THAT(saturating_mul(zerol_v, zerol_v), int64_t(zeror_v)); - - EXPECT_THAT(saturating_mul(min_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, minr_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, max_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(min_v, maxl_v), uint64_t(min_v)); - - EXPECT_THAT(saturating_mul(minr_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(minr_v, minr_v), uint64_t(minr_v)); - EXPECT_THAT(saturating_mul(minr_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(minr_v, maxl_v), uint64_t(maxl_v)); - - EXPECT_THAT(saturating_mul(max_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(max_v, minr_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(max_v, maxl_v), uint64_t(max_v)); - - EXPECT_THAT(saturating_mul(maxl_v, min_v), uint64_t(min_v)); - EXPECT_THAT(saturating_mul(maxl_v, minr_v), uint64_t(maxl_v)); - EXPECT_THAT(saturating_mul(maxl_v, max_v), uint64_t(max_v)); - EXPECT_THAT(saturating_mul(maxl_v, maxl_v), uint64_t(max_v)); +#undef EXPECT_REG +#undef EXPECT_MAX +#undef EXPECT_MIN }