blob: 59c9998fe708af70a14f38d6f6c4b40bb67e69d5 [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 FeatureSGX : SubtargetFeature<"sgx", "HasSGX", "true",
221 "Enable Software Guard Extensions">;
222def FeatureCLFLUSHOPT : SubtargetFeature<"clflushopt", "HasCLFLUSHOPT", "true",
223 "Flush A Cache Line Optimized">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000224def FeatureCLWB : SubtargetFeature<"clwb", "HasCLWB", "true",
225 "Cache Line Write Back">;
Michael Kuperstein454d1452015-07-23 12:23:45 +0000226// TODO: This feature ought to be renamed.
Sean Silvae1c6b542015-07-27 00:46:59 +0000227// What it really refers to are CPUs for which certain instructions
228// (which ones besides the example below?) are microcoded.
Michael Kuperstein454d1452015-07-23 12:23:45 +0000229// The best examples of this are the memory forms of CALL and PUSH
230// instructions, which should be avoided in favor of a MOV + register CALL/PUSH.
Preston Gurd663e6f92013-03-27 19:14:02 +0000231def FeatureCallRegIndirect : SubtargetFeature<"call-reg-indirect",
232 "CallRegIndirect", "true",
233 "Call register indirect">;
Preston Gurd8b7ab4b2013-04-25 20:29:37 +0000234def FeatureLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LEAUsesAG", "true",
235 "LEA instruction needs inputs at AG stage">;
Alexey Volkov6226de62014-05-20 08:55:50 +0000236def FeatureSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
237 "LEA instruction with certain arguments is slow">;
Alexey Volkov5260dba2014-06-09 11:40:41 +0000238def FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
239 "INC and DEC instructions are slower than ADD and SUB">;
Eric Christopher824f42f2015-05-12 01:26:05 +0000240def FeatureSoftFloat
241 : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
242 "Use software floating point features.">;
Yunzhong Gao0de36ec2016-02-12 23:37:57 +0000243// On at least some AMD processors, there is no performance hazard to writing
244// only the lower parts of a YMM register without clearing the upper part.
245def FeatureFastPartialYMMWrite
246 : SubtargetFeature<"fast-partial-ymm-write", "HasFastPartialYMMWrite",
247 "true", "Partial writes to YMM registers are fast">;
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000248// FeatureFastScalarFSQRT should be enabled if scalar FSQRT has shorter latency
249// than the corresponding NR code. FeatureFastVectorFSQRT should be enabled if
250// vector FSQRT has higher throughput than the corresponding NR code.
251// The idea is that throughput bound code is likely to be vectorized, so for
252// vectorized code we should care about the throughput of SQRT operations.
253// But if the code is scalar that probably means that the code has some kind of
254// dependency and we should care more about reducing the latency.
255def FeatureFastScalarFSQRT
256 : SubtargetFeature<"fast-scalar-fsqrt", "HasFastScalarFSQRT",
257 "true", "Scalar SQRT is fast (disable Newton-Raphson)">;
258def FeatureFastVectorFSQRT
259 : SubtargetFeature<"fast-vector-fsqrt", "HasFastVectorFSQRT",
260 "true", "Vector SQRT is fast (disable Newton-Raphson)">;
Pierre Gousseaub6d652a2016-10-14 16:41:38 +0000261// If lzcnt has equivalent latency/throughput to most simple integer ops, it can
262// be used to replace test/set sequences.
263def FeatureFastLZCNT
264 : SubtargetFeature<
265 "fast-lzcnt", "HasFastLZCNT", "true",
266 "LZCNT instructions are as fast as most simple integer ops">;
David Greene8f6f72c2009-06-26 22:46:54 +0000267
Evan Chengff1beda2006-10-06 09:17:41 +0000268//===----------------------------------------------------------------------===//
269// X86 processors supported.
270//===----------------------------------------------------------------------===//
271
Andrew Trick8523b162012-02-01 23:20:51 +0000272include "X86Schedule.td"
273
274def ProcIntelAtom : SubtargetFeature<"atom", "X86ProcFamily", "IntelAtom",
275 "Intel Atom processors">;
Preston Gurd3fe264d2013-09-13 19:23:28 +0000276def ProcIntelSLM : SubtargetFeature<"slm", "X86ProcFamily", "IntelSLM",
277 "Intel Silvermont processors">;
Andrew Trick8523b162012-02-01 23:20:51 +0000278
Evan Chengff1beda2006-10-06 09:17:41 +0000279class Proc<string Name, list<SubtargetFeature> Features>
Andrew Trick87255e32012-07-07 04:00:00 +0000280 : ProcessorModel<Name, GenericModel, Features>;
Andrew Trick8523b162012-02-01 23:20:51 +0000281
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000282def : Proc<"generic", [FeatureX87, FeatureSlowUAMem16]>;
283def : Proc<"i386", [FeatureX87, FeatureSlowUAMem16]>;
284def : Proc<"i486", [FeatureX87, FeatureSlowUAMem16]>;
285def : Proc<"i586", [FeatureX87, FeatureSlowUAMem16]>;
286def : Proc<"pentium", [FeatureX87, FeatureSlowUAMem16]>;
287def : Proc<"pentium-mmx", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
288def : Proc<"i686", [FeatureX87, FeatureSlowUAMem16]>;
289def : Proc<"pentiumpro", [FeatureX87, FeatureSlowUAMem16, FeatureCMOV]>;
290def : Proc<"pentium2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
291 FeatureCMOV, FeatureFXSR]>;
292def : Proc<"pentium3", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
293 FeatureSSE1, FeatureFXSR]>;
294def : Proc<"pentium3m", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
295 FeatureSSE1, FeatureFXSR, FeatureSlowBTMem]>;
Mitch Bodarte60465d2016-04-27 22:52:35 +0000296
297// Enable the PostRAScheduler for SSE2 and SSE3 class cpus.
298// The intent is to enable it for pentium4 which is the current default
299// processor in a vanilla 32-bit clang compilation when no specific
300// architecture is specified. This generally gives a nice performance
301// increase on silvermont, with largely neutral behavior on other
302// contemporary large core processors.
303// pentium-m, pentium4m, prescott and nocona are included as a preventative
304// measure to avoid performance surprises, in case clang's default cpu
305// changes slightly.
306
307def : ProcessorModel<"pentium-m", GenericPostRAModel,
308 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
309 FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
310
311def : ProcessorModel<"pentium4", GenericPostRAModel,
312 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
313 FeatureSSE2, FeatureFXSR]>;
314
315def : ProcessorModel<"pentium4m", GenericPostRAModel,
316 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
317 FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000318
Andrey Turetskiy958eb462016-04-01 10:16:15 +0000319// Intel Quark.
320def : Proc<"lakemont", []>;
321
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000322// Intel Core Duo.
Craig Topper09b65982015-10-16 06:03:09 +0000323def : ProcessorModel<"yonah", SandyBridgeModel,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000324 [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
325 FeatureFXSR, FeatureSlowBTMem]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000326
327// NetBurst.
Mitch Bodarte60465d2016-04-27 22:52:35 +0000328def : ProcessorModel<"prescott", GenericPostRAModel,
329 [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
330 FeatureFXSR, FeatureSlowBTMem]>;
331def : ProcessorModel<"nocona", GenericPostRAModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000332 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000333 FeatureSlowUAMem16,
334 FeatureMMX,
335 FeatureSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000336 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000337 FeatureCMPXCHG16B,
338 FeatureSlowBTMem
339]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000340
341// Intel Core 2 Solo/Duo.
Eric Christopher11e59832015-10-08 20:10:06 +0000342def : ProcessorModel<"core2", SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000343 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000344 FeatureSlowUAMem16,
345 FeatureMMX,
346 FeatureSSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000347 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000348 FeatureCMPXCHG16B,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000349 FeatureSlowBTMem,
350 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000351]>;
352def : ProcessorModel<"penryn", SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000353 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000354 FeatureSlowUAMem16,
355 FeatureMMX,
356 FeatureSSE41,
Craig Topper09b65982015-10-16 06:03:09 +0000357 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000358 FeatureCMPXCHG16B,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000359 FeatureSlowBTMem,
360 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000361]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000362
Chandler Carruthaf8924032014-12-09 10:58:36 +0000363// Atom CPUs.
364class BonnellProc<string Name> : ProcessorModel<Name, AtomModel, [
Eric Christopher11e59832015-10-08 20:10:06 +0000365 ProcIntelAtom,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000366 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000367 FeatureSlowUAMem16,
368 FeatureMMX,
369 FeatureSSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000370 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000371 FeatureCMPXCHG16B,
372 FeatureMOVBE,
373 FeatureSlowBTMem,
Sanjay Patel53d1d8b2015-10-12 15:24:01 +0000374 FeatureLEAForSP,
Eric Christopher11e59832015-10-08 20:10:06 +0000375 FeatureSlowDivide32,
376 FeatureSlowDivide64,
377 FeatureCallRegIndirect,
378 FeatureLEAUsesAG,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000379 FeaturePadShortFunctions,
380 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000381]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000382def : BonnellProc<"bonnell">;
383def : BonnellProc<"atom">; // Pin the generic name to the baseline.
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000384
Chandler Carruthaf8924032014-12-09 10:58:36 +0000385class SilvermontProc<string Name> : ProcessorModel<Name, SLMModel, [
Eric Christopher11e59832015-10-08 20:10:06 +0000386 ProcIntelSLM,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000387 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000388 FeatureMMX,
389 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000390 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000391 FeatureCMPXCHG16B,
392 FeatureMOVBE,
393 FeaturePOPCNT,
394 FeaturePCLMUL,
395 FeatureAES,
396 FeatureSlowDivide64,
397 FeatureCallRegIndirect,
398 FeaturePRFCHW,
399 FeatureSlowLEA,
400 FeatureSlowIncDec,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000401 FeatureSlowBTMem,
Zvi Rackover8bc7e4d2016-12-06 19:35:20 +0000402 FeatureSlowPMULLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000403 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000404]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000405def : SilvermontProc<"silvermont">;
406def : SilvermontProc<"slm">; // Legacy alias.
407
Eric Christopher2ef63182010-04-02 21:54:27 +0000408// "Arrandale" along with corei3 and corei5
Craig Topper3611d9b2015-03-30 06:31:11 +0000409class NehalemProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000410 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000411 FeatureMMX,
412 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000413 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000414 FeatureCMPXCHG16B,
415 FeatureSlowBTMem,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000416 FeaturePOPCNT,
417 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000418]>;
Craig Topper3611d9b2015-03-30 06:31:11 +0000419def : NehalemProc<"nehalem">;
420def : NehalemProc<"corei7">;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000421
Eric Christopher2ef63182010-04-02 21:54:27 +0000422// Westmere is a similar machine to nehalem with some additional features.
423// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
Chandler Carruthaf8924032014-12-09 10:58:36 +0000424class WestmereProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000425 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000426 FeatureMMX,
427 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000428 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000429 FeatureCMPXCHG16B,
430 FeatureSlowBTMem,
431 FeaturePOPCNT,
432 FeatureAES,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000433 FeaturePCLMUL,
434 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000435]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000436def : WestmereProc<"westmere">;
437
Craig Topperf730a6b2016-02-13 21:35:37 +0000438class ProcessorFeatures<list<SubtargetFeature> Inherited,
439 list<SubtargetFeature> NewFeatures> {
440 list<SubtargetFeature> Value = !listconcat(Inherited, NewFeatures);
441}
442
443class ProcModel<string Name, SchedMachineModel Model,
444 list<SubtargetFeature> ProcFeatures,
445 list<SubtargetFeature> OtherFeatures> :
446 ProcessorModel<Name, Model, !listconcat(ProcFeatures, OtherFeatures)>;
447
Nate Begeman8b08f522010-12-10 00:26:57 +0000448// SSE is not listed here since llvm treats AVX as a reimplementation of SSE,
449// rather than a superset.
Craig Topperf730a6b2016-02-13 21:35:37 +0000450def SNBFeatures : ProcessorFeatures<[], [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000451 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000452 FeatureMMX,
453 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000454 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000455 FeatureCMPXCHG16B,
Eric Christopher11e59832015-10-08 20:10:06 +0000456 FeaturePOPCNT,
457 FeatureAES,
Nikolai Bozhenov6bdf92c2017-01-12 19:34:15 +0000458 FeatureSlowDivide64,
Craig Topper0ee35692015-10-14 05:37:38 +0000459 FeaturePCLMUL,
460 FeatureXSAVE,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000461 FeatureXSAVEOPT,
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000462 FeatureLAHFSAHF,
463 FeatureFastScalarFSQRT
Eric Christopher11e59832015-10-08 20:10:06 +0000464]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000465
Craig Topperf730a6b2016-02-13 21:35:37 +0000466class SandyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
467 SNBFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000468 FeatureSlowBTMem,
469 FeatureSlowUAMem32
470]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000471def : SandyBridgeProc<"sandybridge">;
472def : SandyBridgeProc<"corei7-avx">; // Legacy alias.
Evan Chengff1beda2006-10-06 09:17:41 +0000473
Craig Topperf730a6b2016-02-13 21:35:37 +0000474def IVBFeatures : ProcessorFeatures<SNBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000475 FeatureRDRAND,
476 FeatureF16C,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000477 FeatureFSGSBase
478]>;
479
Craig Topperf730a6b2016-02-13 21:35:37 +0000480class IvyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
481 IVBFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000482 FeatureSlowBTMem,
483 FeatureSlowUAMem32
Eric Christopher11e59832015-10-08 20:10:06 +0000484]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000485def : IvyBridgeProc<"ivybridge">;
486def : IvyBridgeProc<"core-avx-i">; // Legacy alias.
Craig Topper3657fe42011-10-14 03:21:46 +0000487
Craig Topperf730a6b2016-02-13 21:35:37 +0000488def HSWFeatures : ProcessorFeatures<IVBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000489 FeatureAVX2,
Eric Christopher11e59832015-10-08 20:10:06 +0000490 FeatureBMI,
491 FeatureBMI2,
492 FeatureFMA,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000493 FeatureLZCNT,
494 FeatureMOVBE,
Eric Christopher11e59832015-10-08 20:10:06 +0000495 FeatureRTM,
496 FeatureHLE,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000497 FeatureSlowIncDec
Eric Christopher11e59832015-10-08 20:10:06 +0000498]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000499
Craig Topperf730a6b2016-02-13 21:35:37 +0000500class HaswellProc<string Name> : ProcModel<Name, HaswellModel,
501 HSWFeatures.Value, []>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000502def : HaswellProc<"haswell">;
503def : HaswellProc<"core-avx2">; // Legacy alias.
504
Craig Topperf730a6b2016-02-13 21:35:37 +0000505def BDWFeatures : ProcessorFeatures<HSWFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000506 FeatureADX,
Craig Topper86576bd2017-02-09 06:50:59 +0000507 FeatureRDSEED
Eric Christopher11e59832015-10-08 20:10:06 +0000508]>;
Craig Topperf730a6b2016-02-13 21:35:37 +0000509class BroadwellProc<string Name> : ProcModel<Name, HaswellModel,
510 BDWFeatures.Value, []>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000511def : BroadwellProc<"broadwell">;
512
Craig Topperf730a6b2016-02-13 21:35:37 +0000513def SKLFeatures : ProcessorFeatures<BDWFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000514 FeatureMPX,
515 FeatureXSAVEC,
516 FeatureXSAVES,
517 FeatureSGX,
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000518 FeatureCLFLUSHOPT,
519 FeatureFastVectorFSQRT
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000520]>;
521
522// FIXME: define SKL model
Craig Topperf730a6b2016-02-13 21:35:37 +0000523class SkylakeClientProc<string Name> : ProcModel<Name, HaswellModel,
524 SKLFeatures.Value, []>;
Sanjoy Dasaa63dc02016-02-21 17:12:03 +0000525def : SkylakeClientProc<"skylake">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000526
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000527// FIXME: define KNL model
Craig Topperf730a6b2016-02-13 21:35:37 +0000528class KnightsLandingProc<string Name> : ProcModel<Name, HaswellModel,
529 IVBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000530 FeatureAVX512,
531 FeatureERI,
532 FeatureCDI,
533 FeaturePFI,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000534 FeaturePREFETCHWT1,
535 FeatureADX,
536 FeatureRDSEED,
Eric Christopher11e59832015-10-08 20:10:06 +0000537 FeatureMOVBE,
538 FeatureLZCNT,
539 FeatureBMI,
540 FeatureBMI2,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000541 FeatureFMA
Eric Christopher11e59832015-10-08 20:10:06 +0000542]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000543def : KnightsLandingProc<"knl">;
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000544
Craig Topperf730a6b2016-02-13 21:35:37 +0000545def SKXFeatures : ProcessorFeatures<SKLFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000546 FeatureAVX512,
547 FeatureCDI,
548 FeatureDQI,
549 FeatureBWI,
550 FeatureVLX,
Asaf Badouh5acf66f2015-12-15 13:35:29 +0000551 FeaturePKU,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000552 FeatureCLWB
Eric Christopher11e59832015-10-08 20:10:06 +0000553]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000554
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000555// FIXME: define SKX model
Craig Topperf730a6b2016-02-13 21:35:37 +0000556class SkylakeServerProc<string Name> : ProcModel<Name, HaswellModel,
557 SKXFeatures.Value, []>;
Sanjoy Dasaa63dc02016-02-21 17:12:03 +0000558def : SkylakeServerProc<"skylake-avx512">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000559def : SkylakeServerProc<"skx">; // Legacy alias.
560
Craig Topperf730a6b2016-02-13 21:35:37 +0000561def CNLFeatures : ProcessorFeatures<SKXFeatures.Value, [
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000562 FeatureVBMI,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000563 FeatureIFMA,
564 FeatureSHA
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000565]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000566
Craig Topperf730a6b2016-02-13 21:35:37 +0000567class CannonlakeProc<string Name> : ProcModel<Name, HaswellModel,
568 CNLFeatures.Value, []>;
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000569def : CannonlakeProc<"cannonlake">;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000570
571// AMD CPUs.
Robert Khasanovbfa01312014-07-21 14:54:21 +0000572
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000573def : Proc<"k6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
574def : Proc<"k6-2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
575def : Proc<"k6-3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
576def : Proc<"athlon", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000577 FeatureSlowBTMem, FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000578def : Proc<"athlon-tbird", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000579 FeatureSlowBTMem, FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000580def : Proc<"athlon-4", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
581 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000582 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000583def : Proc<"athlon-xp", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
584 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000585 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000586def : Proc<"athlon-mp", [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<"k8", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
590 Feature3DNowA, FeatureFXSR, Feature64Bit,
591 FeatureSlowBTMem, FeatureSlowSHLD]>;
592def : Proc<"opteron", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
593 Feature3DNowA, FeatureFXSR, Feature64Bit,
594 FeatureSlowBTMem, FeatureSlowSHLD]>;
595def : Proc<"athlon64", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
596 Feature3DNowA, FeatureFXSR, Feature64Bit,
597 FeatureSlowBTMem, FeatureSlowSHLD]>;
598def : Proc<"athlon-fx", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
599 Feature3DNowA, FeatureFXSR, Feature64Bit,
600 FeatureSlowBTMem, FeatureSlowSHLD]>;
601def : Proc<"k8-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
602 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
603 FeatureSlowBTMem, FeatureSlowSHLD]>;
604def : Proc<"opteron-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
605 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
606 FeatureSlowBTMem, FeatureSlowSHLD]>;
607def : Proc<"athlon64-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
608 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
609 FeatureSlowBTMem, FeatureSlowSHLD]>;
610def : Proc<"amdfam10", [FeatureX87, FeatureSSE4A, Feature3DNowA,
611 FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
612 FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
613 FeatureLAHFSAHF]>;
614def : Proc<"barcelona", [FeatureX87, FeatureSSE4A, Feature3DNowA,
615 FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
616 FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
617 FeatureLAHFSAHF]>;
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000618
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000619// Bobcat
Eric Christopher11e59832015-10-08 20:10:06 +0000620def : Proc<"btver1", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000621 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000622 FeatureMMX,
623 FeatureSSSE3,
624 FeatureSSE4A,
Craig Topper09b65982015-10-16 06:03:09 +0000625 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000626 FeatureCMPXCHG16B,
627 FeaturePRFCHW,
628 FeatureLZCNT,
629 FeaturePOPCNT,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000630 FeatureSlowSHLD,
631 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000632]>;
Sanjay Patel1191adf2014-09-09 20:07:07 +0000633
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000634// Jaguar
Eric Christopher11e59832015-10-08 20:10:06 +0000635def : ProcessorModel<"btver2", BtVer2Model, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000636 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000637 FeatureMMX,
638 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000639 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000640 FeatureSSE4A,
641 FeatureCMPXCHG16B,
642 FeaturePRFCHW,
643 FeatureAES,
644 FeaturePCLMUL,
645 FeatureBMI,
646 FeatureF16C,
647 FeatureMOVBE,
648 FeatureLZCNT,
Pierre Gousseaub6d652a2016-10-14 16:41:38 +0000649 FeatureFastLZCNT,
Eric Christopher11e59832015-10-08 20:10:06 +0000650 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000651 FeatureXSAVE,
652 FeatureXSAVEOPT,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000653 FeatureSlowSHLD,
Yunzhong Gao0de36ec2016-02-12 23:37:57 +0000654 FeatureLAHFSAHF,
655 FeatureFastPartialYMMWrite
Eric Christopher11e59832015-10-08 20:10:06 +0000656]>;
Sanjay Patele57f3c02014-11-28 18:40:18 +0000657
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000658// Bulldozer
Eric Christopher11e59832015-10-08 20:10:06 +0000659def : Proc<"bdver1", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000660 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000661 FeatureXOP,
662 FeatureFMA4,
663 FeatureCMPXCHG16B,
664 FeatureAES,
665 FeaturePRFCHW,
666 FeaturePCLMUL,
667 FeatureMMX,
668 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000669 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000670 FeatureSSE4A,
671 FeatureLZCNT,
672 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000673 FeatureXSAVE,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000674 FeatureSlowSHLD,
675 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000676]>;
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000677// Piledriver
Eric Christopher11e59832015-10-08 20:10:06 +0000678def : Proc<"bdver2", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000679 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000680 FeatureXOP,
681 FeatureFMA4,
682 FeatureCMPXCHG16B,
683 FeatureAES,
684 FeaturePRFCHW,
685 FeaturePCLMUL,
686 FeatureMMX,
687 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000688 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000689 FeatureSSE4A,
690 FeatureF16C,
691 FeatureLZCNT,
692 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000693 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000694 FeatureBMI,
695 FeatureTBM,
696 FeatureFMA,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000697 FeatureSlowSHLD,
698 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000699]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000700
701// Steamroller
Eric Christopher11e59832015-10-08 20:10:06 +0000702def : Proc<"bdver3", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000703 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000704 FeatureXOP,
705 FeatureFMA4,
706 FeatureCMPXCHG16B,
707 FeatureAES,
708 FeaturePRFCHW,
709 FeaturePCLMUL,
710 FeatureMMX,
711 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000712 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000713 FeatureSSE4A,
714 FeatureF16C,
715 FeatureLZCNT,
716 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000717 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000718 FeatureBMI,
719 FeatureTBM,
720 FeatureFMA,
Craig Topper0ee35692015-10-14 05:37:38 +0000721 FeatureXSAVEOPT,
Eric Christopher11e59832015-10-08 20:10:06 +0000722 FeatureSlowSHLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000723 FeatureFSGSBase,
724 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000725]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000726
Benjamin Kramer60045732014-05-02 15:47:07 +0000727// Excavator
Eric Christopher11e59832015-10-08 20:10:06 +0000728def : Proc<"bdver4", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000729 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000730 FeatureMMX,
731 FeatureAVX2,
Craig Topper09b65982015-10-16 06:03:09 +0000732 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000733 FeatureXOP,
734 FeatureFMA4,
735 FeatureCMPXCHG16B,
736 FeatureAES,
737 FeaturePRFCHW,
738 FeaturePCLMUL,
739 FeatureF16C,
740 FeatureLZCNT,
741 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000742 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000743 FeatureBMI,
744 FeatureBMI2,
745 FeatureTBM,
746 FeatureFMA,
Craig Topper0ee35692015-10-14 05:37:38 +0000747 FeatureXSAVEOPT,
Simon Pilgrim381a0ad2016-07-24 16:00:53 +0000748 FeatureSlowSHLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000749 FeatureFSGSBase,
Ashutosh Nema348af9c2016-05-18 11:59:12 +0000750 FeatureLAHFSAHF,
751 FeatureMWAITX
Eric Christopher11e59832015-10-08 20:10:06 +0000752]>;
Benjamin Kramer60045732014-05-02 15:47:07 +0000753
Craig Topperd55b8312017-01-10 06:01:16 +0000754// TODO: The scheduler model falls to BTVER2 model.
755// The znver1 model has to be put in place.
756// Zen
757def: ProcessorModel<"znver1", BtVer2Model, [
758 FeatureADX,
759 FeatureAES,
760 FeatureAVX2,
761 FeatureBMI,
762 FeatureBMI2,
763 FeatureCLFLUSHOPT,
Craig Topper50f3d142017-02-09 04:27:34 +0000764 FeatureCLZERO,
Craig Topperd55b8312017-01-10 06:01:16 +0000765 FeatureCMPXCHG16B,
766 FeatureF16C,
767 FeatureFMA,
768 FeatureFSGSBase,
769 FeatureFXSR,
770 FeatureFastLZCNT,
771 FeatureLAHFSAHF,
772 FeatureLZCNT,
773 FeatureMMX,
774 FeatureMOVBE,
775 FeatureMWAITX,
776 FeaturePCLMUL,
777 FeaturePOPCNT,
778 FeaturePRFCHW,
779 FeatureRDRAND,
780 FeatureRDSEED,
781 FeatureSHA,
Craig Topperd55b8312017-01-10 06:01:16 +0000782 FeatureSSE4A,
783 FeatureSlowSHLD,
784 FeatureX87,
785 FeatureXSAVE,
786 FeatureXSAVEC,
787 FeatureXSAVEOPT,
788 FeatureXSAVES]>;
789
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000790def : Proc<"geode", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000791
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000792def : Proc<"winchip-c6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
793def : Proc<"winchip2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
794def : Proc<"c3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
795def : Proc<"c3-2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
796 FeatureSSE1, FeatureFXSR]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000797
Chandler Carruth32908d72014-05-07 17:37:03 +0000798// We also provide a generic 64-bit specific x86 processor model which tries to
799// be good for modern chips without enabling instruction set encodings past the
800// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
801// modern 64-bit x86 chip, and enables features that are generally beneficial.
Michael Liao5bf95782014-12-04 05:20:33 +0000802//
Chandler Carruth32908d72014-05-07 17:37:03 +0000803// We currently use the Sandy Bridge model as the default scheduling model as
804// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
805// covers a huge swath of x86 processors. If there are specific scheduling
806// knobs which need to be tuned differently for AMD chips, we might consider
807// forming a common base for them.
Craig Topper09b65982015-10-16 06:03:09 +0000808def : ProcessorModel<"x86-64", SandyBridgeModel,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000809 [FeatureX87, FeatureMMX, FeatureSSE2, FeatureFXSR,
810 Feature64Bit, FeatureSlowBTMem ]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000811
Evan Chengff1beda2006-10-06 09:17:41 +0000812//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +0000813// Register File Description
814//===----------------------------------------------------------------------===//
815
816include "X86RegisterInfo.td"
817
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000818//===----------------------------------------------------------------------===//
819// Instruction Descriptions
820//===----------------------------------------------------------------------===//
821
Chris Lattner59a4a912003-08-03 21:54:21 +0000822include "X86InstrInfo.td"
823
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +0000824def X86InstrInfo : InstrInfo;
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000825
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000826//===----------------------------------------------------------------------===//
827// Calling Conventions
828//===----------------------------------------------------------------------===//
829
830include "X86CallingConv.td"
831
832
833//===----------------------------------------------------------------------===//
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000834// Assembly Parser
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000835//===----------------------------------------------------------------------===//
836
Devang Patel85d684a2012-01-09 19:13:28 +0000837def ATTAsmParserVariant : AsmParserVariant {
Daniel Dunbar00331992009-07-29 00:02:19 +0000838 int Variant = 0;
Daniel Dunbare4318712009-08-11 20:59:47 +0000839
Chad Rosier9f7a2212013-04-18 22:35:36 +0000840 // Variant name.
841 string Name = "att";
842
Daniel Dunbare4318712009-08-11 20:59:47 +0000843 // Discard comments in assembly strings.
844 string CommentDelimiter = "#";
845
846 // Recognize hard coded registers.
847 string RegisterPrefix = "%";
Daniel Dunbar00331992009-07-29 00:02:19 +0000848}
849
Devang Patel67bf992a2012-01-10 17:51:54 +0000850def IntelAsmParserVariant : AsmParserVariant {
851 int Variant = 1;
852
Chad Rosier9f7a2212013-04-18 22:35:36 +0000853 // Variant name.
854 string Name = "intel";
855
Devang Patel67bf992a2012-01-10 17:51:54 +0000856 // Discard comments in assembly strings.
857 string CommentDelimiter = ";";
858
859 // Recognize hard coded registers.
860 string RegisterPrefix = "";
861}
862
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000863//===----------------------------------------------------------------------===//
864// Assembly Printers
865//===----------------------------------------------------------------------===//
866
Chris Lattner56832602004-10-03 20:36:57 +0000867// The X86 target supports two different syntaxes for emitting machine code.
868// This is controlled by the -x86-asm-syntax={att|intel}
869def ATTAsmWriter : AsmWriter {
Chris Lattner1cbd3de2009-09-13 19:30:11 +0000870 string AsmWriterClassName = "ATTInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000871 int Variant = 0;
872}
873def IntelAsmWriter : AsmWriter {
Chris Lattner13306a12009-09-20 07:47:59 +0000874 string AsmWriterClassName = "IntelInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000875 int Variant = 1;
876}
877
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000878def X86 : Target {
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000879 // Information about the instructions...
Chris Lattner25510802003-08-04 04:59:56 +0000880 let InstructionSet = X86InstrInfo;
Devang Patel67bf992a2012-01-10 17:51:54 +0000881 let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
Chris Lattner56832602004-10-03 20:36:57 +0000882 let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000883}