xref: /freebsd/contrib/llvm-project/llvm/lib/Target/X86/X86.td (revision c80e69b00d976a5a3b3e84527f270fa7e72a8205)
10b57cec5SDimitry Andric//===-- X86.td - Target definition file for the Intel X86 --*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// This is a target description file for the Intel i386 architecture, referred
100b57cec5SDimitry Andric// to here as the "X86" architecture.
110b57cec5SDimitry Andric//
120b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric
140b57cec5SDimitry Andric// Get the target-independent interfaces which we are implementing...
150b57cec5SDimitry Andric//
160b57cec5SDimitry Andricinclude "llvm/Target/Target.td"
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
190b57cec5SDimitry Andric// X86 Subtarget state
200b57cec5SDimitry Andric//
2181ad6265SDimitry Andric// disregarding specific ABI / programming model
2281ad6265SDimitry Andricdef Is64Bit : SubtargetFeature<"64bit-mode", "Is64Bit", "true",
230b57cec5SDimitry Andric                               "64-bit mode (x86_64)">;
2481ad6265SDimitry Andricdef Is32Bit : SubtargetFeature<"32bit-mode", "Is32Bit", "true",
250b57cec5SDimitry Andric                               "32-bit mode (80386)">;
2681ad6265SDimitry Andricdef Is16Bit : SubtargetFeature<"16bit-mode", "Is16Bit", "true",
270b57cec5SDimitry Andric                               "16-bit mode (i8086)">;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
30349cc55cSDimitry Andric// X86 Subtarget ISA features
310b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
320b57cec5SDimitry Andric
330b57cec5SDimitry Andricdef FeatureX87     : SubtargetFeature<"x87","HasX87", "true",
340b57cec5SDimitry Andric                                      "Enable X87 float instructions">;
350b57cec5SDimitry Andric
360b57cec5SDimitry Andricdef FeatureNOPL    : SubtargetFeature<"nopl", "HasNOPL", "true",
3781ad6265SDimitry Andric                                      "Enable NOPL instruction (generally pentium pro+)">;
380b57cec5SDimitry Andric
3981ad6265SDimitry Andricdef FeatureCMOV    : SubtargetFeature<"cmov","HasCMOV", "true",
400b57cec5SDimitry Andric                                      "Enable conditional move instructions">;
410b57cec5SDimitry Andric
4281ad6265SDimitry Andricdef FeatureCX8     : SubtargetFeature<"cx8", "HasCX8", "true",
430b57cec5SDimitry Andric                                      "Support CMPXCHG8B instructions">;
440b57cec5SDimitry Andric
45349cc55cSDimitry Andricdef FeatureCRC32   : SubtargetFeature<"crc32", "HasCRC32", "true",
4681ad6265SDimitry Andric                                      "Enable SSE 4.2 CRC32 instruction (used when SSE4.2 is supported but function is GPR only)">;
47349cc55cSDimitry Andric
480b57cec5SDimitry Andricdef FeaturePOPCNT   : SubtargetFeature<"popcnt", "HasPOPCNT", "true",
490b57cec5SDimitry Andric                                       "Support POPCNT instruction">;
500b57cec5SDimitry Andric
510b57cec5SDimitry Andricdef FeatureFXSR    : SubtargetFeature<"fxsr", "HasFXSR", "true",
520b57cec5SDimitry Andric                                      "Support fxsave/fxrestore instructions">;
530b57cec5SDimitry Andric
540b57cec5SDimitry Andricdef FeatureXSAVE   : SubtargetFeature<"xsave", "HasXSAVE", "true",
550b57cec5SDimitry Andric                                       "Support xsave instructions">;
560b57cec5SDimitry Andric
570b57cec5SDimitry Andricdef FeatureXSAVEOPT: SubtargetFeature<"xsaveopt", "HasXSAVEOPT", "true",
585ffd83dbSDimitry Andric                                       "Support xsaveopt instructions",
595ffd83dbSDimitry Andric                                       [FeatureXSAVE]>;
600b57cec5SDimitry Andric
610b57cec5SDimitry Andricdef FeatureXSAVEC  : SubtargetFeature<"xsavec", "HasXSAVEC", "true",
625ffd83dbSDimitry Andric                                       "Support xsavec instructions",
635ffd83dbSDimitry Andric                                       [FeatureXSAVE]>;
640b57cec5SDimitry Andric
650b57cec5SDimitry Andricdef FeatureXSAVES  : SubtargetFeature<"xsaves", "HasXSAVES", "true",
665ffd83dbSDimitry Andric                                       "Support xsaves instructions",
675ffd83dbSDimitry Andric                                       [FeatureXSAVE]>;
680b57cec5SDimitry Andric
690b57cec5SDimitry Andricdef FeatureSSE1    : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
700b57cec5SDimitry Andric                                      "Enable SSE instructions">;
710b57cec5SDimitry Andricdef FeatureSSE2    : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
720b57cec5SDimitry Andric                                      "Enable SSE2 instructions",
730b57cec5SDimitry Andric                                      [FeatureSSE1]>;
740b57cec5SDimitry Andricdef FeatureSSE3    : SubtargetFeature<"sse3", "X86SSELevel", "SSE3",
750b57cec5SDimitry Andric                                      "Enable SSE3 instructions",
760b57cec5SDimitry Andric                                      [FeatureSSE2]>;
770b57cec5SDimitry Andricdef FeatureSSSE3   : SubtargetFeature<"ssse3", "X86SSELevel", "SSSE3",
780b57cec5SDimitry Andric                                      "Enable SSSE3 instructions",
790b57cec5SDimitry Andric                                      [FeatureSSE3]>;
800b57cec5SDimitry Andricdef FeatureSSE41   : SubtargetFeature<"sse4.1", "X86SSELevel", "SSE41",
810b57cec5SDimitry Andric                                      "Enable SSE 4.1 instructions",
820b57cec5SDimitry Andric                                      [FeatureSSSE3]>;
830b57cec5SDimitry Andricdef FeatureSSE42   : SubtargetFeature<"sse4.2", "X86SSELevel", "SSE42",
840b57cec5SDimitry Andric                                      "Enable SSE 4.2 instructions",
850b57cec5SDimitry Andric                                      [FeatureSSE41]>;
860b57cec5SDimitry Andric// The MMX subtarget feature is separate from the rest of the SSE features
870b57cec5SDimitry Andric// because it's important (for odd compatibility reasons) to be able to
880b57cec5SDimitry Andric// turn it off explicitly while allowing SSE+ to be on.
890fca6ea1SDimitry Andricdef FeatureMMX     : SubtargetFeature<"mmx","HasMMX", "true",
900b57cec5SDimitry Andric                                      "Enable MMX instructions">;
910b57cec5SDimitry Andric// All x86-64 hardware has SSE2, but we don't mark SSE2 as an implied
920b57cec5SDimitry Andric// feature, because SSE2 can be disabled (e.g. for compiling OS kernels)
930b57cec5SDimitry Andric// without disabling 64-bit mode. Nothing should imply this feature bit. It
940b57cec5SDimitry Andric// is used to enforce that only 64-bit capable CPUs are used in 64-bit mode.
9581ad6265SDimitry Andricdef FeatureX86_64   : SubtargetFeature<"64bit", "HasX86_64", "true",
960b57cec5SDimitry Andric                                      "Support 64-bit instructions">;
9781ad6265SDimitry Andricdef FeatureCX16     : SubtargetFeature<"cx16", "HasCX16", "true",
9881ad6265SDimitry Andric                                       "64-bit with cmpxchg16b (this is true for most x86-64 chips, but not the first AMD chips)",
9981ad6265SDimitry Andric                                       [FeatureCX8]>;
1000b57cec5SDimitry Andricdef FeatureSSE4A   : SubtargetFeature<"sse4a", "HasSSE4A", "true",
1010b57cec5SDimitry Andric                                      "Support SSE 4a instructions",
1020b57cec5SDimitry Andric                                      [FeatureSSE3]>;
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andricdef FeatureAVX     : SubtargetFeature<"avx", "X86SSELevel", "AVX",
1050b57cec5SDimitry Andric                                      "Enable AVX instructions",
1060b57cec5SDimitry Andric                                      [FeatureSSE42]>;
1070b57cec5SDimitry Andricdef FeatureAVX2    : SubtargetFeature<"avx2", "X86SSELevel", "AVX2",
1080b57cec5SDimitry Andric                                      "Enable AVX2 instructions",
1090b57cec5SDimitry Andric                                      [FeatureAVX]>;
1100b57cec5SDimitry Andricdef FeatureFMA     : SubtargetFeature<"fma", "HasFMA", "true",
1110b57cec5SDimitry Andric                                      "Enable three-operand fused multiple-add",
1120b57cec5SDimitry Andric                                      [FeatureAVX]>;
1130b57cec5SDimitry Andricdef FeatureF16C    : SubtargetFeature<"f16c", "HasF16C", "true",
1140b57cec5SDimitry Andric                       "Support 16-bit floating point conversion instructions",
1150b57cec5SDimitry Andric                       [FeatureAVX]>;
1165f757f3fSDimitry Andricdef FeatureEVEX512  : SubtargetFeature<"evex512", "HasEVEX512", "true",
1175f757f3fSDimitry Andric                        "Support ZMM and 64-bit mask instructions">;
11881ad6265SDimitry Andricdef FeatureAVX512   : SubtargetFeature<"avx512f", "X86SSELevel", "AVX512",
1190b57cec5SDimitry Andric                                      "Enable AVX-512 instructions",
1200b57cec5SDimitry Andric                                      [FeatureAVX2, FeatureFMA, FeatureF16C]>;
1210b57cec5SDimitry Andricdef FeatureCDI      : SubtargetFeature<"avx512cd", "HasCDI", "true",
1220b57cec5SDimitry Andric                      "Enable AVX-512 Conflict Detection Instructions",
1230b57cec5SDimitry Andric                                      [FeatureAVX512]>;
1240b57cec5SDimitry Andricdef FeatureVPOPCNTDQ : SubtargetFeature<"avx512vpopcntdq", "HasVPOPCNTDQ",
1250b57cec5SDimitry Andric                       "true", "Enable AVX-512 Population Count Instructions",
1260b57cec5SDimitry Andric                                      [FeatureAVX512]>;
127bdd1243dSDimitry Andricdef FeaturePREFETCHI  : SubtargetFeature<"prefetchi", "HasPREFETCHI",
128bdd1243dSDimitry Andric                                   "true",
129bdd1243dSDimitry Andric                                   "Prefetch instruction with T0 or T1 Hint">;
1300b57cec5SDimitry Andricdef FeatureDQI     : SubtargetFeature<"avx512dq", "HasDQI", "true",
1310b57cec5SDimitry Andric                      "Enable AVX-512 Doubleword and Quadword Instructions",
1320b57cec5SDimitry Andric                                      [FeatureAVX512]>;
1330b57cec5SDimitry Andricdef FeatureBWI     : SubtargetFeature<"avx512bw", "HasBWI", "true",
1340b57cec5SDimitry Andric                      "Enable AVX-512 Byte and Word Instructions",
1350b57cec5SDimitry Andric                                      [FeatureAVX512]>;
1360b57cec5SDimitry Andricdef FeatureVLX     : SubtargetFeature<"avx512vl", "HasVLX", "true",
1370b57cec5SDimitry Andric                      "Enable AVX-512 Vector Length eXtensions",
1380b57cec5SDimitry Andric                                      [FeatureAVX512]>;
1390b57cec5SDimitry Andricdef FeatureVBMI     : SubtargetFeature<"avx512vbmi", "HasVBMI", "true",
1400b57cec5SDimitry Andric                      "Enable AVX-512 Vector Byte Manipulation Instructions",
1410b57cec5SDimitry Andric                                      [FeatureBWI]>;
1420b57cec5SDimitry Andricdef FeatureVBMI2    : SubtargetFeature<"avx512vbmi2", "HasVBMI2", "true",
1430b57cec5SDimitry Andric                      "Enable AVX-512 further Vector Byte Manipulation Instructions",
1440b57cec5SDimitry Andric                                      [FeatureBWI]>;
145bdd1243dSDimitry Andricdef FeatureAVXIFMA    : SubtargetFeature<"avxifma", "HasAVXIFMA", "true",
146bdd1243dSDimitry Andric                           "Enable AVX-IFMA",
147bdd1243dSDimitry Andric                           [FeatureAVX2]>;
1480b57cec5SDimitry Andricdef FeatureIFMA     : SubtargetFeature<"avx512ifma", "HasIFMA", "true",
1490b57cec5SDimitry Andric                      "Enable AVX-512 Integer Fused Multiple-Add",
1500b57cec5SDimitry Andric                                      [FeatureAVX512]>;
1510b57cec5SDimitry Andricdef FeaturePKU   : SubtargetFeature<"pku", "HasPKU", "true",
1520b57cec5SDimitry Andric                      "Enable protection keys">;
1530b57cec5SDimitry Andricdef FeatureVNNI    : SubtargetFeature<"avx512vnni", "HasVNNI", "true",
1540b57cec5SDimitry Andric                          "Enable AVX-512 Vector Neural Network Instructions",
1550b57cec5SDimitry Andric                                      [FeatureAVX512]>;
156e8d8bef9SDimitry Andricdef FeatureAVXVNNI    : SubtargetFeature<"avxvnni", "HasAVXVNNI", "true",
157e8d8bef9SDimitry Andric                           "Support AVX_VNNI encoding",
158e8d8bef9SDimitry Andric                                      [FeatureAVX2]>;
1590b57cec5SDimitry Andricdef FeatureBF16    : SubtargetFeature<"avx512bf16", "HasBF16", "true",
1600b57cec5SDimitry Andric                           "Support bfloat16 floating point",
1610b57cec5SDimitry Andric                                      [FeatureBWI]>;
1620b57cec5SDimitry Andricdef FeatureBITALG  : SubtargetFeature<"avx512bitalg", "HasBITALG", "true",
1630b57cec5SDimitry Andric                       "Enable AVX-512 Bit Algorithms",
1640b57cec5SDimitry Andric                        [FeatureBWI]>;
1650b57cec5SDimitry Andricdef FeatureVP2INTERSECT  : SubtargetFeature<"avx512vp2intersect",
1660b57cec5SDimitry Andric                                            "HasVP2INTERSECT", "true",
1670b57cec5SDimitry Andric                                            "Enable AVX-512 vp2intersect",
1680b57cec5SDimitry Andric                                            [FeatureAVX512]>;
169349cc55cSDimitry Andric// FIXME: FP16 scalar intrinsics use the type v8f16, which is supposed to be
170349cc55cSDimitry Andric// guarded under condition hasVLX. So we imply it in FeatureFP16 currently.
171349cc55cSDimitry Andric// FIXME: FP16 conversion between f16 and i64 customize type v8i64, which is
172349cc55cSDimitry Andric// supposed to be guarded under condition hasDQI. So we imply it in FeatureFP16
173349cc55cSDimitry Andric// currently.
174349cc55cSDimitry Andricdef FeatureFP16    : SubtargetFeature<"avx512fp16", "HasFP16", "true",
175349cc55cSDimitry Andric                           "Support 16-bit floating point",
176349cc55cSDimitry Andric                           [FeatureBWI, FeatureVLX, FeatureDQI]>;
177bdd1243dSDimitry Andricdef FeatureAVXVNNIINT8  : SubtargetFeature<"avxvnniint8",
178bdd1243dSDimitry Andric                             "HasAVXVNNIINT8", "true",
179bdd1243dSDimitry Andric                             "Enable AVX-VNNI-INT8",
180bdd1243dSDimitry Andric                             [FeatureAVX2]>;
18106c3fb27SDimitry Andricdef FeatureAVXVNNIINT16 : SubtargetFeature<"avxvnniint16",
18206c3fb27SDimitry Andric                             "HasAVXVNNIINT16", "true",
18306c3fb27SDimitry Andric                             "Enable AVX-VNNI-INT16",
18406c3fb27SDimitry Andric                             [FeatureAVX2]>;
1850b57cec5SDimitry Andricdef FeaturePCLMUL  : SubtargetFeature<"pclmul", "HasPCLMUL", "true",
1860b57cec5SDimitry Andric                         "Enable packed carry-less multiplication instructions",
1870b57cec5SDimitry Andric                               [FeatureSSE2]>;
1880b57cec5SDimitry Andricdef FeatureGFNI    : SubtargetFeature<"gfni", "HasGFNI", "true",
1890b57cec5SDimitry Andric                         "Enable Galois Field Arithmetic Instructions",
1900b57cec5SDimitry Andric                               [FeatureSSE2]>;
1910b57cec5SDimitry Andricdef FeatureVPCLMULQDQ : SubtargetFeature<"vpclmulqdq", "HasVPCLMULQDQ", "true",
1920b57cec5SDimitry Andric                                         "Enable vpclmulqdq instructions",
1930b57cec5SDimitry Andric                                         [FeatureAVX, FeaturePCLMUL]>;
1940b57cec5SDimitry Andricdef FeatureFMA4    : SubtargetFeature<"fma4", "HasFMA4", "true",
1950b57cec5SDimitry Andric                                      "Enable four-operand fused multiple-add",
1960b57cec5SDimitry Andric                                      [FeatureAVX, FeatureSSE4A]>;
1970b57cec5SDimitry Andricdef FeatureXOP     : SubtargetFeature<"xop", "HasXOP", "true",
1980b57cec5SDimitry Andric                                      "Enable XOP instructions",
1990b57cec5SDimitry Andric                                      [FeatureFMA4]>;
2000b57cec5SDimitry Andricdef FeatureSSEUnalignedMem : SubtargetFeature<"sse-unaligned-mem",
2010b57cec5SDimitry Andric                                          "HasSSEUnalignedMem", "true",
20281ad6265SDimitry Andric                      "Allow unaligned memory operands with SSE instructions (this may require setting a configuration bit in the processor)">;
2030b57cec5SDimitry Andricdef FeatureAES     : SubtargetFeature<"aes", "HasAES", "true",
2040b57cec5SDimitry Andric                                      "Enable AES instructions",
2050b57cec5SDimitry Andric                                      [FeatureSSE2]>;
2060b57cec5SDimitry Andricdef FeatureVAES    : SubtargetFeature<"vaes", "HasVAES", "true",
2070b57cec5SDimitry Andric                       "Promote selected AES instructions to AVX512/AVX registers",
2085f757f3fSDimitry Andric                        [FeatureAVX2, FeatureAES]>;
2090b57cec5SDimitry Andricdef FeatureTBM     : SubtargetFeature<"tbm", "HasTBM", "true",
2100b57cec5SDimitry Andric                                      "Enable TBM instructions">;
2110b57cec5SDimitry Andricdef FeatureLWP     : SubtargetFeature<"lwp", "HasLWP", "true",
2120b57cec5SDimitry Andric                                      "Enable LWP instructions">;
2130b57cec5SDimitry Andricdef FeatureMOVBE   : SubtargetFeature<"movbe", "HasMOVBE", "true",
2140b57cec5SDimitry Andric                                      "Support MOVBE instruction">;
2150b57cec5SDimitry Andricdef FeatureRDRAND  : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
2160b57cec5SDimitry Andric                                      "Support RDRAND instruction">;
2170b57cec5SDimitry Andricdef FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
2180b57cec5SDimitry Andric                                       "Support FS/GS Base instructions">;
2190b57cec5SDimitry Andricdef FeatureLZCNT   : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
2200b57cec5SDimitry Andric                                      "Support LZCNT instruction">;
2210b57cec5SDimitry Andricdef FeatureBMI     : SubtargetFeature<"bmi", "HasBMI", "true",
2220b57cec5SDimitry Andric                                      "Support BMI instructions">;
2230b57cec5SDimitry Andricdef FeatureBMI2    : SubtargetFeature<"bmi2", "HasBMI2", "true",
2240b57cec5SDimitry Andric                                      "Support BMI2 instructions">;
2250b57cec5SDimitry Andricdef FeatureRTM     : SubtargetFeature<"rtm", "HasRTM", "true",
2260b57cec5SDimitry Andric                                      "Support RTM instructions">;
2270b57cec5SDimitry Andricdef FeatureADX     : SubtargetFeature<"adx", "HasADX", "true",
2280b57cec5SDimitry Andric                                      "Support ADX instructions">;
2290b57cec5SDimitry Andricdef FeatureSHA     : SubtargetFeature<"sha", "HasSHA", "true",
2300b57cec5SDimitry Andric                                      "Enable SHA instructions",
2310b57cec5SDimitry Andric                                      [FeatureSSE2]>;
23206c3fb27SDimitry Andricdef FeatureSHA512  : SubtargetFeature<"sha512", "HasSHA512", "true",
23306c3fb27SDimitry Andric                                      "Support SHA512 instructions",
2345f757f3fSDimitry Andric                                      [FeatureAVX2]>;
23581ad6265SDimitry Andric// Processor supports CET SHSTK - Control-Flow Enforcement Technology
23681ad6265SDimitry Andric// using Shadow Stack
2370b57cec5SDimitry Andricdef FeatureSHSTK   : SubtargetFeature<"shstk", "HasSHSTK", "true",
2380b57cec5SDimitry Andric                       "Support CET Shadow-Stack instructions">;
23906c3fb27SDimitry Andricdef FeatureSM3     : SubtargetFeature<"sm3", "HasSM3", "true",
24006c3fb27SDimitry Andric                                      "Support SM3 instructions",
24106c3fb27SDimitry Andric                                      [FeatureAVX]>;
24206c3fb27SDimitry Andricdef FeatureSM4     : SubtargetFeature<"sm4", "HasSM4", "true",
24306c3fb27SDimitry Andric                                      "Support SM4 instructions",
2445f757f3fSDimitry Andric                                      [FeatureAVX2]>;
2450b57cec5SDimitry Andricdef FeaturePRFCHW  : SubtargetFeature<"prfchw", "HasPRFCHW", "true",
2460b57cec5SDimitry Andric                                      "Support PRFCHW instructions">;
2470b57cec5SDimitry Andricdef FeatureRDSEED  : SubtargetFeature<"rdseed", "HasRDSEED", "true",
2480b57cec5SDimitry Andric                                      "Support RDSEED instruction">;
24981ad6265SDimitry Andricdef FeatureLAHFSAHF64 : SubtargetFeature<"sahf", "HasLAHFSAHF64", "true",
250e8d8bef9SDimitry Andric                           "Support LAHF and SAHF instructions in 64-bit mode">;
2510b57cec5SDimitry Andricdef FeatureMWAITX  : SubtargetFeature<"mwaitx", "HasMWAITX", "true",
2520b57cec5SDimitry Andric                                      "Enable MONITORX/MWAITX timer functionality">;
2530b57cec5SDimitry Andricdef FeatureCLZERO  : SubtargetFeature<"clzero", "HasCLZERO", "true",
2540b57cec5SDimitry Andric                                      "Enable Cache Line Zero">;
2550b57cec5SDimitry Andricdef FeatureCLDEMOTE  : SubtargetFeature<"cldemote", "HasCLDEMOTE", "true",
25681ad6265SDimitry Andric                                      "Enable Cache Line Demote">;
2570b57cec5SDimitry Andricdef FeaturePTWRITE  : SubtargetFeature<"ptwrite", "HasPTWRITE", "true",
2580b57cec5SDimitry Andric                                      "Support ptwrite instruction">;
2595ffd83dbSDimitry Andricdef FeatureAMXTILE     : SubtargetFeature<"amx-tile", "HasAMXTILE", "true",
2605ffd83dbSDimitry Andric                                      "Support AMX-TILE instructions">;
2615ffd83dbSDimitry Andricdef FeatureAMXINT8     : SubtargetFeature<"amx-int8", "HasAMXINT8", "true",
2625ffd83dbSDimitry Andric                                      "Support AMX-INT8 instructions",
2635ffd83dbSDimitry Andric                                      [FeatureAMXTILE]>;
2645ffd83dbSDimitry Andricdef FeatureAMXBF16     : SubtargetFeature<"amx-bf16", "HasAMXBF16", "true",
2655ffd83dbSDimitry Andric                                      "Support AMX-BF16 instructions",
2665ffd83dbSDimitry Andric                                      [FeatureAMXTILE]>;
267bdd1243dSDimitry Andricdef FeatureAMXFP16     : SubtargetFeature<"amx-fp16", "HasAMXFP16", "true",
268bdd1243dSDimitry Andric                                      "Support AMX amx-fp16 instructions",
269bdd1243dSDimitry Andric                                      [FeatureAMXTILE]>;
27006c3fb27SDimitry Andricdef FeatureAMXCOMPLEX : SubtargetFeature<"amx-complex", "HasAMXCOMPLEX", "true",
27106c3fb27SDimitry Andric                                         "Support AMX-COMPLEX instructions",
27206c3fb27SDimitry Andric                                         [FeatureAMXTILE]>;
273bdd1243dSDimitry Andricdef FeatureCMPCCXADD : SubtargetFeature<"cmpccxadd", "HasCMPCCXADD", "true",
274bdd1243dSDimitry Andric                                        "Support CMPCCXADD instructions">;
275bdd1243dSDimitry Andricdef FeatureRAOINT : SubtargetFeature<"raoint", "HasRAOINT", "true",
276bdd1243dSDimitry Andric                                     "Support RAO-INT instructions",
277bdd1243dSDimitry Andric                                     []>;
278bdd1243dSDimitry Andricdef FeatureAVXNECONVERT : SubtargetFeature<"avxneconvert", "HasAVXNECONVERT", "true",
279bdd1243dSDimitry Andric                                           "Support AVX-NE-CONVERT instructions",
280bdd1243dSDimitry Andric                                           [FeatureAVX2]>;
2810b57cec5SDimitry Andricdef FeatureINVPCID : SubtargetFeature<"invpcid", "HasINVPCID", "true",
2820b57cec5SDimitry Andric                                      "Invalidate Process-Context Identifier">;
2830b57cec5SDimitry Andricdef FeatureSGX     : SubtargetFeature<"sgx", "HasSGX", "true",
2840b57cec5SDimitry Andric                                      "Enable Software Guard Extensions">;
2850b57cec5SDimitry Andricdef FeatureCLFLUSHOPT : SubtargetFeature<"clflushopt", "HasCLFLUSHOPT", "true",
2860b57cec5SDimitry Andric                                      "Flush A Cache Line Optimized">;
2870b57cec5SDimitry Andricdef FeatureCLWB    : SubtargetFeature<"clwb", "HasCLWB", "true",
2880b57cec5SDimitry Andric                                      "Cache Line Write Back">;
2890b57cec5SDimitry Andricdef FeatureWBNOINVD    : SubtargetFeature<"wbnoinvd", "HasWBNOINVD", "true",
2900b57cec5SDimitry Andric                                      "Write Back No Invalidate">;
2910b57cec5SDimitry Andricdef FeatureRDPID : SubtargetFeature<"rdpid", "HasRDPID", "true",
2920b57cec5SDimitry Andric                                    "Support RDPID instructions">;
293753f127fSDimitry Andricdef FeatureRDPRU : SubtargetFeature<"rdpru", "HasRDPRU", "true",
294753f127fSDimitry Andric                                    "Support RDPRU instructions">;
2950b57cec5SDimitry Andricdef FeatureWAITPKG  : SubtargetFeature<"waitpkg", "HasWAITPKG", "true",
2960b57cec5SDimitry Andric                                      "Wait and pause enhancements">;
2970b57cec5SDimitry Andricdef FeatureENQCMD : SubtargetFeature<"enqcmd", "HasENQCMD", "true",
2980b57cec5SDimitry Andric                                     "Has ENQCMD instructions">;
299e8d8bef9SDimitry Andricdef FeatureKL  : SubtargetFeature<"kl", "HasKL", "true",
300e8d8bef9SDimitry Andric                                  "Support Key Locker kl Instructions",
301e8d8bef9SDimitry Andric                                  [FeatureSSE2]>;
302e8d8bef9SDimitry Andricdef FeatureWIDEKL  : SubtargetFeature<"widekl", "HasWIDEKL", "true",
303e8d8bef9SDimitry Andric                                      "Support Key Locker wide Instructions",
304e8d8bef9SDimitry Andric                                      [FeatureKL]>;
305e8d8bef9SDimitry Andricdef FeatureHRESET : SubtargetFeature<"hreset", "HasHRESET", "true",
306e8d8bef9SDimitry Andric                                      "Has hreset instruction">;
3075ffd83dbSDimitry Andricdef FeatureSERIALIZE : SubtargetFeature<"serialize", "HasSERIALIZE", "true",
3085ffd83dbSDimitry Andric                                        "Has serialize instruction">;
3095ffd83dbSDimitry Andricdef FeatureTSXLDTRK : SubtargetFeature<"tsxldtrk", "HasTSXLDTRK", "true",
3105ffd83dbSDimitry Andric                                       "Support TSXLDTRK instructions">;
311e8d8bef9SDimitry Andricdef FeatureUINTR : SubtargetFeature<"uintr", "HasUINTR", "true",
312e8d8bef9SDimitry Andric                                    "Has UINTR Instructions">;
3135f757f3fSDimitry Andricdef FeatureUSERMSR : SubtargetFeature<"usermsr", "HasUSERMSR", "true",
3145f757f3fSDimitry Andric                                      "Support USERMSR instructions">;
3150b57cec5SDimitry Andricdef FeaturePCONFIG : SubtargetFeature<"pconfig", "HasPCONFIG", "true",
3160b57cec5SDimitry Andric                                      "platform configuration instruction">;
317349cc55cSDimitry Andricdef FeatureMOVDIRI  : SubtargetFeature<"movdiri", "HasMOVDIRI", "true",
31881ad6265SDimitry Andric                                       "Support movdiri instruction (direct store integer)">;
319349cc55cSDimitry Andricdef FeatureMOVDIR64B : SubtargetFeature<"movdir64b", "HasMOVDIR64B", "true",
32081ad6265SDimitry Andric                                        "Support movdir64b instruction (direct store 64 bytes)">;
3215f757f3fSDimitry Andricdef FeatureAVX10_1 : SubtargetFeature<"avx10.1-256", "HasAVX10_1", "true",
3225f757f3fSDimitry Andric                                      "Support AVX10.1 up to 256-bit instruction",
3235f757f3fSDimitry Andric                                      [FeatureCDI, FeatureVBMI, FeatureIFMA, FeatureVNNI,
3245f757f3fSDimitry Andric                                       FeatureBF16, FeatureVPOPCNTDQ, FeatureVBMI2, FeatureBITALG,
3255f757f3fSDimitry Andric                                       FeatureVAES, FeatureVPCLMULQDQ, FeatureFP16]>;
3265f757f3fSDimitry Andricdef FeatureAVX10_1_512 : SubtargetFeature<"avx10.1-512", "HasAVX10_1_512", "true",
3275f757f3fSDimitry Andric                                          "Support AVX10.1 up to 512-bit instruction",
3285f757f3fSDimitry Andric                                          [FeatureAVX10_1, FeatureEVEX512]>;
3295f757f3fSDimitry Andricdef FeatureEGPR : SubtargetFeature<"egpr", "HasEGPR", "true",
3305f757f3fSDimitry Andric                                   "Support extended general purpose register">;
3315f757f3fSDimitry Andricdef FeaturePush2Pop2 : SubtargetFeature<"push2pop2", "HasPush2Pop2", "true",
3325f757f3fSDimitry Andric                                        "Support PUSH2/POP2 instructions">;
3335f757f3fSDimitry Andricdef FeaturePPX : SubtargetFeature<"ppx", "HasPPX", "true",
3345f757f3fSDimitry Andric                                  "Support Push-Pop Acceleration">;
3355f757f3fSDimitry Andricdef FeatureNDD : SubtargetFeature<"ndd", "HasNDD", "true",
3365f757f3fSDimitry Andric                                  "Support non-destructive destination">;
3375f757f3fSDimitry Andricdef FeatureCCMP : SubtargetFeature<"ccmp", "HasCCMP", "true",
3385f757f3fSDimitry Andric                                   "Support conditional cmp & test instructions">;
3390fca6ea1SDimitry Andricdef FeatureNF : SubtargetFeature<"nf", "HasNF", "true",
3400fca6ea1SDimitry Andric                                 "Support status flags update suppression">;
3415f757f3fSDimitry Andricdef FeatureCF : SubtargetFeature<"cf", "HasCF", "true",
3425f757f3fSDimitry Andric                                 "Support conditional faulting">;
3430fca6ea1SDimitry Andricdef FeatureZU : SubtargetFeature<"zu", "HasZU", "true",
3440fca6ea1SDimitry Andric                                 "Support zero-upper SETcc/IMUL">;
3450fca6ea1SDimitry Andricdef FeatureUseGPR32InInlineAsm
3460fca6ea1SDimitry Andric    : SubtargetFeature<"inline-asm-use-gpr32", "UseInlineAsmGPR32", "true",
3470fca6ea1SDimitry Andric                       "Enable use of GPR32 in inline assembly for APX">;
3480b57cec5SDimitry Andric
3490b57cec5SDimitry Andric// Ivy Bridge and newer processors have enhanced REP MOVSB and STOSB (aka
3500b57cec5SDimitry Andric// "string operations"). See "REP String Enhancement" in the Intel Software
3510b57cec5SDimitry Andric// Development Manual. This feature essentially means that REP MOVSB will copy
3520b57cec5SDimitry Andric// using the largest available size instead of copying bytes one by one, making
3530b57cec5SDimitry Andric// it at least as fast as REPMOVS{W,D,Q}.
3540b57cec5SDimitry Andricdef FeatureERMSB
3550b57cec5SDimitry Andric    : SubtargetFeature<
3560b57cec5SDimitry Andric          "ermsb", "HasERMSB", "true",
3570b57cec5SDimitry Andric          "REP MOVS/STOS are fast">;
3580b57cec5SDimitry Andric
359e8d8bef9SDimitry Andric// Icelake and newer processors have Fast Short REP MOV.
360e8d8bef9SDimitry Andricdef FeatureFSRM
361e8d8bef9SDimitry Andric    : SubtargetFeature<
362e8d8bef9SDimitry Andric          "fsrm", "HasFSRM", "true",
363e8d8bef9SDimitry Andric          "REP MOVSB of short lengths is faster">;
364e8d8bef9SDimitry Andric
365349cc55cSDimitry Andricdef FeatureSoftFloat
366349cc55cSDimitry Andric    : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
367349cc55cSDimitry Andric                       "Use software floating point features">;
3680b57cec5SDimitry Andric
369349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
370349cc55cSDimitry Andric// X86 Subtarget Security Mitigation features
371349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
372480093f4SDimitry Andric
3730b57cec5SDimitry Andric// Lower indirect calls using a special construct called a `retpoline` to
3740b57cec5SDimitry Andric// mitigate potential Spectre v2 attacks against them.
3750b57cec5SDimitry Andricdef FeatureRetpolineIndirectCalls
3760b57cec5SDimitry Andric    : SubtargetFeature<
3770b57cec5SDimitry Andric          "retpoline-indirect-calls", "UseRetpolineIndirectCalls", "true",
3780b57cec5SDimitry Andric          "Remove speculation of indirect calls from the generated code">;
3790b57cec5SDimitry Andric
3800b57cec5SDimitry Andric// Lower indirect branches and switches either using conditional branch trees
3810b57cec5SDimitry Andric// or using a special construct called a `retpoline` to mitigate potential
3820b57cec5SDimitry Andric// Spectre v2 attacks against them.
3830b57cec5SDimitry Andricdef FeatureRetpolineIndirectBranches
3840b57cec5SDimitry Andric    : SubtargetFeature<
3850b57cec5SDimitry Andric          "retpoline-indirect-branches", "UseRetpolineIndirectBranches", "true",
3860b57cec5SDimitry Andric          "Remove speculation of indirect branches from the generated code">;
3870b57cec5SDimitry Andric
3880b57cec5SDimitry Andric// Deprecated umbrella feature for enabling both `retpoline-indirect-calls` and
3890b57cec5SDimitry Andric// `retpoline-indirect-branches` above.
3900b57cec5SDimitry Andricdef FeatureRetpoline
3910b57cec5SDimitry Andric    : SubtargetFeature<"retpoline", "DeprecatedUseRetpoline", "true",
3920b57cec5SDimitry Andric                       "Remove speculation of indirect branches from the "
3930b57cec5SDimitry Andric                       "generated code, either by avoiding them entirely or "
3940b57cec5SDimitry Andric                       "lowering them with a speculation blocking construct",
3950b57cec5SDimitry Andric                       [FeatureRetpolineIndirectCalls,
3960b57cec5SDimitry Andric                        FeatureRetpolineIndirectBranches]>;
3970b57cec5SDimitry Andric
3980b57cec5SDimitry Andric// Rely on external thunks for the emitted retpoline calls. This allows users
3990b57cec5SDimitry Andric// to provide their own custom thunk definitions in highly specialized
4000b57cec5SDimitry Andric// environments such as a kernel that does boot-time hot patching.
4010b57cec5SDimitry Andricdef FeatureRetpolineExternalThunk
4020b57cec5SDimitry Andric    : SubtargetFeature<
4030b57cec5SDimitry Andric          "retpoline-external-thunk", "UseRetpolineExternalThunk", "true",
4040b57cec5SDimitry Andric          "When lowering an indirect call or branch using a `retpoline`, rely "
4050b57cec5SDimitry Andric          "on the specified user provided thunk rather than emitting one "
4060b57cec5SDimitry Andric          "ourselves. Only has effect when combined with some other retpoline "
4070b57cec5SDimitry Andric          "feature", [FeatureRetpolineIndirectCalls]>;
4080b57cec5SDimitry Andric
4090946e70aSDimitry Andric// Mitigate LVI attacks against indirect calls/branches and call returns
4100946e70aSDimitry Andricdef FeatureLVIControlFlowIntegrity
4110946e70aSDimitry Andric    : SubtargetFeature<
4120946e70aSDimitry Andric          "lvi-cfi", "UseLVIControlFlowIntegrity", "true",
4130946e70aSDimitry Andric          "Prevent indirect calls/branches from using a memory operand, and "
4140946e70aSDimitry Andric          "precede all indirect calls/branches from a register with an "
4150946e70aSDimitry Andric          "LFENCE instruction to serialize control flow. Also decompose RET "
4160946e70aSDimitry Andric          "instructions into a POP+LFENCE+JMP sequence.">;
4170946e70aSDimitry Andric
4185ffd83dbSDimitry Andric// Enable SESES to mitigate speculative execution attacks
4195ffd83dbSDimitry Andricdef FeatureSpeculativeExecutionSideEffectSuppression
4205ffd83dbSDimitry Andric    : SubtargetFeature<
4215ffd83dbSDimitry Andric          "seses", "UseSpeculativeExecutionSideEffectSuppression", "true",
4225ffd83dbSDimitry Andric          "Prevent speculative execution side channel timing attacks by "
4235ffd83dbSDimitry Andric          "inserting a speculation barrier before memory reads, memory writes, "
4245ffd83dbSDimitry Andric          "and conditional branches. Implies LVI Control Flow integrity.",
4255ffd83dbSDimitry Andric          [FeatureLVIControlFlowIntegrity]>;
4265ffd83dbSDimitry Andric
4270946e70aSDimitry Andric// Mitigate LVI attacks against data loads
4280946e70aSDimitry Andricdef FeatureLVILoadHardening
4290946e70aSDimitry Andric    : SubtargetFeature<
4300946e70aSDimitry Andric          "lvi-load-hardening", "UseLVILoadHardening", "true",
4310946e70aSDimitry Andric          "Insert LFENCE instructions to prevent data speculatively injected "
4320946e70aSDimitry Andric          "into loads from being used maliciously.">;
4330946e70aSDimitry Andric
434349cc55cSDimitry Andricdef FeatureTaggedGlobals
435349cc55cSDimitry Andric    : SubtargetFeature<
436349cc55cSDimitry Andric          "tagged-globals", "AllowTaggedGlobals", "true",
437349cc55cSDimitry Andric          "Use an instruction sequence for taking the address of a global "
438349cc55cSDimitry Andric          "that allows a memory tag in the upper address bits.">;
4390b57cec5SDimitry Andric
44081ad6265SDimitry Andric// Control codegen mitigation against Straight Line Speculation vulnerability.
44181ad6265SDimitry Andricdef FeatureHardenSlsRet
44281ad6265SDimitry Andric    : SubtargetFeature<
44381ad6265SDimitry Andric          "harden-sls-ret", "HardenSlsRet", "true",
44481ad6265SDimitry Andric          "Harden against straight line speculation across RET instructions.">;
44581ad6265SDimitry Andric
44681ad6265SDimitry Andricdef FeatureHardenSlsIJmp
44781ad6265SDimitry Andric    : SubtargetFeature<
44881ad6265SDimitry Andric          "harden-sls-ijmp", "HardenSlsIJmp", "true",
44981ad6265SDimitry Andric          "Harden against straight line speculation across indirect JMP instructions.">;
45081ad6265SDimitry Andric
451349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
452349cc55cSDimitry Andric// X86 Subtarget Tuning features
453349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
45406c3fb27SDimitry Andricdef TuningPreferMovmskOverVTest : SubtargetFeature<"prefer-movmsk-over-vtest",
45506c3fb27SDimitry Andric                                       "PreferMovmskOverVTest", "true",
45606c3fb27SDimitry Andric                                       "Prefer movmsk over vtest instruction">;
457349cc55cSDimitry Andric
458349cc55cSDimitry Andricdef TuningSlowSHLD : SubtargetFeature<"slow-shld", "IsSHLDSlow", "true",
459349cc55cSDimitry Andric                                       "SHLD instruction is slow">;
460349cc55cSDimitry Andric
461349cc55cSDimitry Andricdef TuningSlowPMULLD : SubtargetFeature<"slow-pmulld", "IsPMULLDSlow", "true",
46281ad6265SDimitry Andric                                        "PMULLD instruction is slow (compared to PMULLW/PMULHW and PMULUDQ)">;
463349cc55cSDimitry Andric
464349cc55cSDimitry Andricdef TuningSlowPMADDWD : SubtargetFeature<"slow-pmaddwd", "IsPMADDWDSlow",
465349cc55cSDimitry Andric                                          "true",
466349cc55cSDimitry Andric                                          "PMADDWD is slower than PMULLD">;
467349cc55cSDimitry Andric
468349cc55cSDimitry Andric// FIXME: This should not apply to CPUs that do not have SSE.
469349cc55cSDimitry Andricdef TuningSlowUAMem16 : SubtargetFeature<"slow-unaligned-mem-16",
47081ad6265SDimitry Andric                                "IsUnalignedMem16Slow", "true",
471349cc55cSDimitry Andric                                "Slow unaligned 16-byte memory access">;
472349cc55cSDimitry Andric
473349cc55cSDimitry Andricdef TuningSlowUAMem32 : SubtargetFeature<"slow-unaligned-mem-32",
47481ad6265SDimitry Andric                                "IsUnalignedMem32Slow", "true",
475349cc55cSDimitry Andric                                "Slow unaligned 32-byte memory access">;
476349cc55cSDimitry Andric
477349cc55cSDimitry Andricdef TuningLEAForSP : SubtargetFeature<"lea-sp", "UseLeaForSP", "true",
47881ad6265SDimitry Andric                                     "Use LEA for adjusting the stack pointer (this is an optimization for Intel Atom processors)">;
479349cc55cSDimitry Andric
48081ad6265SDimitry Andric// True if 8-bit divisions are significantly faster than
48181ad6265SDimitry Andric// 32-bit divisions and should be used when possible.
482349cc55cSDimitry Andricdef TuningSlowDivide32 : SubtargetFeature<"idivl-to-divb",
483349cc55cSDimitry Andric                                     "HasSlowDivide32", "true",
484349cc55cSDimitry Andric                                     "Use 8-bit divide for positive values less than 256">;
485349cc55cSDimitry Andric
48681ad6265SDimitry Andric// True if 32-bit divides are significantly faster than
48781ad6265SDimitry Andric// 64-bit divisions and should be used when possible.
488349cc55cSDimitry Andricdef TuningSlowDivide64 : SubtargetFeature<"idivq-to-divl",
489349cc55cSDimitry Andric                                     "HasSlowDivide64", "true",
490349cc55cSDimitry Andric                                     "Use 32-bit divide for positive values less than 2^32">;
491349cc55cSDimitry Andric
492349cc55cSDimitry Andricdef TuningPadShortFunctions : SubtargetFeature<"pad-short-functions",
493349cc55cSDimitry Andric                                     "PadShortFunctions", "true",
49481ad6265SDimitry Andric                                     "Pad short functions (to prevent a stall when returning too early)">;
495349cc55cSDimitry Andric
496349cc55cSDimitry Andric// On some processors, instructions that implicitly take two memory operands are
497349cc55cSDimitry Andric// slow. In practice, this means that CALL, PUSH, and POP with memory operands
498349cc55cSDimitry Andric// should be avoided in favor of a MOV + register CALL/PUSH/POP.
499349cc55cSDimitry Andricdef TuningSlowTwoMemOps : SubtargetFeature<"slow-two-mem-ops",
500349cc55cSDimitry Andric                                     "SlowTwoMemOps", "true",
501349cc55cSDimitry Andric                                     "Two memory operand instructions are slow">;
502349cc55cSDimitry Andric
50381ad6265SDimitry Andric// True if the LEA instruction inputs have to be ready at address generation
50481ad6265SDimitry Andric// (AG) time.
50581ad6265SDimitry Andricdef TuningLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LeaUsesAG", "true",
506349cc55cSDimitry Andric                                   "LEA instruction needs inputs at AG stage">;
507349cc55cSDimitry Andric
508349cc55cSDimitry Andricdef TuningSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
509349cc55cSDimitry Andric                                   "LEA instruction with certain arguments is slow">;
510349cc55cSDimitry Andric
51181ad6265SDimitry Andric// True if the LEA instruction has all three source operands: base, index,
51281ad6265SDimitry Andric// and offset or if the LEA instruction uses base and index registers where
51381ad6265SDimitry Andric// the base is EBP, RBP,or R13
514349cc55cSDimitry Andricdef TuningSlow3OpsLEA : SubtargetFeature<"slow-3ops-lea", "Slow3OpsLEA", "true",
515349cc55cSDimitry Andric                                   "LEA instruction with 3 ops or certain registers is slow">;
516349cc55cSDimitry Andric
51781ad6265SDimitry Andric// True if INC and DEC instructions are slow when writing to flags
518349cc55cSDimitry Andricdef TuningSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
519349cc55cSDimitry Andric                                   "INC and DEC instructions are slower than ADD and SUB">;
520349cc55cSDimitry Andric
521349cc55cSDimitry Andricdef TuningPOPCNTFalseDeps : SubtargetFeature<"false-deps-popcnt",
522349cc55cSDimitry Andric                                     "HasPOPCNTFalseDeps", "true",
523349cc55cSDimitry Andric                                     "POPCNT has a false dependency on dest register">;
524349cc55cSDimitry Andric
525349cc55cSDimitry Andricdef TuningLZCNTFalseDeps : SubtargetFeature<"false-deps-lzcnt-tzcnt",
526349cc55cSDimitry Andric                                     "HasLZCNTFalseDeps", "true",
527349cc55cSDimitry Andric                                     "LZCNT/TZCNT have a false dependency on dest register">;
528349cc55cSDimitry Andric
52981ad6265SDimitry Andricdef TuningMULCFalseDeps : SubtargetFeature<"false-deps-mulc",
53081ad6265SDimitry Andric                               "HasMULCFalseDeps", "true",
53181ad6265SDimitry Andric                               "VF[C]MULCPH/SH has a false dependency on dest register">;
53281ad6265SDimitry Andric
53381ad6265SDimitry Andricdef TuningPERMFalseDeps : SubtargetFeature<"false-deps-perm",
53481ad6265SDimitry Andric                               "HasPERMFalseDeps", "true",
53581ad6265SDimitry Andric                               "VPERMD/Q/PS/PD has a false dependency on dest register">;
53681ad6265SDimitry Andric
53781ad6265SDimitry Andricdef TuningRANGEFalseDeps : SubtargetFeature<"false-deps-range",
53881ad6265SDimitry Andric                               "HasRANGEFalseDeps", "true",
53981ad6265SDimitry Andric                               "VRANGEPD/PS/SD/SS has a false dependency on dest register">;
54081ad6265SDimitry Andric
54181ad6265SDimitry Andricdef TuningGETMANTFalseDeps : SubtargetFeature<"false-deps-getmant",
54281ad6265SDimitry Andric                               "HasGETMANTFalseDeps", "true",
54381ad6265SDimitry Andric                               "VGETMANTSS/SD/SH and VGETMANDPS/PD(memory version) has a"
54481ad6265SDimitry Andric                               " false dependency on dest register">;
54581ad6265SDimitry Andric
54681ad6265SDimitry Andricdef TuningMULLQFalseDeps : SubtargetFeature<"false-deps-mullq",
54781ad6265SDimitry Andric                               "HasMULLQFalseDeps", "true",
54881ad6265SDimitry Andric                               "VPMULLQ has a false dependency on dest register">;
54981ad6265SDimitry Andric
55081ad6265SDimitry Andricdef TuningSBBDepBreaking : SubtargetFeature<"sbb-dep-breaking",
55181ad6265SDimitry Andric                                     "HasSBBDepBreaking", "true",
55281ad6265SDimitry Andric                                     "SBB with same register has no source dependency">;
55381ad6265SDimitry Andric
554349cc55cSDimitry Andric// On recent X86 (port bound) processors, its preferable to combine to a single shuffle
555349cc55cSDimitry Andric// using a variable mask over multiple fixed shuffles.
556349cc55cSDimitry Andricdef TuningFastVariableCrossLaneShuffle
557349cc55cSDimitry Andric    : SubtargetFeature<"fast-variable-crosslane-shuffle",
558349cc55cSDimitry Andric                       "HasFastVariableCrossLaneShuffle",
559349cc55cSDimitry Andric                       "true", "Cross-lane shuffles with variable masks are fast">;
560349cc55cSDimitry Andricdef TuningFastVariablePerLaneShuffle
561349cc55cSDimitry Andric    : SubtargetFeature<"fast-variable-perlane-shuffle",
562349cc55cSDimitry Andric                       "HasFastVariablePerLaneShuffle",
563349cc55cSDimitry Andric                       "true", "Per-lane shuffles with variable masks are fast">;
564349cc55cSDimitry Andric
56506c3fb27SDimitry Andric// Goldmont / Tremont (atom in general) has no bypass delay
56606c3fb27SDimitry Andricdef TuningNoDomainDelay : SubtargetFeature<"no-bypass-delay",
56706c3fb27SDimitry Andric                                   "NoDomainDelay","true",
56806c3fb27SDimitry Andric                                   "Has no bypass delay when using the 'wrong' domain">;
56906c3fb27SDimitry Andric
57006c3fb27SDimitry Andric// Many processors (Nehalem+ on Intel) have no bypass delay when
57106c3fb27SDimitry Andric// using the wrong mov type.
57206c3fb27SDimitry Andricdef TuningNoDomainDelayMov : SubtargetFeature<"no-bypass-delay-mov",
57306c3fb27SDimitry Andric                                   "NoDomainDelayMov","true",
57406c3fb27SDimitry Andric                                   "Has no bypass delay when using the 'wrong' mov type">;
57506c3fb27SDimitry Andric
57606c3fb27SDimitry Andric// Newer processors (Skylake+ on Intel) have no bypass delay when
57706c3fb27SDimitry Andric// using the wrong blend type.
57806c3fb27SDimitry Andricdef TuningNoDomainDelayBlend : SubtargetFeature<"no-bypass-delay-blend",
57906c3fb27SDimitry Andric                                   "NoDomainDelayBlend","true",
58006c3fb27SDimitry Andric                                   "Has no bypass delay when using the 'wrong' blend type">;
58106c3fb27SDimitry Andric
58206c3fb27SDimitry Andric// Newer processors (Haswell+ on Intel) have no bypass delay when
58306c3fb27SDimitry Andric// using the wrong shuffle type.
58406c3fb27SDimitry Andricdef TuningNoDomainDelayShuffle : SubtargetFeature<"no-bypass-delay-shuffle",
58506c3fb27SDimitry Andric                                   "NoDomainDelayShuffle","true",
58606c3fb27SDimitry Andric                                   "Has no bypass delay when using the 'wrong' shuffle type">;
58706c3fb27SDimitry Andric
58806c3fb27SDimitry Andric// Prefer lowering shuffles on AVX512 targets (e.g. Skylake Server) to
58906c3fb27SDimitry Andric// imm shifts/rotate if they can use more ports than regular shuffles.
59006c3fb27SDimitry Andricdef TuningPreferShiftShuffle : SubtargetFeature<"faster-shift-than-shuffle",
59106c3fb27SDimitry Andric                                   "PreferLowerShuffleAsShift", "true",
59206c3fb27SDimitry Andric                                   "Shifts are faster (or as fast) as shuffle">;
59306c3fb27SDimitry Andric
59406c3fb27SDimitry Andricdef TuningFastImmVectorShift : SubtargetFeature<"tuning-fast-imm-vector-shift",
59506c3fb27SDimitry Andric                                   "FastImmVectorShift", "true",
59606c3fb27SDimitry Andric                                   "Vector shifts are fast (2/cycle) as opposed to slow (1/cycle)">;
59706c3fb27SDimitry Andric
598349cc55cSDimitry Andric// On some X86 processors, a vzeroupper instruction should be inserted after
599349cc55cSDimitry Andric// using ymm/zmm registers before executing code that may use SSE instructions.
600349cc55cSDimitry Andricdef TuningInsertVZEROUPPER
601349cc55cSDimitry Andric    : SubtargetFeature<"vzeroupper",
602349cc55cSDimitry Andric                       "InsertVZEROUPPER",
603349cc55cSDimitry Andric                       "true", "Should insert vzeroupper instructions">;
604349cc55cSDimitry Andric
605349cc55cSDimitry Andric// TuningFastScalarFSQRT should be enabled if scalar FSQRT has shorter latency
606349cc55cSDimitry Andric// than the corresponding NR code. TuningFastVectorFSQRT should be enabled if
607349cc55cSDimitry Andric// vector FSQRT has higher throughput than the corresponding NR code.
608349cc55cSDimitry Andric// The idea is that throughput bound code is likely to be vectorized, so for
609349cc55cSDimitry Andric// vectorized code we should care about the throughput of SQRT operations.
610349cc55cSDimitry Andric// But if the code is scalar that probably means that the code has some kind of
611349cc55cSDimitry Andric// dependency and we should care more about reducing the latency.
61281ad6265SDimitry Andric
61381ad6265SDimitry Andric// True if hardware SQRTSS instruction is at least as fast (latency) as
61481ad6265SDimitry Andric// RSQRTSS followed by a Newton-Raphson iteration.
615349cc55cSDimitry Andricdef TuningFastScalarFSQRT
616349cc55cSDimitry Andric    : SubtargetFeature<"fast-scalar-fsqrt", "HasFastScalarFSQRT",
617349cc55cSDimitry Andric                       "true", "Scalar SQRT is fast (disable Newton-Raphson)">;
61881ad6265SDimitry Andric// True if hardware SQRTPS/VSQRTPS instructions are at least as fast
61981ad6265SDimitry Andric// (throughput) as RSQRTPS/VRSQRTPS followed by a Newton-Raphson iteration.
620349cc55cSDimitry Andricdef TuningFastVectorFSQRT
621349cc55cSDimitry Andric    : SubtargetFeature<"fast-vector-fsqrt", "HasFastVectorFSQRT",
622349cc55cSDimitry Andric                       "true", "Vector SQRT is fast (disable Newton-Raphson)">;
623349cc55cSDimitry Andric
624349cc55cSDimitry Andric// If lzcnt has equivalent latency/throughput to most simple integer ops, it can
625349cc55cSDimitry Andric// be used to replace test/set sequences.
626349cc55cSDimitry Andricdef TuningFastLZCNT
627349cc55cSDimitry Andric    : SubtargetFeature<
628349cc55cSDimitry Andric          "fast-lzcnt", "HasFastLZCNT", "true",
629349cc55cSDimitry Andric          "LZCNT instructions are as fast as most simple integer ops">;
630349cc55cSDimitry Andric
631349cc55cSDimitry Andric// If the target can efficiently decode NOPs upto 7-bytes in length.
632349cc55cSDimitry Andricdef TuningFast7ByteNOP
633349cc55cSDimitry Andric    : SubtargetFeature<
634349cc55cSDimitry Andric          "fast-7bytenop", "HasFast7ByteNOP", "true",
635349cc55cSDimitry Andric          "Target can quickly decode up to 7 byte NOPs">;
636349cc55cSDimitry Andric
637349cc55cSDimitry Andric// If the target can efficiently decode NOPs upto 11-bytes in length.
638349cc55cSDimitry Andricdef TuningFast11ByteNOP
639349cc55cSDimitry Andric    : SubtargetFeature<
640349cc55cSDimitry Andric          "fast-11bytenop", "HasFast11ByteNOP", "true",
641349cc55cSDimitry Andric          "Target can quickly decode up to 11 byte NOPs">;
642349cc55cSDimitry Andric
643349cc55cSDimitry Andric// If the target can efficiently decode NOPs upto 15-bytes in length.
644349cc55cSDimitry Andricdef TuningFast15ByteNOP
645349cc55cSDimitry Andric    : SubtargetFeature<
646349cc55cSDimitry Andric          "fast-15bytenop", "HasFast15ByteNOP", "true",
647349cc55cSDimitry Andric          "Target can quickly decode up to 15 byte NOPs">;
648349cc55cSDimitry Andric
649349cc55cSDimitry Andric// Sandy Bridge and newer processors can use SHLD with the same source on both
650349cc55cSDimitry Andric// inputs to implement rotate to avoid the partial flag update of the normal
651349cc55cSDimitry Andric// rotate instructions.
652349cc55cSDimitry Andricdef TuningFastSHLDRotate
653349cc55cSDimitry Andric    : SubtargetFeature<
654349cc55cSDimitry Andric          "fast-shld-rotate", "HasFastSHLDRotate", "true",
655349cc55cSDimitry Andric          "SHLD can be used as a faster rotate">;
656349cc55cSDimitry Andric
657349cc55cSDimitry Andric// Bulldozer and newer processors can merge CMP/TEST (but not other
658349cc55cSDimitry Andric// instructions) with conditional branches.
659349cc55cSDimitry Andricdef TuningBranchFusion
660349cc55cSDimitry Andric    : SubtargetFeature<"branchfusion", "HasBranchFusion", "true",
661349cc55cSDimitry Andric                 "CMP/TEST can be fused with conditional branches">;
662349cc55cSDimitry Andric
663349cc55cSDimitry Andric// Sandy Bridge and newer processors have many instructions that can be
664349cc55cSDimitry Andric// fused with conditional branches and pass through the CPU as a single
665349cc55cSDimitry Andric// operation.
666349cc55cSDimitry Andricdef TuningMacroFusion
667349cc55cSDimitry Andric    : SubtargetFeature<"macrofusion", "HasMacroFusion", "true",
668349cc55cSDimitry Andric                 "Various instructions can be fused with conditional branches">;
669349cc55cSDimitry Andric
670349cc55cSDimitry Andric// Gather is available since Haswell (AVX2 set). So technically, we can
671349cc55cSDimitry Andric// generate Gathers on all AVX2 processors. But the overhead on HSW is high.
672349cc55cSDimitry Andric// Skylake Client processor has faster Gathers than HSW and performance is
673349cc55cSDimitry Andric// similar to Skylake Server (AVX-512).
674349cc55cSDimitry Andricdef TuningFastGather
675349cc55cSDimitry Andric    : SubtargetFeature<"fast-gather", "HasFastGather", "true",
67681ad6265SDimitry Andric                       "Indicates if gather is reasonably fast (this is true for Skylake client and all AVX-512 CPUs)">;
677349cc55cSDimitry Andric
6780fca6ea1SDimitry Andric// Generate vpdpwssd instead of vpmaddwd+vpaddd sequence.
6790fca6ea1SDimitry Andricdef TuningFastDPWSSD
6800fca6ea1SDimitry Andric    : SubtargetFeature<
6810fca6ea1SDimitry Andric          "fast-dpwssd", "HasFastDPWSSD", "true",
6820fca6ea1SDimitry Andric          "Prefer vpdpwssd instruction over vpmaddwd+vpaddd instruction sequence">;
6830fca6ea1SDimitry Andric
6848a4dda33SDimitry Andricdef TuningPreferNoGather
6858a4dda33SDimitry Andric    : SubtargetFeature<"prefer-no-gather", "PreferGather", "false",
6868a4dda33SDimitry Andric                       "Prefer no gather instructions">;
6878a4dda33SDimitry Andricdef TuningPreferNoScatter
6888a4dda33SDimitry Andric    : SubtargetFeature<"prefer-no-scatter", "PreferScatter", "false",
6898a4dda33SDimitry Andric                       "Prefer no scatter instructions">;
6908a4dda33SDimitry Andric
691349cc55cSDimitry Andricdef TuningPrefer128Bit
692349cc55cSDimitry Andric    : SubtargetFeature<"prefer-128-bit", "Prefer128Bit", "true",
693349cc55cSDimitry Andric                       "Prefer 128-bit AVX instructions">;
694349cc55cSDimitry Andric
695349cc55cSDimitry Andricdef TuningPrefer256Bit
696349cc55cSDimitry Andric    : SubtargetFeature<"prefer-256-bit", "Prefer256Bit", "true",
697349cc55cSDimitry Andric                       "Prefer 256-bit AVX instructions">;
698349cc55cSDimitry Andric
699bdd1243dSDimitry Andricdef TuningAllowLight256Bit
700bdd1243dSDimitry Andric    : SubtargetFeature<"allow-light-256-bit", "AllowLight256Bit", "true",
701bdd1243dSDimitry Andric                       "Enable generation of 256-bit load/stores even if we prefer 128-bit">;
702bdd1243dSDimitry Andric
703349cc55cSDimitry Andricdef TuningPreferMaskRegisters
704349cc55cSDimitry Andric    : SubtargetFeature<"prefer-mask-registers", "PreferMaskRegisters", "true",
705349cc55cSDimitry Andric                       "Prefer AVX512 mask registers over PTEST/MOVMSK">;
706349cc55cSDimitry Andric
707349cc55cSDimitry Andricdef TuningFastBEXTR : SubtargetFeature<"fast-bextr", "HasFastBEXTR", "true",
7080b57cec5SDimitry Andric          "Indicates that the BEXTR instruction is implemented as a single uop "
7090b57cec5SDimitry Andric          "with good throughput">;
7100b57cec5SDimitry Andric
7110b57cec5SDimitry Andric// Combine vector math operations with shuffles into horizontal math
7120b57cec5SDimitry Andric// instructions if a CPU implements horizontal operations (introduced with
7130b57cec5SDimitry Andric// SSE3) with better latency/throughput than the alternative sequence.
714349cc55cSDimitry Andricdef TuningFastHorizontalOps
7150b57cec5SDimitry Andric    : SubtargetFeature<
7160b57cec5SDimitry Andric        "fast-hops", "HasFastHorizontalOps", "true",
7170b57cec5SDimitry Andric        "Prefer horizontal vector math instructions (haddp, phsub, etc.) over "
718480093f4SDimitry Andric        "normal vector instructions with shuffles">;
7190b57cec5SDimitry Andric
720349cc55cSDimitry Andricdef TuningFastScalarShiftMasks
7210b57cec5SDimitry Andric    : SubtargetFeature<
7220b57cec5SDimitry Andric        "fast-scalar-shift-masks", "HasFastScalarShiftMasks", "true",
7230b57cec5SDimitry Andric        "Prefer a left/right scalar logical shift pair over a shift+and pair">;
7240b57cec5SDimitry Andric
725349cc55cSDimitry Andricdef TuningFastVectorShiftMasks
7260b57cec5SDimitry Andric    : SubtargetFeature<
7270b57cec5SDimitry Andric        "fast-vector-shift-masks", "HasFastVectorShiftMasks", "true",
7280b57cec5SDimitry Andric        "Prefer a left/right vector logical shift pair over a shift+and pair">;
7290b57cec5SDimitry Andric
730349cc55cSDimitry Andricdef TuningFastMOVBE
731fe6060f1SDimitry Andric    : SubtargetFeature<"fast-movbe", "HasFastMOVBE", "true",
732fe6060f1SDimitry Andric    "Prefer a movbe over a single-use load + bswap / single-use bswap + store">;
733fe6060f1SDimitry Andric
7340fca6ea1SDimitry Andricdef TuningFastImm16
7350fca6ea1SDimitry Andric    : SubtargetFeature<"fast-imm16", "HasFastImm16", "true",
7360fca6ea1SDimitry Andric    "Prefer a i16 instruction with i16 immediate over extension to i32">;
7370fca6ea1SDimitry Andric
738349cc55cSDimitry Andricdef TuningUseSLMArithCosts
739349cc55cSDimitry Andric    : SubtargetFeature<"use-slm-arith-costs", "UseSLMArithCosts", "true",
740349cc55cSDimitry Andric        "Use Silvermont specific arithmetic costs">;
741349cc55cSDimitry Andric
742349cc55cSDimitry Andricdef TuningUseGLMDivSqrtCosts
743480093f4SDimitry Andric    : SubtargetFeature<"use-glm-div-sqrt-costs", "UseGLMDivSqrtCosts", "true",
744480093f4SDimitry Andric        "Use Goldmont specific floating point div/sqrt costs">;
745480093f4SDimitry Andric
7460fca6ea1SDimitry Andric// Starting with Redwood Cove architecture, the branch has branch taken hint
7470fca6ea1SDimitry Andric// (i.e., instruction prefix 3EH).
7480fca6ea1SDimitry Andricdef TuningBranchHint: SubtargetFeature<"branch-hint", "HasBranchHint", "true",
7490fca6ea1SDimitry Andric                                        "Target has branch hint feature">;
7500fca6ea1SDimitry Andric
751349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
752349cc55cSDimitry Andric// X86 CPU Families
753349cc55cSDimitry Andric// TODO: Remove these - use general tuning features to determine codegen.
754349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
755349cc55cSDimitry Andric
7560b57cec5SDimitry Andric// Bonnell
75781ad6265SDimitry Andricdef ProcIntelAtom : SubtargetFeature<"", "IsAtom", "true", "Is Intel Atom processor">;
7580b57cec5SDimitry Andric
7590b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7600b57cec5SDimitry Andric// Register File Description
7610b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7620b57cec5SDimitry Andric
7630b57cec5SDimitry Andricinclude "X86RegisterInfo.td"
7640b57cec5SDimitry Andricinclude "X86RegisterBanks.td"
7650b57cec5SDimitry Andric
7660b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7670b57cec5SDimitry Andric// Instruction Descriptions
7680b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7690b57cec5SDimitry Andric
7700b57cec5SDimitry Andricinclude "X86Schedule.td"
7710b57cec5SDimitry Andricinclude "X86InstrInfo.td"
7720b57cec5SDimitry Andricinclude "X86SchedPredicates.td"
7730b57cec5SDimitry Andric
7740b57cec5SDimitry Andricdef X86InstrInfo : InstrInfo;
7750b57cec5SDimitry Andric
7760b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7770b57cec5SDimitry Andric// X86 Scheduler Models
7780b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7790b57cec5SDimitry Andric
7800b57cec5SDimitry Andricinclude "X86ScheduleAtom.td"
7810b57cec5SDimitry Andricinclude "X86SchedSandyBridge.td"
7820b57cec5SDimitry Andricinclude "X86SchedHaswell.td"
7830b57cec5SDimitry Andricinclude "X86SchedBroadwell.td"
7840b57cec5SDimitry Andricinclude "X86ScheduleSLM.td"
7850b57cec5SDimitry Andricinclude "X86ScheduleZnver1.td"
786480093f4SDimitry Andricinclude "X86ScheduleZnver2.td"
787fe6060f1SDimitry Andricinclude "X86ScheduleZnver3.td"
7881ac55f4cSDimitry Andricinclude "X86ScheduleZnver4.td"
7890b57cec5SDimitry Andricinclude "X86ScheduleBdVer2.td"
7900b57cec5SDimitry Andricinclude "X86ScheduleBtVer2.td"
7910b57cec5SDimitry Andricinclude "X86SchedSkylakeClient.td"
7920b57cec5SDimitry Andricinclude "X86SchedSkylakeServer.td"
793349cc55cSDimitry Andricinclude "X86SchedIceLake.td"
794bdd1243dSDimitry Andricinclude "X86SchedAlderlakeP.td"
79506c3fb27SDimitry Andricinclude "X86SchedSapphireRapids.td"
7960b57cec5SDimitry Andric
7970b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
7980b57cec5SDimitry Andric// X86 Processor Feature Lists
7990b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
8000b57cec5SDimitry Andric
8010b57cec5SDimitry Andricdef ProcessorFeatures {
80206c3fb27SDimitry Andric  // x86-64 micro-architecture levels: x86-64 and x86-64-v[234]
803e8d8bef9SDimitry Andric  list<SubtargetFeature> X86_64V1Features = [
80481ad6265SDimitry Andric    FeatureX87, FeatureCX8, FeatureCMOV, FeatureMMX, FeatureSSE2,
80581ad6265SDimitry Andric    FeatureFXSR, FeatureNOPL, FeatureX86_64,
806e8d8bef9SDimitry Andric  ];
80706c3fb27SDimitry Andric  list<SubtargetFeature> X86_64V1Tuning = [
80806c3fb27SDimitry Andric    TuningMacroFusion,
80906c3fb27SDimitry Andric    TuningSlow3OpsLEA,
81006c3fb27SDimitry Andric    TuningSlowDivide64,
81106c3fb27SDimitry Andric    TuningSlowIncDec,
81206c3fb27SDimitry Andric    TuningInsertVZEROUPPER
81306c3fb27SDimitry Andric  ];
81406c3fb27SDimitry Andric
815349cc55cSDimitry Andric  list<SubtargetFeature> X86_64V2Features = !listconcat(X86_64V1Features, [
81681ad6265SDimitry Andric    FeatureCX16, FeatureLAHFSAHF64, FeatureCRC32, FeaturePOPCNT,
817349cc55cSDimitry Andric    FeatureSSE42
818349cc55cSDimitry Andric  ]);
81906c3fb27SDimitry Andric  list<SubtargetFeature> X86_64V2Tuning = [
82006c3fb27SDimitry Andric    TuningMacroFusion,
82106c3fb27SDimitry Andric    TuningSlow3OpsLEA,
82206c3fb27SDimitry Andric    TuningSlowDivide64,
82306c3fb27SDimitry Andric    TuningSlowUAMem32,
82406c3fb27SDimitry Andric    TuningFastScalarFSQRT,
82506c3fb27SDimitry Andric    TuningFastSHLDRotate,
82606c3fb27SDimitry Andric    TuningFast15ByteNOP,
82706c3fb27SDimitry Andric    TuningPOPCNTFalseDeps,
82806c3fb27SDimitry Andric    TuningInsertVZEROUPPER
82906c3fb27SDimitry Andric  ];
83006c3fb27SDimitry Andric
831e8d8bef9SDimitry Andric  list<SubtargetFeature> X86_64V3Features = !listconcat(X86_64V2Features, [
832e8d8bef9SDimitry Andric    FeatureAVX2, FeatureBMI, FeatureBMI2, FeatureF16C, FeatureFMA, FeatureLZCNT,
833e8d8bef9SDimitry Andric    FeatureMOVBE, FeatureXSAVE
834e8d8bef9SDimitry Andric  ]);
83506c3fb27SDimitry Andric  list<SubtargetFeature> X86_64V3Tuning = [
83606c3fb27SDimitry Andric    TuningMacroFusion,
83706c3fb27SDimitry Andric    TuningSlow3OpsLEA,
83806c3fb27SDimitry Andric    TuningSlowDivide64,
83906c3fb27SDimitry Andric    TuningFastScalarFSQRT,
84006c3fb27SDimitry Andric    TuningFastSHLDRotate,
84106c3fb27SDimitry Andric    TuningFast15ByteNOP,
84206c3fb27SDimitry Andric    TuningFastVariableCrossLaneShuffle,
84306c3fb27SDimitry Andric    TuningFastVariablePerLaneShuffle,
84406c3fb27SDimitry Andric    TuningPOPCNTFalseDeps,
84506c3fb27SDimitry Andric    TuningLZCNTFalseDeps,
84606c3fb27SDimitry Andric    TuningInsertVZEROUPPER,
84706c3fb27SDimitry Andric    TuningAllowLight256Bit
84806c3fb27SDimitry Andric  ];
84906c3fb27SDimitry Andric
850e8d8bef9SDimitry Andric  list<SubtargetFeature> X86_64V4Features = !listconcat(X86_64V3Features, [
8515f757f3fSDimitry Andric    FeatureEVEX512,
852e8d8bef9SDimitry Andric    FeatureBWI,
853e8d8bef9SDimitry Andric    FeatureCDI,
854e8d8bef9SDimitry Andric    FeatureDQI,
855e8d8bef9SDimitry Andric    FeatureVLX,
856e8d8bef9SDimitry Andric  ]);
85706c3fb27SDimitry Andric  list<SubtargetFeature> X86_64V4Tuning = [
85806c3fb27SDimitry Andric    TuningMacroFusion,
85906c3fb27SDimitry Andric    TuningSlow3OpsLEA,
86006c3fb27SDimitry Andric    TuningSlowDivide64,
86106c3fb27SDimitry Andric    TuningFastScalarFSQRT,
86206c3fb27SDimitry Andric    TuningFastVectorFSQRT,
86306c3fb27SDimitry Andric    TuningFastSHLDRotate,
86406c3fb27SDimitry Andric    TuningFast15ByteNOP,
86506c3fb27SDimitry Andric    TuningFastVariableCrossLaneShuffle,
86606c3fb27SDimitry Andric    TuningFastVariablePerLaneShuffle,
86706c3fb27SDimitry Andric    TuningPrefer256Bit,
86806c3fb27SDimitry Andric    TuningFastGather,
86906c3fb27SDimitry Andric    TuningPOPCNTFalseDeps,
87006c3fb27SDimitry Andric    TuningInsertVZEROUPPER,
87106c3fb27SDimitry Andric    TuningAllowLight256Bit
87206c3fb27SDimitry Andric  ];
873e8d8bef9SDimitry Andric
8740b57cec5SDimitry Andric  // Nehalem
875e8d8bef9SDimitry Andric  list<SubtargetFeature> NHMFeatures = X86_64V2Features;
876349cc55cSDimitry Andric  list<SubtargetFeature> NHMTuning = [TuningMacroFusion,
877cadd2ca2SDimitry Andric                                      TuningSlowDivide64,
87806c3fb27SDimitry Andric                                      TuningInsertVZEROUPPER,
87906c3fb27SDimitry Andric                                      TuningNoDomainDelayMov];
8800b57cec5SDimitry Andric
8810b57cec5SDimitry Andric  // Westmere
8820b57cec5SDimitry Andric  list<SubtargetFeature> WSMAdditionalFeatures = [FeaturePCLMUL];
883e8d8bef9SDimitry Andric  list<SubtargetFeature> WSMTuning = NHMTuning;
8840b57cec5SDimitry Andric  list<SubtargetFeature> WSMFeatures =
885e8d8bef9SDimitry Andric    !listconcat(NHMFeatures, WSMAdditionalFeatures);
8860b57cec5SDimitry Andric
8870b57cec5SDimitry Andric  // Sandybridge
8880b57cec5SDimitry Andric  list<SubtargetFeature> SNBAdditionalFeatures = [FeatureAVX,
8890b57cec5SDimitry Andric                                                  FeatureXSAVE,
890e8d8bef9SDimitry Andric                                                  FeatureXSAVEOPT];
891349cc55cSDimitry Andric  list<SubtargetFeature> SNBTuning = [TuningMacroFusion,
892349cc55cSDimitry Andric                                      TuningSlow3OpsLEA,
893349cc55cSDimitry Andric                                      TuningSlowDivide64,
894349cc55cSDimitry Andric                                      TuningSlowUAMem32,
895349cc55cSDimitry Andric                                      TuningFastScalarFSQRT,
896349cc55cSDimitry Andric                                      TuningFastSHLDRotate,
897349cc55cSDimitry Andric                                      TuningFast15ByteNOP,
898349cc55cSDimitry Andric                                      TuningPOPCNTFalseDeps,
89906c3fb27SDimitry Andric                                      TuningInsertVZEROUPPER,
90006c3fb27SDimitry Andric                                      TuningNoDomainDelayMov];
9010b57cec5SDimitry Andric  list<SubtargetFeature> SNBFeatures =
902e8d8bef9SDimitry Andric    !listconcat(WSMFeatures, SNBAdditionalFeatures);
9030b57cec5SDimitry Andric
9040b57cec5SDimitry Andric  // Ivybridge
9050b57cec5SDimitry Andric  list<SubtargetFeature> IVBAdditionalFeatures = [FeatureRDRAND,
9060b57cec5SDimitry Andric                                                  FeatureF16C,
9070b57cec5SDimitry Andric                                                  FeatureFSGSBase];
908e8d8bef9SDimitry Andric  list<SubtargetFeature> IVBTuning = SNBTuning;
9090b57cec5SDimitry Andric  list<SubtargetFeature> IVBFeatures =
910e8d8bef9SDimitry Andric    !listconcat(SNBFeatures, IVBAdditionalFeatures);
9110b57cec5SDimitry Andric
9120b57cec5SDimitry Andric  // Haswell
9130b57cec5SDimitry Andric  list<SubtargetFeature> HSWAdditionalFeatures = [FeatureAVX2,
9140b57cec5SDimitry Andric                                                  FeatureBMI,
9150b57cec5SDimitry Andric                                                  FeatureBMI2,
9160b57cec5SDimitry Andric                                                  FeatureERMSB,
9170b57cec5SDimitry Andric                                                  FeatureFMA,
9180b57cec5SDimitry Andric                                                  FeatureINVPCID,
9190b57cec5SDimitry Andric                                                  FeatureLZCNT,
920e8d8bef9SDimitry Andric                                                  FeatureMOVBE];
921349cc55cSDimitry Andric  list<SubtargetFeature> HSWTuning = [TuningMacroFusion,
922349cc55cSDimitry Andric                                      TuningSlow3OpsLEA,
923349cc55cSDimitry Andric                                      TuningSlowDivide64,
924349cc55cSDimitry Andric                                      TuningFastScalarFSQRT,
925349cc55cSDimitry Andric                                      TuningFastSHLDRotate,
926349cc55cSDimitry Andric                                      TuningFast15ByteNOP,
927349cc55cSDimitry Andric                                      TuningFastVariableCrossLaneShuffle,
928349cc55cSDimitry Andric                                      TuningFastVariablePerLaneShuffle,
929349cc55cSDimitry Andric                                      TuningPOPCNTFalseDeps,
930349cc55cSDimitry Andric                                      TuningLZCNTFalseDeps,
931bdd1243dSDimitry Andric                                      TuningInsertVZEROUPPER,
93206c3fb27SDimitry Andric                                      TuningAllowLight256Bit,
93306c3fb27SDimitry Andric                                      TuningNoDomainDelayMov,
93406c3fb27SDimitry Andric                                      TuningNoDomainDelayShuffle];
9350b57cec5SDimitry Andric  list<SubtargetFeature> HSWFeatures =
936e8d8bef9SDimitry Andric    !listconcat(IVBFeatures, HSWAdditionalFeatures);
9370b57cec5SDimitry Andric
9380b57cec5SDimitry Andric  // Broadwell
9390b57cec5SDimitry Andric  list<SubtargetFeature> BDWAdditionalFeatures = [FeatureADX,
9400b57cec5SDimitry Andric                                                  FeatureRDSEED,
9410b57cec5SDimitry Andric                                                  FeaturePRFCHW];
942e8d8bef9SDimitry Andric  list<SubtargetFeature> BDWTuning = HSWTuning;
9430b57cec5SDimitry Andric  list<SubtargetFeature> BDWFeatures =
944e8d8bef9SDimitry Andric    !listconcat(HSWFeatures, BDWAdditionalFeatures);
9450b57cec5SDimitry Andric
9460b57cec5SDimitry Andric  // Skylake
9470b57cec5SDimitry Andric  list<SubtargetFeature> SKLAdditionalFeatures = [FeatureAES,
9480b57cec5SDimitry Andric                                                  FeatureXSAVEC,
9490b57cec5SDimitry Andric                                                  FeatureXSAVES,
950fe6060f1SDimitry Andric                                                  FeatureCLFLUSHOPT];
951349cc55cSDimitry Andric  list<SubtargetFeature> SKLTuning = [TuningFastGather,
952349cc55cSDimitry Andric                                      TuningMacroFusion,
953349cc55cSDimitry Andric                                      TuningSlow3OpsLEA,
954349cc55cSDimitry Andric                                      TuningSlowDivide64,
955349cc55cSDimitry Andric                                      TuningFastScalarFSQRT,
956349cc55cSDimitry Andric                                      TuningFastVectorFSQRT,
957349cc55cSDimitry Andric                                      TuningFastSHLDRotate,
958349cc55cSDimitry Andric                                      TuningFast15ByteNOP,
959349cc55cSDimitry Andric                                      TuningFastVariableCrossLaneShuffle,
960349cc55cSDimitry Andric                                      TuningFastVariablePerLaneShuffle,
961349cc55cSDimitry Andric                                      TuningPOPCNTFalseDeps,
962bdd1243dSDimitry Andric                                      TuningInsertVZEROUPPER,
96306c3fb27SDimitry Andric                                      TuningAllowLight256Bit,
96406c3fb27SDimitry Andric                                      TuningNoDomainDelayMov,
96506c3fb27SDimitry Andric                                      TuningNoDomainDelayShuffle,
96606c3fb27SDimitry Andric                                      TuningNoDomainDelayBlend];
9670b57cec5SDimitry Andric  list<SubtargetFeature> SKLFeatures =
968e8d8bef9SDimitry Andric    !listconcat(BDWFeatures, SKLAdditionalFeatures);
9690b57cec5SDimitry Andric
9700b57cec5SDimitry Andric  // Skylake-AVX512
971e8d8bef9SDimitry Andric  list<SubtargetFeature> SKXAdditionalFeatures = [FeatureAES,
972e8d8bef9SDimitry Andric                                                  FeatureXSAVEC,
973e8d8bef9SDimitry Andric                                                  FeatureXSAVES,
974e8d8bef9SDimitry Andric                                                  FeatureCLFLUSHOPT,
975e8d8bef9SDimitry Andric                                                  FeatureAVX512,
9765f757f3fSDimitry Andric                                                  FeatureEVEX512,
9770b57cec5SDimitry Andric                                                  FeatureCDI,
9780b57cec5SDimitry Andric                                                  FeatureDQI,
9790b57cec5SDimitry Andric                                                  FeatureBWI,
9800b57cec5SDimitry Andric                                                  FeatureVLX,
9810b57cec5SDimitry Andric                                                  FeaturePKU,
9820b57cec5SDimitry Andric                                                  FeatureCLWB];
983349cc55cSDimitry Andric  list<SubtargetFeature> SKXTuning = [TuningFastGather,
984349cc55cSDimitry Andric                                      TuningMacroFusion,
985349cc55cSDimitry Andric                                      TuningSlow3OpsLEA,
986349cc55cSDimitry Andric                                      TuningSlowDivide64,
987349cc55cSDimitry Andric                                      TuningFastScalarFSQRT,
988349cc55cSDimitry Andric                                      TuningFastVectorFSQRT,
989349cc55cSDimitry Andric                                      TuningFastSHLDRotate,
990349cc55cSDimitry Andric                                      TuningFast15ByteNOP,
991349cc55cSDimitry Andric                                      TuningFastVariableCrossLaneShuffle,
992349cc55cSDimitry Andric                                      TuningFastVariablePerLaneShuffle,
993349cc55cSDimitry Andric                                      TuningPrefer256Bit,
994349cc55cSDimitry Andric                                      TuningPOPCNTFalseDeps,
995bdd1243dSDimitry Andric                                      TuningInsertVZEROUPPER,
99606c3fb27SDimitry Andric                                      TuningAllowLight256Bit,
99706c3fb27SDimitry Andric                                      TuningPreferShiftShuffle,
99806c3fb27SDimitry Andric                                      TuningNoDomainDelayMov,
99906c3fb27SDimitry Andric                                      TuningNoDomainDelayShuffle,
100006c3fb27SDimitry Andric                                      TuningNoDomainDelayBlend,
100106c3fb27SDimitry Andric                                      TuningFastImmVectorShift];
10020b57cec5SDimitry Andric  list<SubtargetFeature> SKXFeatures =
1003e8d8bef9SDimitry Andric    !listconcat(BDWFeatures, SKXAdditionalFeatures);
10040b57cec5SDimitry Andric
10050b57cec5SDimitry Andric  // Cascadelake
10060b57cec5SDimitry Andric  list<SubtargetFeature> CLXAdditionalFeatures = [FeatureVNNI];
1007e8d8bef9SDimitry Andric  list<SubtargetFeature> CLXTuning = SKXTuning;
10080b57cec5SDimitry Andric  list<SubtargetFeature> CLXFeatures =
1009e8d8bef9SDimitry Andric    !listconcat(SKXFeatures, CLXAdditionalFeatures);
10100b57cec5SDimitry Andric
10110b57cec5SDimitry Andric  // Cooperlake
10120b57cec5SDimitry Andric  list<SubtargetFeature> CPXAdditionalFeatures = [FeatureBF16];
1013e8d8bef9SDimitry Andric  list<SubtargetFeature> CPXTuning = SKXTuning;
10140b57cec5SDimitry Andric  list<SubtargetFeature> CPXFeatures =
1015e8d8bef9SDimitry Andric    !listconcat(CLXFeatures, CPXAdditionalFeatures);
10160b57cec5SDimitry Andric
10170b57cec5SDimitry Andric  // Cannonlake
10180b57cec5SDimitry Andric  list<SubtargetFeature> CNLAdditionalFeatures = [FeatureAVX512,
10195f757f3fSDimitry Andric                                                  FeatureEVEX512,
10200b57cec5SDimitry Andric                                                  FeatureCDI,
10210b57cec5SDimitry Andric                                                  FeatureDQI,
10220b57cec5SDimitry Andric                                                  FeatureBWI,
10230b57cec5SDimitry Andric                                                  FeatureVLX,
10240b57cec5SDimitry Andric                                                  FeaturePKU,
10250b57cec5SDimitry Andric                                                  FeatureVBMI,
10260b57cec5SDimitry Andric                                                  FeatureIFMA,
1027e8d8bef9SDimitry Andric                                                  FeatureSHA];
1028349cc55cSDimitry Andric  list<SubtargetFeature> CNLTuning = [TuningFastGather,
1029349cc55cSDimitry Andric                                      TuningMacroFusion,
1030349cc55cSDimitry Andric                                      TuningSlow3OpsLEA,
1031349cc55cSDimitry Andric                                      TuningSlowDivide64,
1032349cc55cSDimitry Andric                                      TuningFastScalarFSQRT,
1033349cc55cSDimitry Andric                                      TuningFastVectorFSQRT,
1034349cc55cSDimitry Andric                                      TuningFastSHLDRotate,
1035349cc55cSDimitry Andric                                      TuningFast15ByteNOP,
1036349cc55cSDimitry Andric                                      TuningFastVariableCrossLaneShuffle,
1037349cc55cSDimitry Andric                                      TuningFastVariablePerLaneShuffle,
1038349cc55cSDimitry Andric                                      TuningPrefer256Bit,
1039bdd1243dSDimitry Andric                                      TuningInsertVZEROUPPER,
104006c3fb27SDimitry Andric                                      TuningAllowLight256Bit,
104106c3fb27SDimitry Andric                                      TuningNoDomainDelayMov,
104206c3fb27SDimitry Andric                                      TuningNoDomainDelayShuffle,
104306c3fb27SDimitry Andric                                      TuningNoDomainDelayBlend,
104406c3fb27SDimitry Andric                                      TuningFastImmVectorShift];
10450b57cec5SDimitry Andric  list<SubtargetFeature> CNLFeatures =
1046e8d8bef9SDimitry Andric    !listconcat(SKLFeatures, CNLAdditionalFeatures);
10470b57cec5SDimitry Andric
10480b57cec5SDimitry Andric  // Icelake
10490b57cec5SDimitry Andric  list<SubtargetFeature> ICLAdditionalFeatures = [FeatureBITALG,
10500b57cec5SDimitry Andric                                                  FeatureVAES,
10510b57cec5SDimitry Andric                                                  FeatureVBMI2,
10520b57cec5SDimitry Andric                                                  FeatureVNNI,
10530b57cec5SDimitry Andric                                                  FeatureVPCLMULQDQ,
10540b57cec5SDimitry Andric                                                  FeatureVPOPCNTDQ,
10550b57cec5SDimitry Andric                                                  FeatureGFNI,
1056e8d8bef9SDimitry Andric                                                  FeatureRDPID,
1057e8d8bef9SDimitry Andric                                                  FeatureFSRM];
1058349cc55cSDimitry Andric  list<SubtargetFeature> ICLTuning = [TuningFastGather,
1059349cc55cSDimitry Andric                                      TuningMacroFusion,
1060349cc55cSDimitry Andric                                      TuningSlowDivide64,
1061349cc55cSDimitry Andric                                      TuningFastScalarFSQRT,
1062349cc55cSDimitry Andric                                      TuningFastVectorFSQRT,
1063349cc55cSDimitry Andric                                      TuningFastSHLDRotate,
1064349cc55cSDimitry Andric                                      TuningFast15ByteNOP,
1065349cc55cSDimitry Andric                                      TuningFastVariableCrossLaneShuffle,
1066349cc55cSDimitry Andric                                      TuningFastVariablePerLaneShuffle,
1067349cc55cSDimitry Andric                                      TuningPrefer256Bit,
1068bdd1243dSDimitry Andric                                      TuningInsertVZEROUPPER,
106906c3fb27SDimitry Andric                                      TuningAllowLight256Bit,
107006c3fb27SDimitry Andric                                      TuningNoDomainDelayMov,
107106c3fb27SDimitry Andric                                      TuningNoDomainDelayShuffle,
107206c3fb27SDimitry Andric                                      TuningNoDomainDelayBlend,
107306c3fb27SDimitry Andric                                      TuningFastImmVectorShift];
10740b57cec5SDimitry Andric  list<SubtargetFeature> ICLFeatures =
1075e8d8bef9SDimitry Andric    !listconcat(CNLFeatures, ICLAdditionalFeatures);
10760b57cec5SDimitry Andric
10770b57cec5SDimitry Andric  // Icelake Server
1078e8d8bef9SDimitry Andric  list<SubtargetFeature> ICXAdditionalFeatures = [FeaturePCONFIG,
1079fe6060f1SDimitry Andric                                                  FeatureCLWB,
1080e8d8bef9SDimitry Andric                                                  FeatureWBNOINVD];
1081349cc55cSDimitry Andric  list<SubtargetFeature> ICXTuning = ICLTuning;
10820b57cec5SDimitry Andric  list<SubtargetFeature> ICXFeatures =
1083e8d8bef9SDimitry Andric    !listconcat(ICLFeatures, ICXAdditionalFeatures);
10840b57cec5SDimitry Andric
10858bcb0991SDimitry Andric  // Tigerlake
10868bcb0991SDimitry Andric  list<SubtargetFeature> TGLAdditionalFeatures = [FeatureVP2INTERSECT,
1087fe6060f1SDimitry Andric                                                  FeatureCLWB,
10888bcb0991SDimitry Andric                                                  FeatureMOVDIRI,
10898bcb0991SDimitry Andric                                                  FeatureMOVDIR64B,
10908bcb0991SDimitry Andric                                                  FeatureSHSTK];
1091349cc55cSDimitry Andric  list<SubtargetFeature> TGLTuning = ICLTuning;
10928bcb0991SDimitry Andric  list<SubtargetFeature> TGLFeatures =
1093e8d8bef9SDimitry Andric    !listconcat(ICLFeatures, TGLAdditionalFeatures );
1094e8d8bef9SDimitry Andric
1095e8d8bef9SDimitry Andric  // Sapphirerapids
1096e8d8bef9SDimitry Andric  list<SubtargetFeature> SPRAdditionalFeatures = [FeatureAMXTILE,
1097e8d8bef9SDimitry Andric                                                  FeatureAMXINT8,
1098e8d8bef9SDimitry Andric                                                  FeatureAMXBF16,
1099e8d8bef9SDimitry Andric                                                  FeatureBF16,
1100e8d8bef9SDimitry Andric                                                  FeatureSERIALIZE,
1101e8d8bef9SDimitry Andric                                                  FeatureCLDEMOTE,
1102e8d8bef9SDimitry Andric                                                  FeatureWAITPKG,
1103e8d8bef9SDimitry Andric                                                  FeaturePTWRITE,
1104349cc55cSDimitry Andric                                                  FeatureFP16,
1105e8d8bef9SDimitry Andric                                                  FeatureAVXVNNI,
1106e8d8bef9SDimitry Andric                                                  FeatureTSXLDTRK,
1107e8d8bef9SDimitry Andric                                                  FeatureENQCMD,
1108e8d8bef9SDimitry Andric                                                  FeatureSHSTK,
1109e8d8bef9SDimitry Andric                                                  FeatureMOVDIRI,
1110e8d8bef9SDimitry Andric                                                  FeatureMOVDIR64B,
1111e8d8bef9SDimitry Andric                                                  FeatureUINTR];
111281ad6265SDimitry Andric  list<SubtargetFeature> SPRAdditionalTuning = [TuningMULCFalseDeps,
111381ad6265SDimitry Andric                                                TuningPERMFalseDeps,
111481ad6265SDimitry Andric                                                TuningRANGEFalseDeps,
111581ad6265SDimitry Andric                                                TuningGETMANTFalseDeps,
111681ad6265SDimitry Andric                                                TuningMULLQFalseDeps];
111781ad6265SDimitry Andric  list<SubtargetFeature> SPRTuning = !listconcat(ICXTuning, SPRAdditionalTuning);
1118e8d8bef9SDimitry Andric  list<SubtargetFeature> SPRFeatures =
1119e8d8bef9SDimitry Andric    !listconcat(ICXFeatures, SPRAdditionalFeatures);
1120e8d8bef9SDimitry Andric
1121bdd1243dSDimitry Andric  // Graniterapids
1122bdd1243dSDimitry Andric  list<SubtargetFeature> GNRAdditionalFeatures = [FeatureAMXFP16,
1123bdd1243dSDimitry Andric                                                  FeaturePREFETCHI];
1124bdd1243dSDimitry Andric  list<SubtargetFeature> GNRFeatures =
1125bdd1243dSDimitry Andric    !listconcat(SPRFeatures, GNRAdditionalFeatures);
11260fca6ea1SDimitry Andric  list<SubtargetFeature> GNRAdditionalTuning = [TuningBranchHint];
11270fca6ea1SDimitry Andric  list<SubtargetFeature> GNRTuning = !listconcat(SPRTuning, GNRAdditionalTuning);
1128bdd1243dSDimitry Andric
112906c3fb27SDimitry Andric  // Graniterapids D
113006c3fb27SDimitry Andric  list<SubtargetFeature> GNRDAdditionalFeatures = [FeatureAMXCOMPLEX];
113106c3fb27SDimitry Andric  list<SubtargetFeature> GNRDFeatures =
113206c3fb27SDimitry Andric    !listconcat(GNRFeatures, GNRDAdditionalFeatures);
113306c3fb27SDimitry Andric
11340b57cec5SDimitry Andric  // Atom
1135e8d8bef9SDimitry Andric  list<SubtargetFeature> AtomFeatures = [FeatureX87,
113681ad6265SDimitry Andric                                         FeatureCX8,
11370b57cec5SDimitry Andric                                         FeatureCMOV,
11380b57cec5SDimitry Andric                                         FeatureMMX,
11390b57cec5SDimitry Andric                                         FeatureSSSE3,
11400b57cec5SDimitry Andric                                         FeatureFXSR,
11410b57cec5SDimitry Andric                                         FeatureNOPL,
114281ad6265SDimitry Andric                                         FeatureX86_64,
114381ad6265SDimitry Andric                                         FeatureCX16,
11440b57cec5SDimitry Andric                                         FeatureMOVBE,
114581ad6265SDimitry Andric                                         FeatureLAHFSAHF64];
1146e8d8bef9SDimitry Andric  list<SubtargetFeature> AtomTuning = [ProcIntelAtom,
1147349cc55cSDimitry Andric                                       TuningSlowUAMem16,
1148349cc55cSDimitry Andric                                       TuningLEAForSP,
1149349cc55cSDimitry Andric                                       TuningSlowDivide32,
1150349cc55cSDimitry Andric                                       TuningSlowDivide64,
1151349cc55cSDimitry Andric                                       TuningSlowTwoMemOps,
11520fca6ea1SDimitry Andric                                       TuningFastImm16,
1153349cc55cSDimitry Andric                                       TuningLEAUsesAG,
1154349cc55cSDimitry Andric                                       TuningPadShortFunctions,
115506c3fb27SDimitry Andric                                       TuningInsertVZEROUPPER,
115606c3fb27SDimitry Andric                                       TuningNoDomainDelay];
11570b57cec5SDimitry Andric
11580b57cec5SDimitry Andric  // Silvermont
11590b57cec5SDimitry Andric  list<SubtargetFeature> SLMAdditionalFeatures = [FeatureSSE42,
1160349cc55cSDimitry Andric                                                  FeatureCRC32,
11610b57cec5SDimitry Andric                                                  FeaturePOPCNT,
11620b57cec5SDimitry Andric                                                  FeaturePCLMUL,
11630b57cec5SDimitry Andric                                                  FeaturePRFCHW,
1164e8d8bef9SDimitry Andric                                                  FeatureRDRAND];
1165349cc55cSDimitry Andric  list<SubtargetFeature> SLMTuning = [TuningUseSLMArithCosts,
1166349cc55cSDimitry Andric                                      TuningSlowTwoMemOps,
1167349cc55cSDimitry Andric                                      TuningSlowLEA,
1168349cc55cSDimitry Andric                                      TuningSlowIncDec,
1169349cc55cSDimitry Andric                                      TuningSlowDivide64,
1170349cc55cSDimitry Andric                                      TuningSlowPMULLD,
1171349cc55cSDimitry Andric                                      TuningFast7ByteNOP,
1172349cc55cSDimitry Andric                                      TuningFastMOVBE,
11730fca6ea1SDimitry Andric                                      TuningFastImm16,
1174349cc55cSDimitry Andric                                      TuningPOPCNTFalseDeps,
117506c3fb27SDimitry Andric                                      TuningInsertVZEROUPPER,
117606c3fb27SDimitry Andric                                      TuningNoDomainDelay];
11770b57cec5SDimitry Andric  list<SubtargetFeature> SLMFeatures =
1178e8d8bef9SDimitry Andric    !listconcat(AtomFeatures, SLMAdditionalFeatures);
11790b57cec5SDimitry Andric
11800b57cec5SDimitry Andric  // Goldmont
11810b57cec5SDimitry Andric  list<SubtargetFeature> GLMAdditionalFeatures = [FeatureAES,
11820b57cec5SDimitry Andric                                                  FeatureSHA,
11830b57cec5SDimitry Andric                                                  FeatureRDSEED,
11840b57cec5SDimitry Andric                                                  FeatureXSAVE,
11850b57cec5SDimitry Andric                                                  FeatureXSAVEOPT,
11860b57cec5SDimitry Andric                                                  FeatureXSAVEC,
11870b57cec5SDimitry Andric                                                  FeatureXSAVES,
11880b57cec5SDimitry Andric                                                  FeatureCLFLUSHOPT,
11890b57cec5SDimitry Andric                                                  FeatureFSGSBase];
1190349cc55cSDimitry Andric  list<SubtargetFeature> GLMTuning = [TuningUseGLMDivSqrtCosts,
1191349cc55cSDimitry Andric                                      TuningSlowTwoMemOps,
1192349cc55cSDimitry Andric                                      TuningSlowLEA,
1193349cc55cSDimitry Andric                                      TuningSlowIncDec,
1194349cc55cSDimitry Andric                                      TuningFastMOVBE,
11950fca6ea1SDimitry Andric                                      TuningFastImm16,
1196349cc55cSDimitry Andric                                      TuningPOPCNTFalseDeps,
119706c3fb27SDimitry Andric                                      TuningInsertVZEROUPPER,
119806c3fb27SDimitry Andric                                      TuningNoDomainDelay];
11990b57cec5SDimitry Andric  list<SubtargetFeature> GLMFeatures =
1200e8d8bef9SDimitry Andric    !listconcat(SLMFeatures, GLMAdditionalFeatures);
12010b57cec5SDimitry Andric
12020b57cec5SDimitry Andric  // Goldmont Plus
12030b57cec5SDimitry Andric  list<SubtargetFeature> GLPAdditionalFeatures = [FeaturePTWRITE,
1204fe6060f1SDimitry Andric                                                  FeatureRDPID];
1205349cc55cSDimitry Andric  list<SubtargetFeature> GLPTuning = [TuningUseGLMDivSqrtCosts,
1206349cc55cSDimitry Andric                                      TuningSlowTwoMemOps,
1207349cc55cSDimitry Andric                                      TuningSlowLEA,
1208349cc55cSDimitry Andric                                      TuningSlowIncDec,
1209349cc55cSDimitry Andric                                      TuningFastMOVBE,
12100fca6ea1SDimitry Andric                                      TuningFastImm16,
121106c3fb27SDimitry Andric                                      TuningInsertVZEROUPPER,
121206c3fb27SDimitry Andric                                      TuningNoDomainDelay];
12130b57cec5SDimitry Andric  list<SubtargetFeature> GLPFeatures =
1214e8d8bef9SDimitry Andric    !listconcat(GLMFeatures, GLPAdditionalFeatures);
12150b57cec5SDimitry Andric
12160b57cec5SDimitry Andric  // Tremont
12175ffd83dbSDimitry Andric  list<SubtargetFeature> TRMAdditionalFeatures = [FeatureCLWB,
12185ffd83dbSDimitry Andric                                                  FeatureGFNI];
1219e8d8bef9SDimitry Andric  list<SubtargetFeature> TRMTuning = GLPTuning;
12200b57cec5SDimitry Andric  list<SubtargetFeature> TRMFeatures =
1221e8d8bef9SDimitry Andric    !listconcat(GLPFeatures, TRMAdditionalFeatures);
12220b57cec5SDimitry Andric
1223fe6060f1SDimitry Andric  // Alderlake
1224fe6060f1SDimitry Andric  list<SubtargetFeature> ADLAdditionalFeatures = [FeatureSERIALIZE,
1225fe6060f1SDimitry Andric                                                  FeaturePCONFIG,
1226fe6060f1SDimitry Andric                                                  FeatureSHSTK,
1227fe6060f1SDimitry Andric                                                  FeatureWIDEKL,
1228fe6060f1SDimitry Andric                                                  FeatureINVPCID,
1229fe6060f1SDimitry Andric                                                  FeatureADX,
1230fe6060f1SDimitry Andric                                                  FeatureFMA,
1231fe6060f1SDimitry Andric                                                  FeatureVAES,
1232fe6060f1SDimitry Andric                                                  FeatureVPCLMULQDQ,
1233fe6060f1SDimitry Andric                                                  FeatureF16C,
1234fe6060f1SDimitry Andric                                                  FeatureBMI,
1235fe6060f1SDimitry Andric                                                  FeatureBMI2,
1236fe6060f1SDimitry Andric                                                  FeatureLZCNT,
1237fe6060f1SDimitry Andric                                                  FeatureAVXVNNI,
1238fe6060f1SDimitry Andric                                                  FeaturePKU,
1239fe6060f1SDimitry Andric                                                  FeatureHRESET,
1240fe6060f1SDimitry Andric                                                  FeatureCLDEMOTE,
1241fe6060f1SDimitry Andric                                                  FeatureMOVDIRI,
1242fe6060f1SDimitry Andric                                                  FeatureMOVDIR64B,
1243fe6060f1SDimitry Andric                                                  FeatureWAITPKG];
124406c3fb27SDimitry Andric  list<SubtargetFeature> ADLAdditionalTuning = [TuningPERMFalseDeps,
124506c3fb27SDimitry Andric                                                TuningPreferMovmskOverVTest,
124606c3fb27SDimitry Andric                                                TuningFastImmVectorShift];
124781ad6265SDimitry Andric  list<SubtargetFeature> ADLTuning = !listconcat(SKLTuning, ADLAdditionalTuning);
1248fe6060f1SDimitry Andric  list<SubtargetFeature> ADLFeatures =
1249fe6060f1SDimitry Andric    !listconcat(TRMFeatures, ADLAdditionalFeatures);
1250fe6060f1SDimitry Andric
12515f757f3fSDimitry Andric  // Gracemont
12525f757f3fSDimitry Andric  list<SubtargetFeature> GRTTuning = [TuningMacroFusion,
12535f757f3fSDimitry Andric                                      TuningSlow3OpsLEA,
12545f757f3fSDimitry Andric                                      TuningFastScalarFSQRT,
12555f757f3fSDimitry Andric                                      TuningFastVectorFSQRT,
12565f757f3fSDimitry Andric                                      TuningFast15ByteNOP,
12575f757f3fSDimitry Andric                                      TuningFastVariablePerLaneShuffle,
12585f757f3fSDimitry Andric                                      TuningPOPCNTFalseDeps,
12595f757f3fSDimitry Andric                                      TuningInsertVZEROUPPER];
12605f757f3fSDimitry Andric
1261bdd1243dSDimitry Andric  // Sierraforest
1262bdd1243dSDimitry Andric  list<SubtargetFeature> SRFAdditionalFeatures = [FeatureCMPCCXADD,
1263bdd1243dSDimitry Andric                                                  FeatureAVXIFMA,
1264bdd1243dSDimitry Andric                                                  FeatureAVXNECONVERT,
126506c3fb27SDimitry Andric                                                  FeatureENQCMD,
126606c3fb27SDimitry Andric                                                  FeatureUINTR,
1267bdd1243dSDimitry Andric                                                  FeatureAVXVNNIINT8];
1268bdd1243dSDimitry Andric  list<SubtargetFeature> SRFFeatures =
1269bdd1243dSDimitry Andric    !listconcat(ADLFeatures, SRFAdditionalFeatures);
1270bdd1243dSDimitry Andric
12715f757f3fSDimitry Andric  // Arrowlake S
12725f757f3fSDimitry Andric  list<SubtargetFeature> ARLSAdditionalFeatures = [FeatureAVXVNNIINT16,
12735f757f3fSDimitry Andric                                                   FeatureSHA512,
12745f757f3fSDimitry Andric                                                   FeatureSM3,
12755f757f3fSDimitry Andric                                                   FeatureSM4];
12765f757f3fSDimitry Andric  list<SubtargetFeature> ARLSFeatures =
12775f757f3fSDimitry Andric    !listconcat(SRFFeatures, ARLSAdditionalFeatures);
12785f757f3fSDimitry Andric
12795f757f3fSDimitry Andric  // Pantherlake
12805f757f3fSDimitry Andric  list<SubtargetFeature> PTLAdditionalFeatures = [FeaturePREFETCHI];
12815f757f3fSDimitry Andric  list<SubtargetFeature> PTLFeatures =
12825f757f3fSDimitry Andric    !listconcat(ARLSFeatures, PTLAdditionalFeatures);
12835f757f3fSDimitry Andric
12845f757f3fSDimitry Andric
12855f757f3fSDimitry Andric  // Clearwaterforest
12865f757f3fSDimitry Andric  list<SubtargetFeature> CWFAdditionalFeatures = [FeaturePREFETCHI,
12875f757f3fSDimitry Andric                                                  FeatureUSERMSR];
12885f757f3fSDimitry Andric  list<SubtargetFeature> CWFFeatures =
12895f757f3fSDimitry Andric    !listconcat(ARLSFeatures, CWFAdditionalFeatures);
12905f757f3fSDimitry Andric
12910b57cec5SDimitry Andric  // Knights Landing
12920b57cec5SDimitry Andric  list<SubtargetFeature> KNLFeatures = [FeatureX87,
129381ad6265SDimitry Andric                                        FeatureCX8,
12940b57cec5SDimitry Andric                                        FeatureCMOV,
12950b57cec5SDimitry Andric                                        FeatureMMX,
12960b57cec5SDimitry Andric                                        FeatureFXSR,
12970b57cec5SDimitry Andric                                        FeatureNOPL,
129881ad6265SDimitry Andric                                        FeatureX86_64,
129981ad6265SDimitry Andric                                        FeatureCX16,
1300349cc55cSDimitry Andric                                        FeatureCRC32,
13010b57cec5SDimitry Andric                                        FeaturePOPCNT,
13020b57cec5SDimitry Andric                                        FeaturePCLMUL,
13030b57cec5SDimitry Andric                                        FeatureXSAVE,
13040b57cec5SDimitry Andric                                        FeatureXSAVEOPT,
130581ad6265SDimitry Andric                                        FeatureLAHFSAHF64,
13060b57cec5SDimitry Andric                                        FeatureAES,
13070b57cec5SDimitry Andric                                        FeatureRDRAND,
13080b57cec5SDimitry Andric                                        FeatureF16C,
13090b57cec5SDimitry Andric                                        FeatureFSGSBase,
13100b57cec5SDimitry Andric                                        FeatureAVX512,
13115f757f3fSDimitry Andric                                        FeatureEVEX512,
13120b57cec5SDimitry Andric                                        FeatureCDI,
13130b57cec5SDimitry Andric                                        FeatureADX,
13140b57cec5SDimitry Andric                                        FeatureRDSEED,
13150b57cec5SDimitry Andric                                        FeatureMOVBE,
13160b57cec5SDimitry Andric                                        FeatureLZCNT,
13170b57cec5SDimitry Andric                                        FeatureBMI,
13180b57cec5SDimitry Andric                                        FeatureBMI2,
13190b57cec5SDimitry Andric                                        FeatureFMA,
1320e8d8bef9SDimitry Andric                                        FeaturePRFCHW];
1321349cc55cSDimitry Andric  list<SubtargetFeature> KNLTuning = [TuningSlowDivide64,
1322349cc55cSDimitry Andric                                      TuningSlow3OpsLEA,
1323349cc55cSDimitry Andric                                      TuningSlowIncDec,
1324349cc55cSDimitry Andric                                      TuningSlowTwoMemOps,
1325349cc55cSDimitry Andric                                      TuningPreferMaskRegisters,
1326349cc55cSDimitry Andric                                      TuningFastGather,
1327349cc55cSDimitry Andric                                      TuningFastMOVBE,
13280fca6ea1SDimitry Andric                                      TuningFastImm16,
1329349cc55cSDimitry Andric                                      TuningSlowPMADDWD];
13300b57cec5SDimitry Andric  // TODO Add AVX5124FMAPS/AVX5124VNNIW features
13310b57cec5SDimitry Andric  list<SubtargetFeature> KNMFeatures =
13320b57cec5SDimitry Andric    !listconcat(KNLFeatures, [FeatureVPOPCNTDQ]);
13330b57cec5SDimitry Andric
13348bcb0991SDimitry Andric  // Barcelona
1335e8d8bef9SDimitry Andric  list<SubtargetFeature> BarcelonaFeatures = [FeatureX87,
133681ad6265SDimitry Andric                                              FeatureCX8,
13378bcb0991SDimitry Andric                                              FeatureSSE4A,
13388bcb0991SDimitry Andric                                              FeatureFXSR,
13398bcb0991SDimitry Andric                                              FeatureNOPL,
134081ad6265SDimitry Andric                                              FeatureCX16,
13415ffd83dbSDimitry Andric                                              FeaturePRFCHW,
13428bcb0991SDimitry Andric                                              FeatureLZCNT,
13438bcb0991SDimitry Andric                                              FeaturePOPCNT,
134481ad6265SDimitry Andric                                              FeatureLAHFSAHF64,
13458bcb0991SDimitry Andric                                              FeatureCMOV,
134681ad6265SDimitry Andric                                              FeatureX86_64];
1347349cc55cSDimitry Andric  list<SubtargetFeature> BarcelonaTuning = [TuningFastScalarShiftMasks,
1348cadd2ca2SDimitry Andric                                            TuningSlowDivide64,
1349349cc55cSDimitry Andric                                            TuningSlowSHLD,
135081ad6265SDimitry Andric                                            TuningSBBDepBreaking,
1351349cc55cSDimitry Andric                                            TuningInsertVZEROUPPER];
13520b57cec5SDimitry Andric
13530b57cec5SDimitry Andric  // Bobcat
1354e8d8bef9SDimitry Andric  list<SubtargetFeature> BtVer1Features = [FeatureX87,
135581ad6265SDimitry Andric                                           FeatureCX8,
13560b57cec5SDimitry Andric                                           FeatureCMOV,
13570b57cec5SDimitry Andric                                           FeatureMMX,
13580b57cec5SDimitry Andric                                           FeatureSSSE3,
13590b57cec5SDimitry Andric                                           FeatureSSE4A,
13600b57cec5SDimitry Andric                                           FeatureFXSR,
13610b57cec5SDimitry Andric                                           FeatureNOPL,
136281ad6265SDimitry Andric                                           FeatureX86_64,
136381ad6265SDimitry Andric                                           FeatureCX16,
13640b57cec5SDimitry Andric                                           FeaturePRFCHW,
13650b57cec5SDimitry Andric                                           FeatureLZCNT,
13660b57cec5SDimitry Andric                                           FeaturePOPCNT,
136781ad6265SDimitry Andric                                           FeatureLAHFSAHF64];
1368349cc55cSDimitry Andric  list<SubtargetFeature> BtVer1Tuning = [TuningFast15ByteNOP,
1369349cc55cSDimitry Andric                                         TuningFastScalarShiftMasks,
1370349cc55cSDimitry Andric                                         TuningFastVectorShiftMasks,
1371cadd2ca2SDimitry Andric                                         TuningSlowDivide64,
1372349cc55cSDimitry Andric                                         TuningSlowSHLD,
13730fca6ea1SDimitry Andric                                         TuningFastImm16,
137481ad6265SDimitry Andric                                         TuningSBBDepBreaking,
1375349cc55cSDimitry Andric                                         TuningInsertVZEROUPPER];
13760b57cec5SDimitry Andric
13770b57cec5SDimitry Andric  // Jaguar
13780b57cec5SDimitry Andric  list<SubtargetFeature> BtVer2AdditionalFeatures = [FeatureAVX,
13790b57cec5SDimitry Andric                                                     FeatureAES,
1380349cc55cSDimitry Andric                                                     FeatureCRC32,
13810b57cec5SDimitry Andric                                                     FeaturePCLMUL,
13820b57cec5SDimitry Andric                                                     FeatureBMI,
13830b57cec5SDimitry Andric                                                     FeatureF16C,
13840b57cec5SDimitry Andric                                                     FeatureMOVBE,
13850b57cec5SDimitry Andric                                                     FeatureXSAVE,
13860b57cec5SDimitry Andric                                                     FeatureXSAVEOPT];
1387349cc55cSDimitry Andric  list<SubtargetFeature> BtVer2Tuning = [TuningFastLZCNT,
1388349cc55cSDimitry Andric                                         TuningFastBEXTR,
1389349cc55cSDimitry Andric                                         TuningFastHorizontalOps,
1390349cc55cSDimitry Andric                                         TuningFast15ByteNOP,
1391349cc55cSDimitry Andric                                         TuningFastScalarShiftMasks,
1392349cc55cSDimitry Andric                                         TuningFastVectorShiftMasks,
1393349cc55cSDimitry Andric                                         TuningFastMOVBE,
13940fca6ea1SDimitry Andric                                         TuningFastImm16,
139581ad6265SDimitry Andric                                         TuningSBBDepBreaking,
1396cadd2ca2SDimitry Andric                                         TuningSlowDivide64,
1397349cc55cSDimitry Andric                                         TuningSlowSHLD];
13980b57cec5SDimitry Andric  list<SubtargetFeature> BtVer2Features =
1399e8d8bef9SDimitry Andric    !listconcat(BtVer1Features, BtVer2AdditionalFeatures);
14000b57cec5SDimitry Andric
14010b57cec5SDimitry Andric  // Bulldozer
1402e8d8bef9SDimitry Andric  list<SubtargetFeature> BdVer1Features = [FeatureX87,
140381ad6265SDimitry Andric                                           FeatureCX8,
14040b57cec5SDimitry Andric                                           FeatureCMOV,
14050b57cec5SDimitry Andric                                           FeatureXOP,
140681ad6265SDimitry Andric                                           FeatureX86_64,
140781ad6265SDimitry Andric                                           FeatureCX16,
14080b57cec5SDimitry Andric                                           FeatureAES,
1409349cc55cSDimitry Andric                                           FeatureCRC32,
14100b57cec5SDimitry Andric                                           FeaturePRFCHW,
14110b57cec5SDimitry Andric                                           FeaturePCLMUL,
14120b57cec5SDimitry Andric                                           FeatureMMX,
14130b57cec5SDimitry Andric                                           FeatureFXSR,
14140b57cec5SDimitry Andric                                           FeatureNOPL,
14150b57cec5SDimitry Andric                                           FeatureLZCNT,
14160b57cec5SDimitry Andric                                           FeaturePOPCNT,
14170b57cec5SDimitry Andric                                           FeatureXSAVE,
14180b57cec5SDimitry Andric                                           FeatureLWP,
141981ad6265SDimitry Andric                                           FeatureLAHFSAHF64];
1420349cc55cSDimitry Andric  list<SubtargetFeature> BdVer1Tuning = [TuningSlowSHLD,
1421cadd2ca2SDimitry Andric                                         TuningSlowDivide64,
1422349cc55cSDimitry Andric                                         TuningFast11ByteNOP,
1423349cc55cSDimitry Andric                                         TuningFastScalarShiftMasks,
1424349cc55cSDimitry Andric                                         TuningBranchFusion,
142581ad6265SDimitry Andric                                         TuningSBBDepBreaking,
1426349cc55cSDimitry Andric                                         TuningInsertVZEROUPPER];
14270b57cec5SDimitry Andric
14280b57cec5SDimitry Andric  // PileDriver
14290b57cec5SDimitry Andric  list<SubtargetFeature> BdVer2AdditionalFeatures = [FeatureF16C,
14300b57cec5SDimitry Andric                                                     FeatureBMI,
14310b57cec5SDimitry Andric                                                     FeatureTBM,
1432349cc55cSDimitry Andric                                                     FeatureFMA];
1433349cc55cSDimitry Andric  list<SubtargetFeature> BdVer2AdditionalTuning = [TuningFastBEXTR,
1434349cc55cSDimitry Andric                                                   TuningFastMOVBE];
1435fe6060f1SDimitry Andric  list<SubtargetFeature> BdVer2Tuning =
1436fe6060f1SDimitry Andric    !listconcat(BdVer1Tuning, BdVer2AdditionalTuning);
1437e8d8bef9SDimitry Andric  list<SubtargetFeature> BdVer2Features =
1438e8d8bef9SDimitry Andric    !listconcat(BdVer1Features, BdVer2AdditionalFeatures);
14390b57cec5SDimitry Andric
14400b57cec5SDimitry Andric  // Steamroller
14410b57cec5SDimitry Andric  list<SubtargetFeature> BdVer3AdditionalFeatures = [FeatureXSAVEOPT,
14420b57cec5SDimitry Andric                                                     FeatureFSGSBase];
1443e8d8bef9SDimitry Andric  list<SubtargetFeature> BdVer3Tuning = BdVer2Tuning;
1444e8d8bef9SDimitry Andric  list<SubtargetFeature> BdVer3Features =
1445e8d8bef9SDimitry Andric    !listconcat(BdVer2Features, BdVer3AdditionalFeatures);
14460b57cec5SDimitry Andric
14470b57cec5SDimitry Andric  // Excavator
14480b57cec5SDimitry Andric  list<SubtargetFeature> BdVer4AdditionalFeatures = [FeatureAVX2,
14490b57cec5SDimitry Andric                                                     FeatureBMI2,
14505ffd83dbSDimitry Andric                                                     FeatureMOVBE,
14515ffd83dbSDimitry Andric                                                     FeatureRDRAND,
14520b57cec5SDimitry Andric                                                     FeatureMWAITX];
1453e8d8bef9SDimitry Andric  list<SubtargetFeature> BdVer4Tuning = BdVer3Tuning;
1454e8d8bef9SDimitry Andric  list<SubtargetFeature> BdVer4Features =
1455e8d8bef9SDimitry Andric    !listconcat(BdVer3Features, BdVer4AdditionalFeatures);
14560b57cec5SDimitry Andric
14570b57cec5SDimitry Andric
14580b57cec5SDimitry Andric  // AMD Zen Processors common ISAs
14590b57cec5SDimitry Andric  list<SubtargetFeature> ZNFeatures = [FeatureADX,
14600b57cec5SDimitry Andric                                       FeatureAES,
14610b57cec5SDimitry Andric                                       FeatureAVX2,
14620b57cec5SDimitry Andric                                       FeatureBMI,
14630b57cec5SDimitry Andric                                       FeatureBMI2,
14640b57cec5SDimitry Andric                                       FeatureCLFLUSHOPT,
14650b57cec5SDimitry Andric                                       FeatureCLZERO,
14660b57cec5SDimitry Andric                                       FeatureCMOV,
146781ad6265SDimitry Andric                                       FeatureX86_64,
146881ad6265SDimitry Andric                                       FeatureCX16,
1469349cc55cSDimitry Andric                                       FeatureCRC32,
14700b57cec5SDimitry Andric                                       FeatureF16C,
14710b57cec5SDimitry Andric                                       FeatureFMA,
14720b57cec5SDimitry Andric                                       FeatureFSGSBase,
14730b57cec5SDimitry Andric                                       FeatureFXSR,
14740b57cec5SDimitry Andric                                       FeatureNOPL,
147581ad6265SDimitry Andric                                       FeatureLAHFSAHF64,
14760b57cec5SDimitry Andric                                       FeatureLZCNT,
14770b57cec5SDimitry Andric                                       FeatureMMX,
14780b57cec5SDimitry Andric                                       FeatureMOVBE,
14790b57cec5SDimitry Andric                                       FeatureMWAITX,
14800b57cec5SDimitry Andric                                       FeaturePCLMUL,
14810b57cec5SDimitry Andric                                       FeaturePOPCNT,
14820b57cec5SDimitry Andric                                       FeaturePRFCHW,
14830b57cec5SDimitry Andric                                       FeatureRDRAND,
14840b57cec5SDimitry Andric                                       FeatureRDSEED,
14850b57cec5SDimitry Andric                                       FeatureSHA,
14860b57cec5SDimitry Andric                                       FeatureSSE4A,
14870b57cec5SDimitry Andric                                       FeatureX87,
14880b57cec5SDimitry Andric                                       FeatureXSAVE,
14890b57cec5SDimitry Andric                                       FeatureXSAVEC,
14900b57cec5SDimitry Andric                                       FeatureXSAVEOPT,
14910b57cec5SDimitry Andric                                       FeatureXSAVES];
1492349cc55cSDimitry Andric  list<SubtargetFeature> ZNTuning = [TuningFastLZCNT,
1493349cc55cSDimitry Andric                                     TuningFastBEXTR,
1494349cc55cSDimitry Andric                                     TuningFast15ByteNOP,
1495349cc55cSDimitry Andric                                     TuningBranchFusion,
1496d56accc7SDimitry Andric                                     TuningFastScalarFSQRT,
1497d56accc7SDimitry Andric                                     TuningFastVectorFSQRT,
1498349cc55cSDimitry Andric                                     TuningFastScalarShiftMasks,
149981ad6265SDimitry Andric                                     TuningFastVariablePerLaneShuffle,
1500349cc55cSDimitry Andric                                     TuningFastMOVBE,
15010fca6ea1SDimitry Andric                                     TuningFastImm16,
1502cadd2ca2SDimitry Andric                                     TuningSlowDivide64,
1503349cc55cSDimitry Andric                                     TuningSlowSHLD,
150481ad6265SDimitry Andric                                     TuningSBBDepBreaking,
1505bdd1243dSDimitry Andric                                     TuningInsertVZEROUPPER,
1506bdd1243dSDimitry Andric                                     TuningAllowLight256Bit];
15070b57cec5SDimitry Andric  list<SubtargetFeature> ZN2AdditionalFeatures = [FeatureCLWB,
15080b57cec5SDimitry Andric                                                  FeatureRDPID,
1509753f127fSDimitry Andric                                                  FeatureRDPRU,
15100b57cec5SDimitry Andric                                                  FeatureWBNOINVD];
1511e8d8bef9SDimitry Andric  list<SubtargetFeature> ZN2Tuning = ZNTuning;
15120b57cec5SDimitry Andric  list<SubtargetFeature> ZN2Features =
15130b57cec5SDimitry Andric    !listconcat(ZNFeatures, ZN2AdditionalFeatures);
1514e8d8bef9SDimitry Andric  list<SubtargetFeature> ZN3AdditionalFeatures = [FeatureFSRM,
1515e8d8bef9SDimitry Andric                                                  FeatureINVPCID,
1516e8d8bef9SDimitry Andric                                                  FeaturePKU,
1517e8d8bef9SDimitry Andric                                                  FeatureVAES,
1518e8d8bef9SDimitry Andric                                                  FeatureVPCLMULQDQ];
151981ad6265SDimitry Andric  list<SubtargetFeature> ZN3AdditionalTuning = [TuningMacroFusion];
1520fe6060f1SDimitry Andric  list<SubtargetFeature> ZN3Tuning =
152181ad6265SDimitry Andric    !listconcat(ZN2Tuning, ZN3AdditionalTuning);
1522e8d8bef9SDimitry Andric  list<SubtargetFeature> ZN3Features =
1523e8d8bef9SDimitry Andric    !listconcat(ZN2Features, ZN3AdditionalFeatures);
15240fca6ea1SDimitry Andric
15250fca6ea1SDimitry Andric
15260fca6ea1SDimitry Andric  list<SubtargetFeature> ZN4AdditionalTuning = [TuningFastDPWSSD];
15270fca6ea1SDimitry Andric  list<SubtargetFeature> ZN4Tuning =
15280fca6ea1SDimitry Andric    !listconcat(ZN3Tuning, ZN4AdditionalTuning);
1529bdd1243dSDimitry Andric  list<SubtargetFeature> ZN4AdditionalFeatures = [FeatureAVX512,
15305f757f3fSDimitry Andric                                                  FeatureEVEX512,
1531bdd1243dSDimitry Andric                                                  FeatureCDI,
1532bdd1243dSDimitry Andric                                                  FeatureDQI,
1533bdd1243dSDimitry Andric                                                  FeatureBWI,
1534bdd1243dSDimitry Andric                                                  FeatureVLX,
1535bdd1243dSDimitry Andric                                                  FeatureVBMI,
1536bdd1243dSDimitry Andric                                                  FeatureVBMI2,
1537bdd1243dSDimitry Andric                                                  FeatureIFMA,
1538bdd1243dSDimitry Andric                                                  FeatureVNNI,
1539bdd1243dSDimitry Andric                                                  FeatureBITALG,
1540bdd1243dSDimitry Andric                                                  FeatureGFNI,
1541bdd1243dSDimitry Andric                                                  FeatureBF16,
1542bdd1243dSDimitry Andric                                                  FeatureSHSTK,
1543bdd1243dSDimitry Andric                                                  FeatureVPOPCNTDQ];
1544bdd1243dSDimitry Andric  list<SubtargetFeature> ZN4Features =
1545bdd1243dSDimitry Andric    !listconcat(ZN3Features, ZN4AdditionalFeatures);
1546*c80e69b0SDimitry Andric
1547*c80e69b0SDimitry Andric
1548*c80e69b0SDimitry Andric  list<SubtargetFeature> ZN5Tuning = ZN4Tuning;
1549*c80e69b0SDimitry Andric  list<SubtargetFeature> ZN5AdditionalFeatures = [FeatureVNNI,
1550*c80e69b0SDimitry Andric                                                  FeatureMOVDIRI,
1551*c80e69b0SDimitry Andric                                                  FeatureMOVDIR64B,
1552*c80e69b0SDimitry Andric                                                  FeatureVP2INTERSECT,
1553*c80e69b0SDimitry Andric                                                  FeaturePREFETCHI,
1554*c80e69b0SDimitry Andric                                                  FeatureAVXVNNI
1555*c80e69b0SDimitry Andric                                                  ];
1556*c80e69b0SDimitry Andric  list<SubtargetFeature> ZN5Features =
1557*c80e69b0SDimitry Andric    !listconcat(ZN4Features, ZN5AdditionalFeatures);
1558*c80e69b0SDimitry Andric
15590b57cec5SDimitry Andric}
15600b57cec5SDimitry Andric
15610b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
15620b57cec5SDimitry Andric// X86 processors supported.
15630b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
15640b57cec5SDimitry Andric
1565e8d8bef9SDimitry Andricclass Proc<string Name, list<SubtargetFeature> Features,
1566e8d8bef9SDimitry Andric           list<SubtargetFeature> TuneFeatures>
1567e8d8bef9SDimitry Andric : ProcessorModel<Name, GenericModel, Features, TuneFeatures>;
1568e8d8bef9SDimitry Andric
1569e8d8bef9SDimitry Andricclass ProcModel<string Name, SchedMachineModel Model,
1570e8d8bef9SDimitry Andric                list<SubtargetFeature> Features,
1571e8d8bef9SDimitry Andric                list<SubtargetFeature> TuneFeatures>
1572e8d8bef9SDimitry Andric : ProcessorModel<Name, Model, Features, TuneFeatures>;
15730b57cec5SDimitry Andric
15745ffd83dbSDimitry Andric// NOTE: CMPXCHG8B is here for legacy compatibility so that it is only disabled
15750b57cec5SDimitry Andric// if i386/i486 is specifically requested.
1576e8d8bef9SDimitry Andric// NOTE: 64Bit is here as "generic" is the default llc CPU. The X86Subtarget
157781ad6265SDimitry Andric// constructor checks that any CPU used in 64-bit mode has FeatureX86_64
157881ad6265SDimitry Andric// enabled. It has no effect on code generation.
157981ad6265SDimitry Andric// NOTE: As a default tuning, "generic" aims to produce code optimized for the
158081ad6265SDimitry Andric// most common X86 processors. The tunings might be changed over time. It is
1581fcaf7f86SDimitry Andric// recommended to use "tune-cpu"="x86-64" in function attribute for consistency.
1582e8d8bef9SDimitry Andricdef : ProcModel<"generic", SandyBridgeModel,
158381ad6265SDimitry Andric                [FeatureX87, FeatureCX8, FeatureX86_64],
1584349cc55cSDimitry Andric                [TuningSlow3OpsLEA,
1585349cc55cSDimitry Andric                 TuningSlowDivide64,
1586349cc55cSDimitry Andric                 TuningMacroFusion,
158781ad6265SDimitry Andric                 TuningFastScalarFSQRT,
158881ad6265SDimitry Andric                 TuningFast15ByteNOP,
1589349cc55cSDimitry Andric                 TuningInsertVZEROUPPER]>;
15900b57cec5SDimitry Andric
1591e8d8bef9SDimitry Andricdef : Proc<"i386",            [FeatureX87],
1592349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
1593e8d8bef9SDimitry Andricdef : Proc<"i486",            [FeatureX87],
1594349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
159581ad6265SDimitry Andricdef : Proc<"i586",            [FeatureX87, FeatureCX8],
1596349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
159781ad6265SDimitry Andricdef : Proc<"pentium",         [FeatureX87, FeatureCX8],
1598349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
159906c3fb27SDimitry Andricforeach P = ["pentium-mmx", "pentium_mmx"] in {
160006c3fb27SDimitry Andric  def : Proc<P, [FeatureX87, FeatureCX8, FeatureMMX],
1601349cc55cSDimitry Andric                [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
160206c3fb27SDimitry Andric}
160381ad6265SDimitry Andricdef : Proc<"i686", [FeatureX87, FeatureCX8, FeatureCMOV],
1604349cc55cSDimitry Andric                   [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
160506c3fb27SDimitry Andricforeach P = ["pentiumpro", "pentium_pro"] in {
160606c3fb27SDimitry Andric  def : Proc<P, [FeatureX87, FeatureCX8, FeatureCMOV, FeatureNOPL],
1607349cc55cSDimitry Andric                [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
160806c3fb27SDimitry Andric}
160906c3fb27SDimitry Andricforeach P = ["pentium2", "pentium_ii"] in {
161006c3fb27SDimitry Andric  def : Proc<P, [FeatureX87, FeatureCX8, FeatureMMX, FeatureCMOV,
1611e8d8bef9SDimitry Andric                          FeatureFXSR, FeatureNOPL],
1612349cc55cSDimitry Andric                        [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
161306c3fb27SDimitry Andric}
161406c3fb27SDimitry Andricforeach P = ["pentium3", "pentium3m", "pentium_iii_no_xmm_regs", "pentium_iii"] in {
161581ad6265SDimitry Andric  def : Proc<P, [FeatureX87, FeatureCX8, FeatureMMX,
1616e8d8bef9SDimitry Andric                 FeatureSSE1, FeatureFXSR, FeatureNOPL, FeatureCMOV],
1617349cc55cSDimitry Andric                [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
16180b57cec5SDimitry Andric}
16190b57cec5SDimitry Andric
16200b57cec5SDimitry Andric// Enable the PostRAScheduler for SSE2 and SSE3 class cpus.
16210b57cec5SDimitry Andric// The intent is to enable it for pentium4 which is the current default
16220b57cec5SDimitry Andric// processor in a vanilla 32-bit clang compilation when no specific
16230b57cec5SDimitry Andric// architecture is specified.  This generally gives a nice performance
16240b57cec5SDimitry Andric// increase on silvermont, with largely neutral behavior on other
16250b57cec5SDimitry Andric// contemporary large core processors.
16260b57cec5SDimitry Andric// pentium-m, pentium4m, prescott and nocona are included as a preventative
16270b57cec5SDimitry Andric// measure to avoid performance surprises, in case clang's default cpu
16280b57cec5SDimitry Andric// changes slightly.
16290b57cec5SDimitry Andric
163006c3fb27SDimitry Andricforeach P = ["pentium_m", "pentium-m"] in {
163106c3fb27SDimitry Andricdef : ProcModel<P, GenericPostRAModel,
163281ad6265SDimitry Andric                [FeatureX87, FeatureCX8, FeatureMMX, FeatureSSE2,
1633e8d8bef9SDimitry Andric                FeatureFXSR, FeatureNOPL, FeatureCMOV],
1634349cc55cSDimitry Andric                [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
163506c3fb27SDimitry Andric}
16360b57cec5SDimitry Andric
163706c3fb27SDimitry Andricforeach P = ["pentium4", "pentium4m", "pentium_4"] in {
1638e8d8bef9SDimitry Andric  def : ProcModel<P, GenericPostRAModel,
163981ad6265SDimitry Andric                  [FeatureX87, FeatureCX8, FeatureMMX, FeatureSSE2,
1640e8d8bef9SDimitry Andric                   FeatureFXSR, FeatureNOPL, FeatureCMOV],
1641349cc55cSDimitry Andric                  [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
16420b57cec5SDimitry Andric}
16430b57cec5SDimitry Andric
16440b57cec5SDimitry Andric// Intel Quark.
164581ad6265SDimitry Andricdef : Proc<"lakemont", [FeatureCX8],
1646349cc55cSDimitry Andric                       [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
16470b57cec5SDimitry Andric
16480b57cec5SDimitry Andric// Intel Core Duo.
1649e8d8bef9SDimitry Andricdef : ProcModel<"yonah", SandyBridgeModel,
165081ad6265SDimitry Andric                [FeatureX87, FeatureCX8, FeatureMMX, FeatureSSE3,
1651e8d8bef9SDimitry Andric                 FeatureFXSR, FeatureNOPL, FeatureCMOV],
1652349cc55cSDimitry Andric                [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
16530b57cec5SDimitry Andric
16540b57cec5SDimitry Andric// NetBurst.
165506c3fb27SDimitry Andricforeach P = ["prescott", "pentium_4_sse3"] in {
165606c3fb27SDimitry Andric  def : ProcModel<P, GenericPostRAModel,
165781ad6265SDimitry Andric                  [FeatureX87, FeatureCX8, FeatureMMX, FeatureSSE3,
1658e8d8bef9SDimitry Andric                  FeatureFXSR, FeatureNOPL, FeatureCMOV],
1659349cc55cSDimitry Andric                  [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
166006c3fb27SDimitry Andric}
1661e8d8bef9SDimitry Andricdef : ProcModel<"nocona", GenericPostRAModel, [
16620b57cec5SDimitry Andric  FeatureX87,
166381ad6265SDimitry Andric  FeatureCX8,
16640b57cec5SDimitry Andric  FeatureCMOV,
16650b57cec5SDimitry Andric  FeatureMMX,
16660b57cec5SDimitry Andric  FeatureSSE3,
16670b57cec5SDimitry Andric  FeatureFXSR,
16680b57cec5SDimitry Andric  FeatureNOPL,
166981ad6265SDimitry Andric  FeatureX86_64,
167081ad6265SDimitry Andric  FeatureCX16,
1671e8d8bef9SDimitry Andric],
1672e8d8bef9SDimitry Andric[
1673349cc55cSDimitry Andric  TuningSlowUAMem16,
1674349cc55cSDimitry Andric  TuningInsertVZEROUPPER
16750b57cec5SDimitry Andric]>;
16760b57cec5SDimitry Andric
16770b57cec5SDimitry Andric// Intel Core 2 Solo/Duo.
167806c3fb27SDimitry Andricforeach P = ["core2", "core_2_duo_ssse3"] in {
167906c3fb27SDimitry Andricdef : ProcModel<P, SandyBridgeModel, [
16800b57cec5SDimitry Andric  FeatureX87,
168181ad6265SDimitry Andric  FeatureCX8,
16820b57cec5SDimitry Andric  FeatureCMOV,
16830b57cec5SDimitry Andric  FeatureMMX,
16840b57cec5SDimitry Andric  FeatureSSSE3,
16850b57cec5SDimitry Andric  FeatureFXSR,
16860b57cec5SDimitry Andric  FeatureNOPL,
168781ad6265SDimitry Andric  FeatureX86_64,
168881ad6265SDimitry Andric  FeatureCX16,
168981ad6265SDimitry Andric  FeatureLAHFSAHF64
1690e8d8bef9SDimitry Andric],
1691e8d8bef9SDimitry Andric[
1692349cc55cSDimitry Andric  TuningMacroFusion,
1693349cc55cSDimitry Andric  TuningSlowUAMem16,
1694349cc55cSDimitry Andric  TuningInsertVZEROUPPER
16950b57cec5SDimitry Andric]>;
169606c3fb27SDimitry Andric}
169706c3fb27SDimitry Andricforeach P = ["penryn", "core_2_duo_sse4_1"] in {
169806c3fb27SDimitry Andricdef : ProcModel<P, SandyBridgeModel, [
16990b57cec5SDimitry Andric  FeatureX87,
170081ad6265SDimitry Andric  FeatureCX8,
17010b57cec5SDimitry Andric  FeatureCMOV,
17020b57cec5SDimitry Andric  FeatureMMX,
17030b57cec5SDimitry Andric  FeatureSSE41,
17040b57cec5SDimitry Andric  FeatureFXSR,
17050b57cec5SDimitry Andric  FeatureNOPL,
170681ad6265SDimitry Andric  FeatureX86_64,
170781ad6265SDimitry Andric  FeatureCX16,
170881ad6265SDimitry Andric  FeatureLAHFSAHF64
1709e8d8bef9SDimitry Andric],
1710e8d8bef9SDimitry Andric[
1711349cc55cSDimitry Andric  TuningMacroFusion,
1712349cc55cSDimitry Andric  TuningSlowUAMem16,
1713349cc55cSDimitry Andric  TuningInsertVZEROUPPER
17140b57cec5SDimitry Andric]>;
171506c3fb27SDimitry Andric}
17160b57cec5SDimitry Andric
17170b57cec5SDimitry Andric// Atom CPUs.
17180b57cec5SDimitry Andricforeach P = ["bonnell", "atom"] in {
1719e8d8bef9SDimitry Andric  def : ProcModel<P, AtomModel, ProcessorFeatures.AtomFeatures,
1720e8d8bef9SDimitry Andric                  ProcessorFeatures.AtomTuning>;
17210b57cec5SDimitry Andric}
17220b57cec5SDimitry Andric
172306c3fb27SDimitry Andricforeach P = ["silvermont", "slm", "atom_sse4_2"] in {
1724e8d8bef9SDimitry Andric  def : ProcModel<P, SLMModel, ProcessorFeatures.SLMFeatures,
1725e8d8bef9SDimitry Andric                  ProcessorFeatures.SLMTuning>;
17260b57cec5SDimitry Andric}
17270b57cec5SDimitry Andric
172806c3fb27SDimitry Andricdef : ProcModel<"atom_sse4_2_movbe", SLMModel, ProcessorFeatures.GLMFeatures,
172906c3fb27SDimitry Andric                ProcessorFeatures.SLMTuning>;
1730e8d8bef9SDimitry Andricdef : ProcModel<"goldmont", SLMModel, ProcessorFeatures.GLMFeatures,
1731e8d8bef9SDimitry Andric                ProcessorFeatures.GLMTuning>;
173206c3fb27SDimitry Andricforeach P = ["goldmont_plus", "goldmont-plus"] in {
173306c3fb27SDimitry Andric  def : ProcModel<P, SLMModel, ProcessorFeatures.GLPFeatures,
1734e8d8bef9SDimitry Andric                  ProcessorFeatures.GLPTuning>;
173506c3fb27SDimitry Andric}
1736e8d8bef9SDimitry Andricdef : ProcModel<"tremont", SLMModel, ProcessorFeatures.TRMFeatures,
1737e8d8bef9SDimitry Andric                ProcessorFeatures.TRMTuning>;
17380b57cec5SDimitry Andric
17390b57cec5SDimitry Andric// "Arrandale" along with corei3 and corei5
174006c3fb27SDimitry Andricforeach P = ["nehalem", "corei7", "core_i7_sse4_2"] in {
1741e8d8bef9SDimitry Andric  def : ProcModel<P, SandyBridgeModel, ProcessorFeatures.NHMFeatures,
1742e8d8bef9SDimitry Andric                  ProcessorFeatures.NHMTuning>;
17430b57cec5SDimitry Andric}
17440b57cec5SDimitry Andric
17450b57cec5SDimitry Andric// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
174606c3fb27SDimitry Andricforeach P = ["westmere", "core_aes_pclmulqdq"] in {
174706c3fb27SDimitry Andric  def : ProcModel<P, SandyBridgeModel, ProcessorFeatures.WSMFeatures,
1748e8d8bef9SDimitry Andric                  ProcessorFeatures.WSMTuning>;
174906c3fb27SDimitry Andric}
17500b57cec5SDimitry Andric
175106c3fb27SDimitry Andricforeach P = ["sandybridge", "corei7-avx", "core_2nd_gen_avx"] in {
1752e8d8bef9SDimitry Andric  def : ProcModel<P, SandyBridgeModel, ProcessorFeatures.SNBFeatures,
1753e8d8bef9SDimitry Andric                  ProcessorFeatures.SNBTuning>;
17540b57cec5SDimitry Andric}
17550b57cec5SDimitry Andric
175606c3fb27SDimitry Andricforeach P = ["ivybridge", "core-avx-i", "core_3rd_gen_avx"] in {
1757e8d8bef9SDimitry Andric  def : ProcModel<P, SandyBridgeModel, ProcessorFeatures.IVBFeatures,
1758e8d8bef9SDimitry Andric                  ProcessorFeatures.IVBTuning>;
17590b57cec5SDimitry Andric}
17600b57cec5SDimitry Andric
176106c3fb27SDimitry Andricforeach P = ["haswell", "core-avx2", "core_4th_gen_avx", "core_4th_gen_avx_tsx"] in {
1762e8d8bef9SDimitry Andric  def : ProcModel<P, HaswellModel, ProcessorFeatures.HSWFeatures,
1763e8d8bef9SDimitry Andric                  ProcessorFeatures.HSWTuning>;
17640b57cec5SDimitry Andric}
17650b57cec5SDimitry Andric
176606c3fb27SDimitry Andricforeach P = ["broadwell", "core_5th_gen_avx", "core_5th_gen_avx_tsx"] in {
176706c3fb27SDimitry Andric  def : ProcModel<P, BroadwellModel, ProcessorFeatures.BDWFeatures,
1768e8d8bef9SDimitry Andric                  ProcessorFeatures.BDWTuning>;
176906c3fb27SDimitry Andric}
17700b57cec5SDimitry Andric
1771e8d8bef9SDimitry Andricdef : ProcModel<"skylake", SkylakeClientModel, ProcessorFeatures.SKLFeatures,
1772e8d8bef9SDimitry Andric                ProcessorFeatures.SKLTuning>;
17730b57cec5SDimitry Andric
17740b57cec5SDimitry Andric// FIXME: define KNL scheduler model
177506c3fb27SDimitry Andricforeach P = ["knl", "mic_avx512"] in {
177606c3fb27SDimitry Andric  def : ProcModel<P, HaswellModel, ProcessorFeatures.KNLFeatures,
1777e8d8bef9SDimitry Andric                  ProcessorFeatures.KNLTuning>;
177806c3fb27SDimitry Andric}
1779e8d8bef9SDimitry Andricdef : ProcModel<"knm", HaswellModel, ProcessorFeatures.KNMFeatures,
1780e8d8bef9SDimitry Andric                ProcessorFeatures.KNLTuning>;
17810b57cec5SDimitry Andric
178206c3fb27SDimitry Andricforeach P = ["skylake-avx512", "skx", "skylake_avx512"] in {
1783e8d8bef9SDimitry Andric  def : ProcModel<P, SkylakeServerModel, ProcessorFeatures.SKXFeatures,
1784e8d8bef9SDimitry Andric                  ProcessorFeatures.SKXTuning>;
17850b57cec5SDimitry Andric}
17860b57cec5SDimitry Andric
1787e8d8bef9SDimitry Andricdef : ProcModel<"cascadelake", SkylakeServerModel,
1788e8d8bef9SDimitry Andric                ProcessorFeatures.CLXFeatures, ProcessorFeatures.CLXTuning>;
1789e8d8bef9SDimitry Andricdef : ProcModel<"cooperlake", SkylakeServerModel,
1790e8d8bef9SDimitry Andric                ProcessorFeatures.CPXFeatures, ProcessorFeatures.CPXTuning>;
1791e8d8bef9SDimitry Andricdef : ProcModel<"cannonlake", SkylakeServerModel,
1792e8d8bef9SDimitry Andric                ProcessorFeatures.CNLFeatures, ProcessorFeatures.CNLTuning>;
179306c3fb27SDimitry Andricforeach P = ["icelake-client", "icelake_client"] in {
179406c3fb27SDimitry Andricdef : ProcModel<P, IceLakeModel,
1795e8d8bef9SDimitry Andric                ProcessorFeatures.ICLFeatures, ProcessorFeatures.ICLTuning>;
179606c3fb27SDimitry Andric}
1797349cc55cSDimitry Andricdef : ProcModel<"rocketlake", IceLakeModel,
1798fe6060f1SDimitry Andric                ProcessorFeatures.ICLFeatures, ProcessorFeatures.ICLTuning>;
179906c3fb27SDimitry Andricforeach P = ["icelake-server", "icelake_server"] in {
180006c3fb27SDimitry Andricdef : ProcModel<P, IceLakeModel,
1801e8d8bef9SDimitry Andric                ProcessorFeatures.ICXFeatures, ProcessorFeatures.ICXTuning>;
180206c3fb27SDimitry Andric}
1803349cc55cSDimitry Andricdef : ProcModel<"tigerlake", IceLakeModel,
1804e8d8bef9SDimitry Andric                ProcessorFeatures.TGLFeatures, ProcessorFeatures.TGLTuning>;
180506c3fb27SDimitry Andricdef : ProcModel<"sapphirerapids", SapphireRapidsModel,
1806e8d8bef9SDimitry Andric                ProcessorFeatures.SPRFeatures, ProcessorFeatures.SPRTuning>;
1807bdd1243dSDimitry Andricdef : ProcModel<"alderlake", AlderlakePModel,
1808e8d8bef9SDimitry Andric                ProcessorFeatures.ADLFeatures, ProcessorFeatures.ADLTuning>;
18095f757f3fSDimitry Andric// FIXME: Use Gracemont Schedule Model when it is ready.
18105f757f3fSDimitry Andricdef : ProcModel<"gracemont", AlderlakePModel,
18115f757f3fSDimitry Andric                ProcessorFeatures.ADLFeatures, ProcessorFeatures.GRTTuning>;
18120fca6ea1SDimitry Andricforeach P = ["sierraforest", "grandridge"] in {
18130fca6ea1SDimitry Andric  def : ProcModel<P, AlderlakePModel, ProcessorFeatures.SRFFeatures,
18140fca6ea1SDimitry Andric                ProcessorFeatures.GRTTuning>;
18150fca6ea1SDimitry Andric}
1816bdd1243dSDimitry Andricdef : ProcModel<"raptorlake", AlderlakePModel,
1817bdd1243dSDimitry Andric                ProcessorFeatures.ADLFeatures, ProcessorFeatures.ADLTuning>;
1818bdd1243dSDimitry Andricdef : ProcModel<"meteorlake", AlderlakePModel,
1819bdd1243dSDimitry Andric                ProcessorFeatures.ADLFeatures, ProcessorFeatures.ADLTuning>;
18205f757f3fSDimitry Andricdef : ProcModel<"arrowlake", AlderlakePModel,
18215f757f3fSDimitry Andric                ProcessorFeatures.SRFFeatures, ProcessorFeatures.ADLTuning>;
18225f757f3fSDimitry Andricforeach P = ["arrowlake-s", "arrowlake_s", "lunarlake"] in {
18235f757f3fSDimitry Andricdef : ProcModel<P, AlderlakePModel,
18245f757f3fSDimitry Andric                ProcessorFeatures.ARLSFeatures, ProcessorFeatures.ADLTuning>;
18255f757f3fSDimitry Andric}
18265f757f3fSDimitry Andricdef : ProcModel<"pantherlake", AlderlakePModel,
18275f757f3fSDimitry Andric                ProcessorFeatures.PTLFeatures, ProcessorFeatures.ADLTuning>;
18285f757f3fSDimitry Andricdef : ProcModel<"clearwaterforest", AlderlakePModel,
18295f757f3fSDimitry Andric                ProcessorFeatures.CWFFeatures, ProcessorFeatures.ADLTuning>;
183006c3fb27SDimitry Andricdef : ProcModel<"emeraldrapids", SapphireRapidsModel,
1831bdd1243dSDimitry Andric                ProcessorFeatures.SPRFeatures, ProcessorFeatures.SPRTuning>;
18320fca6ea1SDimitry Andricdef : ProcModel<"graniterapids", SapphireRapidsModel,
18330fca6ea1SDimitry Andric                ProcessorFeatures.GNRFeatures, ProcessorFeatures.GNRTuning>;
183406c3fb27SDimitry Andricforeach P = ["graniterapids-d", "graniterapids_d"] in {
183506c3fb27SDimitry Andricdef : ProcModel<P, SapphireRapidsModel,
18360fca6ea1SDimitry Andric                ProcessorFeatures.GNRDFeatures, ProcessorFeatures.GNRTuning>;
183706c3fb27SDimitry Andric}
18380b57cec5SDimitry Andric
18390b57cec5SDimitry Andric// AMD CPUs.
18400b57cec5SDimitry Andric
184181ad6265SDimitry Andricdef : Proc<"k6",   [FeatureX87, FeatureCX8, FeatureMMX],
1842349cc55cSDimitry Andric                   [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
18430fca6ea1SDimitry Andricdef : Proc<"k6-2", [FeatureX87, FeatureCX8, FeatureMMX, FeaturePRFCHW],
1844349cc55cSDimitry Andric                   [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
18450fca6ea1SDimitry Andricdef : Proc<"k6-3", [FeatureX87, FeatureCX8, FeatureMMX, FeaturePRFCHW],
1846349cc55cSDimitry Andric                   [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
18470b57cec5SDimitry Andric
18480b57cec5SDimitry Andricforeach P = ["athlon", "athlon-tbird"] in {
18490fca6ea1SDimitry Andric  def : Proc<P, [FeatureX87, FeatureCX8, FeatureCMOV, FeatureMMX, FeaturePRFCHW,
1850e8d8bef9SDimitry Andric                 FeatureNOPL],
1851349cc55cSDimitry Andric                [TuningSlowSHLD, TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
18520b57cec5SDimitry Andric}
18530b57cec5SDimitry Andric
18540b57cec5SDimitry Andricforeach P = ["athlon-4", "athlon-xp", "athlon-mp"] in {
185581ad6265SDimitry Andric  def : Proc<P, [FeatureX87, FeatureCX8, FeatureCMOV,
18560fca6ea1SDimitry Andric                 FeatureSSE1, FeatureMMX, FeaturePRFCHW, FeatureFXSR, FeatureNOPL],
1857349cc55cSDimitry Andric                [TuningSlowSHLD, TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
18580b57cec5SDimitry Andric}
18590b57cec5SDimitry Andric
18600b57cec5SDimitry Andricforeach P = ["k8", "opteron", "athlon64", "athlon-fx"] in {
18610fca6ea1SDimitry Andric  def : Proc<P, [FeatureX87, FeatureCX8, FeatureSSE2, FeatureMMX, FeaturePRFCHW,
186281ad6265SDimitry Andric                 FeatureFXSR, FeatureNOPL, FeatureX86_64, FeatureCMOV],
1863349cc55cSDimitry Andric                [TuningFastScalarShiftMasks, TuningSlowSHLD, TuningSlowUAMem16,
186481ad6265SDimitry Andric                 TuningSBBDepBreaking, TuningInsertVZEROUPPER]>;
18650b57cec5SDimitry Andric}
18660b57cec5SDimitry Andric
18670b57cec5SDimitry Andricforeach P = ["k8-sse3", "opteron-sse3", "athlon64-sse3"] in {
18680fca6ea1SDimitry Andric  def : Proc<P, [FeatureX87, FeatureCX8, FeatureSSE3, FeatureMMX, FeaturePRFCHW,
186981ad6265SDimitry Andric                 FeatureFXSR, FeatureNOPL, FeatureCX16, FeatureCMOV,
187081ad6265SDimitry Andric                 FeatureX86_64],
1871349cc55cSDimitry Andric                [TuningFastScalarShiftMasks, TuningSlowSHLD, TuningSlowUAMem16,
187281ad6265SDimitry Andric                 TuningSBBDepBreaking, TuningInsertVZEROUPPER]>;
18730b57cec5SDimitry Andric}
18740b57cec5SDimitry Andric
18750b57cec5SDimitry Andricforeach P = ["amdfam10", "barcelona"] in {
1876e8d8bef9SDimitry Andric  def : Proc<P, ProcessorFeatures.BarcelonaFeatures,
1877e8d8bef9SDimitry Andric             ProcessorFeatures.BarcelonaTuning>;
18780b57cec5SDimitry Andric}
18790b57cec5SDimitry Andric
18800b57cec5SDimitry Andric// Bobcat
1881e8d8bef9SDimitry Andricdef : Proc<"btver1", ProcessorFeatures.BtVer1Features,
1882e8d8bef9SDimitry Andric           ProcessorFeatures.BtVer1Tuning>;
18830b57cec5SDimitry Andric// Jaguar
1884e8d8bef9SDimitry Andricdef : ProcModel<"btver2", BtVer2Model, ProcessorFeatures.BtVer2Features,
1885e8d8bef9SDimitry Andric                ProcessorFeatures.BtVer2Tuning>;
18860b57cec5SDimitry Andric
18870b57cec5SDimitry Andric// Bulldozer
1888e8d8bef9SDimitry Andricdef : ProcModel<"bdver1", BdVer2Model, ProcessorFeatures.BdVer1Features,
1889e8d8bef9SDimitry Andric                ProcessorFeatures.BdVer1Tuning>;
18900b57cec5SDimitry Andric// Piledriver
1891e8d8bef9SDimitry Andricdef : ProcModel<"bdver2", BdVer2Model, ProcessorFeatures.BdVer2Features,
1892e8d8bef9SDimitry Andric                ProcessorFeatures.BdVer2Tuning>;
18930b57cec5SDimitry Andric// Steamroller
1894e8d8bef9SDimitry Andricdef : Proc<"bdver3", ProcessorFeatures.BdVer3Features,
1895e8d8bef9SDimitry Andric           ProcessorFeatures.BdVer3Tuning>;
18960b57cec5SDimitry Andric// Excavator
1897e8d8bef9SDimitry Andricdef : Proc<"bdver4", ProcessorFeatures.BdVer4Features,
1898e8d8bef9SDimitry Andric           ProcessorFeatures.BdVer4Tuning>;
18990b57cec5SDimitry Andric
1900e8d8bef9SDimitry Andricdef : ProcModel<"znver1", Znver1Model, ProcessorFeatures.ZNFeatures,
1901e8d8bef9SDimitry Andric                ProcessorFeatures.ZNTuning>;
1902e8d8bef9SDimitry Andricdef : ProcModel<"znver2", Znver2Model, ProcessorFeatures.ZN2Features,
1903e8d8bef9SDimitry Andric                ProcessorFeatures.ZN2Tuning>;
1904fe6060f1SDimitry Andricdef : ProcModel<"znver3", Znver3Model, ProcessorFeatures.ZN3Features,
1905e8d8bef9SDimitry Andric                ProcessorFeatures.ZN3Tuning>;
19061ac55f4cSDimitry Andricdef : ProcModel<"znver4", Znver4Model, ProcessorFeatures.ZN4Features,
1907bdd1243dSDimitry Andric           ProcessorFeatures.ZN4Tuning>;
1908*c80e69b0SDimitry Andricdef : ProcModel<"znver5", Znver4Model, ProcessorFeatures.ZN5Features,
1909*c80e69b0SDimitry Andric                ProcessorFeatures.ZN5Tuning>;
19100b57cec5SDimitry Andric
19110fca6ea1SDimitry Andricdef : Proc<"geode",           [FeatureX87, FeatureCX8, FeatureMMX, FeaturePRFCHW],
1912349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
19130b57cec5SDimitry Andric
1914e8d8bef9SDimitry Andricdef : Proc<"winchip-c6",      [FeatureX87, FeatureMMX],
1915349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
19160fca6ea1SDimitry Andricdef : Proc<"winchip2",        [FeatureX87, FeatureMMX, FeaturePRFCHW],
1917349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
19180fca6ea1SDimitry Andricdef : Proc<"c3",              [FeatureX87, FeatureMMX, FeaturePRFCHW],
1919349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
192081ad6265SDimitry Andricdef : Proc<"c3-2",            [FeatureX87, FeatureCX8, FeatureMMX,
1921e8d8bef9SDimitry Andric                               FeatureSSE1, FeatureFXSR, FeatureCMOV],
1922349cc55cSDimitry Andric                              [TuningSlowUAMem16, TuningInsertVZEROUPPER]>;
19230b57cec5SDimitry Andric
19240b57cec5SDimitry Andric// We also provide a generic 64-bit specific x86 processor model which tries to
19250b57cec5SDimitry Andric// be good for modern chips without enabling instruction set encodings past the
19260b57cec5SDimitry Andric// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
19270b57cec5SDimitry Andric// modern 64-bit x86 chip, and enables features that are generally beneficial.
19280b57cec5SDimitry Andric//
19290b57cec5SDimitry Andric// We currently use the Sandy Bridge model as the default scheduling model as
19300b57cec5SDimitry Andric// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
19310b57cec5SDimitry Andric// covers a huge swath of x86 processors. If there are specific scheduling
19320b57cec5SDimitry Andric// knobs which need to be tuned differently for AMD chips, we might consider
19330b57cec5SDimitry Andric// forming a common base for them.
1934e8d8bef9SDimitry Andricdef : ProcModel<"x86-64", SandyBridgeModel, ProcessorFeatures.X86_64V1Features,
193506c3fb27SDimitry Andric                ProcessorFeatures.X86_64V1Tuning>;
193606c3fb27SDimitry Andric// Close to Sandybridge.
1937e8d8bef9SDimitry Andricdef : ProcModel<"x86-64-v2", SandyBridgeModel, ProcessorFeatures.X86_64V2Features,
193806c3fb27SDimitry Andric                ProcessorFeatures.X86_64V2Tuning>;
1939e8d8bef9SDimitry Andric// Close to Haswell.
1940e8d8bef9SDimitry Andricdef : ProcModel<"x86-64-v3", HaswellModel, ProcessorFeatures.X86_64V3Features,
194106c3fb27SDimitry Andric                ProcessorFeatures.X86_64V3Tuning>;
1942e8d8bef9SDimitry Andric// Close to the AVX-512 level implemented by Xeon Scalable Processors.
1943fe6060f1SDimitry Andricdef : ProcModel<"x86-64-v4", SkylakeServerModel, ProcessorFeatures.X86_64V4Features,
194406c3fb27SDimitry Andric                ProcessorFeatures.X86_64V4Tuning>;
1945e8d8bef9SDimitry Andric
19460b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19470b57cec5SDimitry Andric// Calling Conventions
19480b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19490b57cec5SDimitry Andric
19500b57cec5SDimitry Andricinclude "X86CallingConv.td"
19510b57cec5SDimitry Andric
19520b57cec5SDimitry Andric
19530b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19540b57cec5SDimitry Andric// Assembly Parser
19550b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19560b57cec5SDimitry Andric
19570b57cec5SDimitry Andricdef ATTAsmParserVariant : AsmParserVariant {
19580b57cec5SDimitry Andric  int Variant = 0;
19590b57cec5SDimitry Andric
19600b57cec5SDimitry Andric  // Variant name.
19610b57cec5SDimitry Andric  string Name = "att";
19620b57cec5SDimitry Andric
19630b57cec5SDimitry Andric  // Discard comments in assembly strings.
19640b57cec5SDimitry Andric  string CommentDelimiter = "#";
19650b57cec5SDimitry Andric
19660b57cec5SDimitry Andric  // Recognize hard coded registers.
19670b57cec5SDimitry Andric  string RegisterPrefix = "%";
19680b57cec5SDimitry Andric}
19690b57cec5SDimitry Andric
19700b57cec5SDimitry Andricdef IntelAsmParserVariant : AsmParserVariant {
19710b57cec5SDimitry Andric  int Variant = 1;
19720b57cec5SDimitry Andric
19730b57cec5SDimitry Andric  // Variant name.
19740b57cec5SDimitry Andric  string Name = "intel";
19750b57cec5SDimitry Andric
19760b57cec5SDimitry Andric  // Discard comments in assembly strings.
19770b57cec5SDimitry Andric  string CommentDelimiter = ";";
19780b57cec5SDimitry Andric
19790b57cec5SDimitry Andric  // Recognize hard coded registers.
19800b57cec5SDimitry Andric  string RegisterPrefix = "";
19810b57cec5SDimitry Andric}
19820b57cec5SDimitry Andric
19830b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19840b57cec5SDimitry Andric// Assembly Printers
19850b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19860b57cec5SDimitry Andric
19870b57cec5SDimitry Andric// The X86 target supports two different syntaxes for emitting machine code.
19880b57cec5SDimitry Andric// This is controlled by the -x86-asm-syntax={att|intel}
19890b57cec5SDimitry Andricdef ATTAsmWriter : AsmWriter {
19900b57cec5SDimitry Andric  string AsmWriterClassName  = "ATTInstPrinter";
19910b57cec5SDimitry Andric  int Variant = 0;
19920b57cec5SDimitry Andric}
19930b57cec5SDimitry Andricdef IntelAsmWriter : AsmWriter {
19940b57cec5SDimitry Andric  string AsmWriterClassName  = "IntelInstPrinter";
19950b57cec5SDimitry Andric  int Variant = 1;
19960b57cec5SDimitry Andric}
19970b57cec5SDimitry Andric
19980b57cec5SDimitry Andricdef X86 : Target {
19990b57cec5SDimitry Andric  // Information about the instructions...
20000b57cec5SDimitry Andric  let InstructionSet = X86InstrInfo;
20010b57cec5SDimitry Andric  let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
20020b57cec5SDimitry Andric  let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
20030b57cec5SDimitry Andric  let AllowRegisterRenaming = 1;
20040b57cec5SDimitry Andric}
20050b57cec5SDimitry Andric
20060b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
20070b57cec5SDimitry Andric// Pfm Counters
20080b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
20090b57cec5SDimitry Andric
20100b57cec5SDimitry Andricinclude "X86PfmCounters.td"
2011