On 26/02/15 13:42, Jose Fonseca wrote:
On 26/02/15 03:55, Jonathan Gray wrote:
On Wed, Feb 25, 2015 at 07:09:26PM -0800, Matt Turner wrote:
On Wed, Feb 25, 2015 at 7:03 PM, Jonathan Gray <j...@jsg.id.au> wrote:
On Wed, Feb 25, 2015 at 06:53:14PM -0800, Matt Turner wrote:
On Wed, Feb 25, 2015 at 5:37 PM, Jonathan Gray <j...@jsg.id.au> wrote:
If it isn't going to be configure checks could someone merge the
original patch in this thread?

I committed

commit 3492e88090d2d0c0bfbc934963b8772b45fc8880
Author: Matt Turner <matts...@gmail.com>
Date:   Fri Feb 20 18:46:43 2015 -0800

     gallium/util: Use HAVE___BUILTIN_* macros.

     Reviewed-by: Eric Anholt <e...@anholt.net>
     Reviewed-by: Jose Fonseca <jfons...@vmware.com>

which switched over a bunch of preprocessor checks around __builtin*
calls to use the macros defined by autotools.

So I think cleaning it up to use __builtin_ffs* first #ifdef
HAVE___BUILTIN_* can go forward now.

Yes but there is no HAVE_FFSLL for constructs like

#if !defined(HAVE_FFSLL) && defined(HAVE___BUILTIN_FFSLL)

or is it ok to always use the builtin?

I think the question is whether it's okay to always use the builtin if
it's available (as opposed to libc functions). I think the answer to
that is yes.

So in that case how about the following?  Or is it going to break
the android scons build?

 From cba39ba72115e57d262cb4b099c4e72106f01812 Mon Sep 17 00:00:00 2001
From: Jonathan Gray <j...@jsg.id.au>
Date: Thu, 26 Feb 2015 14:46:45 +1100
Subject: [PATCH] gallium/util: use ffs* builtins if available

Required to build on OpenBSD which doesn't have ffsll in libc.

Signed-off-by: Jonathan Gray <j...@jsg.id.au>
---
  src/gallium/auxiliary/util/u_math.h | 11 ++++++++---
  1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_math.h
b/src/gallium/auxiliary/util/u_math.h
index b4a65e4..5bc9b97 100644
--- a/src/gallium/auxiliary/util/u_math.h
+++ b/src/gallium/auxiliary/util/u_math.h
@@ -384,9 +384,6 @@ unsigned ffs( unsigned u )

     return i;
  }
-#elif defined(__MINGW32__) || defined(PIPE_OS_ANDROID)
-#define ffs __builtin_ffs
-#define ffsll __builtin_ffsll

Scons does define HAVE___BUILTIN_FFS for mingw.

However `git grep '\<ffs\>` shows ffs is used directly in many other
places.  So I suspect this change will break them.

  #endif

  #endif /* FFS_DEFINED */
@@ -435,7 +432,11 @@ util_last_bit_signed(int i)
  static INLINE int
  u_bit_scan(unsigned *mask)
  {
+#if defined(HAVE___BUILTIN_FFS)
+   int i = __builtin_ffs(*mask) - 1;
+#else
     int i = ffs(*mask) - 1;
+#endif
     *mask &= ~(1 << i);
     return i;
  }
@@ -444,7 +445,11 @@ u_bit_scan(unsigned *mask)
  static INLINE int
  u_bit_scan64(uint64_t *mask)
  {
+#if defined(HAVE___BUILTIN_FFSLL)
+   int i = __builtin_ffsll(*mask) - 1;
+#else
     int i = ffsll(*mask) - 1;
+#endif
     *mask &= ~(1llu << i);
     return i;
  }



I think the right thing long term is to provide ffs and ffsll in
c99_compat.h or c99_math.h for all platforms.  And let the rest of the
code just always assume it's available somehow.


Otherwise, let's just '#define ffs __builtin_ffs' on OpenBSD too.

In other words, the original patch on this thread

  http://lists.freedesktop.org/archives/mesa-dev/2015-February/076071.html

is the only patch I've seen so far that doesn't break Mingw.

If you rather use HAVE___BUILTIN_FFSLL, then just do

diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h
index 959f76e..d372cfd 100644
--- a/src/gallium/auxiliary/util/u_math.h
+++ b/src/gallium/auxiliary/util/u_math.h
@@ -384,7 +384,7 @@ unsigned ffs( unsigned u )

    return i;
 }
-#elif defined(__MINGW32__) || defined(PIPE_OS_ANDROID)
+#elif defined(__MINGW32__) || defined(PIPE_OS_ANDROID) || defined(HAVE___BUILTIN_FFSLL)
 #define ffs __builtin_ffs
 #define ffsll __builtin_ffsll
 #endif



Jose
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to