package cpu
const CacheLinePadSize = 64
func (, uint32) (, , , uint32)
func () (, uint32)
const (
cpuid_SSE2 = 1 << 26
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_ADX = 1 << 19
cpuid_RDTSCP = 1 << 27
)
var maxExtendedFunctionInformation uint32
func () {
options = []option{
{Name: "adx", Feature: &X86.HasADX},
{Name: "aes", Feature: &X86.HasAES},
{Name: "avx", Feature: &X86.HasAVX},
{Name: "avx2", Feature: &X86.HasAVX2},
{Name: "bmi1", Feature: &X86.HasBMI1},
{Name: "bmi2", Feature: &X86.HasBMI2},
{Name: "erms", Feature: &X86.HasERMS},
{Name: "fma", Feature: &X86.HasFMA},
{Name: "pclmulqdq", Feature: &X86.HasPCLMULQDQ},
{Name: "popcnt", Feature: &X86.HasPOPCNT},
{Name: "rdtscp", Feature: &X86.HasRDTSCP},
{Name: "sse3", Feature: &X86.HasSSE3},
{Name: "sse41", Feature: &X86.HasSSE41},
{Name: "sse42", Feature: &X86.HasSSE42},
{Name: "ssse3", Feature: &X86.HasSSSE3},
}
, , , := 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
if X86.HasOSXSAVE {
, := xgetbv()
= isSet(, 1<<1) && isSet(, 1<<2)
}
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)
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
}