diff options
author | David <25727384+ogniK5377@users.noreply.github.com> | 2020-06-28 01:34:07 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-28 01:34:07 +1000 |
commit | 0ea4a8bcc4bca14bb7c65b248ed1899d2e7167cf (patch) | |
tree | a83acb1e779b98d31fa54389bae4be5669573a41 /src/common/uint128.cpp | |
parent | 6205965df9682c3a52adbdcf260e7b24c02b24d4 (diff) | |
parent | 7b893c7963a57bf41f5dad7dd1709985971ce291 (diff) |
Merge pull request #3396 from FernandoS27/prometheus-1
Implement SpinLocks, Fibers and a Host Timer
Diffstat (limited to 'src/common/uint128.cpp')
-rw-r--r-- | src/common/uint128.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/common/uint128.cpp b/src/common/uint128.cpp index 32bf56730f..16bf7c8283 100644 --- a/src/common/uint128.cpp +++ b/src/common/uint128.cpp @@ -6,12 +6,38 @@ #include <intrin.h> #pragma intrinsic(_umul128) +#pragma intrinsic(_udiv128) #endif #include <cstring> #include "common/uint128.h" namespace Common { +#ifdef _MSC_VER + +u64 MultiplyAndDivide64(u64 a, u64 b, u64 d) { + u128 r{}; + r[0] = _umul128(a, b, &r[1]); + u64 remainder; +#if _MSC_VER < 1923 + return udiv128(r[1], r[0], d, &remainder); +#else + return _udiv128(r[1], r[0], d, &remainder); +#endif +} + +#else + +u64 MultiplyAndDivide64(u64 a, u64 b, u64 d) { + const u64 diva = a / d; + const u64 moda = a % d; + const u64 divb = b / d; + const u64 modb = b % d; + return diva * b + moda * divb + moda * modb / d; +} + +#endif + u128 Multiply64Into128(u64 a, u64 b) { u128 result; #ifdef _MSC_VER |