From 3ea48e8ebe25686f2342cd79b32409fcd1bccb28 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Fri, 15 Feb 2019 19:26:41 -0400 Subject: Implement 128 bits Unsigned Integer Multiplication and Division. --- src/common/uint128.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/common/uint128.h (limited to 'src/common/uint128.h') diff --git a/src/common/uint128.h b/src/common/uint128.h new file mode 100644 index 000000000..fda313bcc --- /dev/null +++ b/src/common/uint128.h @@ -0,0 +1,30 @@ +#include +#include +#include +#include +#include "common/common_types.h" + +namespace Common { + +#ifdef _MSC_VER +#include + +#pragma intrinsic(_umul128) +#endif + +inline u128 umul128(u64 a, u64 b) { +#ifdef _MSC_VER +u128 result; +result[0] = _umul128(a, b, &result[1]); +#else +unsigned __int128 tmp = a; +tmp *= b; +u128 result; +std::memcpy(&result, &tmp, sizeof(u128)); +#endif +return result; +} + +std::pair udiv128(u128 dividend, u64 divisor); + +} // namespace Common -- cgit v1.2.3 From ecccfe033777d6ae7d29bcf0cfc30412f7d3be24 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Fri, 15 Feb 2019 20:04:11 -0400 Subject: Use u128 on Clock Cycles calculation. --- src/common/uint128.h | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) (limited to 'src/common/uint128.h') diff --git a/src/common/uint128.h b/src/common/uint128.h index fda313bcc..45e384c33 100644 --- a/src/common/uint128.h +++ b/src/common/uint128.h @@ -1,30 +1,13 @@ #include #include -#include #include +#include #include "common/common_types.h" namespace Common { -#ifdef _MSC_VER -#include - -#pragma intrinsic(_umul128) -#endif - -inline u128 umul128(u64 a, u64 b) { -#ifdef _MSC_VER -u128 result; -result[0] = _umul128(a, b, &result[1]); -#else -unsigned __int128 tmp = a; -tmp *= b; -u128 result; -std::memcpy(&result, &tmp, sizeof(u128)); -#endif -return result; -} +u128 Multiply64Into128(u64 a, u64 b); -std::pair udiv128(u128 dividend, u64 divisor); +std::pair Divide128On64(u128 dividend, u64 divisor); } // namespace Common -- cgit v1.2.3 From a8d4927e29bb1acbf5f3267f368801847acd4222 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Sat, 16 Feb 2019 16:52:24 -0400 Subject: Corrections, documenting and fixes. --- src/common/uint128.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/common/uint128.h') diff --git a/src/common/uint128.h b/src/common/uint128.h index 45e384c33..52e6b46eb 100644 --- a/src/common/uint128.h +++ b/src/common/uint128.h @@ -1,13 +1,14 @@ -#include -#include -#include + #include #include "common/common_types.h" namespace Common { +// This function multiplies 2 u64 values and produces a u128 value; u128 Multiply64Into128(u64 a, u64 b); -std::pair Divide128On64(u128 dividend, u64 divisor); +// This function divides a u128 by a u32 value and produces two u64 values: +// the result of division and the remainder +std::pair Divide128On32(u128 dividend, u32 divisor); } // namespace Common -- cgit v1.2.3