package cpu
import
const cacheLineSize = 64
func () {
options = []option{
{Name: "adx", Feature: &X86.HasADX},
{Name: "aes", Feature: &X86.HasAES},
{Name: "avx", Feature: &X86.HasAVX},
{Name: "avx2", Feature: &X86.HasAVX2},
{Name: "avx512", Feature: &X86.HasAVX512},
{Name: "avx512f", Feature: &X86.HasAVX512F},
{Name: "avx512cd", Feature: &X86.HasAVX512CD},
{Name: "avx512er", Feature: &X86.HasAVX512ER},
{Name: "avx512pf", Feature: &X86.HasAVX512PF},
{Name: "avx512vl", Feature: &X86.HasAVX512VL},
{Name: "avx512bw", Feature: &X86.HasAVX512BW},
{Name: "avx512dq", Feature: &X86.HasAVX512DQ},
{Name: "avx512ifma", Feature: &X86.HasAVX512IFMA},
{Name: "avx512vbmi", Feature: &X86.HasAVX512VBMI},
{Name: "avx512vnniw", Feature: &X86.HasAVX5124VNNIW},
{Name: "avx5124fmaps", Feature: &X86.HasAVX5124FMAPS},
{Name: "avx512vpopcntdq", Feature: &X86.HasAVX512VPOPCNTDQ},
{Name: "avx512vpclmulqdq", Feature: &X86.HasAVX512VPCLMULQDQ},
{Name: "avx512vnni", Feature: &X86.HasAVX512VNNI},
{Name: "avx512gfni", Feature: &X86.HasAVX512GFNI},
{Name: "avx512vaes", Feature: &X86.HasAVX512VAES},
{Name: "avx512vbmi2", Feature: &X86.HasAVX512VBMI2},
{Name: "avx512bitalg", Feature: &X86.HasAVX512BITALG},
{Name: "avx512bf16", Feature: &X86.HasAVX512BF16},
{Name: "amxtile", Feature: &X86.HasAMXTile},
{Name: "amxint8", Feature: &X86.HasAMXInt8},
{Name: "amxbf16", Feature: &X86.HasAMXBF16},
{Name: "bmi1", Feature: &X86.HasBMI1},
{Name: "bmi2", Feature: &X86.HasBMI2},
{Name: "cx16", Feature: &X86.HasCX16},
{Name: "erms", Feature: &X86.HasERMS},
{Name: "fma", Feature: &X86.HasFMA},
{Name: "osxsave", Feature: &X86.HasOSXSAVE},
{Name: "pclmulqdq", Feature: &X86.HasPCLMULQDQ},
{Name: "popcnt", Feature: &X86.HasPOPCNT},
{Name: "rdrand", Feature: &X86.HasRDRAND},
{Name: "rdseed", Feature: &X86.HasRDSEED},
{Name: "sse3", Feature: &X86.HasSSE3},
{Name: "sse41", Feature: &X86.HasSSE41},
{Name: "sse42", Feature: &X86.HasSSE42},
{Name: "ssse3", Feature: &X86.HasSSSE3},
{Name: "avxifma", Feature: &X86.HasAVXIFMA},
{Name: "avxvnni", Feature: &X86.HasAVXVNNI},
{Name: "avxvnniint8", Feature: &X86.HasAVXVNNIInt8},
{Name: "sse2", Feature: &X86.HasSSE2, Required: runtime.GOARCH == "amd64"},
}
}
func () {
const (
= 1 << 4
= 1 << 0
= 1 << 1
= 1 << 1
= 1 << 6
= 1 << 9
= 1 << 8
= 1 << 9
= 1 << 11
= 1 << 12
= 1 << 12
= 1 << 14
= 1 << 19
= 1 << 20
= 1 << 23
= 1 << 25
= 1 << 27
= 1 << 28
= 1 << 3
= 1 << 5
= 1 << 8
= 1 << 9
= 1 << 16
= 1 << 17
= 1 << 19
= 1 << 28
= 1 << 29
= 1 << 30
= 1 << 31
= 1 << 1
= 1 << 6
= 1 << 8
= 1 << 10
= 1 << 12
= 1 << 4
= 1 << 27
)
const (
= 1 << 26
= 1 << 13
= 1 << 30
= 1 << 18
= 1 << 21
= 1 << 26
= 1 << 27
= 1 << 2
= 1 << 3
= 1 << 22
= 1 << 24
= 1 << 25
= 1 << 5
= 1 << 23
= 1 << 4
)
Initialized = true
, , , := cpuid(0, 0)
if < 1 {
return
}
, , , := cpuid(1, 0)
X86.HasSSE2 = isSet(, )
X86.HasSSE3 = isSet(, )
X86.HasPCLMULQDQ = isSet(, )
X86.HasSSSE3 = isSet(, )
X86.HasFMA = isSet(, )
X86.HasCX16 = isSet(, )
X86.HasSSE41 = isSet(, )
X86.HasSSE42 = isSet(, )
X86.HasPOPCNT = isSet(, )
X86.HasAES = isSet(, )
X86.HasOSXSAVE = isSet(, )
X86.HasRDRAND = isSet(, )
var , bool
if X86.HasOSXSAVE {
, := xgetbv()
= isSet(, 1<<1) && isSet(, 1<<2)
if runtime.GOOS == "darwin" {
= && darwinSupportsAVX512()
} else {
= && isSet(, 1<<5) && isSet(, 1<<6) && isSet(, 1<<7)
}
}
X86.HasAVX = isSet(, ) &&
if < 7 {
return
}
, , , := cpuid(7, 0)
X86.HasBMI1 = isSet(, )
X86.HasAVX2 = isSet(, ) &&
X86.HasBMI2 = isSet(, )
X86.HasERMS = isSet(, )
X86.HasRDSEED = isSet(, )
X86.HasADX = isSet(, )
X86.HasAVX512 = isSet(, ) &&
if X86.HasAVX512 {
X86.HasAVX512F = true
X86.HasAVX512CD = isSet(, )
X86.HasAVX512ER = isSet(, )
X86.HasAVX512PF = isSet(, )
X86.HasAVX512VL = isSet(, )
X86.HasAVX512BW = isSet(, )
X86.HasAVX512DQ = isSet(, )
X86.HasAVX512IFMA = isSet(, )
X86.HasAVX512VBMI = isSet(, )
X86.HasAVX5124VNNIW = isSet(, )
X86.HasAVX5124FMAPS = isSet(, )
X86.HasAVX512VPOPCNTDQ = isSet(, )
X86.HasAVX512VPCLMULQDQ = isSet(, )
X86.HasAVX512VNNI = isSet(, )
X86.HasAVX512GFNI = isSet(, )
X86.HasAVX512VAES = isSet(, )
X86.HasAVX512VBMI2 = isSet(, )
X86.HasAVX512BITALG = isSet(, )
}
X86.HasAMXTile = isSet(, )
X86.HasAMXInt8 = isSet(, )
X86.HasAMXBF16 = isSet(, )
if >= 1 {
, , , := cpuid(7, 1)
if X86.HasAVX512 {
X86.HasAVX512BF16 = isSet(, )
}
if X86.HasAVX {
X86.HasAVXIFMA = isSet(, )
X86.HasAVXVNNI = isSet(, )
X86.HasAVXVNNIInt8 = isSet(, )
}
}
}
func ( uint32, uint32) bool {
return & != 0
}