26 #include "gu_int128.h"
34 #define GU_FNV32_PRIME 16777619UL
35 #define GU_FNV32_SEED 2166136261UL
37 #if !defined(GU_FNVBITSHIFT_OPTIMIZATION)
38 # define GU_FNV32_MUL(_x) _x *= GU_FNV32_PRIME
40 # define GU_FNV32_MUL(_x) \
41 _x += (_x << 1) + (_x << 4) + (_x << 7) + (_x << 8) + (_x << 24)
44 #if !defined(GU_FNV_NORMAL)
45 # define GU_FNV32_ITERATION(_s,_b) _s ^= _b; GU_FNV32_MUL(_s);
47 # define GU_FNV32_ITERATION(_s,_b) GU_FNV32_MUL(_s); _s ^= _b;
50 static GU_FORCE_INLINE
void
51 gu_fnv32a_internal (
const void* buf, ssize_t
const len, uint32_t* seed)
53 const uint8_t* bp = (
const uint8_t*)buf;
54 const uint8_t*
const be = bp + len;
58 GU_FNV32_ITERATION(*seed,*bp++);
59 GU_FNV32_ITERATION(*seed,*bp++);
64 GU_FNV32_ITERATION(*seed,*bp++);
70 #define GU_FNV64_PRIME 1099511628211ULL
71 #define GU_FNV64_SEED 14695981039346656037ULL
73 #if !defined(GU_FNVBITSHIFT_OPTIMIZATION)
74 # define GU_FNV64_MUL(_x) _x *= GU_FNV64_PRIME
76 # define GU_FNV64_MUL(_x) \
77 _x +=(_x << 1) + (_x << 4) + (_x << 5) + (_x << 7) + (_x << 8) + (_x << 40);
80 #if !defined(GU_FNV_NORMAL)
81 # define GU_FNV64_ITERATION(_s,_b) _s ^= _b; GU_FNV64_MUL(_s);
83 # define GU_FNV64_ITERATION(_s,_b) GU_FNV64_MUL(_s); _s ^= _b;
86 static GU_FORCE_INLINE
void
87 gu_fnv64a_internal (
const void* buf, ssize_t
const len, uint64_t* seed)
89 const uint8_t* bp = (
const uint8_t*)buf;
90 const uint8_t*
const be = bp + len;
94 GU_FNV64_ITERATION(*seed,*bp++);
95 GU_FNV64_ITERATION(*seed,*bp++);
100 GU_FNV64_ITERATION(*seed,*bp++);
107 GU_SET128(GU_FNV128_PRIME, 0x0000000001000000ULL, 0x000000000000013BULL);
110 GU_SET128(GU_FNV128_SEED, 0x6C62272E07BB0142ULL, 0x62B821756295C58DULL);
112 #if defined(__SIZEOF_INT128__)
114 #define GU_FNV128_XOR(_s,_b) _s ^= _b
116 #if !defined(GU_FNVBITSHIFT_OPTIMIZATION)
117 # define GU_FNV128_MUL(_x) _x *= GU_FNV128_PRIME
119 # define GU_FNV128_MUL(_x) \
120 _x +=(_x << 1) + (_x << 3) + (_x << 4) + (_x << 5) + (_x << 8) + (_x << 88);
125 #define GU_FNV128_XOR(_s,_b) (_s).u32[GU_32LO] ^= _b
127 #if defined(GU_FNV128_FULL_MULTIPLICATION)
128 # define GU_FNV128_MUL(_x) GU_MUL128_INPLACE(_x, GU_FNV128_PRIME)
130 # define GU_FNV128_MUL(_x) { \
132 (((_x).u64[GU_64LO] & 0x00000000ffffffffULL) * 0x013b) >> 32; \
133 carry = (((_x).u64[GU_64LO] >> 32) * 0x013b + carry) >> 32; \
134 (_x).u64[GU_64HI] *= 0x013b; \
135 (_x).u64[GU_64HI] += ((_x).u64[GU_64LO] << 24) + carry; \
136 (_x).u64[GU_64LO] *= 0x013b; \
143 #if !defined(GU_FNV_NORMAL)
144 # define GU_FNV128_ITERATION(_s,_b) GU_FNV128_XOR(_s,_b); GU_FNV128_MUL(_s);
146 # define GU_FNV128_ITERATION(_s,_b) GU_FNV128_MUL(_s); GU_FNV128_XOR(_s,_b);
150 gu_fnv128a_internal (
const void* buf, ssize_t
const len,
gu_uint128_t* seed)
152 const uint8_t* bp = (
const uint8_t*)buf;
153 const uint8_t*
const be = bp + len;
158 GU_FNV128_ITERATION(*seed, *bp++);
159 GU_FNV128_ITERATION(*seed, *bp++);
160 GU_FNV128_ITERATION(*seed, *bp++);
161 GU_FNV128_ITERATION(*seed, *bp++);
162 GU_FNV128_ITERATION(*seed, *bp++);
163 GU_FNV128_ITERATION(*seed, *bp++);
164 GU_FNV128_ITERATION(*seed, *bp++);
165 GU_FNV128_ITERATION(*seed, *bp++);
170 GU_FNV128_ITERATION(*seed, *bp++);
171 GU_FNV128_ITERATION(*seed, *bp++);
172 GU_FNV128_ITERATION(*seed, *bp++);
173 GU_FNV128_ITERATION(*seed, *bp++);
178 GU_FNV128_ITERATION(*seed, *bp++);
179 GU_FNV128_ITERATION(*seed, *bp++);
184 GU_FNV128_ITERATION(*seed, *bp++);
Definition: gu_int128.h:105