blob: 89cb749d6461b257be2ad3925cbd53adcc55c6e2 [file] [log] [blame]
Chris Lattner5da8e802003-08-03 15:47:49 +00001//===- X86.td - Target definition file for the Intel X86 arch ---*- C++ -*-===//
John Criswell29265fe2003-10-21 15:17:13 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +00009//
10// This is a target description file for the Intel i386 architecture, refered to
11// here as the "X86" architecture.
12//
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//
17include "../Target.td"
18
19//===----------------------------------------------------------------------===//
Evan Chengff1beda2006-10-06 09:17:41 +000020// X86 Subtarget features.
Bill Wendlinge6182262007-05-04 20:38:40 +000021//===----------------------------------------------------------------------===//
Evan Chengff1beda2006-10-06 09:17:41 +000022
Bill Wendlinge6182262007-05-04 20:38:40 +000023def Feature64Bit : SubtargetFeature<"64bit", "HasX86_64", "true",
24 "Support 64-bit instructions">;
25def FeatureMMX : SubtargetFeature<"mmx","X86SSELevel", "MMX",
26 "Enable MMX instructions">;
27def FeatureSSE1 : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
28 "Enable SSE instructions",
29 [FeatureMMX]>;
30def FeatureSSE2 : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
31 "Enable SSE2 instructions",
32 [FeatureSSE1]>;
33def FeatureSSE3 : SubtargetFeature<"sse3", "X86SSELevel", "SSE3",
34 "Enable SSE3 instructions",
35 [FeatureSSE2]>;
36def FeatureSSSE3 : SubtargetFeature<"ssse3", "X86SSELevel", "SSSE3",
37 "Enable SSSE3 instructions",
38 [FeatureSSE3]>;
39def Feature3DNow : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow",
40 "Enable 3DNow! instructions">;
41def Feature3DNowA : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA",
42 "Enable 3DNow! Athlon instructions">;
Evan Chengff1beda2006-10-06 09:17:41 +000043
44//===----------------------------------------------------------------------===//
45// X86 processors supported.
46//===----------------------------------------------------------------------===//
47
48class Proc<string Name, list<SubtargetFeature> Features>
49 : Processor<Name, NoItineraries, Features>;
50
51def : Proc<"generic", []>;
52def : Proc<"i386", []>;
53def : Proc<"i486", []>;
54def : Proc<"pentium", []>;
55def : Proc<"pentium-mmx", [FeatureMMX]>;
56def : Proc<"i686", []>;
57def : Proc<"pentiumpro", []>;
58def : Proc<"pentium2", [FeatureMMX]>;
59def : Proc<"pentium3", [FeatureMMX, FeatureSSE1]>;
60def : Proc<"pentium-m", [FeatureMMX, FeatureSSE1, FeatureSSE2]>;
61def : Proc<"pentium4", [FeatureMMX, FeatureSSE1, FeatureSSE2]>;
62def : Proc<"x86-64", [FeatureMMX, FeatureSSE1, FeatureSSE2,
63 Feature64Bit]>;
64def : Proc<"yonah", [FeatureMMX, FeatureSSE1, FeatureSSE2,
65 FeatureSSE3]>;
66def : Proc<"prescott", [FeatureMMX, FeatureSSE1, FeatureSSE2,
67 FeatureSSE3]>;
68def : Proc<"nocona", [FeatureMMX, FeatureSSE1, FeatureSSE2,
69 FeatureSSE3, Feature64Bit]>;
70def : Proc<"core2", [FeatureMMX, FeatureSSE1, FeatureSSE2,
Bill Wendling157d7ee2007-04-25 21:31:48 +000071 FeatureSSE3, FeatureSSSE3, Feature64Bit]>;
Evan Chengff1beda2006-10-06 09:17:41 +000072
73def : Proc<"k6", [FeatureMMX]>;
74def : Proc<"k6-2", [FeatureMMX, Feature3DNow]>;
75def : Proc<"k6-3", [FeatureMMX, Feature3DNow]>;
76def : Proc<"athlon", [FeatureMMX, Feature3DNow, Feature3DNowA]>;
77def : Proc<"athlon-tbird", [FeatureMMX, Feature3DNow, Feature3DNowA]>;
78def : Proc<"athlon-4", [FeatureMMX, FeatureSSE1, Feature3DNow,
79 Feature3DNowA]>;
80def : Proc<"athlon-xp", [FeatureMMX, FeatureSSE1, Feature3DNow,
81 Feature3DNowA]>;
82def : Proc<"athlon-mp", [FeatureMMX, FeatureSSE1, Feature3DNow,
83 Feature3DNowA]>;
84def : Proc<"k8", [FeatureMMX, FeatureSSE1, FeatureSSE2,
85 Feature3DNow, Feature3DNowA, Feature64Bit]>;
86def : Proc<"opteron", [FeatureMMX, FeatureSSE1, FeatureSSE2,
87 Feature3DNow, Feature3DNowA, Feature64Bit]>;
88def : Proc<"athlon64", [FeatureMMX, FeatureSSE1, FeatureSSE2,
89 Feature3DNow, Feature3DNowA, Feature64Bit]>;
90def : Proc<"athlon-fx", [FeatureMMX, FeatureSSE1, FeatureSSE2,
91 Feature3DNow, Feature3DNowA, Feature64Bit]>;
92
93def : Proc<"winchip-c6", [FeatureMMX]>;
94def : Proc<"winchip2", [FeatureMMX, Feature3DNow]>;
95def : Proc<"c3", [FeatureMMX, Feature3DNow]>;
96def : Proc<"c3-2", [FeatureMMX, FeatureSSE1]>;
97
98//===----------------------------------------------------------------------===//
Chris Lattner5da8e802003-08-03 15:47:49 +000099// Register File Description
100//===----------------------------------------------------------------------===//
101
102include "X86RegisterInfo.td"
103
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000104//===----------------------------------------------------------------------===//
105// Instruction Descriptions
106//===----------------------------------------------------------------------===//
107
Chris Lattner59a4a912003-08-03 21:54:21 +0000108include "X86InstrInfo.td"
109
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000110def X86InstrInfo : InstrInfo {
Chris Lattner59a4a912003-08-03 21:54:21 +0000111
112 // Define how we want to layout our TargetSpecific information field... This
113 // should be kept up-to-date with the fields in the X86InstrInfo.h file.
John Criswell10db0622004-04-08 20:31:47 +0000114 let TSFlagsFields = ["FormBits",
115 "hasOpSizePrefix",
Evan Cheng11b0a5d2006-09-08 06:48:29 +0000116 "hasAdSizePrefix",
John Criswell10db0622004-04-08 20:31:47 +0000117 "Prefix",
Evan Cheng11b0a5d2006-09-08 06:48:29 +0000118 "hasREX_WPrefix",
John Criswell10db0622004-04-08 20:31:47 +0000119 "ImmTypeBits",
120 "FPFormBits",
John Criswell10db0622004-04-08 20:31:47 +0000121 "Opcode"];
122 let TSFlagsShifts = [0,
John Criswell10db0622004-04-08 20:31:47 +0000123 6,
Evan Cheng9e350cd2006-02-01 06:13:50 +0000124 7,
Evan Cheng11b0a5d2006-09-08 06:48:29 +0000125 8,
126 12,
Evan Cheng9e350cd2006-02-01 06:13:50 +0000127 13,
Evan Cheng11b0a5d2006-09-08 06:48:29 +0000128 16,
129 24];
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000130}
131
Chris Lattner5d00a0b2007-02-26 18:17:14 +0000132//===----------------------------------------------------------------------===//
133// Calling Conventions
134//===----------------------------------------------------------------------===//
135
136include "X86CallingConv.td"
137
138
139//===----------------------------------------------------------------------===//
140// Assembly Printers
141//===----------------------------------------------------------------------===//
142
Chris Lattner56832602004-10-03 20:36:57 +0000143// The X86 target supports two different syntaxes for emitting machine code.
144// This is controlled by the -x86-asm-syntax={att|intel}
145def ATTAsmWriter : AsmWriter {
146 string AsmWriterClassName = "ATTAsmPrinter";
147 int Variant = 0;
148}
149def IntelAsmWriter : AsmWriter {
150 string AsmWriterClassName = "IntelAsmPrinter";
151 int Variant = 1;
152}
153
154
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000155def X86 : Target {
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000156 // Information about the instructions...
Chris Lattner25510802003-08-04 04:59:56 +0000157 let InstructionSet = X86InstrInfo;
Chris Lattner56832602004-10-03 20:36:57 +0000158
159 let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
Chris Lattnera8c3cff2003-08-03 18:19:37 +0000160}