llvm.org GIT mirror llvm / release_35@215010 lib / Target / X86 / X86.td
release_35@215010

Tree @release_35@215010 (Download .tar.gz)

X86.td @release_35@215010

31d157a
9a0bac4
856ba76
 
4ee451d
 
9a0bac4
856ba76
762fb5f
37f2167
 
762fb5f
 
 
c8f4587
762fb5f
027fdbe
762fb5f
 
2e7a01c
18fb1d3
 
 
 
93c9401
 
 
 
18fb1d3
 
2e7a01c
4222d80
7008416
 
 
 
1292c22
 
 
95eb2ee
4222d80
 
 
 
7008416
9a0bac4
7008416
4222d80
 
 
 
 
 
 
 
 
4aa8bda
63ec90a
 
4aa8bda
63ec90a
d4d3513
4222d80
4babeee
 
4222d80
11d8fda
 
f75e5b4
 
 
11d8fda
1f84e32
 
e66dd40
43f51ae
 
ccb6976
 
46f7257
 
48c58bb
 
 
8cf5ab1
7ba2725
 
a26eb5e
16de463
 
 
 
e7b0550
 
33b5fe7
e3809ee
 
33b5fe7
c18f4ef
 
33b5fe7
c18f4ef
 
33b5fe7
c18f4ef
 
aac33cf
 
 
 
 
 
 
 
 
c8e340d
 
da1a984
a15f9d5
c38fff4
 
343dadb
7ba2725
e499cdf
7ba2725
e106d2e
9418f17
95eb2ee
 
 
6d1cd1c
da1a984
 
4da6134
 
581fe82
 
4aa8bda
581fe82
da39404
5fefc00
 
e7b0550
 
37f2167
 
909652f
 
b53fa8b
 
be02a90
 
0ca1a7f
 
7b672ed
 
1f1bd9a
 
 
675eb3b
 
c26392a
 
de1df10
 
2e2efd9
c7b902e
 
 
 
 
1edadea
 
 
d6ac8e9
 
0d0bab5
 
a2bc695
 
343dadb
a26eb5e
 
 
 
922d314
 
 
 
94dc654
 
922d314
a26eb5e
2661b41
922d314
a26eb5e
 
 
2194d46
a26eb5e
 
 
7008416
 
cd6cea0
34868ee
ccb6976
cd6cea0
34868ee
905e335
6b359ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1edadea
 
d6ac8e9
1edadea
6b359ec
94dc654
 
 
 
 
 
 
a2bc695
177c1ef
6d1cd1c
6b359ec
 
 
 
 
 
 
6d1cd1c
 
6b359ec
 
 
 
717073c
2ea8ee7
 
6b359ec
 
 
717073c
6b359ec
 
 
 
a26eb5e
909652f
59af9d0
6b359ec
 
 
0ca1a7f
 
909652f
e3809ee
 
 
 
 
 
 
0780b6d
 
e3809ee
aac33cf
 
 
 
 
 
 
 
 
 
 
a26eb5e
4babeee
 
adaa3e5
46f7257
 
 
 
 
 
 
 
 
f75e5b4
46f7257
f75e5b4
46f7257
f75e5b4
46f7257
f75e5b4
46f7257
43f51ae
46f7257
43f51ae
46f7257
43f51ae
46f7257
e499cdf
5f794df
46f7257
 
66a7fd7
 
46f7257
 
b9548d8
 
cdb9bd7
 
46f7257
66a7fd7
e499cdf
cdb9bd7
46f7257
b9548d8
e499cdf
cdb9bd7
e499cdf
46f7257
 
00e3be6
 
 
 
 
 
 
 
3cddd16
 
 
 
 
 
 
ee3392b
a26eb5e
 
4babeee
 
cd6cea0
a26eb5e
905e335
 
 
 
 
 
 
 
 
 
 
 
 
 
a26eb5e
762fb5f
 
 
 
 
b77eb78
 
 
 
1cca5e3
 
fddb766
b77eb78
31c8a6d
 
 
 
 
 
 
 
