From: David Aguilar Date: Tue, 01 May 2012 05:32:50 GMT Subject: Re: XDL_FAST_HASH breaks git on OS X 10.7.3 Message-ID: In-Reply-To: <87mx5tyy2a.fsf@thomas.inf.ethz.ch> On Mon, Apr 30, 2012 at 9:38 AM, Thomas Rast wrote: > Hi Brian > > I can reproduce this.  The problem is that __WORDSIZE is not defined, > either because it's Darwin or because the GCC is too old.  It winds up > compiling the 32-bit case, which of course doesn't work for 64-bit > builds. > > Perhaps we can rewrite it in terms of sizeof(long) like this? > > diff --git i/xdiff/xutils.c w/xdiff/xutils.c > index e05b5c9..1b3b471 100644 > --- i/xdiff/xutils.c > +++ w/xdiff/xutils.c > @@ -290,39 +290,33 @@ static inline unsigned long has_zero(unsigned long a) >        return ((a - ONEBYTES) & ~a) & HIGHBITS; >  } > > -#if __WORDSIZE == 64 > - > -/* > - * Jan Achrenius on G+: microoptimized version of > - * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56" > - * that works for the bytemasks without having to > - * mask them first. > - */ >  static inline long count_masked_bytes(unsigned long mask) >  { > -       return mask * 0x0001020304050608 >> 56; > -} > - > -#else  /* 32-bit case */ > - > -/* Modified Carl Chatfield G+ version for 32-bit */ > -static inline long count_masked_bytes(long mask) > -{ > -       /* > -        * (a) gives us > -        *   -1 (0, ff), 0 (ffff) or 1 (ffffff) > -        * (b) gives us > -        *   0 for 0, 1 for (ff ffff ffffff) > -        * (a+b+1) gives us > -        *   correct 0-3 bytemask count result > -        */ > -       long a = (mask - 256) >> 23; > -       long b = mask & 1; > -       return a + b + 1; > +       if (sizeof(long) == 8) { Isn't the whole point of this code to be fast? This should be a compile-time check... conditionals hurt perf. -- David