1*f6dc9357SAndroid Build Coastguard Worker /* Xxh64.c -- XXH64 hash calculation
2*f6dc9357SAndroid Build Coastguard Worker original code: Copyright (c) Yann Collet.
3*f6dc9357SAndroid Build Coastguard Worker 2023-08-18 : modified by Igor Pavlov.
4*f6dc9357SAndroid Build Coastguard Worker This source code is licensed under BSD 2-Clause License.
5*f6dc9357SAndroid Build Coastguard Worker */
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "Precomp.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "CpuArch.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "RotateDefs.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "Xxh64.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_1 UINT64_CONST(0x9E3779B185EBCA87)
14*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_2 UINT64_CONST(0xC2B2AE3D27D4EB4F)
15*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_3 UINT64_CONST(0x165667B19E3779F9)
16*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_4 UINT64_CONST(0x85EBCA77C2B2AE63)
17*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_5 UINT64_CONST(0x27D4EB2F165667C5)
18*f6dc9357SAndroid Build Coastguard Worker
Xxh64State_Init(CXxh64State * p)19*f6dc9357SAndroid Build Coastguard Worker void Xxh64State_Init(CXxh64State *p)
20*f6dc9357SAndroid Build Coastguard Worker {
21*f6dc9357SAndroid Build Coastguard Worker const UInt64 seed = 0;
22*f6dc9357SAndroid Build Coastguard Worker p->v[0] = seed + Z7_XXH_PRIME64_1 + Z7_XXH_PRIME64_2;
23*f6dc9357SAndroid Build Coastguard Worker p->v[1] = seed + Z7_XXH_PRIME64_2;
24*f6dc9357SAndroid Build Coastguard Worker p->v[2] = seed;
25*f6dc9357SAndroid Build Coastguard Worker p->v[3] = seed - Z7_XXH_PRIME64_1;
26*f6dc9357SAndroid Build Coastguard Worker }
27*f6dc9357SAndroid Build Coastguard Worker
28*f6dc9357SAndroid Build Coastguard Worker #if !defined(MY_CPU_64BIT) && defined(MY_CPU_X86) && defined(_MSC_VER)
29*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH64_USE_ASM
30*f6dc9357SAndroid Build Coastguard Worker #endif
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker #if !defined(MY_CPU_64BIT) && defined(MY_CPU_X86) \
33*f6dc9357SAndroid Build Coastguard Worker && defined(Z7_MSC_VER_ORIGINAL) && Z7_MSC_VER_ORIGINAL > 1200
34*f6dc9357SAndroid Build Coastguard Worker /* we try to avoid __allmul calls in MSVC for 64-bit multiply.
35*f6dc9357SAndroid Build Coastguard Worker But MSVC6 still uses __allmul for our code.
36*f6dc9357SAndroid Build Coastguard Worker So for MSVC6 we use default 64-bit multiply without our optimization.
37*f6dc9357SAndroid Build Coastguard Worker */
38*f6dc9357SAndroid Build Coastguard Worker #define LOW32(b) ((UInt32)(b & 0xffffffff))
39*f6dc9357SAndroid Build Coastguard Worker /* MSVC compiler (MSVC > 1200) can use "mul" instruction
40*f6dc9357SAndroid Build Coastguard Worker without __allmul for our MY_emulu MACRO.
41*f6dc9357SAndroid Build Coastguard Worker MY_emulu is similar to __emulu(a, b) MACRO */
42*f6dc9357SAndroid Build Coastguard Worker #define MY_emulu(a, b) ((UInt64)(a) * (b))
43*f6dc9357SAndroid Build Coastguard Worker #define MY_SET_HIGH32(a) ((UInt64)(a) << 32)
44*f6dc9357SAndroid Build Coastguard Worker #define MY_MUL32_SET_HIGH32(a, b) MY_SET_HIGH32((UInt32)(a) * (UInt32)(b))
45*f6dc9357SAndroid Build Coastguard Worker // /*
46*f6dc9357SAndroid Build Coastguard Worker #define MY_MUL64(a, b) \
47*f6dc9357SAndroid Build Coastguard Worker ( MY_emulu((UInt32)(a), LOW32(b)) + \
48*f6dc9357SAndroid Build Coastguard Worker MY_SET_HIGH32( \
49*f6dc9357SAndroid Build Coastguard Worker (UInt32)((a) >> 32) * LOW32(b) + \
50*f6dc9357SAndroid Build Coastguard Worker (UInt32)(a) * (UInt32)((b) >> 32) \
51*f6dc9357SAndroid Build Coastguard Worker ))
52*f6dc9357SAndroid Build Coastguard Worker // */
53*f6dc9357SAndroid Build Coastguard Worker /*
54*f6dc9357SAndroid Build Coastguard Worker #define MY_MUL64(a, b) \
55*f6dc9357SAndroid Build Coastguard Worker ( MY_emulu((UInt32)(a), LOW32(b)) \
56*f6dc9357SAndroid Build Coastguard Worker + MY_MUL32_SET_HIGH32((a) >> 32, LOW32(b)) + \
57*f6dc9357SAndroid Build Coastguard Worker + MY_MUL32_SET_HIGH32(a, (b) >> 32) \
58*f6dc9357SAndroid Build Coastguard Worker )
59*f6dc9357SAndroid Build Coastguard Worker */
60*f6dc9357SAndroid Build Coastguard Worker
61*f6dc9357SAndroid Build Coastguard Worker #define MY_MUL_32_64(a32, b) \
62*f6dc9357SAndroid Build Coastguard Worker ( MY_emulu((UInt32)(a32), LOW32(b)) \
63*f6dc9357SAndroid Build Coastguard Worker + MY_MUL32_SET_HIGH32(a32, (b) >> 32) \
64*f6dc9357SAndroid Build Coastguard Worker )
65*f6dc9357SAndroid Build Coastguard Worker
66*f6dc9357SAndroid Build Coastguard Worker #else
67*f6dc9357SAndroid Build Coastguard Worker #define MY_MUL64(a, b) ((a) * (b))
68*f6dc9357SAndroid Build Coastguard Worker #define MY_MUL_32_64(a32, b) ((a32) * (UInt64)(b))
69*f6dc9357SAndroid Build Coastguard Worker #endif
70*f6dc9357SAndroid Build Coastguard Worker
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker static
73*f6dc9357SAndroid Build Coastguard Worker Z7_FORCE_INLINE
Xxh64_Round(UInt64 acc,UInt64 input)74*f6dc9357SAndroid Build Coastguard Worker UInt64 Xxh64_Round(UInt64 acc, UInt64 input)
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker acc += MY_MUL64(input, Z7_XXH_PRIME64_2);
77*f6dc9357SAndroid Build Coastguard Worker acc = Z7_ROTL64(acc, 31);
78*f6dc9357SAndroid Build Coastguard Worker return MY_MUL64(acc, Z7_XXH_PRIME64_1);
79*f6dc9357SAndroid Build Coastguard Worker }
80*f6dc9357SAndroid Build Coastguard Worker
Xxh64_Merge(UInt64 acc,UInt64 val)81*f6dc9357SAndroid Build Coastguard Worker static UInt64 Xxh64_Merge(UInt64 acc, UInt64 val)
82*f6dc9357SAndroid Build Coastguard Worker {
83*f6dc9357SAndroid Build Coastguard Worker acc ^= Xxh64_Round(0, val);
84*f6dc9357SAndroid Build Coastguard Worker return MY_MUL64(acc, Z7_XXH_PRIME64_1) + Z7_XXH_PRIME64_4;
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker
87*f6dc9357SAndroid Build Coastguard Worker
88*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_XXH64_USE_ASM
89*f6dc9357SAndroid Build Coastguard Worker
90*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_1_HIGH 0x9E3779B1
91*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_1_LOW 0x85EBCA87
92*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_2_HIGH 0xC2B2AE3D
93*f6dc9357SAndroid Build Coastguard Worker #define Z7_XXH_PRIME64_2_LOW 0x27D4EB4F
94*f6dc9357SAndroid Build Coastguard Worker
95*f6dc9357SAndroid Build Coastguard Worker void
96*f6dc9357SAndroid Build Coastguard Worker Z7_NO_INLINE
97*f6dc9357SAndroid Build Coastguard Worker __declspec(naked)
98*f6dc9357SAndroid Build Coastguard Worker Z7_FASTCALL
Xxh64State_UpdateBlocks(CXxh64State * p,const void * data,const void * end)99*f6dc9357SAndroid Build Coastguard Worker Xxh64State_UpdateBlocks(CXxh64State *p, const void *data, const void *end)
100*f6dc9357SAndroid Build Coastguard Worker {
101*f6dc9357SAndroid Build Coastguard Worker #if !defined(__clang__)
102*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(p)
103*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(data)
104*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(end)
105*f6dc9357SAndroid Build Coastguard Worker #endif
106*f6dc9357SAndroid Build Coastguard Worker __asm push ebx
107*f6dc9357SAndroid Build Coastguard Worker __asm push ebp
108*f6dc9357SAndroid Build Coastguard Worker __asm push esi
109*f6dc9357SAndroid Build Coastguard Worker __asm push edi
110*f6dc9357SAndroid Build Coastguard Worker
111*f6dc9357SAndroid Build Coastguard Worker #define STACK_OFFSET 4 * 8
112*f6dc9357SAndroid Build Coastguard Worker __asm sub esp, STACK_OFFSET
113*f6dc9357SAndroid Build Coastguard Worker
114*f6dc9357SAndroid Build Coastguard Worker #define COPY_1(n) \
115*f6dc9357SAndroid Build Coastguard Worker __asm mov eax, [ecx + n * 4] \
116*f6dc9357SAndroid Build Coastguard Worker __asm mov [esp + n * 4], eax \
117*f6dc9357SAndroid Build Coastguard Worker
118*f6dc9357SAndroid Build Coastguard Worker #define COPY_2(n) \
119*f6dc9357SAndroid Build Coastguard Worker __asm mov eax, [esp + n * 4] \
120*f6dc9357SAndroid Build Coastguard Worker __asm mov [ecx + n * 4], eax \
121*f6dc9357SAndroid Build Coastguard Worker
122*f6dc9357SAndroid Build Coastguard Worker COPY_1(0)
123*f6dc9357SAndroid Build Coastguard Worker __asm mov edi, [ecx + 1 * 4] \
124*f6dc9357SAndroid Build Coastguard Worker COPY_1(2)
125*f6dc9357SAndroid Build Coastguard Worker COPY_1(3)
126*f6dc9357SAndroid Build Coastguard Worker COPY_1(4)
127*f6dc9357SAndroid Build Coastguard Worker COPY_1(5)
128*f6dc9357SAndroid Build Coastguard Worker COPY_1(6)
129*f6dc9357SAndroid Build Coastguard Worker COPY_1(7)
130*f6dc9357SAndroid Build Coastguard Worker
131*f6dc9357SAndroid Build Coastguard Worker __asm mov esi, edx \
132*f6dc9357SAndroid Build Coastguard Worker __asm mov [esp + 0 * 8 + 4], ecx
133*f6dc9357SAndroid Build Coastguard Worker __asm mov ecx, Z7_XXH_PRIME64_2_LOW \
134*f6dc9357SAndroid Build Coastguard Worker __asm mov ebp, Z7_XXH_PRIME64_1_LOW \
135*f6dc9357SAndroid Build Coastguard Worker
136*f6dc9357SAndroid Build Coastguard Worker #define R(n, state1, state1_reg) \
137*f6dc9357SAndroid Build Coastguard Worker __asm mov eax, [esi + n * 8] \
138*f6dc9357SAndroid Build Coastguard Worker __asm imul ebx, eax, Z7_XXH_PRIME64_2_HIGH \
139*f6dc9357SAndroid Build Coastguard Worker __asm add ebx, state1 \
140*f6dc9357SAndroid Build Coastguard Worker __asm mul ecx \
141*f6dc9357SAndroid Build Coastguard Worker __asm add edx, ebx \
142*f6dc9357SAndroid Build Coastguard Worker __asm mov ebx, [esi + n * 8 + 4] \
143*f6dc9357SAndroid Build Coastguard Worker __asm imul ebx, ecx \
144*f6dc9357SAndroid Build Coastguard Worker __asm add eax, [esp + n * 8] \
145*f6dc9357SAndroid Build Coastguard Worker __asm adc edx, ebx \
146*f6dc9357SAndroid Build Coastguard Worker __asm mov ebx, eax \
147*f6dc9357SAndroid Build Coastguard Worker __asm shld eax, edx, 31 \
148*f6dc9357SAndroid Build Coastguard Worker __asm shld edx, ebx, 31 \
149*f6dc9357SAndroid Build Coastguard Worker __asm imul state1_reg, eax, Z7_XXH_PRIME64_1_HIGH \
150*f6dc9357SAndroid Build Coastguard Worker __asm imul edx, ebp \
151*f6dc9357SAndroid Build Coastguard Worker __asm add state1_reg, edx \
152*f6dc9357SAndroid Build Coastguard Worker __asm mul ebp \
153*f6dc9357SAndroid Build Coastguard Worker __asm add state1_reg, edx \
154*f6dc9357SAndroid Build Coastguard Worker __asm mov [esp + n * 8], eax \
155*f6dc9357SAndroid Build Coastguard Worker
156*f6dc9357SAndroid Build Coastguard Worker #define R2(n) \
157*f6dc9357SAndroid Build Coastguard Worker R(n, [esp + n * 8 + 4], ebx) \
158*f6dc9357SAndroid Build Coastguard Worker __asm mov [esp + n * 8 + 4], ebx \
159*f6dc9357SAndroid Build Coastguard Worker
160*f6dc9357SAndroid Build Coastguard Worker __asm align 16
161*f6dc9357SAndroid Build Coastguard Worker __asm main_loop:
162*f6dc9357SAndroid Build Coastguard Worker R(0, edi, edi)
163*f6dc9357SAndroid Build Coastguard Worker R2(1)
164*f6dc9357SAndroid Build Coastguard Worker R2(2)
165*f6dc9357SAndroid Build Coastguard Worker R2(3)
166*f6dc9357SAndroid Build Coastguard Worker __asm add esi, 32
167*f6dc9357SAndroid Build Coastguard Worker __asm cmp esi, [esp + STACK_OFFSET + 4 * 4 + 4]
168*f6dc9357SAndroid Build Coastguard Worker __asm jne main_loop
169*f6dc9357SAndroid Build Coastguard Worker
170*f6dc9357SAndroid Build Coastguard Worker __asm mov ecx, [esp + 0 * 8 + 4]
171*f6dc9357SAndroid Build Coastguard Worker
172*f6dc9357SAndroid Build Coastguard Worker COPY_2(0)
173*f6dc9357SAndroid Build Coastguard Worker __asm mov [ecx + 1 * 4], edi
174*f6dc9357SAndroid Build Coastguard Worker COPY_2(2)
175*f6dc9357SAndroid Build Coastguard Worker COPY_2(3)
176*f6dc9357SAndroid Build Coastguard Worker COPY_2(4)
177*f6dc9357SAndroid Build Coastguard Worker COPY_2(5)
178*f6dc9357SAndroid Build Coastguard Worker COPY_2(6)
179*f6dc9357SAndroid Build Coastguard Worker COPY_2(7)
180*f6dc9357SAndroid Build Coastguard Worker
181*f6dc9357SAndroid Build Coastguard Worker __asm add esp, STACK_OFFSET
182*f6dc9357SAndroid Build Coastguard Worker __asm pop edi
183*f6dc9357SAndroid Build Coastguard Worker __asm pop esi
184*f6dc9357SAndroid Build Coastguard Worker __asm pop ebp
185*f6dc9357SAndroid Build Coastguard Worker __asm pop ebx
186*f6dc9357SAndroid Build Coastguard Worker __asm ret 4
187*f6dc9357SAndroid Build Coastguard Worker }
188*f6dc9357SAndroid Build Coastguard Worker
189*f6dc9357SAndroid Build Coastguard Worker #else
190*f6dc9357SAndroid Build Coastguard Worker
191*f6dc9357SAndroid Build Coastguard Worker void
192*f6dc9357SAndroid Build Coastguard Worker Z7_NO_INLINE
193*f6dc9357SAndroid Build Coastguard Worker Z7_FASTCALL
Xxh64State_UpdateBlocks(CXxh64State * p,const void * _data,const void * end)194*f6dc9357SAndroid Build Coastguard Worker Xxh64State_UpdateBlocks(CXxh64State *p, const void *_data, const void *end)
195*f6dc9357SAndroid Build Coastguard Worker {
196*f6dc9357SAndroid Build Coastguard Worker const Byte *data = (const Byte *)_data;
197*f6dc9357SAndroid Build Coastguard Worker UInt64 v[4];
198*f6dc9357SAndroid Build Coastguard Worker v[0] = p->v[0];
199*f6dc9357SAndroid Build Coastguard Worker v[1] = p->v[1];
200*f6dc9357SAndroid Build Coastguard Worker v[2] = p->v[2];
201*f6dc9357SAndroid Build Coastguard Worker v[3] = p->v[3];
202*f6dc9357SAndroid Build Coastguard Worker do
203*f6dc9357SAndroid Build Coastguard Worker {
204*f6dc9357SAndroid Build Coastguard Worker v[0] = Xxh64_Round(v[0], GetUi64(data)); data += 8;
205*f6dc9357SAndroid Build Coastguard Worker v[1] = Xxh64_Round(v[1], GetUi64(data)); data += 8;
206*f6dc9357SAndroid Build Coastguard Worker v[2] = Xxh64_Round(v[2], GetUi64(data)); data += 8;
207*f6dc9357SAndroid Build Coastguard Worker v[3] = Xxh64_Round(v[3], GetUi64(data)); data += 8;
208*f6dc9357SAndroid Build Coastguard Worker }
209*f6dc9357SAndroid Build Coastguard Worker while (data != end);
210*f6dc9357SAndroid Build Coastguard Worker p->v[0] = v[0];
211*f6dc9357SAndroid Build Coastguard Worker p->v[1] = v[1];
212*f6dc9357SAndroid Build Coastguard Worker p->v[2] = v[2];
213*f6dc9357SAndroid Build Coastguard Worker p->v[3] = v[3];
214*f6dc9357SAndroid Build Coastguard Worker }
215*f6dc9357SAndroid Build Coastguard Worker
216*f6dc9357SAndroid Build Coastguard Worker #endif
217*f6dc9357SAndroid Build Coastguard Worker
Xxh64State_Digest(const CXxh64State * p,const void * _data,UInt64 count)218*f6dc9357SAndroid Build Coastguard Worker UInt64 Xxh64State_Digest(const CXxh64State *p, const void *_data, UInt64 count)
219*f6dc9357SAndroid Build Coastguard Worker {
220*f6dc9357SAndroid Build Coastguard Worker UInt64 h = p->v[2];
221*f6dc9357SAndroid Build Coastguard Worker
222*f6dc9357SAndroid Build Coastguard Worker if (count >= 32)
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker h = Z7_ROTL64(p->v[0], 1) +
225*f6dc9357SAndroid Build Coastguard Worker Z7_ROTL64(p->v[1], 7) +
226*f6dc9357SAndroid Build Coastguard Worker Z7_ROTL64(h, 12) +
227*f6dc9357SAndroid Build Coastguard Worker Z7_ROTL64(p->v[3], 18);
228*f6dc9357SAndroid Build Coastguard Worker h = Xxh64_Merge(h, p->v[0]);
229*f6dc9357SAndroid Build Coastguard Worker h = Xxh64_Merge(h, p->v[1]);
230*f6dc9357SAndroid Build Coastguard Worker h = Xxh64_Merge(h, p->v[2]);
231*f6dc9357SAndroid Build Coastguard Worker h = Xxh64_Merge(h, p->v[3]);
232*f6dc9357SAndroid Build Coastguard Worker }
233*f6dc9357SAndroid Build Coastguard Worker else
234*f6dc9357SAndroid Build Coastguard Worker h += Z7_XXH_PRIME64_5;
235*f6dc9357SAndroid Build Coastguard Worker
236*f6dc9357SAndroid Build Coastguard Worker h += count;
237*f6dc9357SAndroid Build Coastguard Worker
238*f6dc9357SAndroid Build Coastguard Worker // XXH64_finalize():
239*f6dc9357SAndroid Build Coastguard Worker {
240*f6dc9357SAndroid Build Coastguard Worker unsigned cnt = (unsigned)count & 31;
241*f6dc9357SAndroid Build Coastguard Worker const Byte *data = (const Byte *)_data;
242*f6dc9357SAndroid Build Coastguard Worker while (cnt >= 8)
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker h ^= Xxh64_Round(0, GetUi64(data));
245*f6dc9357SAndroid Build Coastguard Worker data += 8;
246*f6dc9357SAndroid Build Coastguard Worker h = Z7_ROTL64(h, 27);
247*f6dc9357SAndroid Build Coastguard Worker h = MY_MUL64(h, Z7_XXH_PRIME64_1) + Z7_XXH_PRIME64_4;
248*f6dc9357SAndroid Build Coastguard Worker cnt -= 8;
249*f6dc9357SAndroid Build Coastguard Worker }
250*f6dc9357SAndroid Build Coastguard Worker if (cnt >= 4)
251*f6dc9357SAndroid Build Coastguard Worker {
252*f6dc9357SAndroid Build Coastguard Worker const UInt32 v = GetUi32(data);
253*f6dc9357SAndroid Build Coastguard Worker data += 4;
254*f6dc9357SAndroid Build Coastguard Worker h ^= MY_MUL_32_64(v, Z7_XXH_PRIME64_1);
255*f6dc9357SAndroid Build Coastguard Worker h = Z7_ROTL64(h, 23);
256*f6dc9357SAndroid Build Coastguard Worker h = MY_MUL64(h, Z7_XXH_PRIME64_2) + Z7_XXH_PRIME64_3;
257*f6dc9357SAndroid Build Coastguard Worker cnt -= 4;
258*f6dc9357SAndroid Build Coastguard Worker }
259*f6dc9357SAndroid Build Coastguard Worker while (cnt)
260*f6dc9357SAndroid Build Coastguard Worker {
261*f6dc9357SAndroid Build Coastguard Worker const UInt32 v = *data++;
262*f6dc9357SAndroid Build Coastguard Worker h ^= MY_MUL_32_64(v, Z7_XXH_PRIME64_5);
263*f6dc9357SAndroid Build Coastguard Worker h = Z7_ROTL64(h, 11);
264*f6dc9357SAndroid Build Coastguard Worker h = MY_MUL64(h, Z7_XXH_PRIME64_1);
265*f6dc9357SAndroid Build Coastguard Worker cnt--;
266*f6dc9357SAndroid Build Coastguard Worker }
267*f6dc9357SAndroid Build Coastguard Worker // XXH64_avalanche(h):
268*f6dc9357SAndroid Build Coastguard Worker h ^= h >> 33; h = MY_MUL64(h, Z7_XXH_PRIME64_2);
269*f6dc9357SAndroid Build Coastguard Worker h ^= h >> 29; h = MY_MUL64(h, Z7_XXH_PRIME64_3);
270*f6dc9357SAndroid Build Coastguard Worker h ^= h >> 32;
271*f6dc9357SAndroid Build Coastguard Worker return h;
272*f6dc9357SAndroid Build Coastguard Worker }
273*f6dc9357SAndroid Build Coastguard Worker }
274*f6dc9357SAndroid Build Coastguard Worker
275*f6dc9357SAndroid Build Coastguard Worker
Xxh64_Init(CXxh64 * p)276*f6dc9357SAndroid Build Coastguard Worker void Xxh64_Init(CXxh64 *p)
277*f6dc9357SAndroid Build Coastguard Worker {
278*f6dc9357SAndroid Build Coastguard Worker Xxh64State_Init(&p->state);
279*f6dc9357SAndroid Build Coastguard Worker p->count = 0;
280*f6dc9357SAndroid Build Coastguard Worker p->buf64[0] = 0;
281*f6dc9357SAndroid Build Coastguard Worker p->buf64[1] = 0;
282*f6dc9357SAndroid Build Coastguard Worker p->buf64[2] = 0;
283*f6dc9357SAndroid Build Coastguard Worker p->buf64[3] = 0;
284*f6dc9357SAndroid Build Coastguard Worker }
285*f6dc9357SAndroid Build Coastguard Worker
Xxh64_Update(CXxh64 * p,const void * _data,size_t size)286*f6dc9357SAndroid Build Coastguard Worker void Xxh64_Update(CXxh64 *p, const void *_data, size_t size)
287*f6dc9357SAndroid Build Coastguard Worker {
288*f6dc9357SAndroid Build Coastguard Worker const Byte *data = (const Byte *)_data;
289*f6dc9357SAndroid Build Coastguard Worker unsigned cnt;
290*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
291*f6dc9357SAndroid Build Coastguard Worker return;
292*f6dc9357SAndroid Build Coastguard Worker cnt = (unsigned)p->count;
293*f6dc9357SAndroid Build Coastguard Worker p->count += size;
294*f6dc9357SAndroid Build Coastguard Worker
295*f6dc9357SAndroid Build Coastguard Worker if (cnt &= 31)
296*f6dc9357SAndroid Build Coastguard Worker {
297*f6dc9357SAndroid Build Coastguard Worker unsigned rem = 32 - cnt;
298*f6dc9357SAndroid Build Coastguard Worker Byte *dest = (Byte *)p->buf64 + cnt;
299*f6dc9357SAndroid Build Coastguard Worker if (rem > size)
300*f6dc9357SAndroid Build Coastguard Worker rem = (unsigned)size;
301*f6dc9357SAndroid Build Coastguard Worker size -= rem;
302*f6dc9357SAndroid Build Coastguard Worker cnt += rem;
303*f6dc9357SAndroid Build Coastguard Worker // memcpy((Byte *)p->buf64 + cnt, data, rem);
304*f6dc9357SAndroid Build Coastguard Worker do
305*f6dc9357SAndroid Build Coastguard Worker *dest++ = *data++;
306*f6dc9357SAndroid Build Coastguard Worker while (--rem);
307*f6dc9357SAndroid Build Coastguard Worker if (cnt != 32)
308*f6dc9357SAndroid Build Coastguard Worker return;
309*f6dc9357SAndroid Build Coastguard Worker Xxh64State_UpdateBlocks(&p->state, p->buf64, &p->buf64[4]);
310*f6dc9357SAndroid Build Coastguard Worker }
311*f6dc9357SAndroid Build Coastguard Worker
312*f6dc9357SAndroid Build Coastguard Worker if (size &= ~(size_t)31)
313*f6dc9357SAndroid Build Coastguard Worker {
314*f6dc9357SAndroid Build Coastguard Worker Xxh64State_UpdateBlocks(&p->state, data, data + size);
315*f6dc9357SAndroid Build Coastguard Worker data += size;
316*f6dc9357SAndroid Build Coastguard Worker }
317*f6dc9357SAndroid Build Coastguard Worker
318*f6dc9357SAndroid Build Coastguard Worker cnt = (unsigned)p->count & 31;
319*f6dc9357SAndroid Build Coastguard Worker if (cnt)
320*f6dc9357SAndroid Build Coastguard Worker {
321*f6dc9357SAndroid Build Coastguard Worker // memcpy(p->buf64, data, cnt);
322*f6dc9357SAndroid Build Coastguard Worker Byte *dest = (Byte *)p->buf64;
323*f6dc9357SAndroid Build Coastguard Worker do
324*f6dc9357SAndroid Build Coastguard Worker *dest++ = *data++;
325*f6dc9357SAndroid Build Coastguard Worker while (--cnt);
326*f6dc9357SAndroid Build Coastguard Worker }
327*f6dc9357SAndroid Build Coastguard Worker }
328