604cdf6
31c8a6d
 
0e2771f
dd929fc
0dbcada
 
 
0e2771f
59fc42d
88eb89b
 
 
59fc42d
 
 
 
 
0e2771f
 
4ba0e75
 
 
88eb89b
 
 
4ba0e75
 
 
 
 
 
 
604cdf6
 
 
 
9a3e49a
 
 
cae05cb
9a3e49a
 
 
7057641
9a3e49a
 
 
b77eb78
 
c8f4587
0e2771f
4ba0e75
9a3e49a
b77eb78
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
//===-- X86.td - Target definition file for the Intel X86 --*- tablegen -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This is a target description file for the Intel i386 architecture, referred
// to here as the "X86" architecture.
//
//===----------------------------------------------------------------------===//

// Get the target-independent interfaces which we are implementing...
//
include "llvm/Target/Target.td"

//===----------------------------------------------------------------------===//
// X86 Subtarget state
//

def Mode64Bit : SubtargetFeature<"64bit-mode", "In64BitMode", "true",
                                  "64-bit mode (x86_64)">;
def Mode32Bit : SubtargetFeature<"32bit-mode", "In32BitMode", "true",
                                  "32-bit mode (80386)">;
def Mode16Bit : SubtargetFeature<"16bit-mode", "In16BitMode", "true",
                                  "16-bit mode (i8086)">;

//===----------------------------------------------------------------------===//
// X86 Subtarget features
//===----------------------------------------------------------------------===//

def FeatureCMOV    : SubtargetFeature<"cmov","HasCMov", "true",
                                      "Enable conditional move instructions">;

def FeaturePOPCNT   : SubtargetFeature<"popcnt", "HasPOPCNT", "true",
                                       "Support POPCNT instruction">;


def FeatureMMX     : SubtargetFeature<"mmx","X86SSELevel", "MMX",
                                      "Enable MMX instructions">;
def FeatureSSE1    : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
                                      "Enable SSE instructions",
                                      // SSE codegen depends on cmovs, and all
                                      // SSE1+ processors support them.
                                      [FeatureMMX, FeatureCMOV]>;
def FeatureSSE2    : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
                                      "Enable SSE2 instructions",
                                      [FeatureSSE1]>;
def FeatureSSE3    : SubtargetFeature<"sse3", "X86SSELevel", "SSE3",
                                      "Enable SSE3 instructions",
                                      [FeatureSSE2]>;
def FeatureSSSE3   : SubtargetFeature<"ssse3", "X86SSELevel", "SSSE3",
                                      "Enable SSSE3 instructions",
                                      [FeatureSSE3]>;
def FeatureSSE41   : SubtargetFeature<"sse4.1", "X86SSELevel", "SSE41",
                                      "Enable SSE 4.1 instructions",
                                      [FeatureSSSE3]>;
def FeatureSSE42   : SubtargetFeature<"sse4.2", "X86SSELevel", "SSE42",
                                      "Enable SSE 4.2 instructions",
                                      [FeatureSSE41]>;
def Feature3DNow   : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow",
                                      "Enable 3DNow! instructions",
                                      [FeatureMMX]>;
def Feature3DNowA  : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA",
                                      "Enable 3DNow! Athlon instructions",
                                      [Feature3DNow]>;
// All x86-64 hardware has SSE2, but we don't mark SSE2 as an implied
// feature, because SSE2 can be disabled (e.g. for compiling OS kernels)
// without disabling 64-bit mode.
def Feature64Bit   : SubtargetFeature<"64bit", "HasX86_64", "true",
                                      "Support 64-bit instructions",
                                      [FeatureCMOV]>;
def FeatureCMPXCHG16B : SubtargetFeature<"cx16", "HasCmpxchg16b", "true",
                                      "64-bit with cmpxchg16b",
                                      [Feature64Bit]>;
def FeatureSlowBTMem : SubtargetFeature<"slow-bt-mem", "IsBTMemSlow", "true",
                                       "Bit testing of memory is slow">;
