blob: 784c3a6557ff00e303b2f8ec29fb3d2d6c2108a0 [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">;
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000173def FeatureLWP : SubtargetFeature<"lwp", "HasLWP", "true",
174 "Enable LWP instructions">;
Craig Topper786bdb92011-10-03 17:28:23 +0000175def FeatureMOVBE : SubtargetFeature<"movbe", "HasMOVBE", "true",
176 "Support MOVBE instruction">;
Rafael Espindola94a2c562013-08-23 20:21:34 +0000177def FeatureRDRAND : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
Craig Topper786bdb92011-10-03 17:28:23 +0000178 "Support RDRAND instruction">;
Craig Topperfe9179f2011-10-09 07:31:39 +0000179def FeatureF16C : SubtargetFeature<"f16c", "HasF16C", "true",
Craig Toppera6d204e2013-09-16 04:29:58 +0000180 "Support 16-bit floating point conversion instructions",
181 [FeatureAVX]>;
Craig Topper228d9132011-10-30 19:57:21 +0000182def FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
183 "Support FS/GS Base instructions">;
Craig Topper271064e2011-10-11 06:44:02 +0000184def FeatureLZCNT : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
185 "Support LZCNT instruction">;
Craig Topper3657fe42011-10-14 03:21:46 +0000186def FeatureBMI : SubtargetFeature<"bmi", "HasBMI", "true",
187 "Support BMI instructions">;
Craig Topperaea148c2011-10-16 07:55:05 +0000188def FeatureBMI2 : SubtargetFeature<"bmi2", "HasBMI2", "true",
189 "Support BMI2 instructions">;
Michael Liao73cffdd2012-11-08 07:28:54 +0000190def FeatureRTM : SubtargetFeature<"rtm", "HasRTM", "true",
191 "Support RTM instructions">;
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.">;
Amjad Aboud4f977512017-03-03 09:03:24 +0000243// On some X86 processors, there is no performance hazard to writing only the
244// lower parts of a YMM or ZMM register without clearing the upper part.
245def FeatureFastPartialYMMorZMMWrite
246 : SubtargetFeature<"fast-partial-ymm-or-zmm-write",
247 "HasFastPartialYMMorZMMWrite",
248 "true", "Partial writes to YMM/ZMM registers are fast">;
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000249// FeatureFastScalarFSQRT should be enabled if scalar FSQRT has shorter latency
250// than the corresponding NR code. FeatureFastVectorFSQRT should be enabled if
251// vector FSQRT has higher throughput than the corresponding NR code.
252// The idea is that throughput bound code is likely to be vectorized, so for
253// vectorized code we should care about the throughput of SQRT operations.
254// But if the code is scalar that probably means that the code has some kind of
255// dependency and we should care more about reducing the latency.
256def FeatureFastScalarFSQRT
257 : SubtargetFeature<"fast-scalar-fsqrt", "HasFastScalarFSQRT",
258 "true", "Scalar SQRT is fast (disable Newton-Raphson)">;
259def FeatureFastVectorFSQRT
260 : SubtargetFeature<"fast-vector-fsqrt", "HasFastVectorFSQRT",
261 "true", "Vector SQRT is fast (disable Newton-Raphson)">;
Pierre Gousseaub6d652a2016-10-14 16:41:38 +0000262// If lzcnt has equivalent latency/throughput to most simple integer ops, it can
263// be used to replace test/set sequences.
264def FeatureFastLZCNT
265 : SubtargetFeature<
266 "fast-lzcnt", "HasFastLZCNT", "true",
267 "LZCNT instructions are as fast as most simple integer ops">;
David Greene8f6f72c2009-06-26 22:46:54 +0000268
Craig Topperd88389a2017-02-21 06:39:13 +0000269
270// Sandy Bridge and newer processors can use SHLD with the same source on both
271// inputs to implement rotate to avoid the partial flag update of the normal
272// rotate instructions.
273def FeatureFastSHLDRotate
274 : SubtargetFeature<
275 "fast-shld-rotate", "HasFastSHLDRotate", "true",
276 "SHLD can be used as a faster rotate">;
277
Clement Courbet203fc172017-04-21 09:20:50 +0000278// Ivy Bridge and newer processors have enhanced REP MOVSB and STOSB (aka
279// "string operations"). See "REP String Enhancement" in the Intel Software
Clement Courbet41b43332017-04-21 09:21:05 +0000280// Development Manual. This feature essentially means that REP MOVSB will copy
Clement Courbet203fc172017-04-21 09:20:50 +0000281// using the largest available size instead of copying bytes one by one, making
282// it at least as fast as REPMOVS{W,D,Q}.
283def FeatureERMSB
Clement Courbet1ce3b822017-04-21 09:20:39 +0000284 : SubtargetFeature<
Clement Courbet203fc172017-04-21 09:20:50 +0000285 "ermsb", "HasERMSB", "true",
Clement Courbet1ce3b822017-04-21 09:20:39 +0000286 "REP MOVS/STOS are fast">;
287
Evan Chengff1beda2006-10-06 09:17:41 +0000288//===----------------------------------------------------------------------===//
289// X86 processors supported.
290//===----------------------------------------------------------------------===//
291
Andrew Trick8523b162012-02-01 23:20:51 +0000292include "X86Schedule.td"
293
294def ProcIntelAtom : SubtargetFeature<"atom", "X86ProcFamily", "IntelAtom",
295 "Intel Atom processors">;
Preston Gurd3fe264d2013-09-13 19:23:28 +0000296def ProcIntelSLM : SubtargetFeature<"slm", "X86ProcFamily", "IntelSLM",
297 "Intel Silvermont processors">;
Andrew Trick8523b162012-02-01 23:20:51 +0000298
Evan Chengff1beda2006-10-06 09:17:41 +0000299class Proc<string Name, list<SubtargetFeature> Features>
Andrew Trick87255e32012-07-07 04:00:00 +0000300 : ProcessorModel<Name, GenericModel, Features>;
Andrew Trick8523b162012-02-01 23:20:51 +0000301
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000302def : Proc<"generic", [FeatureX87, FeatureSlowUAMem16]>;
303def : Proc<"i386", [FeatureX87, FeatureSlowUAMem16]>;
304def : Proc<"i486", [FeatureX87, FeatureSlowUAMem16]>;
305def : Proc<"i586", [FeatureX87, FeatureSlowUAMem16]>;
306def : Proc<"pentium", [FeatureX87, FeatureSlowUAMem16]>;
307def : Proc<"pentium-mmx", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
308def : Proc<"i686", [FeatureX87, FeatureSlowUAMem16]>;
309def : Proc<"pentiumpro", [FeatureX87, FeatureSlowUAMem16, FeatureCMOV]>;
310def : Proc<"pentium2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
311 FeatureCMOV, FeatureFXSR]>;
312def : Proc<"pentium3", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
313 FeatureSSE1, FeatureFXSR]>;
314def : Proc<"pentium3m", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
315 FeatureSSE1, FeatureFXSR, FeatureSlowBTMem]>;
Mitch Bodarte60465d2016-04-27 22:52:35 +0000316
317// Enable the PostRAScheduler for SSE2 and SSE3 class cpus.
318// The intent is to enable it for pentium4 which is the current default
319// processor in a vanilla 32-bit clang compilation when no specific
320// architecture is specified. This generally gives a nice performance
321// increase on silvermont, with largely neutral behavior on other
322// contemporary large core processors.
323// pentium-m, pentium4m, prescott and nocona are included as a preventative
324// measure to avoid performance surprises, in case clang's default cpu
325// changes slightly.
326
327def : ProcessorModel<"pentium-m", GenericPostRAModel,
328 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
329 FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
330
331def : ProcessorModel<"pentium4", GenericPostRAModel,
332 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
333 FeatureSSE2, FeatureFXSR]>;
334
335def : ProcessorModel<"pentium4m", GenericPostRAModel,
336 [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
337 FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000338
Andrey Turetskiy958eb462016-04-01 10:16:15 +0000339// Intel Quark.
340def : Proc<"lakemont", []>;
341
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000342// Intel Core Duo.
Craig Topper09b65982015-10-16 06:03:09 +0000343def : ProcessorModel<"yonah", SandyBridgeModel,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000344 [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
345 FeatureFXSR, FeatureSlowBTMem]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000346
347// NetBurst.
Mitch Bodarte60465d2016-04-27 22:52:35 +0000348def : ProcessorModel<"prescott", GenericPostRAModel,
349 [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
350 FeatureFXSR, FeatureSlowBTMem]>;
351def : ProcessorModel<"nocona", GenericPostRAModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000352 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000353 FeatureSlowUAMem16,
354 FeatureMMX,
355 FeatureSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000356 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000357 FeatureCMPXCHG16B,
358 FeatureSlowBTMem
359]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000360
361// Intel Core 2 Solo/Duo.
Eric Christopher11e59832015-10-08 20:10:06 +0000362def : ProcessorModel<"core2", SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000363 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000364 FeatureSlowUAMem16,
365 FeatureMMX,
366 FeatureSSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000367 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000368 FeatureCMPXCHG16B,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000369 FeatureSlowBTMem,
370 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000371]>;
372def : ProcessorModel<"penryn", SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000373 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000374 FeatureSlowUAMem16,
375 FeatureMMX,
376 FeatureSSE41,
Craig Topper09b65982015-10-16 06:03:09 +0000377 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000378 FeatureCMPXCHG16B,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000379 FeatureSlowBTMem,
380 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000381]>;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000382
Chandler Carruthaf8924032014-12-09 10:58:36 +0000383// Atom CPUs.
384class BonnellProc<string Name> : ProcessorModel<Name, AtomModel, [
Eric Christopher11e59832015-10-08 20:10:06 +0000385 ProcIntelAtom,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000386 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000387 FeatureSlowUAMem16,
388 FeatureMMX,
389 FeatureSSSE3,
Craig Topper09b65982015-10-16 06:03:09 +0000390 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000391 FeatureCMPXCHG16B,
392 FeatureMOVBE,
393 FeatureSlowBTMem,
Sanjay Patel53d1d8b2015-10-12 15:24:01 +0000394 FeatureLEAForSP,
Eric Christopher11e59832015-10-08 20:10:06 +0000395 FeatureSlowDivide32,
396 FeatureSlowDivide64,
397 FeatureCallRegIndirect,
398 FeatureLEAUsesAG,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000399 FeaturePadShortFunctions,
400 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000401]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000402def : BonnellProc<"bonnell">;
403def : BonnellProc<"atom">; // Pin the generic name to the baseline.
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000404
Chandler Carruthaf8924032014-12-09 10:58:36 +0000405class SilvermontProc<string Name> : ProcessorModel<Name, SLMModel, [
Eric Christopher11e59832015-10-08 20:10:06 +0000406 ProcIntelSLM,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000407 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000408 FeatureMMX,
409 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000410 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000411 FeatureCMPXCHG16B,
412 FeatureMOVBE,
413 FeaturePOPCNT,
414 FeaturePCLMUL,
415 FeatureAES,
416 FeatureSlowDivide64,
417 FeatureCallRegIndirect,
418 FeaturePRFCHW,
419 FeatureSlowLEA,
420 FeatureSlowIncDec,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000421 FeatureSlowBTMem,
Zvi Rackover8bc7e4d2016-12-06 19:35:20 +0000422 FeatureSlowPMULLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000423 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000424]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000425def : SilvermontProc<"silvermont">;
426def : SilvermontProc<"slm">; // Legacy alias.
427
Eric Christopher2ef63182010-04-02 21:54:27 +0000428// "Arrandale" along with corei3 and corei5
Craig Topper3611d9b2015-03-30 06:31:11 +0000429class NehalemProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000430 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000431 FeatureMMX,
432 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000433 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000434 FeatureCMPXCHG16B,
435 FeatureSlowBTMem,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000436 FeaturePOPCNT,
437 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000438]>;
Craig Topper3611d9b2015-03-30 06:31:11 +0000439def : NehalemProc<"nehalem">;
440def : NehalemProc<"corei7">;
Jakob Stoklund Olesen1ac7e662013-03-26 22:19:12 +0000441
Eric Christopher2ef63182010-04-02 21:54:27 +0000442// Westmere is a similar machine to nehalem with some additional features.
443// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
Chandler Carruthaf8924032014-12-09 10:58:36 +0000444class WestmereProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000445 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000446 FeatureMMX,
447 FeatureSSE42,
Craig Topper09b65982015-10-16 06:03:09 +0000448 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000449 FeatureCMPXCHG16B,
450 FeatureSlowBTMem,
451 FeaturePOPCNT,
452 FeatureAES,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000453 FeaturePCLMUL,
454 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000455]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000456def : WestmereProc<"westmere">;
457
Craig Topperf730a6b2016-02-13 21:35:37 +0000458class ProcessorFeatures<list<SubtargetFeature> Inherited,
459 list<SubtargetFeature> NewFeatures> {
460 list<SubtargetFeature> Value = !listconcat(Inherited, NewFeatures);
461}
462
463class ProcModel<string Name, SchedMachineModel Model,
464 list<SubtargetFeature> ProcFeatures,
465 list<SubtargetFeature> OtherFeatures> :
466 ProcessorModel<Name, Model, !listconcat(ProcFeatures, OtherFeatures)>;
467
Nate Begeman8b08f522010-12-10 00:26:57 +0000468// SSE is not listed here since llvm treats AVX as a reimplementation of SSE,
469// rather than a superset.
Craig Topperf730a6b2016-02-13 21:35:37 +0000470def SNBFeatures : ProcessorFeatures<[], [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000471 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000472 FeatureMMX,
473 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000474 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000475 FeatureCMPXCHG16B,
Eric Christopher11e59832015-10-08 20:10:06 +0000476 FeaturePOPCNT,
477 FeatureAES,
Nikolai Bozhenov6bdf92c2017-01-12 19:34:15 +0000478 FeatureSlowDivide64,
Craig Topper0ee35692015-10-14 05:37:38 +0000479 FeaturePCLMUL,
480 FeatureXSAVE,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000481 FeatureXSAVEOPT,
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000482 FeatureLAHFSAHF,
Craig Topperd88389a2017-02-21 06:39:13 +0000483 FeatureFastScalarFSQRT,
484 FeatureFastSHLDRotate
Eric Christopher11e59832015-10-08 20:10:06 +0000485]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000486
Craig Topperf730a6b2016-02-13 21:35:37 +0000487class SandyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
488 SNBFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000489 FeatureSlowBTMem,
490 FeatureSlowUAMem32
491]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000492def : SandyBridgeProc<"sandybridge">;
493def : SandyBridgeProc<"corei7-avx">; // Legacy alias.
Evan Chengff1beda2006-10-06 09:17:41 +0000494
Craig Topperf730a6b2016-02-13 21:35:37 +0000495def IVBFeatures : ProcessorFeatures<SNBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000496 FeatureRDRAND,
497 FeatureF16C,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000498 FeatureFSGSBase
499]>;
500
Craig Topperf730a6b2016-02-13 21:35:37 +0000501class IvyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
502 IVBFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000503 FeatureSlowBTMem,
504 FeatureSlowUAMem32
Eric Christopher11e59832015-10-08 20:10:06 +0000505]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000506def : IvyBridgeProc<"ivybridge">;
507def : IvyBridgeProc<"core-avx-i">; // Legacy alias.
Craig Topper3657fe42011-10-14 03:21:46 +0000508
Craig Topperf730a6b2016-02-13 21:35:37 +0000509def HSWFeatures : ProcessorFeatures<IVBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000510 FeatureAVX2,
Eric Christopher11e59832015-10-08 20:10:06 +0000511 FeatureBMI,
512 FeatureBMI2,
Clement Courbet203fc172017-04-21 09:20:50 +0000513 FeatureERMSB,
Eric Christopher11e59832015-10-08 20:10:06 +0000514 FeatureFMA,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000515 FeatureLZCNT,
516 FeatureMOVBE,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000517 FeatureSlowIncDec
Eric Christopher11e59832015-10-08 20:10:06 +0000518]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000519
Craig Topperf730a6b2016-02-13 21:35:37 +0000520class HaswellProc<string Name> : ProcModel<Name, HaswellModel,
521 HSWFeatures.Value, []>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000522def : HaswellProc<"haswell">;
523def : HaswellProc<"core-avx2">; // Legacy alias.
524
Craig Topperf730a6b2016-02-13 21:35:37 +0000525def BDWFeatures : ProcessorFeatures<HSWFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000526 FeatureADX,
Craig Topper86576bd2017-02-09 06:50:59 +0000527 FeatureRDSEED
Eric Christopher11e59832015-10-08 20:10:06 +0000528]>;
Craig Topperf730a6b2016-02-13 21:35:37 +0000529class BroadwellProc<string Name> : ProcModel<Name, HaswellModel,
530 BDWFeatures.Value, []>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000531def : BroadwellProc<"broadwell">;
532
Craig Topperf730a6b2016-02-13 21:35:37 +0000533def SKLFeatures : ProcessorFeatures<BDWFeatures.Value, [
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000534 FeatureMPX,
Eric Christopher58297412017-03-29 07:40:44 +0000535 FeatureRTM,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000536 FeatureXSAVEC,
537 FeatureXSAVES,
538 FeatureSGX,
Nikolai Bozhenovf6795302016-08-04 12:47:28 +0000539 FeatureCLFLUSHOPT,
540 FeatureFastVectorFSQRT
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000541]>;
542
543// FIXME: define SKL model
Craig Topperf730a6b2016-02-13 21:35:37 +0000544class SkylakeClientProc<string Name> : ProcModel<Name, HaswellModel,
545 SKLFeatures.Value, []>;
Sanjoy Dasaa63dc02016-02-21 17:12:03 +0000546def : SkylakeClientProc<"skylake">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000547
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000548// FIXME: define KNL model
Craig Topperf730a6b2016-02-13 21:35:37 +0000549class KnightsLandingProc<string Name> : ProcModel<Name, HaswellModel,
550 IVBFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000551 FeatureAVX512,
552 FeatureERI,
553 FeatureCDI,
554 FeaturePFI,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000555 FeaturePREFETCHWT1,
556 FeatureADX,
557 FeatureRDSEED,
Eric Christopher11e59832015-10-08 20:10:06 +0000558 FeatureMOVBE,
559 FeatureLZCNT,
560 FeatureBMI,
561 FeatureBMI2,
Amjad Aboud4f977512017-03-03 09:03:24 +0000562 FeatureFMA,
563 FeatureFastPartialYMMorZMMWrite
Eric Christopher11e59832015-10-08 20:10:06 +0000564]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000565def : KnightsLandingProc<"knl">;
Elena Demikhovsky8cfb43f2013-07-24 11:02:47 +0000566
Craig Topperf730a6b2016-02-13 21:35:37 +0000567def SKXFeatures : ProcessorFeatures<SKLFeatures.Value, [
Eric Christopher11e59832015-10-08 20:10:06 +0000568 FeatureAVX512,
569 FeatureCDI,
570 FeatureDQI,
571 FeatureBWI,
572 FeatureVLX,
Asaf Badouh5acf66f2015-12-15 13:35:29 +0000573 FeaturePKU,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000574 FeatureCLWB
Eric Christopher11e59832015-10-08 20:10:06 +0000575]>;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000576
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000577// FIXME: define SKX model
Craig Topperf730a6b2016-02-13 21:35:37 +0000578class SkylakeServerProc<string Name> : ProcModel<Name, HaswellModel,
579 SKXFeatures.Value, []>;
Sanjoy Dasaa63dc02016-02-21 17:12:03 +0000580def : SkylakeServerProc<"skylake-avx512">;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000581def : SkylakeServerProc<"skx">; // Legacy alias.
582
Craig Topperf730a6b2016-02-13 21:35:37 +0000583def CNLFeatures : ProcessorFeatures<SKXFeatures.Value, [
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000584 FeatureVBMI,
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000585 FeatureIFMA,
586 FeatureSHA
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000587]>;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000588
Craig Topperf730a6b2016-02-13 21:35:37 +0000589class CannonlakeProc<string Name> : ProcModel<Name, HaswellModel,
590 CNLFeatures.Value, []>;
Elena Demikhovsky9242ea82016-01-18 13:00:31 +0000591def : CannonlakeProc<"cannonlake">;
Chandler Carruthaf8924032014-12-09 10:58:36 +0000592
593// AMD CPUs.
Robert Khasanovbfa01312014-07-21 14:54:21 +0000594
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000595def : Proc<"k6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
596def : Proc<"k6-2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
597def : Proc<"k6-3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
598def : Proc<"athlon", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000599 FeatureSlowBTMem, FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000600def : Proc<"athlon-tbird", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000601 FeatureSlowBTMem, FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000602def : Proc<"athlon-4", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
603 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000604 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000605def : Proc<"athlon-xp", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
606 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000607 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000608def : Proc<"athlon-mp", [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
609 Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000610 FeatureSlowSHLD]>;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000611def : Proc<"k8", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
612 Feature3DNowA, FeatureFXSR, Feature64Bit,
613 FeatureSlowBTMem, FeatureSlowSHLD]>;
614def : Proc<"opteron", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
615 Feature3DNowA, FeatureFXSR, Feature64Bit,
616 FeatureSlowBTMem, FeatureSlowSHLD]>;
617def : Proc<"athlon64", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
618 Feature3DNowA, FeatureFXSR, Feature64Bit,
619 FeatureSlowBTMem, FeatureSlowSHLD]>;
620def : Proc<"athlon-fx", [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
621 Feature3DNowA, FeatureFXSR, Feature64Bit,
622 FeatureSlowBTMem, FeatureSlowSHLD]>;
623def : Proc<"k8-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
624 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
625 FeatureSlowBTMem, FeatureSlowSHLD]>;
626def : Proc<"opteron-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
627 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
628 FeatureSlowBTMem, FeatureSlowSHLD]>;
629def : Proc<"athlon64-sse3", [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
630 Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
631 FeatureSlowBTMem, FeatureSlowSHLD]>;
632def : Proc<"amdfam10", [FeatureX87, FeatureSSE4A, Feature3DNowA,
633 FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
634 FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
635 FeatureLAHFSAHF]>;
636def : Proc<"barcelona", [FeatureX87, FeatureSSE4A, Feature3DNowA,
637 FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
638 FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
639 FeatureLAHFSAHF]>;
Sanjay Patel9e916dc2015-08-21 20:17:26 +0000640
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000641// Bobcat
Eric Christopher11e59832015-10-08 20:10:06 +0000642def : Proc<"btver1", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000643 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000644 FeatureMMX,
645 FeatureSSSE3,
646 FeatureSSE4A,
Craig Topper09b65982015-10-16 06:03:09 +0000647 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000648 FeatureCMPXCHG16B,
649 FeaturePRFCHW,
650 FeatureLZCNT,
651 FeaturePOPCNT,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000652 FeatureSlowSHLD,
653 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000654]>;
Sanjay Patel1191adf2014-09-09 20:07:07 +0000655
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000656// Jaguar
Eric Christopher11e59832015-10-08 20:10:06 +0000657def : ProcessorModel<"btver2", BtVer2Model, [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000658 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000659 FeatureMMX,
660 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000661 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000662 FeatureSSE4A,
663 FeatureCMPXCHG16B,
664 FeaturePRFCHW,
665 FeatureAES,
666 FeaturePCLMUL,
667 FeatureBMI,
668 FeatureF16C,
669 FeatureMOVBE,
670 FeatureLZCNT,
Pierre Gousseaub6d652a2016-10-14 16:41:38 +0000671 FeatureFastLZCNT,
Eric Christopher11e59832015-10-08 20:10:06 +0000672 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000673 FeatureXSAVE,
674 FeatureXSAVEOPT,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000675 FeatureSlowSHLD,
Yunzhong Gao0de36ec2016-02-12 23:37:57 +0000676 FeatureLAHFSAHF,
Amjad Aboud4f977512017-03-03 09:03:24 +0000677 FeatureFastPartialYMMorZMMWrite
Eric Christopher11e59832015-10-08 20:10:06 +0000678]>;
Sanjay Patele57f3c02014-11-28 18:40:18 +0000679
Benjamin Kramer077ae1d2012-01-10 11:50:02 +0000680// Bulldozer
Eric Christopher11e59832015-10-08 20:10:06 +0000681def : Proc<"bdver1", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000682 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000683 FeatureXOP,
684 FeatureFMA4,
685 FeatureCMPXCHG16B,
686 FeatureAES,
687 FeaturePRFCHW,
688 FeaturePCLMUL,
689 FeatureMMX,
690 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000691 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000692 FeatureSSE4A,
693 FeatureLZCNT,
694 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000695 FeatureXSAVE,
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000696 FeatureLWP,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000697 FeatureSlowSHLD,
698 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000699]>;
Benjamin Kramerb44c4272013-05-03 10:20:08 +0000700// Piledriver
Eric Christopher11e59832015-10-08 20:10:06 +0000701def : Proc<"bdver2", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000702 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000703 FeatureXOP,
704 FeatureFMA4,
705 FeatureCMPXCHG16B,
706 FeatureAES,
707 FeaturePRFCHW,
708 FeaturePCLMUL,
709 FeatureMMX,
710 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000711 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000712 FeatureSSE4A,
713 FeatureF16C,
714 FeatureLZCNT,
715 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000716 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000717 FeatureBMI,
718 FeatureTBM,
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000719 FeatureLWP,
Eric Christopher11e59832015-10-08 20:10:06 +0000720 FeatureFMA,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000721 FeatureSlowSHLD,
722 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000723]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000724
725// Steamroller
Eric Christopher11e59832015-10-08 20:10:06 +0000726def : Proc<"bdver3", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000727 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000728 FeatureXOP,
729 FeatureFMA4,
730 FeatureCMPXCHG16B,
731 FeatureAES,
732 FeaturePRFCHW,
733 FeaturePCLMUL,
734 FeatureMMX,
735 FeatureAVX,
Craig Topper09b65982015-10-16 06:03:09 +0000736 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000737 FeatureSSE4A,
738 FeatureF16C,
739 FeatureLZCNT,
740 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000741 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000742 FeatureBMI,
743 FeatureTBM,
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000744 FeatureLWP,
Eric Christopher11e59832015-10-08 20:10:06 +0000745 FeatureFMA,
Craig Topper0ee35692015-10-14 05:37:38 +0000746 FeatureXSAVEOPT,
Eric Christopher11e59832015-10-08 20:10:06 +0000747 FeatureSlowSHLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000748 FeatureFSGSBase,
749 FeatureLAHFSAHF
Eric Christopher11e59832015-10-08 20:10:06 +0000750]>;
Benjamin Kramerd114def2013-11-04 10:29:20 +0000751
Benjamin Kramer60045732014-05-02 15:47:07 +0000752// Excavator
Eric Christopher11e59832015-10-08 20:10:06 +0000753def : Proc<"bdver4", [
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000754 FeatureX87,
Eric Christopher11e59832015-10-08 20:10:06 +0000755 FeatureMMX,
756 FeatureAVX2,
Craig Topper09b65982015-10-16 06:03:09 +0000757 FeatureFXSR,
Eric Christopher11e59832015-10-08 20:10:06 +0000758 FeatureXOP,
759 FeatureFMA4,
760 FeatureCMPXCHG16B,
761 FeatureAES,
762 FeaturePRFCHW,
763 FeaturePCLMUL,
764 FeatureF16C,
765 FeatureLZCNT,
766 FeaturePOPCNT,
Craig Topper0ee35692015-10-14 05:37:38 +0000767 FeatureXSAVE,
Eric Christopher11e59832015-10-08 20:10:06 +0000768 FeatureBMI,
769 FeatureBMI2,
770 FeatureTBM,
Simon Pilgrim99b925b2017-05-03 15:51:39 +0000771 FeatureLWP,
Eric Christopher11e59832015-10-08 20:10:06 +0000772 FeatureFMA,
Craig Topper0ee35692015-10-14 05:37:38 +0000773 FeatureXSAVEOPT,
Simon Pilgrim381a0ad2016-07-24 16:00:53 +0000774 FeatureSlowSHLD,
Hans Wennborg5000ce82015-12-04 23:00:33 +0000775 FeatureFSGSBase,
Ashutosh Nema348af9c2016-05-18 11:59:12 +0000776 FeatureLAHFSAHF,
777 FeatureMWAITX
Eric Christopher11e59832015-10-08 20:10:06 +0000778]>;
Benjamin Kramer60045732014-05-02 15:47:07 +0000779
Craig Topperd55b8312017-01-10 06:01:16 +0000780// TODO: The scheduler model falls to BTVER2 model.
781// The znver1 model has to be put in place.
782// Zen
783def: ProcessorModel<"znver1", BtVer2Model, [
784 FeatureADX,
785 FeatureAES,
786 FeatureAVX2,
787 FeatureBMI,
788 FeatureBMI2,
789 FeatureCLFLUSHOPT,
Craig Topper50f3d142017-02-09 04:27:34 +0000790 FeatureCLZERO,
Craig Topperd55b8312017-01-10 06:01:16 +0000791 FeatureCMPXCHG16B,
792 FeatureF16C,
793 FeatureFMA,
794 FeatureFSGSBase,
795 FeatureFXSR,
796 FeatureFastLZCNT,
797 FeatureLAHFSAHF,
798 FeatureLZCNT,
799 FeatureMMX,
800 FeatureMOVBE,
801 FeatureMWAITX,
802 FeaturePCLMUL,
803 FeaturePOPCNT,
804 FeaturePRFCHW,
805 FeatureRDRAND,
806 FeatureRDSEED,
807 FeatureSHA,
Craig Topperd55b8312017-01-10 06:01:16 +0000808 FeatureSSE4A,
809 FeatureSlowSHLD,
810 FeatureX87,
811 FeatureXSAVE,
812 FeatureXSAVEC,
813 FeatureXSAVEOPT,
814 FeatureXSAVES]>;
815
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000816def : Proc<"geode", [FeatureX87, FeatureSlowUAMem16, Feature3DNowA]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000817
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000818def : Proc<"winchip-c6", [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
819def : Proc<"winchip2", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
820def : Proc<"c3", [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
821def : Proc<"c3-2", [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
822 FeatureSSE1, FeatureFXSR]>;
Evan Chengff1beda2006-10-06 09:17:41 +0000823
Chandler Carruth32908d72014-05-07 17:37:03 +0000824// We also provide a generic 64-bit specific x86 processor model which tries to
825// be good for modern chips without enabling instruction set encodings past the
826// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
827// modern 64-bit x86 chip, and enables features that are generally beneficial.
Michael Liao5bf95782014-12-04 05:20:33 +0000828//
Chandler Carruth32908d72014-05-07 17:37:03 +0000829// We currently use the Sandy Bridge model as the default scheduling model as
830// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
831// covers a huge swath of x86 processors. If there are specific scheduling
832// knobs which need to be tuned differently for AMD chips, we might consider
833// forming a common base for them.
Craig Topper09b65982015-10-16 06:03:09 +0000834def : ProcessorModel<"x86-64", SandyBridgeModel,
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000835 [FeatureX87, FeatureMMX, FeatureSSE2, FeatureFXSR,
836 Feature64Bit, FeatureSlowBTMem ]>;
Chandler Carruth32908d72014-05-07 17:37:03 +0000837
Evan Chengff1beda2006-10-06 09:17:41 +0000838//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +0000839// Register File Description
840//===----------------------------------------------------------------------===//
841
842include "X86RegisterInfo.td"
Igor Bregerb4442f32017-02-10 07:05:56 +0000843include "X86RegisterBanks.td"
Chris Lattner5da8e802003-08-03 15:47:49 +0000844
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000845//===----------------------------------------------------------------------===//
846// Instruction Descriptions
847//===----------------------------------------------------------------------===//
848
Chris Lattner59a4a912003-08-03 21:54:21 +0000849include "X86InstrInfo.td"
850
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +0000851def X86InstrInfo : InstrInfo;
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000852
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000853//===----------------------------------------------------------------------===//
854// Calling Conventions
855//===----------------------------------------------------------------------===//
856
857include "X86CallingConv.td"
858
859
860//===----------------------------------------------------------------------===//
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000861// Assembly Parser
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000862//===----------------------------------------------------------------------===//
863
Devang Patel85d684a2012-01-09 19:13:28 +0000864def ATTAsmParserVariant : AsmParserVariant {
Daniel Dunbar00331992009-07-29 00:02:19 +0000865 int Variant = 0;
Daniel Dunbare4318712009-08-11 20:59:47 +0000866
Chad Rosier9f7a2212013-04-18 22:35:36 +0000867 // Variant name.
868 string Name = "att";
869
Daniel Dunbare4318712009-08-11 20:59:47 +0000870 // Discard comments in assembly strings.
871 string CommentDelimiter = "#";
872
873 // Recognize hard coded registers.
874 string RegisterPrefix = "%";
Daniel Dunbar00331992009-07-29 00:02:19 +0000875}
876
Devang Patel67bf992a2012-01-10 17:51:54 +0000877def IntelAsmParserVariant : AsmParserVariant {
878 int Variant = 1;
879
Chad Rosier9f7a2212013-04-18 22:35:36 +0000880 // Variant name.
881 string Name = "intel";
882
Devang Patel67bf992a2012-01-10 17:51:54 +0000883 // Discard comments in assembly strings.
884 string CommentDelimiter = ";";
885
886 // Recognize hard coded registers.
887 string RegisterPrefix = "";
888}
889
Jim Grosbach4cf25f52010-10-30 13:48:28 +0000890//===----------------------------------------------------------------------===//
891// Assembly Printers
892//===----------------------------------------------------------------------===//
893
Chris Lattner56832602004-10-03 20:36:57 +0000894// The X86 target supports two different syntaxes for emitting machine code.
895// This is controlled by the -x86-asm-syntax={att|intel}
896def ATTAsmWriter : AsmWriter {
Chris Lattner1cbd3de2009-09-13 19:30:11 +0000897 string AsmWriterClassName = "ATTInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000898 int Variant = 0;
899}
900def IntelAsmWriter : AsmWriter {
Chris Lattner13306a12009-09-20 07:47:59 +0000901 string AsmWriterClassName = "IntelInstPrinter";
Chris Lattner56832602004-10-03 20:36:57 +0000902 int Variant = 1;
903}
904
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000905def X86 : Target {
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000906 // Information about the instructions...
Chris Lattner25510802003-08-04 04:59:56 +0000907 let InstructionSet = X86InstrInfo;
Devang Patel67bf992a2012-01-10 17:51:54 +0000908 let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
Chris Lattner56832602004-10-03 20:36:57 +0000909 let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000910}