From 4d9a167f56025cfbacc104f30c88731a087726c9 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 24 Apr 2021 19:05:24 +0300 Subject: [PATCH] u128: add multiplication support (for MSVC) --- rpcs3/util/types.hpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/rpcs3/util/types.hpp b/rpcs3/util/types.hpp index 46469cca3c..35a26f8a2e 100644 --- a/rpcs3/util/types.hpp +++ b/rpcs3/util/types.hpp @@ -204,6 +204,7 @@ extern "C" uchar _subborrow_u64(uchar, u64, u64, u64*); u64 __shiftleft128(u64, u64, uchar); u64 __shiftright128(u64, u64, uchar); + u64 _umul128(u64, u64, u64*); } // Unsigned 128-bit integer implementation (TODO) @@ -251,6 +252,13 @@ struct alignas(16) u128 return value; } + constexpr friend u128 operator*(const u128& l, const u128& r) + { + u128 value = l; + value *= r; + return value; + } + constexpr u128 operator+() const { return *this; @@ -365,6 +373,24 @@ struct alignas(16) u128 return *this; } + constexpr u128& operator*=(const u128& r) + { + const u64 _hi = r.hi * lo + r.lo * hi; + + if (std::is_constant_evaluated()) + { + hi = (lo >> 32) * (r.lo >> 32) + (((lo >> 32) * (r.lo & 0xffffffff)) >> 32) + (((r.lo >> 32) * (lo & 0xffffffff)) >> 32); + lo = lo * r.lo; + } + else + { + lo = _umul128(lo, r.lo, &hi); + } + + hi += _hi; + return *this; + } + constexpr u128& operator<<=(const u128& r) { if (std::is_constant_evaluated())