Le 08/06/2011 22:08, Roland Scheidegger a écrit :
> Looks good to me - but skip the special n <= 1 case that's what the
> (n|1) input to the __builtin_clz is good for.
Ok, I'm not familiar with bit manipulation in fact...

> Oh and I didn't notice before but there's an error in the gcc version
> check (as that's defined as (__GNUC__ * 100 + __GNUC_MINOR__) - we're
> ignoring patchlevel). Though as said there's the popcount usage right
> next to it which doesn't do a version check neither - if that's the only
> thing requiring gcc 3.4 we should fix that otherwise could just make gcc
> 3.4 a requirement.
Ok I did'nt know that.

Here is my 3 patchs fixed. I hope this are the last of the series :-)

Benjamin
diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h
index 65a99fc..9d82cc5 100644
--- a/src/gallium/auxiliary/util/u_math.h
+++ b/src/gallium/auxiliary/util/u_math.h
@@ -493,17 +493,29 @@ util_logbase2(unsigned n)
 static INLINE unsigned
 util_next_power_of_two(unsigned x)
 {
-   unsigned i;
+#if defined(PIPE_CC_GCC)
+   if (x <= 1)
+       return 1;
+   
+   return (1 << ((sizeof(unsigned) * 8) - __builtin_clz(x - 1)));
+#else
+   unsigned val = x;
 
-   if (x == 0)
+   if (x <= 1)
       return 1;
 
-   --x;
-
-   for (i = 1; i < sizeof(unsigned) * 8; i <<= 1)
-      x |= x >> i;
-
-   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
 }
 
 
diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h
index 65a99fc..294f964 100644
--- a/src/gallium/auxiliary/util/u_math.h
+++ b/src/gallium/auxiliary/util/u_math.h
@@ -477,6 +477,9 @@ float_to_byte_tex(float f)
 static INLINE unsigned
 util_logbase2(unsigned n)
 {
+#if defined(PIPE_CC_GCC)
+   return (31 - __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
 }
 
 
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 3e42911..6ca1bd9 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -86,6 +86,9 @@ _mesa_free_texmemory(void *m)
 static GLuint
 logbase2(GLuint n)
 {
+#if defined(PIPE_CC_GCC)
+   return (31 - __builtin_clz(n | 1));
+#else
    GLuint pos = 0;
    if (n >= 1<<16) { n >>= 16; pos += 16; }
    if (n >= 1<< 8) { n >>=  8; pos +=  8; }
@@ -93,6 +96,7 @@ logbase2(GLuint n)
    if (n >= 1<< 2) { n >>=  2; pos +=  2; }
    if (n >= 1<< 1) {           pos +=  1; }
    return pos;
+#endif
 }
 
 
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to