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