xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Target/X86/X86.td (revision 82d56013d7b633d116a93943de88e08335357a7c)
17330f729Sjoerg//===-- X86.td - Target definition file for the Intel X86 --*- tablegen -*-===//
27330f729Sjoerg//
37330f729Sjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg// See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg//
77330f729Sjoerg//===----------------------------------------------------------------------===//
87330f729Sjoerg//
97330f729Sjoerg// This is a target description file for the Intel i386 architecture, referred
107330f729Sjoerg// to here as the "X86" architecture.
117330f729Sjoerg//
127330f729Sjoerg//===----------------------------------------------------------------------===//
137330f729Sjoerg
147330f729Sjoerg// Get the target-independent interfaces which we are implementing...
157330f729Sjoerg//
167330f729Sjoerginclude "llvm/Target/Target.td"
177330f729Sjoerg
187330f729Sjoerg//===----------------------------------------------------------------------===//
197330f729Sjoerg// X86 Subtarget state
207330f729Sjoerg//
217330f729Sjoerg
227330f729Sjoergdef Mode64Bit : SubtargetFeature<"64bit-mode", "In64BitMode", "true",
237330f729Sjoerg                                  "64-bit mode (x86_64)">;
247330f729Sjoergdef Mode32Bit : SubtargetFeature<"32bit-mode", "In32BitMode", "true",
257330f729Sjoerg                                  "32-bit mode (80386)">;
267330f729Sjoergdef Mode16Bit : SubtargetFeature<"16bit-mode", "In16BitMode", "true",
277330f729Sjoerg                                  "16-bit mode (i8086)">;
287330f729Sjoerg
297330f729Sjoerg//===----------------------------------------------------------------------===//
307330f729Sjoerg// X86 Subtarget features
317330f729Sjoerg//===----------------------------------------------------------------------===//
327330f729Sjoerg
337330f729Sjoergdef FeatureX87     : SubtargetFeature<"x87","HasX87", "true",
347330f729Sjoerg                                      "Enable X87 float instructions">;
357330f729Sjoerg
367330f729Sjoergdef FeatureNOPL    : SubtargetFeature<"nopl", "HasNOPL", "true",
377330f729Sjoerg                                      "Enable NOPL instruction">;
387330f729Sjoerg
397330f729Sjoergdef FeatureCMOV    : SubtargetFeature<"cmov","HasCMov", "true",
407330f729Sjoerg                                      "Enable conditional move instructions">;
417330f729Sjoerg
427330f729Sjoergdef FeatureCMPXCHG8B : SubtargetFeature<"cx8", "HasCmpxchg8b", "true",
437330f729Sjoerg                                        "Support CMPXCHG8B instructions">;
447330f729Sjoerg
457330f729Sjoergdef FeaturePOPCNT   : SubtargetFeature<"popcnt", "HasPOPCNT", "true",
467330f729Sjoerg                                       "Support POPCNT instruction">;
477330f729Sjoerg
487330f729Sjoergdef FeatureFXSR    : SubtargetFeature<"fxsr", "HasFXSR", "true",
497330f729Sjoerg                                      "Support fxsave/fxrestore instructions">;
507330f729Sjoerg
517330f729Sjoergdef FeatureXSAVE   : SubtargetFeature<"xsave", "HasXSAVE", "true",
527330f729Sjoerg                                       "Support xsave instructions">;
537330f729Sjoerg
547330f729Sjoergdef FeatureXSAVEOPT: SubtargetFeature<"xsaveopt", "HasXSAVEOPT", "true",
55*82d56013Sjoerg                                       "Support xsaveopt instructions",
56*82d56013Sjoerg                                       [FeatureXSAVE]>;
577330f729Sjoerg
587330f729Sjoergdef FeatureXSAVEC  : SubtargetFeature<"xsavec", "HasXSAVEC", "true",
59*82d56013Sjoerg                                       "Support xsavec instructions",
60*82d56013Sjoerg                                       [FeatureXSAVE]>;
617330f729Sjoerg
627330f729Sjoergdef FeatureXSAVES  : SubtargetFeature<"xsaves", "HasXSAVES", "true",
63*82d56013Sjoerg                                       "Support xsaves instructions",
64*82d56013Sjoerg                                       [FeatureXSAVE]>;
657330f729Sjoerg
667330f729Sjoergdef FeatureSSE1    : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
677330f729Sjoerg                                      "Enable SSE instructions">;
687330f729Sjoergdef FeatureSSE2    : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
697330f729Sjoerg                                      "Enable SSE2 instructions",
707330f729Sjoerg                                      [FeatureSSE1]>;
717330f729Sjoergdef FeatureSSE3    : SubtargetFeature<"sse3", "X86SSELevel", "SSE3",
727330f729Sjoerg                                      "Enable SSE3 instructions",
737330f729Sjoerg                                      [FeatureSSE2]>;
747330f729Sjoergdef FeatureSSSE3   : SubtargetFeature<"ssse3", "X86SSELevel", "SSSE3",
757330f729Sjoerg                                      "Enable SSSE3 instructions",
767330f729Sjoerg                                      [FeatureSSE3]>;
777330f729Sjoergdef FeatureSSE41   : SubtargetFeature<"sse4.1", "X86SSELevel", "SSE41",
787330f729Sjoerg                                      "Enable SSE 4.1 instructions",
797330f729Sjoerg                                      [FeatureSSSE3]>;
807330f729Sjoergdef FeatureSSE42   : SubtargetFeature<"sse4.2", "X86SSELevel", "SSE42",
817330f729Sjoerg                                      "Enable SSE 4.2 instructions",
827330f729Sjoerg                                      [FeatureSSE41]>;
837330f729Sjoerg// The MMX subtarget feature is separate from the rest of the SSE features
847330f729Sjoerg// because it's important (for odd compatibility reasons) to be able to
857330f729Sjoerg// turn it off explicitly while allowing SSE+ to be on.
867330f729Sjoergdef FeatureMMX     : SubtargetFeature<"mmx","X863DNowLevel", "MMX",
877330f729Sjoerg                                      "Enable MMX instructions">;
887330f729Sjoergdef Feature3DNow   : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow",
897330f729Sjoerg                                      "Enable 3DNow! instructions",
907330f729Sjoerg                                      [FeatureMMX]>;
917330f729Sjoergdef Feature3DNowA  : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA",
927330f729Sjoerg                                      "Enable 3DNow! Athlon instructions",
937330f729Sjoerg                                      [Feature3DNow]>;
947330f729Sjoerg// All x86-64 hardware has SSE2, but we don't mark SSE2 as an implied
957330f729Sjoerg// feature, because SSE2 can be disabled (e.g. for compiling OS kernels)
967330f729Sjoerg// without disabling 64-bit mode. Nothing should imply this feature bit. It
977330f729Sjoerg// is used to enforce that only 64-bit capable CPUs are used in 64-bit mode.
987330f729Sjoergdef Feature64Bit   : SubtargetFeature<"64bit", "HasX86_64", "true",
997330f729Sjoerg                                      "Support 64-bit instructions">;
1007330f729Sjoergdef FeatureCMPXCHG16B : SubtargetFeature<"cx16", "HasCmpxchg16b", "true",
1017330f729Sjoerg                                      "64-bit with cmpxchg16b",
1027330f729Sjoerg                                      [FeatureCMPXCHG8B]>;
1037330f729Sjoergdef FeatureSlowSHLD : SubtargetFeature<"slow-shld", "IsSHLDSlow", "true",
1047330f729Sjoerg                                       "SHLD instruction is slow">;
1057330f729Sjoergdef FeatureSlowPMULLD : SubtargetFeature<"slow-pmulld", "IsPMULLDSlow", "true",
1067330f729Sjoerg                                        "PMULLD instruction is slow">;
1077330f729Sjoergdef FeatureSlowPMADDWD : SubtargetFeature<"slow-pmaddwd", "IsPMADDWDSlow",
1087330f729Sjoerg                                          "true",
1097330f729Sjoerg                                          "PMADDWD is slower than PMULLD">;
1107330f729Sjoerg// FIXME: This should not apply to CPUs that do not have SSE.
1117330f729Sjoergdef FeatureSlowUAMem16 : SubtargetFeature<"slow-unaligned-mem-16",
1127330f729Sjoerg                                "IsUAMem16Slow", "true",
1137330f729Sjoerg                                "Slow unaligned 16-byte memory access">;
1147330f729Sjoergdef FeatureSlowUAMem32 : SubtargetFeature<"slow-unaligned-mem-32",
1157330f729Sjoerg                                "IsUAMem32Slow", "true",
1167330f729Sjoerg                                "Slow unaligned 32-byte memory access">;
1177330f729Sjoergdef FeatureSSE4A   : SubtargetFeature<"sse4a", "HasSSE4A", "true",
1187330f729Sjoerg                                      "Support SSE 4a instructions",
1197330f729Sjoerg                                      [FeatureSSE3]>;
1207330f729Sjoerg
1217330f729Sjoergdef FeatureAVX     : SubtargetFeature<"avx", "X86SSELevel", "AVX",
1227330f729Sjoerg                                      "Enable AVX instructions",
1237330f729Sjoerg                                      [FeatureSSE42]>;
1247330f729Sjoergdef FeatureAVX2    : SubtargetFeature<"avx2", "X86SSELevel", "AVX2",
1257330f729Sjoerg                                      "Enable AVX2 instructions",
1267330f729Sjoerg                                      [FeatureAVX]>;
1277330f729Sjoergdef FeatureFMA     : SubtargetFeature<"fma", "HasFMA", "true",
1287330f729Sjoerg                                      "Enable three-operand fused multiple-add",
1297330f729Sjoerg                                      [FeatureAVX]>;
1307330f729Sjoergdef FeatureF16C    : SubtargetFeature<"f16c", "HasF16C", "true",
1317330f729Sjoerg                       "Support 16-bit floating point conversion instructions",
1327330f729Sjoerg                       [FeatureAVX]>;
1337330f729Sjoergdef FeatureAVX512   : SubtargetFeature<"avx512f", "X86SSELevel", "AVX512F",
1347330f729Sjoerg                                      "Enable AVX-512 instructions",
1357330f729Sjoerg                                      [FeatureAVX2, FeatureFMA, FeatureF16C]>;
1367330f729Sjoergdef FeatureERI      : SubtargetFeature<"avx512er", "HasERI", "true",
1377330f729Sjoerg                      "Enable AVX-512 Exponential and Reciprocal Instructions",
1387330f729Sjoerg                                      [FeatureAVX512]>;
1397330f729Sjoergdef FeatureCDI      : SubtargetFeature<"avx512cd", "HasCDI", "true",
1407330f729Sjoerg                      "Enable AVX-512 Conflict Detection Instructions",
1417330f729Sjoerg                                      [FeatureAVX512]>;
1427330f729Sjoergdef FeatureVPOPCNTDQ : SubtargetFeature<"avx512vpopcntdq", "HasVPOPCNTDQ",
1437330f729Sjoerg                       "true", "Enable AVX-512 Population Count Instructions",
1447330f729Sjoerg                                      [FeatureAVX512]>;
1457330f729Sjoergdef FeaturePFI      : SubtargetFeature<"avx512pf", "HasPFI", "true",
1467330f729Sjoerg                      "Enable AVX-512 PreFetch Instructions",
1477330f729Sjoerg                                      [FeatureAVX512]>;
1487330f729Sjoergdef FeaturePREFETCHWT1  : SubtargetFeature<"prefetchwt1", "HasPREFETCHWT1",
1497330f729Sjoerg                                   "true",
1507330f729Sjoerg                                   "Prefetch with Intent to Write and T1 Hint">;
1517330f729Sjoergdef FeatureDQI     : SubtargetFeature<"avx512dq", "HasDQI", "true",
1527330f729Sjoerg                      "Enable AVX-512 Doubleword and Quadword Instructions",
1537330f729Sjoerg                                      [FeatureAVX512]>;
1547330f729Sjoergdef FeatureBWI     : SubtargetFeature<"avx512bw", "HasBWI", "true",
1557330f729Sjoerg                      "Enable AVX-512 Byte and Word Instructions",
1567330f729Sjoerg                                      [FeatureAVX512]>;
1577330f729Sjoergdef FeatureVLX     : SubtargetFeature<"avx512vl", "HasVLX", "true",
1587330f729Sjoerg                      "Enable AVX-512 Vector Length eXtensions",
1597330f729Sjoerg                                      [FeatureAVX512]>;
1607330f729Sjoergdef FeatureVBMI     : SubtargetFeature<"avx512vbmi", "HasVBMI", "true",
1617330f729Sjoerg                      "Enable AVX-512 Vector Byte Manipulation Instructions",
1627330f729Sjoerg                                      [FeatureBWI]>;
1637330f729Sjoergdef FeatureVBMI2    : SubtargetFeature<"avx512vbmi2", "HasVBMI2", "true",
1647330f729Sjoerg                      "Enable AVX-512 further Vector Byte Manipulation Instructions",
1657330f729Sjoerg                                      [FeatureBWI]>;
1667330f729Sjoergdef FeatureIFMA     : SubtargetFeature<"avx512ifma", "HasIFMA", "true",
1677330f729Sjoerg                      "Enable AVX-512 Integer Fused Multiple-Add",
1687330f729Sjoerg                                      [FeatureAVX512]>;
1697330f729Sjoergdef FeaturePKU   : SubtargetFeature<"pku", "HasPKU", "true",
1707330f729Sjoerg                      "Enable protection keys">;
1717330f729Sjoergdef FeatureVNNI    : SubtargetFeature<"avx512vnni", "HasVNNI", "true",
1727330f729Sjoerg                          "Enable AVX-512 Vector Neural Network Instructions",
1737330f729Sjoerg                                      [FeatureAVX512]>;
174*82d56013Sjoergdef FeatureAVXVNNI    : SubtargetFeature<"avxvnni", "HasAVXVNNI", "true",
175*82d56013Sjoerg                           "Support AVX_VNNI encoding",
176*82d56013Sjoerg                                      [FeatureAVX2]>;
1777330f729Sjoergdef FeatureBF16    : SubtargetFeature<"avx512bf16", "HasBF16", "true",
1787330f729Sjoerg                           "Support bfloat16 floating point",
1797330f729Sjoerg                                      [FeatureBWI]>;
1807330f729Sjoergdef FeatureBITALG  : SubtargetFeature<"avx512bitalg", "HasBITALG", "true",
1817330f729Sjoerg                       "Enable AVX-512 Bit Algorithms",
1827330f729Sjoerg                        [FeatureBWI]>;
1837330f729Sjoergdef FeatureVP2INTERSECT  : SubtargetFeature<"avx512vp2intersect",
1847330f729Sjoerg                                            "HasVP2INTERSECT", "true",
1857330f729Sjoerg                                            "Enable AVX-512 vp2intersect",
1867330f729Sjoerg                                            [FeatureAVX512]>;
1877330f729Sjoergdef FeaturePCLMUL  : SubtargetFeature<"pclmul", "HasPCLMUL", "true",
1887330f729Sjoerg                         "Enable packed carry-less multiplication instructions",
1897330f729Sjoerg                               [FeatureSSE2]>;
1907330f729Sjoergdef FeatureGFNI    : SubtargetFeature<"gfni", "HasGFNI", "true",
1917330f729Sjoerg                         "Enable Galois Field Arithmetic Instructions",
1927330f729Sjoerg                               [FeatureSSE2]>;
1937330f729Sjoergdef FeatureVPCLMULQDQ : SubtargetFeature<"vpclmulqdq", "HasVPCLMULQDQ", "true",
1947330f729Sjoerg                                         "Enable vpclmulqdq instructions",
1957330f729Sjoerg                                         [FeatureAVX, FeaturePCLMUL]>;
1967330f729Sjoergdef FeatureFMA4    : SubtargetFeature<"fma4", "HasFMA4", "true",
1977330f729Sjoerg                                      "Enable four-operand fused multiple-add",
1987330f729Sjoerg                                      [FeatureAVX, FeatureSSE4A]>;
1997330f729Sjoergdef FeatureXOP     : SubtargetFeature<"xop", "HasXOP", "true",
2007330f729Sjoerg                                      "Enable XOP instructions",
2017330f729Sjoerg                                      [FeatureFMA4]>;
2027330f729Sjoergdef FeatureSSEUnalignedMem : SubtargetFeature<"sse-unaligned-mem",
2037330f729Sjoerg                                          "HasSSEUnalignedMem", "true",
2047330f729Sjoerg                      "Allow unaligned memory operands with SSE instructions">;
2057330f729Sjoergdef FeatureAES     : SubtargetFeature<"aes", "HasAES", "true",
2067330f729Sjoerg                                      "Enable AES instructions",
2077330f729Sjoerg                                      [FeatureSSE2]>;
2087330f729Sjoergdef FeatureVAES    : SubtargetFeature<"vaes", "HasVAES", "true",
2097330f729Sjoerg                       "Promote selected AES instructions to AVX512/AVX registers",
2107330f729Sjoerg                        [FeatureAVX, FeatureAES]>;
2117330f729Sjoergdef FeatureTBM     : SubtargetFeature<"tbm", "HasTBM", "true",
2127330f729Sjoerg                                      "Enable TBM instructions">;
2137330f729Sjoergdef FeatureLWP     : SubtargetFeature<"lwp", "HasLWP", "true",
2147330f729Sjoerg                                      "Enable LWP instructions">;
2157330f729Sjoergdef FeatureMOVBE   : SubtargetFeature<"movbe", "HasMOVBE", "true",
2167330f729Sjoerg                                      "Support MOVBE instruction">;
2177330f729Sjoergdef FeatureRDRAND  : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
2187330f729Sjoerg                                      "Support RDRAND instruction">;
2197330f729Sjoergdef FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
2207330f729Sjoerg                                       "Support FS/GS Base instructions">;
2217330f729Sjoergdef FeatureLZCNT   : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
2227330f729Sjoerg                                      "Support LZCNT instruction">;
2237330f729Sjoergdef FeatureBMI     : SubtargetFeature<"bmi", "HasBMI", "true",
2247330f729Sjoerg                                      "Support BMI instructions">;
2257330f729Sjoergdef FeatureBMI2    : SubtargetFeature<"bmi2", "HasBMI2", "true",
2267330f729Sjoerg                                      "Support BMI2 instructions">;
2277330f729Sjoergdef FeatureRTM     : SubtargetFeature<"rtm", "HasRTM", "true",
2287330f729Sjoerg                                      "Support RTM instructions">;
2297330f729Sjoergdef FeatureADX     : SubtargetFeature<"adx", "HasADX", "true",
2307330f729Sjoerg                                      "Support ADX instructions">;
2317330f729Sjoergdef FeatureSHA     : SubtargetFeature<"sha", "HasSHA", "true",
2327330f729Sjoerg                                      "Enable SHA instructions",
2337330f729Sjoerg                                      [FeatureSSE2]>;
2347330f729Sjoergdef FeatureSHSTK   : SubtargetFeature<"shstk", "HasSHSTK", "true",
2357330f729Sjoerg                       "Support CET Shadow-Stack instructions">;
2367330f729Sjoergdef FeaturePRFCHW  : SubtargetFeature<"prfchw", "HasPRFCHW", "true",
2377330f729Sjoerg                                      "Support PRFCHW instructions">;
2387330f729Sjoergdef FeatureRDSEED  : SubtargetFeature<"rdseed", "HasRDSEED", "true",
2397330f729Sjoerg                                      "Support RDSEED instruction">;
240*82d56013Sjoergdef FeatureLAHFSAHF : SubtargetFeature<"sahf", "HasLAHFSAHF64", "true",
241*82d56013Sjoerg                           "Support LAHF and SAHF instructions in 64-bit mode">;
2427330f729Sjoergdef FeatureMWAITX  : SubtargetFeature<"mwaitx", "HasMWAITX", "true",
2437330f729Sjoerg                                      "Enable MONITORX/MWAITX timer functionality">;
2447330f729Sjoergdef FeatureCLZERO  : SubtargetFeature<"clzero", "HasCLZERO", "true",
2457330f729Sjoerg                                      "Enable Cache Line Zero">;
2467330f729Sjoergdef FeatureCLDEMOTE  : SubtargetFeature<"cldemote", "HasCLDEMOTE", "true",
2477330f729Sjoerg                                      "Enable Cache Demote">;
2487330f729Sjoergdef FeaturePTWRITE  : SubtargetFeature<"ptwrite", "HasPTWRITE", "true",
2497330f729Sjoerg                                      "Support ptwrite instruction">;
250*82d56013Sjoergdef FeatureAMXTILE     : SubtargetFeature<"amx-tile", "HasAMXTILE", "true",
251*82d56013Sjoerg                                      "Support AMX-TILE instructions">;
252*82d56013Sjoergdef FeatureAMXINT8     : SubtargetFeature<"amx-int8", "HasAMXINT8", "true",
253*82d56013Sjoerg                                      "Support AMX-INT8 instructions",
254*82d56013Sjoerg                                      [FeatureAMXTILE]>;
255*82d56013Sjoergdef FeatureAMXBF16     : SubtargetFeature<"amx-bf16", "HasAMXBF16", "true",
256*82d56013Sjoerg                                      "Support AMX-BF16 instructions",
257*82d56013Sjoerg                                      [FeatureAMXTILE]>;
2587330f729Sjoergdef FeatureLEAForSP : SubtargetFeature<"lea-sp", "UseLeaForSP", "true",
2597330f729Sjoerg                                     "Use LEA for adjusting the stack pointer">;
2607330f729Sjoergdef FeatureSlowDivide32 : SubtargetFeature<"idivl-to-divb",
2617330f729Sjoerg                                     "HasSlowDivide32", "true",
2627330f729Sjoerg                                     "Use 8-bit divide for positive values less than 256">;
2637330f729Sjoergdef FeatureSlowDivide64 : SubtargetFeature<"idivq-to-divl",
2647330f729Sjoerg                                     "HasSlowDivide64", "true",
2657330f729Sjoerg                                     "Use 32-bit divide for positive values less than 2^32">;
2667330f729Sjoergdef FeaturePadShortFunctions : SubtargetFeature<"pad-short-functions",
2677330f729Sjoerg                                     "PadShortFunctions", "true",
2687330f729Sjoerg                                     "Pad short functions">;
2697330f729Sjoergdef FeatureINVPCID : SubtargetFeature<"invpcid", "HasINVPCID", "true",
2707330f729Sjoerg                                      "Invalidate Process-Context Identifier">;
2717330f729Sjoergdef FeatureSGX     : SubtargetFeature<"sgx", "HasSGX", "true",
2727330f729Sjoerg                                      "Enable Software Guard Extensions">;
2737330f729Sjoergdef FeatureCLFLUSHOPT : SubtargetFeature<"clflushopt", "HasCLFLUSHOPT", "true",
2747330f729Sjoerg                                      "Flush A Cache Line Optimized">;
2757330f729Sjoergdef FeatureCLWB    : SubtargetFeature<"clwb", "HasCLWB", "true",
2767330f729Sjoerg                                      "Cache Line Write Back">;
2777330f729Sjoergdef FeatureWBNOINVD    : SubtargetFeature<"wbnoinvd", "HasWBNOINVD", "true",
2787330f729Sjoerg                                      "Write Back No Invalidate">;
2797330f729Sjoergdef FeatureRDPID : SubtargetFeature<"rdpid", "HasRDPID", "true",
2807330f729Sjoerg                                    "Support RDPID instructions">;
2817330f729Sjoergdef FeatureWAITPKG  : SubtargetFeature<"waitpkg", "HasWAITPKG", "true",
2827330f729Sjoerg                                      "Wait and pause enhancements">;
2837330f729Sjoergdef FeatureENQCMD : SubtargetFeature<"enqcmd", "HasENQCMD", "true",
2847330f729Sjoerg                                     "Has ENQCMD instructions">;
285*82d56013Sjoergdef FeatureKL  : SubtargetFeature<"kl", "HasKL", "true",
286*82d56013Sjoerg                                  "Support Key Locker kl Instructions",
287*82d56013Sjoerg                                  [FeatureSSE2]>;
288*82d56013Sjoergdef FeatureWIDEKL  : SubtargetFeature<"widekl", "HasWIDEKL", "true",
289*82d56013Sjoerg                                      "Support Key Locker wide Instructions",
290*82d56013Sjoerg                                      [FeatureKL]>;
291*82d56013Sjoergdef FeatureHRESET : SubtargetFeature<"hreset", "HasHRESET", "true",
292*82d56013Sjoerg                                      "Has hreset instruction">;
293*82d56013Sjoergdef FeatureSERIALIZE : SubtargetFeature<"serialize", "HasSERIALIZE", "true",
294*82d56013Sjoerg                                        "Has serialize instruction">;
295*82d56013Sjoergdef FeatureTSXLDTRK : SubtargetFeature<"tsxldtrk", "HasTSXLDTRK", "true",
296*82d56013Sjoerg                                       "Support TSXLDTRK instructions">;
297*82d56013Sjoergdef FeatureUINTR : SubtargetFeature<"uintr", "HasUINTR", "true",
298*82d56013Sjoerg                                    "Has UINTR Instructions">;
2997330f729Sjoerg// On some processors, instructions that implicitly take two memory operands are
3007330f729Sjoerg// slow. In practice, this means that CALL, PUSH, and POP with memory operands
3017330f729Sjoerg// should be avoided in favor of a MOV + register CALL/PUSH/POP.
3027330f729Sjoergdef FeatureSlowTwoMemOps : SubtargetFeature<"slow-two-mem-ops",
3037330f729Sjoerg                                     "SlowTwoMemOps", "true",
3047330f729Sjoerg                                     "Two memory operand instructions are slow">;
3057330f729Sjoergdef FeatureLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LEAUsesAG", "true",
3067330f729Sjoerg                                   "LEA instruction needs inputs at AG stage">;
3077330f729Sjoergdef FeatureSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
3087330f729Sjoerg                                   "LEA instruction with certain arguments is slow">;
3097330f729Sjoergdef FeatureSlow3OpsLEA : SubtargetFeature<"slow-3ops-lea", "Slow3OpsLEA", "true",
3107330f729Sjoerg                                   "LEA instruction with 3 ops or certain registers is slow">;
3117330f729Sjoergdef FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
3127330f729Sjoerg                                   "INC and DEC instructions are slower than ADD and SUB">;
3137330f729Sjoergdef FeatureSoftFloat
3147330f729Sjoerg    : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
3157330f729Sjoerg                       "Use software floating point features">;
3167330f729Sjoergdef FeaturePOPCNTFalseDeps : SubtargetFeature<"false-deps-popcnt",
3177330f729Sjoerg                                     "HasPOPCNTFalseDeps", "true",
3187330f729Sjoerg                                     "POPCNT has a false dependency on dest register">;
3197330f729Sjoergdef FeatureLZCNTFalseDeps : SubtargetFeature<"false-deps-lzcnt-tzcnt",
3207330f729Sjoerg                                     "HasLZCNTFalseDeps", "true",
3217330f729Sjoerg                                     "LZCNT/TZCNT have a false dependency on dest register">;
3227330f729Sjoergdef FeaturePCONFIG : SubtargetFeature<"pconfig", "HasPCONFIG", "true",
3237330f729Sjoerg                                      "platform configuration instruction">;
3247330f729Sjoerg// On recent X86 (port bound) processors, its preferable to combine to a single shuffle
3257330f729Sjoerg// using a variable mask over multiple fixed shuffles.
3267330f729Sjoergdef FeatureFastVariableShuffle
3277330f729Sjoerg    : SubtargetFeature<"fast-variable-shuffle",
3287330f729Sjoerg                       "HasFastVariableShuffle",
3297330f729Sjoerg                       "true", "Shuffles with variable masks are fast">;
330*82d56013Sjoerg// On some X86 processors, a vzeroupper instruction should be inserted after
331*82d56013Sjoerg// using ymm/zmm registers before executing code that may use SSE instructions.
332*82d56013Sjoergdef FeatureInsertVZEROUPPER
333*82d56013Sjoerg    : SubtargetFeature<"vzeroupper",
334*82d56013Sjoerg                       "InsertVZEROUPPER",
335*82d56013Sjoerg                       "true", "Should insert vzeroupper instructions">;
3367330f729Sjoerg// FeatureFastScalarFSQRT should be enabled if scalar FSQRT has shorter latency
3377330f729Sjoerg// than the corresponding NR code. FeatureFastVectorFSQRT should be enabled if
3387330f729Sjoerg// vector FSQRT has higher throughput than the corresponding NR code.
3397330f729Sjoerg// The idea is that throughput bound code is likely to be vectorized, so for
3407330f729Sjoerg// vectorized code we should care about the throughput of SQRT operations.
3417330f729Sjoerg// But if the code is scalar that probably means that the code has some kind of
3427330f729Sjoerg// dependency and we should care more about reducing the latency.
3437330f729Sjoergdef FeatureFastScalarFSQRT
3447330f729Sjoerg    : SubtargetFeature<"fast-scalar-fsqrt", "HasFastScalarFSQRT",
3457330f729Sjoerg                       "true", "Scalar SQRT is fast (disable Newton-Raphson)">;
3467330f729Sjoergdef FeatureFastVectorFSQRT
3477330f729Sjoerg    : SubtargetFeature<"fast-vector-fsqrt", "HasFastVectorFSQRT",
3487330f729Sjoerg                       "true", "Vector SQRT is fast (disable Newton-Raphson)">;
3497330f729Sjoerg// If lzcnt has equivalent latency/throughput to most simple integer ops, it can
3507330f729Sjoerg// be used to replace test/set sequences.
3517330f729Sjoergdef FeatureFastLZCNT
3527330f729Sjoerg    : SubtargetFeature<
3537330f729Sjoerg          "fast-lzcnt", "HasFastLZCNT", "true",
3547330f729Sjoerg          "LZCNT instructions are as fast as most simple integer ops">;
355*82d56013Sjoerg// If the target can efficiently decode NOPs upto 7-bytes in length.
356*82d56013Sjoergdef FeatureFast7ByteNOP
357*82d56013Sjoerg    : SubtargetFeature<
358*82d56013Sjoerg          "fast-7bytenop", "HasFast7ByteNOP", "true",
359*82d56013Sjoerg          "Target can quickly decode up to 7 byte NOPs">;
3607330f729Sjoerg// If the target can efficiently decode NOPs upto 11-bytes in length.
3617330f729Sjoergdef FeatureFast11ByteNOP
3627330f729Sjoerg    : SubtargetFeature<
3637330f729Sjoerg          "fast-11bytenop", "HasFast11ByteNOP", "true",
3647330f729Sjoerg          "Target can quickly decode up to 11 byte NOPs">;
3657330f729Sjoerg// If the target can efficiently decode NOPs upto 15-bytes in length.
3667330f729Sjoergdef FeatureFast15ByteNOP
3677330f729Sjoerg    : SubtargetFeature<
3687330f729Sjoerg          "fast-15bytenop", "HasFast15ByteNOP", "true",
3697330f729Sjoerg          "Target can quickly decode up to 15 byte NOPs">;
3707330f729Sjoerg// Sandy Bridge and newer processors can use SHLD with the same source on both
3717330f729Sjoerg// inputs to implement rotate to avoid the partial flag update of the normal
3727330f729Sjoerg// rotate instructions.
3737330f729Sjoergdef FeatureFastSHLDRotate
3747330f729Sjoerg    : SubtargetFeature<
3757330f729Sjoerg          "fast-shld-rotate", "HasFastSHLDRotate", "true",
3767330f729Sjoerg          "SHLD can be used as a faster rotate">;
3777330f729Sjoerg
3787330f729Sjoerg// Ivy Bridge and newer processors have enhanced REP MOVSB and STOSB (aka
3797330f729Sjoerg// "string operations"). See "REP String Enhancement" in the Intel Software
3807330f729Sjoerg// Development Manual. This feature essentially means that REP MOVSB will copy
3817330f729Sjoerg// using the largest available size instead of copying bytes one by one, making
3827330f729Sjoerg// it at least as fast as REPMOVS{W,D,Q}.
3837330f729Sjoergdef FeatureERMSB
3847330f729Sjoerg    : SubtargetFeature<
3857330f729Sjoerg          "ermsb", "HasERMSB", "true",
3867330f729Sjoerg          "REP MOVS/STOS are fast">;
3877330f729Sjoerg
388*82d56013Sjoerg// Icelake and newer processors have Fast Short REP MOV.
389*82d56013Sjoergdef FeatureFSRM
390*82d56013Sjoerg    : SubtargetFeature<
391*82d56013Sjoerg          "fsrm", "HasFSRM", "true",
392*82d56013Sjoerg          "REP MOVSB of short lengths is faster">;
393*82d56013Sjoerg
3947330f729Sjoerg// Bulldozer and newer processors can merge CMP/TEST (but not other
3957330f729Sjoerg// instructions) with conditional branches.
3967330f729Sjoergdef FeatureBranchFusion
3977330f729Sjoerg    : SubtargetFeature<"branchfusion", "HasBranchFusion", "true",
3987330f729Sjoerg                 "CMP/TEST can be fused with conditional branches">;
3997330f729Sjoerg
4007330f729Sjoerg// Sandy Bridge and newer processors have many instructions that can be
4017330f729Sjoerg// fused with conditional branches and pass through the CPU as a single
4027330f729Sjoerg// operation.
4037330f729Sjoergdef FeatureMacroFusion
4047330f729Sjoerg    : SubtargetFeature<"macrofusion", "HasMacroFusion", "true",
4057330f729Sjoerg                 "Various instructions can be fused with conditional branches">;
4067330f729Sjoerg
4077330f729Sjoerg// Gather is available since Haswell (AVX2 set). So technically, we can
4087330f729Sjoerg// generate Gathers on all AVX2 processors. But the overhead on HSW is high.
4097330f729Sjoerg// Skylake Client processor has faster Gathers than HSW and performance is
4107330f729Sjoerg// similar to Skylake Server (AVX-512).
4117330f729Sjoergdef FeatureHasFastGather
4127330f729Sjoerg    : SubtargetFeature<"fast-gather", "HasFastGather", "true",
4137330f729Sjoerg                       "Indicates if gather is reasonably fast">;
4147330f729Sjoerg
4157330f729Sjoergdef FeaturePrefer128Bit
4167330f729Sjoerg    : SubtargetFeature<"prefer-128-bit", "Prefer128Bit", "true",
4177330f729Sjoerg                       "Prefer 128-bit AVX instructions">;
4187330f729Sjoerg
4197330f729Sjoergdef FeaturePrefer256Bit
4207330f729Sjoerg    : SubtargetFeature<"prefer-256-bit", "Prefer256Bit", "true",
4217330f729Sjoerg                       "Prefer 256-bit AVX instructions">;
4227330f729Sjoerg
4237330f729Sjoergdef FeaturePreferMaskRegisters
4247330f729Sjoerg    : SubtargetFeature<"prefer-mask-registers", "PreferMaskRegisters", "true",
4257330f729Sjoerg                       "Prefer AVX512 mask registers over PTEST/MOVMSK">;
4267330f729Sjoerg
4277330f729Sjoerg// Lower indirect calls using a special construct called a `retpoline` to
4287330f729Sjoerg// mitigate potential Spectre v2 attacks against them.
4297330f729Sjoergdef FeatureRetpolineIndirectCalls
4307330f729Sjoerg    : SubtargetFeature<
4317330f729Sjoerg          "retpoline-indirect-calls", "UseRetpolineIndirectCalls", "true",
4327330f729Sjoerg          "Remove speculation of indirect calls from the generated code">;
4337330f729Sjoerg
4347330f729Sjoerg// Lower indirect branches and switches either using conditional branch trees
4357330f729Sjoerg// or using a special construct called a `retpoline` to mitigate potential
4367330f729Sjoerg// Spectre v2 attacks against them.
4377330f729Sjoergdef FeatureRetpolineIndirectBranches
4387330f729Sjoerg    : SubtargetFeature<
4397330f729Sjoerg          "retpoline-indirect-branches", "UseRetpolineIndirectBranches", "true",
4407330f729Sjoerg          "Remove speculation of indirect branches from the generated code">;
4417330f729Sjoerg
4427330f729Sjoerg// Deprecated umbrella feature for enabling both `retpoline-indirect-calls` and
4437330f729Sjoerg// `retpoline-indirect-branches` above.
4447330f729Sjoergdef FeatureRetpoline
4457330f729Sjoerg    : SubtargetFeature<"retpoline", "DeprecatedUseRetpoline", "true",
4467330f729Sjoerg                       "Remove speculation of indirect branches from the "
4477330f729Sjoerg                       "generated code, either by avoiding them entirely or "
4487330f729Sjoerg                       "lowering them with a speculation blocking construct",
4497330f729Sjoerg                       [FeatureRetpolineIndirectCalls,
4507330f729Sjoerg                        FeatureRetpolineIndirectBranches]>;
4517330f729Sjoerg
4527330f729Sjoerg// Rely on external thunks for the emitted retpoline calls. This allows users
4537330f729Sjoerg// to provide their own custom thunk definitions in highly specialized
4547330f729Sjoerg// environments such as a kernel that does boot-time hot patching.
4557330f729Sjoergdef FeatureRetpolineExternalThunk
4567330f729Sjoerg    : SubtargetFeature<
4577330f729Sjoerg          "retpoline-external-thunk", "UseRetpolineExternalThunk", "true",
4587330f729Sjoerg          "When lowering an indirect call or branch using a `retpoline`, rely "
4597330f729Sjoerg          "on the specified user provided thunk rather than emitting one "
4607330f729Sjoerg          "ourselves. Only has effect when combined with some other retpoline "
4617330f729Sjoerg          "feature", [FeatureRetpolineIndirectCalls]>;
4627330f729Sjoerg
463*82d56013Sjoerg// Mitigate LVI attacks against indirect calls/branches and call returns
464*82d56013Sjoergdef FeatureLVIControlFlowIntegrity
465*82d56013Sjoerg    : SubtargetFeature<
466*82d56013Sjoerg          "lvi-cfi", "UseLVIControlFlowIntegrity", "true",
467*82d56013Sjoerg          "Prevent indirect calls/branches from using a memory operand, and "
468*82d56013Sjoerg          "precede all indirect calls/branches from a register with an "
469*82d56013Sjoerg          "LFENCE instruction to serialize control flow. Also decompose RET "
470*82d56013Sjoerg          "instructions into a POP+LFENCE+JMP sequence.">;
471*82d56013Sjoerg
472*82d56013Sjoerg// Enable SESES to mitigate speculative execution attacks
473*82d56013Sjoergdef FeatureSpeculativeExecutionSideEffectSuppression
474*82d56013Sjoerg    : SubtargetFeature<
475*82d56013Sjoerg          "seses", "UseSpeculativeExecutionSideEffectSuppression", "true",
476*82d56013Sjoerg          "Prevent speculative execution side channel timing attacks by "
477*82d56013Sjoerg          "inserting a speculation barrier before memory reads, memory writes, "
478*82d56013Sjoerg          "and conditional branches. Implies LVI Control Flow integrity.",
479*82d56013Sjoerg          [FeatureLVIControlFlowIntegrity]>;
480*82d56013Sjoerg
481*82d56013Sjoerg// Mitigate LVI attacks against data loads
482*82d56013Sjoergdef FeatureLVILoadHardening
483*82d56013Sjoerg    : SubtargetFeature<
484*82d56013Sjoerg          "lvi-load-hardening", "UseLVILoadHardening", "true",
485*82d56013Sjoerg          "Insert LFENCE instructions to prevent data speculatively injected "
486*82d56013Sjoerg          "into loads from being used maliciously.">;
487*82d56013Sjoerg
4887330f729Sjoerg// Direct Move instructions.
4897330f729Sjoergdef FeatureMOVDIRI  : SubtargetFeature<"movdiri", "HasMOVDIRI", "true",
4907330f729Sjoerg                                       "Support movdiri instruction">;
4917330f729Sjoergdef FeatureMOVDIR64B : SubtargetFeature<"movdir64b", "HasMOVDIR64B", "true",
4927330f729Sjoerg                                        "Support movdir64b instruction">;
4937330f729Sjoerg
4947330f729Sjoergdef FeatureFastBEXTR : SubtargetFeature<"fast-bextr", "HasFastBEXTR", "true",
4957330f729Sjoerg          "Indicates that the BEXTR instruction is implemented as a single uop "
4967330f729Sjoerg          "with good throughput">;
4977330f729Sjoerg
4987330f729Sjoerg// Combine vector math operations with shuffles into horizontal math
4997330f729Sjoerg// instructions if a CPU implements horizontal operations (introduced with
5007330f729Sjoerg// SSE3) with better latency/throughput than the alternative sequence.
5017330f729Sjoergdef FeatureFastHorizontalOps
5027330f729Sjoerg    : SubtargetFeature<
5037330f729Sjoerg        "fast-hops", "HasFastHorizontalOps", "true",
5047330f729Sjoerg        "Prefer horizontal vector math instructions (haddp, phsub, etc.) over "
505*82d56013Sjoerg        "normal vector instructions with shuffles">;
5067330f729Sjoerg
5077330f729Sjoergdef FeatureFastScalarShiftMasks
5087330f729Sjoerg    : SubtargetFeature<
5097330f729Sjoerg        "fast-scalar-shift-masks", "HasFastScalarShiftMasks", "true",
5107330f729Sjoerg        "Prefer a left/right scalar logical shift pair over a shift+and pair">;
5117330f729Sjoerg
5127330f729Sjoergdef FeatureFastVectorShiftMasks
5137330f729Sjoerg    : SubtargetFeature<
5147330f729Sjoerg        "fast-vector-shift-masks", "HasFastVectorShiftMasks", "true",
5157330f729Sjoerg        "Prefer a left/right vector logical shift pair over a shift+and pair">;
5167330f729Sjoerg
517*82d56013Sjoergdef FeatureFastMOVBE
518*82d56013Sjoerg    : SubtargetFeature<"fast-movbe", "HasFastMOVBE", "true",
519*82d56013Sjoerg    "Prefer a movbe over a single-use load + bswap / single-use bswap + store">;
520*82d56013Sjoerg
521*82d56013Sjoergdef FeatureUseGLMDivSqrtCosts
522*82d56013Sjoerg    : SubtargetFeature<"use-glm-div-sqrt-costs", "UseGLMDivSqrtCosts", "true",
523*82d56013Sjoerg        "Use Goldmont specific floating point div/sqrt costs">;
5247330f729Sjoerg
5257330f729Sjoerg// Enable use of alias analysis during code generation.
5267330f729Sjoergdef FeatureUseAA : SubtargetFeature<"use-aa", "UseAA", "true",
5277330f729Sjoerg                                    "Use alias analysis during codegen">;
5287330f729Sjoerg
5297330f729Sjoerg// Bonnell
5307330f729Sjoergdef ProcIntelAtom : SubtargetFeature<"", "X86ProcFamily", "IntelAtom", "">;
5317330f729Sjoerg// Silvermont
5327330f729Sjoergdef ProcIntelSLM  : SubtargetFeature<"", "X86ProcFamily", "IntelSLM", "">;
5337330f729Sjoerg
5347330f729Sjoerg//===----------------------------------------------------------------------===//
5357330f729Sjoerg// Register File Description
5367330f729Sjoerg//===----------------------------------------------------------------------===//
5377330f729Sjoerg
5387330f729Sjoerginclude "X86RegisterInfo.td"
5397330f729Sjoerginclude "X86RegisterBanks.td"
5407330f729Sjoerg
5417330f729Sjoerg//===----------------------------------------------------------------------===//
5427330f729Sjoerg// Instruction Descriptions
5437330f729Sjoerg//===----------------------------------------------------------------------===//
5447330f729Sjoerg
5457330f729Sjoerginclude "X86Schedule.td"
5467330f729Sjoerginclude "X86InstrInfo.td"
5477330f729Sjoerginclude "X86SchedPredicates.td"
5487330f729Sjoerg
5497330f729Sjoergdef X86InstrInfo : InstrInfo;
5507330f729Sjoerg
5517330f729Sjoerg//===----------------------------------------------------------------------===//
5527330f729Sjoerg// X86 Scheduler Models
5537330f729Sjoerg//===----------------------------------------------------------------------===//
5547330f729Sjoerg
5557330f729Sjoerginclude "X86ScheduleAtom.td"
5567330f729Sjoerginclude "X86SchedSandyBridge.td"
5577330f729Sjoerginclude "X86SchedHaswell.td"
5587330f729Sjoerginclude "X86SchedBroadwell.td"
5597330f729Sjoerginclude "X86ScheduleSLM.td"
5607330f729Sjoerginclude "X86ScheduleZnver1.td"
561*82d56013Sjoerginclude "X86ScheduleZnver2.td"
562*82d56013Sjoerginclude "X86ScheduleZnver3.td"
5637330f729Sjoerginclude "X86ScheduleBdVer2.td"
5647330f729Sjoerginclude "X86ScheduleBtVer2.td"
5657330f729Sjoerginclude "X86SchedSkylakeClient.td"
5667330f729Sjoerginclude "X86SchedSkylakeServer.td"
5677330f729Sjoerg
5687330f729Sjoerg//===----------------------------------------------------------------------===//
5697330f729Sjoerg// X86 Processor Feature Lists
5707330f729Sjoerg//===----------------------------------------------------------------------===//
5717330f729Sjoerg
5727330f729Sjoergdef ProcessorFeatures {
573*82d56013Sjoerg  // x86-64 and x86-64-v[234]
574*82d56013Sjoerg  list<SubtargetFeature> X86_64V1Features = [
575*82d56013Sjoerg    FeatureX87, FeatureCMPXCHG8B, FeatureCMOV, FeatureMMX, FeatureSSE2,
576*82d56013Sjoerg    FeatureFXSR, FeatureNOPL, Feature64Bit
577*82d56013Sjoerg  ];
578*82d56013Sjoerg  list<SubtargetFeature> X86_64V2Features = !listconcat(
579*82d56013Sjoerg      X86_64V1Features,
580*82d56013Sjoerg      [FeatureCMPXCHG16B, FeatureLAHFSAHF, FeaturePOPCNT, FeatureSSE42]);
581*82d56013Sjoerg  list<SubtargetFeature> X86_64V3Features = !listconcat(X86_64V2Features, [
582*82d56013Sjoerg    FeatureAVX2, FeatureBMI, FeatureBMI2, FeatureF16C, FeatureFMA, FeatureLZCNT,
583*82d56013Sjoerg    FeatureMOVBE, FeatureXSAVE
584*82d56013Sjoerg  ]);
585*82d56013Sjoerg  list<SubtargetFeature> X86_64V4Features = !listconcat(X86_64V3Features, [
586*82d56013Sjoerg    FeatureBWI,
587*82d56013Sjoerg    FeatureCDI,
588*82d56013Sjoerg    FeatureDQI,
589*82d56013Sjoerg    FeatureVLX,
590*82d56013Sjoerg  ]);
591*82d56013Sjoerg
5927330f729Sjoerg  // Nehalem
593*82d56013Sjoerg  list<SubtargetFeature> NHMFeatures = X86_64V2Features;
594*82d56013Sjoerg  list<SubtargetFeature> NHMTuning = [FeatureMacroFusion,
595*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
5967330f729Sjoerg
5977330f729Sjoerg  // Westmere
5987330f729Sjoerg  list<SubtargetFeature> WSMAdditionalFeatures = [FeaturePCLMUL];
599*82d56013Sjoerg  list<SubtargetFeature> WSMTuning = NHMTuning;
6007330f729Sjoerg  list<SubtargetFeature> WSMFeatures =
601*82d56013Sjoerg    !listconcat(NHMFeatures, WSMAdditionalFeatures);
6027330f729Sjoerg
6037330f729Sjoerg  // Sandybridge
6047330f729Sjoerg  list<SubtargetFeature> SNBAdditionalFeatures = [FeatureAVX,
6057330f729Sjoerg                                                  FeatureXSAVE,
606*82d56013Sjoerg                                                  FeatureXSAVEOPT];
607*82d56013Sjoerg  list<SubtargetFeature> SNBTuning = [FeatureMacroFusion,
6087330f729Sjoerg                                      FeatureSlow3OpsLEA,
609*82d56013Sjoerg                                      FeatureSlowDivide64,
610*82d56013Sjoerg                                      FeatureSlowUAMem32,
6117330f729Sjoerg                                      FeatureFastScalarFSQRT,
6127330f729Sjoerg                                      FeatureFastSHLDRotate,
613*82d56013Sjoerg                                      FeatureFast15ByteNOP,
614*82d56013Sjoerg                                      FeaturePOPCNTFalseDeps,
615*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
6167330f729Sjoerg  list<SubtargetFeature> SNBFeatures =
617*82d56013Sjoerg    !listconcat(WSMFeatures, SNBAdditionalFeatures);
6187330f729Sjoerg
6197330f729Sjoerg  // Ivybridge
6207330f729Sjoerg  list<SubtargetFeature> IVBAdditionalFeatures = [FeatureRDRAND,
6217330f729Sjoerg                                                  FeatureF16C,
6227330f729Sjoerg                                                  FeatureFSGSBase];
623*82d56013Sjoerg  list<SubtargetFeature> IVBTuning = SNBTuning;
6247330f729Sjoerg  list<SubtargetFeature> IVBFeatures =
625*82d56013Sjoerg    !listconcat(SNBFeatures, IVBAdditionalFeatures);
6267330f729Sjoerg
6277330f729Sjoerg  // Haswell
6287330f729Sjoerg  list<SubtargetFeature> HSWAdditionalFeatures = [FeatureAVX2,
6297330f729Sjoerg                                                  FeatureBMI,
6307330f729Sjoerg                                                  FeatureBMI2,
6317330f729Sjoerg                                                  FeatureERMSB,
6327330f729Sjoerg                                                  FeatureFMA,
6337330f729Sjoerg                                                  FeatureINVPCID,
6347330f729Sjoerg                                                  FeatureLZCNT,
635*82d56013Sjoerg                                                  FeatureMOVBE];
636*82d56013Sjoerg  list<SubtargetFeature> HSWTuning = [FeatureMacroFusion,
637*82d56013Sjoerg                                      FeatureSlow3OpsLEA,
638*82d56013Sjoerg                                      FeatureSlowDivide64,
639*82d56013Sjoerg                                      FeatureFastScalarFSQRT,
640*82d56013Sjoerg                                      FeatureFastSHLDRotate,
641*82d56013Sjoerg                                      FeatureFast15ByteNOP,
642*82d56013Sjoerg                                      FeatureFastVariableShuffle,
643*82d56013Sjoerg                                      FeaturePOPCNTFalseDeps,
644*82d56013Sjoerg                                      FeatureLZCNTFalseDeps,
645*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
6467330f729Sjoerg  list<SubtargetFeature> HSWFeatures =
647*82d56013Sjoerg    !listconcat(IVBFeatures, HSWAdditionalFeatures);
6487330f729Sjoerg
6497330f729Sjoerg  // Broadwell
6507330f729Sjoerg  list<SubtargetFeature> BDWAdditionalFeatures = [FeatureADX,
6517330f729Sjoerg                                                  FeatureRDSEED,
6527330f729Sjoerg                                                  FeaturePRFCHW];
653*82d56013Sjoerg  list<SubtargetFeature> BDWTuning = HSWTuning;
6547330f729Sjoerg  list<SubtargetFeature> BDWFeatures =
655*82d56013Sjoerg    !listconcat(HSWFeatures, BDWAdditionalFeatures);
6567330f729Sjoerg
6577330f729Sjoerg  // Skylake
6587330f729Sjoerg  list<SubtargetFeature> SKLAdditionalFeatures = [FeatureAES,
6597330f729Sjoerg                                                  FeatureXSAVEC,
6607330f729Sjoerg                                                  FeatureXSAVES,
661*82d56013Sjoerg                                                  FeatureCLFLUSHOPT];
662*82d56013Sjoerg  list<SubtargetFeature> SKLTuning = [FeatureHasFastGather,
663*82d56013Sjoerg                                      FeatureMacroFusion,
664*82d56013Sjoerg                                      FeatureSlow3OpsLEA,
665*82d56013Sjoerg                                      FeatureSlowDivide64,
666*82d56013Sjoerg                                      FeatureFastScalarFSQRT,
667*82d56013Sjoerg                                      FeatureFastVectorFSQRT,
668*82d56013Sjoerg                                      FeatureFastSHLDRotate,
669*82d56013Sjoerg                                      FeatureFast15ByteNOP,
670*82d56013Sjoerg                                      FeatureFastVariableShuffle,
6717330f729Sjoerg                                      FeaturePOPCNTFalseDeps,
672*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
6737330f729Sjoerg  list<SubtargetFeature> SKLFeatures =
674*82d56013Sjoerg    !listconcat(BDWFeatures, SKLAdditionalFeatures);
6757330f729Sjoerg
6767330f729Sjoerg  // Skylake-AVX512
677*82d56013Sjoerg  list<SubtargetFeature> SKXAdditionalFeatures = [FeatureAES,
678*82d56013Sjoerg                                                  FeatureXSAVEC,
679*82d56013Sjoerg                                                  FeatureXSAVES,
680*82d56013Sjoerg                                                  FeatureCLFLUSHOPT,
681*82d56013Sjoerg                                                  FeatureAVX512,
6827330f729Sjoerg                                                  FeatureCDI,
6837330f729Sjoerg                                                  FeatureDQI,
6847330f729Sjoerg                                                  FeatureBWI,
6857330f729Sjoerg                                                  FeatureVLX,
6867330f729Sjoerg                                                  FeaturePKU,
6877330f729Sjoerg                                                  FeatureCLWB];
688*82d56013Sjoerg  list<SubtargetFeature> SKXTuning = [FeatureHasFastGather,
689*82d56013Sjoerg                                      FeatureMacroFusion,
690*82d56013Sjoerg                                      FeatureSlow3OpsLEA,
691*82d56013Sjoerg                                      FeatureSlowDivide64,
692*82d56013Sjoerg                                      FeatureFastScalarFSQRT,
693*82d56013Sjoerg                                      FeatureFastVectorFSQRT,
694*82d56013Sjoerg                                      FeatureFastSHLDRotate,
695*82d56013Sjoerg                                      FeatureFast15ByteNOP,
696*82d56013Sjoerg                                      FeatureFastVariableShuffle,
697*82d56013Sjoerg                                      FeaturePrefer256Bit,
698*82d56013Sjoerg                                      FeaturePOPCNTFalseDeps,
699*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
7007330f729Sjoerg  list<SubtargetFeature> SKXFeatures =
701*82d56013Sjoerg    !listconcat(BDWFeatures, SKXAdditionalFeatures);
7027330f729Sjoerg
7037330f729Sjoerg  // Cascadelake
7047330f729Sjoerg  list<SubtargetFeature> CLXAdditionalFeatures = [FeatureVNNI];
705*82d56013Sjoerg  list<SubtargetFeature> CLXTuning = SKXTuning;
7067330f729Sjoerg  list<SubtargetFeature> CLXFeatures =
707*82d56013Sjoerg    !listconcat(SKXFeatures, CLXAdditionalFeatures);
7087330f729Sjoerg
7097330f729Sjoerg  // Cooperlake
7107330f729Sjoerg  list<SubtargetFeature> CPXAdditionalFeatures = [FeatureBF16];
711*82d56013Sjoerg  list<SubtargetFeature> CPXTuning = SKXTuning;
7127330f729Sjoerg  list<SubtargetFeature> CPXFeatures =
713*82d56013Sjoerg    !listconcat(CLXFeatures, CPXAdditionalFeatures);
7147330f729Sjoerg
7157330f729Sjoerg  // Cannonlake
7167330f729Sjoerg  list<SubtargetFeature> CNLAdditionalFeatures = [FeatureAVX512,
7177330f729Sjoerg                                                  FeatureCDI,
7187330f729Sjoerg                                                  FeatureDQI,
7197330f729Sjoerg                                                  FeatureBWI,
7207330f729Sjoerg                                                  FeatureVLX,
7217330f729Sjoerg                                                  FeaturePKU,
7227330f729Sjoerg                                                  FeatureVBMI,
7237330f729Sjoerg                                                  FeatureIFMA,
724*82d56013Sjoerg                                                  FeatureSHA];
725*82d56013Sjoerg  list<SubtargetFeature> CNLTuning = [FeatureHasFastGather,
726*82d56013Sjoerg                                      FeatureMacroFusion,
727*82d56013Sjoerg                                      FeatureSlow3OpsLEA,
728*82d56013Sjoerg                                      FeatureSlowDivide64,
729*82d56013Sjoerg                                      FeatureFastScalarFSQRT,
730*82d56013Sjoerg                                      FeatureFastVectorFSQRT,
731*82d56013Sjoerg                                      FeatureFastSHLDRotate,
732*82d56013Sjoerg                                      FeatureFast15ByteNOP,
733*82d56013Sjoerg                                      FeatureFastVariableShuffle,
734*82d56013Sjoerg                                      FeaturePrefer256Bit,
735*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
7367330f729Sjoerg  list<SubtargetFeature> CNLFeatures =
737*82d56013Sjoerg    !listconcat(SKLFeatures, CNLAdditionalFeatures);
7387330f729Sjoerg
7397330f729Sjoerg  // Icelake
7407330f729Sjoerg  list<SubtargetFeature> ICLAdditionalFeatures = [FeatureBITALG,
7417330f729Sjoerg                                                  FeatureVAES,
7427330f729Sjoerg                                                  FeatureVBMI2,
7437330f729Sjoerg                                                  FeatureVNNI,
7447330f729Sjoerg                                                  FeatureVPCLMULQDQ,
7457330f729Sjoerg                                                  FeatureVPOPCNTDQ,
7467330f729Sjoerg                                                  FeatureGFNI,
747*82d56013Sjoerg                                                  FeatureRDPID,
748*82d56013Sjoerg                                                  FeatureFSRM];
749*82d56013Sjoerg  list<SubtargetFeature> ICLTuning = CNLTuning;
7507330f729Sjoerg  list<SubtargetFeature> ICLFeatures =
751*82d56013Sjoerg    !listconcat(CNLFeatures, ICLAdditionalFeatures);
7527330f729Sjoerg
7537330f729Sjoerg  // Icelake Server
754*82d56013Sjoerg  list<SubtargetFeature> ICXAdditionalFeatures = [FeaturePCONFIG,
755*82d56013Sjoerg                                                  FeatureCLWB,
756*82d56013Sjoerg                                                  FeatureWBNOINVD];
757*82d56013Sjoerg  list<SubtargetFeature> ICXTuning = CNLTuning;
7587330f729Sjoerg  list<SubtargetFeature> ICXFeatures =
759*82d56013Sjoerg    !listconcat(ICLFeatures, ICXAdditionalFeatures);
7607330f729Sjoerg
7617330f729Sjoerg  // Tigerlake
7627330f729Sjoerg  list<SubtargetFeature> TGLAdditionalFeatures = [FeatureVP2INTERSECT,
763*82d56013Sjoerg                                                  FeatureCLWB,
7647330f729Sjoerg                                                  FeatureMOVDIRI,
7657330f729Sjoerg                                                  FeatureMOVDIR64B,
7667330f729Sjoerg                                                  FeatureSHSTK];
767*82d56013Sjoerg  list<SubtargetFeature> TGLTuning = CNLTuning;
7687330f729Sjoerg  list<SubtargetFeature> TGLFeatures =
769*82d56013Sjoerg    !listconcat(ICLFeatures, TGLAdditionalFeatures );
770*82d56013Sjoerg
771*82d56013Sjoerg  // Sapphirerapids
772*82d56013Sjoerg  list<SubtargetFeature> SPRAdditionalFeatures = [FeatureAMXTILE,
773*82d56013Sjoerg                                                  FeatureAMXINT8,
774*82d56013Sjoerg                                                  FeatureAMXBF16,
775*82d56013Sjoerg                                                  FeatureBF16,
776*82d56013Sjoerg                                                  FeatureSERIALIZE,
777*82d56013Sjoerg                                                  FeatureCLDEMOTE,
778*82d56013Sjoerg                                                  FeatureWAITPKG,
779*82d56013Sjoerg                                                  FeaturePTWRITE,
780*82d56013Sjoerg                                                  FeatureAVXVNNI,
781*82d56013Sjoerg                                                  FeatureTSXLDTRK,
782*82d56013Sjoerg                                                  FeatureENQCMD,
783*82d56013Sjoerg                                                  FeatureSHSTK,
784*82d56013Sjoerg                                                  FeatureVP2INTERSECT,
785*82d56013Sjoerg                                                  FeatureMOVDIRI,
786*82d56013Sjoerg                                                  FeatureMOVDIR64B,
787*82d56013Sjoerg                                                  FeatureUINTR];
788*82d56013Sjoerg  list<SubtargetFeature> SPRTuning = ICXTuning;
789*82d56013Sjoerg  list<SubtargetFeature> SPRFeatures =
790*82d56013Sjoerg    !listconcat(ICXFeatures, SPRAdditionalFeatures);
7917330f729Sjoerg
7927330f729Sjoerg  // Atom
793*82d56013Sjoerg  list<SubtargetFeature> AtomFeatures = [FeatureX87,
7947330f729Sjoerg                                         FeatureCMPXCHG8B,
7957330f729Sjoerg                                         FeatureCMOV,
7967330f729Sjoerg                                         FeatureMMX,
7977330f729Sjoerg                                         FeatureSSSE3,
7987330f729Sjoerg                                         FeatureFXSR,
7997330f729Sjoerg                                         FeatureNOPL,
8007330f729Sjoerg                                         Feature64Bit,
8017330f729Sjoerg                                         FeatureCMPXCHG16B,
8027330f729Sjoerg                                         FeatureMOVBE,
8037330f729Sjoerg                                         FeatureLAHFSAHF];
804*82d56013Sjoerg  list<SubtargetFeature> AtomTuning = [ProcIntelAtom,
8057330f729Sjoerg                                       FeatureSlowUAMem16,
8067330f729Sjoerg                                       FeatureLEAForSP,
8077330f729Sjoerg                                       FeatureSlowDivide32,
8087330f729Sjoerg                                       FeatureSlowDivide64,
809*82d56013Sjoerg                                       FeatureSlowTwoMemOps,
8107330f729Sjoerg                                       FeatureLEAUsesAG,
811*82d56013Sjoerg                                       FeaturePadShortFunctions,
812*82d56013Sjoerg                                       FeatureInsertVZEROUPPER];
8137330f729Sjoerg
8147330f729Sjoerg  // Silvermont
8157330f729Sjoerg  list<SubtargetFeature> SLMAdditionalFeatures = [FeatureSSE42,
8167330f729Sjoerg                                                  FeaturePOPCNT,
8177330f729Sjoerg                                                  FeaturePCLMUL,
8187330f729Sjoerg                                                  FeaturePRFCHW,
819*82d56013Sjoerg                                                  FeatureRDRAND];
820*82d56013Sjoerg  list<SubtargetFeature> SLMTuning = [ProcIntelSLM,
821*82d56013Sjoerg                                      FeatureSlowTwoMemOps,
8227330f729Sjoerg                                      FeatureSlowLEA,
8237330f729Sjoerg                                      FeatureSlowIncDec,
8247330f729Sjoerg                                      FeatureSlowDivide64,
8257330f729Sjoerg                                      FeatureSlowPMULLD,
826*82d56013Sjoerg                                      FeatureFast7ByteNOP,
827*82d56013Sjoerg                                      FeatureFastMOVBE,
828*82d56013Sjoerg                                      FeaturePOPCNTFalseDeps,
829*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
8307330f729Sjoerg  list<SubtargetFeature> SLMFeatures =
831*82d56013Sjoerg    !listconcat(AtomFeatures, SLMAdditionalFeatures);
8327330f729Sjoerg
8337330f729Sjoerg  // Goldmont
8347330f729Sjoerg  list<SubtargetFeature> GLMAdditionalFeatures = [FeatureAES,
8357330f729Sjoerg                                                  FeatureSHA,
8367330f729Sjoerg                                                  FeatureRDSEED,
8377330f729Sjoerg                                                  FeatureXSAVE,
8387330f729Sjoerg                                                  FeatureXSAVEOPT,
8397330f729Sjoerg                                                  FeatureXSAVEC,
8407330f729Sjoerg                                                  FeatureXSAVES,
8417330f729Sjoerg                                                  FeatureCLFLUSHOPT,
8427330f729Sjoerg                                                  FeatureFSGSBase];
843*82d56013Sjoerg  list<SubtargetFeature> GLMTuning = [FeatureUseGLMDivSqrtCosts,
844*82d56013Sjoerg                                      FeatureSlowTwoMemOps,
845*82d56013Sjoerg                                      FeatureSlowLEA,
846*82d56013Sjoerg                                      FeatureSlowIncDec,
847*82d56013Sjoerg                                      FeatureFastMOVBE,
848*82d56013Sjoerg                                      FeaturePOPCNTFalseDeps,
849*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
8507330f729Sjoerg  list<SubtargetFeature> GLMFeatures =
851*82d56013Sjoerg    !listconcat(SLMFeatures, GLMAdditionalFeatures);
8527330f729Sjoerg
8537330f729Sjoerg  // Goldmont Plus
8547330f729Sjoerg  list<SubtargetFeature> GLPAdditionalFeatures = [FeaturePTWRITE,
855*82d56013Sjoerg                                                  FeatureRDPID];
856*82d56013Sjoerg  list<SubtargetFeature> GLPTuning = [FeatureUseGLMDivSqrtCosts,
857*82d56013Sjoerg                                      FeatureSlowTwoMemOps,
858*82d56013Sjoerg                                      FeatureSlowLEA,
859*82d56013Sjoerg                                      FeatureSlowIncDec,
860*82d56013Sjoerg                                      FeatureFastMOVBE,
861*82d56013Sjoerg                                      FeatureInsertVZEROUPPER];
8627330f729Sjoerg  list<SubtargetFeature> GLPFeatures =
863*82d56013Sjoerg    !listconcat(GLMFeatures, GLPAdditionalFeatures);
8647330f729Sjoerg
8657330f729Sjoerg  // Tremont
866*82d56013Sjoerg  list<SubtargetFeature> TRMAdditionalFeatures = [FeatureCLWB,
867*82d56013Sjoerg                                                  FeatureGFNI];
868*82d56013Sjoerg  list<SubtargetFeature> TRMTuning = GLPTuning;
869*82d56013Sjoerg  list<SubtargetFeature> TRMFeatures =
870*82d56013Sjoerg    !listconcat(GLPFeatures, TRMAdditionalFeatures);
871*82d56013Sjoerg
872*82d56013Sjoerg  // Alderlake
873*82d56013Sjoerg  list<SubtargetFeature> ADLAdditionalFeatures = [FeatureSERIALIZE,
874*82d56013Sjoerg                                                  FeaturePCONFIG,
875*82d56013Sjoerg                                                  FeatureSHSTK,
876*82d56013Sjoerg                                                  FeatureWIDEKL,
877*82d56013Sjoerg                                                  FeatureINVPCID,
878*82d56013Sjoerg                                                  FeatureADX,
879*82d56013Sjoerg                                                  FeatureFMA,
880*82d56013Sjoerg                                                  FeatureVAES,
881*82d56013Sjoerg                                                  FeatureVPCLMULQDQ,
882*82d56013Sjoerg                                                  FeatureF16C,
883*82d56013Sjoerg                                                  FeatureBMI,
884*82d56013Sjoerg                                                  FeatureBMI2,
885*82d56013Sjoerg                                                  FeatureLZCNT,
886*82d56013Sjoerg                                                  FeatureAVXVNNI,
887*82d56013Sjoerg                                                  FeaturePKU,
888*82d56013Sjoerg                                                  FeatureHRESET,
889*82d56013Sjoerg                                                  FeatureCLDEMOTE,
8907330f729Sjoerg                                                  FeatureMOVDIRI,
8917330f729Sjoerg                                                  FeatureMOVDIR64B,
8927330f729Sjoerg                                                  FeatureWAITPKG];
893*82d56013Sjoerg  list<SubtargetFeature> ADLTuning = SKLTuning;
894*82d56013Sjoerg  list<SubtargetFeature> ADLFeatures =
895*82d56013Sjoerg    !listconcat(TRMFeatures, ADLAdditionalFeatures);
8967330f729Sjoerg
8977330f729Sjoerg  // Knights Landing
8987330f729Sjoerg  list<SubtargetFeature> KNLFeatures = [FeatureX87,
8997330f729Sjoerg                                        FeatureCMPXCHG8B,
9007330f729Sjoerg                                        FeatureCMOV,
9017330f729Sjoerg                                        FeatureMMX,
9027330f729Sjoerg                                        FeatureFXSR,
9037330f729Sjoerg                                        FeatureNOPL,
9047330f729Sjoerg                                        Feature64Bit,
9057330f729Sjoerg                                        FeatureCMPXCHG16B,
9067330f729Sjoerg                                        FeaturePOPCNT,
9077330f729Sjoerg                                        FeaturePCLMUL,
9087330f729Sjoerg                                        FeatureXSAVE,
9097330f729Sjoerg                                        FeatureXSAVEOPT,
9107330f729Sjoerg                                        FeatureLAHFSAHF,
9117330f729Sjoerg                                        FeatureAES,
9127330f729Sjoerg                                        FeatureRDRAND,
9137330f729Sjoerg                                        FeatureF16C,
9147330f729Sjoerg                                        FeatureFSGSBase,
9157330f729Sjoerg                                        FeatureAVX512,
9167330f729Sjoerg                                        FeatureERI,
9177330f729Sjoerg                                        FeatureCDI,
9187330f729Sjoerg                                        FeaturePFI,
9197330f729Sjoerg                                        FeaturePREFETCHWT1,
9207330f729Sjoerg                                        FeatureADX,
9217330f729Sjoerg                                        FeatureRDSEED,
9227330f729Sjoerg                                        FeatureMOVBE,
9237330f729Sjoerg                                        FeatureLZCNT,
9247330f729Sjoerg                                        FeatureBMI,
9257330f729Sjoerg                                        FeatureBMI2,
9267330f729Sjoerg                                        FeatureFMA,
927*82d56013Sjoerg                                        FeaturePRFCHW];
928*82d56013Sjoerg  list<SubtargetFeature> KNLTuning = [FeatureSlowDivide64,
929*82d56013Sjoerg                                      FeatureSlow3OpsLEA,
930*82d56013Sjoerg                                      FeatureSlowIncDec,
9317330f729Sjoerg                                      FeatureSlowTwoMemOps,
932*82d56013Sjoerg                                      FeaturePreferMaskRegisters,
9337330f729Sjoerg                                      FeatureHasFastGather,
934*82d56013Sjoerg                                      FeatureFastMOVBE,
9357330f729Sjoerg                                      FeatureSlowPMADDWD];
9367330f729Sjoerg  // TODO Add AVX5124FMAPS/AVX5124VNNIW features
9377330f729Sjoerg  list<SubtargetFeature> KNMFeatures =
9387330f729Sjoerg    !listconcat(KNLFeatures, [FeatureVPOPCNTDQ]);
9397330f729Sjoerg
9407330f729Sjoerg  // Barcelona
941*82d56013Sjoerg  list<SubtargetFeature> BarcelonaFeatures = [FeatureX87,
9427330f729Sjoerg                                              FeatureCMPXCHG8B,
9437330f729Sjoerg                                              FeatureSSE4A,
9447330f729Sjoerg                                              Feature3DNowA,
9457330f729Sjoerg                                              FeatureFXSR,
9467330f729Sjoerg                                              FeatureNOPL,
9477330f729Sjoerg                                              FeatureCMPXCHG16B,
948*82d56013Sjoerg                                              FeaturePRFCHW,
9497330f729Sjoerg                                              FeatureLZCNT,
9507330f729Sjoerg                                              FeaturePOPCNT,
9517330f729Sjoerg                                              FeatureLAHFSAHF,
9527330f729Sjoerg                                              FeatureCMOV,
953*82d56013Sjoerg                                              Feature64Bit];
954*82d56013Sjoerg  list<SubtargetFeature> BarcelonaTuning = [FeatureFastScalarShiftMasks,
955*82d56013Sjoerg                                            FeatureSlowSHLD,
956*82d56013Sjoerg                                            FeatureInsertVZEROUPPER];
9577330f729Sjoerg
9587330f729Sjoerg  // Bobcat
959*82d56013Sjoerg  list<SubtargetFeature> BtVer1Features = [FeatureX87,
9607330f729Sjoerg                                           FeatureCMPXCHG8B,
9617330f729Sjoerg                                           FeatureCMOV,
9627330f729Sjoerg                                           FeatureMMX,
9637330f729Sjoerg                                           FeatureSSSE3,
9647330f729Sjoerg                                           FeatureSSE4A,
9657330f729Sjoerg                                           FeatureFXSR,
9667330f729Sjoerg                                           FeatureNOPL,
9677330f729Sjoerg                                           Feature64Bit,
9687330f729Sjoerg                                           FeatureCMPXCHG16B,
9697330f729Sjoerg                                           FeaturePRFCHW,
9707330f729Sjoerg                                           FeatureLZCNT,
9717330f729Sjoerg                                           FeaturePOPCNT,
972*82d56013Sjoerg                                           FeatureLAHFSAHF];
973*82d56013Sjoerg  list<SubtargetFeature> BtVer1Tuning = [FeatureFast15ByteNOP,
9747330f729Sjoerg                                         FeatureFastScalarShiftMasks,
975*82d56013Sjoerg                                         FeatureFastVectorShiftMasks,
976*82d56013Sjoerg                                         FeatureSlowSHLD,
977*82d56013Sjoerg                                         FeatureInsertVZEROUPPER];
9787330f729Sjoerg
9797330f729Sjoerg  // Jaguar
9807330f729Sjoerg  list<SubtargetFeature> BtVer2AdditionalFeatures = [FeatureAVX,
9817330f729Sjoerg                                                     FeatureAES,
9827330f729Sjoerg                                                     FeaturePCLMUL,
9837330f729Sjoerg                                                     FeatureBMI,
9847330f729Sjoerg                                                     FeatureF16C,
9857330f729Sjoerg                                                     FeatureMOVBE,
9867330f729Sjoerg                                                     FeatureXSAVE,
9877330f729Sjoerg                                                     FeatureXSAVEOPT];
988*82d56013Sjoerg  list<SubtargetFeature> BtVer2Tuning = [FeatureFastLZCNT,
9897330f729Sjoerg                                         FeatureFastBEXTR,
990*82d56013Sjoerg                                         FeatureFastHorizontalOps,
991*82d56013Sjoerg                                         FeatureFast15ByteNOP,
992*82d56013Sjoerg                                         FeatureFastScalarShiftMasks,
993*82d56013Sjoerg                                         FeatureFastVectorShiftMasks,
994*82d56013Sjoerg                                         FeatureFastMOVBE,
995*82d56013Sjoerg                                         FeatureSlowSHLD];
9967330f729Sjoerg  list<SubtargetFeature> BtVer2Features =
997*82d56013Sjoerg    !listconcat(BtVer1Features, BtVer2AdditionalFeatures);
9987330f729Sjoerg
9997330f729Sjoerg  // Bulldozer
1000*82d56013Sjoerg  list<SubtargetFeature> BdVer1Features = [FeatureX87,
10017330f729Sjoerg                                           FeatureCMPXCHG8B,
10027330f729Sjoerg                                           FeatureCMOV,
10037330f729Sjoerg                                           FeatureXOP,
10047330f729Sjoerg                                           Feature64Bit,
10057330f729Sjoerg                                           FeatureCMPXCHG16B,
10067330f729Sjoerg                                           FeatureAES,
10077330f729Sjoerg                                           FeaturePRFCHW,
10087330f729Sjoerg                                           FeaturePCLMUL,
10097330f729Sjoerg                                           FeatureMMX,
10107330f729Sjoerg                                           FeatureFXSR,
10117330f729Sjoerg                                           FeatureNOPL,
10127330f729Sjoerg                                           FeatureLZCNT,
10137330f729Sjoerg                                           FeaturePOPCNT,
10147330f729Sjoerg                                           FeatureXSAVE,
10157330f729Sjoerg                                           FeatureLWP,
1016*82d56013Sjoerg                                           FeatureLAHFSAHF];
1017*82d56013Sjoerg  list<SubtargetFeature> BdVer1Tuning = [FeatureSlowSHLD,
10187330f729Sjoerg                                         FeatureFast11ByteNOP,
10197330f729Sjoerg                                         FeatureFastScalarShiftMasks,
1020*82d56013Sjoerg                                         FeatureBranchFusion,
1021*82d56013Sjoerg                                         FeatureInsertVZEROUPPER];
10227330f729Sjoerg
10237330f729Sjoerg  // PileDriver
10247330f729Sjoerg  list<SubtargetFeature> BdVer2AdditionalFeatures = [FeatureF16C,
10257330f729Sjoerg                                                     FeatureBMI,
10267330f729Sjoerg                                                     FeatureTBM,
10277330f729Sjoerg                                                     FeatureFMA,
10287330f729Sjoerg                                                     FeatureFastBEXTR];
1029*82d56013Sjoerg  list<SubtargetFeature> BdVer2AdditionalTuning = [FeatureFastMOVBE];
1030*82d56013Sjoerg  list<SubtargetFeature> BdVer2Tuning =
1031*82d56013Sjoerg    !listconcat(BdVer1Tuning, BdVer2AdditionalTuning);
1032*82d56013Sjoerg  list<SubtargetFeature> BdVer2Features =
1033*82d56013Sjoerg    !listconcat(BdVer1Features, BdVer2AdditionalFeatures);
10347330f729Sjoerg
10357330f729Sjoerg  // Steamroller
10367330f729Sjoerg  list<SubtargetFeature> BdVer3AdditionalFeatures = [FeatureXSAVEOPT,
10377330f729Sjoerg                                                     FeatureFSGSBase];
1038*82d56013Sjoerg  list<SubtargetFeature> BdVer3Tuning = BdVer2Tuning;
1039*82d56013Sjoerg  list<SubtargetFeature> BdVer3Features =
1040*82d56013Sjoerg    !listconcat(BdVer2Features, BdVer3AdditionalFeatures);
10417330f729Sjoerg
10427330f729Sjoerg  // Excavator
10437330f729Sjoerg  list<SubtargetFeature> BdVer4AdditionalFeatures = [FeatureAVX2,
10447330f729Sjoerg                                                     FeatureBMI2,
1045*82d56013Sjoerg                                                     FeatureMOVBE,
1046*82d56013Sjoerg                                                     FeatureRDRAND,
10477330f729Sjoerg                                                     FeatureMWAITX];
1048*82d56013Sjoerg  list<SubtargetFeature> BdVer4Tuning = BdVer3Tuning;
1049*82d56013Sjoerg  list<SubtargetFeature> BdVer4Features =
1050*82d56013Sjoerg    !listconcat(BdVer3Features, BdVer4AdditionalFeatures);
10517330f729Sjoerg
10527330f729Sjoerg
10537330f729Sjoerg  // AMD Zen Processors common ISAs
10547330f729Sjoerg  list<SubtargetFeature> ZNFeatures = [FeatureADX,
10557330f729Sjoerg                                       FeatureAES,
10567330f729Sjoerg                                       FeatureAVX2,
10577330f729Sjoerg                                       FeatureBMI,
10587330f729Sjoerg                                       FeatureBMI2,
10597330f729Sjoerg                                       FeatureCLFLUSHOPT,
10607330f729Sjoerg                                       FeatureCLZERO,
10617330f729Sjoerg                                       FeatureCMOV,
10627330f729Sjoerg                                       Feature64Bit,
10637330f729Sjoerg                                       FeatureCMPXCHG16B,
10647330f729Sjoerg                                       FeatureF16C,
10657330f729Sjoerg                                       FeatureFMA,
10667330f729Sjoerg                                       FeatureFSGSBase,
10677330f729Sjoerg                                       FeatureFXSR,
10687330f729Sjoerg                                       FeatureNOPL,
10697330f729Sjoerg                                       FeatureLAHFSAHF,
10707330f729Sjoerg                                       FeatureLZCNT,
10717330f729Sjoerg                                       FeatureMMX,
10727330f729Sjoerg                                       FeatureMOVBE,
10737330f729Sjoerg                                       FeatureMWAITX,
10747330f729Sjoerg                                       FeaturePCLMUL,
10757330f729Sjoerg                                       FeaturePOPCNT,
10767330f729Sjoerg                                       FeaturePRFCHW,
10777330f729Sjoerg                                       FeatureRDRAND,
10787330f729Sjoerg                                       FeatureRDSEED,
10797330f729Sjoerg                                       FeatureSHA,
10807330f729Sjoerg                                       FeatureSSE4A,
10817330f729Sjoerg                                       FeatureX87,
10827330f729Sjoerg                                       FeatureXSAVE,
10837330f729Sjoerg                                       FeatureXSAVEC,
10847330f729Sjoerg                                       FeatureXSAVEOPT,
10857330f729Sjoerg                                       FeatureXSAVES];
1086*82d56013Sjoerg  list<SubtargetFeature> ZNTuning = [FeatureFastLZCNT,
1087*82d56013Sjoerg                                     FeatureFastBEXTR,
1088*82d56013Sjoerg                                     FeatureFast15ByteNOP,
1089*82d56013Sjoerg                                     FeatureBranchFusion,
1090*82d56013Sjoerg                                     FeatureFastScalarShiftMasks,
1091*82d56013Sjoerg                                     FeatureFastMOVBE,
1092*82d56013Sjoerg                                     FeatureSlowSHLD,
1093*82d56013Sjoerg                                     FeatureInsertVZEROUPPER];
10947330f729Sjoerg  list<SubtargetFeature> ZN2AdditionalFeatures = [FeatureCLWB,
10957330f729Sjoerg                                                  FeatureRDPID,
10967330f729Sjoerg                                                  FeatureWBNOINVD];
1097*82d56013Sjoerg  list<SubtargetFeature> ZN2Tuning = ZNTuning;
10987330f729Sjoerg  list<SubtargetFeature> ZN2Features =
10997330f729Sjoerg    !listconcat(ZNFeatures, ZN2AdditionalFeatures);
1100*82d56013Sjoerg  list<SubtargetFeature> ZN3AdditionalFeatures = [FeatureFSRM,
1101*82d56013Sjoerg                                                  FeatureINVPCID,
1102*82d56013Sjoerg                                                  FeaturePKU,
1103*82d56013Sjoerg                                                  FeatureVAES,
1104*82d56013Sjoerg                                                  FeatureVPCLMULQDQ];
1105*82d56013Sjoerg  list<SubtargetFeature> ZN3AdditionalTuning = [FeatureMacroFusion];
1106*82d56013Sjoerg  list<SubtargetFeature> ZN3Tuning =
1107*82d56013Sjoerg    !listconcat(ZNTuning, ZN3AdditionalTuning);
1108*82d56013Sjoerg  list<SubtargetFeature> ZN3Features =
1109*82d56013Sjoerg    !listconcat(ZN2Features, ZN3AdditionalFeatures);
11107330f729Sjoerg}
11117330f729Sjoerg
11127330f729Sjoerg//===----------------------------------------------------------------------===//
11137330f729Sjoerg// X86 processors supported.
11147330f729Sjoerg//===----------------------------------------------------------------------===//
11157330f729Sjoerg
1116*82d56013Sjoergclass Proc<string Name, list<SubtargetFeature> Features,
1117*82d56013Sjoerg           list<SubtargetFeature> TuneFeatures>
1118*82d56013Sjoerg : ProcessorModel<Name, GenericModel, Features, TuneFeatures>;
11197330f729Sjoerg
1120*82d56013Sjoergclass ProcModel<string Name, SchedMachineModel Model,
1121*82d56013Sjoerg                list<SubtargetFeature> Features,
1122*82d56013Sjoerg                list<SubtargetFeature> TuneFeatures>
1123*82d56013Sjoerg : ProcessorModel<Name, Model, Features, TuneFeatures>;
1124*82d56013Sjoerg
1125*82d56013Sjoerg// NOTE: CMPXCHG8B is here for legacy compatibility so that it is only disabled
11267330f729Sjoerg// if i386/i486 is specifically requested.
1127*82d56013Sjoerg// NOTE: 64Bit is here as "generic" is the default llc CPU. The X86Subtarget
1128*82d56013Sjoerg// constructor checks that any CPU used in 64-bit mode has Feature64Bit enabled.
1129*82d56013Sjoerg// It has no effect on code generation.
1130*82d56013Sjoergdef : ProcModel<"generic", SandyBridgeModel,
1131*82d56013Sjoerg                [FeatureX87, FeatureCMPXCHG8B, Feature64Bit],
1132*82d56013Sjoerg                [FeatureSlow3OpsLEA,
1133*82d56013Sjoerg                 FeatureSlowDivide64,
1134*82d56013Sjoerg                 FeatureSlowIncDec,
1135*82d56013Sjoerg                 FeatureMacroFusion,
1136*82d56013Sjoerg                 FeatureInsertVZEROUPPER]>;
11377330f729Sjoerg
1138*82d56013Sjoergdef : Proc<"i386",            [FeatureX87],
1139*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1140*82d56013Sjoergdef : Proc<"i486",            [FeatureX87],
1141*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1142*82d56013Sjoergdef : Proc<"i586",            [FeatureX87, FeatureCMPXCHG8B],
1143*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1144*82d56013Sjoergdef : Proc<"pentium",         [FeatureX87, FeatureCMPXCHG8B],
1145*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1146*82d56013Sjoergdef : Proc<"pentium-mmx",     [FeatureX87, FeatureCMPXCHG8B, FeatureMMX],
1147*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
11487330f729Sjoerg
1149*82d56013Sjoergdef : Proc<"i686", [FeatureX87, FeatureCMPXCHG8B, FeatureCMOV],
1150*82d56013Sjoerg                   [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1151*82d56013Sjoergdef : Proc<"pentiumpro", [FeatureX87, FeatureCMPXCHG8B, FeatureCMOV,
1152*82d56013Sjoerg                          FeatureNOPL],
1153*82d56013Sjoerg                         [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1154*82d56013Sjoerg
1155*82d56013Sjoergdef : Proc<"pentium2", [FeatureX87, FeatureCMPXCHG8B, FeatureMMX, FeatureCMOV,
1156*82d56013Sjoerg                        FeatureFXSR, FeatureNOPL],
1157*82d56013Sjoerg                       [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
11587330f729Sjoerg
11597330f729Sjoergforeach P = ["pentium3", "pentium3m"] in {
1160*82d56013Sjoerg  def : Proc<P, [FeatureX87, FeatureCMPXCHG8B, FeatureMMX,
1161*82d56013Sjoerg                 FeatureSSE1, FeatureFXSR, FeatureNOPL, FeatureCMOV],
1162*82d56013Sjoerg                [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
11637330f729Sjoerg}
11647330f729Sjoerg
11657330f729Sjoerg// Enable the PostRAScheduler for SSE2 and SSE3 class cpus.
11667330f729Sjoerg// The intent is to enable it for pentium4 which is the current default
11677330f729Sjoerg// processor in a vanilla 32-bit clang compilation when no specific
11687330f729Sjoerg// architecture is specified.  This generally gives a nice performance
11697330f729Sjoerg// increase on silvermont, with largely neutral behavior on other
11707330f729Sjoerg// contemporary large core processors.
11717330f729Sjoerg// pentium-m, pentium4m, prescott and nocona are included as a preventative
11727330f729Sjoerg// measure to avoid performance surprises, in case clang's default cpu
11737330f729Sjoerg// changes slightly.
11747330f729Sjoerg
1175*82d56013Sjoergdef : ProcModel<"pentium-m", GenericPostRAModel,
1176*82d56013Sjoerg                [FeatureX87, FeatureCMPXCHG8B, FeatureMMX, FeatureSSE2,
1177*82d56013Sjoerg                FeatureFXSR, FeatureNOPL, FeatureCMOV],
1178*82d56013Sjoerg                [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
11797330f729Sjoerg
11807330f729Sjoergforeach P = ["pentium4", "pentium4m"] in {
1181*82d56013Sjoerg  def : ProcModel<P, GenericPostRAModel,
1182*82d56013Sjoerg                  [FeatureX87, FeatureCMPXCHG8B, FeatureMMX, FeatureSSE2,
1183*82d56013Sjoerg                   FeatureFXSR, FeatureNOPL, FeatureCMOV],
1184*82d56013Sjoerg                  [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
11857330f729Sjoerg}
11867330f729Sjoerg
11877330f729Sjoerg// Intel Quark.
1188*82d56013Sjoergdef : Proc<"lakemont", [FeatureCMPXCHG8B],
1189*82d56013Sjoerg                       [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
11907330f729Sjoerg
11917330f729Sjoerg// Intel Core Duo.
1192*82d56013Sjoergdef : ProcModel<"yonah", SandyBridgeModel,
1193*82d56013Sjoerg                [FeatureX87, FeatureCMPXCHG8B, FeatureMMX, FeatureSSE3,
1194*82d56013Sjoerg                 FeatureFXSR, FeatureNOPL, FeatureCMOV],
1195*82d56013Sjoerg                [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
11967330f729Sjoerg
11977330f729Sjoerg// NetBurst.
1198*82d56013Sjoergdef : ProcModel<"prescott", GenericPostRAModel,
1199*82d56013Sjoerg                [FeatureX87, FeatureCMPXCHG8B, FeatureMMX, FeatureSSE3,
1200*82d56013Sjoerg                 FeatureFXSR, FeatureNOPL, FeatureCMOV],
1201*82d56013Sjoerg                [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1202*82d56013Sjoergdef : ProcModel<"nocona", GenericPostRAModel, [
12037330f729Sjoerg  FeatureX87,
12047330f729Sjoerg  FeatureCMPXCHG8B,
12057330f729Sjoerg  FeatureCMOV,
12067330f729Sjoerg  FeatureMMX,
12077330f729Sjoerg  FeatureSSE3,
12087330f729Sjoerg  FeatureFXSR,
12097330f729Sjoerg  FeatureNOPL,
12107330f729Sjoerg  Feature64Bit,
1211*82d56013Sjoerg  FeatureCMPXCHG16B,
1212*82d56013Sjoerg],
1213*82d56013Sjoerg[
1214*82d56013Sjoerg  FeatureSlowUAMem16,
1215*82d56013Sjoerg  FeatureInsertVZEROUPPER
12167330f729Sjoerg]>;
12177330f729Sjoerg
12187330f729Sjoerg// Intel Core 2 Solo/Duo.
1219*82d56013Sjoergdef : ProcModel<"core2", SandyBridgeModel, [
12207330f729Sjoerg  FeatureX87,
12217330f729Sjoerg  FeatureCMPXCHG8B,
12227330f729Sjoerg  FeatureCMOV,
12237330f729Sjoerg  FeatureMMX,
12247330f729Sjoerg  FeatureSSSE3,
12257330f729Sjoerg  FeatureFXSR,
12267330f729Sjoerg  FeatureNOPL,
12277330f729Sjoerg  Feature64Bit,
12287330f729Sjoerg  FeatureCMPXCHG16B,
1229*82d56013Sjoerg  FeatureLAHFSAHF
1230*82d56013Sjoerg],
1231*82d56013Sjoerg[
1232*82d56013Sjoerg  FeatureMacroFusion,
12337330f729Sjoerg  FeatureSlowUAMem16,
1234*82d56013Sjoerg  FeatureInsertVZEROUPPER
1235*82d56013Sjoerg]>;
1236*82d56013Sjoergdef : ProcModel<"penryn", SandyBridgeModel, [
1237*82d56013Sjoerg  FeatureX87,
12387330f729Sjoerg  FeatureCMPXCHG8B,
12397330f729Sjoerg  FeatureCMOV,
12407330f729Sjoerg  FeatureMMX,
12417330f729Sjoerg  FeatureSSE41,
12427330f729Sjoerg  FeatureFXSR,
12437330f729Sjoerg  FeatureNOPL,
12447330f729Sjoerg  Feature64Bit,
12457330f729Sjoerg  FeatureCMPXCHG16B,
1246*82d56013Sjoerg  FeatureLAHFSAHF
1247*82d56013Sjoerg],
1248*82d56013Sjoerg[
1249*82d56013Sjoerg  FeatureMacroFusion,
1250*82d56013Sjoerg  FeatureSlowUAMem16,
1251*82d56013Sjoerg  FeatureInsertVZEROUPPER
12527330f729Sjoerg]>;
12537330f729Sjoerg
12547330f729Sjoerg// Atom CPUs.
12557330f729Sjoergforeach P = ["bonnell", "atom"] in {
1256*82d56013Sjoerg  def : ProcModel<P, AtomModel, ProcessorFeatures.AtomFeatures,
1257*82d56013Sjoerg                  ProcessorFeatures.AtomTuning>;
12587330f729Sjoerg}
12597330f729Sjoerg
12607330f729Sjoergforeach P = ["silvermont", "slm"] in {
1261*82d56013Sjoerg  def : ProcModel<P, SLMModel, ProcessorFeatures.SLMFeatures,
1262*82d56013Sjoerg                  ProcessorFeatures.SLMTuning>;
12637330f729Sjoerg}
12647330f729Sjoerg
1265*82d56013Sjoergdef : ProcModel<"goldmont", SLMModel, ProcessorFeatures.GLMFeatures,
1266*82d56013Sjoerg                ProcessorFeatures.GLMTuning>;
1267*82d56013Sjoergdef : ProcModel<"goldmont-plus", SLMModel, ProcessorFeatures.GLPFeatures,
1268*82d56013Sjoerg                ProcessorFeatures.GLPTuning>;
1269*82d56013Sjoergdef : ProcModel<"tremont", SLMModel, ProcessorFeatures.TRMFeatures,
1270*82d56013Sjoerg                ProcessorFeatures.TRMTuning>;
12717330f729Sjoerg
12727330f729Sjoerg// "Arrandale" along with corei3 and corei5
12737330f729Sjoergforeach P = ["nehalem", "corei7"] in {
1274*82d56013Sjoerg  def : ProcModel<P, SandyBridgeModel, ProcessorFeatures.NHMFeatures,
1275*82d56013Sjoerg                  ProcessorFeatures.NHMTuning>;
12767330f729Sjoerg}
12777330f729Sjoerg
12787330f729Sjoerg// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
1279*82d56013Sjoergdef : ProcModel<"westmere", SandyBridgeModel, ProcessorFeatures.WSMFeatures,
1280*82d56013Sjoerg                ProcessorFeatures.WSMTuning>;
12817330f729Sjoerg
12827330f729Sjoergforeach P = ["sandybridge", "corei7-avx"] in {
1283*82d56013Sjoerg  def : ProcModel<P, SandyBridgeModel, ProcessorFeatures.SNBFeatures,
1284*82d56013Sjoerg                  ProcessorFeatures.SNBTuning>;
12857330f729Sjoerg}
12867330f729Sjoerg
12877330f729Sjoergforeach P = ["ivybridge", "core-avx-i"] in {
1288*82d56013Sjoerg  def : ProcModel<P, SandyBridgeModel, ProcessorFeatures.IVBFeatures,
1289*82d56013Sjoerg                  ProcessorFeatures.IVBTuning>;
12907330f729Sjoerg}
12917330f729Sjoerg
12927330f729Sjoergforeach P = ["haswell", "core-avx2"] in {
1293*82d56013Sjoerg  def : ProcModel<P, HaswellModel, ProcessorFeatures.HSWFeatures,
1294*82d56013Sjoerg                  ProcessorFeatures.HSWTuning>;
12957330f729Sjoerg}
12967330f729Sjoerg
1297*82d56013Sjoergdef : ProcModel<"broadwell", BroadwellModel, ProcessorFeatures.BDWFeatures,
1298*82d56013Sjoerg                ProcessorFeatures.BDWTuning>;
12997330f729Sjoerg
1300*82d56013Sjoergdef : ProcModel<"skylake", SkylakeClientModel, ProcessorFeatures.SKLFeatures,
1301*82d56013Sjoerg                ProcessorFeatures.SKLTuning>;
13027330f729Sjoerg
13037330f729Sjoerg// FIXME: define KNL scheduler model
1304*82d56013Sjoergdef : ProcModel<"knl", HaswellModel, ProcessorFeatures.KNLFeatures,
1305*82d56013Sjoerg                ProcessorFeatures.KNLTuning>;
1306*82d56013Sjoergdef : ProcModel<"knm", HaswellModel, ProcessorFeatures.KNMFeatures,
1307*82d56013Sjoerg                ProcessorFeatures.KNLTuning>;
13087330f729Sjoerg
13097330f729Sjoergforeach P = ["skylake-avx512", "skx"] in {
1310*82d56013Sjoerg  def : ProcModel<P, SkylakeServerModel, ProcessorFeatures.SKXFeatures,
1311*82d56013Sjoerg                  ProcessorFeatures.SKXTuning>;
13127330f729Sjoerg}
13137330f729Sjoerg
1314*82d56013Sjoergdef : ProcModel<"cascadelake", SkylakeServerModel,
1315*82d56013Sjoerg                ProcessorFeatures.CLXFeatures, ProcessorFeatures.CLXTuning>;
1316*82d56013Sjoergdef : ProcModel<"cooperlake", SkylakeServerModel,
1317*82d56013Sjoerg                ProcessorFeatures.CPXFeatures, ProcessorFeatures.CPXTuning>;
1318*82d56013Sjoergdef : ProcModel<"cannonlake", SkylakeServerModel,
1319*82d56013Sjoerg                ProcessorFeatures.CNLFeatures, ProcessorFeatures.CNLTuning>;
1320*82d56013Sjoergdef : ProcModel<"icelake-client", SkylakeServerModel,
1321*82d56013Sjoerg                ProcessorFeatures.ICLFeatures, ProcessorFeatures.ICLTuning>;
1322*82d56013Sjoergdef : ProcModel<"rocketlake", SkylakeServerModel,
1323*82d56013Sjoerg                ProcessorFeatures.ICLFeatures, ProcessorFeatures.ICLTuning>;
1324*82d56013Sjoergdef : ProcModel<"icelake-server", SkylakeServerModel,
1325*82d56013Sjoerg                ProcessorFeatures.ICXFeatures, ProcessorFeatures.ICXTuning>;
1326*82d56013Sjoergdef : ProcModel<"tigerlake", SkylakeServerModel,
1327*82d56013Sjoerg                ProcessorFeatures.TGLFeatures, ProcessorFeatures.TGLTuning>;
1328*82d56013Sjoergdef : ProcModel<"sapphirerapids", SkylakeServerModel,
1329*82d56013Sjoerg                ProcessorFeatures.SPRFeatures, ProcessorFeatures.SPRTuning>;
1330*82d56013Sjoergdef : ProcModel<"alderlake", SkylakeClientModel,
1331*82d56013Sjoerg                ProcessorFeatures.ADLFeatures, ProcessorFeatures.ADLTuning>;
13327330f729Sjoerg
13337330f729Sjoerg// AMD CPUs.
13347330f729Sjoerg
1335*82d56013Sjoergdef : Proc<"k6",   [FeatureX87, FeatureCMPXCHG8B, FeatureMMX],
1336*82d56013Sjoerg                   [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1337*82d56013Sjoergdef : Proc<"k6-2", [FeatureX87, FeatureCMPXCHG8B, Feature3DNow],
1338*82d56013Sjoerg                   [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1339*82d56013Sjoergdef : Proc<"k6-3", [FeatureX87, FeatureCMPXCHG8B, Feature3DNow],
1340*82d56013Sjoerg                   [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
13417330f729Sjoerg
13427330f729Sjoergforeach P = ["athlon", "athlon-tbird"] in {
1343*82d56013Sjoerg  def : Proc<P, [FeatureX87, FeatureCMPXCHG8B, FeatureCMOV, Feature3DNowA,
1344*82d56013Sjoerg                 FeatureNOPL],
1345*82d56013Sjoerg                [FeatureSlowSHLD, FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
13467330f729Sjoerg}
13477330f729Sjoerg
13487330f729Sjoergforeach P = ["athlon-4", "athlon-xp", "athlon-mp"] in {
1349*82d56013Sjoerg  def : Proc<P, [FeatureX87, FeatureCMPXCHG8B, FeatureCMOV,
1350*82d56013Sjoerg                 FeatureSSE1, Feature3DNowA, FeatureFXSR, FeatureNOPL],
1351*82d56013Sjoerg                [FeatureSlowSHLD, FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
13527330f729Sjoerg}
13537330f729Sjoerg
13547330f729Sjoergforeach P = ["k8", "opteron", "athlon64", "athlon-fx"] in {
1355*82d56013Sjoerg  def : Proc<P, [FeatureX87, FeatureCMPXCHG8B, FeatureSSE2, Feature3DNowA,
1356*82d56013Sjoerg                 FeatureFXSR, FeatureNOPL, Feature64Bit, FeatureCMOV],
1357*82d56013Sjoerg                [FeatureFastScalarShiftMasks, FeatureSlowSHLD, FeatureSlowUAMem16,
1358*82d56013Sjoerg                 FeatureInsertVZEROUPPER]>;
13597330f729Sjoerg}
13607330f729Sjoerg
13617330f729Sjoergforeach P = ["k8-sse3", "opteron-sse3", "athlon64-sse3"] in {
1362*82d56013Sjoerg  def : Proc<P, [FeatureX87, FeatureCMPXCHG8B, FeatureSSE3, Feature3DNowA,
1363*82d56013Sjoerg                 FeatureFXSR, FeatureNOPL, FeatureCMPXCHG16B, FeatureCMOV,
1364*82d56013Sjoerg                 Feature64Bit],
1365*82d56013Sjoerg                [FeatureFastScalarShiftMasks, FeatureSlowSHLD, FeatureSlowUAMem16,
1366*82d56013Sjoerg                 FeatureInsertVZEROUPPER]>;
13677330f729Sjoerg}
13687330f729Sjoerg
13697330f729Sjoergforeach P = ["amdfam10", "barcelona"] in {
1370*82d56013Sjoerg  def : Proc<P, ProcessorFeatures.BarcelonaFeatures,
1371*82d56013Sjoerg             ProcessorFeatures.BarcelonaTuning>;
13727330f729Sjoerg}
13737330f729Sjoerg
13747330f729Sjoerg// Bobcat
1375*82d56013Sjoergdef : Proc<"btver1", ProcessorFeatures.BtVer1Features,
1376*82d56013Sjoerg           ProcessorFeatures.BtVer1Tuning>;
13777330f729Sjoerg// Jaguar
1378*82d56013Sjoergdef : ProcModel<"btver2", BtVer2Model, ProcessorFeatures.BtVer2Features,
1379*82d56013Sjoerg                ProcessorFeatures.BtVer2Tuning>;
13807330f729Sjoerg
13817330f729Sjoerg// Bulldozer
1382*82d56013Sjoergdef : ProcModel<"bdver1", BdVer2Model, ProcessorFeatures.BdVer1Features,
1383*82d56013Sjoerg                ProcessorFeatures.BdVer1Tuning>;
13847330f729Sjoerg// Piledriver
1385*82d56013Sjoergdef : ProcModel<"bdver2", BdVer2Model, ProcessorFeatures.BdVer2Features,
1386*82d56013Sjoerg                ProcessorFeatures.BdVer2Tuning>;
13877330f729Sjoerg// Steamroller
1388*82d56013Sjoergdef : Proc<"bdver3", ProcessorFeatures.BdVer3Features,
1389*82d56013Sjoerg           ProcessorFeatures.BdVer3Tuning>;
13907330f729Sjoerg// Excavator
1391*82d56013Sjoergdef : Proc<"bdver4", ProcessorFeatures.BdVer4Features,
1392*82d56013Sjoerg           ProcessorFeatures.BdVer4Tuning>;
13937330f729Sjoerg
1394*82d56013Sjoergdef : ProcModel<"znver1", Znver1Model, ProcessorFeatures.ZNFeatures,
1395*82d56013Sjoerg                ProcessorFeatures.ZNTuning>;
1396*82d56013Sjoergdef : ProcModel<"znver2", Znver2Model, ProcessorFeatures.ZN2Features,
1397*82d56013Sjoerg                ProcessorFeatures.ZN2Tuning>;
1398*82d56013Sjoergdef : ProcModel<"znver3", Znver3Model, ProcessorFeatures.ZN3Features,
1399*82d56013Sjoerg                ProcessorFeatures.ZN3Tuning>;
14007330f729Sjoerg
1401*82d56013Sjoergdef : Proc<"geode",           [FeatureX87, FeatureCMPXCHG8B, Feature3DNowA],
1402*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
14037330f729Sjoerg
1404*82d56013Sjoergdef : Proc<"winchip-c6",      [FeatureX87, FeatureMMX],
1405*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1406*82d56013Sjoergdef : Proc<"winchip2",        [FeatureX87, Feature3DNow],
1407*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1408*82d56013Sjoergdef : Proc<"c3",              [FeatureX87, Feature3DNow],
1409*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
1410*82d56013Sjoergdef : Proc<"c3-2",            [FeatureX87, FeatureCMPXCHG8B, FeatureMMX,
1411*82d56013Sjoerg                               FeatureSSE1, FeatureFXSR, FeatureCMOV],
1412*82d56013Sjoerg                              [FeatureSlowUAMem16, FeatureInsertVZEROUPPER]>;
14137330f729Sjoerg
14147330f729Sjoerg// We also provide a generic 64-bit specific x86 processor model which tries to
14157330f729Sjoerg// be good for modern chips without enabling instruction set encodings past the
14167330f729Sjoerg// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
14177330f729Sjoerg// modern 64-bit x86 chip, and enables features that are generally beneficial.
14187330f729Sjoerg//
14197330f729Sjoerg// We currently use the Sandy Bridge model as the default scheduling model as
14207330f729Sjoerg// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
14217330f729Sjoerg// covers a huge swath of x86 processors. If there are specific scheduling
14227330f729Sjoerg// knobs which need to be tuned differently for AMD chips, we might consider
14237330f729Sjoerg// forming a common base for them.
1424*82d56013Sjoergdef : ProcModel<"x86-64", SandyBridgeModel, ProcessorFeatures.X86_64V1Features,
1425*82d56013Sjoerg[
14267330f729Sjoerg  FeatureSlow3OpsLEA,
1427*82d56013Sjoerg  FeatureSlowDivide64,
14287330f729Sjoerg  FeatureSlowIncDec,
1429*82d56013Sjoerg  FeatureMacroFusion,
1430*82d56013Sjoerg  FeatureInsertVZEROUPPER
14317330f729Sjoerg]>;
14327330f729Sjoerg
1433*82d56013Sjoerg// x86-64 micro-architecture levels.
1434*82d56013Sjoergdef : ProcModel<"x86-64-v2", SandyBridgeModel, ProcessorFeatures.X86_64V2Features,
1435*82d56013Sjoerg                ProcessorFeatures.SNBTuning>;
1436*82d56013Sjoerg// Close to Haswell.
1437*82d56013Sjoergdef : ProcModel<"x86-64-v3", HaswellModel, ProcessorFeatures.X86_64V3Features,
1438*82d56013Sjoerg                ProcessorFeatures.HSWTuning>;
1439*82d56013Sjoerg// Close to the AVX-512 level implemented by Xeon Scalable Processors.
1440*82d56013Sjoergdef : ProcModel<"x86-64-v4", SkylakeServerModel, ProcessorFeatures.X86_64V4Features,
1441*82d56013Sjoerg                ProcessorFeatures.SKXTuning>;
1442*82d56013Sjoerg
14437330f729Sjoerg//===----------------------------------------------------------------------===//
14447330f729Sjoerg// Calling Conventions
14457330f729Sjoerg//===----------------------------------------------------------------------===//
14467330f729Sjoerg
14477330f729Sjoerginclude "X86CallingConv.td"
14487330f729Sjoerg
14497330f729Sjoerg
14507330f729Sjoerg//===----------------------------------------------------------------------===//
14517330f729Sjoerg// Assembly Parser
14527330f729Sjoerg//===----------------------------------------------------------------------===//
14537330f729Sjoerg
14547330f729Sjoergdef ATTAsmParserVariant : AsmParserVariant {
14557330f729Sjoerg  int Variant = 0;
14567330f729Sjoerg
14577330f729Sjoerg  // Variant name.
14587330f729Sjoerg  string Name = "att";
14597330f729Sjoerg
14607330f729Sjoerg  // Discard comments in assembly strings.
14617330f729Sjoerg  string CommentDelimiter = "#";
14627330f729Sjoerg
14637330f729Sjoerg  // Recognize hard coded registers.
14647330f729Sjoerg  string RegisterPrefix = "%";
14657330f729Sjoerg}
14667330f729Sjoerg
14677330f729Sjoergdef IntelAsmParserVariant : AsmParserVariant {
14687330f729Sjoerg  int Variant = 1;
14697330f729Sjoerg
14707330f729Sjoerg  // Variant name.
14717330f729Sjoerg  string Name = "intel";
14727330f729Sjoerg
14737330f729Sjoerg  // Discard comments in assembly strings.
14747330f729Sjoerg  string CommentDelimiter = ";";
14757330f729Sjoerg
14767330f729Sjoerg  // Recognize hard coded registers.
14777330f729Sjoerg  string RegisterPrefix = "";
14787330f729Sjoerg}
14797330f729Sjoerg
14807330f729Sjoerg//===----------------------------------------------------------------------===//
14817330f729Sjoerg// Assembly Printers
14827330f729Sjoerg//===----------------------------------------------------------------------===//
14837330f729Sjoerg
14847330f729Sjoerg// The X86 target supports two different syntaxes for emitting machine code.
14857330f729Sjoerg// This is controlled by the -x86-asm-syntax={att|intel}
14867330f729Sjoergdef ATTAsmWriter : AsmWriter {
14877330f729Sjoerg  string AsmWriterClassName  = "ATTInstPrinter";
14887330f729Sjoerg  int Variant = 0;
14897330f729Sjoerg}
14907330f729Sjoergdef IntelAsmWriter : AsmWriter {
14917330f729Sjoerg  string AsmWriterClassName  = "IntelInstPrinter";
14927330f729Sjoerg  int Variant = 1;
14937330f729Sjoerg}
14947330f729Sjoerg
14957330f729Sjoergdef X86 : Target {
14967330f729Sjoerg  // Information about the instructions...
14977330f729Sjoerg  let InstructionSet = X86InstrInfo;
14987330f729Sjoerg  let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
14997330f729Sjoerg  let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
15007330f729Sjoerg  let AllowRegisterRenaming = 1;
15017330f729Sjoerg}
15027330f729Sjoerg
15037330f729Sjoerg//===----------------------------------------------------------------------===//
15047330f729Sjoerg// Pfm Counters
15057330f729Sjoerg//===----------------------------------------------------------------------===//
15067330f729Sjoerg
15077330f729Sjoerginclude "X86PfmCounters.td"
1508