| 551 | #endif |
| 552 | |
| 553 | uint64 Hash64V3(const char* data, size_t n, uint64 seed) { |
| 554 | #if defined(__AVX512F__) |
| 555 | const uint64 m = 0xc6a4a7935bd1e995; |
| 556 | const int r = 47; |
| 557 | uint64 h = seed ^ (n * m); |
| 558 | // n is number of byte in the char* array |
| 559 | // unrolling y 64 (_mm512i) |
| 560 | Hash64AVX_512_Impl(data, n, h, m, r); |
| 561 | Hash64AVX_256_Impl(data, n, h, m, r); |
| 562 | Hash64AVX_128_Impl(data, n, h, m, r); |
| 563 | Hash64AVX_64_Impl(data, n, h, m, r); |
| 564 | |
| 565 | switch (n) { |
| 566 | case 7: |
| 567 | h ^= ByteAs64(data[6]) << 48; |
| 568 | TF_FALLTHROUGH_INTENDED; |
| 569 | case 6: |
| 570 | h ^= ByteAs64(data[5]) << 40; |
| 571 | TF_FALLTHROUGH_INTENDED; |
| 572 | case 5: |
| 573 | h ^= ByteAs64(data[4]) << 32; |
| 574 | TF_FALLTHROUGH_INTENDED; |
| 575 | case 4: |
| 576 | h ^= ByteAs64(data[3]) << 24; |
| 577 | TF_FALLTHROUGH_INTENDED; |
| 578 | case 3: |
| 579 | h ^= ByteAs64(data[2]) << 16; |
| 580 | TF_FALLTHROUGH_INTENDED; |
| 581 | case 2: |
| 582 | h ^= ByteAs64(data[1]) << 8; |
| 583 | TF_FALLTHROUGH_INTENDED; |
| 584 | case 1: |
| 585 | h ^= ByteAs64(data[0]); |
| 586 | h *= m; |
| 587 | } |
| 588 | h ^= h >> r; |
| 589 | h *= m; |
| 590 | h ^= h >> r; |
| 591 | return h; |
| 592 | #else |
| 593 | return Hash64(data, n, seed); |
| 594 | #endif |
| 595 | } |
| 596 | |
| 597 | #if defined(__AVX512F__) |
| 598 | void Hash64V3_Batch512(const char** data, uint64* h_out, |