aboutsummaryrefslogtreecommitdiff
path: root/src/internal/cpu
diff options
context:
space:
mode:
authorFangming.Fang <fangming.fang@arm.com>2017-11-08 02:17:51 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2017-11-14 19:07:15 +0000
commit66bfbd9ad7a93ea85175bf1db663ca5f440666e3 (patch)
tree7ada947a495b21f1520f1534a287ef9dcc398b0e /src/internal/cpu
parentb3ee6f0c2e8be8701ec15f3fb91397e086f106ae (diff)
downloadgo-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.go18
-rw-r--r--src/internal/cpu/cpu_arm64.go41
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
}