def FeatureSlowSHLD : SubtargetFeature<"slow-shld", "IsSHLDSlow", "true",
                                       "SHLD instruction is slow">;
def FeatureFastUAMem : SubtargetFeature<"fast-unaligned-mem",
                                        "IsUAMemFast", "true",
                                        "Fast unaligned memory access">;
def FeatureSSE4A   : SubtargetFeature<"sse4a", "HasSSE4A", "true",
                                      "Support SSE 4a instructions",
                                      [FeatureSSE3]>;

def FeatureAVX     : SubtargetFeature<"avx", "X86SSELevel", "AVX",
                                      "Enable AVX instructions",
                                      [FeatureSSE42]>;
def FeatureAVX2    : SubtargetFeature<"avx2", "X86SSELevel", "AVX2",
                                      "Enable AVX2 instructions",
                                      [FeatureAVX]>;
def FeatureAVX512   : SubtargetFeature<"avx512f", "X86SSELevel", "AVX512F",
                                      "Enable AVX-512 instructions",
                                      [FeatureAVX2]>;
def FeatureERI      : SubtargetFeature<"avx512er", "HasERI", "true",
                      "Enable AVX-512 Exponential and Reciprocal Instructions",
                                      [FeatureAVX512]>;
def FeatureCDI      : SubtargetFeature<"avx512cd", "HasCDI", "true",
                      "Enable AVX-512 Conflict Detection Instructions",
                                      [FeatureAVX512]>;
def FeaturePFI      : SubtargetFeature<"avx512pf", "HasPFI", "true",
                      "Enable AVX-512 PreFetch Instructions",
                                      [FeatureAVX512]>;
def FeatureDQI     : SubtargetFeature<"avx512dq", "HasDQI", "true",
                      "Enable AVX-512 Doubleword and Quadword Instructions",
                                      [FeatureAVX512]>;
def FeatureBWI     : SubtargetFeature<"avx512bw", "HasBWI", "true",
                      "Enable AVX-512 Byte and Word Instructions",
                                      [FeatureAVX512]>;
def FeatureVLX     : SubtargetFeature<"avx512vl", "HasVLX", "true",
                      "Enable AVX-512 Vector Length eXtensions",
                                      [FeatureAVX512]>;
def FeaturePCLMUL  : SubtargetFeature<"pclmul", "HasPCLMUL", "true",
                         "Enable packed carry-less multiplication instructions",
                               [FeatureSSE2]>;
def FeatureFMA     : SubtargetFeature<"fma", "HasFMA", "true",
                                      "Enable three-operand fused multiple-add",
                                      [FeatureAVX]>;
def FeatureFMA4    : SubtargetFeature<"fma4", "HasFMA4", "true",
                                      "Enable four-operand fused multiple-add",
                                      [FeatureAVX, FeatureSSE4A]>;
def FeatureXOP     : SubtargetFeature<"xop", "HasXOP", "true",
                                      "Enable XOP instructions",
                                      [FeatureFMA4]>;
def FeatureVectorUAMem : SubtargetFeature<"vector-unaligned-mem",
                                          "HasVectorUAMem", "true",
                 "Allow unaligned memory operands on vector/SIMD instructions">;
def FeatureAES     : SubtargetFeature<"aes", "HasAES", "true",
                                      "Enable AES instructions",
                                      [FeatureSSE2]>;
def FeatureTBM     : SubtargetFeature<"tbm", "HasTBM", "true",
                                      "Enable TBM instructions">;
def FeatureMOVBE   : SubtargetFeature<"movbe", "HasMOVBE", "true",
                                      "Support MOVBE instruction">;
def FeatureRDRAND  : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
                                      "Support RDRAND instruction">;
def FeatureF16C    : SubtargetFeature<"f16c", "HasF16C", "true",
                       "Support 16-bit floating point conversion instructions",
                       [FeatureAVX]>;
def FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
                                       "Support FS/GS Base instructions">;
