diff options
| author | Fangming.Fang <fangming.fang@arm.com> | 2017-11-08 02:17:51 +0000 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2017-11-14 19:07:15 +0000 |
| commit | 66bfbd9ad7a93ea85175bf1db663ca5f440666e3 (patch) | |
| tree | 7ada947a495b21f1520f1534a287ef9dcc398b0e /src/internal/cpu | |
| parent | b3ee6f0c2e8be8701ec15f3fb91397e086f106ae (diff) | |
| download | go-66bfbd9ad7a93ea85175bf1db663ca5f440666e3.tar.xz | |
internal/cpu: detect cpu features in internal/cpu package
change hash/crc32 package to use cpu package instead of using
runtime internal variables to check crc32 instruction
Change-Id: I8f88d2351bde8ed4e256f9adf822a08b9a00f532
Reviewed-on: https://go-review.googlesource.com/76490
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/internal/cpu')
| -rw-r--r-- | src/internal/cpu/cpu.go | 18 | ||||
| -rw-r--r-- | src/internal/cpu/cpu_arm64.go | 41 |
2 files changed, 54 insertions, 5 deletions
diff --git a/src/internal/cpu/cpu.go b/src/internal/cpu/cpu.go index 38fedc4e2b..22fc561002 100644 --- a/src/internal/cpu/cpu.go +++ b/src/internal/cpu/cpu.go @@ -57,3 +57,21 @@ type ppc64 struct { 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 +} diff --git a/src/internal/cpu/cpu_arm64.go b/src/internal/cpu/cpu_arm64.go index 4d071b3a4e..e1278a147a 100644 --- a/src/internal/cpu/cpu_arm64.go +++ b/src/internal/cpu/cpu_arm64.go @@ -2,13 +2,44 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build arm64 + package cpu const CacheLineSize = 64 -// TODO: delete this once https://go-review.googlesource.com/c/go/+/76490 lands. -// These will just be false for now. -var ARM64 struct { - HasSHA1 bool - HasSHA2 bool +// arm64 doesn't have a 'cpuid' equivalent, so we rely on HWCAP/HWCAP2. +// These are linknamed in runtime/os_linux_arm64.go and are initialized by +// archauxv(). +var arm64_hwcap uint +var arm64_hwcap2 uint + +// HWCAP/HWCAP2 bits. These are exposed by Linux. +const ( + _ARM64_FEATURE_HAS_FP = (1 << 0) + _ARM64_FEATURE_HAS_ASIMD = (1 << 1) + _ARM64_FEATURE_HAS_EVTSTRM = (1 << 2) + _ARM64_FEATURE_HAS_AES = (1 << 3) + _ARM64_FEATURE_HAS_PMULL = (1 << 4) + _ARM64_FEATURE_HAS_SHA1 = (1 << 5) + _ARM64_FEATURE_HAS_SHA2 = (1 << 6) + _ARM64_FEATURE_HAS_CRC32 = (1 << 7) + _ARM64_FEATURE_HAS_ATOMICS = (1 << 8) +) + +func init() { + // HWCAP feature bits + ARM64.HasFP = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_FP) + ARM64.HasASIMD = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_ASIMD) + ARM64.HasEVTSTRM = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_EVTSTRM) + ARM64.HasAES = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_AES) + ARM64.HasPMULL = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_PMULL) + ARM64.HasSHA1 = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_SHA1) + ARM64.HasSHA2 = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_SHA2) + ARM64.HasCRC32 = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_CRC32) + ARM64.HasATOMICS = isSet(arm64_hwcap, _ARM64_FEATURE_HAS_ATOMICS) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 } |
