فهرست منبع

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.
jp9000 7 سال پیش
والد
کامیت
e8eec22d15
1فایلهای تغییر یافته به همراه14 افزوده شده و 6 حذف شده
  1. 14 6
      libobs/util/util_uint128.h

+ 14 - 6
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;
 }