def FeatureLZCNT   : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
                                      "Support LZCNT instruction">;
def FeatureBMI     : SubtargetFeature<"bmi", "HasBMI", "true",
                                      "Support BMI instructions">;
def FeatureBMI2    : SubtargetFeature<"bmi2", "HasBMI2", "true",
                                      "Support BMI2 instructions">;
def FeatureRTM     : SubtargetFeature<"rtm", "HasRTM", "true",
                                      "Support RTM instructions">;
def FeatureHLE     : SubtargetFeature<"hle", "HasHLE", "true",
                                      "Support HLE">;
def FeatureADX     : SubtargetFeature<"adx", "HasADX", "true",
                                      "Support ADX instructions">;
def FeatureSHA     : SubtargetFeature<"sha", "HasSHA", "true",
                                      "Enable SHA instructions",
                                      [FeatureSSE2]>;
def FeaturePRFCHW  : SubtargetFeature<"prfchw", "HasPRFCHW", "true",
                                      "Support PRFCHW instructions">;
def FeatureRDSEED  : SubtargetFeature<"rdseed", "HasRDSEED", "true",
                                      "Support RDSEED instruction">;
def FeatureLeaForSP : SubtargetFeature<"lea-sp", "UseLeaForSP", "true",
                                     "Use LEA for adjusting the stack pointer">;
def FeatureSlowDivide : SubtargetFeature<"idiv-to-divb",
                                     "HasSlowDivide", "true",
                                     "Use small divide for positive values less than 256">;
def FeaturePadShortFunctions : SubtargetFeature<"pad-short-functions",
                                     "PadShortFunctions", "true",
                                     "Pad short functions">;
def FeatureCallRegIndirect : SubtargetFeature<"call-reg-indirect",
                                     "CallRegIndirect", "true",
                                     "Call register indirect">;
def FeatureLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LEAUsesAG", "true",
                                   "LEA instruction needs inputs at AG stage">;
def FeatureSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
                                   "LEA instruction with certain arguments is slow">;
def FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
                                   "INC and DEC instructions are slower than ADD and SUB">;

//===----------------------------------------------------------------------===//
// X86 processors supported.
//===----------------------------------------------------------------------===//

include "X86Schedule.td"

def ProcIntelAtom : SubtargetFeature<"atom", "X86ProcFamily", "IntelAtom",
                    "Intel Atom processors">;
def ProcIntelSLM  : SubtargetFeature<"slm", "X86ProcFamily", "IntelSLM",
                    "Intel Silvermont processors">;

class Proc<string Name, list<SubtargetFeature> Features>
 : ProcessorModel<Name, GenericModel, Features>;

def : Proc<"generic",         []>;
def : Proc<"i386",            []>;
def : Proc<"i486",            []>;
def : Proc<"i586",            []>;
def : Proc<"pentium",         []>;
def : Proc<"pentium-mmx",     [FeatureMMX]>;
def : Proc<"i686",            []>;
def : Proc<"pentiumpro",      [FeatureCMOV]>;
def : Proc<"pentium2",        [FeatureMMX, FeatureCMOV]>;
def : Proc<"pentium3",        [FeatureSSE1]>;
def : Proc<"pentium3m",       [FeatureSSE1, FeatureSlowBTMem]>;
def : Proc<"pentium-m",       [FeatureSSE2, FeatureSlowBTMem]>;
def : Proc<"pentium4",        [FeatureSSE2]>;
def : Proc<"pentium4m",       [FeatureSSE2, FeatureSlowBTMem]>;

// Intel Core Duo.
def : ProcessorModel<"yonah", SandyBridgeModel,
                     [FeatureSSE3, FeatureSlowBTMem]>;

// NetBurst.
def : Proc<"prescott", [FeatureSSE3, FeatureSlowBTMem]>;
def : Proc<"nocona",   [FeatureSSE3, FeatureCMPXCHG16B, FeatureSlowBTMem]>;

