Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame^] | 1 | //===-- X86TargetParser - Parser for X86 features ---------------*- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file implements a target parser to recognise X86 hardware features. |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| 13 | #ifndef LLVM_SUPPORT_X86TARGETPARSERCOMMON_H |
| 14 | #define LLVM_SUPPORT_X86TARGETPARSERCOMMON_H |
| 15 | |
| 16 | #include "llvm/ADT/SmallVector.h" |
| 17 | #include "llvm/ADT/StringMap.h" |
| 18 | |
| 19 | namespace llvm { |
| 20 | class StringRef; |
| 21 | |
| 22 | namespace X86 { |
| 23 | |
| 24 | // This should be kept in sync with libcc/compiler-rt as its included by clang |
| 25 | // as a proxy for what's in libgcc/compiler-rt. |
| 26 | enum ProcessorVendors : unsigned { |
| 27 | VENDOR_DUMMY, |
| 28 | #define X86_VENDOR(ENUM, STRING) \ |
| 29 | ENUM, |
| 30 | #include "llvm/Support/X86TargetParser.def" |
| 31 | VENDOR_OTHER |
| 32 | }; |
| 33 | |
| 34 | // This should be kept in sync with libcc/compiler-rt as its included by clang |
| 35 | // as a proxy for what's in libgcc/compiler-rt. |
| 36 | enum ProcessorTypes : unsigned { |
| 37 | CPU_TYPE_DUMMY, |
| 38 | #define X86_CPU_TYPE(ENUM, STRING) \ |
| 39 | ENUM, |
| 40 | #include "llvm/Support/X86TargetParser.def" |
| 41 | CPU_TYPE_MAX |
| 42 | }; |
| 43 | |
| 44 | // This should be kept in sync with libcc/compiler-rt as its included by clang |
| 45 | // as a proxy for what's in libgcc/compiler-rt. |
| 46 | enum ProcessorSubtypes : unsigned { |
| 47 | CPU_SUBTYPE_DUMMY, |
| 48 | #define X86_CPU_SUBTYPE(ENUM, STRING) \ |
| 49 | ENUM, |
| 50 | #include "llvm/Support/X86TargetParser.def" |
| 51 | CPU_SUBTYPE_MAX |
| 52 | }; |
| 53 | |
| 54 | // This should be kept in sync with libcc/compiler-rt as it should be used |
| 55 | // by clang as a proxy for what's in libgcc/compiler-rt. |
| 56 | enum ProcessorFeatures { |
| 57 | #define X86_FEATURE(ENUM, STRING) FEATURE_##ENUM, |
| 58 | #include "llvm/Support/X86TargetParser.def" |
| 59 | CPU_FEATURE_MAX |
| 60 | }; |
| 61 | |
| 62 | enum CPUKind { |
| 63 | CK_None, |
| 64 | CK_i386, |
| 65 | CK_i486, |
| 66 | CK_WinChipC6, |
| 67 | CK_WinChip2, |
| 68 | CK_C3, |
| 69 | CK_i586, |
| 70 | CK_Pentium, |
| 71 | CK_PentiumMMX, |
| 72 | CK_PentiumPro, |
| 73 | CK_i686, |
| 74 | CK_Pentium2, |
| 75 | CK_Pentium3, |
| 76 | CK_PentiumM, |
| 77 | CK_C3_2, |
| 78 | CK_Yonah, |
| 79 | CK_Pentium4, |
| 80 | CK_Prescott, |
| 81 | CK_Nocona, |
| 82 | CK_Core2, |
| 83 | CK_Penryn, |
| 84 | CK_Bonnell, |
| 85 | CK_Silvermont, |
| 86 | CK_Goldmont, |
| 87 | CK_GoldmontPlus, |
| 88 | CK_Tremont, |
| 89 | CK_Nehalem, |
| 90 | CK_Westmere, |
| 91 | CK_SandyBridge, |
| 92 | CK_IvyBridge, |
| 93 | CK_Haswell, |
| 94 | CK_Broadwell, |
| 95 | CK_SkylakeClient, |
| 96 | CK_SkylakeServer, |
| 97 | CK_Cascadelake, |
| 98 | CK_Cooperlake, |
| 99 | CK_Cannonlake, |
| 100 | CK_IcelakeClient, |
| 101 | CK_IcelakeServer, |
| 102 | CK_Tigerlake, |
| 103 | CK_SapphireRapids, |
| 104 | CK_Alderlake, |
| 105 | CK_KNL, |
| 106 | CK_KNM, |
| 107 | CK_Lakemont, |
| 108 | CK_K6, |
| 109 | CK_K6_2, |
| 110 | CK_K6_3, |
| 111 | CK_Athlon, |
| 112 | CK_AthlonXP, |
| 113 | CK_K8, |
| 114 | CK_K8SSE3, |
| 115 | CK_AMDFAM10, |
| 116 | CK_BTVER1, |
| 117 | CK_BTVER2, |
| 118 | CK_BDVER1, |
| 119 | CK_BDVER2, |
| 120 | CK_BDVER3, |
| 121 | CK_BDVER4, |
| 122 | CK_ZNVER1, |
| 123 | CK_ZNVER2, |
| 124 | CK_ZNVER3, |
| 125 | CK_x86_64, |
| 126 | CK_x86_64_v2, |
| 127 | CK_x86_64_v3, |
| 128 | CK_x86_64_v4, |
| 129 | CK_Geode, |
| 130 | }; |
| 131 | |
| 132 | /// Parse \p CPU string into a CPUKind. Will only accept 64-bit capable CPUs if |
| 133 | /// \p Only64Bit is true. |
| 134 | CPUKind parseArchX86(StringRef CPU, bool Only64Bit = false); |
| 135 | CPUKind parseTuneCPU(StringRef CPU, bool Only64Bit = false); |
| 136 | |
| 137 | /// Provide a list of valid CPU names. If \p Only64Bit is true, the list will |
| 138 | /// only contain 64-bit capable CPUs. |
| 139 | void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, |
| 140 | bool Only64Bit = false); |
| 141 | /// Provide a list of valid -mtune names. |
| 142 | void fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values, |
| 143 | bool Only64Bit = false); |
| 144 | |
| 145 | /// Get the key feature prioritizing target multiversioning. |
| 146 | ProcessorFeatures getKeyFeature(CPUKind Kind); |
| 147 | |
| 148 | /// Fill in the features that \p CPU supports into \p Features. |
| 149 | void getFeaturesForCPU(StringRef CPU, SmallVectorImpl<StringRef> &Features); |
| 150 | |
| 151 | /// Set or clear entries in \p Features that are implied to be enabled/disabled |
| 152 | /// by the provided \p Feature. |
| 153 | void updateImpliedFeatures(StringRef Feature, bool Enabled, |
| 154 | StringMap<bool> &Features); |
| 155 | |
| 156 | } // namespace X86 |
| 157 | } // namespace llvm |
| 158 | |
| 159 | #endif |