accum_stubs_amd64.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package xxh3
  2. import (
  3. "unsafe"
  4. "github.com/klauspost/cpuid/v2"
  5. )
  6. var (
  7. hasAVX2 = cpuid.CPU.Has(cpuid.AVX2)
  8. hasSSE2 = cpuid.CPU.Has(cpuid.SSE2) // Always true on amd64
  9. hasAVX512 = cpuid.CPU.Has(cpuid.AVX512F)
  10. )
  11. //go:noescape
  12. func accumAVX2(acc *[8]u64, data, key unsafe.Pointer, len u64)
  13. //go:noescape
  14. func accumAVX512(acc *[8]u64, data, key unsafe.Pointer, len u64)
  15. //go:noescape
  16. func accumSSE(acc *[8]u64, data, key unsafe.Pointer, len u64)
  17. //go:noescape
  18. func accumBlockAVX2(acc *[8]u64, data, key unsafe.Pointer)
  19. //go:noescape
  20. func accumBlockSSE(acc *[8]u64, data, key unsafe.Pointer)
  21. func withOverrides(avx512, avx2, sse2 bool, cb func()) {
  22. avx512Orig, avx2Orig, sse2Orig := hasAVX512, hasAVX2, hasSSE2
  23. hasAVX512, hasAVX2, hasSSE2 = avx512, avx2, sse2
  24. defer func() { hasAVX512, hasAVX2, hasSSE2 = avx512Orig, avx2Orig, sse2Orig }()
  25. cb()
  26. }
  27. func withAVX512(cb func()) { withOverrides(hasAVX512, false, false, cb) }
  28. func withAVX2(cb func()) { withOverrides(false, hasAVX2, false, cb) }
  29. func withSSE2(cb func()) { withOverrides(false, false, hasSSE2, cb) }
  30. func withGeneric(cb func()) { withOverrides(false, false, false, cb) }