// Intel Core 2 Solo/Duo.
def : ProcessorModel<"core2", SandyBridgeModel,
                     [FeatureSSSE3, FeatureCMPXCHG16B, FeatureSlowBTMem]>;
def : ProcessorModel<"penryn", SandyBridgeModel,
                     [FeatureSSE41, FeatureCMPXCHG16B, FeatureSlowBTMem]>;

// Atom.
def : ProcessorModel<"atom", AtomModel,
                     [ProcIntelAtom, FeatureSSSE3, FeatureCMPXCHG16B,
                      FeatureMOVBE, FeatureSlowBTMem, FeatureLeaForSP,
                      FeatureSlowDivide,
                      FeatureCallRegIndirect,
                      FeatureLEAUsesAG,
                      FeaturePadShortFunctions]>;

// Atom Silvermont.
def : ProcessorModel<"slm",  SLMModel, [ProcIntelSLM,
                               FeatureSSE42, FeatureCMPXCHG16B,
                               FeatureMOVBE, FeaturePOPCNT,
                               FeaturePCLMUL, FeatureAES,
                               FeatureCallRegIndirect,
                               FeaturePRFCHW,
                               FeatureSlowLEA, FeatureSlowIncDec,
                               FeatureSlowBTMem, FeatureFastUAMem]>;
// "Arrandale" along with corei3 and corei5
def : ProcessorModel<"corei7", SandyBridgeModel,
                     [FeatureSSE42, FeatureCMPXCHG16B, FeatureSlowBTMem,
                      FeatureFastUAMem, FeaturePOPCNT, FeatureAES]>;

def : ProcessorModel<"nehalem", SandyBridgeModel,
                     [FeatureSSE42,  FeatureCMPXCHG16B, FeatureSlowBTMem,
                      FeatureFastUAMem, FeaturePOPCNT]>;
// Westmere is a similar machine to nehalem with some additional features.
// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
def : ProcessorModel<"westmere", SandyBridgeModel,
                     [FeatureSSE42, FeatureCMPXCHG16B, FeatureSlowBTMem,
                      FeatureFastUAMem, FeaturePOPCNT, FeatureAES,
                      FeaturePCLMUL]>;
// Sandy Bridge
// SSE is not listed here since llvm treats AVX as a reimplementation of SSE,
// rather than a superset.
def : ProcessorModel<"corei7-avx", SandyBridgeModel,
                     [FeatureAVX, FeatureCMPXCHG16B, FeatureFastUAMem,
                      FeaturePOPCNT, FeatureAES, FeaturePCLMUL]>;
// Ivy Bridge
def : ProcessorModel<"core-avx-i", SandyBridgeModel,
                     [FeatureAVX, FeatureCMPXCHG16B, FeatureFastUAMem,
                      FeaturePOPCNT, FeatureAES, FeaturePCLMUL, FeatureRDRAND,
                      FeatureF16C, FeatureFSGSBase]>;

// Haswell
def : ProcessorModel<"core-avx2", HaswellModel,
                     [FeatureAVX2, FeatureCMPXCHG16B, FeatureFastUAMem,
                      FeaturePOPCNT, FeatureAES, FeaturePCLMUL, FeatureRDRAND,
                      FeatureF16C, FeatureFSGSBase, FeatureMOVBE, FeatureLZCNT,
                      FeatureBMI, FeatureBMI2, FeatureFMA, FeatureRTM,
                      FeatureHLE]>;

// KNL
// FIXME: define KNL model
def : ProcessorModel<"knl", HaswellModel,
                     [FeatureAVX512, FeatureERI, FeatureCDI, FeaturePFI,
                      FeatureCMPXCHG16B, FeatureFastUAMem, FeaturePOPCNT,
                      FeatureAES, FeaturePCLMUL, FeatureRDRAND, FeatureF16C,
                      FeatureFSGSBase, FeatureMOVBE, FeatureLZCNT, FeatureBMI,
                      FeatureBMI2, FeatureFMA, FeatureRTM, FeatureHLE,
                      FeatureSlowIncDec]>;

