//===-- X86TargetParser - Parser for X86 features ---------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements a target parser to recognise X86 hardware features. // //===----------------------------------------------------------------------===// #ifndef LLVM_TARGETPARSER_X86TARGETPARSER_H #define LLVM_TARGETPARSER_X86TARGETPARSER_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringMap.h" namespace llvm { template class SmallVectorImpl; class StringRef; namespace X86 { // This should be kept in sync with libcc/compiler-rt as its included by clang // as a proxy for what's in libgcc/compiler-rt. enum ProcessorVendors : unsigned { VENDOR_DUMMY, #define X86_VENDOR(ENUM, STRING) \ ENUM, #include "llvm/TargetParser/X86TargetParser.def" VENDOR_OTHER }; // This should be kept in sync with libcc/compiler-rt as its included by clang // as a proxy for what's in libgcc/compiler-rt. enum ProcessorTypes : unsigned { CPU_TYPE_DUMMY, #define X86_CPU_TYPE(ENUM, STRING) \ ENUM, #include "llvm/TargetParser/X86TargetParser.def" CPU_TYPE_MAX }; // This should be kept in sync with libcc/compiler-rt as its included by clang // as a proxy for what's in libgcc/compiler-rt. enum ProcessorSubtypes : unsigned { CPU_SUBTYPE_DUMMY, #define X86_CPU_SUBTYPE(ENUM, STRING) \ ENUM, #include "llvm/TargetParser/X86TargetParser.def" CPU_SUBTYPE_MAX }; // This should be kept in sync with libcc/compiler-rt as it should be used // by clang as a proxy for what's in libgcc/compiler-rt. enum ProcessorFeatures { #define X86_FEATURE(ENUM, STRING) FEATURE_##ENUM, #include "llvm/TargetParser/X86TargetParser.def" CPU_FEATURE_MAX }; enum CPUKind { CK_None, CK_i386, CK_i486, CK_WinChipC6, CK_WinChip2, CK_C3, CK_i586, CK_Pentium, CK_PentiumMMX, CK_PentiumPro, CK_i686, CK_Pentium2, CK_Pentium3, CK_PentiumM, CK_C3_2, CK_Yonah, CK_Pentium4, CK_Prescott, CK_Nocona, CK_Core2, CK_Penryn, CK_Bonnell, CK_Silvermont, CK_Goldmont, CK_GoldmontPlus, CK_Tremont, CK_Nehalem, CK_Westmere, CK_SandyBridge, CK_IvyBridge, CK_Haswell, CK_Broadwell, CK_SkylakeClient, CK_SkylakeServer, CK_Cascadelake, CK_Cooperlake, CK_Cannonlake, CK_IcelakeClient, CK_Rocketlake, CK_IcelakeServer, CK_Tigerlake, CK_SapphireRapids, CK_Alderlake, CK_Raptorlake, CK_Meteorlake, CK_Sierraforest, CK_Grandridge, CK_Graniterapids, CK_GraniterapidsD, CK_Emeraldrapids, CK_KNL, CK_KNM, CK_Lakemont, CK_K6, CK_K6_2, CK_K6_3, CK_Athlon, CK_AthlonXP, CK_K8, CK_K8SSE3, CK_AMDFAM10, CK_BTVER1, CK_BTVER2, CK_BDVER1, CK_BDVER2, CK_BDVER3, CK_BDVER4, CK_ZNVER1, CK_ZNVER2, CK_ZNVER3, CK_ZNVER4, CK_x86_64, CK_x86_64_v2, CK_x86_64_v3, CK_x86_64_v4, CK_Geode, }; /// Parse \p CPU string into a CPUKind. Will only accept 64-bit capable CPUs if /// \p Only64Bit is true. CPUKind parseArchX86(StringRef CPU, bool Only64Bit = false); CPUKind parseTuneCPU(StringRef CPU, bool Only64Bit = false); /// Provide a list of valid CPU names. If \p Only64Bit is true, the list will /// only contain 64-bit capable CPUs. void fillValidCPUArchList(SmallVectorImpl &Values, bool Only64Bit = false); /// Provide a list of valid -mtune names. void fillValidTuneCPUList(SmallVectorImpl &Values, bool Only64Bit = false); /// Get the key feature prioritizing target multiversioning. ProcessorFeatures getKeyFeature(CPUKind Kind); /// Fill in the features that \p CPU supports into \p Features. /// "+" will be append in front of each feature if IfNeedPlus is true. void getFeaturesForCPU(StringRef CPU, SmallVectorImpl &Features, bool IfNeedPlus = false); /// Set or clear entries in \p Features that are implied to be enabled/disabled /// by the provided \p Feature. void updateImpliedFeatures(StringRef Feature, bool Enabled, StringMap &Features); char getCPUDispatchMangling(StringRef Name); bool validateCPUSpecificCPUDispatch(StringRef Name); uint64_t getCpuSupportsMask(ArrayRef FeatureStrs); unsigned getFeaturePriority(ProcessorFeatures Feat); } // namespace X86 } // namespace llvm #endif