wineport: Add fast builtin & asm versions of ffs() + ctz() where supported.

Alexandre Julliard julliard at winehq.org
Fri Mar 11 07:28:27 CST 2011


Adam Martinson <amartinson at codeweavers.com> writes:

> @@ -236,7 +241,40 @@ extern int getopt_long_only (int ___argc, char *const *___argv,
>  #endif  /* HAVE_GETOPT_LONG */
>  
>  #ifndef HAVE_FFS
> -int ffs( int x );
> +    #if defined(__i386__) || defined(__x86_64__)
> +        #define HAVE_FFS
> +        static inline int ffs( int x )
> +        {
> +            if (!x)
> +            {
> +                return 0;
> +            }
> +            else
> +            {
> +                int ret;
> +                __asm__("bsfl %1, %0; incl %0" : "=r" (ret) : "r" (x));
> +                return ret;
> +            }
> +        }
> +    #elif defined(__GNUC__) && GCC_VERSION >= 29503
> +        #define HAVE_FFS
> +        #define ffs(x) __builtin_ffs(x)
> +    #else
> +        int ffs( int x );
> +    #endif
> +#endif

You'd have to show benchmarks to prove that this complexity is
necessary. Given that ffs() should already be inlined on all decent
platforms, I doubt you'd be able to demonstrate a difference (if
anything, your version would be slower because of the extra increment).

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list