blob: 487ccf8e424b26f6511a6f8c78c5bc101f2ba987 [file] [log] [blame]
// 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
}