Browse Source

util: better logbase2/next_power_of_two implementations

Use __builtin_clz when available for logbase/next_power_of_two,
and replace next_power_of_two with faster implementation otherwise.
tags/mesa-7.11-rc1
Benjamin Bellec 14 years ago
parent
commit
894db40f12
1 changed files with 24 additions and 8 deletions
  1. 24
    8
      src/gallium/auxiliary/util/u_math.h

+ 24
- 8
src/gallium/auxiliary/util/u_math.h View File

@@ -477,6 +477,9 @@ float_to_byte_tex(float f)
static INLINE unsigned
util_logbase2(unsigned n)
{
#if defined(PIPE_CC_GCC)
return ((sizeof(unsigned) * 8 - 1) - __builtin_clz(n | 1));
#else
unsigned pos = 0;
if (n >= 1<<16) { n >>= 16; pos += 16; }
if (n >= 1<< 8) { n >>= 8; pos += 8; }
@@ -484,6 +487,7 @@ util_logbase2(unsigned n)
if (n >= 1<< 2) { n >>= 2; pos += 2; }
if (n >= 1<< 1) { pos += 1; }
return pos;
#endif
}


@@ -493,17 +497,29 @@ util_logbase2(unsigned n)
static INLINE unsigned
util_next_power_of_two(unsigned x)
{
unsigned i;

if (x == 0)
return 1;
#if defined(PIPE_CC_GCC)
if (x <= 1)
return 1;

--x;
return (1 << ((sizeof(unsigned) * 8) - __builtin_clz(x - 1)));
#else
unsigned val = x;

for (i = 1; i < sizeof(unsigned) * 8; i <<= 1)
x |= x >> i;
if (x <= 1)
return 1;

return x + 1;
if (util_is_power_of_two(x))
return x;

val--;
val = (val >> 1) | val;
val = (val >> 2) | val;
val = (val >> 4) | val;
val = (val >> 8) | val;
val = (val >> 16) | val;
val++;
return val;
#endif
}



Loading…
Cancel
Save