On Wed, Apr 27, 2016 at 12:20:33PM -0400, George Spelvin wrote:
> The frequent "if (USE_FFS)" conditions seem to clutter the code.
> Would it be easier to read if the two variants were just separated?
> The function is short enough that the duplication isn't too severe.

Yes please, this is _MUCH_ more readable.

> #if USE_FFS
> /* If __ffs is available, the even/odd algorithm benchmarks slower. */
> unsigned long gcd(unsigned long a, unsigned long b)
> {
>       unsigned long r = a | b;
> 
>       if (!a || !b)
>               return r;
> 
>       b >>= __ffs(b);
> 
>       for (;;) {
>               a >>= __ffs(a);
>               if (a == b)
>                       return a << __ffs(r);
>               if (a < b)
>                       swap(a, b);
>               a -= b;
>       }
> }
> 
> #else /* !USE_FFS */
> 
> /* If normalization is done by loops, the even/odd algorithm is a win. */
> unsigned long gcd(unsigned long a, unsigned long b)
> {
>       unsigned long r = a | b;
> 
>       if (!a || !b)
>               return r;
> 
>       r &= -r;        /* Isolate lsbit of r */
> 
>       while (!(b & r))
>               b >>= 1;
> 
>       for (;;) {
>               while (!(a & r))
>                       a >>= 1;
>               if (a == b)
>                       return a;
>               if (a < b)
>                       swap(a, b);
>               a -= b;
>               a >>= 1;
>               if (a & r)
>                       a += b;
>               a >>= 1;
>       }
> }
> #endif

Reply via email to