Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 1 | //===-- TargetParser - Parser for target features ---------------*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file implements a target parser to recognise hardware features such as |
| 11 | // FPU/CPU/ARCH names as well as specific support such as HDIV, etc. |
| 12 | // |
| 13 | //===----------------------------------------------------------------------===// |
| 14 | |
| 15 | #ifndef LLVM_SUPPORT_TARGETPARSER_H |
| 16 | #define LLVM_SUPPORT_TARGETPARSER_H |
| 17 | |
| 18 | // FIXME: vector is used because that's what clang uses for subtarget feature |
| 19 | // lists, but SmallVector would probably be better |
| 20 | #include "llvm/ADT/Triple.h" |
| 21 | #include <vector> |
| 22 | |
| 23 | namespace llvm { |
| 24 | class StringRef; |
| 25 | |
| 26 | // Target specific information into their own namespaces. These should be |
| 27 | // generated from TableGen because the information is already there, and there |
| 28 | // is where new information about targets will be added. |
| 29 | // FIXME: To TableGen this we need to make some table generated files available |
| 30 | // even if the back-end is not compiled with LLVM, plus we need to create a new |
| 31 | // back-end to TableGen to create these clean tables. |
| 32 | namespace ARM { |
| 33 | |
| 34 | // FPU Version |
| 35 | enum class FPUVersion { |
| 36 | NONE, |
| 37 | VFPV2, |
| 38 | VFPV3, |
| 39 | VFPV3_FP16, |
| 40 | VFPV4, |
| 41 | VFPV5 |
| 42 | }; |
| 43 | |
| 44 | // An FPU name restricts the FPU in one of three ways: |
| 45 | enum class FPURestriction { |
| 46 | None = 0, ///< No restriction |
| 47 | D16, ///< Only 16 D registers |
| 48 | SP_D16 ///< Only single-precision instructions, with 16 D registers |
| 49 | }; |
| 50 | |
| 51 | // An FPU name implies one of three levels of Neon support: |
| 52 | enum class NeonSupportLevel { |
| 53 | None = 0, ///< No Neon |
| 54 | Neon, ///< Neon |
| 55 | Crypto ///< Neon with Crypto |
| 56 | }; |
| 57 | |
| 58 | // FPU names. |
| 59 | enum FPUKind { |
| 60 | #define ARM_FPU(NAME, KIND, VERSION, NEON_SUPPORT, RESTRICTION) KIND, |
| 61 | #include "ARMTargetParser.def" |
| 62 | FK_LAST |
| 63 | }; |
| 64 | |
| 65 | // Arch names. |
| 66 | enum class ArchKind { |
| 67 | #define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT) ID, |
| 68 | #include "ARMTargetParser.def" |
| 69 | }; |
| 70 | |
| 71 | // Arch extension modifiers for CPUs. |
| 72 | enum ArchExtKind : unsigned { |
| 73 | AEK_INVALID = 0, |
| 74 | AEK_NONE = 1, |
| 75 | AEK_CRC = 1 << 1, |
| 76 | AEK_CRYPTO = 1 << 2, |
| 77 | AEK_FP = 1 << 3, |
| 78 | AEK_HWDIVTHUMB = 1 << 4, |
| 79 | AEK_HWDIVARM = 1 << 5, |
| 80 | AEK_MP = 1 << 6, |
| 81 | AEK_SIMD = 1 << 7, |
| 82 | AEK_SEC = 1 << 8, |
| 83 | AEK_VIRT = 1 << 9, |
| 84 | AEK_DSP = 1 << 10, |
| 85 | AEK_FP16 = 1 << 11, |
| 86 | AEK_RAS = 1 << 12, |
| 87 | AEK_SVE = 1 << 13, |
| 88 | AEK_DOTPROD = 1 << 14, |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame^] | 89 | AEK_SHA2 = 1 << 15, |
| 90 | AEK_AES = 1 << 16, |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 91 | // Unsupported extensions. |
| 92 | AEK_OS = 0x8000000, |
| 93 | AEK_IWMMXT = 0x10000000, |
| 94 | AEK_IWMMXT2 = 0x20000000, |
| 95 | AEK_MAVERICK = 0x40000000, |
| 96 | AEK_XSCALE = 0x80000000, |
| 97 | }; |
| 98 | |
| 99 | // ISA kinds. |
| 100 | enum class ISAKind { INVALID = 0, ARM, THUMB, AARCH64 }; |
| 101 | |
| 102 | // Endianness |
| 103 | // FIXME: BE8 vs. BE32? |
| 104 | enum class EndianKind { INVALID = 0, LITTLE, BIG }; |
| 105 | |
| 106 | // v6/v7/v8 Profile |
| 107 | enum class ProfileKind { INVALID = 0, A, R, M }; |
| 108 | |
| 109 | StringRef getCanonicalArchName(StringRef Arch); |
| 110 | |
| 111 | // Information by ID |
| 112 | StringRef getFPUName(unsigned FPUKind); |
| 113 | FPUVersion getFPUVersion(unsigned FPUKind); |
| 114 | NeonSupportLevel getFPUNeonSupportLevel(unsigned FPUKind); |
| 115 | FPURestriction getFPURestriction(unsigned FPUKind); |
| 116 | |
| 117 | // FIXME: These should be moved to TargetTuple once it exists |
| 118 | bool getFPUFeatures(unsigned FPUKind, std::vector<StringRef> &Features); |
| 119 | bool getHWDivFeatures(unsigned HWDivKind, std::vector<StringRef> &Features); |
| 120 | bool getExtensionFeatures(unsigned Extensions, |
| 121 | std::vector<StringRef> &Features); |
| 122 | |
| 123 | StringRef getArchName(ArchKind AK); |
| 124 | unsigned getArchAttr(ArchKind AK); |
| 125 | StringRef getCPUAttr(ArchKind AK); |
| 126 | StringRef getSubArch(ArchKind AK); |
| 127 | StringRef getArchExtName(unsigned ArchExtKind); |
| 128 | StringRef getArchExtFeature(StringRef ArchExt); |
| 129 | StringRef getHWDivName(unsigned HWDivKind); |
| 130 | |
| 131 | // Information by Name |
| 132 | unsigned getDefaultFPU(StringRef CPU, ArchKind AK); |
| 133 | unsigned getDefaultExtensions(StringRef CPU, ArchKind AK); |
| 134 | StringRef getDefaultCPU(StringRef Arch); |
| 135 | |
| 136 | // Parser |
| 137 | unsigned parseHWDiv(StringRef HWDiv); |
| 138 | unsigned parseFPU(StringRef FPU); |
| 139 | ArchKind parseArch(StringRef Arch); |
| 140 | unsigned parseArchExt(StringRef ArchExt); |
| 141 | ArchKind parseCPUArch(StringRef CPU); |
| 142 | void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values); |
| 143 | ISAKind parseArchISA(StringRef Arch); |
| 144 | EndianKind parseArchEndian(StringRef Arch); |
| 145 | ProfileKind parseArchProfile(StringRef Arch); |
| 146 | unsigned parseArchVersion(StringRef Arch); |
| 147 | |
| 148 | StringRef computeDefaultTargetABI(const Triple &TT, StringRef CPU); |
| 149 | |
| 150 | } // namespace ARM |
| 151 | |
| 152 | // FIXME:This should be made into class design,to avoid dupplication. |
| 153 | namespace AArch64 { |
| 154 | |
| 155 | // Arch names. |
| 156 | enum class ArchKind { |
| 157 | #define AARCH64_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT) ID, |
| 158 | #include "AArch64TargetParser.def" |
| 159 | }; |
| 160 | |
| 161 | // Arch extension modifiers for CPUs. |
| 162 | enum ArchExtKind : unsigned { |
| 163 | AEK_INVALID = 0, |
| 164 | AEK_NONE = 1, |
| 165 | AEK_CRC = 1 << 1, |
| 166 | AEK_CRYPTO = 1 << 2, |
| 167 | AEK_FP = 1 << 3, |
| 168 | AEK_SIMD = 1 << 4, |
| 169 | AEK_FP16 = 1 << 5, |
| 170 | AEK_PROFILE = 1 << 6, |
| 171 | AEK_RAS = 1 << 7, |
| 172 | AEK_LSE = 1 << 8, |
| 173 | AEK_SVE = 1 << 9, |
| 174 | AEK_DOTPROD = 1 << 10, |
| 175 | AEK_RCPC = 1 << 11, |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame^] | 176 | AEK_RDM = 1 << 12, |
| 177 | AEK_SM4 = 1 << 13, |
| 178 | AEK_SHA3 = 1 << 14, |
| 179 | AEK_SHA2 = 1 << 15, |
| 180 | AEK_AES = 1 << 16, |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 181 | }; |
| 182 | |
| 183 | StringRef getCanonicalArchName(StringRef Arch); |
| 184 | |
| 185 | // Information by ID |
| 186 | StringRef getFPUName(unsigned FPUKind); |
| 187 | ARM::FPUVersion getFPUVersion(unsigned FPUKind); |
| 188 | ARM::NeonSupportLevel getFPUNeonSupportLevel(unsigned FPUKind); |
| 189 | ARM::FPURestriction getFPURestriction(unsigned FPUKind); |
| 190 | |
| 191 | // FIXME: These should be moved to TargetTuple once it exists |
| 192 | bool getFPUFeatures(unsigned FPUKind, std::vector<StringRef> &Features); |
| 193 | bool getExtensionFeatures(unsigned Extensions, |
| 194 | std::vector<StringRef> &Features); |
| 195 | bool getArchFeatures(ArchKind AK, std::vector<StringRef> &Features); |
| 196 | |
| 197 | StringRef getArchName(ArchKind AK); |
| 198 | unsigned getArchAttr(ArchKind AK); |
| 199 | StringRef getCPUAttr(ArchKind AK); |
| 200 | StringRef getSubArch(ArchKind AK); |
| 201 | StringRef getArchExtName(unsigned ArchExtKind); |
| 202 | StringRef getArchExtFeature(StringRef ArchExt); |
| 203 | unsigned checkArchVersion(StringRef Arch); |
| 204 | |
| 205 | // Information by Name |
| 206 | unsigned getDefaultFPU(StringRef CPU, ArchKind AK); |
| 207 | unsigned getDefaultExtensions(StringRef CPU, ArchKind AK); |
| 208 | StringRef getDefaultCPU(StringRef Arch); |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame^] | 209 | AArch64::ArchKind getCPUArchKind(StringRef CPU); |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 210 | |
| 211 | // Parser |
| 212 | unsigned parseFPU(StringRef FPU); |
| 213 | AArch64::ArchKind parseArch(StringRef Arch); |
| 214 | ArchExtKind parseArchExt(StringRef ArchExt); |
| 215 | ArchKind parseCPUArch(StringRef CPU); |
| 216 | void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values); |
| 217 | ARM::ISAKind parseArchISA(StringRef Arch); |
| 218 | ARM::EndianKind parseArchEndian(StringRef Arch); |
| 219 | ARM::ProfileKind parseArchProfile(StringRef Arch); |
| 220 | unsigned parseArchVersion(StringRef Arch); |
| 221 | |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame^] | 222 | bool isX18ReservedByDefault(const Triple &TT); |
| 223 | |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 224 | } // namespace AArch64 |
| 225 | |
| 226 | namespace X86 { |
| 227 | |
| 228 | // This should be kept in sync with libcc/compiler-rt as its included by clang |
| 229 | // as a proxy for what's in libgcc/compiler-rt. |
| 230 | enum ProcessorVendors : unsigned { |
| 231 | VENDOR_DUMMY, |
| 232 | #define X86_VENDOR(ENUM, STRING) \ |
| 233 | ENUM, |
| 234 | #include "llvm/Support/X86TargetParser.def" |
| 235 | VENDOR_OTHER |
| 236 | }; |
| 237 | |
| 238 | // This should be kept in sync with libcc/compiler-rt as its included by clang |
| 239 | // as a proxy for what's in libgcc/compiler-rt. |
| 240 | enum ProcessorTypes : unsigned { |
| 241 | CPU_TYPE_DUMMY, |
| 242 | #define X86_CPU_TYPE(ARCHNAME, ENUM) \ |
| 243 | ENUM, |
| 244 | #include "llvm/Support/X86TargetParser.def" |
| 245 | CPU_TYPE_MAX |
| 246 | }; |
| 247 | |
| 248 | // This should be kept in sync with libcc/compiler-rt as its included by clang |
| 249 | // as a proxy for what's in libgcc/compiler-rt. |
| 250 | enum ProcessorSubtypes : unsigned { |
| 251 | CPU_SUBTYPE_DUMMY, |
| 252 | #define X86_CPU_SUBTYPE(ARCHNAME, ENUM) \ |
| 253 | ENUM, |
| 254 | #include "llvm/Support/X86TargetParser.def" |
| 255 | CPU_SUBTYPE_MAX |
| 256 | }; |
| 257 | |
| 258 | // This should be kept in sync with libcc/compiler-rt as it should be used |
| 259 | // by clang as a proxy for what's in libgcc/compiler-rt. |
| 260 | enum ProcessorFeatures { |
| 261 | #define X86_FEATURE(VAL, ENUM) \ |
| 262 | ENUM = VAL, |
| 263 | #include "llvm/Support/X86TargetParser.def" |
| 264 | |
| 265 | }; |
| 266 | |
| 267 | } // namespace X86 |
| 268 | |
| 269 | } // namespace llvm |
| 270 | |
| 271 | #endif |