1 /******************************************************************************
2 * Copyright (c) Intel Corporation - All rights reserved. *
3 * This file is part of the LIBXSMM library. *
4 * *
5 * For information on the license, see the LICENSE file. *
6 * Further information: https://github.com/hfp/libxsmm/ *
7 * SPDX-License-Identifier: BSD-3-Clause *
8 ******************************************************************************/
9 /* Hans Pabst (Intel Corp.)
10 ******************************************************************************/
11 #include "libxsmm_hash.h"
12 #include "libxsmm_main.h"
13
14 #if !defined(LIBXSMM_HASH_ALIGNMENT)
15 # define LIBXSMM_HASH_ALIGNMENT 8
16 #endif
17
18 #define LIBXSMM_HASH_U64(FN, SEED, BEGIN, END) { \
19 const uint8_t *const end = (NULL != (END) ? ((END) - 7) : NULL); \
20 for (; (BEGIN) < end; (BEGIN) += 8) { LIBXSMM_ASSERT(NULL != (BEGIN) || NULL == (END)); \
21 SEED = (uint32_t)FN(SEED, BEGIN); \
22 } \
23 }
24 #define LIBXSMM_HASH_U32(FN, SEED, BEGIN, END) { \
25 const uint8_t *const next = (BEGIN) + 4; \
26 if (next <= (END)) { LIBXSMM_ASSERT(NULL != (BEGIN) || NULL == (END)); \
27 SEED = FN(SEED, BEGIN); BEGIN = next; \
28 } \
29 }
30 #define LIBXSMM_HASH_U16(FN, SEED, BEGIN, END) { \
31 const uint8_t *const next = (BEGIN) + 2; \
32 if (next <= (END)) { LIBXSMM_ASSERT(NULL != (BEGIN) || NULL == (END)); \
33 SEED = FN(SEED, BEGIN); BEGIN = next; \
34 } \
35 }
36 #define LIBXSMM_HASH_U8(FN, SEED, BEGIN, END) { \
37 if ((BEGIN) < (END)) { LIBXSMM_ASSERT(NULL != (BEGIN) || NULL == (END)); \
38 SEED = FN(SEED, BEGIN); ++(BEGIN); \
39 } \
40 }
41
42 #define LIBXSMM_HASH_CRC32_U8(SEED, PVALUE) _mm_crc32_u8(SEED, *(const uint8_t*)(PVALUE))
43 #define LIBXSMM_HASH_CRC32_U16(SEED, PVALUE) _mm_crc32_u16(SEED, *(const uint16_t*)(PVALUE))
44 #define LIBXSMM_HASH_CRC32_U32(SEED, PVALUE) _mm_crc32_u32(SEED, *(const uint32_t*)(PVALUE))
45
46 #if (64 > (LIBXSMM_BITS)) || defined(__PGI)
47 # define LIBXSMM_HASH_CRC32_U64(SEED, PVALUE) \
48 LIBXSMM_HASH_CRC32_U32(LIBXSMM_HASH_CRC32_U32((uint32_t)(SEED), PVALUE), (const uint32_t*)(PVALUE) + 1)
49 #else
50 # define LIBXSMM_HASH_CRC32_U64(SEED, PVALUE) _mm_crc32_u64(SEED, *(const uint64_t*)(PVALUE))
51 #endif
52
53 #define LIBXSMM_HASH_UNALIGNED(FN64, FN32, FN16, FN8, SEED, DATA, SIZE) { \
54 const uint8_t *begin = (const uint8_t*)(DATA); \
55 const uint8_t *const endb = begin + (SIZE); \
56 LIBXSMM_HASH_U64(FN64, SEED, begin, endb); \
57 LIBXSMM_HASH_U32(FN32, SEED, begin, endb); \
58 LIBXSMM_HASH_U16(FN16, SEED, begin, endb); \
59 return begin == endb ? (SEED) : FN8(SEED, begin); \
60 }
61
62 #if defined(LIBXSMM_HASH_ALIGNMENT) && 8 < (LIBXSMM_HASH_ALIGNMENT)
63 # define LIBXSMM_HASH(FN64, FN32, FN16, FN8, SEED, DATA, SIZE) { \
64 const uint8_t *begin = (const uint8_t*)(DATA); \
65 const uint8_t *const endb = begin + (SIZE); \
66 const uint8_t *const enda = LIBXSMM_ALIGN(begin, LIBXSMM_HASH_ALIGNMENT); \
67 if ((SIZE) > (size_t)(endb - enda)) { \
68 LIBXSMM_HASH_U64(FN64, SEED, begin, enda); \
69 LIBXSMM_HASH_U32(FN32, SEED, begin, enda); \
70 LIBXSMM_HASH_U16(FN16, SEED, begin, enda); \
71 LIBXSMM_HASH_U8(FN8, SEED, begin, enda); \
72 } \
73 LIBXSMM_ASSUME_ALIGNED(begin, LIBXSMM_HASH_ALIGNMENT); \
74 LIBXSMM_HASH_U64(FN64, SEED, begin, endb); \
75 LIBXSMM_HASH_U32(FN32, SEED, begin, endb); \
76 LIBXSMM_HASH_U16(FN16, SEED, begin, endb); \
77 return begin == endb ? (SEED) : FN8(SEED, begin); \
78 }
79 #elif defined(LIBXSMM_HASH_ALIGNMENT) && 1 < (LIBXSMM_HASH_ALIGNMENT)
80 # define LIBXSMM_HASH(FN64, FN32, FN16, FN8, SEED, DATA, SIZE) { \
81 const uint8_t *begin = (const uint8_t*)(DATA); \
82 const uint8_t *const endb = begin + (SIZE); \
83 const uint8_t *const enda = LIBXSMM_ALIGN(begin, LIBXSMM_HASH_ALIGNMENT); \
84 if ((SIZE) > (size_t)(endb - enda)) { \
85 LIBXSMM_HASH_U32(FN32, SEED, begin, enda); \
86 LIBXSMM_HASH_U16(FN16, SEED, begin, enda); \
87 LIBXSMM_HASH_U8(FN8, SEED, begin, enda); \
88 } \
89 LIBXSMM_ASSUME_ALIGNED(begin, LIBXSMM_HASH_ALIGNMENT); \
90 LIBXSMM_HASH_U64(FN64, SEED, begin, endb); \
91 LIBXSMM_HASH_U32(FN32, SEED, begin, endb); \
92 LIBXSMM_HASH_U16(FN16, SEED, begin, endb); \
93 return begin == endb ? (SEED) : FN8(SEED, begin); \
94 }
95 #else
96 # define LIBXSMM_HASH LIBXSMM_HASH_UNALIGNED
97 #endif
98
99 typedef uint32_t internal_crc32_entry_type[256];
100 LIBXSMM_APIVAR_DEFINE(const internal_crc32_entry_type* internal_crc32_table);
101 LIBXSMM_APIVAR_DEFINE(libxsmm_hash_function internal_hash_u32_function);
102 LIBXSMM_APIVAR_DEFINE(libxsmm_hash_function internal_hash_u64_function);
103 LIBXSMM_APIVAR_DEFINE(libxsmm_hash_function internal_hash_u128_function);
104 LIBXSMM_APIVAR_DEFINE(libxsmm_hash_function internal_hash_u256_function);
105 LIBXSMM_APIVAR_DEFINE(libxsmm_hash_function internal_hash_u384_function);
106 LIBXSMM_APIVAR_DEFINE(libxsmm_hash_function internal_hash_u512_function);
107 LIBXSMM_APIVAR_DEFINE(libxsmm_hash_function internal_hash_function);
108
109
internal_crc32_u8(unsigned int seed,const void * value)110 LIBXSMM_API_INLINE unsigned int internal_crc32_u8(unsigned int seed, const void* value)
111 {
112 const uint8_t *const pu8 = (const uint8_t*)value;
113 LIBXSMM_ASSERT(NULL != pu8 && NULL != internal_crc32_table);
114 return internal_crc32_table[0][(seed^(*pu8)) & 0xFF] ^ (seed >> 8);
115 }
116
117
internal_crc32_u16(unsigned int seed,const void * value)118 LIBXSMM_API_INLINE unsigned int internal_crc32_u16(unsigned int seed, const void* value)
119 {
120 const uint8_t *const pu8 = (const uint8_t*)value;
121 LIBXSMM_ASSERT(NULL != pu8);
122 seed = internal_crc32_u8(seed, pu8 + 0);
123 seed = internal_crc32_u8(seed, pu8 + 1);
124 return seed;
125 }
126
127
128 LIBXSMM_API_INTERN unsigned int internal_crc32_u32(unsigned int seed, const void* value, ...);
internal_crc32_u32(unsigned int seed,const void * value,...)129 LIBXSMM_API_INTERN unsigned int internal_crc32_u32(unsigned int seed, const void* value, ...)
130 {
131 const uint32_t *const pu32 = (const uint32_t*)value;
132 uint32_t c0, c1, c2, c3, s;
133 LIBXSMM_ASSERT(NULL != pu32 && NULL != internal_crc32_table);
134 s = seed ^ (*pu32);
135 c0 = internal_crc32_table[0][(s >> 24) & 0xFF];
136 c1 = internal_crc32_table[1][(s >> 16) & 0xFF];
137 c2 = internal_crc32_table[2][(s >> 8) & 0xFF];
138 c3 = internal_crc32_table[3][(s & 0xFF)];
139 return (c0 ^ c1) ^ (c2 ^ c3);
140 }
141
142
143 LIBXSMM_API_INTERN unsigned int internal_crc32_u32_sse4(unsigned int seed, const void* value, ...);
LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)144 LIBXSMM_API_INTERN LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)
145 unsigned int internal_crc32_u32_sse4(unsigned int seed, const void* value, ...)
146 {
147 #if defined(LIBXSMM_INTRINSICS_SSE4)
148 return LIBXSMM_HASH_CRC32_U32(seed, value);
149 #else
150 return internal_crc32_u32(seed, value);
151 #endif
152 }
153
154
155 LIBXSMM_API_INTERN unsigned int internal_crc32_u64(unsigned int seed, const void* value, ...);
internal_crc32_u64(unsigned int seed,const void * value,...)156 LIBXSMM_API_INTERN unsigned int internal_crc32_u64(unsigned int seed, const void* value, ...)
157 {
158 const uint32_t *const pu32 = (const uint32_t*)value;
159 LIBXSMM_ASSERT(NULL != pu32);
160 seed = internal_crc32_u32(seed, pu32 + 0);
161 seed = internal_crc32_u32(seed, pu32 + 1);
162 return seed;
163 }
164
165
166 LIBXSMM_API_INTERN unsigned int internal_crc32_u64_sse4(unsigned int seed, const void* value, ...);
LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)167 LIBXSMM_API_INTERN LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)
168 unsigned int internal_crc32_u64_sse4(unsigned int seed, const void* value, ...)
169 {
170 #if defined(LIBXSMM_INTRINSICS_SSE4)
171 return (unsigned int)LIBXSMM_HASH_CRC32_U64(seed, value);
172 #else
173 return internal_crc32_u64(seed, value);
174 #endif
175 }
176
177
178 LIBXSMM_API_INTERN unsigned int internal_crc32_u128(unsigned int seed, const void* value, ...);
internal_crc32_u128(unsigned int seed,const void * value,...)179 LIBXSMM_API_INTERN unsigned int internal_crc32_u128(unsigned int seed, const void* value, ...)
180 {
181 const uint64_t *const pu64 = (const uint64_t*)value;
182 LIBXSMM_ASSERT(NULL != pu64);
183 seed = internal_crc32_u64(seed, pu64 + 0);
184 seed = internal_crc32_u64(seed, pu64 + 1);
185 return seed;
186 }
187
188
189 LIBXSMM_API_INTERN unsigned int internal_crc32_u128_sse4(unsigned int seed, const void* value, ...);
LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)190 LIBXSMM_API_INTERN LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)
191 unsigned int internal_crc32_u128_sse4(unsigned int seed, const void* value, ...)
192 {
193 #if defined(LIBXSMM_INTRINSICS_SSE4)
194 const uint64_t *const pu64 = (const uint64_t*)value;
195 LIBXSMM_ASSERT(NULL != pu64);
196 seed = (unsigned int)LIBXSMM_HASH_CRC32_U64(seed, pu64 + 0);
197 seed = (unsigned int)LIBXSMM_HASH_CRC32_U64(seed, pu64 + 1);
198 #else
199 seed = internal_crc32_u128(seed, value);
200 #endif
201 return seed;
202 }
203
204
205 LIBXSMM_API_INTERN unsigned int internal_crc32_u256(unsigned int seed, const void* value, ...);
internal_crc32_u256(unsigned int seed,const void * value,...)206 LIBXSMM_API_INTERN unsigned int internal_crc32_u256(unsigned int seed, const void* value, ...)
207 {
208 const uint8_t *const pu8 = (const uint8_t*)value;
209 LIBXSMM_ASSERT(NULL != pu8);
210 seed = internal_crc32_u128(seed, pu8 + 0x00);
211 seed = internal_crc32_u128(seed, pu8 + 0x10);
212 return seed;
213 }
214
215
216 LIBXSMM_API_INTERN unsigned int internal_crc32_u256_sse4(unsigned int seed, const void* value, ...);
LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)217 LIBXSMM_API_INTERN LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)
218 unsigned int internal_crc32_u256_sse4(unsigned int seed, const void* value, ...)
219 {
220 #if defined(LIBXSMM_INTRINSICS_SSE4)
221 const uint8_t *const pu8 = (const uint8_t*)value;
222 LIBXSMM_ASSERT(NULL != pu8);
223 seed = internal_crc32_u128_sse4(seed, pu8 + 0x00);
224 seed = internal_crc32_u128_sse4(seed, pu8 + 0x10);
225 return seed;
226 #else
227 return internal_crc32_u256(seed, value);
228 #endif
229 }
230
231
232 LIBXSMM_API_INTERN unsigned int internal_crc32_u384(unsigned int seed, const void* value, ...);
internal_crc32_u384(unsigned int seed,const void * value,...)233 LIBXSMM_API_INTERN unsigned int internal_crc32_u384(unsigned int seed, const void* value, ...)
234 {
235 const uint8_t *const pu8 = (const uint8_t*)value;
236 LIBXSMM_ASSERT(NULL != pu8);
237 seed = internal_crc32_u256(seed, pu8 + 0x00);
238 seed = internal_crc32_u128(seed, pu8 + 0x20);
239 return seed;
240 }
241
242
243 LIBXSMM_API_INTERN unsigned int internal_crc32_u384_sse4(unsigned int seed, const void* value, ...);
LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)244 LIBXSMM_API_INTERN LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)
245 unsigned int internal_crc32_u384_sse4(unsigned int seed, const void* value, ...)
246 {
247 #if defined(LIBXSMM_INTRINSICS_SSE4)
248 const uint8_t *const pu8 = (const uint8_t*)value;
249 LIBXSMM_ASSERT(NULL != pu8);
250 seed = internal_crc32_u256_sse4(seed, pu8 + 0x00);
251 seed = internal_crc32_u128_sse4(seed, pu8 + 0x20);
252 return seed;
253 #else
254 return internal_crc32_u384(seed, value);
255 #endif
256 }
257
258
259 LIBXSMM_API_INTERN unsigned int internal_crc32_u512(unsigned int seed, const void* value, ...);
internal_crc32_u512(unsigned int seed,const void * value,...)260 LIBXSMM_API_INTERN unsigned int internal_crc32_u512(unsigned int seed, const void* value, ...)
261 {
262 const uint8_t *const pu8 = (const uint8_t*)value;
263 LIBXSMM_ASSERT(NULL != pu8);
264 seed = internal_crc32_u256(seed, pu8 + 0x00);
265 seed = internal_crc32_u256(seed, pu8 + 0x20);
266 return seed;
267 }
268
269
270 LIBXSMM_API_INTERN unsigned int internal_crc32_u512_sse4(unsigned int seed, const void* value, ...);
LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)271 LIBXSMM_API_INTERN LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)
272 unsigned int internal_crc32_u512_sse4(unsigned int seed, const void* value, ...)
273 {
274 #if defined(LIBXSMM_INTRINSICS_SSE4)
275 const uint8_t *const pu8 = (const uint8_t*)value;
276 LIBXSMM_ASSERT(NULL != pu8);
277 seed = internal_crc32_u256_sse4(seed, pu8 + 0x00);
278 seed = internal_crc32_u256_sse4(seed, pu8 + 0x20);
279 return seed;
280 #else
281 return internal_crc32_u512(seed, value);
282 #endif
283 }
284
285
286 LIBXSMM_API_INTERN unsigned int internal_crc32(unsigned int seed, const void* data, size_t size);
internal_crc32(unsigned int seed,const void * data,size_t size)287 LIBXSMM_API_INTERN unsigned int internal_crc32(unsigned int seed, const void* data, size_t size)
288 {
289 LIBXSMM_ASSERT(NULL != data || 0 == size);
290 LIBXSMM_HASH(internal_crc32_u64, internal_crc32_u32, internal_crc32_u16, internal_crc32_u8, seed, data, size);
291 }
292
293
294 LIBXSMM_API_INTERN unsigned int internal_crc32_sse4(unsigned int seed, const void* data, size_t size);
LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)295 LIBXSMM_API_INTERN LIBXSMM_INTRINSICS(LIBXSMM_X86_SSE4)
296 unsigned int internal_crc32_sse4(unsigned int seed, const void* data, size_t size)
297 {
298 LIBXSMM_ASSERT(NULL != data || 0 == size);
299 #if defined(LIBXSMM_INTRINSICS_SSE4)
300 LIBXSMM_HASH(LIBXSMM_HASH_CRC32_U64, LIBXSMM_HASH_CRC32_U32, LIBXSMM_HASH_CRC32_U16, LIBXSMM_HASH_CRC32_U8, seed, data, size);
301 #else
302 return internal_crc32(seed, data, size);
303 #endif
304 }
305
306
libxsmm_hash_init(int target_arch)307 LIBXSMM_API_INTERN void libxsmm_hash_init(int target_arch)
308 {
309 /* table-based implementation taken from http://dpdk.org/. */
310 static const LIBXSMM_RETARGETABLE internal_crc32_entry_type crc32_table[] = {
311 { /*table0*/
312 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
313 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B, 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
314 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B, 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
315 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54, 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
316 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A, 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
317 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5, 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
318 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45, 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
319 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A, 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
320 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48, 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
321 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687, 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
322 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927, 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
323 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8, 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
324 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096, 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
325 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859, 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
326 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9, 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
327 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36, 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
328 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C, 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
329 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043, 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
330 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3, 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
331 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C, 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
332 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652, 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
333 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D, 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
334 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D, 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
335 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2, 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
336 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530, 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
337 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF, 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
338 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F, 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
339 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90, 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
340 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE, 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
341 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321, 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
342 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81, 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
343 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
344 },
345 { /*table1*/
346 0x00000000, 0x13A29877, 0x274530EE, 0x34E7A899, 0x4E8A61DC, 0x5D28F9AB, 0x69CF5132, 0x7A6DC945,
347 0x9D14C3B8, 0x8EB65BCF, 0xBA51F356, 0xA9F36B21, 0xD39EA264, 0xC03C3A13, 0xF4DB928A, 0xE7790AFD,
348 0x3FC5F181, 0x2C6769F6, 0x1880C16F, 0x0B225918, 0x714F905D, 0x62ED082A, 0x560AA0B3, 0x45A838C4,
349 0xA2D13239, 0xB173AA4E, 0x859402D7, 0x96369AA0, 0xEC5B53E5, 0xFFF9CB92, 0xCB1E630B, 0xD8BCFB7C,
350 0x7F8BE302, 0x6C297B75, 0x58CED3EC, 0x4B6C4B9B, 0x310182DE, 0x22A31AA9, 0x1644B230, 0x05E62A47,
351 0xE29F20BA, 0xF13DB8CD, 0xC5DA1054, 0xD6788823, 0xAC154166, 0xBFB7D911, 0x8B507188, 0x98F2E9FF,
352 0x404E1283, 0x53EC8AF4, 0x670B226D, 0x74A9BA1A, 0x0EC4735F, 0x1D66EB28, 0x298143B1, 0x3A23DBC6,
353 0xDD5AD13B, 0xCEF8494C, 0xFA1FE1D5, 0xE9BD79A2, 0x93D0B0E7, 0x80722890, 0xB4958009, 0xA737187E,
354 0xFF17C604, 0xECB55E73, 0xD852F6EA, 0xCBF06E9D, 0xB19DA7D8, 0xA23F3FAF, 0x96D89736, 0x857A0F41,
355 0x620305BC, 0x71A19DCB, 0x45463552, 0x56E4AD25, 0x2C896460, 0x3F2BFC17, 0x0BCC548E, 0x186ECCF9,
356 0xC0D23785, 0xD370AFF2, 0xE797076B, 0xF4359F1C, 0x8E585659, 0x9DFACE2E, 0xA91D66B7, 0xBABFFEC0,
357 0x5DC6F43D, 0x4E646C4A, 0x7A83C4D3, 0x69215CA4, 0x134C95E1, 0x00EE0D96, 0x3409A50F, 0x27AB3D78,
358 0x809C2506, 0x933EBD71, 0xA7D915E8, 0xB47B8D9F, 0xCE1644DA, 0xDDB4DCAD, 0xE9537434, 0xFAF1EC43,
359 0x1D88E6BE, 0x0E2A7EC9, 0x3ACDD650, 0x296F4E27, 0x53028762, 0x40A01F15, 0x7447B78C, 0x67E52FFB,
360 0xBF59D487, 0xACFB4CF0, 0x981CE469, 0x8BBE7C1E, 0xF1D3B55B, 0xE2712D2C, 0xD69685B5, 0xC5341DC2,
361 0x224D173F, 0x31EF8F48, 0x050827D1, 0x16AABFA6, 0x6CC776E3, 0x7F65EE94, 0x4B82460D, 0x5820DE7A,
362 0xFBC3FAF9, 0xE861628E, 0xDC86CA17, 0xCF245260, 0xB5499B25, 0xA6EB0352, 0x920CABCB, 0x81AE33BC,
363 0x66D73941, 0x7575A136, 0x419209AF, 0x523091D8, 0x285D589D, 0x3BFFC0EA, 0x0F186873, 0x1CBAF004,
364 0xC4060B78, 0xD7A4930F, 0xE3433B96, 0xF0E1A3E1, 0x8A8C6AA4, 0x992EF2D3, 0xADC95A4A, 0xBE6BC23D,
365 0x5912C8C0, 0x4AB050B7, 0x7E57F82E, 0x6DF56059, 0x1798A91C, 0x043A316B, 0x30DD99F2, 0x237F0185,
366 0x844819FB, 0x97EA818C, 0xA30D2915, 0xB0AFB162, 0xCAC27827, 0xD960E050, 0xED8748C9, 0xFE25D0BE,
367 0x195CDA43, 0x0AFE4234, 0x3E19EAAD, 0x2DBB72DA, 0x57D6BB9F, 0x447423E8, 0x70938B71, 0x63311306,
368 0xBB8DE87A, 0xA82F700D, 0x9CC8D894, 0x8F6A40E3, 0xF50789A6, 0xE6A511D1, 0xD242B948, 0xC1E0213F,
369 0x26992BC2, 0x353BB3B5, 0x01DC1B2C, 0x127E835B, 0x68134A1E, 0x7BB1D269, 0x4F567AF0, 0x5CF4E287,
370 0x04D43CFD, 0x1776A48A, 0x23910C13, 0x30339464, 0x4A5E5D21, 0x59FCC556, 0x6D1B6DCF, 0x7EB9F5B8,
371 0x99C0FF45, 0x8A626732, 0xBE85CFAB, 0xAD2757DC, 0xD74A9E99, 0xC4E806EE, 0xF00FAE77, 0xE3AD3600,
372 0x3B11CD7C, 0x28B3550B, 0x1C54FD92, 0x0FF665E5, 0x759BACA0, 0x663934D7, 0x52DE9C4E, 0x417C0439,
373 0xA6050EC4, 0xB5A796B3, 0x81403E2A, 0x92E2A65D, 0xE88F6F18, 0xFB2DF76F, 0xCFCA5FF6, 0xDC68C781,
374 0x7B5FDFFF, 0x68FD4788, 0x5C1AEF11, 0x4FB87766, 0x35D5BE23, 0x26772654, 0x12908ECD, 0x013216BA,
375 0xE64B1C47, 0xF5E98430, 0xC10E2CA9, 0xD2ACB4DE, 0xA8C17D9B, 0xBB63E5EC, 0x8F844D75, 0x9C26D502,
376 0x449A2E7E, 0x5738B609, 0x63DF1E90, 0x707D86E7, 0x0A104FA2, 0x19B2D7D5, 0x2D557F4C, 0x3EF7E73B,
377 0xD98EEDC6, 0xCA2C75B1, 0xFECBDD28, 0xED69455F, 0x97048C1A, 0x84A6146D, 0xB041BCF4, 0xA3E32483
378 },
379 { /*table2*/
380 0x00000000, 0xA541927E, 0x4F6F520D, 0xEA2EC073, 0x9EDEA41A, 0x3B9F3664, 0xD1B1F617, 0x74F06469,
381 0x38513EC5, 0x9D10ACBB, 0x773E6CC8, 0xD27FFEB6, 0xA68F9ADF, 0x03CE08A1, 0xE9E0C8D2, 0x4CA15AAC,
382 0x70A27D8A, 0xD5E3EFF4, 0x3FCD2F87, 0x9A8CBDF9, 0xEE7CD990, 0x4B3D4BEE, 0xA1138B9D, 0x045219E3,
383 0x48F3434F, 0xEDB2D131, 0x079C1142, 0xA2DD833C, 0xD62DE755, 0x736C752B, 0x9942B558, 0x3C032726,
384 0xE144FB14, 0x4405696A, 0xAE2BA919, 0x0B6A3B67, 0x7F9A5F0E, 0xDADBCD70, 0x30F50D03, 0x95B49F7D,
385 0xD915C5D1, 0x7C5457AF, 0x967A97DC, 0x333B05A2, 0x47CB61CB, 0xE28AF3B5, 0x08A433C6, 0xADE5A1B8,
386 0x91E6869E, 0x34A714E0, 0xDE89D493, 0x7BC846ED, 0x0F382284, 0xAA79B0FA, 0x40577089, 0xE516E2F7,
387 0xA9B7B85B, 0x0CF62A25, 0xE6D8EA56, 0x43997828, 0x37691C41, 0x92288E3F, 0x78064E4C, 0xDD47DC32,
388 0xC76580D9, 0x622412A7, 0x880AD2D4, 0x2D4B40AA, 0x59BB24C3, 0xFCFAB6BD, 0x16D476CE, 0xB395E4B0,
389 0xFF34BE1C, 0x5A752C62, 0xB05BEC11, 0x151A7E6F, 0x61EA1A06, 0xC4AB8878, 0x2E85480B, 0x8BC4DA75,
390 0xB7C7FD53, 0x12866F2D, 0xF8A8AF5E, 0x5DE93D20, 0x29195949, 0x8C58CB37, 0x66760B44, 0xC337993A,
391 0x8F96C396, 0x2AD751E8, 0xC0F9919B, 0x65B803E5, 0x1148678C, 0xB409F5F2, 0x5E273581, 0xFB66A7FF,
392 0x26217BCD, 0x8360E9B3, 0x694E29C0, 0xCC0FBBBE, 0xB8FFDFD7, 0x1DBE4DA9, 0xF7908DDA, 0x52D11FA4,
393 0x1E704508, 0xBB31D776, 0x511F1705, 0xF45E857B, 0x80AEE112, 0x25EF736C, 0xCFC1B31F, 0x6A802161,
394 0x56830647, 0xF3C29439, 0x19EC544A, 0xBCADC634, 0xC85DA25D, 0x6D1C3023, 0x8732F050, 0x2273622E,
395 0x6ED23882, 0xCB93AAFC, 0x21BD6A8F, 0x84FCF8F1, 0xF00C9C98, 0x554D0EE6, 0xBF63CE95, 0x1A225CEB,
396 0x8B277743, 0x2E66E53D, 0xC448254E, 0x6109B730, 0x15F9D359, 0xB0B84127, 0x5A968154, 0xFFD7132A,
397 0xB3764986, 0x1637DBF8, 0xFC191B8B, 0x595889F5, 0x2DA8ED9C, 0x88E97FE2, 0x62C7BF91, 0xC7862DEF,
398 0xFB850AC9, 0x5EC498B7, 0xB4EA58C4, 0x11ABCABA, 0x655BAED3, 0xC01A3CAD, 0x2A34FCDE, 0x8F756EA0,
399 0xC3D4340C, 0x6695A672, 0x8CBB6601, 0x29FAF47F, 0x5D0A9016, 0xF84B0268, 0x1265C21B, 0xB7245065,
400 0x6A638C57, 0xCF221E29, 0x250CDE5A, 0x804D4C24, 0xF4BD284D, 0x51FCBA33, 0xBBD27A40, 0x1E93E83E,
401 0x5232B292, 0xF77320EC, 0x1D5DE09F, 0xB81C72E1, 0xCCEC1688, 0x69AD84F6, 0x83834485, 0x26C2D6FB,
402 0x1AC1F1DD, 0xBF8063A3, 0x55AEA3D0, 0xF0EF31AE, 0x841F55C7, 0x215EC7B9, 0xCB7007CA, 0x6E3195B4,
403 0x2290CF18, 0x87D15D66, 0x6DFF9D15, 0xC8BE0F6B, 0xBC4E6B02, 0x190FF97C, 0xF321390F, 0x5660AB71,
404 0x4C42F79A, 0xE90365E4, 0x032DA597, 0xA66C37E9, 0xD29C5380, 0x77DDC1FE, 0x9DF3018D, 0x38B293F3,
405 0x7413C95F, 0xD1525B21, 0x3B7C9B52, 0x9E3D092C, 0xEACD6D45, 0x4F8CFF3B, 0xA5A23F48, 0x00E3AD36,
406 0x3CE08A10, 0x99A1186E, 0x738FD81D, 0xD6CE4A63, 0xA23E2E0A, 0x077FBC74, 0xED517C07, 0x4810EE79,
407 0x04B1B4D5, 0xA1F026AB, 0x4BDEE6D8, 0xEE9F74A6, 0x9A6F10CF, 0x3F2E82B1, 0xD50042C2, 0x7041D0BC,
408 0xAD060C8E, 0x08479EF0, 0xE2695E83, 0x4728CCFD, 0x33D8A894, 0x96993AEA, 0x7CB7FA99, 0xD9F668E7,
409 0x9557324B, 0x3016A035, 0xDA386046, 0x7F79F238, 0x0B899651, 0xAEC8042F, 0x44E6C45C, 0xE1A75622,
410 0xDDA47104, 0x78E5E37A, 0x92CB2309, 0x378AB177, 0x437AD51E, 0xE63B4760, 0x0C158713, 0xA954156D,
411 0xE5F54FC1, 0x40B4DDBF, 0xAA9A1DCC, 0x0FDB8FB2, 0x7B2BEBDB, 0xDE6A79A5, 0x3444B9D6, 0x91052BA8
412 },
413 { /*table3*/
414 0x00000000, 0xDD45AAB8, 0xBF672381, 0x62228939, 0x7B2231F3, 0xA6679B4B, 0xC4451272, 0x1900B8CA,
415 0xF64463E6, 0x2B01C95E, 0x49234067, 0x9466EADF, 0x8D665215, 0x5023F8AD, 0x32017194, 0xEF44DB2C,
416 0xE964B13D, 0x34211B85, 0x560392BC, 0x8B463804, 0x924680CE, 0x4F032A76, 0x2D21A34F, 0xF06409F7,
417 0x1F20D2DB, 0xC2657863, 0xA047F15A, 0x7D025BE2, 0x6402E328, 0xB9474990, 0xDB65C0A9, 0x06206A11,
418 0xD725148B, 0x0A60BE33, 0x6842370A, 0xB5079DB2, 0xAC072578, 0x71428FC0, 0x136006F9, 0xCE25AC41,
419 0x2161776D, 0xFC24DDD5, 0x9E0654EC, 0x4343FE54, 0x5A43469E, 0x8706EC26, 0xE524651F, 0x3861CFA7,
420 0x3E41A5B6, 0xE3040F0E, 0x81268637, 0x5C632C8F, 0x45639445, 0x98263EFD, 0xFA04B7C4, 0x27411D7C,
421 0xC805C650, 0x15406CE8, 0x7762E5D1, 0xAA274F69, 0xB327F7A3, 0x6E625D1B, 0x0C40D422, 0xD1057E9A,
422 0xABA65FE7, 0x76E3F55F, 0x14C17C66, 0xC984D6DE, 0xD0846E14, 0x0DC1C4AC, 0x6FE34D95, 0xB2A6E72D,
423 0x5DE23C01, 0x80A796B9, 0xE2851F80, 0x3FC0B538, 0x26C00DF2, 0xFB85A74A, 0x99A72E73, 0x44E284CB,
424 0x42C2EEDA, 0x9F874462, 0xFDA5CD5B, 0x20E067E3, 0x39E0DF29, 0xE4A57591, 0x8687FCA8, 0x5BC25610,
425 0xB4868D3C, 0x69C32784, 0x0BE1AEBD, 0xD6A40405, 0xCFA4BCCF, 0x12E11677, 0x70C39F4E, 0xAD8635F6,
426 0x7C834B6C, 0xA1C6E1D4, 0xC3E468ED, 0x1EA1C255, 0x07A17A9F, 0xDAE4D027, 0xB8C6591E, 0x6583F3A6,
427 0x8AC7288A, 0x57828232, 0x35A00B0B, 0xE8E5A1B3, 0xF1E51979, 0x2CA0B3C1, 0x4E823AF8, 0x93C79040,
428 0x95E7FA51, 0x48A250E9, 0x2A80D9D0, 0xF7C57368, 0xEEC5CBA2, 0x3380611A, 0x51A2E823, 0x8CE7429B,
429 0x63A399B7, 0xBEE6330F, 0xDCC4BA36, 0x0181108E, 0x1881A844, 0xC5C402FC, 0xA7E68BC5, 0x7AA3217D,
430 0x52A0C93F, 0x8FE56387, 0xEDC7EABE, 0x30824006, 0x2982F8CC, 0xF4C75274, 0x96E5DB4D, 0x4BA071F5,
431 0xA4E4AAD9, 0x79A10061, 0x1B838958, 0xC6C623E0, 0xDFC69B2A, 0x02833192, 0x60A1B8AB, 0xBDE41213,
432 0xBBC47802, 0x6681D2BA, 0x04A35B83, 0xD9E6F13B, 0xC0E649F1, 0x1DA3E349, 0x7F816A70, 0xA2C4C0C8,
433 0x4D801BE4, 0x90C5B15C, 0xF2E73865, 0x2FA292DD, 0x36A22A17, 0xEBE780AF, 0x89C50996, 0x5480A32E,
434 0x8585DDB4, 0x58C0770C, 0x3AE2FE35, 0xE7A7548D, 0xFEA7EC47, 0x23E246FF, 0x41C0CFC6, 0x9C85657E,
435 0x73C1BE52, 0xAE8414EA, 0xCCA69DD3, 0x11E3376B, 0x08E38FA1, 0xD5A62519, 0xB784AC20, 0x6AC10698,
436 0x6CE16C89, 0xB1A4C631, 0xD3864F08, 0x0EC3E5B0, 0x17C35D7A, 0xCA86F7C2, 0xA8A47EFB, 0x75E1D443,
437 0x9AA50F6F, 0x47E0A5D7, 0x25C22CEE, 0xF8878656, 0xE1873E9C, 0x3CC29424, 0x5EE01D1D, 0x83A5B7A5,
438 0xF90696D8, 0x24433C60, 0x4661B559, 0x9B241FE1, 0x8224A72B, 0x5F610D93, 0x3D4384AA, 0xE0062E12,
439 0x0F42F53E, 0xD2075F86, 0xB025D6BF, 0x6D607C07, 0x7460C4CD, 0xA9256E75, 0xCB07E74C, 0x16424DF4,
440 0x106227E5, 0xCD278D5D, 0xAF050464, 0x7240AEDC, 0x6B401616, 0xB605BCAE, 0xD4273597, 0x09629F2F,
441 0xE6264403, 0x3B63EEBB, 0x59416782, 0x8404CD3A, 0x9D0475F0, 0x4041DF48, 0x22635671, 0xFF26FCC9,
442 0x2E238253, 0xF36628EB, 0x9144A1D2, 0x4C010B6A, 0x5501B3A0, 0x88441918, 0xEA669021, 0x37233A99,
443 0xD867E1B5, 0x05224B0D, 0x6700C234, 0xBA45688C, 0xA345D046, 0x7E007AFE, 0x1C22F3C7, 0xC167597F,
444 0xC747336E, 0x1A0299D6, 0x782010EF, 0xA565BA57, 0xBC65029D, 0x6120A825, 0x0302211C, 0xDE478BA4,
445 0x31035088, 0xEC46FA30, 0x8E647309, 0x5321D9B1, 0x4A21617B, 0x9764CBC3, 0xF54642FA, 0x2803E842
446 }
447 };
448 internal_crc32_table = crc32_table;
449 #if (LIBXSMM_X86_SSE4 <= LIBXSMM_STATIC_TARGET_ARCH)
450 LIBXSMM_UNUSED(target_arch);
451 #else
452 if (LIBXSMM_X86_SSE4 <= target_arch)
453 #endif
454 {
455 internal_hash_u32_function = internal_crc32_u32_sse4;
456 internal_hash_u64_function = internal_crc32_u64_sse4;
457 internal_hash_u128_function = internal_crc32_u128_sse4;
458 internal_hash_u256_function = internal_crc32_u256_sse4;
459 internal_hash_u384_function = internal_crc32_u384_sse4;
460 internal_hash_u512_function = internal_crc32_u512_sse4;
461 internal_hash_function = (libxsmm_hash_function)internal_crc32_sse4;
462 }
463 #if (LIBXSMM_X86_SSE4 > LIBXSMM_STATIC_TARGET_ARCH)
464 else {
465 # if !defined(LIBXSMM_INTRINSICS_SSE4)
466 static int error_once = 0;
467 if (0 == error_once && 0 != libxsmm_verbosity) { /* library code is expected to be mute */
468 fprintf(stderr, "LIBXSMM WARNING: unable to access CRC32 instructions due to the compiler used!\n");
469 error_once = 1; /* no need for atomics */
470 }
471 # endif
472 internal_hash_u32_function = internal_crc32_u32;
473 internal_hash_u64_function = internal_crc32_u64;
474 internal_hash_u128_function = internal_crc32_u128;
475 internal_hash_u256_function = internal_crc32_u256;
476 internal_hash_u384_function = internal_crc32_u384;
477 internal_hash_u512_function = internal_crc32_u512;
478 internal_hash_function = (libxsmm_hash_function)internal_crc32;
479 }
480 #endif
481 LIBXSMM_ASSERT(NULL != internal_hash_u32_function);
482 LIBXSMM_ASSERT(NULL != internal_hash_u64_function);
483 LIBXSMM_ASSERT(NULL != internal_hash_u128_function);
484 LIBXSMM_ASSERT(NULL != internal_hash_u256_function);
485 LIBXSMM_ASSERT(NULL != internal_hash_u384_function);
486 LIBXSMM_ASSERT(NULL != internal_hash_u512_function);
487 LIBXSMM_ASSERT(NULL != internal_hash_function);
488 }
489
490
libxsmm_hash_finalize(void)491 LIBXSMM_API_INTERN void libxsmm_hash_finalize(void)
492 {
493 #if !defined(NDEBUG)
494 internal_crc32_table = NULL;
495 internal_hash_u32_function = NULL;
496 internal_hash_u64_function = NULL;
497 internal_hash_u128_function = NULL;
498 internal_hash_u256_function = NULL;
499 internal_hash_u384_function = NULL;
500 internal_hash_u512_function = NULL;
501 internal_hash_function = NULL;
502 #endif
503 }
504
505
libxsmm_crc32_u32(unsigned int seed,const void * value,...)506 LIBXSMM_API_INTERN unsigned int libxsmm_crc32_u32(unsigned int seed, const void* value, ...)
507 {
508 #if (LIBXSMM_X86_SSE4 <= LIBXSMM_STATIC_TARGET_ARCH)
509 return LIBXSMM_HASH_CRC32_U32(seed, value);
510 #elif (LIBXSMM_X86_SSE4 > LIBXSMM_MAX_STATIC_TARGET_ARCH)
511 return internal_crc32_u32(seed, value);
512 #else /* pointer based function call */
513 LIBXSMM_ASSERT(NULL != internal_hash_u32_function);
514 return internal_hash_u32_function(seed, value);
515 #endif
516 }
517
518
libxsmm_crc32_u64(unsigned int seed,const void * value,...)519 LIBXSMM_API_INTERN unsigned int libxsmm_crc32_u64(unsigned int seed, const void* value, ...)
520 {
521 #if (LIBXSMM_X86_SSE4 <= LIBXSMM_STATIC_TARGET_ARCH)
522 return (unsigned int)LIBXSMM_HASH_CRC32_U64(seed, value);
523 #elif (LIBXSMM_X86_SSE4 > LIBXSMM_MAX_STATIC_TARGET_ARCH)
524 return internal_crc32_u64(seed, value);
525 #else /* pointer based function call */
526 LIBXSMM_ASSERT(NULL != internal_hash_u64_function);
527 return internal_hash_u64_function(seed, value);
528 #endif
529 }
530
531
libxsmm_crc32_u128(unsigned int seed,const void * value,...)532 LIBXSMM_API_INTERN unsigned int libxsmm_crc32_u128(unsigned int seed, const void* value, ...)
533 {
534 #if (LIBXSMM_X86_SSE4 <= LIBXSMM_STATIC_TARGET_ARCH)
535 return internal_crc32_u128_sse4(seed, value);
536 #elif (LIBXSMM_X86_SSE4 > LIBXSMM_MAX_STATIC_TARGET_ARCH)
537 return internal_crc32_u128(seed, value);
538 #else /* pointer based function call */
539 LIBXSMM_ASSERT(NULL != internal_hash_u128_function);
540 return internal_hash_u128_function(seed, value);
541 #endif
542 }
543
544
libxsmm_crc32_u256(unsigned int seed,const void * value,...)545 LIBXSMM_API_INTERN unsigned int libxsmm_crc32_u256(unsigned int seed, const void* value, ...)
546 {
547 #if (LIBXSMM_X86_SSE4 <= LIBXSMM_STATIC_TARGET_ARCH)
548 return internal_crc32_u256_sse4(seed, value);
549 #elif (LIBXSMM_X86_SSE4 > LIBXSMM_MAX_STATIC_TARGET_ARCH)
550 return internal_crc32_u256(seed, value);
551 #else /* pointer based function call */
552 LIBXSMM_ASSERT(NULL != internal_hash_u256_function);
553 return internal_hash_u256_function(seed, value);
554 #endif
555 }
556
557
libxsmm_crc32_u384(unsigned int seed,const void * value,...)558 LIBXSMM_API_INTERN unsigned int libxsmm_crc32_u384(unsigned int seed, const void* value, ...)
559 {
560 #if (LIBXSMM_X86_SSE4 <= LIBXSMM_STATIC_TARGET_ARCH)
561 return internal_crc32_u384_sse4(seed, value);
562 #elif (LIBXSMM_X86_SSE4 > LIBXSMM_MAX_STATIC_TARGET_ARCH)
563 return internal_crc32_u384(seed, value);
564 #else /* pointer based function call */
565 LIBXSMM_ASSERT(NULL != internal_hash_u384_function);
566 return internal_hash_u384_function(seed, value);
567 #endif
568 }
569
570
libxsmm_crc32_u512(unsigned int seed,const void * value,...)571 LIBXSMM_API_INTERN unsigned int libxsmm_crc32_u512(unsigned int seed, const void* value, ...)
572 {
573 #if (LIBXSMM_X86_SSE4 <= LIBXSMM_STATIC_TARGET_ARCH)
574 return internal_crc32_u512_sse4(seed, value);
575 #elif (LIBXSMM_X86_SSE4 > LIBXSMM_MAX_STATIC_TARGET_ARCH)
576 return internal_crc32_u512(seed, value);
577 #else /* pointer based function call */
578 LIBXSMM_ASSERT(NULL != internal_hash_u512_function);
579 return internal_hash_u512_function(seed, value);
580 #endif
581 }
582
583
libxsmm_crc32(unsigned int seed,const void * data,size_t size)584 LIBXSMM_API_INTERN unsigned int libxsmm_crc32(unsigned int seed, const void* data, size_t size)
585 {
586 #if (LIBXSMM_X86_SSE4 <= LIBXSMM_STATIC_TARGET_ARCH)
587 return internal_crc32_sse4(seed, data, size);
588 #elif (LIBXSMM_X86_SSE4 > LIBXSMM_MAX_STATIC_TARGET_ARCH)
589 return internal_crc32(seed, data, size);
590 #else /* pointer based function call */
591 LIBXSMM_ASSERT(NULL != internal_hash_function);
592 return internal_hash_function(seed, data, size);
593 #endif
594 }
595
596