blob: 3a3b03874c0f8006320f710744aeca66217e4894 [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
34def FeatureCMOV : SubtargetFeature<"cmov","HasCMov", "true",
35 "Enable conditional move instructions">;
36
Benjamin Kramer2f489232010-12-04 20:32:23 +000037def FeaturePOPCNT : SubtargetFeature<"popcnt", "HasPOPCNT", "true",
38 "Support POPCNT instruction">;
39
David Greene206351a2010-01-11 16:29:42 +000040
Bill Wendlinge6182262007-05-04 20:38:40 +000041def FeatureMMX : SubtargetFeature<"mmx","X86SSELevel", "MMX",
42 "Enable MMX instructions">;
43def FeatureSSE1 : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
44 "Enable SSE instructions",
Chris Lattnercc8c5812009-09-02 05:53:04 +000045 // SSE codegen depends on cmovs, and all
Michael J. Spencerb88784c2011-04-14 14:33:36 +000046 // SSE1+ processors support them.
Chris Lattnercc8c5812009-09-02 05:53:04 +000047 [FeatureMMX, FeatureCMOV]>;
Bill Wendlinge6182262007-05-04 20:38:40 +000048def FeatureSSE2 : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
49 "Enable SSE2 instructions",
50 [FeatureSSE1]>;
51def FeatureSSE3 : SubtargetFeature<"sse3", "X86SSELevel", "SSE3",
52 "Enable SSE3 instructions",
53 [FeatureSSE2]>;
54def FeatureSSSE3 : SubtargetFeature<"ssse3", "X86SSELevel", "SSSE3",
55 "Enable SSSE3 instructions",
56 [FeatureSSE3]>;
Rafael Espindola94a2c562013-08-23 20:21:34 +000057def FeatureSSE41 : SubtargetFeature<"sse4.1", "X86SSELevel", "SSE41",
Nate Begemane14fdfa2008-02-03 07:18:54 +000058 "Enable SSE 4.1 instructions",
59 [FeatureSSSE3]>;
Rafael Espindola94a2c562013-08-23 20:21:34 +000060def FeatureSSE42 : SubtargetFeature<"sse4.2", "X86SSELevel", "SSE42",
Nate Begemane14fdfa2008-02-03 07:18:54 +000061 "Enable SSE 4.2 instructions",
Craig Topper7bd33052011-12-29 15:51:45 +000062 [FeatureSSE41]>;
Bill Wendlinge6182262007-05-04 20:38:40 +000063def Feature3DNow : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow",
Michael J. Spencer30088ba2011-04-15 00:32:41 +000064 "Enable 3DNow! instructions",
65 [FeatureMMX]>;
Bill Wendlinge6182262007-05-04 20:38:40 +000066def Feature3DNowA : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA",
Bill Wendlingf985c492007-05-06 07:56:19 +000067 "Enable 3DNow! Athlon instructions",
68 [Feature3DNow]>;
Dan Gohman74037512009-02-03 00:04:43 +000069// All x86-64 hardware has SSE2, but we don't mark SSE2 as an implied
70// feature, because SSE2 can be disabled (e.g. for compiling OS kernels)
71// without disabling 64-bit mode.
Bill Wendlingf985c492007-05-06 07:56:19 +000072def Feature64Bit : SubtargetFeature<"64bit", "HasX86_64", "true",
Chris Lattner77f7dba2010-03-14 22:24:34 +000073 "Support 64-bit instructions",
74 [FeatureCMOV]>;
Nick Lewycky3be42b82013-10-05 20:11:44 +000075def FeatureCMPXCHG16B : SubtargetFeature<"cx16", "HasCmpxchg16b", "true",
Eli Friedman5e570422011-08-26 21:21:21 +000076 "64-bit with cmpxchg16b",
77 [Feature64Bit]>;
Evan Cheng4c91aa32009-01-02 05:35:45 +000078def FeatureSlowBTMem : SubtargetFeature<"slow-bt-mem", "IsBTMemSlow", "true",
79 "Bit testing of memory is slow">;
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +000080def FeatureSlowSHLD : SubtargetFeature<"slow-shld", "IsSHLDSlow", "true",
81 "SHLD instruction is slow">;
Sanjay Patel30145672015-09-01 20:51:51 +000082// FIXME: This should not apply to CPUs that do not have SSE.
83def FeatureSlowUAMem16 : SubtargetFeature<"slow-unaligned-mem-16",
84 "IsUAMem16Slow", "true",
85 "Slow unaligned 16-byte memory access">;
Sanjay Patel501890e2014-11-21 17:40:04 +000086def FeatureSlowUAMem32 : SubtargetFeature<"slow-unaligned-mem-32",
Sanjay Patel9e916dc2015-08-21 20:17:26 +000087 "IsUAMem32Slow", "true",
88 "Slow unaligned 32-byte memory access">;
Stefanus Du Toit96180b52009-05-26 21:04:35 +000089def FeatureSSE4A : SubtargetFeature<"sse4a", "HasSSE4A", "true",
Craig Toppera5d1fc22011-12-30 07:16:00 +000090 "Support SSE 4a instructions",
91 [FeatureSSE3]>;
Evan Chengff1beda2006-10-06 09:17:41 +000092
Craig Topperf287a452012-01-09 09:02:13 +000093def FeatureAVX : SubtargetFeature<"avx", "X86SSELevel", "AVX",
94 "Enable AVX instructions",
95 [FeatureSSE42]>;
96def FeatureAVX2 : SubtargetFeature<"avx2", "X86SSELevel", "AVX2",
Craig Topper228d9132011-10-30 19:57:21 +000097 "Enable AVX2 instructions",
98 [FeatureAVX]>;
Craig Topper5c94bb82013-08-21 03:57:57 +000099def FeatureAVX512 : SubtargetFeature<"avx512f", "X86SSELevel", "AVX512F",
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000100 "Enable AVX-512 instructions",
101 [FeatureAVX2]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000102def FeatureERI : SubtargetFeature<"avx512er", "HasERI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000103 "Enable AVX-512 Exponential and Reciprocal Instructions",
104 [FeatureAVX512]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000105def FeatureCDI : SubtargetFeature<"avx512cd", "HasCDI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000106 "Enable AVX-512 Conflict Detection Instructions",
107 [FeatureAVX512]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000108def FeaturePFI : SubtargetFeature<"avx512pf", "HasPFI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000109 "Enable AVX-512 PreFetch Instructions",
110 [FeatureAVX512]>;
Robert Khasanovbfa01312014-07-21 14:54:21 +0000111def FeatureDQI : SubtargetFeature<"avx512dq", "HasDQI", "true",
112 "Enable AVX-512 Doubleword and Quadword Instructions",
113 [FeatureAVX512]>;
114def FeatureBWI : SubtargetFeature<"avx512bw", "HasBWI", "true",
115 "Enable AVX-512 Byte and Word Instructions",
116 [FeatureAVX512]>;
117def FeatureVLX : SubtargetFeature<"avx512vl", "HasVLX", "true",
118 "Enable AVX-512 Vector Length eXtensions",
119 [FeatureAVX512]>;
Benjamin Kramera0396e42012-05-31 14:34:17 +0000120def FeaturePCLMUL : SubtargetFeature<"pclmul", "HasPCLMUL", "true",
121 "Enable packed carry-less multiplication instructions",
Craig Topper29dd1482012-05-01 05:28:32 +0000122 [FeatureSSE2]>;
Craig Topper79dbb0c2012-06-03 18:58:46 +0000123def FeatureFMA : SubtargetFeature<"fma", "HasFMA", "true",
Craig Toppere1bd0512011-12-29 19:46:19 +0000124 "Enable three-operand fused multiple-add",
125 [FeatureAVX]>;
David Greene8f6f72c2009-06-26 22:46:54 +0000126def FeatureFMA4 : SubtargetFeature<"fma4", "HasFMA4", "true",
Craig Toppera5d1fc22011-12-30 07:16:00 +0000127 "Enable four-operand fused multiple-add",
Craig Topperbae0e9e2012-05-01 06:54:48 +0000128 [FeatureAVX, FeatureSSE4A]>;
Craig Toppera5d1fc22011-12-30 07:16:00 +0000129def FeatureXOP : SubtargetFeature<"xop", "HasXOP", "true",
Craig Topper43518cc2012-05-01 05:41:41 +0000130 "Enable XOP instructions",
Anitha Boyapatiaf3e9832012-08-16 04:04:02 +0000131 [FeatureFMA4]>;
Sanjay Patelffd039b2015-02-03 17:13:04 +0000132def FeatureSSEUnalignedMem : SubtargetFeature<"sse-unaligned-mem",
133 "HasSSEUnalignedMem", "true",
134 "Allow unaligned memory operands with SSE instructions">;
Eric Christopher2ef63182010-04-02 21:54:27 +0000135def FeatureAES : SubtargetFeature<"aes", "HasAES", "true",
Craig Topper29dd1482012-05-01 05:28:32 +0000136 "Enable AES instructions",
137 [FeatureSSE2]>;
Yunzhong Gaodd36e932013-09-24 18:21:52 +0000138def FeatureTBM : SubtargetFeature<"tbm", "HasTBM", "true",
139 "Enable TBM instructions">;
Craig Topper786bdb92011-10-03 17:28:23 +0000140def FeatureMOVBE : SubtargetFeature<"movbe", "HasMOVBE", "true",
141 "Support MOVBE instruction">;
Rafael Espindola94a2c562013-08-23 20:21:34 +0000142def FeatureRDRAND : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
Craig Topper786bdb92011-10-03 17:28:23 +0000143 "Support RDRAND instruction">;
Craig Topperfe9179f2011-10-09 07:31:39 +0000144def FeatureF16C : SubtargetFeature<"f16c", "HasF16C", "true",
Craig Toppera6d204e2013-09-16 04:29:58 +0000145 "Support 16-bit floating point conversion instructions",
146 [FeatureAVX]>;
Craig Topper228d9132011-10-30 19:57:21 +0000147def FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
148 "Support FS/GS Base instructions">;
Craig Topper271064e2011-10-11 06:44:02 +0000149def FeatureLZCNT : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
150 "Support LZCNT instruction">;
Craig Topper3657fe42011-10-14 03:21:46 +0000151def FeatureBMI : SubtargetFeature<"bmi", "HasBMI", "true",
152 "Support BMI instructions">;
Craig Topperaea148c2011-10-16 07:55:05 +0000153def FeatureBMI2 : SubtargetFeature<"bmi2", "HasBMI2", "true",
154 "Support BMI2 instructions">;
Michael Liao73cffdd2012-11-08 07:28:54 +0000155def FeatureRTM : SubtargetFeature<"rtm", "HasRTM", "true",
156 "Support RTM instructions">;
Michael Liaoe344ec92013-03-26 22:46:02 +0000157def FeatureHLE : SubtargetFeature<"hle", "HasHLE", "true",
158 "Support HLE">;
Kay Tiong Khoof809c642013-02-14 19:08:21 +0000159def FeatureADX : SubtargetFeature<"adx", "HasADX", "true",
160 "Support ADX instructions">;
Ben Langmuir16501752013-09-12 15:51:31 +0000161def FeatureSHA : SubtargetFeature<"sha", "HasSHA", "true",
162 "Enable SHA instructions",
163 [FeatureSSE2]>;
Michael Liao5173ee02013-03-26 17:47:11 +0000164def FeaturePRFCHW : SubtargetFeature<"prfchw", "HasPRFCHW", "true",
165 "Support PRFCHW instructions">;
Michael Liaoa486a112013-03-28 23:41:26 +0000166def FeatureRDSEED : SubtargetFeature<"rdseed", "HasRDSEED", "true",
167 "Support RDSEED instruction">;
Elena Demikhovskyf7e641c2015-06-03 10:30:57 +0000168def FeatureMPX : SubtargetFeature<"mpx", "HasMPX", "true",
169 "Support MPX instructions">;
Evan Cheng1b81fdd2012-02-07 22:50:41 +0000170def FeatureLeaForSP : SubtargetFeature<"lea-sp", "UseLeaForSP", "true",
171 "Use LEA for adjusting the stack pointer">;
Alexey Volkovfd1731d2014-11-21 11:19:34 +0000172def FeatureSlowDivide32 : SubtargetFeature<"idivl-to-divb",
173 "HasSlowDivide32", "true",
174 "Use 8-bit divide for positive values less than 256">;
175def FeatureSlowDivide64 : SubtargetFeature<"idivq-to-divw",
176 "HasSlowDivide64", "true",
177 "Use 16-bit divide for positive values less than 65536">;
Preston Gurda01daac2013-01-08 18:27:24 +0000178def FeaturePadShortFunctions : SubtargetFeature<"pad-short-functions",
179 "PadShortFunctions", "true",
180 "Pad short functions">;
Michael Kuperstein454d1452015-07-23 12:23:45 +0000181// TODO: This feature ought to be renamed.
Sean Silvae1c6b542015-07-27 00:46:59 +0000182// What it really refers to are CPUs for which certain instructions
183// (which ones besides the example below?) are microcoded.
Michael Kuperstein454d1452015-07-23 12:23:45 +0000184// The best examples of this are the memory forms of CALL and PUSH
185// instructions, which should be avoided in favor of a MOV + register CALL/PUSH.
Preston Gurd663e6f92013-03-27 19:14:02 +0000186def FeatureCallRegIndirect : SubtargetFeature<"call-reg-indirect",
187 "CallRegIndirect", "true",
188 "Call register indirect">;
Preston Gurd8b7ab4b2013-04-25 20:29:37 +0000189def FeatureLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LEAUsesAG", "true",
190 "LEA instruction needs inputs at AG stage">;
Alexey Volkov6226de62014-05-20 08:55:50 +0000191def FeatureSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
192 "LEA instruction with certain arguments is slow">;
Alexey Volkov5260dba2014-06-09 11:40:41 +0000193def FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
194 "INC and DEC instructions are slower than ADD and SUB">;
Eric Christopher824f42f2015-05-12 01:26:05 +0000195def FeatureSoftFloat
196 : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
197 "Use software floating point features.">;
David Greene8f6f72c2009-06-26 22:46:54 +0000198
Evan Chengff1beda2006-10-06 09:17:41 +0000199//===----------------------------------------------------------------------===//
200// X86 processors supported.
201//===----------------------------------------------------------------------===//
202
Andrew Trick8523b162012-02-01 23:20:51 +0000203include "X86Schedule.td"
204
205def ProcIntelAtom : SubtargetFeature<"atom", "X86ProcFamily", "IntelAtom",
206 "Intel Atom processors">;
Preston Gurd3fe264d2013-09-13 19:23:28 +0000207def ProcIntelSLM : SubtargetFeature<"slm", "X86ProcFamily", "IntelSLM",
208 "Intel Silvermont processors">;
Andrew Trick8523b162012-02-01 23:20:51 +0000209
Evan Chengff1beda2006-10-06 09:17:41 +0000210class Proc<string Name, list<SubtargetFeature> Features>
Andrew Trick87255e32012-07-07 04:00:00 +0000211 : ProcessorModel<Name, GenericModel, Features>;
Andrew Trick8523b162012-02-01 23:20:51 +0000212
Sanjay Patel30145672015-09-01 20:51:51 +0000213def : Proc<"generic", [FeatureSlowUAMem16]>;
214def : Proc<"i386", [FeatureSlowUAMem16]>;
215def : Proc<"i486", [FeatureSlowUAMem16]>;
216def : Proc<"i586", [FeatureSlowUAMem16]>;
217def : Proc<"pentium", [FeatureSlowUAMem16]>;
218def : Proc<"pentium-mmx", [FeatureSlowUAMem16, FeatureMMX]>;
219def : Proc<"i686", [FeatureSlowUAMem16]>;
220def : Proc<"pentiumpro", [FeatureSlowUAMem16, FeatureCMOV]>;
221def : Proc<"pentium2", [FeatureSlowUAMem16, FeatureMMX, FeatureCMOV]>;
222def : Proc<"pentium3", [FeatureSlowUAMem16, FeatureSSE1]>;
223def : Proc<"pentium3m", [FeatureSlowUAMem16, FeatureSSE1,
224 FeatureSlowBTMem]>;
225def : Proc<"pentium-m", [FeatureSlowUAMem16, FeatureSSE2,
226 FeatureSlowBTMem]>;
227def : Proc<"pentium4", [FeatureSlowUAMem16, FeatureSSE2]>;
228def : Proc<"pentium4m", [FeatureSlowUAMem16, FeatureSSE2,
229 FeatureSlowBTMem]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000230
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000231// Intel Core Duo.
232def : ProcessorModel<"yonah", SandyBridgeModel,
Sanjay Patel30145672015-09-01 20:51:51 +0000233 [FeatureSlowUAMem16, FeatureSSE3, FeatureSlowBTMem]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000234
235// NetBurst.
Sanjay Patel30145672015-09-01 20:51:51 +0000236def : Proc<"prescott", [FeatureSlowUAMem16, FeatureSSE3, FeatureSlowBTMem]>;
237def : Proc<"nocona", [FeatureSlowUAMem16, FeatureSSE3, FeatureCMPXCHG16B,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000238 FeatureSlowBTMem]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000239
240// Intel Core 2 Solo/Duo.
241def : ProcessorModel<"core2", SandyBridgeModel,
Sanjay Patel30145672015-09-01 20:51:51 +0000242 [FeatureSlowUAMem16, FeatureSSSE3, FeatureCMPXCHG16B,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000243 FeatureSlowBTMem]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000244def : ProcessorModel<"penryn", SandyBridgeModel,
Sanjay Patel30145672015-09-01 20:51:51 +0000245 [FeatureSlowUAMem16, FeatureSSE41, FeatureCMPXCHG16B,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000246 FeatureSlowBTMem]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000247
Chandler Carruthaf8924032014-12-09 10:58:36 +0000248// Atom CPUs.
249class BonnellProc<string Name> : ProcessorModel<Name, AtomModel, [
250 ProcIntelAtom,
Sanjay Patel30145672015-09-01 20:51:51 +0000251 FeatureSlowUAMem16,
Chandler Carruthaf8924032014-12-09 10:58:36 +0000252 FeatureSSSE3,
253 FeatureCMPXCHG16B,
254 FeatureMOVBE,
255 FeatureSlowBTMem,
256 FeatureLeaForSP,
257 FeatureSlowDivide32,
258 FeatureSlowDivide64,
259 FeatureCallRegIndirect,
260 FeatureLEAUsesAG,
261 FeaturePadShortFunctions
262 ]>;
263def : BonnellProc<"bonnell">;
264def : BonnellProc<"atom">; // Pin the generic name to the baseline.
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000265
Chandler Carruthaf8924032014-12-09 10:58:36 +0000266class SilvermontProc<string Name> : ProcessorModel<Name, SLMModel, [
267 ProcIntelSLM,
268 FeatureSSE42,
269 FeatureCMPXCHG16B,
270 FeatureMOVBE,
271 FeaturePOPCNT,
272 FeaturePCLMUL,
273 FeatureAES,
274 FeatureSlowDivide64,
275 FeatureCallRegIndirect,
276 FeaturePRFCHW,
277 FeatureSlowLEA,
278 FeatureSlowIncDec,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000279 FeatureSlowBTMem
Chandler Carruthaf8924032014-12-09 10:58:36 +0000280 ]>;
281def : SilvermontProc<"silvermont">;
282def : SilvermontProc<"slm">; // Legacy alias.
283
Eric Christopher2ef63182010-04-02 21:54:27 +0000284// "Arrandale" along with corei3 and corei5
Craig Topper3611d9b2015-03-30 06:31:11 +0000285class NehalemProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
286 FeatureSSE42,
287 FeatureCMPXCHG16B,
288 FeatureSlowBTMem,
Craig Topper3611d9b2015-03-30 06:31:11 +0000289 FeaturePOPCNT
290 ]>;
291def : NehalemProc<"nehalem">;
292def : NehalemProc<"corei7">;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000293
Eric Christopher2ef63182010-04-02 21:54:27 +0000294// Westmere is a similar machine to nehalem with some additional features.
295// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
Chandler Carruthaf8924032014-12-09 10:58:36 +0000296class WestmereProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
297 FeatureSSE42,
298 FeatureCMPXCHG16B,
299 FeatureSlowBTMem,
Chandler Carruthaf8924032014-12-09 10:58:36 +0000300 FeaturePOPCNT,
301 FeatureAES,
302 FeaturePCLMUL
303 ]>;
304def : WestmereProc<"westmere">;
305
Nate Begeman8b08f522010-12-10 00:26:57 +0000306// SSE is not listed here since llvm treats AVX as a reimplementation of SSE,
307// rather than a superset.
Chandler Carruthaf8924032014-12-09 10:58:36 +0000308class SandyBridgeProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
309 FeatureAVX,
310 FeatureCMPXCHG16B,
Craig Topper01dd4ea2015-08-08 07:20:04 +0000311 FeatureSlowBTMem,
Chandler Carruthaf8924032014-12-09 10:58:36 +0000312 FeatureSlowUAMem32,
313 FeaturePOPCNT,
314 FeatureAES,
315 FeaturePCLMUL
316 ]>;
317def : SandyBridgeProc<"sandybridge">;
318def : SandyBridgeProc<"corei7-avx">; // Legacy alias.
Evan Chengff1beda2006-10-06 09:17:41 +0000319
Chandler Carruthaf8924032014-12-09 10:58:36 +0000320class IvyBridgeProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
321 FeatureAVX,
322 FeatureCMPXCHG16B,
Craig Topper01dd4ea2015-08-08 07:20:04 +0000323 FeatureSlowBTMem,
Chandler Carruthaf8924032014-12-09 10:58:36 +0000324 FeatureSlowUAMem32,
325 FeaturePOPCNT,
326 FeatureAES,
327 FeaturePCLMUL,
328 FeatureRDRAND,
329 FeatureF16C,
330 FeatureFSGSBase
331 ]>;
332def : IvyBridgeProc<"ivybridge">;
333def : IvyBridgeProc<"core-avx-i">; // Legacy alias.
Craig Topper3657fe42011-10-14 03:21:46 +0000334
Chandler Carruthaf8924032014-12-09 10:58:36 +0000335class HaswellProc<string Name> : ProcessorModel<Name, HaswellModel, [
336 FeatureAVX2,
337 FeatureCMPXCHG16B,
Craig Topper01dd4ea2015-08-08 07:20:04 +0000338 FeatureSlowBTMem,
Chandler Carruthaf8924032014-12-09 10:58:36 +0000339 FeaturePOPCNT,
340 FeatureAES,
341 FeaturePCLMUL,
342 FeatureRDRAND,
343 FeatureF16C,
344 FeatureFSGSBase,
345 FeatureMOVBE,
346 FeatureLZCNT,
347 FeatureBMI,
348 FeatureBMI2,
349 FeatureFMA,
350 FeatureRTM,
351 FeatureHLE,
352 FeatureSlowIncDec
353 ]>;
354def : HaswellProc<"haswell">;
355def : HaswellProc<"core-avx2">; // Legacy alias.
356
357class BroadwellProc<string Name> : ProcessorModel<Name, HaswellModel, [
358 FeatureAVX2,
359 FeatureCMPXCHG16B,
Craig Topper01dd4ea2015-08-08 07:20:04 +0000360 FeatureSlowBTMem,
Chandler Carruthaf8924032014-12-09 10:58:36 +0000361 FeaturePOPCNT,
362 FeatureAES,
363 FeaturePCLMUL,
364 FeatureRDRAND,
365 FeatureF16C,
366 FeatureFSGSBase,
367 FeatureMOVBE,
368 FeatureLZCNT,
369 FeatureBMI,
370 FeatureBMI2,
371 FeatureFMA,
372 FeatureRTM,
373 FeatureHLE,
374 FeatureADX,
375 FeatureRDSEED,
Chandler Carruthaf8924032014-12-09 10:58:36 +0000376 FeatureSlowIncDec
377 ]>;
378def : BroadwellProc<"broadwell">;
379
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000380// FIXME: define KNL model
Chandler Carruthaf8924032014-12-09 10:58:36 +0000381class KnightsLandingProc<string Name> : ProcessorModel<Name, HaswellModel,
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000382 [FeatureAVX512, FeatureERI, FeatureCDI, FeaturePFI,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000383 FeatureCMPXCHG16B, FeaturePOPCNT,
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000384 FeatureAES, FeaturePCLMUL, FeatureRDRAND, FeatureF16C,
385 FeatureFSGSBase, FeatureMOVBE, FeatureLZCNT, FeatureBMI,
Elena Demikhovsky678bd5b2014-07-02 14:11:05 +0000386 FeatureBMI2, FeatureFMA, FeatureRTM, FeatureHLE,
Elena Demikhovskyf7e641c2015-06-03 10:30:57 +0000387 FeatureSlowIncDec, FeatureMPX]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000388def : KnightsLandingProc<"knl">;
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000389
Robert Khasanovbfa01312014-07-21 14:54:21 +0000390// FIXME: define SKX model
Chandler Carruthaf8924032014-12-09 10:58:36 +0000391class SkylakeProc<string Name> : ProcessorModel<Name, HaswellModel,
Robert Khasanovbfa01312014-07-21 14:54:21 +0000392 [FeatureAVX512, FeatureCDI,
393 FeatureDQI, FeatureBWI, FeatureVLX,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000394 FeatureCMPXCHG16B, FeatureSlowBTMem,
Craig Topper01dd4ea2015-08-08 07:20:04 +0000395 FeaturePOPCNT, FeatureAES, FeaturePCLMUL, FeatureRDRAND,
396 FeatureF16C, FeatureFSGSBase, FeatureMOVBE, FeatureLZCNT,
397 FeatureBMI, FeatureBMI2, FeatureFMA, FeatureRTM,
Craig Toppercb1f6012015-08-08 07:31:15 +0000398 FeatureHLE, FeatureADX, FeatureRDSEED, FeatureSlowIncDec,
399 FeatureMPX]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000400def : SkylakeProc<"skylake">;
401def : SkylakeProc<"skx">; // Legacy alias.
402
403
404// AMD CPUs.
Robert Khasanovbfa01312014-07-21 14:54:21 +0000405
Sanjay Patel30145672015-09-01 20:51:51 +0000406def : Proc<"k6", [FeatureSlowUAMem16, FeatureMMX]>;
407def : Proc<"k6-2", [FeatureSlowUAMem16, Feature3DNow]>;
408def : Proc<"k6-3", [FeatureSlowUAMem16, Feature3DNow]>;
409def : Proc<"athlon", [FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000410 FeatureSlowBTMem, FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000411def : Proc<"athlon-tbird", [FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000412 FeatureSlowBTMem, FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000413def : Proc<"athlon-4", [FeatureSlowUAMem16, FeatureSSE1, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000414 FeatureSlowBTMem, FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000415def : Proc<"athlon-xp", [FeatureSlowUAMem16, FeatureSSE1, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000416 FeatureSlowBTMem, FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000417def : Proc<"athlon-mp", [FeatureSlowUAMem16, FeatureSSE1, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000418 FeatureSlowBTMem, FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000419def : Proc<"k8", [FeatureSlowUAMem16, FeatureSSE2, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000420 Feature64Bit, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000421 FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000422def : Proc<"opteron", [FeatureSlowUAMem16, FeatureSSE2, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000423 Feature64Bit, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000424 FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000425def : Proc<"athlon64", [FeatureSlowUAMem16, FeatureSSE2, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000426 Feature64Bit, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000427 FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000428def : Proc<"athlon-fx", [FeatureSlowUAMem16, FeatureSSE2, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000429 Feature64Bit, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000430 FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000431def : Proc<"k8-sse3", [FeatureSlowUAMem16, FeatureSSE3, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000432 FeatureCMPXCHG16B, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000433 FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000434def : Proc<"opteron-sse3", [FeatureSlowUAMem16, FeatureSSE3, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000435 FeatureCMPXCHG16B, FeatureSlowBTMem,
436 FeatureSlowSHLD]>;
Sanjay Patel30145672015-09-01 20:51:51 +0000437def : Proc<"athlon64-sse3", [FeatureSlowUAMem16, FeatureSSE3, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000438 FeatureCMPXCHG16B, FeatureSlowBTMem,
439 FeatureSlowSHLD]>;
Sanjay Pateldddad102015-08-21 20:39:17 +0000440def : Proc<"amdfam10", [FeatureSSE4A,
Benjamin Kramer5feb3da2011-11-30 15:48:16 +0000441 Feature3DNowA, FeatureCMPXCHG16B, FeatureLZCNT,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000442 FeaturePOPCNT, FeatureSlowBTMem,
443 FeatureSlowSHLD]>;
Sanjay Pateldddad102015-08-21 20:39:17 +0000444def : Proc<"barcelona", [FeatureSSE4A,
Chandler Carruthf57ac3b2014-12-09 14:25:55 +0000445 Feature3DNowA, FeatureCMPXCHG16B, FeatureLZCNT,
446 FeaturePOPCNT, FeatureSlowBTMem,
447 FeatureSlowSHLD]>;
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000448
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000449// Bobcat
450def : Proc<"btver1", [FeatureSSSE3, FeatureSSE4A, FeatureCMPXCHG16B,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000451 FeaturePRFCHW, FeatureLZCNT, FeaturePOPCNT,
Sanjay Pateldddad102015-08-21 20:39:17 +0000452 FeatureSlowSHLD]>;
Sanjay Patel1191adf2014-09-09 20:07:07 +0000453
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000454// Jaguar
Sanjay Patel1191adf2014-09-09 20:07:07 +0000455def : ProcessorModel<"btver2", BtVer2Model,
456 [FeatureAVX, FeatureSSE4A, FeatureCMPXCHG16B,
457 FeaturePRFCHW, FeatureAES, FeaturePCLMUL,
458 FeatureBMI, FeatureF16C, FeatureMOVBE,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000459 FeatureLZCNT, FeaturePOPCNT,
Sanjay Patel667a7e22015-06-04 01:32:35 +0000460 FeatureSlowSHLD]>;
Sanjay Patele57f3c02014-11-28 18:40:18 +0000461
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000462// Bulldozer
Craig Topperbae0e9e2012-05-01 06:54:48 +0000463def : Proc<"bdver1", [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
Yunzhong Gaodfc277f2013-10-16 19:04:11 +0000464 FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
Andrea Di Biagiof5b34e52014-11-04 21:18:09 +0000465 FeatureAVX, FeatureSSE4A, FeatureLZCNT,
Sanjay Pateldddad102015-08-21 20:39:17 +0000466 FeaturePOPCNT, FeatureSlowSHLD]>;
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000467// Piledriver
Craig Topperbae0e9e2012-05-01 06:54:48 +0000468def : Proc<"bdver2", [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
Yunzhong Gaodfc277f2013-10-16 19:04:11 +0000469 FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
Andrea Di Biagiof5b34e52014-11-04 21:18:09 +0000470 FeatureAVX, FeatureSSE4A, FeatureF16C,
471 FeatureLZCNT, FeaturePOPCNT, FeatureBMI,
Sanjay Pateldddad102015-08-21 20:39:17 +0000472 FeatureTBM, FeatureFMA, FeatureSlowSHLD]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000473
474// Steamroller
475def : Proc<"bdver3", [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
476 FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
Andrea Di Biagiof5b34e52014-11-04 21:18:09 +0000477 FeatureAVX, FeatureSSE4A, FeatureF16C,
478 FeatureLZCNT, FeaturePOPCNT, FeatureBMI,
479 FeatureTBM, FeatureFMA, FeatureSlowSHLD,
Sanjay Pateldddad102015-08-21 20:39:17 +0000480 FeatureFSGSBase]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000481
Benjamin Kramer60045732014-05-02 15:47:07 +0000482// Excavator
483def : Proc<"bdver4", [FeatureAVX2, FeatureXOP, FeatureFMA4,
484 FeatureCMPXCHG16B, FeatureAES, FeaturePRFCHW,
485 FeaturePCLMUL, FeatureF16C, FeatureLZCNT,
486 FeaturePOPCNT, FeatureBMI, FeatureBMI2,
Andrea Di Biagiof5b34e52014-11-04 21:18:09 +0000487 FeatureTBM, FeatureFMA, FeatureSSE4A,
Sanjay Pateldddad102015-08-21 20:39:17 +0000488 FeatureFSGSBase]>;
Benjamin Kramer60045732014-05-02 15:47:07 +0000489
Sanjay Patel30145672015-09-01 20:51:51 +0000490def : Proc<"geode", [FeatureSlowUAMem16, Feature3DNowA]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000491
Sanjay Patel30145672015-09-01 20:51:51 +0000492def : Proc<"winchip-c6", [FeatureSlowUAMem16, FeatureMMX]>;
493def : Proc<"winchip2", [FeatureSlowUAMem16, Feature3DNow]>;
494def : Proc<"c3", [FeatureSlowUAMem16, Feature3DNow]>;
495def : Proc<"c3-2", [FeatureSlowUAMem16, FeatureSSE1]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000496
Chandler Carruth32908d72014-05-07 17:37:03 +0000497// We also provide a generic 64-bit specific x86 processor model which tries to
498// be good for modern chips without enabling instruction set encodings past the
499// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
500// modern 64-bit x86 chip, and enables features that are generally beneficial.
Michael Liao5bf95782014-12-04 05:20:33 +0000501//
Chandler Carruth32908d72014-05-07 17:37:03 +0000502// We currently use the Sandy Bridge model as the default scheduling model as
503// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
504// covers a huge swath of x86 processors. If there are specific scheduling
505// knobs which need to be tuned differently for AMD chips, we might consider
506// forming a common base for them.
507def : ProcessorModel<"x86-64", SandyBridgeModel,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000508 [FeatureSSE2, Feature64Bit, FeatureSlowBTMem]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000509
Evan Chengff1beda2006-10-06 09:17:41 +0000510//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +0000511// Register File Description
512//===----------------------------------------------------------------------===//
513
514include "X86RegisterInfo.td"
515
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000516//===----------------------------------------------------------------------===//
517// Instruction Descriptions
518//===----------------------------------------------------------------------===//
519
Chris Lattner59a4a912003-08-03 21:54:21 +0000520include "X86InstrInfo.td"
521
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +0000522def X86InstrInfo : InstrInfo;
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000523
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000524//===----------------------------------------------------------------------===//
525// Calling Conventions
526//===----------------------------------------------------------------------===//
527
528include "X86CallingConv.td"
529
530
531//===----------------------------------------------------------------------===//
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000532// Assembly Parser
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000533//===----------------------------------------------------------------------===//
534
Daniel Dunbar00331992009-07-29 00:02:19 +0000535def ATTAsmParser : AsmParser {
Devang Patel4a6e7782012-01-12 18:03:40 +0000536 string AsmParserClassName = "AsmParser";
Devang Patel85d684a2012-01-09 19:13:28 +0000537}
538
539def ATTAsmParserVariant : AsmParserVariant {
Daniel Dunbar00331992009-07-29 00:02:19 +0000540 int Variant = 0;
Daniel Dunbare4318712009-08-11 20:59:47 +0000541
Chad Rosier9f7a2212013-04-18 22:35:36 +0000542 // Variant name.
543 string Name = "att";
544
Daniel Dunbare4318712009-08-11 20:59:47 +0000545 // Discard comments in assembly strings.
546 string CommentDelimiter = "#";
547
548 // Recognize hard coded registers.
549 string RegisterPrefix = "%";
Daniel Dunbar00331992009-07-29 00:02:19 +0000550}
551
Devang Patel67bf992a2012-01-10 17:51:54 +0000552def IntelAsmParserVariant : AsmParserVariant {
553 int Variant = 1;
554
Chad Rosier9f7a2212013-04-18 22:35:36 +0000555 // Variant name.
556 string Name = "intel";
557
Devang Patel67bf992a2012-01-10 17:51:54 +0000558 // Discard comments in assembly strings.
559 string CommentDelimiter = ";";
560
561 // Recognize hard coded registers.
562 string RegisterPrefix = "";
563}
564
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000565//===----------------------------------------------------------------------===//
566// Assembly Printers
567//===----------------------------------------------------------------------===//
568
Chris Lattner56832602004-10-03 20:36:57 +0000569// The X86 target supports two different syntaxes for emitting machine code.
570// This is controlled by the -x86-asm-syntax={att|intel}
571def ATTAsmWriter : AsmWriter {
Chris Lattner1cbd3de2009-09-13 19:30:11 +0000572 string AsmWriterClassName = "ATTInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000573 int Variant = 0;
574}
575def IntelAsmWriter : AsmWriter {
Chris Lattner13306a12009-09-20 07:47:59 +0000576 string AsmWriterClassName = "IntelInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000577 int Variant = 1;
578}
579
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000580def X86 : Target {
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000581 // Information about the instructions...
Chris Lattner25510802003-08-04 04:59:56 +0000582 let InstructionSet = X86InstrInfo;
Daniel Dunbar00331992009-07-29 00:02:19 +0000583 let AssemblyParsers = [ATTAsmParser];
Devang Patel67bf992a2012-01-10 17:51:54 +0000584 let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
Chris Lattner56832602004-10-03 20:36:57 +0000585 let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000586}