11/* Xxh64.c -- XXH64 hash calculation
22original code: Copyright (c) Yann Collet.
3- 2023-08-18 : modified by Igor Pavlov.
3+ modified by Igor Pavlov.
44This source code is licensed under BSD 2-Clause License.
55*/
66
@@ -27,6 +27,14 @@ void Xxh64State_Init(CXxh64State *p)
2727
2828#if !defined(MY_CPU_64BIT ) && defined(MY_CPU_X86 ) && defined(_MSC_VER )
2929 #define Z7_XXH64_USE_ASM
30+ #elif !defined(MY_CPU_LE_UNALIGN_64 ) // && defined (MY_CPU_LE)
31+ #define Z7_XXH64_USE_ALIGNED
32+ #endif
33+
34+ #ifdef Z7_XXH64_USE_ALIGNED
35+ #define Xxh64State_UpdateBlocks_Unaligned_Select Xxh64State_UpdateBlocks_Unaligned
36+ #else
37+ #define Xxh64State_UpdateBlocks_Unaligned_Select Xxh64State_UpdateBlocks
3038#endif
3139
3240#if !defined(MY_CPU_64BIT ) && defined(MY_CPU_X86 ) \
@@ -188,32 +196,76 @@ Xxh64State_UpdateBlocks(CXxh64State *p, const void *data, const void *end)
188196
189197#else
190198
199+ #ifdef Z7_XXH64_USE_ALIGNED
200+ static
201+ #endif
191202void
192203Z7_NO_INLINE
193204Z7_FASTCALL
194- Xxh64State_UpdateBlocks (CXxh64State * p , const void * _data , const void * end )
205+ Xxh64State_UpdateBlocks_Unaligned_Select (CXxh64State * p , const void * _data , const void * end )
195206{
196207 const Byte * data = (const Byte * )_data ;
197- UInt64 v [ 4 ] ;
198- v [ 0 ] = p -> v [0 ];
199- v [ 1 ] = p -> v [1 ];
200- v [ 2 ] = p -> v [2 ];
201- v [ 3 ] = p -> v [3 ];
208+ UInt64 v0 , v1 , v2 , v3 ;
209+ v0 = p -> v [0 ];
210+ v1 = p -> v [1 ];
211+ v2 = p -> v [2 ];
212+ v3 = p -> v [3 ];
202213 do
203214 {
204- v [ 0 ] = Xxh64_Round (v [ 0 ] , GetUi64 (data )); data += 8 ;
205- v [ 1 ] = Xxh64_Round (v [ 1 ] , GetUi64 (data )); data += 8 ;
206- v [ 2 ] = Xxh64_Round (v [ 2 ] , GetUi64 (data )); data += 8 ;
207- v [ 3 ] = Xxh64_Round (v [ 3 ] , GetUi64 (data )); data += 8 ;
215+ v0 = Xxh64_Round (v0 , GetUi64 (data )); data += 8 ;
216+ v1 = Xxh64_Round (v1 , GetUi64 (data )); data += 8 ;
217+ v2 = Xxh64_Round (v2 , GetUi64 (data )); data += 8 ;
218+ v3 = Xxh64_Round (v3 , GetUi64 (data )); data += 8 ;
208219 }
209220 while (data != end );
210- p -> v [0 ] = v [ 0 ] ;
211- p -> v [1 ] = v [ 1 ] ;
212- p -> v [2 ] = v [ 2 ] ;
213- p -> v [3 ] = v [ 3 ] ;
221+ p -> v [0 ] = v0 ;
222+ p -> v [1 ] = v1 ;
223+ p -> v [2 ] = v2 ;
224+ p -> v [3 ] = v3 ;
214225}
215226
216- #endif
227+
228+ #ifdef Z7_XXH64_USE_ALIGNED
229+
230+ static
231+ void
232+ Z7_NO_INLINE
233+ Z7_FASTCALL
234+ Xxh64State_UpdateBlocks_Aligned (CXxh64State * p , const void * _data , const void * end )
235+ {
236+ const Byte * data = (const Byte * )_data ;
237+ UInt64 v0 , v1 , v2 , v3 ;
238+ v0 = p -> v [0 ];
239+ v1 = p -> v [1 ];
240+ v2 = p -> v [2 ];
241+ v3 = p -> v [3 ];
242+ do
243+ {
244+ v0 = Xxh64_Round (v0 , GetUi64a (data )); data += 8 ;
245+ v1 = Xxh64_Round (v1 , GetUi64a (data )); data += 8 ;
246+ v2 = Xxh64_Round (v2 , GetUi64a (data )); data += 8 ;
247+ v3 = Xxh64_Round (v3 , GetUi64a (data )); data += 8 ;
248+ }
249+ while (data != end );
250+ p -> v [0 ] = v0 ;
251+ p -> v [1 ] = v1 ;
252+ p -> v [2 ] = v2 ;
253+ p -> v [3 ] = v3 ;
254+ }
255+
256+ void
257+ Z7_NO_INLINE
258+ Z7_FASTCALL
259+ Xxh64State_UpdateBlocks (CXxh64State * p , const void * data , const void * end )
260+ {
261+ if (((unsigned )(ptrdiff_t )data & 7 ) == 0 )
262+ Xxh64State_UpdateBlocks_Aligned (p , data , end );
263+ else
264+ Xxh64State_UpdateBlocks_Unaligned (p , data , end );
265+ }
266+
267+ #endif // Z7_XXH64_USE_ALIGNED
268+ #endif // Z7_XXH64_USE_ASM
217269
218270UInt64 Xxh64State_Digest (const CXxh64State * p , const void * _data , UInt64 count )
219271{
@@ -306,12 +358,22 @@ void Xxh64_Update(CXxh64 *p, const void *_data, size_t size)
306358 while (-- rem );
307359 if (cnt != 32 )
308360 return ;
309- Xxh64State_UpdateBlocks (& p -> state , p -> buf64 , & p -> buf64 [4 ]);
361+ #ifdef Z7_XXH64_USE_ALIGNED
362+ Xxh64State_UpdateBlocks_Aligned
363+ #else
364+ Xxh64State_UpdateBlocks_Unaligned_Select
365+ #endif
366+ (& p -> state , p -> buf64 , & p -> buf64 [4 ]);
310367 }
311368
312369 if (size &= ~(size_t )31 )
313370 {
314- Xxh64State_UpdateBlocks (& p -> state , data , data + size );
371+ #ifdef Z7_XXH64_USE_ALIGNED
372+ if (((unsigned )(ptrdiff_t )data & 7 ) == 0 )
373+ Xxh64State_UpdateBlocks_Aligned (& p -> state , data , data + size );
374+ else
375+ #endif
376+ Xxh64State_UpdateBlocks_Unaligned_Select (& p -> state , data , data + size );
315377 data += size ;
316378 }
317379
0 commit comments