blob: b70bb9050624fed5506124fca2057f73735c1947 [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 Patele57f3c02014-11-28 18:40:18 +000082// FIXME: This is a 16-byte (SSE/AVX) feature; we should rename it to make that
83// explicit. Also, it seems this would be the default state for most chips
84// going forward, so it would probably be better to negate the logic and
85// match the 32-byte "slow mem" feature below.
Evan Cheng738b0f92010-04-01 05:58:17 +000086def FeatureFastUAMem : SubtargetFeature<"fast-unaligned-mem",
87 "IsUAMemFast", "true",
88 "Fast unaligned memory access">;
Sanjay Patel501890e2014-11-21 17:40:04 +000089def FeatureSlowUAMem32 : SubtargetFeature<"slow-unaligned-mem-32",
90 "IsUAMem32Slow", "true",
91 "Slow unaligned 32-byte memory access">;
Stefanus Du Toit96180b52009-05-26 21:04:35 +000092def FeatureSSE4A : SubtargetFeature<"sse4a", "HasSSE4A", "true",
Craig Toppera5d1fc22011-12-30 07:16:00 +000093 "Support SSE 4a instructions",
94 [FeatureSSE3]>;
Evan Chengff1beda2006-10-06 09:17:41 +000095
Craig Topperf287a452012-01-09 09:02:13 +000096def FeatureAVX : SubtargetFeature<"avx", "X86SSELevel", "AVX",
97 "Enable AVX instructions",
98 [FeatureSSE42]>;
99def FeatureAVX2 : SubtargetFeature<"avx2", "X86SSELevel", "AVX2",
Craig Topper228d9132011-10-30 19:57:21 +0000100 "Enable AVX2 instructions",
101 [FeatureAVX]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000102def FeatureAVX512 : SubtargetFeature<"avx512f", "X86SSELevel", "AVX512F",
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000103 "Enable AVX-512 instructions",
104 [FeatureAVX2]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000105def FeatureERI : SubtargetFeature<"avx512er", "HasERI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000106 "Enable AVX-512 Exponential and Reciprocal Instructions",
107 [FeatureAVX512]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000108def FeatureCDI : SubtargetFeature<"avx512cd", "HasCDI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000109 "Enable AVX-512 Conflict Detection Instructions",
110 [FeatureAVX512]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000111def FeaturePFI : SubtargetFeature<"avx512pf", "HasPFI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000112 "Enable AVX-512 PreFetch Instructions",
113 [FeatureAVX512]>;
Robert Khasanovbfa01312014-07-21 14:54:21 +0000114def FeatureDQI : SubtargetFeature<"avx512dq", "HasDQI", "true",
115 "Enable AVX-512 Doubleword and Quadword Instructions",
116 [FeatureAVX512]>;
117def FeatureBWI : SubtargetFeature<"avx512bw", "HasBWI", "true",
118 "Enable AVX-512 Byte and Word Instructions",
119 [FeatureAVX512]>;
120def FeatureVLX : SubtargetFeature<"avx512vl", "HasVLX", "true",
121 "Enable AVX-512 Vector Length eXtensions",
122 [FeatureAVX512]>;
Benjamin Kramera0396e42012-05-31 14:34:17 +0000123def FeaturePCLMUL : SubtargetFeature<"pclmul", "HasPCLMUL", "true",
124 "Enable packed carry-less multiplication instructions",
Craig Topper29dd1482012-05-01 05:28:32 +0000125 [FeatureSSE2]>;
Craig Topper79dbb0c2012-06-03 18:58:46 +0000126def FeatureFMA : SubtargetFeature<"fma", "HasFMA", "true",
Craig Toppere1bd0512011-12-29 19:46:19 +0000127 "Enable three-operand fused multiple-add",
128 [FeatureAVX]>;
David Greene8f6f72c2009-06-26 22:46:54 +0000129def FeatureFMA4 : SubtargetFeature<"fma4", "HasFMA4", "true",
Craig Toppera5d1fc22011-12-30 07:16:00 +0000130 "Enable four-operand fused multiple-add",
Craig Topperbae0e9e2012-05-01 06:54:48 +0000131 [FeatureAVX, FeatureSSE4A]>;
Craig Toppera5d1fc22011-12-30 07:16:00 +0000132def FeatureXOP : SubtargetFeature<"xop", "HasXOP", "true",
Craig Topper43518cc2012-05-01 05:41:41 +0000133 "Enable XOP instructions",
Anitha Boyapatiaf3e9832012-08-16 04:04:02 +0000134 [FeatureFMA4]>;
Sanjay Patelffd039b2015-02-03 17:13:04 +0000135def FeatureSSEUnalignedMem : SubtargetFeature<"sse-unaligned-mem",
136 "HasSSEUnalignedMem", "true",
137 "Allow unaligned memory operands with SSE instructions">;
Eric Christopher2ef63182010-04-02 21:54:27 +0000138def FeatureAES : SubtargetFeature<"aes", "HasAES", "true",
Craig Topper29dd1482012-05-01 05:28:32 +0000139 "Enable AES instructions",
140 [FeatureSSE2]>;
Yunzhong Gaodd36e932013-09-24 18:21:52 +0000141def FeatureTBM : SubtargetFeature<"tbm", "HasTBM", "true",
142 "Enable TBM instructions">;
Craig Topper786bdb92011-10-03 17:28:23 +0000143def FeatureMOVBE : SubtargetFeature<"movbe", "HasMOVBE", "true",
144 "Support MOVBE instruction">;
Rafael Espindola94a2c562013-08-23 20:21:34 +0000145def FeatureRDRAND : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
Craig Topper786bdb92011-10-03 17:28:23 +0000146 "Support RDRAND instruction">;
Craig Topperfe9179f2011-10-09 07:31:39 +0000147def FeatureF16C : SubtargetFeature<"f16c", "HasF16C", "true",
Craig Toppera6d204e2013-09-16 04:29:58 +0000148 "Support 16-bit floating point conversion instructions",
149 [FeatureAVX]>;
Craig Topper228d9132011-10-30 19:57:21 +0000150def FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
151 "Support FS/GS Base instructions">;
Craig Topper271064e2011-10-11 06:44:02 +0000152def FeatureLZCNT : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
153 "Support LZCNT instruction">;
Craig Topper3657fe42011-10-14 03:21:46 +0000154def FeatureBMI : SubtargetFeature<"bmi", "HasBMI", "true",
155 "Support BMI instructions">;
Craig Topperaea148c2011-10-16 07:55:05 +0000156def FeatureBMI2 : SubtargetFeature<"bmi2", "HasBMI2", "true",
157 "Support BMI2 instructions">;
Michael Liao73cffdd2012-11-08 07:28:54 +0000158def FeatureRTM : SubtargetFeature<"rtm", "HasRTM", "true",
159 "Support RTM instructions">;
Michael Liaoe344ec92013-03-26 22:46:02 +0000160def FeatureHLE : SubtargetFeature<"hle", "HasHLE", "true",
161 "Support HLE">;
Kay Tiong Khoof809c642013-02-14 19:08:21 +0000162def FeatureADX : SubtargetFeature<"adx", "HasADX", "true",
163 "Support ADX instructions">;
Ben Langmuir16501752013-09-12 15:51:31 +0000164def FeatureSHA : SubtargetFeature<"sha", "HasSHA", "true",
165 "Enable SHA instructions",
166 [FeatureSSE2]>;
Michael Liao5173ee02013-03-26 17:47:11 +0000167def FeaturePRFCHW : SubtargetFeature<"prfchw", "HasPRFCHW", "true",
168 "Support PRFCHW instructions">;
Michael Liaoa486a112013-03-28 23:41:26 +0000169def FeatureRDSEED : SubtargetFeature<"rdseed", "HasRDSEED", "true",
170 "Support RDSEED instruction">;
Elena Demikhovskyf7e641c2015-06-03 10:30:57 +0000171def FeatureMPX : SubtargetFeature<"mpx", "HasMPX", "true",
172 "Support MPX instructions">;
Evan Cheng1b81fdd2012-02-07 22:50:41 +0000173def FeatureLeaForSP : SubtargetFeature<"lea-sp", "UseLeaForSP", "true",
174 "Use LEA for adjusting the stack pointer">;
Alexey Volkovfd1731d2014-11-21 11:19:34 +0000175def FeatureSlowDivide32 : SubtargetFeature<"idivl-to-divb",
176 "HasSlowDivide32", "true",
177 "Use 8-bit divide for positive values less than 256">;
178def FeatureSlowDivide64 : SubtargetFeature<"idivq-to-divw",
179 "HasSlowDivide64", "true",
180 "Use 16-bit divide for positive values less than 65536">;
Preston Gurda01daac2013-01-08 18:27:24 +0000181def FeaturePadShortFunctions : SubtargetFeature<"pad-short-functions",
182 "PadShortFunctions", "true",
183 "Pad short functions">;
Preston Gurd663e6f92013-03-27 19:14:02 +0000184def FeatureCallRegIndirect : SubtargetFeature<"call-reg-indirect",
185 "CallRegIndirect", "true",
186 "Call register indirect">;
Preston Gurd8b7ab4b2013-04-25 20:29:37 +0000187def FeatureLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LEAUsesAG", "true",
188 "LEA instruction needs inputs at AG stage">;
Alexey Volkov6226de62014-05-20 08:55:50 +0000189def FeatureSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
190 "LEA instruction with certain arguments is slow">;
Alexey Volkov5260dba2014-06-09 11:40:41 +0000191def FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
192 "INC and DEC instructions are slower than ADD and SUB">;
Rafael Espindolacf8beec2015-06-03 05:32:44 +0000193def FeatureUseSqrtEst : SubtargetFeature<"use-sqrt-est", "UseSqrtEst", "true",
194 "Use RSQRT* to optimize square root calculations">;
195def FeatureUseRecipEst : SubtargetFeature<"use-recip-est", "UseReciprocalEst",
196 "true", "Use RCP* to optimize division calculations">;
Eric Christopher824f42f2015-05-12 01:26:05 +0000197def FeatureSoftFloat
198 : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
199 "Use software floating point features.">;
David Greene8f6f72c2009-06-26 22:46:54 +0000200
Evan Chengff1beda2006-10-06 09:17:41 +0000201//===----------------------------------------------------------------------===//
202// X86 processors supported.
203//===----------------------------------------------------------------------===//
204
Andrew Trick8523b162012-02-01 23:20:51 +0000205include "X86Schedule.td"
206
207def ProcIntelAtom : SubtargetFeature<"atom", "X86ProcFamily", "IntelAtom",
208 "Intel Atom processors">;
Preston Gurd3fe264d2013-09-13 19:23:28 +0000209def ProcIntelSLM : SubtargetFeature<"slm", "X86ProcFamily", "IntelSLM",
210 "Intel Silvermont processors">;
Andrew Trick8523b162012-02-01 23:20:51 +0000211
Evan Chengff1beda2006-10-06 09:17:41 +0000212class Proc<string Name, list<SubtargetFeature> Features>
Andrew Trick87255e32012-07-07 04:00:00 +0000213 : ProcessorModel<Name, GenericModel, Features>;
Andrew Trick8523b162012-02-01 23:20:51 +0000214
Evan Chengff1beda2006-10-06 09:17:41 +0000215def : Proc<"generic", []>;
216def : Proc<"i386", []>;
217def : Proc<"i486", []>;
Dale Johannesen28106752008-10-14 22:06:33 +0000218def : Proc<"i586", []>;
Evan Chengff1beda2006-10-06 09:17:41 +0000219def : Proc<"pentium", []>;
220def : Proc<"pentium-mmx", [FeatureMMX]>;
221def : Proc<"i686", []>;
Chris Lattnercc8c5812009-09-02 05:53:04 +0000222def : Proc<"pentiumpro", [FeatureCMOV]>;
223def : Proc<"pentium2", [FeatureMMX, FeatureCMOV]>;
Bill Wendling3fb7fdf2007-05-22 05:15:37 +0000224def : Proc<"pentium3", [FeatureSSE1]>;
Michael J. Spencer99737382011-05-03 03:42:50 +0000225def : Proc<"pentium3m", [FeatureSSE1, FeatureSlowBTMem]>;
Evan Cheng4c91aa32009-01-02 05:35:45 +0000226def : Proc<"pentium-m", [FeatureSSE2, FeatureSlowBTMem]>;
Bill Wendling3fb7fdf2007-05-22 05:15:37 +0000227def : Proc<"pentium4", [FeatureSSE2]>;
Michael J. Spencer99737382011-05-03 03:42:50 +0000228def : Proc<"pentium4m", [FeatureSSE2, FeatureSlowBTMem]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000229
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000230// Intel Core Duo.
231def : ProcessorModel<"yonah", SandyBridgeModel,
232 [FeatureSSE3, FeatureSlowBTMem]>;
233
234// NetBurst.
235def : Proc<"prescott", [FeatureSSE3, FeatureSlowBTMem]>;
236def : Proc<"nocona", [FeatureSSE3, FeatureCMPXCHG16B, FeatureSlowBTMem]>;
237
238// Intel Core 2 Solo/Duo.
239def : ProcessorModel<"core2", SandyBridgeModel,
240 [FeatureSSSE3, FeatureCMPXCHG16B, FeatureSlowBTMem]>;
241def : ProcessorModel<"penryn", SandyBridgeModel,
242 [FeatureSSE41, FeatureCMPXCHG16B, FeatureSlowBTMem]>;
243
Chandler Carruthaf8924032014-12-09 10:58:36 +0000244// Atom CPUs.
245class BonnellProc<string Name> : ProcessorModel<Name, AtomModel, [
246 ProcIntelAtom,
247 FeatureSSSE3,
248 FeatureCMPXCHG16B,
249 FeatureMOVBE,
250 FeatureSlowBTMem,
251 FeatureLeaForSP,
252 FeatureSlowDivide32,
253 FeatureSlowDivide64,
254 FeatureCallRegIndirect,
255 FeatureLEAUsesAG,
256 FeaturePadShortFunctions
257 ]>;
258def : BonnellProc<"bonnell">;
259def : BonnellProc<"atom">; // Pin the generic name to the baseline.
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000260
Chandler Carruthaf8924032014-12-09 10:58:36 +0000261class SilvermontProc<string Name> : ProcessorModel<Name, SLMModel, [
262 ProcIntelSLM,
263 FeatureSSE42,
264 FeatureCMPXCHG16B,
265 FeatureMOVBE,
266 FeaturePOPCNT,
267 FeaturePCLMUL,
268 FeatureAES,
269 FeatureSlowDivide64,
270 FeatureCallRegIndirect,
271 FeaturePRFCHW,
272 FeatureSlowLEA,
273 FeatureSlowIncDec,
274 FeatureSlowBTMem,
275 FeatureFastUAMem
276 ]>;
277def : SilvermontProc<"silvermont">;
278def : SilvermontProc<"slm">; // Legacy alias.
279
Eric Christopher2ef63182010-04-02 21:54:27 +0000280// "Arrandale" along with corei3 and corei5
Craig Topper3611d9b2015-03-30 06:31:11 +0000281class NehalemProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
282 FeatureSSE42,
283 FeatureCMPXCHG16B,
284 FeatureSlowBTMem,
285 FeatureFastUAMem,
286 FeaturePOPCNT
287 ]>;
288def : NehalemProc<"nehalem">;
289def : NehalemProc<"corei7">;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000290
Eric Christopher2ef63182010-04-02 21:54:27 +0000291// Westmere is a similar machine to nehalem with some additional features.
292// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
Chandler Carruthaf8924032014-12-09 10:58:36 +0000293class WestmereProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
294 FeatureSSE42,
295 FeatureCMPXCHG16B,
296 FeatureSlowBTMem,
297 FeatureFastUAMem,
298 FeaturePOPCNT,
299 FeatureAES,
300 FeaturePCLMUL
301 ]>;
302def : WestmereProc<"westmere">;
303
Nate Begeman8b08f522010-12-10 00:26:57 +0000304// SSE is not listed here since llvm treats AVX as a reimplementation of SSE,
305// rather than a superset.
Chandler Carruthaf8924032014-12-09 10:58:36 +0000306class SandyBridgeProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
307 FeatureAVX,
308 FeatureCMPXCHG16B,
309 FeatureFastUAMem,
310 FeatureSlowUAMem32,
311 FeaturePOPCNT,
312 FeatureAES,
313 FeaturePCLMUL
314 ]>;
315def : SandyBridgeProc<"sandybridge">;
316def : SandyBridgeProc<"corei7-avx">; // Legacy alias.
Evan Chengff1beda2006-10-06 09:17:41 +0000317
Chandler Carruthaf8924032014-12-09 10:58:36 +0000318class IvyBridgeProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
319 FeatureAVX,
320 FeatureCMPXCHG16B,
321 FeatureFastUAMem,
322 FeatureSlowUAMem32,
323 FeaturePOPCNT,
324 FeatureAES,
325 FeaturePCLMUL,
326 FeatureRDRAND,
327 FeatureF16C,
328 FeatureFSGSBase
329 ]>;
330def : IvyBridgeProc<"ivybridge">;
331def : IvyBridgeProc<"core-avx-i">; // Legacy alias.
Craig Topper3657fe42011-10-14 03:21:46 +0000332
Chandler Carruthaf8924032014-12-09 10:58:36 +0000333class HaswellProc<string Name> : ProcessorModel<Name, HaswellModel, [
334 FeatureAVX2,
335 FeatureCMPXCHG16B,
336 FeatureFastUAMem,
337 FeaturePOPCNT,
338 FeatureAES,
339 FeaturePCLMUL,
340 FeatureRDRAND,
341 FeatureF16C,
342 FeatureFSGSBase,
343 FeatureMOVBE,
344 FeatureLZCNT,
345 FeatureBMI,
346 FeatureBMI2,
347 FeatureFMA,
348 FeatureRTM,
349 FeatureHLE,
350 FeatureSlowIncDec
351 ]>;
352def : HaswellProc<"haswell">;
353def : HaswellProc<"core-avx2">; // Legacy alias.
354
355class BroadwellProc<string Name> : ProcessorModel<Name, HaswellModel, [
356 FeatureAVX2,
357 FeatureCMPXCHG16B,
358 FeatureFastUAMem,
359 FeaturePOPCNT,
360 FeatureAES,
361 FeaturePCLMUL,
362 FeatureRDRAND,
363 FeatureF16C,
364 FeatureFSGSBase,
365 FeatureMOVBE,
366 FeatureLZCNT,
367 FeatureBMI,
368 FeatureBMI2,
369 FeatureFMA,
370 FeatureRTM,
371 FeatureHLE,
372 FeatureADX,
373 FeatureRDSEED,
Chandler Carruthaf8924032014-12-09 10:58:36 +0000374 FeatureSlowIncDec
375 ]>;
376def : BroadwellProc<"broadwell">;
377
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000378// FIXME: define KNL model
Chandler Carruthaf8924032014-12-09 10:58:36 +0000379class KnightsLandingProc<string Name> : ProcessorModel<Name, HaswellModel,
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000380 [FeatureAVX512, FeatureERI, FeatureCDI, FeaturePFI,
381 FeatureCMPXCHG16B, FeatureFastUAMem, FeaturePOPCNT,
382 FeatureAES, FeaturePCLMUL, FeatureRDRAND, FeatureF16C,
383 FeatureFSGSBase, FeatureMOVBE, FeatureLZCNT, FeatureBMI,
Elena Demikhovsky678bd5b2014-07-02 14:11:05 +0000384 FeatureBMI2, FeatureFMA, FeatureRTM, FeatureHLE,
Elena Demikhovskyf7e641c2015-06-03 10:30:57 +0000385 FeatureSlowIncDec, FeatureMPX]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000386def : KnightsLandingProc<"knl">;
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000387
Robert Khasanovbfa01312014-07-21 14:54:21 +0000388// FIXME: define SKX model
Chandler Carruthaf8924032014-12-09 10:58:36 +0000389class SkylakeProc<string Name> : ProcessorModel<Name, HaswellModel,
Robert Khasanovbfa01312014-07-21 14:54:21 +0000390 [FeatureAVX512, FeatureCDI,
391 FeatureDQI, FeatureBWI, FeatureVLX,
392 FeatureCMPXCHG16B, FeatureFastUAMem, FeaturePOPCNT,
393 FeatureAES, FeaturePCLMUL, FeatureRDRAND, FeatureF16C,
394 FeatureFSGSBase, FeatureMOVBE, FeatureLZCNT, FeatureBMI,
395 FeatureBMI2, FeatureFMA, FeatureRTM, FeatureHLE,
Elena Demikhovskyf7e641c2015-06-03 10:30:57 +0000396 FeatureSlowIncDec, FeatureMPX]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000397def : SkylakeProc<"skylake">;
398def : SkylakeProc<"skx">; // Legacy alias.
399
400
401// AMD CPUs.
Robert Khasanovbfa01312014-07-21 14:54:21 +0000402
Evan Chengff1beda2006-10-06 09:17:41 +0000403def : Proc<"k6", [FeatureMMX]>;
Michael J. Spencer30088ba2011-04-15 00:32:41 +0000404def : Proc<"k6-2", [Feature3DNow]>;
405def : Proc<"k6-3", [Feature3DNow]>;
Alexey Volkovbb2f0472014-03-07 08:28:44 +0000406def : Proc<"athlon", [Feature3DNowA, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000407 FeatureSlowSHLD]>;
408def : Proc<"athlon-tbird", [Feature3DNowA, FeatureSlowBTMem,
409 FeatureSlowSHLD]>;
Michael Liao5bf95782014-12-04 05:20:33 +0000410def : Proc<"athlon-4", [FeatureSSE1, Feature3DNowA, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000411 FeatureSlowSHLD]>;
412def : Proc<"athlon-xp", [FeatureSSE1, Feature3DNowA, FeatureSlowBTMem,
413 FeatureSlowSHLD]>;
414def : Proc<"athlon-mp", [FeatureSSE1, Feature3DNowA, FeatureSlowBTMem,
415 FeatureSlowSHLD]>;
Dan Gohman74037512009-02-03 00:04:43 +0000416def : Proc<"k8", [FeatureSSE2, Feature3DNowA, Feature64Bit,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000417 FeatureSlowBTMem, FeatureSlowSHLD]>;
Dan Gohman74037512009-02-03 00:04:43 +0000418def : Proc<"opteron", [FeatureSSE2, Feature3DNowA, Feature64Bit,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000419 FeatureSlowBTMem, FeatureSlowSHLD]>;
Dan Gohman74037512009-02-03 00:04:43 +0000420def : Proc<"athlon64", [FeatureSSE2, Feature3DNowA, Feature64Bit,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000421 FeatureSlowBTMem, FeatureSlowSHLD]>;
Dan Gohman74037512009-02-03 00:04:43 +0000422def : Proc<"athlon-fx", [FeatureSSE2, Feature3DNowA, Feature64Bit,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000423 FeatureSlowBTMem, FeatureSlowSHLD]>;
Eli Friedman5e570422011-08-26 21:21:21 +0000424def : Proc<"k8-sse3", [FeatureSSE3, Feature3DNowA, FeatureCMPXCHG16B,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000425 FeatureSlowBTMem, FeatureSlowSHLD]>;
Eli Friedman5e570422011-08-26 21:21:21 +0000426def : Proc<"opteron-sse3", [FeatureSSE3, Feature3DNowA, FeatureCMPXCHG16B,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000427 FeatureSlowBTMem, FeatureSlowSHLD]>;
Eli Friedman5e570422011-08-26 21:21:21 +0000428def : Proc<"athlon64-sse3", [FeatureSSE3, Feature3DNowA, FeatureCMPXCHG16B,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000429 FeatureSlowBTMem, FeatureSlowSHLD]>;
Craig Topperbae0e9e2012-05-01 06:54:48 +0000430def : Proc<"amdfam10", [FeatureSSE4A,
Benjamin Kramer5feb3da2011-11-30 15:48:16 +0000431 Feature3DNowA, FeatureCMPXCHG16B, FeatureLZCNT,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000432 FeaturePOPCNT, FeatureSlowBTMem,
433 FeatureSlowSHLD]>;
Chandler Carruthf57ac3b2014-12-09 14:25:55 +0000434def : Proc<"barcelona", [FeatureSSE4A,
435 Feature3DNowA, FeatureCMPXCHG16B, FeatureLZCNT,
436 FeaturePOPCNT, FeatureSlowBTMem,
437 FeatureSlowSHLD]>;
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000438// Bobcat
439def : Proc<"btver1", [FeatureSSSE3, FeatureSSE4A, FeatureCMPXCHG16B,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000440 FeaturePRFCHW, FeatureLZCNT, FeaturePOPCNT,
441 FeatureSlowSHLD]>;
Sanjay Patel1191adf2014-09-09 20:07:07 +0000442
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000443// Jaguar
Sanjay Patel1191adf2014-09-09 20:07:07 +0000444def : ProcessorModel<"btver2", BtVer2Model,
445 [FeatureAVX, FeatureSSE4A, FeatureCMPXCHG16B,
446 FeaturePRFCHW, FeatureAES, FeaturePCLMUL,
447 FeatureBMI, FeatureF16C, FeatureMOVBE,
Sanjay Patele57f3c02014-11-28 18:40:18 +0000448 FeatureLZCNT, FeaturePOPCNT, FeatureFastUAMem,
Rafael Espindolacf8beec2015-06-03 05:32:44 +0000449 FeatureSlowSHLD, FeatureUseSqrtEst, FeatureUseRecipEst]>;
Sanjay Patele57f3c02014-11-28 18:40:18 +0000450
451// TODO: We should probably add 'FeatureFastUAMem' to all of the AMD chips.
Sanjay Patel1191adf2014-09-09 20:07:07 +0000452
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000453// Bulldozer
Craig Topperbae0e9e2012-05-01 06:54:48 +0000454def : Proc<"bdver1", [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
Yunzhong Gaodfc277f2013-10-16 19:04:11 +0000455 FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
Andrea Di Biagiof5b34e52014-11-04 21:18:09 +0000456 FeatureAVX, FeatureSSE4A, FeatureLZCNT,
457 FeaturePOPCNT, FeatureSlowSHLD]>;
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000458// Piledriver
Craig Topperbae0e9e2012-05-01 06:54:48 +0000459def : Proc<"bdver2", [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
Yunzhong Gaodfc277f2013-10-16 19:04:11 +0000460 FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
Andrea Di Biagiof5b34e52014-11-04 21:18:09 +0000461 FeatureAVX, FeatureSSE4A, FeatureF16C,
462 FeatureLZCNT, FeaturePOPCNT, FeatureBMI,
463 FeatureTBM, FeatureFMA, FeatureSlowSHLD]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000464
465// Steamroller
466def : Proc<"bdver3", [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
467 FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
Andrea Di Biagiof5b34e52014-11-04 21:18:09 +0000468 FeatureAVX, FeatureSSE4A, FeatureF16C,
469 FeatureLZCNT, FeaturePOPCNT, FeatureBMI,
470 FeatureTBM, FeatureFMA, FeatureSlowSHLD,
471 FeatureFSGSBase]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000472
Benjamin Kramer60045732014-05-02 15:47:07 +0000473// Excavator
474def : Proc<"bdver4", [FeatureAVX2, FeatureXOP, FeatureFMA4,
475 FeatureCMPXCHG16B, FeatureAES, FeaturePRFCHW,
476 FeaturePCLMUL, FeatureF16C, FeatureLZCNT,
477 FeaturePOPCNT, FeatureBMI, FeatureBMI2,
Andrea Di Biagiof5b34e52014-11-04 21:18:09 +0000478 FeatureTBM, FeatureFMA, FeatureSSE4A,
479 FeatureFSGSBase]>;
Benjamin Kramer60045732014-05-02 15:47:07 +0000480
Roman Divackyfd690092012-09-12 14:36:02 +0000481def : Proc<"geode", [Feature3DNowA]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000482
483def : Proc<"winchip-c6", [FeatureMMX]>;
Michael J. Spencer30088ba2011-04-15 00:32:41 +0000484def : Proc<"winchip2", [Feature3DNow]>;
485def : Proc<"c3", [Feature3DNow]>;
Bill Wendling3fb7fdf2007-05-22 05:15:37 +0000486def : Proc<"c3-2", [FeatureSSE1]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000487
Chandler Carruth32908d72014-05-07 17:37:03 +0000488// We also provide a generic 64-bit specific x86 processor model which tries to
489// be good for modern chips without enabling instruction set encodings past the
490// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
491// modern 64-bit x86 chip, and enables features that are generally beneficial.
Michael Liao5bf95782014-12-04 05:20:33 +0000492//
Chandler Carruth32908d72014-05-07 17:37:03 +0000493// We currently use the Sandy Bridge model as the default scheduling model as
494// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
495// covers a huge swath of x86 processors. If there are specific scheduling
496// knobs which need to be tuned differently for AMD chips, we might consider
497// forming a common base for them.
498def : ProcessorModel<"x86-64", SandyBridgeModel,
499 [FeatureSSE2, Feature64Bit, FeatureSlowBTMem,
500 FeatureFastUAMem]>;
501
Evan Chengff1beda2006-10-06 09:17:41 +0000502//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +0000503// Register File Description
504//===----------------------------------------------------------------------===//
505
506include "X86RegisterInfo.td"
507
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000508//===----------------------------------------------------------------------===//
509// Instruction Descriptions
510//===----------------------------------------------------------------------===//
511
Chris Lattner59a4a912003-08-03 21:54:21 +0000512include "X86InstrInfo.td"
513
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +0000514def X86InstrInfo : InstrInfo;
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000515
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000516//===----------------------------------------------------------------------===//
517// Calling Conventions
518//===----------------------------------------------------------------------===//
519
520include "X86CallingConv.td"
521
522
523//===----------------------------------------------------------------------===//
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000524// Assembly Parser
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000525//===----------------------------------------------------------------------===//
526
Daniel Dunbar00331992009-07-29 00:02:19 +0000527def ATTAsmParser : AsmParser {
Devang Patel4a6e7782012-01-12 18:03:40 +0000528 string AsmParserClassName = "AsmParser";
Devang Patel85d684a2012-01-09 19:13:28 +0000529}
530
531def ATTAsmParserVariant : AsmParserVariant {
Daniel Dunbar00331992009-07-29 00:02:19 +0000532 int Variant = 0;
Daniel Dunbare4318712009-08-11 20:59:47 +0000533
Chad Rosier9f7a2212013-04-18 22:35:36 +0000534 // Variant name.
535 string Name = "att";
536
Daniel Dunbare4318712009-08-11 20:59:47 +0000537 // Discard comments in assembly strings.
538 string CommentDelimiter = "#";
539
540 // Recognize hard coded registers.
541 string RegisterPrefix = "%";
Daniel Dunbar00331992009-07-29 00:02:19 +0000542}
543
Devang Patel67bf992a2012-01-10 17:51:54 +0000544def IntelAsmParserVariant : AsmParserVariant {
545 int Variant = 1;
546
Chad Rosier9f7a2212013-04-18 22:35:36 +0000547 // Variant name.
548 string Name = "intel";
549
Devang Patel67bf992a2012-01-10 17:51:54 +0000550 // Discard comments in assembly strings.
551 string CommentDelimiter = ";";
552
553 // Recognize hard coded registers.
554 string RegisterPrefix = "";
555}
556
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000557//===----------------------------------------------------------------------===//
558// Assembly Printers
559//===----------------------------------------------------------------------===//
560
Chris Lattner56832602004-10-03 20:36:57 +0000561// The X86 target supports two different syntaxes for emitting machine code.
562// This is controlled by the -x86-asm-syntax={att|intel}
563def ATTAsmWriter : AsmWriter {
Chris Lattner1cbd3de2009-09-13 19:30:11 +0000564 string AsmWriterClassName = "ATTInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000565 int Variant = 0;
566}
567def IntelAsmWriter : AsmWriter {
Chris Lattner13306a12009-09-20 07:47:59 +0000568 string AsmWriterClassName = "IntelInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000569 int Variant = 1;
570}
571
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000572def X86 : Target {
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000573 // Information about the instructions...
Chris Lattner25510802003-08-04 04:59:56 +0000574 let InstructionSet = X86InstrInfo;
Daniel Dunbar00331992009-07-29 00:02:19 +0000575 let AssemblyParsers = [ATTAsmParser];
Devang Patel67bf992a2012-01-10 17:51:54 +0000576 let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
Chris Lattner56832602004-10-03 20:36:57 +0000577 let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000578}