// Copyright 2015, VIXL authors // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of ARM Limited nor the names of its contributors may be // used to endorse or promote products derived from this software without // specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
CPUFeatures AA64PFR0::GetCPUFeatures() const {
CPUFeatures f; if (Get(kFP) >= 0) f.Combine(CPUFeatures::kFP); if (Get(kFP) >= 1) f.Combine(CPUFeatures::kFPHalf); if (Get(kAdvSIMD) >= 0) f.Combine(CPUFeatures::kNEON); if (Get(kAdvSIMD) >= 1) f.Combine(CPUFeatures::kNEONHalf); if (Get(kRAS) >= 1) f.Combine(CPUFeatures::kRAS); if (Get(kSVE) >= 1) f.Combine(CPUFeatures::kSVE); if (Get(kDIT) >= 1) f.Combine(CPUFeatures::kDIT); if (Get(kCSV2) >= 1) f.Combine(CPUFeatures::kCSV2); if (Get(kCSV2) >= 2) f.Combine(CPUFeatures::kSCXTNUM); if (Get(kCSV3) >= 1) f.Combine(CPUFeatures::kCSV3); return f;
}
CPUFeatures AA64PFR1::GetCPUFeatures() const {
CPUFeatures f; if (Get(kBT) >= 1) f.Combine(CPUFeatures::kBTI); if (Get(kSSBS) >= 1) f.Combine(CPUFeatures::kSSBS); if (Get(kSSBS) >= 2) f.Combine(CPUFeatures::kSSBSControl); if (Get(kMTE) >= 1) f.Combine(CPUFeatures::kMTEInstructions); if (Get(kMTE) >= 2) f.Combine(CPUFeatures::kMTE); if (Get(kMTE) >= 3) f.Combine(CPUFeatures::kMTE3); if (Get(kSME) >= 1) f.Combine(CPUFeatures::kSME); return f;
}
CPUFeatures AA64ISAR0::GetCPUFeatures() const {
CPUFeatures f; if (Get(kAES) >= 1) f.Combine(CPUFeatures::kAES); if (Get(kAES) >= 2) f.Combine(CPUFeatures::kPmull1Q); if (Get(kSHA1) >= 1) f.Combine(CPUFeatures::kSHA1); if (Get(kSHA2) >= 1) f.Combine(CPUFeatures::kSHA2); if (Get(kSHA2) >= 2) f.Combine(CPUFeatures::kSHA512); if (Get(kCRC32) >= 1) f.Combine(CPUFeatures::kCRC32); if (Get(kAtomic) >= 1) f.Combine(CPUFeatures::kAtomics); if (Get(kRDM) >= 1) f.Combine(CPUFeatures::kRDM); if (Get(kSHA3) >= 1) f.Combine(CPUFeatures::kSHA3); if (Get(kSM3) >= 1) f.Combine(CPUFeatures::kSM3); if (Get(kSM4) >= 1) f.Combine(CPUFeatures::kSM4); if (Get(kDP) >= 1) f.Combine(CPUFeatures::kDotProduct); if (Get(kFHM) >= 1) f.Combine(CPUFeatures::kFHM); if (Get(kTS) >= 1) f.Combine(CPUFeatures::kFlagM); if (Get(kTS) >= 2) f.Combine(CPUFeatures::kAXFlag); if (Get(kRNDR) >= 1) f.Combine(CPUFeatures::kRNG); return f;
}
CPUFeatures AA64ISAR1::GetCPUFeatures() const {
CPUFeatures f; if (Get(kDPB) >= 1) f.Combine(CPUFeatures::kDCPoP); if (Get(kDPB) >= 2) f.Combine(CPUFeatures::kDCCVADP); if (Get(kJSCVT) >= 1) f.Combine(CPUFeatures::kJSCVT); if (Get(kFCMA) >= 1) f.Combine(CPUFeatures::kFcma); if (Get(kLRCPC) >= 1) f.Combine(CPUFeatures::kRCpc); if (Get(kLRCPC) >= 2) f.Combine(CPUFeatures::kRCpcImm); if (Get(kFRINTTS) >= 1) f.Combine(CPUFeatures::kFrintToFixedSizedInt); if (Get(kSB) >= 1) f.Combine(CPUFeatures::kSB); if (Get(kSPECRES) >= 1) f.Combine(CPUFeatures::kSPECRES); if (Get(kBF16) >= 1) f.Combine(CPUFeatures::kBF16); if (Get(kBF16) >= 2) f.Combine(CPUFeatures::kEBF16); if (Get(kDGH) >= 1) f.Combine(CPUFeatures::kDGH); if (Get(kI8MM) >= 1) f.Combine(CPUFeatures::kI8MM);
// Only one of these fields should be non-zero, but they have the same // encodings, so merge the logic. int apx = std::max(Get(kAPI), Get(kAPA)); if (apx >= 1) {
f.Combine(CPUFeatures::kPAuth); // APA (rather than API) indicates QARMA. if (Get(kAPA) >= 1) f.Combine(CPUFeatures::kPAuthQARMA); if (apx == 0b0010) f.Combine(CPUFeatures::kPAuthEnhancedPAC); if (apx >= 0b0011) f.Combine(CPUFeatures::kPAuthEnhancedPAC2); if (apx >= 0b0100) f.Combine(CPUFeatures::kPAuthFPAC); if (apx >= 0b0101) f.Combine(CPUFeatures::kPAuthFPACCombined);
}
if (Get(kGPI) >= 1) f.Combine(CPUFeatures::kPAuthGeneric); if (Get(kGPA) >= 1) {
f.Combine(CPUFeatures::kPAuthGeneric, CPUFeatures::kPAuthGenericQARMA);
} return f;
}
CPUFeatures AA64ISAR2::GetCPUFeatures() const {
CPUFeatures f; if (Get(kWFXT) >= 2) f.Combine(CPUFeatures::kWFXT); if (Get(kRPRES) >= 1) f.Combine(CPUFeatures::kRPRES); if (Get(kMOPS) >= 1) f.Combine(CPUFeatures::kMOPS); if (Get(kCSSC) >= 1) f.Combine(CPUFeatures::kCSSC); return f;
}
CPUFeatures AA64ZFR0::GetCPUFeatures() const { // This register is only available with SVE, but reads-as-zero in its absence, // so it's always safe to read it.
CPUFeatures f; if (Get(kF64MM) >= 1) f.Combine(CPUFeatures::kSVEF64MM); if (Get(kF32MM) >= 1) f.Combine(CPUFeatures::kSVEF32MM); if (Get(kI8MM) >= 1) f.Combine(CPUFeatures::kSVEI8MM); if (Get(kSM4) >= 1) f.Combine(CPUFeatures::kSVESM4); if (Get(kSHA3) >= 1) f.Combine(CPUFeatures::kSVESHA3); if (Get(kBF16) >= 1) f.Combine(CPUFeatures::kSVEBF16); if (Get(kBF16) >= 2) f.Combine(CPUFeatures::kSVE_EBF16); if (Get(kBitPerm) >= 1) f.Combine(CPUFeatures::kSVEBitPerm); if (Get(kAES) >= 1) f.Combine(CPUFeatures::kSVEAES); if (Get(kAES) >= 2) f.Combine(CPUFeatures::kSVEPmull128); if (Get(kSVEver) >= 1) f.Combine(CPUFeatures::kSVE2); return f;
}
CPUFeatures AA64SMFR0::GetCPUFeatures() const {
CPUFeatures f; if (Get(kSMEf32f32) >= 1) f.Combine(CPUFeatures::kSMEf32f32); if (Get(kSMEb16f32) >= 1) f.Combine(CPUFeatures::kSMEb16f32); if (Get(kSMEf16f32) >= 1) f.Combine(CPUFeatures::kSMEf16f32); if (Get(kSMEi8i32) >= 15) f.Combine(CPUFeatures::kSMEi8i32); if (Get(kSMEf64f64) >= 1) f.Combine(CPUFeatures::kSMEf64f64); if (Get(kSMEi16i64) >= 15) f.Combine(CPUFeatures::kSMEi16i64); if (Get(kSMEfa64) >= 1) f.Combine(CPUFeatures::kSMEfa64); return f;
}
int IDRegister::Get(IDRegister::Field field) const { int msb = field.GetMsb(); int lsb = field.GetLsb();
VIXL_STATIC_ASSERT(static_cast<size_t>(Field::kMaxWidthInBits) <
(sizeof(int) * kBitsPerByte)); switch (field.GetType()) { case Field::kSigned: return static_cast<int>(ExtractSignedBitfield64(msb, lsb, value_)); case Field::kUnsigned: return static_cast<int>(ExtractUnsignedBitfield64(msb, lsb, value_));
}
VIXL_UNREACHABLE(); return0;
}
// MTE support from HWCAP2 signifies FEAT_MTE1 and FEAT_MTE2 support if (features.Has(CPUFeatures::kMTE)) {
features.Combine(CPUFeatures::kMTEInstructions);
} #elifdefined(XP_DARWIN) // Apple processors have kJSCVT, kDotProduct, and kAtomics features.
features.Combine(CPUFeatures::kJSCVT, CPUFeatures::kDotProduct,
CPUFeatures::kAtomics); #endif// VIXL_USE_LINUX_HWCAP
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.