// SKX
// FIXME: define SKX model
def : ProcessorModel<"skx", HaswellModel,
                     [FeatureAVX512, FeatureCDI,
                      FeatureDQI, FeatureBWI, FeatureVLX,
                      FeatureCMPXCHG16B, FeatureFastUAMem, FeaturePOPCNT,
                      FeatureAES, FeaturePCLMUL, FeatureRDRAND, FeatureF16C,
                      FeatureFSGSBase, FeatureMOVBE, FeatureLZCNT, FeatureBMI,
                      FeatureBMI2, FeatureFMA, FeatureRTM, FeatureHLE,
                      FeatureSlowIncDec]>;

def : Proc<"k6",              [FeatureMMX]>;
def : Proc<"k6-2",            [Feature3DNow]>;
def : Proc<"k6-3",            [Feature3DNow]>;
def : Proc<"athlon",          [Feature3DNowA, FeatureSlowBTMem,
                               FeatureSlowSHLD]>;
def : Proc<"athlon-tbird",    [Feature3DNowA, FeatureSlowBTMem,
                               FeatureSlowSHLD]>;
def : Proc<"athlon-4",        [FeatureSSE1,   Feature3DNowA, FeatureSlowBTMem, 
                               FeatureSlowSHLD]>;
def : Proc<"athlon-xp",       [FeatureSSE1,   Feature3DNowA, FeatureSlowBTMem,
                               FeatureSlowSHLD]>;
def : Proc<"athlon-mp",       [FeatureSSE1,   Feature3DNowA, FeatureSlowBTMem,
                               FeatureSlowSHLD]>;
def : Proc<"k8",              [FeatureSSE2,   Feature3DNowA, Feature64Bit,
                               FeatureSlowBTMem, FeatureSlowSHLD]>;
def : Proc<"opteron",         [FeatureSSE2,   Feature3DNowA, Feature64Bit,
                               FeatureSlowBTMem, FeatureSlowSHLD]>;
def : Proc<"athlon64",        [FeatureSSE2,   Feature3DNowA, Feature64Bit,
                               FeatureSlowBTMem, FeatureSlowSHLD]>;
def : Proc<"athlon-fx",       [FeatureSSE2,   Feature3DNowA, Feature64Bit,
                               FeatureSlowBTMem, FeatureSlowSHLD]>;
def : Proc<"k8-sse3",         [FeatureSSE3,   Feature3DNowA, FeatureCMPXCHG16B,
                               FeatureSlowBTMem, FeatureSlowSHLD]>;
def : Proc<"opteron-sse3",    [FeatureSSE3,   Feature3DNowA, FeatureCMPXCHG16B,
                               FeatureSlowBTMem, FeatureSlowSHLD]>;
def : Proc<"athlon64-sse3",   [FeatureSSE3,   Feature3DNowA, FeatureCMPXCHG16B,
                               FeatureSlowBTMem, FeatureSlowSHLD]>;
def : Proc<"amdfam10",        [FeatureSSE4A,
                               Feature3DNowA, FeatureCMPXCHG16B, FeatureLZCNT,
                               FeaturePOPCNT, FeatureSlowBTMem,
                               FeatureSlowSHLD]>;
// Bobcat
def : Proc<"btver1",          [FeatureSSSE3, FeatureSSE4A, FeatureCMPXCHG16B,
                               FeaturePRFCHW, FeatureLZCNT, FeaturePOPCNT,
                               FeatureSlowSHLD]>;
// Jaguar
def : Proc<"btver2",          [FeatureAVX, FeatureSSE4A, FeatureCMPXCHG16B,
                               FeaturePRFCHW, FeatureAES, FeaturePCLMUL,
                               FeatureBMI, FeatureF16C, FeatureMOVBE,
                               FeatureLZCNT, FeaturePOPCNT, FeatureSlowSHLD]>;
// Bulldozer
def : Proc<"bdver1",          [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
                               FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
                               FeatureLZCNT, FeaturePOPCNT, FeatureSlowSHLD]>;
