mesa: remove _mesa_ffs(), implement ffs() for non-GNU platforms
authorBrian Paul <brianp@vmware.com>
Thu, 12 Jan 2012 14:30:48 +0000 (07:30 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 12 Jan 2012 14:30:58 +0000 (07:30 -0700)
Call ffs() and ffsll() everywhere.  Define our own ffs(), ffsll()
functions when the platform doesn't have them.

v2: remove #ifdef _WIN32, __IBMC__, __IBMCPP_ tests inside ffs()
implementation.  The #else clause was recursive.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Tested-by: Alexander von Gluck <kallisti5@unixzen.com>
14 files changed:
src/mesa/drivers/dri/i965/brw_wm_emit.c
src/mesa/drivers/dri/i965/brw_wm_fp.c
src/mesa/drivers/dri/intel/intel_blit.c
src/mesa/drivers/dri/intel/intel_clear.c
src/mesa/main/arrayobj.c
src/mesa/main/bitset.h
src/mesa/main/buffers.c
src/mesa/main/ff_fragment_shader.cpp
src/mesa/main/ffvertex_prog.c
src/mesa/main/imports.c
src/mesa/main/imports.h
src/mesa/main/shaderapi.c
src/mesa/program/prog_print.c
src/mesa/swrast/s_texture.c

index 270e32142de6e6c7e284a7a00acb6ff18ab0f704..2647a386f4f70e94d0fae8280ffa6b4ff8512626 100644 (file)
@@ -766,7 +766,7 @@ void emit_dp2(struct brw_compile *p,
              const struct brw_reg *arg0,
              const struct brw_reg *arg1)
 {
-   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+   int dst_chan = ffs(mask & WRITEMASK_XYZW) - 1;
 
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
@@ -787,7 +787,7 @@ void emit_dp3(struct brw_compile *p,
              const struct brw_reg *arg0,
              const struct brw_reg *arg1)
 {
-   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+   int dst_chan = ffs(mask & WRITEMASK_XYZW) - 1;
 
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
@@ -809,7 +809,7 @@ void emit_dp4(struct brw_compile *p,
              const struct brw_reg *arg0,
              const struct brw_reg *arg1)
 {
-   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+   int dst_chan = ffs(mask & WRITEMASK_XYZW) - 1;
 
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
@@ -832,7 +832,7 @@ void emit_dph(struct brw_compile *p,
              const struct brw_reg *arg0,
              const struct brw_reg *arg1)
 {
-   const int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+   const int dst_chan = ffs(mask & WRITEMASK_XYZW) - 1;
 
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
@@ -882,7 +882,7 @@ void emit_math1(struct brw_wm_compile *c,
 {
    struct brw_compile *p = &c->func;
    struct intel_context *intel = &p->brw->intel;
-   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+   int dst_chan = ffs(mask & WRITEMASK_XYZW) - 1;
    GLuint saturate = ((mask & SATURATE) ?
                      BRW_MATH_SATURATE_SATURATE :
                      BRW_MATH_SATURATE_NONE);
@@ -945,7 +945,7 @@ void emit_math2(struct brw_wm_compile *c,
 {
    struct brw_compile *p = &c->func;
    struct intel_context *intel = &p->brw->intel;
-   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+   int dst_chan = ffs(mask & WRITEMASK_XYZW) - 1;
 
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
index 1358e749558ab6038ee82dfdb07ed77b4ecefba9..b40c501257b9e732486aac2f7bd4e6f0f6c09f66 100644 (file)
@@ -159,7 +159,7 @@ static struct prog_dst_register dst_undef( void )
 
 static struct prog_dst_register get_temp( struct brw_wm_compile *c )
 {
-   int bit = _mesa_ffs( ~c->fp_temp );
+   int bit = ffs( ~c->fp_temp );
 
    if (!bit) {
       printf("%s: out of temporaries\n", __FILE__);
@@ -260,7 +260,7 @@ static struct prog_instruction *emit_scalar_insn(struct brw_wm_compile *c,
    if (inst0->DstReg.WriteMask == 0)
       return NULL;
 
-   dst_chan = _mesa_ffs(inst0->DstReg.WriteMask) - 1;
+   dst_chan = ffs(inst0->DstReg.WriteMask) - 1;
    inst = get_fp_inst(c);
    *inst = *inst0;
    inst->DstReg.WriteMask = 1 << dst_chan;
index 1369e63ba55a5599cba1ec8345738e9b78b54cbc..e484fd34bfd14b0373357bab1f9903efe8688602 100644 (file)
@@ -261,7 +261,7 @@ intelClearWithBlit(struct gl_context *ctx, GLbitfield mask)
    /* Loop over all renderbuffers */
    mask &= (1 << BUFFER_COUNT) - 1;
    while (mask) {
-      GLuint buf = _mesa_ffs(mask) - 1;
+      GLuint buf = ffs(mask) - 1;
       bool is_depth_stencil = buf == BUFFER_DEPTH || buf == BUFFER_STENCIL;
       struct intel_renderbuffer *irb;
       int x1, y1, x2, y2;
index e60fa662566640ba79b3db718a82986c39ecd767..dee4956d9d4e872c5f39c9f53cdb9acc370309a0 100644 (file)
@@ -171,7 +171,7 @@ intelClear(struct gl_context *ctx, GLbitfield mask)
     * buffer with it.
     */
    if (mask & (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL)) {
-      int color_bit = _mesa_ffs(mask & BUFFER_BITS_COLOR);
+      int color_bit = ffs(mask & BUFFER_BITS_COLOR);
       if (color_bit != 0) {
         tri_mask |= blit_mask & (1 << (color_bit - 1));
         blit_mask &= ~(1 << (color_bit - 1));
index 4b3e07b851759ececaae05e92a2e4f193862f855..29bfed8f51e4fed5791324246ee545c2a38c2a65 100644 (file)
@@ -303,7 +303,7 @@ _mesa_update_array_object_max_element(struct gl_context *ctx,
    GLuint min = ~0u;
 
    while (enabled) {
-      GLint attrib = _mesa_ffsll(enabled) - 1;
+      GLint attrib = ffsll(enabled) - 1;
       enabled &= ~BITFIELD64_BIT(attrib);
       min = update_min(min, &arrayObj->VertexAttrib[attrib]);
    }
index c27b4c474e0bb6087434d33fbc5f24bd7fc17af4..28b3c127e753e3ed6ef3aaa908b4157038c0718a 100644 (file)
@@ -88,7 +88,7 @@ __bitset_ffs(const BITSET_WORD *x, int n)
 
    for (i = 0; i < n; i++) {
       if (x[i])
-        return _mesa_ffs(x[i]) + BITSET_WORDBITS * i;
+        return ffs(x[i]) + BITSET_WORDBITS * i;
    }
 
    return 0;
index adea0f5f78ee83f9f9a53cae6ce6a806d621ce34..46c785fc4dc28f076a90fc0efb80f8f37cd2d6c5 100644 (file)
@@ -402,7 +402,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
    if (n == 1) {
       GLuint count = 0, destMask0 = destMask[0];
       while (destMask0) {
-         GLint bufIndex = _mesa_ffs(destMask0) - 1;
+         GLint bufIndex = ffs(destMask0) - 1;
          if (fb->_ColorDrawBufferIndexes[count] != bufIndex) {
             updated_drawbuffers(ctx);
             fb->_ColorDrawBufferIndexes[count] = bufIndex;
@@ -417,7 +417,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
       GLuint count = 0;
       for (buf = 0; buf < n; buf++ ) {
          if (destMask[buf]) {
-            GLint bufIndex = _mesa_ffs(destMask[buf]) - 1;
+            GLint bufIndex = ffs(destMask[buf]) - 1;
             /* only one bit should be set in the destMask[buf] field */
             ASSERT(_mesa_bitcount(destMask[buf]) == 1);
             if (fb->_ColorDrawBufferIndexes[buf] != bufIndex) {
index 3596a3d3e0cecc410a000d45be1aace61e1400b5..7b8d1fe9b509279a12e296111c30540c735ac5f4 100644 (file)
@@ -295,7 +295,7 @@ need_saturate( GLuint mode )
 static GLuint translate_tex_src_bit( GLbitfield bit )
 {
    ASSERT(bit);
-   return _mesa_ffs(bit) - 1;
+   return ffs(bit) - 1;
 }
 
 
index 19d319a56feee4bd90c48324da6fb5cb15a30b4c..f1ab7533395b74e5ed3260cc6da8849764db93ec 100644 (file)
@@ -378,7 +378,7 @@ static struct ureg swizzle1( struct ureg reg, int x )
 
 static struct ureg get_temp( struct tnl_program *p )
 {
-   int bit = _mesa_ffs( ~p->temp_in_use );
+   int bit = ffs( ~p->temp_in_use );
    if (!bit) {
       _mesa_problem(NULL, "%s: out of temporaries\n", __FILE__);
       exit(1);
index 2469e426595e38e55093c5a82c9a99f7c9492174..bbc6ac6e240699ca5001404f8f8fa0ca868e42cc 100644 (file)
@@ -458,9 +458,8 @@ _mesa_inv_sqrtf(float n)
  * Find the first bit set in a word.
  */
 int
-_mesa_ffs(int32_t i)
+ffs(int i)
 {
-#if (defined(_WIN32) ) || defined(__IBMC__) || defined(__IBMCPP__)
    register int bit = 0;
    if (i != 0) {
       if ((i & 0xffff) == 0) {
@@ -482,9 +481,6 @@ _mesa_ffs(int32_t i)
       bit++;
    }
    return bit;
-#else
-   return ffs(i);
-#endif
 }
 
 
@@ -495,23 +491,24 @@ _mesa_ffs(int32_t i)
  *          if no bits set.
  */
 int
-_mesa_ffsll(int64_t val)
+ffsll(long long int val)
 {
    int bit;
 
    assert(sizeof(val) == 8);
 
-   bit = _mesa_ffs((int32_t)val);
+   bit = ffs((int) val);
    if (bit != 0)
       return bit;
 
-   bit = _mesa_ffs((int32_t)(val >> 32));
+   bit = ffs((int) (val >> 32));
    if (bit != 0)
       return 32 + bit;
 
    return 0;
 }
-#endif
+#endif /* __GNUC__ */
+
 
 #if !defined(__GNUC__) ||\
    ((__GNUC__ * 100 + __GNUC_MINOR__) < 304) /* Not gcc 3.4 or later */
index b7e87439f4ce6afc6ecd484386c137986b4f8364..bcf125ada762f1f822620d9eb694031f39a2af9d 100644 (file)
@@ -573,10 +573,15 @@ _mesa_init_sqrt_table(void);
 #define ffsll __builtin_ffsll
 #endif
 
-#define _mesa_ffs(i)  ffs(i)
-#define _mesa_ffsll(i)  ffsll(i)
+#else
+
+extern int ffs(int i);
+extern int ffsll(long long int i);
+
+#endif /*__ GNUC__ */
 
-#if ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */
+
+#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */
 #define _mesa_bitcount(i) __builtin_popcount(i)
 #define _mesa_bitcount_64(i) __builtin_popcountll(i)
 #else
@@ -586,16 +591,6 @@ extern unsigned int
 _mesa_bitcount_64(uint64_t n);
 #endif
 
-#else
-extern int
-_mesa_ffs(int32_t i);
-
-extern int
-_mesa_ffsll(int64_t i);
-
-extern unsigned int
-_mesa_bitcount(unsigned int n);
-#endif
 
 extern GLhalfARB
 _mesa_float_to_half(float f);
index 8b68ebf9c878a09d284427596a6320f33fd9fdc3..0e655a0d8efb53b16046fa9cae43017ea646f5b7 100644 (file)
@@ -928,6 +928,7 @@ _mesa_use_program(struct gl_context *ctx, struct gl_shader_program *shProg)
       ctx->Driver.UseProgram(ctx, shProg);
 }
 
+
 /**
  * Do validation of the given shader program.
  * \param errMsg  returns error message if validation fails.
index 352a80f271833451cf3af61ec95135d43d138643..46f1df0fcd7f052fb30b4800485b8652789f00dd 100644 (file)
@@ -194,7 +194,7 @@ _mesa_print_vp_inputs(GLbitfield inputs)
 {
    printf("VP Inputs 0x%x: \n", inputs);
    while (inputs) {
-      GLint attr = _mesa_ffs(inputs) - 1;
+      GLint attr = ffs(inputs) - 1;
       const char *name = arb_input_attrib_string(attr,
                                                  GL_VERTEX_PROGRAM_ARB);
       printf("  %d: %s\n", attr, name);
@@ -212,7 +212,7 @@ _mesa_print_fp_inputs(GLbitfield inputs)
 {
    printf("FP Inputs 0x%x: \n", inputs);
    while (inputs) {
-      GLint attr = _mesa_ffs(inputs) - 1;
+      GLint attr = ffs(inputs) - 1;
       const char *name = arb_input_attrib_string(attr,
                                                  GL_FRAGMENT_PROGRAM_ARB);
       printf("  %d: %s\n", attr, name);
index ffd78a2b895e7e7ffb425f0c27aaae8408f1dadd..337a52f32a049dec412475b7821e6cef3fca3e25 100644 (file)
@@ -285,7 +285,7 @@ _swrast_map_textures(struct gl_context *ctx)
 
    /* loop over enabled texture units */
    while (enabledUnits) {
-      GLuint unit = _mesa_ffs(enabledUnits) - 1;
+      GLuint unit = ffs(enabledUnits) - 1;
       struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
       
       _swrast_map_texture(ctx, texObj);
@@ -305,7 +305,7 @@ _swrast_unmap_textures(struct gl_context *ctx)
 
    /* loop over enabled texture units */
    while (enabledUnits) {
-      GLuint unit = _mesa_ffs(enabledUnits) - 1;
+      GLuint unit = ffs(enabledUnits) - 1;
       struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
       
       _swrast_unmap_texture(ctx, texObj);