mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.simd] simd, internal/cpu: support more AVX CPU Feature checks
This CL adds more checks, it also changes HasAVX512GFNI to be exactly checking GFNI instead of being a virtual feature. This CL copies its logic from x/sys/arch. Change-Id: I4612b0409b8a3518928300562ae08bcf123d53a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/688276 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
957f06c410
commit
41054cdb1c
3 changed files with 108 additions and 45 deletions
|
|
@ -30,20 +30,25 @@ var X86 struct {
|
||||||
HasAES bool
|
HasAES bool
|
||||||
HasADX bool
|
HasADX bool
|
||||||
HasAVX bool
|
HasAVX bool
|
||||||
|
HasAVXVNNI bool
|
||||||
HasAVX2 bool
|
HasAVX2 bool
|
||||||
HasAVX512GFNI bool // Virtual feature: F+CD+BW+DQ+VL+GFNI
|
|
||||||
HasAVX512 bool // Virtual feature: F+CD+BW+DQ+VL
|
HasAVX512 bool // Virtual feature: F+CD+BW+DQ+VL
|
||||||
HasAVX512F bool
|
HasAVX512F bool
|
||||||
HasAVX512CD bool
|
HasAVX512CD bool
|
||||||
HasAVX512BW bool
|
HasAVX512BW bool
|
||||||
HasAVX512DQ bool
|
HasAVX512DQ bool
|
||||||
HasAVX512VL bool
|
HasAVX512VL bool
|
||||||
|
HasAVX512GFNI bool
|
||||||
|
HasAVX512VNNI bool
|
||||||
|
HasAVX512VBMI bool
|
||||||
|
HasAVX512VBMI2 bool
|
||||||
|
HasAVX512BITALG bool
|
||||||
|
HasAVX512VPOPCNTDQ bool
|
||||||
HasBMI1 bool
|
HasBMI1 bool
|
||||||
HasBMI2 bool
|
HasBMI2 bool
|
||||||
HasERMS bool
|
HasERMS bool
|
||||||
HasFSRM bool
|
HasFSRM bool
|
||||||
HasFMA bool
|
HasFMA bool
|
||||||
HasGFNI bool
|
|
||||||
HasOSXSAVE bool
|
HasOSXSAVE bool
|
||||||
HasPCLMULQDQ bool
|
HasPCLMULQDQ bool
|
||||||
HasPOPCNT bool
|
HasPOPCNT bool
|
||||||
|
|
|
||||||
|
|
@ -18,12 +18,20 @@ func xgetbv() (eax, edx uint32)
|
||||||
func getGOAMD64level() int32
|
func getGOAMD64level() int32
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// eax bits
|
||||||
|
cpuid_AVXVNNI = 1 << 4
|
||||||
|
|
||||||
// ecx bits
|
// ecx bits
|
||||||
cpuid_SSE3 = 1 << 0
|
cpuid_SSE3 = 1 << 0
|
||||||
cpuid_PCLMULQDQ = 1 << 1
|
cpuid_PCLMULQDQ = 1 << 1
|
||||||
|
cpuid_AVX512VBMI = 1 << 1
|
||||||
|
cpuid_AVX512VBMI2 = 1 << 6
|
||||||
cpuid_SSSE3 = 1 << 9
|
cpuid_SSSE3 = 1 << 9
|
||||||
cpuid_GFNI = 1 << 8
|
cpuid_AVX512GFNI = 1 << 8
|
||||||
|
cpuid_AVX512VNNI = 1 << 11
|
||||||
|
cpuid_AVX512BITALG = 1 << 12
|
||||||
cpuid_FMA = 1 << 12
|
cpuid_FMA = 1 << 12
|
||||||
|
cpuid_AVX512VPOPCNTDQ = 1 << 14
|
||||||
cpuid_SSE41 = 1 << 19
|
cpuid_SSE41 = 1 << 19
|
||||||
cpuid_SSE42 = 1 << 20
|
cpuid_SSE42 = 1 << 20
|
||||||
cpuid_POPCNT = 1 << 23
|
cpuid_POPCNT = 1 << 23
|
||||||
|
|
@ -144,7 +152,7 @@ func doinit() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, ebx7, ecx7, edx7 := cpuid(7, 0)
|
eax7, ebx7, ecx7, edx7 := cpuid(7, 0)
|
||||||
X86.HasBMI1 = isSet(ebx7, cpuid_BMI1)
|
X86.HasBMI1 = isSet(ebx7, cpuid_BMI1)
|
||||||
X86.HasAVX2 = isSet(ebx7, cpuid_AVX2) && osSupportsAVX
|
X86.HasAVX2 = isSet(ebx7, cpuid_AVX2) && osSupportsAVX
|
||||||
X86.HasBMI2 = isSet(ebx7, cpuid_BMI2)
|
X86.HasBMI2 = isSet(ebx7, cpuid_BMI2)
|
||||||
|
|
@ -158,10 +166,15 @@ func doinit() {
|
||||||
X86.HasAVX512BW = isSet(ebx7, cpuid_AVX512BW)
|
X86.HasAVX512BW = isSet(ebx7, cpuid_AVX512BW)
|
||||||
X86.HasAVX512DQ = isSet(ebx7, cpuid_AVX512DQ)
|
X86.HasAVX512DQ = isSet(ebx7, cpuid_AVX512DQ)
|
||||||
X86.HasAVX512VL = isSet(ebx7, cpuid_AVX512VL)
|
X86.HasAVX512VL = isSet(ebx7, cpuid_AVX512VL)
|
||||||
|
X86.HasAVX512GFNI = isSet(ecx7, cpuid_AVX512GFNI)
|
||||||
|
X86.HasAVX512BITALG = isSet(ecx7, cpuid_AVX512BITALG)
|
||||||
|
X86.HasAVX512VPOPCNTDQ = isSet(ecx7, cpuid_AVX512VPOPCNTDQ)
|
||||||
|
X86.HasAVX512VBMI = isSet(ecx7, cpuid_AVX512VBMI)
|
||||||
|
X86.HasAVX512VBMI2 = isSet(ecx7, cpuid_AVX512VBMI2)
|
||||||
|
X86.HasAVX512VNNI = isSet(ecx7, cpuid_AVX512VNNI)
|
||||||
}
|
}
|
||||||
|
|
||||||
X86.HasFSRM = isSet(edx7, cpuid_FSRM)
|
X86.HasFSRM = isSet(edx7, cpuid_FSRM)
|
||||||
X86.HasGFNI = isSet(ecx7, cpuid_GFNI)
|
|
||||||
|
|
||||||
var maxExtendedInformation uint32
|
var maxExtendedInformation uint32
|
||||||
maxExtendedInformation, _, _, _ = cpuid(0x80000000, 0)
|
maxExtendedInformation, _, _, _ = cpuid(0x80000000, 0)
|
||||||
|
|
@ -182,7 +195,12 @@ func doinit() {
|
||||||
// it. GOAMD64=v4 also implies exactly this set, and these are all
|
// it. GOAMD64=v4 also implies exactly this set, and these are all
|
||||||
// included in AVX10.1.
|
// included in AVX10.1.
|
||||||
X86.HasAVX512 = X86.HasAVX512F && X86.HasAVX512CD && X86.HasAVX512BW && X86.HasAVX512DQ && X86.HasAVX512VL
|
X86.HasAVX512 = X86.HasAVX512F && X86.HasAVX512CD && X86.HasAVX512BW && X86.HasAVX512DQ && X86.HasAVX512VL
|
||||||
X86.HasAVX512GFNI = X86.HasAVX512 && X86.HasGFNI
|
}
|
||||||
|
if eax7 >= 1 {
|
||||||
|
eax71, _, _, _ := cpuid(7, 1)
|
||||||
|
if X86.HasAVX {
|
||||||
|
X86.HasAVXVNNI = isSet(4, eax71)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,52 @@ package simd
|
||||||
|
|
||||||
import "internal/cpu"
|
import "internal/cpu"
|
||||||
|
|
||||||
// HasAVX512GFNI checks AVX512 CPU feature F+CD+BW+DQ+VL+GFNI.
|
// HasAVX checks AVX CPU feature.
|
||||||
func HasAVX512GFNI() bool {
|
func HasAVX() bool {
|
||||||
return cpu.X86.HasAVX512GFNI
|
return cpu.X86.HasAVX
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAVXVNNI checks AVX CPU feature VNNI.
|
||||||
|
func HasAVXVNNI() bool {
|
||||||
|
return cpu.X86.HasAVXVNNI
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAVX2 checks AVX2 CPU feature.
|
||||||
|
func HasAVX2() bool {
|
||||||
|
return cpu.X86.HasAVX2
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasAVX512 checks AVX512 CPU feature F+CD+BW+DQ+VL.
|
// HasAVX512 checks AVX512 CPU feature F+CD+BW+DQ+VL.
|
||||||
func HasAVX512() bool {
|
func HasAVX512() bool {
|
||||||
return cpu.X86.HasAVX512
|
return cpu.X86.HasAVX512
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HasAVX512GFNI checks AVX512 CPU feature GFNI.
|
||||||
|
func HasAVX512GFNI() bool {
|
||||||
|
return cpu.X86.HasAVX512GFNI
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAVX512VBMI checks AVX512 CPU feature VBMI
|
||||||
|
func HasAVX512VBMI() bool {
|
||||||
|
return cpu.X86.HasAVX512VBMI
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAVX512VBMI2 checks AVX512 CPU feature VBMI2
|
||||||
|
func HasAVX512VBMI2() bool {
|
||||||
|
return cpu.X86.HasAVX512VBMI2
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAVX512VNNI checks AVX512 CPU feature VNNI
|
||||||
|
func HasAVX512VNNI() bool {
|
||||||
|
return cpu.X86.HasAVX512VNNI
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAVX512VPOPCNTDQ checks AVX512 CPU feature VPOPCNTDQ
|
||||||
|
func HasAVX512VPOPCNTDQ() bool {
|
||||||
|
return cpu.X86.HasAVX512VPOPCNTDQ
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAVX512BITALG checks AVX512 CPU feature BITALG
|
||||||
|
func HasAVX512BITALG() bool {
|
||||||
|
return cpu.X86.HasAVX512BITALG
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue