2007-10-12 23:30:57 +02:00
|
|
|
//===- X86.td - Target definition file for the Intel X86 ---*- tablegen -*-===//
|
2003-10-21 17:17:13 +02:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-29 21:36:04 +01:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2003-10-21 17:17:13 +02:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2003-08-03 17:47:49 +02:00
|
|
|
//
|
|
|
|
// This is a target description file for the Intel i386 architecture, refered to
|
|
|
|
// here as the "X86" architecture.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2003-08-04 06:59:56 +02:00
|
|
|
// Get the target-independent interfaces which we are implementing...
|
2003-08-03 17:47:49 +02:00
|
|
|
//
|
2008-11-24 08:34:46 +01:00
|
|
|
include "llvm/Target/Target.td"
|
2003-08-03 17:47:49 +02:00
|
|
|
|
2006-10-06 11:17:41 +02:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// X86 Subtarget features.
|
2007-05-04 22:38:40 +02:00
|
|
|
//===----------------------------------------------------------------------===//
|
2009-09-02 07:53:04 +02:00
|
|
|
|
|
|
|
def FeatureCMOV : SubtargetFeature<"cmov","HasCMov", "true",
|
|
|
|
"Enable conditional move instructions">;
|
|
|
|
|
2010-01-11 17:29:42 +01:00
|
|
|
|
2007-05-04 22:38:40 +02:00
|
|
|
def FeatureMMX : SubtargetFeature<"mmx","X86SSELevel", "MMX",
|
|
|
|
"Enable MMX instructions">;
|
|
|
|
def FeatureSSE1 : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
|
|
|
|
"Enable SSE instructions",
|
2009-09-02 07:53:04 +02:00
|
|
|
// SSE codegen depends on cmovs, and all
|
|
|
|
// SSE1+ processors support them.
|
|
|
|
[FeatureMMX, FeatureCMOV]>;
|
2007-05-04 22:38:40 +02:00
|
|
|
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]>;
|
2008-02-03 08:18:54 +01:00
|
|
|
def FeatureSSE41 : SubtargetFeature<"sse41", "X86SSELevel", "SSE41",
|
|
|
|
"Enable SSE 4.1 instructions",
|
|
|
|
[FeatureSSSE3]>;
|
|
|
|
def FeatureSSE42 : SubtargetFeature<"sse42", "X86SSELevel", "SSE42",
|
|
|
|
"Enable SSE 4.2 instructions",
|
|
|
|
[FeatureSSE41]>;
|
2007-05-04 22:38:40 +02:00
|
|
|
def Feature3DNow : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow",
|
|
|
|
"Enable 3DNow! instructions">;
|
|
|
|
def Feature3DNowA : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA",
|
2007-05-06 09:56:19 +02:00
|
|
|
"Enable 3DNow! Athlon instructions",
|
|
|
|
[Feature3DNow]>;
|
2009-02-03 01:04:43 +01:00
|
|
|
// 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.
|
2007-05-06 09:56:19 +02:00
|
|
|
def Feature64Bit : SubtargetFeature<"64bit", "HasX86_64", "true",
|
2010-03-14 23:24:34 +01:00
|
|
|
"Support 64-bit instructions",
|
|
|
|
[FeatureCMOV]>;
|
2009-01-02 06:35:45 +01:00
|
|
|
def FeatureSlowBTMem : SubtargetFeature<"slow-bt-mem", "IsBTMemSlow", "true",
|
|
|
|
"Bit testing of memory is slow">;
|
2010-04-01 07:58:17 +02:00
|
|
|
def FeatureFastUAMem : SubtargetFeature<"fast-unaligned-mem",
|
|
|
|
"IsUAMemFast", "true",
|
|
|
|
"Fast unaligned memory access">;
|
2009-05-26 23:04:35 +02:00
|
|
|
def FeatureSSE4A : SubtargetFeature<"sse4a", "HasSSE4A", "true",
|
|
|
|
"Support SSE 4a instructions">;
|
2006-10-06 11:17:41 +02:00
|
|
|
|
2009-06-27 00:46:54 +02:00
|
|
|
def FeatureAVX : SubtargetFeature<"avx", "HasAVX", "true",
|
|
|
|
"Enable AVX instructions">;
|
|
|
|
def FeatureFMA3 : SubtargetFeature<"fma3", "HasFMA3", "true",
|
Instruction fixes, added instructions, and AsmString changes in the
X86 instruction tables.
Also (while I was at it) cleaned up the X86 tables, removing tabs and
80-line violations.
This patch was reviewed by Chris Lattner, but please let me know if
there are any problems.
* X86*.td
Removed tabs and fixed 80-line violations
* X86Instr64bit.td
(IRET, POPCNT, BT_, LSL, SWPGS, PUSH_S, POP_S, L_S, SMSW)
Added
(CALL, CMOV) Added qualifiers
(JMP) Added PC-relative jump instruction
(POPFQ/PUSHFQ) Added qualifiers; renamed PUSHFQ to indicate
that it is 64-bit only (ambiguous since it has no
REX prefix)
(MOV) Added rr form going the other way, which is encoded
differently
(MOV) Changed immediates to offsets, which is more correct;
also fixed MOV64o64a to have to a 64-bit offset
(MOV) Fixed qualifiers
(MOV) Added debug-register and condition-register moves
(MOVZX) Added more forms
(ADC, SUB, SBB, AND, OR, XOR) Added reverse forms, which
(as with MOV) are encoded differently
(ROL) Made REX.W required
(BT) Uncommented mr form for disassembly only
(CVT__2__) Added several missing non-intrinsic forms
(LXADD, XCHG) Reordered operands to make more sense for
MRMSrcMem
(XCHG) Added register-to-register forms
(XADD, CMPXCHG, XCHG) Added non-locked forms
* X86InstrSSE.td
(CVTSS2SI, COMISS, CVTTPS2DQ, CVTPS2PD, CVTPD2PS, MOVQ)
Added
* X86InstrFPStack.td
(COM_FST0, COMP_FST0, COM_FI, COM_FIP, FFREE, FNCLEX, FNOP,
FXAM, FLDL2T, FLDL2E, FLDPI, FLDLG2, FLDLN2, F2XM1, FYL2X,
FPTAN, FPATAN, FXTRACT, FPREM1, FDECSTP, FINCSTP, FPREM,
FYL2XP1, FSINCOS, FRNDINT, FSCALE, FCOMPP, FXSAVE,
FXRSTOR)
Added
(FCOM, FCOMP) Added qualifiers
(FSTENV, FSAVE, FSTSW) Fixed opcode names
(FNSTSW) Added implicit register operand
* X86InstrInfo.td
(opaque512mem) Added for FXSAVE/FXRSTOR
(offset8, offset16, offset32, offset64) Added for MOV
(NOOPW, IRET, POPCNT, IN, BTC, BTR, BTS, LSL, INVLPG, STR,
LTR, PUSHFS, PUSHGS, POPFS, POPGS, LDS, LSS, LES, LFS,
LGS, VERR, VERW, SGDT, SIDT, SLDT, LGDT, LIDT, LLDT,
LODSD, OUTSB, OUTSW, OUTSD, HLT, RSM, FNINIT, CLC, STC,
CLI, STI, CLD, STD, CMC, CLTS, XLAT, WRMSR, RDMSR, RDPMC,
SMSW, LMSW, CPUID, INVD, WBINVD, INVEPT, INVVPID, VMCALL,
VMCLEAR, VMLAUNCH, VMRESUME, VMPTRLD, VMPTRST, VMREAD,
VMWRITE, VMXOFF, VMXON) Added
(NOOPL, POPF, POPFD, PUSHF, PUSHFD) Added qualifier
(JO, JNO, JB, JAE, JE, JNE, JBE, JA, JS, JNS, JP, JNP, JL,
JGE, JLE, JG, JCXZ) Added 32-bit forms
(MOV) Changed some immediate forms to offset forms
(MOV) Added reversed reg-reg forms, which are encoded
differently
(MOV) Added debug-register and condition-register moves
(CMOV) Added qualifiers
(AND, OR, XOR, ADC, SUB, SBB) Added reverse forms, like MOV
(BT) Uncommented memory-register forms for disassembler
(MOVSX, MOVZX) Added forms
(XCHG, LXADD) Made operand order make sense for MRMSrcMem
(XCHG) Added register-register forms
(XADD, CMPXCHG) Added unlocked forms
* X86InstrMMX.td
(MMX_MOVD, MMV_MOVQ) Added forms
* X86InstrInfo.cpp: Changed PUSHFQ to PUSHFQ64 to reflect table
change
* X86RegisterInfo.td: Added debug and condition register sets
* x86-64-pic-3.ll: Fixed testcase to reflect call qualifier
* peep-test-3.ll: Fixed testcase to reflect test qualifier
* cmov.ll: Fixed testcase to reflect cmov qualifier
* loop-blocks.ll: Fixed testcase to reflect call qualifier
* x86-64-pic-11.ll: Fixed testcase to reflect call qualifier
* 2009-11-04-SubregCoalescingBug.ll: Fixed testcase to reflect call
qualifier
* x86-64-pic-2.ll: Fixed testcase to reflect call qualifier
* live-out-reg-info.ll: Fixed testcase to reflect test qualifier
* tail-opts.ll: Fixed testcase to reflect call qualifiers
* x86-64-pic-10.ll: Fixed testcase to reflect call qualifier
* bss-pagealigned.ll: Fixed testcase to reflect call qualifier
* x86-64-pic-1.ll: Fixed testcase to reflect call qualifier
* widen_load-1.ll: Fixed testcase to reflect call qualifier
llvm-svn: 91638
2009-12-18 01:01:26 +01:00
|
|
|
"Enable three-operand fused multiple-add">;
|
2009-06-27 00:46:54 +02:00
|
|
|
def FeatureFMA4 : SubtargetFeature<"fma4", "HasFMA4", "true",
|
|
|
|
"Enable four-operand fused multiple-add">;
|
2010-01-11 17:29:42 +01:00
|
|
|
def FeatureVectorUAMem : SubtargetFeature<"vector-unaligned-mem",
|
|
|
|
"HasVectorUAMem", "true",
|
|
|
|
"Allow unaligned memory operands on vector/SIMD instructions">;
|
2010-04-02 23:54:27 +02:00
|
|
|
def FeatureAES : SubtargetFeature<"aes", "HasAES", "true",
|
|
|
|
"Enable AES instructions">;
|
2009-06-27 00:46:54 +02:00
|
|
|
|
2006-10-06 11:17:41 +02:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// X86 processors supported.
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
class Proc<string Name, list<SubtargetFeature> Features>
|
|
|
|
: Processor<Name, NoItineraries, Features>;
|
|
|
|
|
|
|
|
def : Proc<"generic", []>;
|
|
|
|
def : Proc<"i386", []>;
|
|
|
|
def : Proc<"i486", []>;
|
2008-10-15 00:06:33 +02:00
|
|
|
def : Proc<"i586", []>;
|
2006-10-06 11:17:41 +02:00
|
|
|
def : Proc<"pentium", []>;
|
|
|
|
def : Proc<"pentium-mmx", [FeatureMMX]>;
|
|
|
|
def : Proc<"i686", []>;
|
2009-09-02 07:53:04 +02:00
|
|
|
def : Proc<"pentiumpro", [FeatureCMOV]>;
|
|
|
|
def : Proc<"pentium2", [FeatureMMX, FeatureCMOV]>;
|
2007-05-22 07:15:37 +02:00
|
|
|
def : Proc<"pentium3", [FeatureSSE1]>;
|
2009-01-02 06:35:45 +01:00
|
|
|
def : Proc<"pentium-m", [FeatureSSE2, FeatureSlowBTMem]>;
|
2007-05-22 07:15:37 +02:00
|
|
|
def : Proc<"pentium4", [FeatureSSE2]>;
|
2009-12-22 18:47:23 +01:00
|
|
|
def : Proc<"x86-64", [FeatureSSE2, Feature64Bit, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"yonah", [FeatureSSE3, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"prescott", [FeatureSSE3, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"nocona", [FeatureSSE3, Feature64Bit, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"core2", [FeatureSSSE3, Feature64Bit, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"penryn", [FeatureSSE41, Feature64Bit, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"atom", [FeatureSSE3, Feature64Bit, FeatureSlowBTMem]>;
|
2010-04-02 23:54:27 +02:00
|
|
|
// "Arrandale" along with corei3 and corei5
|
2010-04-01 07:58:17 +02:00
|
|
|
def : Proc<"corei7", [FeatureSSE42, Feature64Bit, FeatureSlowBTMem,
|
2010-04-02 23:54:27 +02:00
|
|
|
FeatureFastUAMem, FeatureAES]>;
|
2010-04-01 07:58:17 +02:00
|
|
|
def : Proc<"nehalem", [FeatureSSE42, Feature64Bit, FeatureSlowBTMem,
|
|
|
|
FeatureFastUAMem]>;
|
2010-04-02 23:54:27 +02:00
|
|
|
// Westmere is a similar machine to nehalem with some additional features.
|
|
|
|
// Westmere is the corei3/i5/i7 path from nehalem to sandybridge
|
|
|
|
def : Proc<"westmere", [FeatureSSE42, Feature64Bit, FeatureSlowBTMem,
|
|
|
|
FeatureFastUAMem, FeatureAES]>;
|
2009-06-27 00:46:54 +02:00
|
|
|
// Sandy Bridge does not have FMA
|
2010-04-02 23:54:27 +02:00
|
|
|
// FIXME: Wikipedia says it does... it should have AES as well.
|
2009-12-22 18:47:23 +01:00
|
|
|
def : Proc<"sandybridge", [FeatureSSE42, FeatureAVX, Feature64Bit]>;
|
2006-10-06 11:17:41 +02:00
|
|
|
|
|
|
|
def : Proc<"k6", [FeatureMMX]>;
|
2007-05-22 07:15:37 +02:00
|
|
|
def : Proc<"k6-2", [FeatureMMX, Feature3DNow]>;
|
|
|
|
def : Proc<"k6-3", [FeatureMMX, Feature3DNow]>;
|
2009-01-02 06:35:45 +01:00
|
|
|
def : Proc<"athlon", [FeatureMMX, Feature3DNowA, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"athlon-tbird", [FeatureMMX, Feature3DNowA, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"athlon-4", [FeatureSSE1, Feature3DNowA, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"athlon-xp", [FeatureSSE1, Feature3DNowA, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"athlon-mp", [FeatureSSE1, Feature3DNowA, FeatureSlowBTMem]>;
|
2009-02-03 01:04:43 +01:00
|
|
|
def : Proc<"k8", [FeatureSSE2, Feature3DNowA, Feature64Bit,
|
|
|
|
FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"opteron", [FeatureSSE2, Feature3DNowA, Feature64Bit,
|
|
|
|
FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"athlon64", [FeatureSSE2, Feature3DNowA, Feature64Bit,
|
|
|
|
FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"athlon-fx", [FeatureSSE2, Feature3DNowA, Feature64Bit,
|
|
|
|
FeatureSlowBTMem]>;
|
2009-05-26 23:04:35 +02:00
|
|
|
def : Proc<"k8-sse3", [FeatureSSE3, Feature3DNowA, Feature64Bit,
|
|
|
|
FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"opteron-sse3", [FeatureSSE3, Feature3DNowA, Feature64Bit,
|
|
|
|
FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"athlon64-sse3", [FeatureSSE3, Feature3DNowA, Feature64Bit,
|
|
|
|
FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"amdfam10", [FeatureSSE3, FeatureSSE4A,
|
|
|
|
Feature3DNowA, Feature64Bit, FeatureSlowBTMem]>;
|
|
|
|
def : Proc<"barcelona", [FeatureSSE3, FeatureSSE4A,
|
|
|
|
Feature3DNowA, Feature64Bit, FeatureSlowBTMem]>;
|
2009-06-29 18:54:06 +02:00
|
|
|
def : Proc<"istanbul", [Feature3DNowA, Feature64Bit, FeatureSSE4A,
|
|
|
|
Feature3DNowA]>;
|
|
|
|
def : Proc<"shanghai", [Feature3DNowA, Feature64Bit, FeatureSSE4A,
|
|
|
|
Feature3DNowA]>;
|
2006-10-06 11:17:41 +02:00
|
|
|
|
|
|
|
def : Proc<"winchip-c6", [FeatureMMX]>;
|
|
|
|
def : Proc<"winchip2", [FeatureMMX, Feature3DNow]>;
|
|
|
|
def : Proc<"c3", [FeatureMMX, Feature3DNow]>;
|
2007-05-22 07:15:37 +02:00
|
|
|
def : Proc<"c3-2", [FeatureSSE1]>;
|
2006-10-06 11:17:41 +02:00
|
|
|
|
2003-08-03 17:47:49 +02:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Register File Description
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
include "X86RegisterInfo.td"
|
|
|
|
|
2003-08-03 20:19:37 +02:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Instruction Descriptions
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2003-08-03 23:54:21 +02:00
|
|
|
include "X86InstrInfo.td"
|
|
|
|
|
2010-04-05 05:10:20 +02:00
|
|
|
def X86InstrInfo : InstrInfo;
|
2003-08-03 20:19:37 +02:00
|
|
|
|
2007-02-26 19:17:14 +01:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Calling Conventions
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
include "X86CallingConv.td"
|
|
|
|
|
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Assembly Printers
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2009-07-29 02:02:19 +02:00
|
|
|
// Currently the X86 assembly parser only supports ATT syntax.
|
|
|
|
def ATTAsmParser : AsmParser {
|
2010-05-04 18:12:42 +02:00
|
|
|
string AsmParserClassName = "ATTAsmParser";
|
|
|
|
string AsmParserInstCleanup = "InstructionCleanup";
|
|
|
|
string MatchInstructionName = "MatchInstructionImpl";
|
2009-07-29 02:02:19 +02:00
|
|
|
int Variant = 0;
|
2009-08-11 22:59:47 +02:00
|
|
|
|
|
|
|
// Discard comments in assembly strings.
|
|
|
|
string CommentDelimiter = "#";
|
|
|
|
|
|
|
|
// Recognize hard coded registers.
|
|
|
|
string RegisterPrefix = "%";
|
2009-07-29 02:02:19 +02:00
|
|
|
}
|
|
|
|
|
2004-10-03 22:36:57 +02:00
|
|
|
// The X86 target supports two different syntaxes for emitting machine code.
|
|
|
|
// This is controlled by the -x86-asm-syntax={att|intel}
|
|
|
|
def ATTAsmWriter : AsmWriter {
|
2009-09-13 21:30:11 +02:00
|
|
|
string AsmWriterClassName = "ATTInstPrinter";
|
2004-10-03 22:36:57 +02:00
|
|
|
int Variant = 0;
|
|
|
|
}
|
|
|
|
def IntelAsmWriter : AsmWriter {
|
2009-09-20 09:47:59 +02:00
|
|
|
string AsmWriterClassName = "IntelInstPrinter";
|
2004-10-03 22:36:57 +02:00
|
|
|
int Variant = 1;
|
|
|
|
}
|
|
|
|
|
2003-08-03 20:19:37 +02:00
|
|
|
def X86 : Target {
|
|
|
|
// Information about the instructions...
|
2003-08-04 06:59:56 +02:00
|
|
|
let InstructionSet = X86InstrInfo;
|
2004-10-03 22:36:57 +02:00
|
|
|
|
2009-07-29 02:02:19 +02:00
|
|
|
let AssemblyParsers = [ATTAsmParser];
|
|
|
|
|
2004-10-03 22:36:57 +02:00
|
|
|
let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
|
2003-08-03 20:19:37 +02:00
|
|
|
}
|