Re: XDL_FAST_HASH breaks git on OS X 10.7.3
From: David Aguilar <hidden>
Date: 2016-06-15 22:53:42
On Mon, Apr 30, 2012 at 9:38 AM, Thomas Rast [off-list ref] wrote:
quoted hunk ↗ jump to hunk
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