mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 20:28:04 +02:00
mesa: Don't pass paramter to __builtin_clz which would hve undefined result.
__builtin_clz with parameter 0 has undefined value. When using -O3 optimizing this would result to too large next power of two value. Fix is to check if passed value is 1 and modify formula for that case.
This commit is contained in:
parent
7344e20ce4
commit
6e958832af
1 changed files with 11 additions and 5 deletions
|
|
@ -412,13 +412,19 @@ _mesa_is_pow_two(int x)
|
|||
* Source for the fallback implementation is
|
||||
* Sean Eron Anderson's webpage "Bit Twiddling Hacks"
|
||||
* http://graphics.stanford.edu/~seander/bithacks.html
|
||||
*
|
||||
* When using builtin function have to do some work
|
||||
* for case when passed values 1 to prevent hiting
|
||||
* undefined result from __builtin_clz. Undefined
|
||||
* results would be different depending on optimization
|
||||
* level used for build.
|
||||
*/
|
||||
static INLINE int32_t
|
||||
_mesa_next_pow_two_32(uint32_t x)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
x--;
|
||||
return 1 << ((__builtin_clz(x) ^ 31) + 1);
|
||||
uint32_t y = (x != 1);
|
||||
return (1 + y) << ((__builtin_clz(x - y) ^ 31) );
|
||||
#else
|
||||
x--;
|
||||
x |= x >> 1;
|
||||
|
|
@ -435,11 +441,11 @@ static INLINE int64_t
|
|||
_mesa_next_pow_two_64(uint64_t x)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
x--;
|
||||
uint64_t y = (x != 1);
|
||||
if (sizeof(x) == sizeof(long))
|
||||
return 1 << ((__builtin_clzl(x) ^ 63) + 1);
|
||||
return (1 + y) << ((__builtin_clzl(x - y) ^ 63));
|
||||
else
|
||||
return 1 << ((__builtin_clzll(x) ^ 63) + 1);
|
||||
return (1 + y) << ((__builtin_clzll(x - y) ^ 63));
|
||||
#else
|
||||
x--;
|
||||
x |= x >> 1;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue