split 64-mult hashing into two 32-bit multiplies

Speed-wise equivalent on x86 and ARM (maybe a tad faster, hard to tell).

Note that the two 32-bit multiples are not strictly equivalent
to the 64-bit one, since we're missing one carry propagation.
In practice, no observable difference was seen because of this
slightly different hashing result.

Change-Id: I8f2381175eae1cb20dabf149e6b27e1768fba6ab
This commit is contained in:
Pascal Massimino 2015-04-15 17:44:52 +02:00
parent b69a6c35b2
commit 7fe357b8c0

View File

@ -21,8 +21,6 @@
#define VALUES_IN_BYTE 256 #define VALUES_IN_BYTE 256
#define HASH_MULTIPLIER (0xc6a4a7935bd1e995ULL)
#define MIN_BLOCK_SIZE 256 // minimum block size for backward references #define MIN_BLOCK_SIZE 256 // minimum block size for backward references
#define MAX_ENTROPY (1e30f) #define MAX_ENTROPY (1e30f)
@ -215,9 +213,14 @@ void VP8LHashChainClear(VP8LHashChain* const p) {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#define HASH_MULTIPLIER_HI (0xc6a4a793U)
#define HASH_MULTIPLIER_LO (0x5bd1e996U)
static WEBP_INLINE uint64_t GetPixPairHash64(const uint32_t* const argb) { static WEBP_INLINE uint64_t GetPixPairHash64(const uint32_t* const argb) {
uint64_t key = ((uint64_t)argb[1] << 32) | argb[0]; uint32_t key;
key = (key * HASH_MULTIPLIER) >> (64 - HASH_BITS); key = argb[1] * HASH_MULTIPLIER_HI;
key += argb[0] * HASH_MULTIPLIER_LO;
key = key >> (32 - HASH_BITS);
return key; return key;
} }