summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2016-02-29 06:51:19 +0100
committerest31 <MTest31@outlook.com>2016-02-29 06:51:19 +0100
commit0b24a13fa0116e63a70b6ccbd77c75fcb31c21eb (patch)
treeb0af1395691ae496ef80f55de031361e11c35d6b
parent96b60c281fcaee977b1116dfa0ca8c3064fefa36 (diff)
Fix bug with nearest_power_of_2_templated
We have to shift log(num of bits) many times not num of bytes many.
-rw-r--r--core/typedefs.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/core/typedefs.h b/core/typedefs.h
index 48acca326e..eab0ebc545 100644
--- a/core/typedefs.h
+++ b/core/typedefs.h
@@ -188,13 +188,22 @@ static _FORCE_INLINE_ unsigned int nearest_power_of_2(unsigned int x) {
return ++x;
}
+// We need this definition inside the function below.
+static inline int get_shift_from_power_of_2(unsigned int p_pixel);
+
template<class T>
static _FORCE_INLINE_ T nearest_power_of_2_templated(T x) {
--x;
+
+ // The number of operations on x is the base two logarithm
+ // of the p_number of bits in the type. Add three to account
+ // for sizeof(T) being in bytes.
+ size_t num = get_shift_from_power_of_2(sizeof(T)) + 3;
+
// If the compiler is smart, it unrolls this loop
// If its dumb, this is a bit slow.
- for (size_t i = 0; i < sizeof(T); i++)
+ for (size_t i = 0; i < num; i++)
x |= x >> (1 << i);
return ++x;