From e8eec22d1590b8f7baeb8bf31205db31078359fb Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 7 Sep 2018 17:25:49 -0700 Subject: [PATCH] libobs/util: Fix undefined behavior and optimize util_mul64_64 Shifting an integer larger than its bit width can have undefined behavior. This not only fixes that issue, but also optimizes the shift functions. --- libobs/util/util_uint128.h | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/libobs/util/util_uint128.h b/libobs/util/util_uint128.h index 511ab0a05..ac96f3ee0 100644 --- a/libobs/util/util_uint128.h +++ b/libobs/util/util_uint128.h @@ -51,11 +51,19 @@ static inline util_uint128_t util_add128(util_uint128_t a, util_uint128_t b) return out; } -static inline util_uint128_t util_lshift64(uint64_t a, int num) +static inline util_uint128_t util_lshift64_internal_32(uint64_t a) { util_uint128_t val; - val.low = a << num; - val.high = a >> (64 - num); + val.low = a << 32; + val.high = a >> 32; + return val; +} + +static inline util_uint128_t util_lshift64_internal_64(uint64_t a) +{ + util_uint128_t val; + val.low = 0; + val.high = a; return val; } @@ -69,13 +77,13 @@ static inline util_uint128_t util_mul64_64(uint64_t a, uint64_t b) out.high = 0; m = (a >> 32) * (b & 0xFFFFFFFFULL); - out = util_add128(out, util_lshift64(m, 32)); + out = util_add128(out, util_lshift64_internal_32(m)); m = (a & 0xFFFFFFFFULL) * (b >> 32); - out = util_add128(out, util_lshift64(m, 32)); + out = util_add128(out, util_lshift64_internal_32(m)); m = (a >> 32) * (b >> 32); - out = util_add128(out, util_lshift64(m, 64)); + out = util_add128(out, util_lshift64_internal_64(m)); return out; }