blob: fa363749fcc07c057254a3ac77af366a4bb51328 [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]>;
Craig Topper5c94bb82013-08-21 03:57:57 +0000130def FeaturePFI : SubtargetFeature<"avx512pf", "HasPFI", "true",
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000131 "Enable AVX-512 PreFetch Instructions",
132 [FeatureAVX512]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000133def FeaturePREFETCHWT1 : SubtargetFeature<"prefetchwt1", "HasPFPREFETCHWT1",
134 "true",
135 "Prefetch with Intent to Write and T1 Hint">;
Robert Khasanovbfa01312014-07-21 14:54:21 +0000136def FeatureDQI : SubtargetFeature<"avx512dq", "HasDQI", "true",
137 "Enable AVX-512 Doubleword and Quadword Instructions",
138 [FeatureAVX512]>;
139def FeatureBWI : SubtargetFeature<"avx512bw", "HasBWI", "true",
140 "Enable AVX-512 Byte and Word Instructions",
141 [FeatureAVX512]>;
142def FeatureVLX : SubtargetFeature<"avx512vl", "HasVLX", "true",
143 "Enable AVX-512 Vector Length eXtensions",
144 [FeatureAVX512]>;
Michael Zuckerman97b6a6922016-01-17 13:42:12 +0000145def FeatureVBMI : SubtargetFeature<"avx512vbmi", "HasVBMI", "true",
Craig Topper5c842be2016-11-09 04:50:48 +0000146 "Enable AVX-512 Vector Byte Manipulation Instructions",
147 [FeatureBWI]>;
Craig Topper3bb3f732016-02-08 01:23:15 +0000148def FeatureIFMA : SubtargetFeature<"avx512ifma", "HasIFMA", "true",
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000149 "Enable AVX-512 Integer Fused Multiple-Add",
150 [FeatureAVX512]>;
Asaf Badouh5acf66f2015-12-15 13:35:29 +0000151def FeaturePKU : SubtargetFeature<"pku", "HasPKU", "true",
152 "Enable protection keys">;
Benjamin Kramera0396e42012-05-31 14:34:17 +0000153def FeaturePCLMUL : SubtargetFeature<"pclmul", "HasPCLMUL", "true",
154 "Enable packed carry-less multiplication instructions",
Craig Topper29dd1482012-05-01 05:28:32 +0000155 [FeatureSSE2]>;
Craig Topper79dbb0c2012-06-03 18:58:46 +0000156def FeatureFMA : SubtargetFeature<"fma", "HasFMA", "true",
Craig Toppere1bd0512011-12-29 19:46:19 +0000157 "Enable three-operand fused multiple-add",
158 [FeatureAVX]>;
David Greene8f6f72c2009-06-26 22:46:54 +0000159def FeatureFMA4 : SubtargetFeature<"fma4", "HasFMA4", "true",
Craig Toppera5d1fc22011-12-30 07:16:00 +0000160 "Enable four-operand fused multiple-add",
Craig Topperbae0e9e2012-05-01 06:54:48 +0000161 [FeatureAVX, FeatureSSE4A]>;
Craig Toppera5d1fc22011-12-30 07:16:00 +0000162def FeatureXOP : SubtargetFeature<"xop", "HasXOP", "true",
Craig Topper43518cc2012-05-01 05:41:41 +0000163 "Enable XOP instructions",
Anitha Boyapatiaf3e9832012-08-16 04:04:02 +0000164 [FeatureFMA4]>;
Sanjay Patelffd039b2015-02-03 17:13:04 +0000165def FeatureSSEUnalignedMem : SubtargetFeature<"sse-unaligned-mem",
166 "HasSSEUnalignedMem", "true",
167 "Allow unaligned memory operands with SSE instructions">;
Eric Christopher2ef63182010-04-02 21:54:27 +0000168def FeatureAES : SubtargetFeature<"aes", "HasAES", "true",
Craig Topper29dd1482012-05-01 05:28:32 +0000169 "Enable AES instructions",
170 [FeatureSSE2]>;
Yunzhong Gaodd36e932013-09-24 18:21:52 +0000171def FeatureTBM : SubtargetFeature<"tbm", "HasTBM", "true",
172 "Enable TBM instructions">;
Craig Topper786bdb92011-10-03 17:28:23 +0000173def FeatureMOVBE : SubtargetFeature<"movbe", "HasMOVBE", "true",
174 "Support MOVBE instruction">;
Rafael Espindola94a2c562013-08-23 20:21:34 +0000175def FeatureRDRAND : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
Craig Topper786bdb92011-10-03 17:28:23 +0000176 "Support RDRAND instruction">;
Craig Topperfe9179f2011-10-09 07:31:39 +0000177def FeatureF16C : SubtargetFeature<"f16c", "HasF16C", "true",
Craig Toppera6d204e2013-09-16 04:29:58 +0000178 "Support 16-bit floating point conversion instructions",
179 [FeatureAVX]>;
Craig Topper228d9132011-10-30 19:57:21 +0000180def FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
181 "Support FS/GS Base instructions">;
Craig Topper271064e2011-10-11 06:44:02 +0000182def FeatureLZCNT : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
183 "Support LZCNT instruction">;
Craig Topper3657fe42011-10-14 03:21:46 +0000184def FeatureBMI : SubtargetFeature<"bmi", "HasBMI", "true",
185 "Support BMI instructions">;
Craig Topperaea148c2011-10-16 07:55:05 +0000186def FeatureBMI2 : SubtargetFeature<"bmi2", "HasBMI2", "true",
187 "Support BMI2 instructions">;
Michael Liao73cffdd2012-11-08 07:28:54 +0000188def FeatureRTM : SubtargetFeature<"rtm", "HasRTM", "true",
189 "Support RTM instructions">;
Michael Liaoe344ec92013-03-26 22:46:02 +0000190def FeatureHLE : SubtargetFeature<"hle", "HasHLE", "true",
191 "Support HLE">;
Kay Tiong Khoof809c642013-02-14 19:08:21 +0000192def FeatureADX : SubtargetFeature<"adx", "HasADX", "true",
193 "Support ADX instructions">;
Ben Langmuir16501752013-09-12 15:51:31 +0000194def FeatureSHA : SubtargetFeature<"sha", "HasSHA", "true",
195 "Enable SHA instructions",
196 [FeatureSSE2]>;
Michael Liao5173ee02013-03-26 17:47:11 +0000197def FeaturePRFCHW : SubtargetFeature<"prfchw", "HasPRFCHW", "true",
198 "Support PRFCHW instructions">;
Michael Liaoa486a112013-03-28 23:41:26 +0000199def FeatureRDSEED : SubtargetFeature<"rdseed", "HasRDSEED", "true",
200 "Support RDSEED instruction">;
Hans Wennborg5000ce82015-12-04 23:00:33 +0000201def FeatureLAHFSAHF : SubtargetFeature<"sahf", "HasLAHFSAHF", "true",
202 "Support LAHF and SAHF instructions">;
Ashutosh Nema348af9c2016-05-18 11:59:12 +0000203def FeatureMWAITX : SubtargetFeature<"mwaitx", "HasMWAITX", "true",
204 "Enable MONITORX/MWAITX timer functionality">;
Craig Topper50f3d142017-02-09 04:27:34 +0000205def FeatureCLZERO : SubtargetFeature<"clzero", "HasCLZERO", "true",
206 "Enable Cache Line Zero">;
Elena Demikhovskyf7e641c2015-06-03 10:30:57 +0000207def FeatureMPX : SubtargetFeature<"mpx", "HasMPX", "true",
208 "Support MPX instructions">;
Sanjay Patel53d1d8b2015-10-12 15:24:01 +0000209def FeatureLEAForSP : SubtargetFeature<"lea-sp", "UseLeaForSP", "true",
Evan Cheng1b81fdd2012-02-07 22:50:41 +0000210 "Use LEA for adjusting the stack pointer">;
Alexey Volkovfd1731d2014-11-21 11:19:34 +0000211def FeatureSlowDivide32 : SubtargetFeature<"idivl-to-divb",
212 "HasSlowDivide32", "true",
213 "Use 8-bit divide for positive values less than 256">;
Nikolai Bozhenov6bdf92c2017-01-12 19:34:15 +0000214def FeatureSlowDivide64 : SubtargetFeature<"idivq-to-divl",
Alexey Volkovfd1731d2014-11-21 11:19:34 +0000215 "HasSlowDivide64", "true",
Nikolai Bozhenov6bdf92c2017-01-12 19:34:15 +0000216 "Use 32-bit divide for positive values less than 2^32">;
Preston Gurda01daac2013-01-08 18:27:24 +0000217def FeaturePadShortFunctions : SubtargetFeature<"pad-short-functions",
218 "PadShortFunctions", "true",
219 "Pad short functions">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000220def FeatureINVPCID : SubtargetFeature<"invpcid", "HasInvPCId", "true",
221 "Invalidate Process-Context Identifier">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000222def FeatureSMAP : SubtargetFeature<"smap", "HasSMAP", "true",
223 "Supervisor Mode Access Protection">;
224def FeatureSGX : SubtargetFeature<"sgx", "HasSGX", "true",
225 "Enable Software Guard Extensions">;
226def FeatureCLFLUSHOPT : SubtargetFeature<"clflushopt", "HasCLFLUSHOPT", "true",
227 "Flush A Cache Line Optimized">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000228def FeatureCLWB : SubtargetFeature<"clwb", "HasCLWB", "true",
229 "Cache Line Write Back">;
Michael Kuperstein454d1452015-07-23 12:23:45 +0000230// TODO: This feature ought to be renamed.
Sean Silvae1c6b542015-07-27 00:46:59 +0000231// What it really refers to are CPUs for which certain instructions
232// (which ones besides the example below?) are microcoded.
Michael Kuperstein454d1452015-07-23 12:23:45 +0000233// The best examples of this are the memory forms of CALL and PUSH
234// instructions, which should be avoided in favor of a MOV + register CALL/PUSH.
Preston Gurd663e6f92013-03-27 19:14:02 +0000235def FeatureCallRegIndirect : SubtargetFeature<"call-reg-indirect",
236 "CallRegIndirect", "true",
237 "Call register indirect">;
Preston Gurd8b7ab4b2013-04-25 20:29:37 +0000238def FeatureLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LEAUsesAG", "true",
239 "LEA instruction needs inputs at AG stage">;
Alexey Volkov6226de62014-05-20 08:55:50 +0000240def FeatureSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
241 "LEA instruction with certain arguments is slow">;
Alexey Volkov5260dba2014-06-09 11:40:41 +0000242def FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
243 "INC and DEC instructions are slower than ADD and SUB">;
Eric Christopher824f42f2015-05-12 01:26:05 +0000244def FeatureSoftFloat
245 : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
246 "Use software floating point features.">;
Yunzhong Gao0de36ec2016-02-12 23:37:57 +0000247// On at least some AMD processors, there is no performance hazard to writing
248// only the lower parts of a YMM register without clearing the upper part.
249def FeatureFastPartialYMMWrite
250 : SubtargetFeature<"fast-partial-ymm-write", "HasFastPartialYMMWrite",
251 "true", "Partial writes to YMM registers are fast">;
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000252// FeatureFastScalarFSQRT should be enabled if scalar FSQRT has shorter latency
253// than the corresponding NR code. FeatureFastVectorFSQRT should be enabled if
254// vector FSQRT has higher throughput than the corresponding NR code.
255// The idea is that throughput bound code is likely to be vectorized, so for
256// vectorized code we should care about the throughput of SQRT operations.
257// But if the code is scalar that probably means that the code has some kind of
258// dependency and we should care more about reducing the latency.
259def FeatureFastScalarFSQRT
260 : SubtargetFeature<"fast-scalar-fsqrt", "HasFastScalarFSQRT",
261 "true", "Scalar SQRT is fast (disable Newton-Raphson)">;
262def FeatureFastVectorFSQRT
263 : SubtargetFeature<"fast-vector-fsqrt", "HasFastVectorFSQRT",
264 "true", "Vector SQRT is fast (disable Newton-Raphson)">;
Pierre Gousseaub6d652a2016-10-14 16:41:38 +0000265// If lzcnt has equivalent latency/throughput to most simple integer ops, it can
266// be used to replace test/set sequences.
267def FeatureFastLZCNT
268 : SubtargetFeature<
269 "fast-lzcnt", "HasFastLZCNT", "true",
270 "LZCNT instructions are as fast as most simple integer ops">;
David Greene8f6f72c2009-06-26 22:46:54 +0000271
Evan Chengff1beda2006-10-06 09:17:41 +0000272//===----------------------------------------------------------------------===//
273// X86 processors supported.
274//===----------------------------------------------------------------------===//
275
Andrew Trick8523b162012-02-01 23:20:51 +0000276include "X86Schedule.td"
277
278def ProcIntelAtom : SubtargetFeature<"atom", "X86ProcFamily", "IntelAtom",
279 "Intel Atom processors">;
Preston Gurd3fe264d2013-09-13 19:23:28 +0000280def ProcIntelSLM : SubtargetFeature<"slm", "X86ProcFamily", "IntelSLM",
281 "Intel Silvermont processors">;
Andrew Trick8523b162012-02-01 23:20:51 +0000282
Evan Chengff1beda2006-10-06 09:17:41 +0000283class Proc<string Name, list<SubtargetFeature> Features>
Andrew Trick87255e32012-07-07 04:00:00 +0000284 : ProcessorModel<Name, GenericModel, Features>;
Andrew Trick8523b162012-02-01 23:20:51 +0000285
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000286def : Proc<"generic", [FeatureX87, FeatureSlowUAMem16]>;
287def : Proc<"i386", [FeatureX87, FeatureSlowUAMem16]>;
288def : Proc<"i486", [FeatureX87, FeatureSlowUAMem16]>;
289def : Proc<"i586", [FeatureX87, FeatureSlowUAMem16]>;
290def : Proc<"pentium", [FeatureX87, FeatureSlowUAMem16]>;
291def : Proc<"pentium-mmx", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
292def : Proc<"i686", [FeatureX87, FeatureSlowUAMem16]>;
293def : Proc<"pentiumpro", [FeatureX87, FeatureSlowUAMem16, FeatureCMOV]>;
294def : Proc<"pentium2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
295 FeatureCMOV, FeatureFXSR]>;
296def : Proc<"pentium3", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
297 FeatureSSE1, FeatureFXSR]>;
298def : Proc<"pentium3m", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
299 FeatureSSE1, FeatureFXSR, FeatureSlowBTMem]>;
Mitch Bodarte60465d2016-04-27 22:52:35 +0000300
301// Enable the PostRAScheduler for SSE2 and SSE3 class cpus.
302// The intent is to enable it for pentium4 which is the current default
303// processor in a vanilla 32-bit clang compilation when no specific
304// architecture is specified. This generally gives a nice performance
305// increase on silvermont, with largely neutral behavior on other
306// contemporary large core processors.
307// pentium-m, pentium4m, prescott and nocona are included as a preventative
308// measure to avoid performance surprises, in case clang's default cpu
309// changes slightly.
310
311def : ProcessorModel<"pentium-m", GenericPostRAModel,
312 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
313 FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
314
315def : ProcessorModel<"pentium4", GenericPostRAModel,
316 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
317 FeatureSSE2, FeatureFXSR]>;
318
319def : ProcessorModel<"pentium4m", GenericPostRAModel,
320 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
321 FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000322
Andrey Turetskiy958eb462016-04-01 10:16:15 +0000323// Intel Quark.
324def : Proc<"lakemont", []>;
325
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000326// Intel Core Duo.
Craig Topper09b65982015-10-16 06:03:09 +0000327def : ProcessorModel<"yonah", SandyBridgeModel,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000328 [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
329 FeatureFXSR, FeatureSlowBTMem]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000330
331// NetBurst.
Mitch Bodarte60465d2016-04-27 22:52:35 +0000332def : ProcessorModel<"prescott", GenericPostRAModel,
333 [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
334 FeatureFXSR, FeatureSlowBTMem]>;
335def : ProcessorModel<"nocona", GenericPostRAModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000336 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000337 FeatureSlowUAMem16,
338 FeatureMMX,
339 FeatureSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000340 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000341 FeatureCMPXCHG16B,
342 FeatureSlowBTMem
343]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000344
345// Intel Core 2 Solo/Duo.
Eric Christopher11e59832015-10-08 20:10:06 +0000346def : ProcessorModel<"core2", SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000347 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000348 FeatureSlowUAMem16,
349 FeatureMMX,
350 FeatureSSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000351 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000352 FeatureCMPXCHG16B,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000353 FeatureSlowBTMem,
354 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000355]>;
356def : ProcessorModel<"penryn", SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000357 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000358 FeatureSlowUAMem16,
359 FeatureMMX,
360 FeatureSSE41,
Craig Topper09b65982015-10-16 06:03:09 +0000361 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000362 FeatureCMPXCHG16B,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000363 FeatureSlowBTMem,
364 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000365]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000366
Chandler Carruthaf8924032014-12-09 10:58:36 +0000367// Atom CPUs.
368class BonnellProc<string Name> : ProcessorModel<Name, AtomModel, [
Eric Christopher11e59832015-10-08 20:10:06 +0000369 ProcIntelAtom,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000370 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000371 FeatureSlowUAMem16,
372 FeatureMMX,
373 FeatureSSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000374 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000375 FeatureCMPXCHG16B,
376 FeatureMOVBE,
377 FeatureSlowBTMem,
Sanjay Patel53d1d8b2015-10-12 15:24:01 +0000378 FeatureLEAForSP,
Eric Christopher11e59832015-10-08 20:10:06 +0000379 FeatureSlowDivide32,
380 FeatureSlowDivide64,
381 FeatureCallRegIndirect,
382 FeatureLEAUsesAG,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000383 FeaturePadShortFunctions,
384 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000385]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000386def : BonnellProc<"bonnell">;
387def : BonnellProc<"atom">; // Pin the generic name to the baseline.
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000388
Chandler Carruthaf8924032014-12-09 10:58:36 +0000389class SilvermontProc<string Name> : ProcessorModel<Name, SLMModel, [
Eric Christopher11e59832015-10-08 20:10:06 +0000390 ProcIntelSLM,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000391 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000392 FeatureMMX,
393 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000394 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000395 FeatureCMPXCHG16B,
396 FeatureMOVBE,
397 FeaturePOPCNT,
398 FeaturePCLMUL,
399 FeatureAES,
400 FeatureSlowDivide64,
401 FeatureCallRegIndirect,
402 FeaturePRFCHW,
403 FeatureSlowLEA,
404 FeatureSlowIncDec,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000405 FeatureSlowBTMem,
Zvi Rackover8bc7e4d2016-12-06 19:35:20 +0000406 FeatureSlowPMULLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000407 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000408]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000409def : SilvermontProc<"silvermont">;
410def : SilvermontProc<"slm">; // Legacy alias.
411
Eric Christopher2ef63182010-04-02 21:54:27 +0000412// "Arrandale" along with corei3 and corei5
Craig Topper3611d9b2015-03-30 06:31:11 +0000413class NehalemProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000414 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000415 FeatureMMX,
416 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000417 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000418 FeatureCMPXCHG16B,
419 FeatureSlowBTMem,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000420 FeaturePOPCNT,
421 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000422]>;
Craig Topper3611d9b2015-03-30 06:31:11 +0000423def : NehalemProc<"nehalem">;
424def : NehalemProc<"corei7">;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000425
Eric Christopher2ef63182010-04-02 21:54:27 +0000426// Westmere is a similar machine to nehalem with some additional features.
427// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
Chandler Carruthaf8924032014-12-09 10:58:36 +0000428class WestmereProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000429 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000430 FeatureMMX,
431 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000432 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000433 FeatureCMPXCHG16B,
434 FeatureSlowBTMem,
435 FeaturePOPCNT,
436 FeatureAES,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000437 FeaturePCLMUL,
438 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000439]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000440def : WestmereProc<"westmere">;
441
Craig Topperf730a6b2016-02-13 21:35:37 +0000442class ProcessorFeatures<list<SubtargetFeature> Inherited,
443 list<SubtargetFeature> NewFeatures> {
444 list<SubtargetFeature> Value = !listconcat(Inherited, NewFeatures);
445}
446
447class ProcModel<string Name, SchedMachineModel Model,
448 list<SubtargetFeature> ProcFeatures,
449 list<SubtargetFeature> OtherFeatures> :
450 ProcessorModel<Name, Model, !listconcat(ProcFeatures, OtherFeatures)>;
451
Nate Begeman8b08f522010-12-10 00:26:57 +0000452// SSE is not listed here since llvm treats AVX as a reimplementation of SSE,
453// rather than a superset.
Craig Topperf730a6b2016-02-13 21:35:37 +0000454def SNBFeatures : ProcessorFeatures<[], [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000455 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000456 FeatureMMX,
457 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000458 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000459 FeatureCMPXCHG16B,
Eric Christopher11e59832015-10-08 20:10:06 +0000460 FeaturePOPCNT,
461 FeatureAES,
Nikolai Bozhenov6bdf92c2017-01-12 19:34:15 +0000462 FeatureSlowDivide64,
Craig Topper0ee35692015-10-14 05:37:38 +0000463 FeaturePCLMUL,
464 FeatureXSAVE,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000465 FeatureXSAVEOPT,
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000466 FeatureLAHFSAHF,
467 FeatureFastScalarFSQRT
Eric Christopher11e59832015-10-08 20:10:06 +0000468]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000469
Craig Topperf730a6b2016-02-13 21:35:37 +0000470class SandyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
471 SNBFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000472 FeatureSlowBTMem,
473 FeatureSlowUAMem32
474]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000475def : SandyBridgeProc<"sandybridge">;
476def : SandyBridgeProc<"corei7-avx">; // Legacy alias.
Evan Chengff1beda2006-10-06 09:17:41 +0000477
Craig Topperf730a6b2016-02-13 21:35:37 +0000478def IVBFeatures : ProcessorFeatures<SNBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000479 FeatureRDRAND,
480 FeatureF16C,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000481 FeatureFSGSBase
482]>;
483
Craig Topperf730a6b2016-02-13 21:35:37 +0000484class IvyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
485 IVBFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000486 FeatureSlowBTMem,
487 FeatureSlowUAMem32
Eric Christopher11e59832015-10-08 20:10:06 +0000488]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000489def : IvyBridgeProc<"ivybridge">;
490def : IvyBridgeProc<"core-avx-i">; // Legacy alias.
Craig Topper3657fe42011-10-14 03:21:46 +0000491
Craig Topperf730a6b2016-02-13 21:35:37 +0000492def HSWFeatures : ProcessorFeatures<IVBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000493 FeatureAVX2,
Eric Christopher11e59832015-10-08 20:10:06 +0000494 FeatureBMI,
495 FeatureBMI2,
496 FeatureFMA,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000497 FeatureLZCNT,
498 FeatureMOVBE,
499 FeatureINVPCID,
Eric Christopher11e59832015-10-08 20:10:06 +0000500 FeatureRTM,
501 FeatureHLE,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000502 FeatureSlowIncDec
Eric Christopher11e59832015-10-08 20:10:06 +0000503]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000504
Craig Topperf730a6b2016-02-13 21:35:37 +0000505class HaswellProc<string Name> : ProcModel<Name, HaswellModel,
506 HSWFeatures.Value, []>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000507def : HaswellProc<"haswell">;
508def : HaswellProc<"core-avx2">; // Legacy alias.
509
Craig Topperf730a6b2016-02-13 21:35:37 +0000510def BDWFeatures : ProcessorFeatures<HSWFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000511 FeatureADX,
512 FeatureRDSEED,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000513 FeatureSMAP
Eric Christopher11e59832015-10-08 20:10:06 +0000514]>;
Craig Topperf730a6b2016-02-13 21:35:37 +0000515class BroadwellProc<string Name> : ProcModel<Name, HaswellModel,
516 BDWFeatures.Value, []>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000517def : BroadwellProc<"broadwell">;
518
Craig Topperf730a6b2016-02-13 21:35:37 +0000519def SKLFeatures : ProcessorFeatures<BDWFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000520 FeatureMPX,
521 FeatureXSAVEC,
522 FeatureXSAVES,
523 FeatureSGX,
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000524 FeatureCLFLUSHOPT,
525 FeatureFastVectorFSQRT
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000526]>;
527
528// FIXME: define SKL model
Craig Topperf730a6b2016-02-13 21:35:37 +0000529class SkylakeClientProc<string Name> : ProcModel<Name, HaswellModel,
530 SKLFeatures.Value, []>;
Sanjoy Dasaa63dc02016-02-21 17:12:03 +0000531def : SkylakeClientProc<"skylake">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000532
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000533// FIXME: define KNL model
Craig Topperf730a6b2016-02-13 21:35:37 +0000534class KnightsLandingProc<string Name> : ProcModel<Name, HaswellModel,
535 IVBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000536 FeatureAVX512,
537 FeatureERI,
538 FeatureCDI,
539 FeaturePFI,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000540 FeaturePREFETCHWT1,
541 FeatureADX,
542 FeatureRDSEED,
Eric Christopher11e59832015-10-08 20:10:06 +0000543 FeatureMOVBE,
544 FeatureLZCNT,
545 FeatureBMI,
546 FeatureBMI2,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000547 FeatureFMA
Eric Christopher11e59832015-10-08 20:10:06 +0000548]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000549def : KnightsLandingProc<"knl">;
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000550
Craig Topperf730a6b2016-02-13 21:35:37 +0000551def SKXFeatures : ProcessorFeatures<SKLFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000552 FeatureAVX512,
553 FeatureCDI,
554 FeatureDQI,
555 FeatureBWI,
556 FeatureVLX,
Asaf Badouh5acf66f2015-12-15 13:35:29 +0000557 FeaturePKU,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000558 FeatureCLWB
Eric Christopher11e59832015-10-08 20:10:06 +0000559]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000560
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000561// FIXME: define SKX model
Craig Topperf730a6b2016-02-13 21:35:37 +0000562class SkylakeServerProc<string Name> : ProcModel<Name, HaswellModel,
563 SKXFeatures.Value, []>;
Sanjoy Dasaa63dc02016-02-21 17:12:03 +0000564def : SkylakeServerProc<"skylake-avx512">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000565def : SkylakeServerProc<"skx">; // Legacy alias.
566
Craig Topperf730a6b2016-02-13 21:35:37 +0000567def CNLFeatures : ProcessorFeatures<SKXFeatures.Value, [
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000568 FeatureVBMI,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000569 FeatureIFMA,
570 FeatureSHA
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000571]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000572
Craig Topperf730a6b2016-02-13 21:35:37 +0000573class CannonlakeProc<string Name> : ProcModel<Name, HaswellModel,
574 CNLFeatures.Value, []>;
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000575def : CannonlakeProc<"cannonlake">;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000576
577// AMD CPUs.
Robert Khasanovbfa01312014-07-21 14:54:21 +0000578
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000579def : Proc<"k6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
580def : Proc<"k6-2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
581def : Proc<"k6-3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
582def : Proc<"athlon", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000583 FeatureSlowBTMem, FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000584def : Proc<"athlon-tbird", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000585 FeatureSlowBTMem, FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000586def : Proc<"athlon-4", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
587 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000588 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000589def : Proc<"athlon-xp", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
590 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000591 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000592def : Proc<"athlon-mp", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
593 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000594 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000595def : Proc<"k8", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
596 Feature3DNowA, FeatureFXSR, Feature64Bit,
597 FeatureSlowBTMem, FeatureSlowSHLD]>;
598def : Proc<"opteron", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
599 Feature3DNowA, FeatureFXSR, Feature64Bit,
600 FeatureSlowBTMem, FeatureSlowSHLD]>;
601def : Proc<"athlon64", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
602 Feature3DNowA, FeatureFXSR, Feature64Bit,
603 FeatureSlowBTMem, FeatureSlowSHLD]>;
604def : Proc<"athlon-fx", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
605 Feature3DNowA, FeatureFXSR, Feature64Bit,
606 FeatureSlowBTMem, FeatureSlowSHLD]>;
607def : Proc<"k8-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
608 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
609 FeatureSlowBTMem, FeatureSlowSHLD]>;
610def : Proc<"opteron-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
611 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
612 FeatureSlowBTMem, FeatureSlowSHLD]>;
613def : Proc<"athlon64-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
614 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
615 FeatureSlowBTMem, FeatureSlowSHLD]>;
616def : Proc<"amdfam10", [FeatureX87, FeatureSSE4A, Feature3DNowA,
617 FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
618 FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
619 FeatureLAHFSAHF]>;
620def : Proc<"barcelona", [FeatureX87, FeatureSSE4A, Feature3DNowA,
621 FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
622 FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
623 FeatureLAHFSAHF]>;
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000624
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000625// Bobcat
Eric Christopher11e59832015-10-08 20:10:06 +0000626def : Proc<"btver1", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000627 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000628 FeatureMMX,
629 FeatureSSSE3,
630 FeatureSSE4A,
Craig Topper09b65982015-10-16 06:03:09 +0000631 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000632 FeatureCMPXCHG16B,
633 FeaturePRFCHW,
634 FeatureLZCNT,
635 FeaturePOPCNT,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000636 FeatureSlowSHLD,
637 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000638]>;
Sanjay Patel1191adf2014-09-09 20:07:07 +0000639
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000640// Jaguar
Eric Christopher11e59832015-10-08 20:10:06 +0000641def : ProcessorModel<"btver2", BtVer2Model, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000642 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000643 FeatureMMX,
644 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000645 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000646 FeatureSSE4A,
647 FeatureCMPXCHG16B,
648 FeaturePRFCHW,
649 FeatureAES,
650 FeaturePCLMUL,
651 FeatureBMI,
652 FeatureF16C,
653 FeatureMOVBE,
654 FeatureLZCNT,
Pierre Gousseaub6d652a2016-10-14 16:41:38 +0000655 FeatureFastLZCNT,
Eric Christopher11e59832015-10-08 20:10:06 +0000656 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000657 FeatureXSAVE,
658 FeatureXSAVEOPT,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000659 FeatureSlowSHLD,
Yunzhong Gao0de36ec2016-02-12 23:37:57 +0000660 FeatureLAHFSAHF,
661 FeatureFastPartialYMMWrite
Eric Christopher11e59832015-10-08 20:10:06 +0000662]>;
Sanjay Patele57f3c02014-11-28 18:40:18 +0000663
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000664// Bulldozer
Eric Christopher11e59832015-10-08 20:10:06 +0000665def : Proc<"bdver1", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000666 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000667 FeatureXOP,
668 FeatureFMA4,
669 FeatureCMPXCHG16B,
670 FeatureAES,
671 FeaturePRFCHW,
672 FeaturePCLMUL,
673 FeatureMMX,
674 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000675 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000676 FeatureSSE4A,
677 FeatureLZCNT,
678 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000679 FeatureXSAVE,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000680 FeatureSlowSHLD,
681 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000682]>;
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000683// Piledriver
Eric Christopher11e59832015-10-08 20:10:06 +0000684def : Proc<"bdver2", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000685 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000686 FeatureXOP,
687 FeatureFMA4,
688 FeatureCMPXCHG16B,
689 FeatureAES,
690 FeaturePRFCHW,
691 FeaturePCLMUL,
692 FeatureMMX,
693 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000694 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000695 FeatureSSE4A,
696 FeatureF16C,
697 FeatureLZCNT,
698 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000699 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000700 FeatureBMI,
701 FeatureTBM,
702 FeatureFMA,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000703 FeatureSlowSHLD,
704 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000705]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000706
707// Steamroller
Eric Christopher11e59832015-10-08 20:10:06 +0000708def : Proc<"bdver3", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000709 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000710 FeatureXOP,
711 FeatureFMA4,
712 FeatureCMPXCHG16B,
713 FeatureAES,
714 FeaturePRFCHW,
715 FeaturePCLMUL,
716 FeatureMMX,
717 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000718 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000719 FeatureSSE4A,
720 FeatureF16C,
721 FeatureLZCNT,
722 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000723 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000724 FeatureBMI,
725 FeatureTBM,
726 FeatureFMA,
Craig Topper0ee35692015-10-14 05:37:38 +0000727 FeatureXSAVEOPT,
Eric Christopher11e59832015-10-08 20:10:06 +0000728 FeatureSlowSHLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000729 FeatureFSGSBase,
730 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000731]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000732
Benjamin Kramer60045732014-05-02 15:47:07 +0000733// Excavator
Eric Christopher11e59832015-10-08 20:10:06 +0000734def : Proc<"bdver4", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000735 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000736 FeatureMMX,
737 FeatureAVX2,
Craig Topper09b65982015-10-16 06:03:09 +0000738 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000739 FeatureXOP,
740 FeatureFMA4,
741 FeatureCMPXCHG16B,
742 FeatureAES,
743 FeaturePRFCHW,
744 FeaturePCLMUL,
745 FeatureF16C,
746 FeatureLZCNT,
747 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000748 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000749 FeatureBMI,
750 FeatureBMI2,
751 FeatureTBM,
752 FeatureFMA,
Craig Topper0ee35692015-10-14 05:37:38 +0000753 FeatureXSAVEOPT,
Simon Pilgrim381a0ad2016-07-24 16:00:53 +0000754 FeatureSlowSHLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000755 FeatureFSGSBase,
Ashutosh Nema348af9c2016-05-18 11:59:12 +0000756 FeatureLAHFSAHF,
757 FeatureMWAITX
Eric Christopher11e59832015-10-08 20:10:06 +0000758]>;
Benjamin Kramer60045732014-05-02 15:47:07 +0000759
Craig Topperd55b8312017-01-10 06:01:16 +0000760// TODO: The scheduler model falls to BTVER2 model.
761// The znver1 model has to be put in place.
762// Zen
763def: ProcessorModel<"znver1", BtVer2Model, [
764 FeatureADX,
765 FeatureAES,
766 FeatureAVX2,
767 FeatureBMI,
768 FeatureBMI2,
769 FeatureCLFLUSHOPT,
Craig Topper50f3d142017-02-09 04:27:34 +0000770 FeatureCLZERO,
Craig Topperd55b8312017-01-10 06:01:16 +0000771 FeatureCMPXCHG16B,
772 FeatureF16C,
773 FeatureFMA,
774 FeatureFSGSBase,
775 FeatureFXSR,
776 FeatureFastLZCNT,
777 FeatureLAHFSAHF,
778 FeatureLZCNT,
779 FeatureMMX,
780 FeatureMOVBE,
781 FeatureMWAITX,
782 FeaturePCLMUL,
783 FeaturePOPCNT,
784 FeaturePRFCHW,
785 FeatureRDRAND,
786 FeatureRDSEED,
787 FeatureSHA,
788 FeatureSMAP,
789 FeatureSSE4A,
790 FeatureSlowSHLD,
791 FeatureX87,
792 FeatureXSAVE,
793 FeatureXSAVEC,
794 FeatureXSAVEOPT,
795 FeatureXSAVES]>;
796
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000797def : Proc<"geode", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000798
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000799def : Proc<"winchip-c6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
800def : Proc<"winchip2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
801def : Proc<"c3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
802def : Proc<"c3-2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
803 FeatureSSE1, FeatureFXSR]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000804
Chandler Carruth32908d72014-05-07 17:37:03 +0000805// We also provide a generic 64-bit specific x86 processor model which tries to
806// be good for modern chips without enabling instruction set encodings past the
807// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
808// modern 64-bit x86 chip, and enables features that are generally beneficial.
Michael Liao5bf95782014-12-04 05:20:33 +0000809//
Chandler Carruth32908d72014-05-07 17:37:03 +0000810// We currently use the Sandy Bridge model as the default scheduling model as
811// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
812// covers a huge swath of x86 processors. If there are specific scheduling
813// knobs which need to be tuned differently for AMD chips, we might consider
814// forming a common base for them.
Craig Topper09b65982015-10-16 06:03:09 +0000815def : ProcessorModel<"x86-64", SandyBridgeModel,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000816 [FeatureX87, FeatureMMX, FeatureSSE2, FeatureFXSR,
817 Feature64Bit, FeatureSlowBTMem ]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000818
Evan Chengff1beda2006-10-06 09:17:41 +0000819//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +0000820// Register File Description
821//===----------------------------------------------------------------------===//
822
823include "X86RegisterInfo.td"
824
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000825//===----------------------------------------------------------------------===//
826// Instruction Descriptions
827//===----------------------------------------------------------------------===//
828
Chris Lattner59a4a912003-08-03 21:54:21 +0000829include "X86InstrInfo.td"
830
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +0000831def X86InstrInfo : InstrInfo;
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000832
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000833//===----------------------------------------------------------------------===//
834// Calling Conventions
835//===----------------------------------------------------------------------===//
836
837include "X86CallingConv.td"
838
839
840//===----------------------------------------------------------------------===//
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000841// Assembly Parser
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000842//===----------------------------------------------------------------------===//
843
Devang Patel85d684a2012-01-09 19:13:28 +0000844def ATTAsmParserVariant : AsmParserVariant {
Daniel Dunbar00331992009-07-29 00:02:19 +0000845 int Variant = 0;
Daniel Dunbare4318712009-08-11 20:59:47 +0000846
Chad Rosier9f7a2212013-04-18 22:35:36 +0000847 // Variant name.
848 string Name = "att";
849
Daniel Dunbare4318712009-08-11 20:59:47 +0000850 // Discard comments in assembly strings.
851 string CommentDelimiter = "#";
852
853 // Recognize hard coded registers.
854 string RegisterPrefix = "%";
Daniel Dunbar00331992009-07-29 00:02:19 +0000855}
856
Devang Patel67bf992a2012-01-10 17:51:54 +0000857def IntelAsmParserVariant : AsmParserVariant {
858 int Variant = 1;
859
Chad Rosier9f7a2212013-04-18 22:35:36 +0000860 // Variant name.
861 string Name = "intel";
862
Devang Patel67bf992a2012-01-10 17:51:54 +0000863 // Discard comments in assembly strings.
864 string CommentDelimiter = ";";
865
866 // Recognize hard coded registers.
867 string RegisterPrefix = "";
868}
869
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000870//===----------------------------------------------------------------------===//
871// Assembly Printers
872//===----------------------------------------------------------------------===//
873
Chris Lattner56832602004-10-03 20:36:57 +0000874// The X86 target supports two different syntaxes for emitting machine code.
875// This is controlled by the -x86-asm-syntax={att|intel}
876def ATTAsmWriter : AsmWriter {
Chris Lattner1cbd3de2009-09-13 19:30:11 +0000877 string AsmWriterClassName = "ATTInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000878 int Variant = 0;
879}
880def IntelAsmWriter : AsmWriter {
Chris Lattner13306a12009-09-20 07:47:59 +0000881 string AsmWriterClassName = "IntelInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000882 int Variant = 1;
883}
884
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000885def X86 : Target {
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000886 // Information about the instructions...
Chris Lattner25510802003-08-04 04:59:56 +0000887 let InstructionSet = X86InstrInfo;
Devang Patel67bf992a2012-01-10 17:51:54 +0000888 let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
Chris Lattner56832602004-10-03 20:36:57 +0000889 let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000890}