// Copyright 2026 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build amd64 && goexperiment.simd package maps import ( "simd/archsimd" "unsafe" ) const memHashUsesVAES = true func memHash32AES(k uint32, seed uintptr) uintptr { var state archsimd.Uint64x2 state = state.SetElem(0, uint64(seed)).SetElem(1, uint64(k)) hash := state. AsUint8x16(). AESEncryptOneRound(archsimd.LoadUint32x4Array((*[4]uint32)(unsafe.Pointer(&aeskeysched[0])))). AESEncryptOneRound(archsimd.LoadUint32x4Array((*[4]uint32)(unsafe.Pointer(&aeskeysched[16])))). AESEncryptOneRound(archsimd.LoadUint32x4Array((*[4]uint32)(unsafe.Pointer(&aeskeysched[32])))). AsUint64x2(). GetElem(0) return uintptr(hash) } func memHash64AES(k uint64, seed uintptr) uintptr { var state archsimd.Uint64x2 state = state.SetElem(0, uint64(seed)).SetElem(1, k) hash := state. AsUint8x16(). AESEncryptOneRound(archsimd.LoadUint32x4Array((*[4]uint32)(unsafe.Pointer(&aeskeysched[0])))). AESEncryptOneRound(archsimd.LoadUint32x4Array((*[4]uint32)(unsafe.Pointer(&aeskeysched[16])))). AESEncryptOneRound(archsimd.LoadUint32x4Array((*[4]uint32)(unsafe.Pointer(&aeskeysched[32])))). AsUint64x2(). GetElem(0) return uintptr(hash) } // TODO: memHashAES is quite large. // So there is no point in rewriting it using simd intrinsics, since it won't be inlinable. // Maybe in future we can do it for better maitanability. // //go:noescape func memHashAES(p unsafe.Pointer, h, s uintptr) uintptr