package cpu
const CacheLinePadSize = 64
func (, uint32) (, , , uint32)
func () (, uint32)
func () int32
const (
cpuid_SSE3 = 1 << 0
cpuid_PCLMULQDQ = 1 << 1
cpuid_SSSE3 = 1 << 9
cpuid_FMA = 1 << 12
cpuid_SSE41 = 1 << 19
cpuid_SSE42 = 1 << 20
cpuid_POPCNT = 1 << 23
cpuid_AES = 1 << 25
cpuid_OSXSAVE = 1 << 27
cpuid_AVX = 1 << 28
cpuid_BMI1 = 1 << 3
cpuid_AVX2 = 1 << 5
cpuid_BMI2 = 1 << 8
cpuid_ERMS = 1 << 9
cpuid_AVX512F = 1 << 16
cpuid_ADX = 1 << 19
cpuid_SHA = 1 << 29
cpuid_AVX512BW = 1 << 30
cpuid_AVX512VL = 1 << 31
cpuid_FSRM = 1 << 4
cpuid_RDTSCP = 1 << 27
)
var maxExtendedFunctionInformation uint32
func () {
options = []option{
{Name: "adx", Feature: &X86.HasADX},
{Name: "aes", Feature: &X86.HasAES},
{Name: "erms", Feature: &X86.HasERMS},
{Name: "fsrm", Feature: &X86.HasFSRM},
{Name: "pclmulqdq", Feature: &X86.HasPCLMULQDQ},
{Name: "rdtscp", Feature: &X86.HasRDTSCP},
{Name: "sha", Feature: &X86.HasSHA},
}
:= getGOAMD64level()
if < 2 {
options = append(options,
option{Name: "popcnt", Feature: &X86.HasPOPCNT},
option{Name: "sse3", Feature: &X86.HasSSE3},
option{Name: "sse41", Feature: &X86.HasSSE41},
option{Name: "sse42", Feature: &X86.HasSSE42},
option{Name: "ssse3", Feature: &X86.HasSSSE3})
}
if < 3 {
options = append(options,
option{Name: "avx", Feature: &X86.HasAVX},
option{Name: "avx2", Feature: &X86.HasAVX2},
option{Name: "bmi1", Feature: &X86.HasBMI1},
option{Name: "bmi2", Feature: &X86.HasBMI2},
option{Name: "fma", Feature: &X86.HasFMA})
}
if < 4 {
options = append(options,
option{Name: "avx512f", Feature: &X86.HasAVX512F},
option{Name: "avx512bw", Feature: &X86.HasAVX512BW},
option{Name: "avx512vl", Feature: &X86.HasAVX512VL},
)
}
, , , := cpuid(0, 0)
if < 1 {
return
}
maxExtendedFunctionInformation, _, _, _ = cpuid(0x80000000, 0)
, , , := cpuid(1, 0)
X86.HasSSE3 = isSet(, cpuid_SSE3)
X86.HasPCLMULQDQ = isSet(, cpuid_PCLMULQDQ)
X86.HasSSSE3 = isSet(, cpuid_SSSE3)
X86.HasSSE41 = isSet(, cpuid_SSE41)
X86.HasSSE42 = isSet(, cpuid_SSE42)
X86.HasPOPCNT = isSet(, cpuid_POPCNT)
X86.HasAES = isSet(, cpuid_AES)
X86.HasOSXSAVE = isSet(, cpuid_OSXSAVE)
X86.HasFMA = isSet(, cpuid_FMA) && X86.HasOSXSAVE
:= false
:= false
if X86.HasOSXSAVE {
, := xgetbv()
= isSet(, 1<<1) && isSet(, 1<<2)
= && isSet(, 1<<5) && isSet(, 1<<6) && isSet(, 1<<7)
}
X86.HasAVX = isSet(, cpuid_AVX) &&
if < 7 {
return
}
, , , := cpuid(7, 0)
X86.HasBMI1 = isSet(, cpuid_BMI1)
X86.HasAVX2 = isSet(, cpuid_AVX2) &&
X86.HasBMI2 = isSet(, cpuid_BMI2)
X86.HasERMS = isSet(, cpuid_ERMS)
X86.HasADX = isSet(, cpuid_ADX)
X86.HasSHA = isSet(, cpuid_SHA)
X86.HasAVX512F = isSet(, cpuid_AVX512F) &&
if X86.HasAVX512F {
X86.HasAVX512BW = isSet(, cpuid_AVX512BW)
X86.HasAVX512VL = isSet(, cpuid_AVX512VL)
}
X86.HasFSRM = isSet(, cpuid_FSRM)
var uint32
, _, _, _ = cpuid(0x80000000, 0)
if < 0x80000001 {
return
}
, , , := cpuid(0x80000001, 0)
X86.HasRDTSCP = isSet(, cpuid_RDTSCP)
}
func ( uint32, uint32) bool {
return & != 0
}
func () string {
if maxExtendedFunctionInformation < 0x80000004 {
return ""
}
:= make([]byte, 0, 3*4*4)
var , , , uint32
, , , = cpuid(0x80000002, 0)
= appendBytes(, , , , )
, , , = cpuid(0x80000003, 0)
= appendBytes(, , , , )
, , , = cpuid(0x80000004, 0)
= appendBytes(, , , , )
for len() > 0 && [0] == ' ' {
= [1:]
}
for , := range {
if == '\x00' {
= [:]
break
}
}
return string()
}
func ( []byte, ...uint32) []byte {
for , := range {
= append(,
byte(( >> 0)),
byte(( >> 8)),
byte(( >> 16)),
byte(( >> 24)))
}
return
}