// Piledriver
def : Proc<"bdver2",          [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
                               FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
                               FeatureF16C, FeatureLZCNT,
                               FeaturePOPCNT, FeatureBMI, FeatureTBM,
                               FeatureFMA, FeatureSlowSHLD]>;

// Steamroller
def : Proc<"bdver3",          [FeatureXOP, FeatureFMA4, FeatureCMPXCHG16B,
                               FeatureAES, FeaturePRFCHW, FeaturePCLMUL,
                               FeatureF16C, FeatureLZCNT,
                               FeaturePOPCNT, FeatureBMI,  FeatureTBM,
                               FeatureFMA, FeatureFSGSBase]>;

// Excavator
def : Proc<"bdver4",          [FeatureAVX2, FeatureXOP, FeatureFMA4,
                               FeatureCMPXCHG16B, FeatureAES, FeaturePRFCHW,
                               FeaturePCLMUL, FeatureF16C, FeatureLZCNT,
                               FeaturePOPCNT, FeatureBMI, FeatureBMI2,
                               FeatureTBM, FeatureFMA, FeatureFSGSBase]>;

def : Proc<"geode",           [Feature3DNowA]>;

def : Proc<"winchip-c6",      [FeatureMMX]>;
def : Proc<"winchip2",        [Feature3DNow]>;
def : Proc<"c3",              [Feature3DNow]>;
def : Proc<"c3-2",            [FeatureSSE1]>;

// We also provide a generic 64-bit specific x86 processor model which tries to
// be good for modern chips without enabling instruction set encodings past the
// basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
// modern 64-bit x86 chip, and enables features that are generally beneficial.
// 
// We currently use the Sandy Bridge model as the default scheduling model as
// we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
// covers a huge swath of x86 processors. If there are specific scheduling
// knobs which need to be tuned differently for AMD chips, we might consider
// forming a common base for them.
def : ProcessorModel<"x86-64", SandyBridgeModel,
                     [FeatureSSE2, Feature64Bit, FeatureSlowBTMem,
                      FeatureFastUAMem]>;

//===----------------------------------------------------------------------===//
// Register File Description
//===----------------------------------------------------------------------===//

include "X86RegisterInfo.td"

//===----------------------------------------------------------------------===//
// Instruction Descriptions
//===----------------------------------------------------------------------===//

include "X86InstrInfo.td"

def X86InstrInfo : InstrInfo;

//===----------------------------------------------------------------------===//
// Calling Conventions
//===----------------------------------------------------------------------===//

include "X86CallingConv.td"


//===----------------------------------------------------------------------===//
// Assembly Parser
//===----------------------------------------------------------------------===//

def ATTAsmParser : AsmParser {
  string AsmParserClassName = "AsmParser";
}

def ATTAsmParserVariant : AsmParserVariant {
  int Variant = 0;

  // Variant name.
  string Name = "att";

  // Discard comments in assembly strings.
  string CommentDelimiter = "#";

  // Recognize hard coded registers.
  string RegisterPrefix = "%";
}

def IntelAsmParserVariant : AsmParserVariant {
  int Variant = 1;

  // Variant name.
  string Name = "intel";

  // Discard comments in assembly strings.
  string CommentDelimiter = ";";

  // Recognize hard coded registers.
  string RegisterPrefix = "";
}

//===----------------------------------------------------------------------===//
// Assembly Printers
//===----------------------------------------------------------------------===//

// The X86 target supports two different syntaxes for emitting machine code.
// This is controlled by the -x86-asm-syntax={att|intel}
def ATTAsmWriter : AsmWriter {
  string AsmWriterClassName  = "ATTInstPrinter";
  int Variant = 0;
}
def IntelAsmWriter : AsmWriter {
  string AsmWriterClassName  = "IntelInstPrinter";
  int Variant = 1;
}

def X86 : Target {
  // Information about the instructions...
  let InstructionSet = X86InstrInfo;
  let AssemblyParsers = [ATTAsmParser];
  let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
  let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
}