|  | // 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. | 
|  |  | 
|  | // +build arm64 | 
|  |  | 
|  | package cpu | 
|  |  | 
|  | const CacheLineSize = 64 | 
|  |  | 
|  | // 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 | 
|  | } |