Merge branch 'rs/xdiff-fast-hash-fix'

Fixes compilation issue on 32-bit in an earlier series.
This commit is contained in:
Junio C Hamano 2012-05-25 12:05:02 -07:00
Родитель ec04a275b4 8072766cc6
Коммит 0bc8bea2b4
1 изменённых файлов: 15 добавлений и 15 удалений

Просмотреть файл

@ -251,9 +251,11 @@ static unsigned long xdl_hash_record_with_whitespace(char const **data,
#ifdef XDL_FAST_HASH #ifdef XDL_FAST_HASH
#define ONEBYTES 0x0101010101010101ul #define REPEAT_BYTE(x) ((~0ul / 0xff) * (x))
#define NEWLINEBYTES 0x0a0a0a0a0a0a0a0aul
#define HIGHBITS 0x8080808080808080ul #define ONEBYTES REPEAT_BYTE(0x01)
#define NEWLINEBYTES REPEAT_BYTE(0x0a)
#define HIGHBITS REPEAT_BYTE(0x80)
/* Return the high bit set in the first byte that is a zero */ /* Return the high bit set in the first byte that is a zero */
static inline unsigned long has_zero(unsigned long a) static inline unsigned long has_zero(unsigned long a)
@ -270,21 +272,19 @@ static inline long count_masked_bytes(unsigned long mask)
* that works for the bytemasks without having to * that works for the bytemasks without having to
* mask them first. * mask them first.
*/ */
return mask * 0x0001020304050608 >> 56;
} else {
/* /*
* Modified Carl Chatfield G+ version for 32-bit * * return mask * 0x0001020304050608 >> 56;
* *
* (a) gives us * Doing it like this avoids warnings on 32-bit machines.
* -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 a = (REPEAT_BYTE(0x01) / 0xff + 1);
long b = mask & 1; return mask * a >> (sizeof(long) * 7);
return a + b + 1; } else {
/* Carl Chatfield / Jan Achrenius G+ version for 32-bit */
/* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */
long a = (0x0ff0001 + mask) >> 23;
/* Fix the 1 for 00 case */
return a & mask;
} }
} }