From 0b24a13fa0116e63a70b6ccbd77c75fcb31c21eb Mon Sep 17 00:00:00 2001 From: est31 Date: Mon, 29 Feb 2016 06:51:19 +0100 Subject: [PATCH] Fix bug with nearest_power_of_2_templated We have to shift log(num of bits) many times not num of bytes many. --- core/typedefs.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/typedefs.h b/core/typedefs.h index 48acca326e2..eab0ebc545f 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 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;