1
2
3
4
5 package maps
6
7 import (
8 "internal/byteorder"
9 "internal/cpu"
10 "internal/goarch"
11 "unsafe"
12 )
13
14
15
16
17 var UseAeshash bool
18
19 const hashRandomBytes = goarch.PtrSize / 4 * 64
20
21
22 var aeskeysched [hashRandomBytes]byte
23
24
25 var hashkey [4]uintptr
26
27 func AlgInit() {
28
29
30
31 for i := range hashkey {
32 hashkey[i] = uintptr(bootstrapRand())
33 }
34
35
36 if (goarch.GOARCH == "386" || goarch.GOARCH == "amd64") &&
37 cpu.X86.HasAES &&
38 cpu.X86.HasSSSE3 &&
39 cpu.X86.HasSSE41 {
40
41
42
43
44 if !checkMasksAndShiftsAlignment() {
45 fatal("maps: global variables for AES hashing are not properly aligned!")
46 }
47 initAlgAES()
48
49 if memHashUsesVAES {
50
51
52
53
54 UseAeshash = cpu.X86.HasAVX
55 }
56 return
57 }
58 if goarch.GOARCH == "arm64" && cpu.ARM64.HasAES {
59 initAlgAES()
60 return
61 }
62 }
63
64 func initAlgAES() {
65 UseAeshash = true
66
67 key := (*[hashRandomBytes / 8]uint64)(unsafe.Pointer(&aeskeysched))
68 for i := range key {
69 key[i] = bootstrapRand()
70 }
71 }
72
73
74 func add(p unsafe.Pointer, x uintptr) unsafe.Pointer {
75 return unsafe.Pointer(uintptr(p) + x)
76 }
77
78
79 func readUnaligned32(p unsafe.Pointer) uint32 {
80 q := (*[4]byte)(p)
81 if goarch.BigEndian {
82 return byteorder.BEUint32(q[:])
83 }
84 return byteorder.LEUint32(q[:])
85 }
86
87 func readUnaligned64(p unsafe.Pointer) uint64 {
88 q := (*[8]byte)(p)
89 if goarch.BigEndian {
90 return byteorder.BEUint64(q[:])
91 }
92 return byteorder.LEUint64(q[:])
93 }
94
View as plain text