i965: Use compiler builtins when available
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 8 Feb 2011 22:58:35 +0000 (22:58 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 21 Feb 2011 12:59:37 +0000 (12:59 +0000)
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
src/mesa/drivers/dri/i965/brw_util.c
src/mesa/drivers/dri/i965/brw_util.h
src/mesa/main/imports.c
src/mesa/main/imports.h

index e878da3850dba165d97080fe2529fb5794e2569b..d28d9abcb3362af0f4afc64b73624705c656ed6d 100644 (file)
 #include "brw_util.h"
 #include "brw_defines.h"
 
-GLuint brw_count_bits(uint64_t val)
-{
-   GLuint i;
-   for (i = 0; val ; val >>= 1)
-      if (val & 1)
-        i++;
-   return i;
-}
-
-
 GLuint brw_translate_blend_equation( GLenum mode )
 {
    switch (mode) {
index 04f3175d3e1b0e8bfc60547d49c3f3ce43c66da6..940a871550295e37c63286893e3fb08acb33f510 100644 (file)
 
 #include "main/mtypes.h"
 
-extern GLuint brw_count_bits(uint64_t val);
+#ifdef __GNUC__
+#define brw_count_bits(v) __builtin_popcount(v)
+#else
+static inline GLuint brw_count_bits(uint64_t v)
+{
+       return _mesa_popcount(v>>32) + _mesa_popcount(v&0xffffffff);
+}
+#endif
 extern GLuint brw_parameter_list_state_flags(struct gl_program_parameter_list *paramList);
 extern GLuint brw_translate_blend_factor( GLenum factor );
 extern GLuint brw_translate_blend_equation( GLenum mode );
index fef46c4bbfd2bf9ab72c5fef4d24ca0add6b981a..bf89815f2d3ecf378842663226ce8d5920afcbd0 100644 (file)
@@ -453,6 +453,7 @@ _mesa_inv_sqrtf(float n)
 #endif
 }
 
+#ifndef __GNUC__
 /**
  * Find the first bit set in a word.
  */
@@ -496,9 +497,6 @@ _mesa_ffs(int32_t i)
 int
 _mesa_ffsll(int64_t val)
 {
-#ifdef ffsll
-   return ffsll(val);
-#else
    int bit;
 
    assert(sizeof(val) == 8);
@@ -512,27 +510,24 @@ _mesa_ffsll(int64_t val)
       return 32 + bit;
 
    return 0;
-#endif
 }
 
 
+#if ((_GNUC__ == 3 && __GNUC_MINOR__ < 4) || __GNUC__ < 4)
 /**
  * Return number of bits set in given GLuint.
  */
 unsigned int
 _mesa_bitcount(unsigned int n)
 {
-#if defined(__GNUC__) && \
-       ((_GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
-   return __builtin_popcount(n);
-#else
    unsigned int bits;
    for (bits = 0; n > 0; n = n >> 1) {
       bits += (n & 1);
    }
    return bits;
-#endif
 }
+#endif
+#endif
 
 
 /**
index 5ea647ad8d73a038e6fc2f8b1817f8fa5c08f793..a994dbcae8c9681865c78400af5e5e78bac155b7 100644 (file)
@@ -539,6 +539,18 @@ _mesa_inv_sqrtf(float x);
 extern void
 _mesa_init_sqrt_table(void);
 
+#ifdef __GNUC__
+#define _mesa_ffs(i)  ffs(i)
+#define _mesa_ffsll(i)  ffsll(i)
+
+#if ((_GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
+#define _mesa_bitcount(i) __builtin_popcount(i)
+#else
+extern unsigned int
+_mesa_bitcount(unsigned int n);
+#endif
+
+#else
 extern int
 _mesa_ffs(int32_t i);
 
@@ -547,6 +559,7 @@ _mesa_ffsll(int64_t i);
 
 extern unsigned int
 _mesa_bitcount(unsigned int n);
+#endif
 
 extern GLhalfARB
 _mesa_float_to_half(float f);