| // 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 |
| |
| 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 hwcap uint |
| var hwcap2 uint |
| |
| // HWCAP/HWCAP2 bits. These are exposed by Linux. |
| const ( |
| hwcap_FP = (1 << 0) |
| hwcap_ASIMD = (1 << 1) |
| hwcap_EVTSTRM = (1 << 2) |
| hwcap_AES = (1 << 3) |
| hwcap_PMULL = (1 << 4) |
| hwcap_SHA1 = (1 << 5) |
| hwcap_SHA2 = (1 << 6) |
| hwcap_CRC32 = (1 << 7) |
| hwcap_ATOMICS = (1 << 8) |
| hwcap_FPHP = (1 << 9) |
| hwcap_ASIMDHP = (1 << 10) |
| hwcap_CPUID = (1 << 11) |
| hwcap_ASIMDRDM = (1 << 12) |
| hwcap_JSCVT = (1 << 13) |
| hwcap_FCMA = (1 << 14) |
| hwcap_LRCPC = (1 << 15) |
| hwcap_DCPOP = (1 << 16) |
| hwcap_SHA3 = (1 << 17) |
| hwcap_SM3 = (1 << 18) |
| hwcap_SM4 = (1 << 19) |
| hwcap_ASIMDDP = (1 << 20) |
| hwcap_SHA512 = (1 << 21) |
| hwcap_SVE = (1 << 22) |
| hwcap_ASIMDFHM = (1 << 23) |
| ) |
| |
| func doinit() { |
| options = []option{ |
| {"evtstrm", &ARM64.HasEVTSTRM}, |
| {"aes", &ARM64.HasAES}, |
| {"pmull", &ARM64.HasPMULL}, |
| {"sha1", &ARM64.HasSHA1}, |
| {"sha2", &ARM64.HasSHA2}, |
| {"crc32", &ARM64.HasCRC32}, |
| {"atomics", &ARM64.HasATOMICS}, |
| {"fphp", &ARM64.HasFPHP}, |
| {"asimdhp", &ARM64.HasASIMDHP}, |
| {"cpuid", &ARM64.HasCPUID}, |
| {"asimdrdm", &ARM64.HasASIMDRDM}, |
| {"jscvt", &ARM64.HasJSCVT}, |
| {"fcma", &ARM64.HasFCMA}, |
| {"lrcpc", &ARM64.HasLRCPC}, |
| {"dcpop", &ARM64.HasDCPOP}, |
| {"sha3", &ARM64.HasSHA3}, |
| {"sm3", &ARM64.HasSM3}, |
| {"sm4", &ARM64.HasSM4}, |
| {"asimddp", &ARM64.HasASIMDDP}, |
| {"sha512", &ARM64.HasSHA512}, |
| {"sve", &ARM64.HasSVE}, |
| {"asimdfhm", &ARM64.HasASIMDFHM}, |
| |
| // These capabilities should always be enabled on arm64: |
| // {"fp", &ARM64.HasFP}, |
| // {"asimd", &ARM64.HasASIMD}, |
| } |
| |
| // HWCAP feature bits |
| ARM64.HasFP = isSet(hwcap, hwcap_FP) |
| ARM64.HasASIMD = isSet(hwcap, hwcap_ASIMD) |
| ARM64.HasEVTSTRM = isSet(hwcap, hwcap_EVTSTRM) |
| ARM64.HasAES = isSet(hwcap, hwcap_AES) |
| ARM64.HasPMULL = isSet(hwcap, hwcap_PMULL) |
| ARM64.HasSHA1 = isSet(hwcap, hwcap_SHA1) |
| ARM64.HasSHA2 = isSet(hwcap, hwcap_SHA2) |
| ARM64.HasCRC32 = isSet(hwcap, hwcap_CRC32) |
| ARM64.HasATOMICS = isSet(hwcap, hwcap_ATOMICS) |
| ARM64.HasFPHP = isSet(hwcap, hwcap_FPHP) |
| ARM64.HasASIMDHP = isSet(hwcap, hwcap_ASIMDHP) |
| ARM64.HasCPUID = isSet(hwcap, hwcap_CPUID) |
| ARM64.HasASIMDRDM = isSet(hwcap, hwcap_ASIMDRDM) |
| ARM64.HasJSCVT = isSet(hwcap, hwcap_JSCVT) |
| ARM64.HasFCMA = isSet(hwcap, hwcap_FCMA) |
| ARM64.HasLRCPC = isSet(hwcap, hwcap_LRCPC) |
| ARM64.HasDCPOP = isSet(hwcap, hwcap_DCPOP) |
| ARM64.HasSHA3 = isSet(hwcap, hwcap_SHA3) |
| ARM64.HasSM3 = isSet(hwcap, hwcap_SM3) |
| ARM64.HasSM4 = isSet(hwcap, hwcap_SM4) |
| ARM64.HasASIMDDP = isSet(hwcap, hwcap_ASIMDDP) |
| ARM64.HasSHA512 = isSet(hwcap, hwcap_SHA512) |
| ARM64.HasSVE = isSet(hwcap, hwcap_SVE) |
| ARM64.HasASIMDFHM = isSet(hwcap, hwcap_ASIMDFHM) |
| } |
| |
| func isSet(hwc uint, value uint) bool { |
| return hwc&value != 0 |
| } |