blob: fe105298f5c19ac3743b3bb6b9e824dbd2936b3d [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- X86.td - Target definition file for the Intel X86 --*- tablegen -*-===//
Michael J. Spencerb88784c2011-04-14 14:33:36 +00002//
John Criswell29265fe2003-10-21 15:17:13 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Michael J. Spencerb88784c2011-04-14 14:33:36 +00007//
John Criswell29265fe2003-10-21 15:17:13 +00008//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +00009//
Craig Topper271064e2011-10-11 06:44:02 +000010// This is a target description file for the Intel i386 architecture, referred
11// to here as the "X86" architecture.
Chris Lattner5da8e802003-08-03 15:47:49 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner25510802003-08-04 04:59:56 +000015// Get the target-independent interfaces which we are implementing...
Chris Lattner5da8e802003-08-03 15:47:49 +000016//
Evan Cheng977e7be2008-11-24 07:34:46 +000017include "llvm/Target/Target.td"
Chris Lattner5da8e802003-08-03 15:47:49 +000018
19//===----------------------------------------------------------------------===//
Anitha Boyapati426feb62012-08-16 03:50:04 +000020// X86 Subtarget state
Evan Cheng13bcc6c2011-07-07 21:06:52 +000021//
22
23def Mode64Bit : SubtargetFeature<"64bit-mode", "In64BitMode", "true",
24 "64-bit mode (x86_64)">;
Craig Topper3c80d622014-01-06 04:55:54 +000025def Mode32Bit : SubtargetFeature<"32bit-mode", "In32BitMode", "true",
26 "32-bit mode (80386)">;
27def Mode16Bit : SubtargetFeature<"16bit-mode", "In16BitMode", "true",
28 "16-bit mode (i8086)">;
Evan Cheng13bcc6c2011-07-07 21:06:52 +000029
30//===----------------------------------------------------------------------===//
Anitha Boyapati426feb62012-08-16 03:50:04 +000031// X86 Subtarget features
Bill Wendlinge6182262007-05-04 20:38:40 +000032//===----------------------------------------------------------------------===//
Chris Lattnercc8c5812009-09-02 05:53:04 +000033
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +000034def FeatureX87 : SubtargetFeature<"x87","HasX87", "true",
35 "Enable X87 float instructions">;
36
Chris Lattnercc8c5812009-09-02 05:53:04 +000037def FeatureCMOV : SubtargetFeature<"cmov","HasCMov", "true",
38 "Enable conditional move instructions">;
39
Benjamin Kramer2f489232010-12-04 20:32:23 +000040def FeaturePOPCNT : SubtargetFeature<"popcnt", "HasPOPCNT", "true",
41 "Support POPCNT instruction">;
42
Craig Topper09b65982015-10-16 06:03:09 +000043def FeatureFXSR : SubtargetFeature<"fxsr", "HasFXSR", "true",
44 "Support fxsave/fxrestore instructions">;
45
Amjad Aboud1db6d7a2015-10-12 11:47:46 +000046def FeatureXSAVE : SubtargetFeature<"xsave", "HasXSAVE", "true",
47 "Support xsave instructions">;
48
49def FeatureXSAVEOPT: SubtargetFeature<"xsaveopt", "HasXSAVEOPT", "true",
50 "Support xsaveopt instructions">;
51
52def FeatureXSAVEC : SubtargetFeature<"xsavec", "HasXSAVEC", "true",
53 "Support xsavec instructions">;
54
55def FeatureXSAVES : SubtargetFeature<"xsaves", "HasXSAVES", "true",
56 "Support xsaves instructions">;
57
Bill Wendlinge6182262007-05-04 20:38:40 +000058def FeatureSSE1 : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
59 "Enable SSE instructions",
Chris Lattnercc8c5812009-09-02 05:53:04 +000060 // SSE codegen depends on cmovs, and all
Michael J. Spencerb88784c2011-04-14 14:33:36 +000061 // SSE1+ processors support them.
Eric Christopher11e59832015-10-08 20:10:06 +000062 [FeatureCMOV]>;
Bill Wendlinge6182262007-05-04 20:38:40 +000063def FeatureSSE2 : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
64 "Enable SSE2 instructions",
65 [FeatureSSE1]>;
66def FeatureSSE3 : SubtargetFeature<"sse3", "X86SSELevel", "SSE3",
67 "Enable SSE3 instructions",
68 [FeatureSSE2]>;
69def FeatureSSSE3 : SubtargetFeature<"ssse3", "X86SSELevel", "SSSE3",
70 "Enable SSSE3 instructions",
71 [FeatureSSE3]>;
Rafael Espindola94a2c562013-08-23 20:21:34 +000072def FeatureSSE41 : SubtargetFeature<"sse4.1", "X86SSELevel", "SSE41",
Nate Begemane14fdfa2008-02-03 07:18:54 +000073 "Enable SSE 4.1 instructions",
74 [FeatureSSSE3]>;
Rafael Espindola94a2c562013-08-23 20:21:34 +000075def FeatureSSE42 : SubtargetFeature<"sse4.2", "X86SSELevel", "SSE42",
Nate Begemane14fdfa2008-02-03 07:18:54 +000076 "Enable SSE 4.2 instructions",
Craig Topper7bd33052011-12-29 15:51:45 +000077 [FeatureSSE41]>;
Eric Christopher57a6e132015-11-14 03:04:00 +000078// The MMX subtarget feature is separate from the rest of the SSE features
79// because it's important (for odd compatibility reasons) to be able to
80// turn it off explicitly while allowing SSE+ to be on.
81def FeatureMMX : SubtargetFeature<"mmx","X863DNowLevel", "MMX",
82 "Enable MMX instructions">;
Bill Wendlinge6182262007-05-04 20:38:40 +000083def Feature3DNow : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow",
Michael J. Spencer30088ba2011-04-15 00:32:41 +000084 "Enable 3DNow! instructions",
85 [FeatureMMX]>;
Bill Wendlinge6182262007-05-04 20:38:40 +000086def Feature3DNowA : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA",
Bill Wendlingf985c492007-05-06 07:56:19 +000087 "Enable 3DNow! Athlon instructions",
88 [Feature3DNow]>;
Dan Gohman74037512009-02-03 00:04:43 +000089// All x86-64 hardware has SSE2, but we don't mark SSE2 as an implied
90// feature, because SSE2 can be disabled (e.g. for compiling OS kernels)
91// without disabling 64-bit mode.
Bill Wendlingf985c492007-05-06 07:56:19 +000092def Feature64Bit : SubtargetFeature<"64bit", "HasX86_64", "true",
Chris Lattner77f7dba2010-03-14 22:24:34 +000093 "Support 64-bit instructions",
94 [FeatureCMOV]>;
Nick Lewycky3be42b82013-10-05 20:11:44 +000095def FeatureCMPXCHG16B : SubtargetFeature<"cx16", "HasCmpxchg16b", "true",
Eli Friedman5e570422011-08-26 21:21:21 +000096 "64-bit with cmpxchg16b",
97 [Feature64Bit]>;
Evan Cheng4c91aa32009-01-02 05:35:45 +000098def FeatureSlowBTMem : SubtargetFeature<"slow-bt-mem", "IsBTMemSlow", "true",
99 "Bit testing of memory is slow">;
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000100def FeatureSlowSHLD : SubtargetFeature<"slow-shld", "IsSHLDSlow", "true",
101 "SHLD instruction is slow">;
Zvi Rackover8bc7e4d2016-12-06 19:35:20 +0000102def FeatureSlowPMULLD : SubtargetFeature<"slow-pmulld", "IsPMULLDSlow", "true",
103 "PMULLD instruction is slow">;
Sanjay Patel30145672015-09-01 20:51:51 +0000104// FIXME: This should not apply to CPUs that do not have SSE.
105def FeatureSlowUAMem16 : SubtargetFeature<"slow-unaligned-mem-16",
106 "IsUAMem16Slow", "true",
107 "Slow unaligned 16-byte memory access">;
Sanjay Patel501890e2014-11-21 17:40:04 +0000108def FeatureSlowUAMem32 : SubtargetFeature<"slow-unaligned-mem-32",
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000109 "IsUAMem32Slow", "true",
110 "Slow unaligned 32-byte memory access">;
Stefanus Du Toit96180b52009-05-26 21:04:35 +0000111def FeatureSSE4A : SubtargetFeature<"sse4a", "HasSSE4A", "true",
Craig Toppera5d1fc22011-12-30 07:16:00 +0000112 "Support SSE 4a instructions",
113 [FeatureSSE3]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000114
Craig Topperf287a452012-01-09 09:02:13 +0000115def FeatureAVX : SubtargetFeature<"avx", "X86SSELevel", "AVX",
116 "Enable AVX instructions",
117 [FeatureSSE42]>;
118def FeatureAVX2 : SubtargetFeature<"avx2", "X86SSELevel", "AVX2",
Craig Topper228d9132011-10-30 19:57:21 +0000119 "Enable AVX2 instructions",
120 [FeatureAVX]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000121def FeatureAVX512 : SubtargetFeature<"avx512f", "X86SSELevel", "AVX512F",
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000122 "Enable AVX-512 instructions",
123 [FeatureAVX2]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000124def FeatureERI : SubtargetFeature<"avx512er", "HasERI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000125 "Enable AVX-512 Exponential and Reciprocal Instructions",
126 [FeatureAVX512]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000127def FeatureCDI : SubtargetFeature<"avx512cd", "HasCDI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000128 "Enable AVX-512 Conflict Detection Instructions",
129 [FeatureAVX512]>;
Oren Ben Simhon7bf27f02017-05-25 13:45:23 +0000130def FeatureVPOPCNTDQ : SubtargetFeature<"avx512vpopcntdq", "HasVPOPCNTDQ",
131 "true", "Enable AVX-512 Population Count Instructions",
132 [FeatureAVX512]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000133def FeaturePFI : SubtargetFeature<"avx512pf", "HasPFI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000134 "Enable AVX-512 PreFetch Instructions",
135 [FeatureAVX512]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000136def FeaturePREFETCHWT1 : SubtargetFeature<"prefetchwt1", "HasPFPREFETCHWT1",
137 "true",
138 "Prefetch with Intent to Write and T1 Hint">;
Robert Khasanovbfa01312014-07-21 14:54:21 +0000139def FeatureDQI : SubtargetFeature<"avx512dq", "HasDQI", "true",
140 "Enable AVX-512 Doubleword and Quadword Instructions",
141 [FeatureAVX512]>;
142def FeatureBWI : SubtargetFeature<"avx512bw", "HasBWI", "true",
143 "Enable AVX-512 Byte and Word Instructions",
144 [FeatureAVX512]>;
145def FeatureVLX : SubtargetFeature<"avx512vl", "HasVLX", "true",
146 "Enable AVX-512 Vector Length eXtensions",
147 [FeatureAVX512]>;
Michael Zuckerman97b6a6922016-01-17 13:42:12 +0000148def FeatureVBMI : SubtargetFeature<"avx512vbmi", "HasVBMI", "true",
Craig Topper5c842be2016-11-09 04:50:48 +0000149 "Enable AVX-512 Vector Byte Manipulation Instructions",
150 [FeatureBWI]>;
Craig Topper3bb3f732016-02-08 01:23:15 +0000151def FeatureIFMA : SubtargetFeature<"avx512ifma", "HasIFMA", "true",
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000152 "Enable AVX-512 Integer Fused Multiple-Add",
153 [FeatureAVX512]>;
Asaf Badouh5acf66f2015-12-15 13:35:29 +0000154def FeaturePKU : SubtargetFeature<"pku", "HasPKU", "true",
155 "Enable protection keys">;
Benjamin Kramera0396e42012-05-31 14:34:17 +0000156def FeaturePCLMUL : SubtargetFeature<"pclmul", "HasPCLMUL", "true",
157 "Enable packed carry-less multiplication instructions",
Craig Topper29dd1482012-05-01 05:28:32 +0000158 [FeatureSSE2]>;
Craig Topper79dbb0c2012-06-03 18:58:46 +0000159def FeatureFMA : SubtargetFeature<"fma", "HasFMA", "true",
Craig Toppere1bd0512011-12-29 19:46:19 +0000160 "Enable three-operand fused multiple-add",
161 [FeatureAVX]>;
David Greene8f6f72c2009-06-26 22:46:54 +0000162def FeatureFMA4 : SubtargetFeature<"fma4", "HasFMA4", "true",
Craig Toppera5d1fc22011-12-30 07:16:00 +0000163 "Enable four-operand fused multiple-add",
Craig Topperbae0e9e2012-05-01 06:54:48 +0000164 [FeatureAVX, FeatureSSE4A]>;
Craig Toppera5d1fc22011-12-30 07:16:00 +0000165def FeatureXOP : SubtargetFeature<"xop", "HasXOP", "true",
Craig Topper43518cc2012-05-01 05:41:41 +0000166 "Enable XOP instructions",
Anitha Boyapatiaf3e9832012-08-16 04:04:02 +0000167 [FeatureFMA4]>;
Sanjay Patelffd039b2015-02-03 17:13:04 +0000168def FeatureSSEUnalignedMem : SubtargetFeature<"sse-unaligned-mem",
169 "HasSSEUnalignedMem", "true",
170 "Allow unaligned memory operands with SSE instructions">;
Eric Christopher2ef63182010-04-02 21:54:27 +0000171def FeatureAES : SubtargetFeature<"aes", "HasAES", "true",
Craig Topper29dd1482012-05-01 05:28:32 +0000172 "Enable AES instructions",
173 [FeatureSSE2]>;
Yunzhong Gaodd36e932013-09-24 18:21:52 +0000174def FeatureTBM : SubtargetFeature<"tbm", "HasTBM", "true",
175 "Enable TBM instructions">;
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000176def FeatureLWP : SubtargetFeature<"lwp", "HasLWP", "true",
177 "Enable LWP instructions">;
Craig Topper786bdb92011-10-03 17:28:23 +0000178def FeatureMOVBE : SubtargetFeature<"movbe", "HasMOVBE", "true",
179 "Support MOVBE instruction">;
Rafael Espindola94a2c562013-08-23 20:21:34 +0000180def FeatureRDRAND : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
Craig Topper786bdb92011-10-03 17:28:23 +0000181 "Support RDRAND instruction">;
Craig Topperfe9179f2011-10-09 07:31:39 +0000182def FeatureF16C : SubtargetFeature<"f16c", "HasF16C", "true",
Craig Toppera6d204e2013-09-16 04:29:58 +0000183 "Support 16-bit floating point conversion instructions",
184 [FeatureAVX]>;
Craig Topper228d9132011-10-30 19:57:21 +0000185def FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
186 "Support FS/GS Base instructions">;
Craig Topper271064e2011-10-11 06:44:02 +0000187def FeatureLZCNT : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
188 "Support LZCNT instruction">;
Craig Topper3657fe42011-10-14 03:21:46 +0000189def FeatureBMI : SubtargetFeature<"bmi", "HasBMI", "true",
190 "Support BMI instructions">;
Craig Topperaea148c2011-10-16 07:55:05 +0000191def FeatureBMI2 : SubtargetFeature<"bmi2", "HasBMI2", "true",
192 "Support BMI2 instructions">;
Michael Liao73cffdd2012-11-08 07:28:54 +0000193def FeatureRTM : SubtargetFeature<"rtm", "HasRTM", "true",
194 "Support RTM instructions">;
Kay Tiong Khoof809c642013-02-14 19:08:21 +0000195def FeatureADX : SubtargetFeature<"adx", "HasADX", "true",
196 "Support ADX instructions">;
Ben Langmuir16501752013-09-12 15:51:31 +0000197def FeatureSHA : SubtargetFeature<"sha", "HasSHA", "true",
198 "Enable SHA instructions",
199 [FeatureSSE2]>;
Michael Liao5173ee02013-03-26 17:47:11 +0000200def FeaturePRFCHW : SubtargetFeature<"prfchw", "HasPRFCHW", "true",
201 "Support PRFCHW instructions">;
Michael Liaoa486a112013-03-28 23:41:26 +0000202def FeatureRDSEED : SubtargetFeature<"rdseed", "HasRDSEED", "true",
203 "Support RDSEED instruction">;
Hans Wennborg5000ce82015-12-04 23:00:33 +0000204def FeatureLAHFSAHF : SubtargetFeature<"sahf", "HasLAHFSAHF", "true",
205 "Support LAHF and SAHF instructions">;
Ashutosh Nema348af9c2016-05-18 11:59:12 +0000206def FeatureMWAITX : SubtargetFeature<"mwaitx", "HasMWAITX", "true",
207 "Enable MONITORX/MWAITX timer functionality">;
Craig Topper50f3d142017-02-09 04:27:34 +0000208def FeatureCLZERO : SubtargetFeature<"clzero", "HasCLZERO", "true",
209 "Enable Cache Line Zero">;
Elena Demikhovskyf7e641c2015-06-03 10:30:57 +0000210def FeatureMPX : SubtargetFeature<"mpx", "HasMPX", "true",
211 "Support MPX instructions">;
Sanjay Patel53d1d8b2015-10-12 15:24:01 +0000212def FeatureLEAForSP : SubtargetFeature<"lea-sp", "UseLeaForSP", "true",
Evan Cheng1b81fdd2012-02-07 22:50:41 +0000213 "Use LEA for adjusting the stack pointer">;
Alexey Volkovfd1731d2014-11-21 11:19:34 +0000214def FeatureSlowDivide32 : SubtargetFeature<"idivl-to-divb",
215 "HasSlowDivide32", "true",
216 "Use 8-bit divide for positive values less than 256">;
Nikolai Bozhenov6bdf92c2017-01-12 19:34:15 +0000217def FeatureSlowDivide64 : SubtargetFeature<"idivq-to-divl",
Alexey Volkovfd1731d2014-11-21 11:19:34 +0000218 "HasSlowDivide64", "true",
Nikolai Bozhenov6bdf92c2017-01-12 19:34:15 +0000219 "Use 32-bit divide for positive values less than 2^32">;
Preston Gurda01daac2013-01-08 18:27:24 +0000220def FeaturePadShortFunctions : SubtargetFeature<"pad-short-functions",
221 "PadShortFunctions", "true",
222 "Pad short functions">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000223def FeatureSGX : SubtargetFeature<"sgx", "HasSGX", "true",
224 "Enable Software Guard Extensions">;
225def FeatureCLFLUSHOPT : SubtargetFeature<"clflushopt", "HasCLFLUSHOPT", "true",
226 "Flush A Cache Line Optimized">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000227def FeatureCLWB : SubtargetFeature<"clwb", "HasCLWB", "true",
228 "Cache Line Write Back">;
Michael Kuperstein454d1452015-07-23 12:23:45 +0000229// TODO: This feature ought to be renamed.
Sean Silvae1c6b542015-07-27 00:46:59 +0000230// What it really refers to are CPUs for which certain instructions
231// (which ones besides the example below?) are microcoded.
Michael Kuperstein454d1452015-07-23 12:23:45 +0000232// The best examples of this are the memory forms of CALL and PUSH
233// instructions, which should be avoided in favor of a MOV + register CALL/PUSH.
Preston Gurd663e6f92013-03-27 19:14:02 +0000234def FeatureCallRegIndirect : SubtargetFeature<"call-reg-indirect",
235 "CallRegIndirect", "true",
236 "Call register indirect">;
Preston Gurd8b7ab4b2013-04-25 20:29:37 +0000237def FeatureLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LEAUsesAG", "true",
238 "LEA instruction needs inputs at AG stage">;
Alexey Volkov6226de62014-05-20 08:55:50 +0000239def FeatureSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
240 "LEA instruction with certain arguments is slow">;
Lama Saba2ea271b2017-05-18 08:11:50 +0000241def FeatureSlow3OpsLEA : SubtargetFeature<"slow-3ops-lea", "Slow3OpsLEA", "true",
242 "LEA instruction with 3 ops or certain registers is slow">;
Alexey Volkov5260dba2014-06-09 11:40:41 +0000243def FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
244 "INC and DEC instructions are slower than ADD and SUB">;
Eric Christopher824f42f2015-05-12 01:26:05 +0000245def FeatureSoftFloat
246 : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
247 "Use software floating point features.">;
Amjad Aboud4f977512017-03-03 09:03:24 +0000248// On some X86 processors, there is no performance hazard to writing only the
249// lower parts of a YMM or ZMM register without clearing the upper part.
250def FeatureFastPartialYMMorZMMWrite
251 : SubtargetFeature<"fast-partial-ymm-or-zmm-write",
252 "HasFastPartialYMMorZMMWrite",
253 "true", "Partial writes to YMM/ZMM registers are fast">;
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000254// FeatureFastScalarFSQRT should be enabled if scalar FSQRT has shorter latency
255// than the corresponding NR code. FeatureFastVectorFSQRT should be enabled if
256// vector FSQRT has higher throughput than the corresponding NR code.
257// The idea is that throughput bound code is likely to be vectorized, so for
258// vectorized code we should care about the throughput of SQRT operations.
259// But if the code is scalar that probably means that the code has some kind of
260// dependency and we should care more about reducing the latency.
261def FeatureFastScalarFSQRT
262 : SubtargetFeature<"fast-scalar-fsqrt", "HasFastScalarFSQRT",
263 "true", "Scalar SQRT is fast (disable Newton-Raphson)">;
264def FeatureFastVectorFSQRT
265 : SubtargetFeature<"fast-vector-fsqrt", "HasFastVectorFSQRT",
266 "true", "Vector SQRT is fast (disable Newton-Raphson)">;
Pierre Gousseaub6d652a2016-10-14 16:41:38 +0000267// If lzcnt has equivalent latency/throughput to most simple integer ops, it can
268// be used to replace test/set sequences.
269def FeatureFastLZCNT
270 : SubtargetFeature<
271 "fast-lzcnt", "HasFastLZCNT", "true",
272 "LZCNT instructions are as fast as most simple integer ops">;
David Greene8f6f72c2009-06-26 22:46:54 +0000273
Craig Topperd88389a2017-02-21 06:39:13 +0000274
275// Sandy Bridge and newer processors can use SHLD with the same source on both
276// inputs to implement rotate to avoid the partial flag update of the normal
277// rotate instructions.
278def FeatureFastSHLDRotate
279 : SubtargetFeature<
280 "fast-shld-rotate", "HasFastSHLDRotate", "true",
281 "SHLD can be used as a faster rotate">;
282
Clement Courbet203fc172017-04-21 09:20:50 +0000283// Ivy Bridge and newer processors have enhanced REP MOVSB and STOSB (aka
284// "string operations"). See "REP String Enhancement" in the Intel Software
Clement Courbet41b43332017-04-21 09:21:05 +0000285// Development Manual. This feature essentially means that REP MOVSB will copy
Clement Courbet203fc172017-04-21 09:20:50 +0000286// using the largest available size instead of copying bytes one by one, making
287// it at least as fast as REPMOVS{W,D,Q}.
288def FeatureERMSB
Clement Courbet1ce3b822017-04-21 09:20:39 +0000289 : SubtargetFeature<
Clement Courbet203fc172017-04-21 09:20:50 +0000290 "ermsb", "HasERMSB", "true",
Clement Courbet1ce3b822017-04-21 09:20:39 +0000291 "REP MOVS/STOS are fast">;
292
Evan Chengff1beda2006-10-06 09:17:41 +0000293//===----------------------------------------------------------------------===//
294// X86 processors supported.
295//===----------------------------------------------------------------------===//
296
Andrew Trick8523b162012-02-01 23:20:51 +0000297include "X86Schedule.td"
298
299def ProcIntelAtom : SubtargetFeature<"atom", "X86ProcFamily", "IntelAtom",
300 "Intel Atom processors">;
Preston Gurd3fe264d2013-09-13 19:23:28 +0000301def ProcIntelSLM : SubtargetFeature<"slm", "X86ProcFamily", "IntelSLM",
302 "Intel Silvermont processors">;
Andrew Trick8523b162012-02-01 23:20:51 +0000303
Evan Chengff1beda2006-10-06 09:17:41 +0000304class Proc<string Name, list<SubtargetFeature> Features>
Andrew Trick87255e32012-07-07 04:00:00 +0000305 : ProcessorModel<Name, GenericModel, Features>;
Andrew Trick8523b162012-02-01 23:20:51 +0000306
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000307def : Proc<"generic", [FeatureX87, FeatureSlowUAMem16]>;
308def : Proc<"i386", [FeatureX87, FeatureSlowUAMem16]>;
309def : Proc<"i486", [FeatureX87, FeatureSlowUAMem16]>;
310def : Proc<"i586", [FeatureX87, FeatureSlowUAMem16]>;
311def : Proc<"pentium", [FeatureX87, FeatureSlowUAMem16]>;
312def : Proc<"pentium-mmx", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
313def : Proc<"i686", [FeatureX87, FeatureSlowUAMem16]>;
314def : Proc<"pentiumpro", [FeatureX87, FeatureSlowUAMem16, FeatureCMOV]>;
315def : Proc<"pentium2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
316 FeatureCMOV, FeatureFXSR]>;
317def : Proc<"pentium3", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
318 FeatureSSE1, FeatureFXSR]>;
319def : Proc<"pentium3m", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
320 FeatureSSE1, FeatureFXSR, FeatureSlowBTMem]>;
Mitch Bodarte60465d2016-04-27 22:52:35 +0000321
322// Enable the PostRAScheduler for SSE2 and SSE3 class cpus.
323// The intent is to enable it for pentium4 which is the current default
324// processor in a vanilla 32-bit clang compilation when no specific
325// architecture is specified. This generally gives a nice performance
326// increase on silvermont, with largely neutral behavior on other
327// contemporary large core processors.
328// pentium-m, pentium4m, prescott and nocona are included as a preventative
329// measure to avoid performance surprises, in case clang's default cpu
330// changes slightly.
331
332def : ProcessorModel<"pentium-m", GenericPostRAModel,
333 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
334 FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
335
336def : ProcessorModel<"pentium4", GenericPostRAModel,
337 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
338 FeatureSSE2, FeatureFXSR]>;
339
340def : ProcessorModel<"pentium4m", GenericPostRAModel,
341 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
342 FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000343
Andrey Turetskiy958eb462016-04-01 10:16:15 +0000344// Intel Quark.
345def : Proc<"lakemont", []>;
346
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000347// Intel Core Duo.
Craig Topper09b65982015-10-16 06:03:09 +0000348def : ProcessorModel<"yonah", SandyBridgeModel,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000349 [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
350 FeatureFXSR, FeatureSlowBTMem]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000351
352// NetBurst.
Mitch Bodarte60465d2016-04-27 22:52:35 +0000353def : ProcessorModel<"prescott", GenericPostRAModel,
354 [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
355 FeatureFXSR, FeatureSlowBTMem]>;
356def : ProcessorModel<"nocona", GenericPostRAModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000357 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000358 FeatureSlowUAMem16,
359 FeatureMMX,
360 FeatureSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000361 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000362 FeatureCMPXCHG16B,
363 FeatureSlowBTMem
364]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000365
366// Intel Core 2 Solo/Duo.
Eric Christopher11e59832015-10-08 20:10:06 +0000367def : ProcessorModel<"core2", SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000368 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000369 FeatureSlowUAMem16,
370 FeatureMMX,
371 FeatureSSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000372 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000373 FeatureCMPXCHG16B,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000374 FeatureSlowBTMem,
375 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000376]>;
377def : ProcessorModel<"penryn", SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000378 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000379 FeatureSlowUAMem16,
380 FeatureMMX,
381 FeatureSSE41,
Craig Topper09b65982015-10-16 06:03:09 +0000382 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000383 FeatureCMPXCHG16B,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000384 FeatureSlowBTMem,
385 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000386]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000387
Chandler Carruthaf8924032014-12-09 10:58:36 +0000388// Atom CPUs.
389class BonnellProc<string Name> : ProcessorModel<Name, AtomModel, [
Eric Christopher11e59832015-10-08 20:10:06 +0000390 ProcIntelAtom,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000391 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000392 FeatureSlowUAMem16,
393 FeatureMMX,
394 FeatureSSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000395 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000396 FeatureCMPXCHG16B,
397 FeatureMOVBE,
398 FeatureSlowBTMem,
Sanjay Patel53d1d8b2015-10-12 15:24:01 +0000399 FeatureLEAForSP,
Eric Christopher11e59832015-10-08 20:10:06 +0000400 FeatureSlowDivide32,
401 FeatureSlowDivide64,
402 FeatureCallRegIndirect,
403 FeatureLEAUsesAG,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000404 FeaturePadShortFunctions,
405 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000406]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000407def : BonnellProc<"bonnell">;
408def : BonnellProc<"atom">; // Pin the generic name to the baseline.
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000409
Chandler Carruthaf8924032014-12-09 10:58:36 +0000410class SilvermontProc<string Name> : ProcessorModel<Name, SLMModel, [
Eric Christopher11e59832015-10-08 20:10:06 +0000411 ProcIntelSLM,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000412 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000413 FeatureMMX,
414 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000415 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000416 FeatureCMPXCHG16B,
417 FeatureMOVBE,
418 FeaturePOPCNT,
419 FeaturePCLMUL,
420 FeatureAES,
421 FeatureSlowDivide64,
422 FeatureCallRegIndirect,
423 FeaturePRFCHW,
424 FeatureSlowLEA,
425 FeatureSlowIncDec,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000426 FeatureSlowBTMem,
Zvi Rackover8bc7e4d2016-12-06 19:35:20 +0000427 FeatureSlowPMULLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000428 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000429]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000430def : SilvermontProc<"silvermont">;
431def : SilvermontProc<"slm">; // Legacy alias.
432
Eric Christopher2ef63182010-04-02 21:54:27 +0000433// "Arrandale" along with corei3 and corei5
Craig Topper3611d9b2015-03-30 06:31:11 +0000434class NehalemProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000435 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000436 FeatureMMX,
437 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000438 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000439 FeatureCMPXCHG16B,
440 FeatureSlowBTMem,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000441 FeaturePOPCNT,
442 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000443]>;
Craig Topper3611d9b2015-03-30 06:31:11 +0000444def : NehalemProc<"nehalem">;
445def : NehalemProc<"corei7">;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000446
Eric Christopher2ef63182010-04-02 21:54:27 +0000447// Westmere is a similar machine to nehalem with some additional features.
448// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
Chandler Carruthaf8924032014-12-09 10:58:36 +0000449class WestmereProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000450 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000451 FeatureMMX,
452 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000453 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000454 FeatureCMPXCHG16B,
455 FeatureSlowBTMem,
456 FeaturePOPCNT,
457 FeatureAES,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000458 FeaturePCLMUL,
459 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000460]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000461def : WestmereProc<"westmere">;
462
Craig Topperf730a6b2016-02-13 21:35:37 +0000463class ProcessorFeatures<list<SubtargetFeature> Inherited,
464 list<SubtargetFeature> NewFeatures> {
465 list<SubtargetFeature> Value = !listconcat(Inherited, NewFeatures);
466}
467
468class ProcModel<string Name, SchedMachineModel Model,
469 list<SubtargetFeature> ProcFeatures,
470 list<SubtargetFeature> OtherFeatures> :
471 ProcessorModel<Name, Model, !listconcat(ProcFeatures, OtherFeatures)>;
472
Nate Begeman8b08f522010-12-10 00:26:57 +0000473// SSE is not listed here since llvm treats AVX as a reimplementation of SSE,
474// rather than a superset.
Craig Topperf730a6b2016-02-13 21:35:37 +0000475def SNBFeatures : ProcessorFeatures<[], [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000476 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000477 FeatureMMX,
478 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000479 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000480 FeatureCMPXCHG16B,
Eric Christopher11e59832015-10-08 20:10:06 +0000481 FeaturePOPCNT,
482 FeatureAES,
Nikolai Bozhenov6bdf92c2017-01-12 19:34:15 +0000483 FeatureSlowDivide64,
Craig Topper0ee35692015-10-14 05:37:38 +0000484 FeaturePCLMUL,
485 FeatureXSAVE,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000486 FeatureXSAVEOPT,
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000487 FeatureLAHFSAHF,
Lama Saba2ea271b2017-05-18 08:11:50 +0000488 FeatureSlow3OpsLEA,
Craig Topperd88389a2017-02-21 06:39:13 +0000489 FeatureFastScalarFSQRT,
490 FeatureFastSHLDRotate
Eric Christopher11e59832015-10-08 20:10:06 +0000491]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000492
Craig Topperf730a6b2016-02-13 21:35:37 +0000493class SandyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
494 SNBFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000495 FeatureSlowBTMem,
496 FeatureSlowUAMem32
497]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000498def : SandyBridgeProc<"sandybridge">;
499def : SandyBridgeProc<"corei7-avx">; // Legacy alias.
Evan Chengff1beda2006-10-06 09:17:41 +0000500
Craig Topperf730a6b2016-02-13 21:35:37 +0000501def IVBFeatures : ProcessorFeatures<SNBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000502 FeatureRDRAND,
503 FeatureF16C,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000504 FeatureFSGSBase
505]>;
506
Craig Topperf730a6b2016-02-13 21:35:37 +0000507class IvyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
508 IVBFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000509 FeatureSlowBTMem,
510 FeatureSlowUAMem32
Eric Christopher11e59832015-10-08 20:10:06 +0000511]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000512def : IvyBridgeProc<"ivybridge">;
513def : IvyBridgeProc<"core-avx-i">; // Legacy alias.
Craig Topper3657fe42011-10-14 03:21:46 +0000514
Craig Topperf730a6b2016-02-13 21:35:37 +0000515def HSWFeatures : ProcessorFeatures<IVBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000516 FeatureAVX2,
Eric Christopher11e59832015-10-08 20:10:06 +0000517 FeatureBMI,
518 FeatureBMI2,
Clement Courbet203fc172017-04-21 09:20:50 +0000519 FeatureERMSB,
Eric Christopher11e59832015-10-08 20:10:06 +0000520 FeatureFMA,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000521 FeatureLZCNT,
522 FeatureMOVBE,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000523 FeatureSlowIncDec
Eric Christopher11e59832015-10-08 20:10:06 +0000524]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000525
Craig Topperf730a6b2016-02-13 21:35:37 +0000526class HaswellProc<string Name> : ProcModel<Name, HaswellModel,
527 HSWFeatures.Value, []>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000528def : HaswellProc<"haswell">;
529def : HaswellProc<"core-avx2">; // Legacy alias.
530
Craig Topperf730a6b2016-02-13 21:35:37 +0000531def BDWFeatures : ProcessorFeatures<HSWFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000532 FeatureADX,
Craig Topper86576bd2017-02-09 06:50:59 +0000533 FeatureRDSEED
Eric Christopher11e59832015-10-08 20:10:06 +0000534]>;
Craig Topperf730a6b2016-02-13 21:35:37 +0000535class BroadwellProc<string Name> : ProcModel<Name, HaswellModel,
536 BDWFeatures.Value, []>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000537def : BroadwellProc<"broadwell">;
538
Craig Topperf730a6b2016-02-13 21:35:37 +0000539def SKLFeatures : ProcessorFeatures<BDWFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000540 FeatureMPX,
Eric Christopher58297412017-03-29 07:40:44 +0000541 FeatureRTM,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000542 FeatureXSAVEC,
543 FeatureXSAVES,
544 FeatureSGX,
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000545 FeatureCLFLUSHOPT,
546 FeatureFastVectorFSQRT
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000547]>;
548
549// FIXME: define SKL model
Craig Topperf730a6b2016-02-13 21:35:37 +0000550class SkylakeClientProc<string Name> : ProcModel<Name, HaswellModel,
551 SKLFeatures.Value, []>;
Sanjoy Dasaa63dc02016-02-21 17:12:03 +0000552def : SkylakeClientProc<"skylake">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000553
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000554// FIXME: define KNL model
Craig Topperf730a6b2016-02-13 21:35:37 +0000555class KnightsLandingProc<string Name> : ProcModel<Name, HaswellModel,
556 IVBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000557 FeatureAVX512,
558 FeatureERI,
559 FeatureCDI,
560 FeaturePFI,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000561 FeaturePREFETCHWT1,
562 FeatureADX,
563 FeatureRDSEED,
Eric Christopher11e59832015-10-08 20:10:06 +0000564 FeatureMOVBE,
565 FeatureLZCNT,
566 FeatureBMI,
567 FeatureBMI2,
Amjad Aboud4f977512017-03-03 09:03:24 +0000568 FeatureFMA,
569 FeatureFastPartialYMMorZMMWrite
Eric Christopher11e59832015-10-08 20:10:06 +0000570]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000571def : KnightsLandingProc<"knl">;
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000572
Craig Topperf730a6b2016-02-13 21:35:37 +0000573def SKXFeatures : ProcessorFeatures<SKLFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000574 FeatureAVX512,
575 FeatureCDI,
576 FeatureDQI,
577 FeatureBWI,
578 FeatureVLX,
Asaf Badouh5acf66f2015-12-15 13:35:29 +0000579 FeaturePKU,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000580 FeatureCLWB
Eric Christopher11e59832015-10-08 20:10:06 +0000581]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000582
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000583// FIXME: define SKX model
Craig Topperf730a6b2016-02-13 21:35:37 +0000584class SkylakeServerProc<string Name> : ProcModel<Name, HaswellModel,
585 SKXFeatures.Value, []>;
Sanjoy Dasaa63dc02016-02-21 17:12:03 +0000586def : SkylakeServerProc<"skylake-avx512">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000587def : SkylakeServerProc<"skx">; // Legacy alias.
588
Craig Topperf730a6b2016-02-13 21:35:37 +0000589def CNLFeatures : ProcessorFeatures<SKXFeatures.Value, [
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000590 FeatureVBMI,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000591 FeatureIFMA,
592 FeatureSHA
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000593]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000594
Craig Topperf730a6b2016-02-13 21:35:37 +0000595class CannonlakeProc<string Name> : ProcModel<Name, HaswellModel,
596 CNLFeatures.Value, []>;
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000597def : CannonlakeProc<"cannonlake">;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000598
599// AMD CPUs.
Robert Khasanovbfa01312014-07-21 14:54:21 +0000600
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000601def : Proc<"k6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
602def : Proc<"k6-2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
603def : Proc<"k6-3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
604def : Proc<"athlon", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000605 FeatureSlowBTMem, FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000606def : Proc<"athlon-tbird", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000607 FeatureSlowBTMem, FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000608def : Proc<"athlon-4", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
609 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000610 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000611def : Proc<"athlon-xp", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
612 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000613 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000614def : Proc<"athlon-mp", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
615 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000616 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000617def : Proc<"k8", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
618 Feature3DNowA, FeatureFXSR, Feature64Bit,
619 FeatureSlowBTMem, FeatureSlowSHLD]>;
620def : Proc<"opteron", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
621 Feature3DNowA, FeatureFXSR, Feature64Bit,
622 FeatureSlowBTMem, FeatureSlowSHLD]>;
623def : Proc<"athlon64", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
624 Feature3DNowA, FeatureFXSR, Feature64Bit,
625 FeatureSlowBTMem, FeatureSlowSHLD]>;
626def : Proc<"athlon-fx", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
627 Feature3DNowA, FeatureFXSR, Feature64Bit,
628 FeatureSlowBTMem, FeatureSlowSHLD]>;
629def : Proc<"k8-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
630 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
631 FeatureSlowBTMem, FeatureSlowSHLD]>;
632def : Proc<"opteron-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
633 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
634 FeatureSlowBTMem, FeatureSlowSHLD]>;
635def : Proc<"athlon64-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
636 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
637 FeatureSlowBTMem, FeatureSlowSHLD]>;
638def : Proc<"amdfam10", [FeatureX87, FeatureSSE4A, Feature3DNowA,
639 FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
640 FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
641 FeatureLAHFSAHF]>;
642def : Proc<"barcelona", [FeatureX87, FeatureSSE4A, Feature3DNowA,
643 FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
644 FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
645 FeatureLAHFSAHF]>;
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000646
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000647// Bobcat
Eric Christopher11e59832015-10-08 20:10:06 +0000648def : Proc<"btver1", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000649 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000650 FeatureMMX,
651 FeatureSSSE3,
652 FeatureSSE4A,
Craig Topper09b65982015-10-16 06:03:09 +0000653 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000654 FeatureCMPXCHG16B,
655 FeaturePRFCHW,
656 FeatureLZCNT,
657 FeaturePOPCNT,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000658 FeatureSlowSHLD,
659 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000660]>;
Sanjay Patel1191adf2014-09-09 20:07:07 +0000661
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000662// Jaguar
Eric Christopher11e59832015-10-08 20:10:06 +0000663def : ProcessorModel<"btver2", BtVer2Model, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000664 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000665 FeatureMMX,
666 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000667 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000668 FeatureSSE4A,
669 FeatureCMPXCHG16B,
670 FeaturePRFCHW,
671 FeatureAES,
672 FeaturePCLMUL,
673 FeatureBMI,
674 FeatureF16C,
675 FeatureMOVBE,
676 FeatureLZCNT,
Pierre Gousseaub6d652a2016-10-14 16:41:38 +0000677 FeatureFastLZCNT,
Eric Christopher11e59832015-10-08 20:10:06 +0000678 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000679 FeatureXSAVE,
680 FeatureXSAVEOPT,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000681 FeatureSlowSHLD,
Yunzhong Gao0de36ec2016-02-12 23:37:57 +0000682 FeatureLAHFSAHF,
Amjad Aboud4f977512017-03-03 09:03:24 +0000683 FeatureFastPartialYMMorZMMWrite
Eric Christopher11e59832015-10-08 20:10:06 +0000684]>;
Sanjay Patele57f3c02014-11-28 18:40:18 +0000685
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000686// Bulldozer
Eric Christopher11e59832015-10-08 20:10:06 +0000687def : Proc<"bdver1", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000688 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000689 FeatureXOP,
690 FeatureFMA4,
691 FeatureCMPXCHG16B,
692 FeatureAES,
693 FeaturePRFCHW,
694 FeaturePCLMUL,
695 FeatureMMX,
696 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000697 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000698 FeatureSSE4A,
699 FeatureLZCNT,
700 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000701 FeatureXSAVE,
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000702 FeatureLWP,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000703 FeatureSlowSHLD,
704 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000705]>;
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000706// Piledriver
Eric Christopher11e59832015-10-08 20:10:06 +0000707def : Proc<"bdver2", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000708 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000709 FeatureXOP,
710 FeatureFMA4,
711 FeatureCMPXCHG16B,
712 FeatureAES,
713 FeaturePRFCHW,
714 FeaturePCLMUL,
715 FeatureMMX,
716 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000717 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000718 FeatureSSE4A,
719 FeatureF16C,
720 FeatureLZCNT,
721 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000722 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000723 FeatureBMI,
724 FeatureTBM,
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000725 FeatureLWP,
Eric Christopher11e59832015-10-08 20:10:06 +0000726 FeatureFMA,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000727 FeatureSlowSHLD,
728 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000729]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000730
731// Steamroller
Eric Christopher11e59832015-10-08 20:10:06 +0000732def : Proc<"bdver3", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000733 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000734 FeatureXOP,
735 FeatureFMA4,
736 FeatureCMPXCHG16B,
737 FeatureAES,
738 FeaturePRFCHW,
739 FeaturePCLMUL,
740 FeatureMMX,
741 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000742 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000743 FeatureSSE4A,
744 FeatureF16C,
745 FeatureLZCNT,
746 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000747 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000748 FeatureBMI,
749 FeatureTBM,
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000750 FeatureLWP,
Eric Christopher11e59832015-10-08 20:10:06 +0000751 FeatureFMA,
Craig Topper0ee35692015-10-14 05:37:38 +0000752 FeatureXSAVEOPT,
Eric Christopher11e59832015-10-08 20:10:06 +0000753 FeatureSlowSHLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000754 FeatureFSGSBase,
755 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000756]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000757
Benjamin Kramer60045732014-05-02 15:47:07 +0000758// Excavator
Eric Christopher11e59832015-10-08 20:10:06 +0000759def : Proc<"bdver4", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000760 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000761 FeatureMMX,
762 FeatureAVX2,
Craig Topper09b65982015-10-16 06:03:09 +0000763 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000764 FeatureXOP,
765 FeatureFMA4,
766 FeatureCMPXCHG16B,
767 FeatureAES,
768 FeaturePRFCHW,
769 FeaturePCLMUL,
770 FeatureF16C,
771 FeatureLZCNT,
772 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000773 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000774 FeatureBMI,
775 FeatureBMI2,
776 FeatureTBM,
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000777 FeatureLWP,
Eric Christopher11e59832015-10-08 20:10:06 +0000778 FeatureFMA,
Craig Topper0ee35692015-10-14 05:37:38 +0000779 FeatureXSAVEOPT,
Simon Pilgrim381a0ad2016-07-24 16:00:53 +0000780 FeatureSlowSHLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000781 FeatureFSGSBase,
Ashutosh Nema348af9c2016-05-18 11:59:12 +0000782 FeatureLAHFSAHF,
783 FeatureMWAITX
Eric Christopher11e59832015-10-08 20:10:06 +0000784]>;
Benjamin Kramer60045732014-05-02 15:47:07 +0000785
Craig Topperd55b8312017-01-10 06:01:16 +0000786// TODO: The scheduler model falls to BTVER2 model.
787// The znver1 model has to be put in place.
788// Zen
789def: ProcessorModel<"znver1", BtVer2Model, [
790 FeatureADX,
791 FeatureAES,
792 FeatureAVX2,
793 FeatureBMI,
794 FeatureBMI2,
795 FeatureCLFLUSHOPT,
Craig Topper50f3d142017-02-09 04:27:34 +0000796 FeatureCLZERO,
Craig Topperd55b8312017-01-10 06:01:16 +0000797 FeatureCMPXCHG16B,
798 FeatureF16C,
799 FeatureFMA,
800 FeatureFSGSBase,
801 FeatureFXSR,
802 FeatureFastLZCNT,
803 FeatureLAHFSAHF,
804 FeatureLZCNT,
805 FeatureMMX,
806 FeatureMOVBE,
807 FeatureMWAITX,
808 FeaturePCLMUL,
809 FeaturePOPCNT,
810 FeaturePRFCHW,
811 FeatureRDRAND,
812 FeatureRDSEED,
813 FeatureSHA,
Craig Topperd55b8312017-01-10 06:01:16 +0000814 FeatureSSE4A,
815 FeatureSlowSHLD,
816 FeatureX87,
817 FeatureXSAVE,
818 FeatureXSAVEC,
819 FeatureXSAVEOPT,
820 FeatureXSAVES]>;
821
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000822def : Proc<"geode", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000823
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000824def : Proc<"winchip-c6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
825def : Proc<"winchip2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
826def : Proc<"c3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
827def : Proc<"c3-2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
828 FeatureSSE1, FeatureFXSR]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000829
Chandler Carruth32908d72014-05-07 17:37:03 +0000830// We also provide a generic 64-bit specific x86 processor model which tries to
831// be good for modern chips without enabling instruction set encodings past the
832// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
833// modern 64-bit x86 chip, and enables features that are generally beneficial.
Michael Liao5bf95782014-12-04 05:20:33 +0000834//
Chandler Carruth32908d72014-05-07 17:37:03 +0000835// We currently use the Sandy Bridge model as the default scheduling model as
836// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
837// covers a huge swath of x86 processors. If there are specific scheduling
838// knobs which need to be tuned differently for AMD chips, we might consider
839// forming a common base for them.
Craig Topper09b65982015-10-16 06:03:09 +0000840def : ProcessorModel<"x86-64", SandyBridgeModel,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000841 [FeatureX87, FeatureMMX, FeatureSSE2, FeatureFXSR,
842 Feature64Bit, FeatureSlowBTMem ]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000843
Evan Chengff1beda2006-10-06 09:17:41 +0000844//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +0000845// Register File Description
846//===----------------------------------------------------------------------===//
847
848include "X86RegisterInfo.td"
Igor Bregerb4442f32017-02-10 07:05:56 +0000849include "X86RegisterBanks.td"
Chris Lattner5da8e802003-08-03 15:47:49 +0000850
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000851//===----------------------------------------------------------------------===//
852// Instruction Descriptions
853//===----------------------------------------------------------------------===//
854
Chris Lattner59a4a912003-08-03 21:54:21 +0000855include "X86InstrInfo.td"
856
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +0000857def X86InstrInfo : InstrInfo;
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000858
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000859//===----------------------------------------------------------------------===//
860// Calling Conventions
861//===----------------------------------------------------------------------===//
862
863include "X86CallingConv.td"
864
865
866//===----------------------------------------------------------------------===//
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000867// Assembly Parser
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000868//===----------------------------------------------------------------------===//
869
Devang Patel85d684a2012-01-09 19:13:28 +0000870def ATTAsmParserVariant : AsmParserVariant {
Daniel Dunbar00331992009-07-29 00:02:19 +0000871 int Variant = 0;
Daniel Dunbare4318712009-08-11 20:59:47 +0000872
Chad Rosier9f7a2212013-04-18 22:35:36 +0000873 // Variant name.
874 string Name = "att";
875
Daniel Dunbare4318712009-08-11 20:59:47 +0000876 // Discard comments in assembly strings.
877 string CommentDelimiter = "#";
878
879 // Recognize hard coded registers.
880 string RegisterPrefix = "%";
Daniel Dunbar00331992009-07-29 00:02:19 +0000881}
882
Devang Patel67bf992a2012-01-10 17:51:54 +0000883def IntelAsmParserVariant : AsmParserVariant {
884 int Variant = 1;
885
Chad Rosier9f7a2212013-04-18 22:35:36 +0000886 // Variant name.
887 string Name = "intel";
888
Devang Patel67bf992a2012-01-10 17:51:54 +0000889 // Discard comments in assembly strings.
890 string CommentDelimiter = ";";
891
892 // Recognize hard coded registers.
893 string RegisterPrefix = "";
894}
895
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000896//===----------------------------------------------------------------------===//
897// Assembly Printers
898//===----------------------------------------------------------------------===//
899
Chris Lattner56832602004-10-03 20:36:57 +0000900// The X86 target supports two different syntaxes for emitting machine code.
901// This is controlled by the -x86-asm-syntax={att|intel}
902def ATTAsmWriter : AsmWriter {
Chris Lattner1cbd3de2009-09-13 19:30:11 +0000903 string AsmWriterClassName = "ATTInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000904 int Variant = 0;
905}
906def IntelAsmWriter : AsmWriter {
Chris Lattner13306a12009-09-20 07:47:59 +0000907 string AsmWriterClassName = "IntelInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000908 int Variant = 1;
909}
910
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000911def X86 : Target {
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000912 // Information about the instructions...
Chris Lattner25510802003-08-04 04:59:56 +0000913 let InstructionSet = X86InstrInfo;
Devang Patel67bf992a2012-01-10 17:51:54 +0000914 let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
Chris Lattner56832602004-10-03 20:36:57 +0000915 let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000916}