Source file
src/crypto/sha1/sha1block_amd64.go
1
2
3
4
5
6
7 package sha1
8
9 import (
10 "crypto/internal/impl"
11 "internal/cpu"
12 )
13
14
15 func blockAVX2(dig *digest, p []byte)
16
17
18 func blockSHANI(dig *digest, p []byte)
19
20 var useAVX2 = cpu.X86.HasAVX && cpu.X86.HasAVX2 && cpu.X86.HasBMI1 && cpu.X86.HasBMI2
21 var useSHANI = cpu.X86.HasAVX && cpu.X86.HasSHA && cpu.X86.HasSSE41 && cpu.X86.HasSSSE3
22
23 func init() {
24 impl.Register("sha1", "AVX2", &useAVX2)
25 impl.Register("sha1", "SHA-NI", &useSHANI)
26 }
27
28 func block(dig *digest, p []byte) {
29 if useSHANI {
30 blockSHANI(dig, p)
31 } else if useAVX2 && len(p) >= 256 {
32
33
34
35
36
37 safeLen := len(p) - 128
38 if safeLen%128 != 0 {
39 safeLen -= 64
40 }
41 blockAVX2(dig, p[:safeLen])
42 blockGeneric(dig, p[safeLen:])
43 } else {
44 blockGeneric(dig, p)
45 }
46 }
47
View as plain text