|
|
@ -20,7 +20,7 @@ namespace Common { |
|
|
|
|
|
|
|
|
// This function multiplies 2 u64 values and divides it by a u64 value. |
|
|
// This function multiplies 2 u64 values and divides it by a u64 value. |
|
|
[[nodiscard]] static inline u64 MultiplyAndDivide64(u64 a, u64 b, u64 d) { |
|
|
[[nodiscard]] static inline u64 MultiplyAndDivide64(u64 a, u64 b, u64 d) { |
|
|
#ifdef _MSC_VER |
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) && !defined(__clang__) |
|
|
u128 r{}; |
|
|
u128 r{}; |
|
|
r[0] = _umul128(a, b, &r[1]); |
|
|
r[0] = _umul128(a, b, &r[1]); |
|
|
u64 remainder; |
|
|
u64 remainder; |
|
|
@ -41,7 +41,7 @@ namespace Common { |
|
|
// This function multiplies 2 u64 values and produces a u128 value; |
|
|
// This function multiplies 2 u64 values and produces a u128 value; |
|
|
[[nodiscard]] static inline u128 Multiply64Into128(u64 a, u64 b) { |
|
|
[[nodiscard]] static inline u128 Multiply64Into128(u64 a, u64 b) { |
|
|
u128 result; |
|
|
u128 result; |
|
|
#ifdef _MSC_VER |
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) && !defined(__clang__) |
|
|
result[0] = _umul128(a, b, &result[1]); |
|
|
result[0] = _umul128(a, b, &result[1]); |
|
|
#else |
|
|
#else |
|
|
unsigned __int128 tmp = a; |
|
|
unsigned __int128 tmp = a; |
|
|
|