| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Package cpu implements processor feature detection |
| // used by the Go standard library. |
| package cpu |
| |
| var X86 x86 |
| |
| // The booleans in x86 contain the correspondingly named cpuid feature bit. |
| // HasAVX and HasAVX2 are only set if the OS does support XMM and YMM registers |
| // in addition to the cpuid feature bit being set. |
| // The struct is padded to avoid false sharing. |
| type x86 struct { |
| _ [CacheLineSize]byte |
| HasAES bool |
| HasADX bool |
| HasAVX bool |
| HasAVX2 bool |
| HasBMI1 bool |
| HasBMI2 bool |
| HasERMS bool |
| HasFMA bool |
| HasOSXSAVE bool |
| HasPCLMULQDQ bool |
| HasPOPCNT bool |
| HasSSE2 bool |
| HasSSE3 bool |
| HasSSSE3 bool |
| HasSSE41 bool |
| HasSSE42 bool |
| _ [CacheLineSize]byte |
| } |
| |
| var PPC64 ppc64 |
| |
| // For ppc64x, it is safe to check only for ISA level starting on ISA v3.00, |
| // since there are no optional categories. There are some exceptions that also |
| // require kernel support to work (darn, scv), so there are capability bits for |
| // those as well. The minimum processor requirement is POWER8 (ISA 2.07), so we |
| // maintain some of the old capability checks for optional categories for |
| // safety. |
| // The struct is padded to avoid false sharing. |
| type ppc64 struct { |
| _ [CacheLineSize]byte |
| HasVMX bool // Vector unit (Altivec) |
| HasDFP bool // Decimal Floating Point unit |
| HasVSX bool // Vector-scalar unit |
| HasHTM bool // Hardware Transactional Memory |
| HasISEL bool // Integer select |
| HasVCRYPTO bool // Vector cryptography |
| HasHTMNOSC bool // HTM: kernel-aborted transaction in syscalls |
| HasDARN bool // Hardware random number generator (requires kernel enablement) |
| HasSCV bool // Syscall vectored (requires kernel enablement) |
| IsPOWER8 bool // ISA v2.07 (POWER8) |
| IsPOWER9 bool // ISA v3.00 (POWER9) |
| _ [CacheLineSize]byte |
| } |
| |
| var ARM64 arm64 |
| |
| // The booleans in arm64 contain the correspondingly named cpu feature bit. |
| // The struct is padded to avoid false sharing. |
| type arm64 struct { |
| _ [CacheLineSize]byte |
| HasFP bool |
| HasASIMD bool |
| HasEVTSTRM bool |
| HasAES bool |
| HasPMULL bool |
| HasSHA1 bool |
| HasSHA2 bool |
| HasCRC32 bool |
| HasATOMICS bool |
| _ [CacheLineSize]byte |
| } |