| 489 | } |
| 490 | |
| 491 | inline void Hash64AVX_512_Impl(const char*& data, size_t& n, uint64& h, |
| 492 | const uint64& m, const int& r) { |
| 493 | __m512i m_pack = _mm512_set1_epi64(m); |
| 494 | __m512i k; |
| 495 | __m512i k_tmp; |
| 496 | __m256i k_low; |
| 497 | __m256i k_high; |
| 498 | |
| 499 | while (n >= 64) { |
| 500 | // k packs 32 chars (bytes) |
| 501 | k = _mm512_loadu_si512((const void*)data); |
| 502 | if (!port::kLittleEndian) { |
| 503 | // change from BigEdian to LittleEdian |
| 504 | // swap_int64_256(k); |
| 505 | } |
| 506 | data += 64; |
| 507 | n -= 64; |
| 508 | |
| 509 | k = _mm512_mullo_epi64(k, m_pack); |
| 510 | k_tmp = _mm512_srli_epi64(k, r); |
| 511 | k = _mm512_xor_si512(k, k_tmp); |
| 512 | k = _mm512_mullo_epi64(k, m_pack); |
| 513 | // 1st reduction |
| 514 | k_low = _mm512_extracti64x4_epi64(k, 0); |
| 515 | k_high = _mm512_extracti64x4_epi64(k, 1); |
| 516 | |
| 517 | h ^= _mm256_extract_epi64(k_low, 0); |
| 518 | h *= m; |
| 519 | h ^= _mm256_extract_epi64(k_low, 1); |
| 520 | h *= m; |
| 521 | h ^= _mm256_extract_epi64(k_low, 2); |
| 522 | h *= m; |
| 523 | h ^= _mm256_extract_epi64(k_low, 3); |
| 524 | h *= m; |
| 525 | |
| 526 | h ^= _mm256_extract_epi64(k_high, 0); |
| 527 | h *= m; |
| 528 | h ^= _mm256_extract_epi64(k_high, 1); |
| 529 | h *= m; |
| 530 | h ^= _mm256_extract_epi64(k_high, 2); |
| 531 | h *= m; |
| 532 | h ^= _mm256_extract_epi64(k_high, 3); |
| 533 | h *= m; |
| 534 | } |
| 535 | } |
| 536 | |
| 537 | inline void Hash64AVX_64_Impl(const char*& data, size_t& n, uint64& h, |
| 538 | const uint64& m, const int& r) { |