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