blob: 05adb4d9dba29700446c5f4061be4f9401c95cbd [file] [log] [blame]
Chris Lattner434c7cb2010-10-05 05:32:15 +00001//===- X86InstrInfo.td - Main X86 Instruction Definition ---*- tablegen -*-===//
Michael J. Spencer6e56b182010-10-20 23:40:27 +00002//
John Criswell856ba762003-10-21 15:17:13 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-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. Spencer6e56b182010-10-20 23:40:27 +00007//
John Criswell856ba762003-10-21 15:17:13 +00008//===----------------------------------------------------------------------===//
Chris Lattner1cca5e32003-08-03 21:54:21 +00009//
10// This file describes the X86 instruction set, defining the instructions, and
11// properties of the instructions which are needed for code generation, machine
12// code emission, and analysis.
13//
14//===----------------------------------------------------------------------===//
15
Evan Chengaed7c722005-12-17 01:24:02 +000016//===----------------------------------------------------------------------===//
17// X86 specific DAG Nodes.
18//
19
Evan Chenge3413162006-01-09 18:33:28 +000020def SDTIntShiftDOp: SDTypeProfile<1, 3,
21 [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
22 SDTCisInt<0>, SDTCisInt<3>]>;
23
Chris Lattnere3486a42010-03-19 00:01:11 +000024def SDTX86CmpTest : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisSameAs<1, 2>]>;
Evan Chengaed7c722005-12-17 01:24:02 +000025
Evan Chenge5f62042007-09-29 00:00:36 +000026def SDTX86Cmov : SDTypeProfile<1, 4,
Evan Cheng0488db92007-09-25 01:57:46 +000027 [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>,
28 SDTCisVT<3, i8>, SDTCisVT<4, i32>]>;
Evan Chengaed7c722005-12-17 01:24:02 +000029
Dan Gohman076aee32009-03-04 19:44:21 +000030// Unary and binary operator instructions that set EFLAGS as a side-effect.
Chris Lattner74c8d672010-03-24 00:47:47 +000031def SDTUnaryArithWithFlags : SDTypeProfile<2, 1,
32 [SDTCisInt<0>, SDTCisVT<1, i32>]>;
33
Chris Lattner1aec4d72010-03-24 00:49:29 +000034def SDTBinaryArithWithFlags : SDTypeProfile<2, 2,
35 [SDTCisSameAs<0, 2>,
36 SDTCisSameAs<0, 3>,
37 SDTCisInt<0>, SDTCisVT<1, i32>]>;
Evan Chenge5f62042007-09-29 00:00:36 +000038def SDTX86BrCond : SDTypeProfile<0, 3,
Evan Cheng0488db92007-09-25 01:57:46 +000039 [SDTCisVT<0, OtherVT>,
40 SDTCisVT<1, i8>, SDTCisVT<2, i32>]>;
Evan Chengaed7c722005-12-17 01:24:02 +000041
Evan Chenge5f62042007-09-29 00:00:36 +000042def SDTX86SetCC : SDTypeProfile<1, 2,
Evan Cheng0488db92007-09-25 01:57:46 +000043 [SDTCisVT<0, i8>,
44 SDTCisVT<1, i8>, SDTCisVT<2, i32>]>;
Evan Cheng2e489c42009-12-16 00:53:11 +000045def SDTX86SetCC_C : SDTypeProfile<1, 2,
46 [SDTCisInt<0>,
47 SDTCisVT<1, i8>, SDTCisVT<2, i32>]>;
Evan Chengd5781fc2005-12-21 20:21:51 +000048
Michael J. Spencer6e56b182010-10-20 23:40:27 +000049def SDTX86cas : SDTypeProfile<0, 3, [SDTCisPtrTy<0>, SDTCisInt<1>,
Andrew Lenharth26ed8692008-03-01 21:52:34 +000050 SDTCisVT<2, i8>]>;
Andrew Lenharthd19189e2008-03-05 01:15:49 +000051def SDTX86cas8 : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
Andrew Lenharth26ed8692008-03-01 21:52:34 +000052
Dale Johannesen48c1bc22008-10-02 18:53:47 +000053def SDTX86atomicBinary : SDTypeProfile<2, 3, [SDTCisInt<0>, SDTCisInt<1>,
54 SDTCisPtrTy<2>, SDTCisInt<3>,SDTCisInt<4>]>;
Chris Lattner447ff682008-03-11 03:23:40 +000055def SDTX86Ret : SDTypeProfile<0, -1, [SDTCisVT<0, i16>]>;
Evan Cheng898101c2005-12-19 23:12:38 +000056
Sean Callanan1c97ceb2009-06-23 23:25:37 +000057def SDT_X86CallSeqStart : SDCallSeqStart<[SDTCisVT<0, i32>]>;
58def SDT_X86CallSeqEnd : SDCallSeqEnd<[SDTCisVT<0, i32>,
59 SDTCisVT<1, i32>]>;
Evan Chenge3413162006-01-09 18:33:28 +000060
Dan Gohmand35121a2008-05-29 19:57:41 +000061def SDT_X86Call : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>;
Evan Chenge3413162006-01-09 18:33:28 +000062
Dan Gohmand6708ea2009-08-15 01:38:56 +000063def SDT_X86VASTART_SAVE_XMM_REGS : SDTypeProfile<0, -1, [SDTCisVT<0, i8>,
64 SDTCisVT<1, iPTR>,
65 SDTCisVT<2, iPTR>]>;
66
Dan Gohman320afb82010-10-12 18:00:49 +000067def SDT_X86VAARG_64 : SDTypeProfile<1, -1, [SDTCisPtrTy<0>,
68 SDTCisPtrTy<1>,
69 SDTCisVT<2, i32>,
70 SDTCisVT<3, i8>,
71 SDTCisVT<4, i32>]>;
72
Chris Lattnered52c8f2010-03-28 07:38:39 +000073def SDTX86RepStr : SDTypeProfile<0, 1, [SDTCisVT<0, OtherVT>]>;
74
Anton Korobeynikov043f3c22010-03-06 19:32:29 +000075def SDTX86Void : SDTypeProfile<0, 0, []>;
Evan Chengd90eb7f2006-01-05 00:27:02 +000076
Evan Cheng71fb8342006-02-25 10:02:21 +000077def SDTX86Wrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>;
78
Rafael Espindola2ee3db32009-04-17 14:35:58 +000079def SDT_X86TLSADDR : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
Lauro Ramos Venanciob3a04172007-04-20 21:38:10 +000080
Eric Christopher30ef0e52010-06-03 04:07:48 +000081def SDT_X86TLSCALL : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
82
Anton Korobeynikov2365f512007-07-14 14:06:15 +000083def SDT_X86EHRET : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
84
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +000085def SDT_X86TCRET : SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisVT<1, i32>]>;
86
Eric Christopher9a9d2752010-07-22 02:48:34 +000087def SDT_X86MEMBARRIER : SDTypeProfile<0, 0, []>;
88def SDT_X86MEMBARRIERNoSSE : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
89
90def X86MemBarrier : SDNode<"X86ISD::MEMBARRIER", SDT_X86MEMBARRIER,
91 [SDNPHasChain]>;
92def X86MemBarrierNoSSE : SDNode<"X86ISD::MEMBARRIER", SDT_X86MEMBARRIERNoSSE,
93 [SDNPHasChain]>;
94def X86MFence : SDNode<"X86ISD::MFENCE", SDT_X86MEMBARRIER,
95 [SDNPHasChain]>;
96def X86SFence : SDNode<"X86ISD::SFENCE", SDT_X86MEMBARRIER,
97 [SDNPHasChain]>;
98def X86LFence : SDNode<"X86ISD::LFENCE", SDT_X86MEMBARRIER,
99 [SDNPHasChain]>;
100
101
Chris Lattnerd486d772010-03-28 05:07:17 +0000102def X86bsf : SDNode<"X86ISD::BSF", SDTUnaryArithWithFlags>;
103def X86bsr : SDNode<"X86ISD::BSR", SDTUnaryArithWithFlags>;
Evan Chenge3413162006-01-09 18:33:28 +0000104def X86shld : SDNode<"X86ISD::SHLD", SDTIntShiftDOp>;
105def X86shrd : SDNode<"X86ISD::SHRD", SDTIntShiftDOp>;
Evan Chengb077b842005-12-21 02:39:21 +0000106
Evan Chenge5f62042007-09-29 00:00:36 +0000107def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest>;
Dan Gohmanc7a37d42008-12-23 22:45:23 +0000108def X86bt : SDNode<"X86ISD::BT", SDTX86CmpTest>;
109
Evan Chenge5f62042007-09-29 00:00:36 +0000110def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov>;
Evan Chenge3413162006-01-09 18:33:28 +0000111def X86brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond,
Evan Cheng0488db92007-09-25 01:57:46 +0000112 [SDNPHasChain]>;
Evan Chenge5f62042007-09-29 00:00:36 +0000113def X86setcc : SDNode<"X86ISD::SETCC", SDTX86SetCC>;
Evan Cheng2e489c42009-12-16 00:53:11 +0000114def X86setcc_c : SDNode<"X86ISD::SETCC_CARRY", SDTX86SetCC_C>;
Evan Chengb077b842005-12-21 02:39:21 +0000115
Andrew Lenharth26ed8692008-03-01 21:52:34 +0000116def X86cas : SDNode<"X86ISD::LCMPXCHG_DAG", SDTX86cas,
117 [SDNPHasChain, SDNPInFlag, SDNPOutFlag, SDNPMayStore,
Chris Lattner88641552010-09-22 00:34:38 +0000118 SDNPMayLoad, SDNPMemOperand]>;
Andrew Lenharthd19189e2008-03-05 01:15:49 +0000119def X86cas8 : SDNode<"X86ISD::LCMPXCHG8_DAG", SDTX86cas8,
120 [SDNPHasChain, SDNPInFlag, SDNPOutFlag, SDNPMayStore,
Chris Lattner88641552010-09-22 00:34:38 +0000121 SDNPMayLoad, SDNPMemOperand]>;
Dale Johannesen48c1bc22008-10-02 18:53:47 +0000122def X86AtomAdd64 : SDNode<"X86ISD::ATOMADD64_DAG", SDTX86atomicBinary,
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000123 [SDNPHasChain, SDNPMayStore,
Dale Johannesen48c1bc22008-10-02 18:53:47 +0000124 SDNPMayLoad, SDNPMemOperand]>;
125def X86AtomSub64 : SDNode<"X86ISD::ATOMSUB64_DAG", SDTX86atomicBinary,
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000126 [SDNPHasChain, SDNPMayStore,
Dale Johannesen48c1bc22008-10-02 18:53:47 +0000127 SDNPMayLoad, SDNPMemOperand]>;
128def X86AtomOr64 : SDNode<"X86ISD::ATOMOR64_DAG", SDTX86atomicBinary,
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000129 [SDNPHasChain, SDNPMayStore,
Dale Johannesen48c1bc22008-10-02 18:53:47 +0000130 SDNPMayLoad, SDNPMemOperand]>;
131def X86AtomXor64 : SDNode<"X86ISD::ATOMXOR64_DAG", SDTX86atomicBinary,
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000132 [SDNPHasChain, SDNPMayStore,
Dale Johannesen48c1bc22008-10-02 18:53:47 +0000133 SDNPMayLoad, SDNPMemOperand]>;
134def X86AtomAnd64 : SDNode<"X86ISD::ATOMAND64_DAG", SDTX86atomicBinary,
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000135 [SDNPHasChain, SDNPMayStore,
Dale Johannesen48c1bc22008-10-02 18:53:47 +0000136 SDNPMayLoad, SDNPMemOperand]>;
137def X86AtomNand64 : SDNode<"X86ISD::ATOMNAND64_DAG", SDTX86atomicBinary,
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000138 [SDNPHasChain, SDNPMayStore,
Dale Johannesen48c1bc22008-10-02 18:53:47 +0000139 SDNPMayLoad, SDNPMemOperand]>;
Dale Johannesen880ae362008-10-03 22:25:52 +0000140def X86AtomSwap64 : SDNode<"X86ISD::ATOMSWAP64_DAG", SDTX86atomicBinary,
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000141 [SDNPHasChain, SDNPMayStore,
Dale Johannesen880ae362008-10-03 22:25:52 +0000142 SDNPMayLoad, SDNPMemOperand]>;
Evan Chenge3413162006-01-09 18:33:28 +0000143def X86retflag : SDNode<"X86ISD::RET_FLAG", SDTX86Ret,
Chris Lattnere8cabf32010-03-19 05:07:09 +0000144 [SDNPHasChain, SDNPOptInFlag, SDNPVariadic]>;
Evan Chengb077b842005-12-21 02:39:21 +0000145
Dan Gohmand6708ea2009-08-15 01:38:56 +0000146def X86vastart_save_xmm_regs :
147 SDNode<"X86ISD::VASTART_SAVE_XMM_REGS",
148 SDT_X86VASTART_SAVE_XMM_REGS,
Chris Lattnere8cabf32010-03-19 05:07:09 +0000149 [SDNPHasChain, SDNPVariadic]>;
Dan Gohman320afb82010-10-12 18:00:49 +0000150def X86vaarg64 :
151 SDNode<"X86ISD::VAARG_64", SDT_X86VAARG_64,
152 [SDNPHasChain, SDNPMayLoad, SDNPMayStore,
153 SDNPMemOperand]>;
Evan Chenge3413162006-01-09 18:33:28 +0000154def X86callseq_start :
155 SDNode<"ISD::CALLSEQ_START", SDT_X86CallSeqStart,
Evan Chengbb7b8442006-08-11 09:03:33 +0000156 [SDNPHasChain, SDNPOutFlag]>;
Evan Chenge3413162006-01-09 18:33:28 +0000157def X86callseq_end :
158 SDNode<"ISD::CALLSEQ_END", SDT_X86CallSeqEnd,
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000159 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
Evan Chengb077b842005-12-21 02:39:21 +0000160
Evan Chenge3413162006-01-09 18:33:28 +0000161def X86call : SDNode<"X86ISD::CALL", SDT_X86Call,
Chris Lattnere8cabf32010-03-19 05:07:09 +0000162 [SDNPHasChain, SDNPOutFlag, SDNPOptInFlag,
163 SDNPVariadic]>;
Evan Chengaed7c722005-12-17 01:24:02 +0000164
Chris Lattnered52c8f2010-03-28 07:38:39 +0000165def X86rep_stos: SDNode<"X86ISD::REP_STOS", SDTX86RepStr,
Chris Lattner9b37aaf2008-01-10 05:12:37 +0000166 [SDNPHasChain, SDNPInFlag, SDNPOutFlag, SDNPMayStore]>;
Chris Lattnered52c8f2010-03-28 07:38:39 +0000167def X86rep_movs: SDNode<"X86ISD::REP_MOVS", SDTX86RepStr,
Chris Lattner9b37aaf2008-01-10 05:12:37 +0000168 [SDNPHasChain, SDNPInFlag, SDNPOutFlag, SDNPMayStore,
169 SDNPMayLoad]>;
Evan Cheng67f92a72006-01-11 22:15:48 +0000170
Anton Korobeynikov043f3c22010-03-06 19:32:29 +0000171def X86rdtsc : SDNode<"X86ISD::RDTSC_DAG", SDTX86Void,
Chris Lattnerba7e7562008-01-10 07:59:24 +0000172 [SDNPHasChain, SDNPOutFlag, SDNPSideEffect]>;
Evan Chengd90eb7f2006-01-05 00:27:02 +0000173
Evan Cheng0085a282006-11-30 21:55:46 +0000174def X86Wrapper : SDNode<"X86ISD::Wrapper", SDTX86Wrapper>;
175def X86WrapperRIP : SDNode<"X86ISD::WrapperRIP", SDTX86Wrapper>;
Evan Cheng71fb8342006-02-25 10:02:21 +0000176
Lauro Ramos Venanciob3a04172007-04-20 21:38:10 +0000177def X86tlsaddr : SDNode<"X86ISD::TLSADDR", SDT_X86TLSADDR,
Anton Korobeynikov6625eff2008-05-04 21:36:32 +0000178 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
Lauro Ramos Venanciob3a04172007-04-20 21:38:10 +0000179
Anton Korobeynikov2365f512007-07-14 14:06:15 +0000180def X86ehret : SDNode<"X86ISD::EH_RETURN", SDT_X86EHRET,
181 [SDNPHasChain]>;
182
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000183def X86tcret : SDNode<"X86ISD::TC_RETURN", SDT_X86TCRET,
Chris Lattnere8cabf32010-03-19 05:07:09 +0000184 [SDNPHasChain, SDNPOptInFlag, SDNPVariadic]>;
Lauro Ramos Venanciob3a04172007-04-20 21:38:10 +0000185
Dan Gohman43ffe672010-01-04 20:51:05 +0000186def X86add_flag : SDNode<"X86ISD::ADD", SDTBinaryArithWithFlags,
Dan Gohman4361bbf2010-01-05 00:44:20 +0000187 [SDNPCommutative]>;
Dan Gohman076aee32009-03-04 19:44:21 +0000188def X86sub_flag : SDNode<"X86ISD::SUB", SDTBinaryArithWithFlags>;
Dan Gohman43ffe672010-01-04 20:51:05 +0000189def X86smul_flag : SDNode<"X86ISD::SMUL", SDTBinaryArithWithFlags,
Dan Gohman4361bbf2010-01-05 00:44:20 +0000190 [SDNPCommutative]>;
Dan Gohman43ffe672010-01-04 20:51:05 +0000191def X86umul_flag : SDNode<"X86ISD::UMUL", SDTUnaryArithWithFlags,
Dan Gohman4361bbf2010-01-05 00:44:20 +0000192 [SDNPCommutative]>;
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000193
Dan Gohman076aee32009-03-04 19:44:21 +0000194def X86inc_flag : SDNode<"X86ISD::INC", SDTUnaryArithWithFlags>;
195def X86dec_flag : SDNode<"X86ISD::DEC", SDTUnaryArithWithFlags>;
Dan Gohman43ffe672010-01-04 20:51:05 +0000196def X86or_flag : SDNode<"X86ISD::OR", SDTBinaryArithWithFlags,
Dan Gohman4361bbf2010-01-05 00:44:20 +0000197 [SDNPCommutative]>;
Dan Gohman43ffe672010-01-04 20:51:05 +0000198def X86xor_flag : SDNode<"X86ISD::XOR", SDTBinaryArithWithFlags,
Dan Gohman4361bbf2010-01-05 00:44:20 +0000199 [SDNPCommutative]>;
Dan Gohman43ffe672010-01-04 20:51:05 +0000200def X86and_flag : SDNode<"X86ISD::AND", SDTBinaryArithWithFlags,
Dan Gohman4361bbf2010-01-05 00:44:20 +0000201 [SDNPCommutative]>;
Bill Wendlingab55ebd2008-12-12 00:56:36 +0000202
Evan Cheng73f24c92009-03-30 21:36:47 +0000203def X86mul_imm : SDNode<"X86ISD::MUL_IMM", SDTIntBinOp>;
204
Michael J. Spencere9c253e2010-10-21 01:41:01 +0000205def X86WinAlloca : SDNode<"X86ISD::WIN_ALLOCA", SDTX86Void,
206 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
207
Eric Christopher30ef0e52010-06-03 04:07:48 +0000208def X86TLSCall : SDNode<"X86ISD::TLSCALL", SDT_X86TLSCALL,
209 []>;
Anton Korobeynikov043f3c22010-03-06 19:32:29 +0000210
Evan Chengaed7c722005-12-17 01:24:02 +0000211//===----------------------------------------------------------------------===//
212// X86 Operand Definitions.
213//
214
Dan Gohmana4714e02009-07-30 01:56:29 +0000215// A version of ptr_rc which excludes SP, ESP, and RSP. This is used for
216// the index operand of an address, to conform to x86 encoding restrictions.
217def ptr_rc_nosp : PointerLikeRegClass<1>;
Chris Lattner7680e732009-06-20 19:34:09 +0000218
Chris Lattner66fa1dc2004-08-11 02:25:00 +0000219// *mem - Operand definitions for the funky X86 addressing mode operands.
220//
Daniel Dunbar338825c2009-08-10 18:41:10 +0000221def X86MemAsmOperand : AsmOperandClass {
222 let Name = "Mem";
Daniel Dunbar54ddf3d2010-05-22 21:02:29 +0000223 let SuperClasses = [];
Daniel Dunbar338825c2009-08-10 18:41:10 +0000224}
Daniel Dunbarc26ae5a2010-05-06 22:39:14 +0000225def X86AbsMemAsmOperand : AsmOperandClass {
226 let Name = "AbsMem";
Chris Lattner599b5312010-07-08 23:46:44 +0000227 let SuperClasses = [X86MemAsmOperand];
Daniel Dunbarc26ae5a2010-05-06 22:39:14 +0000228}
Evan Chengaf78ef52006-05-17 21:21:41 +0000229class X86MemOperand<string printMethod> : Operand<iPTR> {
Nate Begeman391c5d22005-11-30 18:54:35 +0000230 let PrintMethod = printMethod;
Dan Gohmana4714e02009-07-30 01:56:29 +0000231 let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc_nosp, i32imm, i8imm);
Daniel Dunbar338825c2009-08-10 18:41:10 +0000232 let ParserMatchClass = X86MemAsmOperand;
Chris Lattner66fa1dc2004-08-11 02:25:00 +0000233}
Nate Begeman391c5d22005-11-30 18:54:35 +0000234
Sean Callanan9947bbb2009-09-03 00:04:47 +0000235def opaque32mem : X86MemOperand<"printopaquemem">;
236def opaque48mem : X86MemOperand<"printopaquemem">;
237def opaque80mem : X86MemOperand<"printopaquemem">;
Sean Callanan108934c2009-12-18 00:01:26 +0000238def opaque512mem : X86MemOperand<"printopaquemem">;
239
Chris Lattner45432512005-12-17 19:47:05 +0000240def i8mem : X86MemOperand<"printi8mem">;
241def i16mem : X86MemOperand<"printi16mem">;
242def i32mem : X86MemOperand<"printi32mem">;
243def i64mem : X86MemOperand<"printi64mem">;
Evan Cheng470a6ad2006-02-22 02:26:30 +0000244def i128mem : X86MemOperand<"printi128mem">;
Bruno Cardoso Lopes94143ee2010-07-19 23:32:44 +0000245def i256mem : X86MemOperand<"printi256mem">;
Chris Lattner45432512005-12-17 19:47:05 +0000246def f32mem : X86MemOperand<"printf32mem">;
247def f64mem : X86MemOperand<"printf64mem">;
Dale Johannesen59a58732007-08-05 18:49:15 +0000248def f80mem : X86MemOperand<"printf80mem">;
Evan Cheng223547a2006-01-31 22:28:30 +0000249def f128mem : X86MemOperand<"printf128mem">;
Bruno Cardoso Lopese86b01c2010-07-09 18:27:43 +0000250def f256mem : X86MemOperand<"printf256mem">;
Nate Begeman391c5d22005-11-30 18:54:35 +0000251
Dan Gohman21e3dfb2009-04-13 16:09:41 +0000252// A version of i8mem for use on x86-64 that uses GR64_NOREX instead of
253// plain GR64, so that it doesn't potentially require a REX prefix.
254def i8mem_NOREX : Operand<i64> {
255 let PrintMethod = "printi8mem";
Dan Gohmana4714e02009-07-30 01:56:29 +0000256 let MIOperandInfo = (ops GR64_NOREX, i8imm, GR64_NOREX_NOSP, i32imm, i8imm);
Daniel Dunbar338825c2009-08-10 18:41:10 +0000257 let ParserMatchClass = X86MemAsmOperand;
Dan Gohman21e3dfb2009-04-13 16:09:41 +0000258}
259
Evan Chengf48ef032010-03-14 03:48:46 +0000260// Special i32mem for addresses of load folding tail calls. These are not
261// allowed to use callee-saved registers since they must be scheduled
262// after callee-saved register are popped.
263def i32mem_TC : Operand<i32> {
264 let PrintMethod = "printi32mem";
265 let MIOperandInfo = (ops GR32_TC, i8imm, GR32_TC, i32imm, i8imm);
266 let ParserMatchClass = X86MemAsmOperand;
267}
268
Chris Lattner41efbfa2010-10-05 06:37:31 +0000269// Special i64mem for addresses of load folding tail calls. These are not
270// allowed to use callee-saved registers since they must be scheduled
271// after callee-saved register are popped.
272def i64mem_TC : Operand<i64> {
273 let PrintMethod = "printi64mem";
274 let MIOperandInfo = (ops GR64_TC, i8imm, GR64_TC, i32imm, i8imm);
275 let ParserMatchClass = X86MemAsmOperand;
276}
Evan Cheng25ab6902006-09-08 06:48:29 +0000277
Daniel Dunbarb834f5d2010-01-30 01:02:48 +0000278let ParserMatchClass = X86AbsMemAsmOperand,
279 PrintMethod = "print_pcrel_imm" in {
Daniel Dunbar728e5eb2010-01-30 00:24:12 +0000280def i32imm_pcrel : Operand<i32>;
Chris Lattner9fc05222010-07-07 22:27:31 +0000281def i16imm_pcrel : Operand<i16>;
Daniel Dunbar728e5eb2010-01-30 00:24:12 +0000282
283def offset8 : Operand<i64>;
284def offset16 : Operand<i64>;
285def offset32 : Operand<i64>;
286def offset64 : Operand<i64>;
287
288// Branch targets have OtherVT type and print as pc-relative values.
289def brtarget : Operand<OtherVT>;
290def brtarget8 : Operand<OtherVT>;
291
292}
293
Nate Begeman16b04f32005-07-15 00:38:55 +0000294def SSECC : Operand<i8> {
295 let PrintMethod = "printSSECC";
296}
Chris Lattner66fa1dc2004-08-11 02:25:00 +0000297
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000298class ImmSExtAsmOperandClass : AsmOperandClass {
Daniel Dunbar54ddf3d2010-05-22 21:02:29 +0000299 let SuperClasses = [ImmAsmOperand];
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000300 let RenderMethod = "addImmOperands";
Daniel Dunbar1fe591d2010-05-20 20:20:39 +0000301}
302
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000303// Sign-extended immediate classes. We don't need to define the full lattice
304// here because there is no instruction with an ambiguity between ImmSExti64i32
305// and ImmSExti32i8.
306//
307// The strange ranges come from the fact that the assembler always works with
308// 64-bit immediates, but for a 16-bit target value we want to accept both "-1"
309// (which will be a -1ULL), and "0xFF" (-1 in 16-bits).
310
Chris Lattner599b5312010-07-08 23:46:44 +0000311// [0, 0x7FFFFFFF] |
312// [0xFFFFFFFF80000000, 0xFFFFFFFFFFFFFFFF]
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000313def ImmSExti64i32AsmOperand : ImmSExtAsmOperandClass {
314 let Name = "ImmSExti64i32";
315}
316
Chris Lattner599b5312010-07-08 23:46:44 +0000317// [0, 0x0000007F] | [0x000000000000FF80, 0x000000000000FFFF] |
318// [0xFFFFFFFFFFFFFF80, 0xFFFFFFFFFFFFFFFF]
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000319def ImmSExti16i8AsmOperand : ImmSExtAsmOperandClass {
320 let Name = "ImmSExti16i8";
321 let SuperClasses = [ImmSExti64i32AsmOperand];
322}
323
Chris Lattner599b5312010-07-08 23:46:44 +0000324// [0, 0x0000007F] | [0x00000000FFFFFF80, 0x00000000FFFFFFFF] |
325// [0xFFFFFFFFFFFFFF80, 0xFFFFFFFFFFFFFFFF]
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000326def ImmSExti32i8AsmOperand : ImmSExtAsmOperandClass {
327 let Name = "ImmSExti32i8";
328}
329
Chris Lattner599b5312010-07-08 23:46:44 +0000330// [0, 0x0000007F] |
331// [0xFFFFFFFFFFFFFF80, 0xFFFFFFFFFFFFFFFF]
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000332def ImmSExti64i8AsmOperand : ImmSExtAsmOperandClass {
333 let Name = "ImmSExti64i8";
Chris Lattner599b5312010-07-08 23:46:44 +0000334 let SuperClasses = [ImmSExti16i8AsmOperand, ImmSExti32i8AsmOperand,
335 ImmSExti64i32AsmOperand];
Daniel Dunbar338825c2009-08-10 18:41:10 +0000336}
337
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000338// A couple of more descriptive operand definitions.
339// 16-bits but only 8 bits are significant.
Daniel Dunbar5fe63382009-08-09 07:20:21 +0000340def i16i8imm : Operand<i16> {
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000341 let ParserMatchClass = ImmSExti16i8AsmOperand;
Daniel Dunbar5fe63382009-08-09 07:20:21 +0000342}
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000343// 32-bits but only 8 bits are significant.
Daniel Dunbar5fe63382009-08-09 07:20:21 +0000344def i32i8imm : Operand<i32> {
Daniel Dunbar62e4c672010-05-22 21:02:33 +0000345 let ParserMatchClass = ImmSExti32i8AsmOperand;
Daniel Dunbar5fe63382009-08-09 07:20:21 +0000346}
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000347
Chris Lattner41efbfa2010-10-05 06:37:31 +0000348// 64-bits but only 32 bits are significant.
349def i64i32imm : Operand<i64> {
350 let ParserMatchClass = ImmSExti64i32AsmOperand;
351}
352
353// 64-bits but only 32 bits are significant, and those bits are treated as being
354// pc relative.
355def i64i32imm_pcrel : Operand<i64> {
356 let PrintMethod = "print_pcrel_imm";
357 let ParserMatchClass = X86AbsMemAsmOperand;
358}
359
360// 64-bits but only 8 bits are significant.
361def i64i8imm : Operand<i64> {
362 let ParserMatchClass = ImmSExti64i8AsmOperand;
363}
364
365def lea64_32mem : Operand<i32> {
366 let PrintMethod = "printi32mem";
367 let AsmOperandLowerMethod = "lower_lea64_32mem";
368 let MIOperandInfo = (ops GR32, i8imm, GR32_NOSP, i32imm, i8imm);
369 let ParserMatchClass = X86MemAsmOperand;
370}
371
372
Evan Chengaed7c722005-12-17 01:24:02 +0000373//===----------------------------------------------------------------------===//
374// X86 Complex Pattern Definitions.
375//
376
Evan Chengec693f72005-12-08 02:01:35 +0000377// Define X86 specific addressing mode.
Chris Lattnerb86faa12010-09-21 22:07:31 +0000378def addr : ComplexPattern<iPTR, 5, "SelectAddr", [], [SDNPWantParent]>;
Chris Lattner599b5312010-07-08 23:46:44 +0000379def lea32addr : ComplexPattern<i32, 5, "SelectLEAAddr",
Dan Gohmana98634b2009-08-02 16:09:17 +0000380 [add, sub, mul, X86mul_imm, shl, or, frameindex],
381 []>;
Chris Lattner599b5312010-07-08 23:46:44 +0000382def tls32addr : ComplexPattern<i32, 5, "SelectTLSADDRAddr",
Chris Lattner5c0b16d2009-06-20 20:38:48 +0000383 [tglobaltlsaddr], []>;
Evan Chengec693f72005-12-08 02:01:35 +0000384
Chris Lattner41efbfa2010-10-05 06:37:31 +0000385def lea64addr : ComplexPattern<i64, 5, "SelectLEAAddr",
386 [add, sub, mul, X86mul_imm, shl, or, frameindex,
387 X86WrapperRIP], []>;
388
389def tls64addr : ComplexPattern<i64, 5, "SelectTLSADDRAddr",
390 [tglobaltlsaddr], []>;
391
Evan Chengaed7c722005-12-17 01:24:02 +0000392//===----------------------------------------------------------------------===//
Evan Chengbbc8ddb2005-12-20 22:59:51 +0000393// X86 Instruction Predicate Definitions.
Chris Lattner314a1132010-03-14 18:31:44 +0000394def HasCMov : Predicate<"Subtarget->hasCMov()">;
395def NoCMov : Predicate<"!Subtarget->hasCMov()">;
Bruno Cardoso Lopes3c457342010-07-26 21:01:18 +0000396
397// FIXME: temporary hack to let codegen assert or generate poor code in case
398// no AVX version of the desired intructions is present, this is better for
399// incremental dev (without fallbacks it's easier to spot what's missing)
Bruno Cardoso Lopes5b7dab82010-07-30 19:41:24 +0000400def HasMMX : Predicate<"Subtarget->hasMMX() && !Subtarget->hasAVX()">;
Chris Lattner548abfc2010-10-03 18:08:05 +0000401def Has3DNow : Predicate<"Subtarget->has3DNow()">;
402def Has3DNowA : Predicate<"Subtarget->has3DNowA()">;
Bruno Cardoso Lopes5b7dab82010-07-30 19:41:24 +0000403def HasSSE1 : Predicate<"Subtarget->hasSSE1() && !Subtarget->hasAVX()">;
404def HasSSE2 : Predicate<"Subtarget->hasSSE2() && !Subtarget->hasAVX()">;
405def HasSSE3 : Predicate<"Subtarget->hasSSE3() && !Subtarget->hasAVX()">;
406def HasSSSE3 : Predicate<"Subtarget->hasSSSE3() && !Subtarget->hasAVX()">;
407def HasSSE41 : Predicate<"Subtarget->hasSSE41() && !Subtarget->hasAVX()">;
408def HasSSE42 : Predicate<"Subtarget->hasSSE42() && !Subtarget->hasAVX()">;
409def HasSSE4A : Predicate<"Subtarget->hasSSE4A() && !Subtarget->hasAVX()">;
Bruno Cardoso Lopes3c457342010-07-26 21:01:18 +0000410
David Greene343dadb2009-06-26 22:46:54 +0000411def HasAVX : Predicate<"Subtarget->hasAVX()">;
Bruno Cardoso Lopescdae7e82010-07-23 01:17:51 +0000412def HasCLMUL : Predicate<"Subtarget->hasCLMUL()">;
David Greene343dadb2009-06-26 22:46:54 +0000413def HasFMA3 : Predicate<"Subtarget->hasFMA3()">;
414def HasFMA4 : Predicate<"Subtarget->hasFMA4()">;
Dale Johannesenf1fc3a82007-09-23 14:52:20 +0000415def FPStackf32 : Predicate<"!Subtarget->hasSSE1()">;
416def FPStackf64 : Predicate<"!Subtarget->hasSSE2()">;
Chris Lattner0f899c72010-10-30 19:38:20 +0000417def In32BitMode : Predicate<"!Subtarget->is64Bit()">, AssemblerPredicate;
418def In64BitMode : Predicate<"Subtarget->is64Bit()">, AssemblerPredicate;
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000419def IsWin64 : Predicate<"Subtarget->isTargetWin64()">;
420def NotWin64 : Predicate<"!Subtarget->isTargetWin64()">;
Anton Korobeynikovd7697d02009-08-06 11:23:24 +0000421def SmallCode : Predicate<"TM.getCodeModel() == CodeModel::Small">;
422def KernelCode : Predicate<"TM.getCodeModel() == CodeModel::Kernel">;
423def FarData : Predicate<"TM.getCodeModel() != CodeModel::Small &&"
Anton Korobeynikov186fa1d2009-08-06 09:11:19 +0000424 "TM.getCodeModel() != CodeModel::Kernel">;
Anton Korobeynikovd7697d02009-08-06 11:23:24 +0000425def NearData : Predicate<"TM.getCodeModel() == CodeModel::Small ||"
426 "TM.getCodeModel() == CodeModel::Kernel">;
Evan Cheng28b514392006-12-05 19:50:18 +0000427def IsStatic : Predicate<"TM.getRelocationModel() == Reloc::Static">;
Evan Chengcb0f06e2010-03-25 00:10:31 +0000428def IsNotPIC : Predicate<"TM.getRelocationModel() != Reloc::PIC_">;
Evan Chengb1f49812009-12-22 17:47:23 +0000429def OptForSize : Predicate<"OptForSize">;
Evan Chengb7a75a52008-09-26 23:41:32 +0000430def OptForSpeed : Predicate<"!OptForSize">;
Evan Chengccb69762009-01-02 05:35:45 +0000431def FastBTMem : Predicate<"!Subtarget->isBTMemSlow()">;
Evan Chengd7f666a2009-05-20 04:53:57 +0000432def CallImmAddr : Predicate<"Subtarget->IsLegalToCallImmediateAddr(TM)">;
Eric Christopher6d1cd1c2010-04-02 21:54:27 +0000433def HasAES : Predicate<"Subtarget->hasAES()">;
Evan Chengbbc8ddb2005-12-20 22:59:51 +0000434
435//===----------------------------------------------------------------------===//
Evan Chengc64a1a92007-07-31 08:04:03 +0000436// X86 Instruction Format Definitions.
Evan Chengaed7c722005-12-17 01:24:02 +0000437//
438
Evan Chengc64a1a92007-07-31 08:04:03 +0000439include "X86InstrFormats.td"
Chris Lattner1cca5e32003-08-03 21:54:21 +0000440
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000441//===----------------------------------------------------------------------===//
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000442// Pattern fragments...
443//
Evan Chengd9558e02006-01-06 00:43:03 +0000444
445// X86 specific condition code. These correspond to CondCode in
Nate Begeman9a225302007-05-06 04:00:55 +0000446// X86InstrInfo.h. They must be kept in synch.
Dan Gohman653456c2009-01-07 00:15:08 +0000447def X86_COND_A : PatLeaf<(i8 0)>; // alt. COND_NBE
448def X86_COND_AE : PatLeaf<(i8 1)>; // alt. COND_NC
449def X86_COND_B : PatLeaf<(i8 2)>; // alt. COND_C
450def X86_COND_BE : PatLeaf<(i8 3)>; // alt. COND_NA
451def X86_COND_E : PatLeaf<(i8 4)>; // alt. COND_Z
452def X86_COND_G : PatLeaf<(i8 5)>; // alt. COND_NLE
453def X86_COND_GE : PatLeaf<(i8 6)>; // alt. COND_NL
454def X86_COND_L : PatLeaf<(i8 7)>; // alt. COND_NGE
455def X86_COND_LE : PatLeaf<(i8 8)>; // alt. COND_NG
456def X86_COND_NE : PatLeaf<(i8 9)>; // alt. COND_NZ
Evan Chengd9558e02006-01-06 00:43:03 +0000457def X86_COND_NO : PatLeaf<(i8 10)>;
Dan Gohman653456c2009-01-07 00:15:08 +0000458def X86_COND_NP : PatLeaf<(i8 11)>; // alt. COND_PO
Evan Chengd9558e02006-01-06 00:43:03 +0000459def X86_COND_NS : PatLeaf<(i8 12)>;
Dan Gohman653456c2009-01-07 00:15:08 +0000460def X86_COND_O : PatLeaf<(i8 13)>;
461def X86_COND_P : PatLeaf<(i8 14)>; // alt. COND_PE
462def X86_COND_S : PatLeaf<(i8 15)>;
Evan Chengd9558e02006-01-06 00:43:03 +0000463
Jakob Stoklund Olesen3061c442010-09-03 00:35:18 +0000464def immSext8 : PatLeaf<(imm), [{ return immSext8(N); }]>;
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000465
Chris Lattner18409912010-03-03 01:45:01 +0000466def i16immSExt8 : PatLeaf<(i16 immSext8)>;
467def i32immSExt8 : PatLeaf<(i32 immSext8)>;
Chris Lattner41efbfa2010-10-05 06:37:31 +0000468def i64immSExt8 : PatLeaf<(i64 immSext8)>;
469def i64immSExt32 : PatLeaf<(i64 imm), [{ return i64immSExt32(N); }]>;
470def i64immZExt32 : PatLeaf<(i64 imm), [{
471 // i64immZExt32 predicate - True if the 64-bit immediate fits in a 32-bit
472 // unsignedsign extended field.
473 return (uint64_t)N->getZExtValue() == (uint32_t)N->getZExtValue();
474}]>;
Evan Chengb3558542005-12-13 00:01:09 +0000475
Rafael Espindoladba81cf2010-10-13 13:31:20 +0000476def i64immZExt32SExt8 : PatLeaf<(i64 imm), [{
477 uint64_t v = N->getZExtValue();
478 return v == (uint32_t)v && (int32_t)v == (int8_t)v;
479}]>;
480
Evan Cheng605c4152005-12-13 01:57:51 +0000481// Helper fragments for loads.
Evan Chengb6564432008-05-13 18:59:59 +0000482// It's always safe to treat a anyext i16 load as a i32 load if the i16 is
483// known to be 32-bit aligned or better. Ditto for i8 to i16.
Dan Gohman33586292008-10-15 06:50:19 +0000484def loadi16 : PatFrag<(ops node:$ptr), (i16 (unindexedload node:$ptr)), [{
Dan Gohman67ca6be2008-08-20 15:24:22 +0000485 LoadSDNode *LD = cast<LoadSDNode>(N);
Dan Gohman67ca6be2008-08-20 15:24:22 +0000486 ISD::LoadExtType ExtType = LD->getExtensionType();
487 if (ExtType == ISD::NON_EXTLOAD)
488 return true;
489 if (ExtType == ISD::EXTLOAD)
490 return LD->getAlignment() >= 2 && !LD->isVolatile();
Evan Chengfa7fd332008-05-13 00:54:02 +0000491 return false;
492}]>;
493
Chris Lattnerf85eff72010-03-03 01:52:59 +0000494def loadi16_anyext : PatFrag<(ops node:$ptr), (i32 (unindexedload node:$ptr)),[{
Evan Chengca57f782008-09-24 23:27:55 +0000495 LoadSDNode *LD = cast<LoadSDNode>(N);
Evan Chengca57f782008-09-24 23:27:55 +0000496 ISD::LoadExtType ExtType = LD->getExtensionType();
497 if (ExtType == ISD::EXTLOAD)
498 return LD->getAlignment() >= 2 && !LD->isVolatile();
499 return false;
500}]>;
501
Dan Gohman33586292008-10-15 06:50:19 +0000502def loadi32 : PatFrag<(ops node:$ptr), (i32 (unindexedload node:$ptr)), [{
Dan Gohman67ca6be2008-08-20 15:24:22 +0000503 LoadSDNode *LD = cast<LoadSDNode>(N);
Dan Gohman67ca6be2008-08-20 15:24:22 +0000504 ISD::LoadExtType ExtType = LD->getExtensionType();
505 if (ExtType == ISD::NON_EXTLOAD)
506 return true;
507 if (ExtType == ISD::EXTLOAD)
508 return LD->getAlignment() >= 4 && !LD->isVolatile();
Evan Chengfa7fd332008-05-13 00:54:02 +0000509 return false;
510}]>;
511
Chris Lattnerb86faa12010-09-21 22:07:31 +0000512def loadi8 : PatFrag<(ops node:$ptr), (i8 (load node:$ptr))>;
513def loadi64 : PatFrag<(ops node:$ptr), (i64 (load node:$ptr))>;
514def loadf32 : PatFrag<(ops node:$ptr), (f32 (load node:$ptr))>;
515def loadf64 : PatFrag<(ops node:$ptr), (f64 (load node:$ptr))>;
516def loadf80 : PatFrag<(ops node:$ptr), (f80 (load node:$ptr))>;
Evan Cheng7a7e8372005-12-14 02:22:27 +0000517
Evan Cheng466685d2006-10-09 20:57:25 +0000518def sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextloadi8 node:$ptr))>;
519def sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextloadi8 node:$ptr))>;
520def sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextloadi16 node:$ptr))>;
Chris Lattner41efbfa2010-10-05 06:37:31 +0000521def sextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (sextloadi8 node:$ptr))>;
522def sextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (sextloadi16 node:$ptr))>;
523def sextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (sextloadi32 node:$ptr))>;
Evan Cheng7a7e8372005-12-14 02:22:27 +0000524
Evan Cheng466685d2006-10-09 20:57:25 +0000525def zextloadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextloadi1 node:$ptr))>;
526def zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextloadi1 node:$ptr))>;
527def zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextloadi1 node:$ptr))>;
528def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>;
529def zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextloadi8 node:$ptr))>;
530def zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextloadi16 node:$ptr))>;
Chris Lattner41efbfa2010-10-05 06:37:31 +0000531def zextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (zextloadi1 node:$ptr))>;
532def zextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (zextloadi8 node:$ptr))>;
533def zextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (zextloadi16 node:$ptr))>;
534def zextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (zextloadi32 node:$ptr))>;
Evan Cheng7a7e8372005-12-14 02:22:27 +0000535
Evan Cheng466685d2006-10-09 20:57:25 +0000536def extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extloadi1 node:$ptr))>;
537def extloadi16i1 : PatFrag<(ops node:$ptr), (i16 (extloadi1 node:$ptr))>;
538def extloadi32i1 : PatFrag<(ops node:$ptr), (i32 (extloadi1 node:$ptr))>;
539def extloadi16i8 : PatFrag<(ops node:$ptr), (i16 (extloadi8 node:$ptr))>;
540def extloadi32i8 : PatFrag<(ops node:$ptr), (i32 (extloadi8 node:$ptr))>;
541def extloadi32i16 : PatFrag<(ops node:$ptr), (i32 (extloadi16 node:$ptr))>;
Chris Lattner41efbfa2010-10-05 06:37:31 +0000542def extloadi64i1 : PatFrag<(ops node:$ptr), (i64 (extloadi1 node:$ptr))>;
543def extloadi64i8 : PatFrag<(ops node:$ptr), (i64 (extloadi8 node:$ptr))>;
544def extloadi64i16 : PatFrag<(ops node:$ptr), (i64 (extloadi16 node:$ptr))>;
545def extloadi64i32 : PatFrag<(ops node:$ptr), (i64 (extloadi32 node:$ptr))>;
Evan Cheng747a90d2006-02-21 02:24:38 +0000546
Chris Lattnerce2bcc82008-02-19 17:37:35 +0000547
548// An 'and' node with a single use.
549def and_su : PatFrag<(ops node:$lhs, node:$rhs), (and node:$lhs, node:$rhs), [{
Evan Cheng07b7ea12008-03-04 00:40:35 +0000550 return N->hasOneUse();
Chris Lattnerce2bcc82008-02-19 17:37:35 +0000551}]>;
Dan Gohman21e3dfb2009-04-13 16:09:41 +0000552// An 'srl' node with a single use.
553def srl_su : PatFrag<(ops node:$lhs, node:$rhs), (srl node:$lhs, node:$rhs), [{
554 return N->hasOneUse();
555}]>;
556// An 'trunc' node with a single use.
557def trunc_su : PatFrag<(ops node:$src), (trunc node:$src), [{
558 return N->hasOneUse();
559}]>;
Chris Lattnerce2bcc82008-02-19 17:37:35 +0000560
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000561//===----------------------------------------------------------------------===//
Chris Lattner434c7cb2010-10-05 05:32:15 +0000562// Instruction list.
Chris Lattner1cca5e32003-08-03 21:54:21 +0000563//
564
Evan Cheng4a460802006-01-11 00:33:36 +0000565// Nop
Sean Callanan74e52102009-07-23 23:39:34 +0000566let neverHasSideEffects = 1 in {
Chris Lattnerba7e7562008-01-10 07:59:24 +0000567 def NOOP : I<0x90, RawFrm, (outs), (ins), "nop", []>;
Sean Callanan108934c2009-12-18 00:01:26 +0000568 def NOOPW : I<0x1f, MRM0m, (outs), (ins i16mem:$zero),
569 "nop{w}\t$zero", []>, TB, OpSize;
Sean Callanan74e52102009-07-23 23:39:34 +0000570 def NOOPL : I<0x1f, MRM0m, (outs), (ins i32mem:$zero),
Sean Callanan108934c2009-12-18 00:01:26 +0000571 "nop{l}\t$zero", []>, TB;
Sean Callanan74e52102009-07-23 23:39:34 +0000572}
Evan Cheng4a460802006-01-11 00:33:36 +0000573
Chris Lattner1cca5e32003-08-03 21:54:21 +0000574
Sean Callanan8d708542009-09-16 02:57:13 +0000575// Constructing a stack frame.
Chris Lattner40cc3f82010-09-17 18:02:29 +0000576def ENTER : Ii16<0xC8, RawFrmImm8, (outs), (ins i16imm:$len, i8imm:$lvl),
577 "enter\t$len, $lvl", []>;
Sean Callanan8d708542009-09-16 02:57:13 +0000578
Chris Lattnerba7e7562008-01-10 07:59:24 +0000579let Defs = [EBP, ESP], Uses = [EBP, ESP], mayLoad = 1, neverHasSideEffects=1 in
Chris Lattner30bf2d82004-08-10 20:17:41 +0000580def LEAVE : I<0xC9, RawFrm,
Daniel Dunbardf4c47b2010-07-19 07:21:01 +0000581 (outs), (ins), "leave", []>, Requires<[In32BitMode]>;
Evan Cheng071a2792007-09-11 19:55:27 +0000582
Chris Lattner5673e1d2010-10-05 06:41:40 +0000583let Defs = [RBP,RSP], Uses = [RBP,RSP], mayLoad = 1, neverHasSideEffects = 1 in
584def LEAVE64 : I<0xC9, RawFrm,
585 (outs), (ins), "leave", []>, Requires<[In64BitMode]>;
586
Chris Lattner87be16a2010-10-05 06:04:14 +0000587//===----------------------------------------------------------------------===//
Chris Lattner5673e1d2010-10-05 06:41:40 +0000588// Miscellaneous Instructions.
Chris Lattner87be16a2010-10-05 06:04:14 +0000589//
Sean Callanan108934c2009-12-18 00:01:26 +0000590
Chris Lattnerba7e7562008-01-10 07:59:24 +0000591let Defs = [ESP], Uses = [ESP], neverHasSideEffects=1 in {
Sean Callanan1f24e012009-09-10 18:29:13 +0000592let mayLoad = 1 in {
593def POP16r : I<0x58, AddRegFrm, (outs GR16:$reg), (ins), "pop{w}\t$reg", []>,
594 OpSize;
595def POP32r : I<0x58, AddRegFrm, (outs GR32:$reg), (ins), "pop{l}\t$reg", []>;
596def POP16rmr: I<0x8F, MRM0r, (outs GR16:$reg), (ins), "pop{w}\t$reg", []>,
597 OpSize;
598def POP16rmm: I<0x8F, MRM0m, (outs i16mem:$dst), (ins), "pop{w}\t$dst", []>,
599 OpSize;
600def POP32rmr: I<0x8F, MRM0r, (outs GR32:$reg), (ins), "pop{l}\t$reg", []>;
601def POP32rmm: I<0x8F, MRM0m, (outs i32mem:$dst), (ins), "pop{l}\t$dst", []>;
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000602
603def POPF16 : I<0x9D, RawFrm, (outs), (ins), "popf{w}", []>, OpSize;
604def POPF32 : I<0x9D, RawFrm, (outs), (ins), "popf{l|d}", []>,
605 Requires<[In32BitMode]>;
Sean Callanan1f24e012009-09-10 18:29:13 +0000606}
Chris Lattner1cca5e32003-08-03 21:54:21 +0000607
Sean Callanan1f24e012009-09-10 18:29:13 +0000608let mayStore = 1 in {
609def PUSH16r : I<0x50, AddRegFrm, (outs), (ins GR16:$reg), "push{w}\t$reg",[]>,
610 OpSize;
Evan Cheng2f245ba2007-09-26 01:29:06 +0000611def PUSH32r : I<0x50, AddRegFrm, (outs), (ins GR32:$reg), "push{l}\t$reg",[]>;
Sean Callanan1f24e012009-09-10 18:29:13 +0000612def PUSH16rmr: I<0xFF, MRM6r, (outs), (ins GR16:$reg), "push{w}\t$reg",[]>,
613 OpSize;
614def PUSH16rmm: I<0xFF, MRM6m, (outs), (ins i16mem:$src), "push{w}\t$src",[]>,
615 OpSize;
616def PUSH32rmr: I<0xFF, MRM6r, (outs), (ins GR32:$reg), "push{l}\t$reg",[]>;
617def PUSH32rmm: I<0xFF, MRM6m, (outs), (ins i32mem:$src), "push{l}\t$src",[]>;
Anton Korobeynikov57fc00d2007-04-17 09:20:00 +0000618
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000619def PUSHi8 : Ii8<0x6a, RawFrm, (outs), (ins i32i8imm:$imm),
Bill Wendling927788c2009-06-15 20:59:31 +0000620 "push{l}\t$imm", []>;
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000621def PUSHi16 : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm),
Kevin Enderby3c979b02010-05-03 20:45:05 +0000622 "push{w}\t$imm", []>, OpSize;
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000623def PUSHi32 : Ii32<0x68, RawFrm, (outs), (ins i32imm:$imm),
Bill Wendling927788c2009-06-15 20:59:31 +0000624 "push{l}\t$imm", []>;
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000625
Dan Gohmane5e4ff92010-05-20 16:16:00 +0000626def PUSHF16 : I<0x9C, RawFrm, (outs), (ins), "pushf{w}", []>, OpSize;
627def PUSHF32 : I<0x9C, RawFrm, (outs), (ins), "pushf{l|d}", []>,
628 Requires<[In32BitMode]>;
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000629
Sean Callanan108934c2009-12-18 00:01:26 +0000630}
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000631}
632
633let Defs = [RSP], Uses = [RSP], neverHasSideEffects=1 in {
634let mayLoad = 1 in {
635def POP64r : I<0x58, AddRegFrm,
636 (outs GR64:$reg), (ins), "pop{q}\t$reg", []>;
637def POP64rmr: I<0x8F, MRM0r, (outs GR64:$reg), (ins), "pop{q}\t$reg", []>;
638def POP64rmm: I<0x8F, MRM0m, (outs i64mem:$dst), (ins), "pop{q}\t$dst", []>;
639}
640let mayStore = 1 in {
641def PUSH64r : I<0x50, AddRegFrm,
642 (outs), (ins GR64:$reg), "push{q}\t$reg", []>;
643def PUSH64rmr: I<0xFF, MRM6r, (outs), (ins GR64:$reg), "push{q}\t$reg", []>;
644def PUSH64rmm: I<0xFF, MRM6m, (outs), (ins i64mem:$src), "push{q}\t$src", []>;
645}
646}
647
648let Defs = [RSP], Uses = [RSP], neverHasSideEffects = 1, mayStore = 1 in {
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000649def PUSH64i8 : Ii8<0x6a, RawFrm, (outs), (ins i8imm:$imm),
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000650 "push{q}\t$imm", []>;
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000651def PUSH64i16 : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm),
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000652 "push{q}\t$imm", []>;
653def PUSH64i32 : Ii32<0x68, RawFrm, (outs), (ins i64i32imm:$imm),
654 "push{q}\t$imm", []>;
655}
656
657let Defs = [RSP, EFLAGS], Uses = [RSP], mayLoad = 1, neverHasSideEffects=1 in
658def POPF64 : I<0x9D, RawFrm, (outs), (ins), "popfq", []>,
659 Requires<[In64BitMode]>;
660let Defs = [RSP], Uses = [RSP, EFLAGS], mayStore = 1, neverHasSideEffects=1 in
661def PUSHF64 : I<0x9C, RawFrm, (outs), (ins), "pushfq", []>,
662 Requires<[In64BitMode]>;
663
664
Evan Cheng2f245ba2007-09-26 01:29:06 +0000665
Nico Weber50b9efc2010-06-23 20:00:58 +0000666let Defs = [EDI, ESI, EBP, EBX, EDX, ECX, EAX, ESP], Uses = [ESP],
667 mayLoad=1, neverHasSideEffects=1 in {
668def POPA32 : I<0x61, RawFrm, (outs), (ins), "popa{l}", []>,
669 Requires<[In32BitMode]>;
670}
671let Defs = [ESP], Uses = [EDI, ESI, EBP, EBX, EDX, ECX, EAX, ESP],
672 mayStore=1, neverHasSideEffects=1 in {
673def PUSHA32 : I<0x60, RawFrm, (outs), (ins), "pusha{l}", []>,
674 Requires<[In32BitMode]>;
675}
676
Chris Lattner8917cd32010-10-05 06:52:26 +0000677let Constraints = "$src = $dst" in { // GR32 = bswap GR32
678def BSWAP32r : I<0xC8, AddRegFrm,
679 (outs GR32:$dst), (ins GR32:$src),
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000680 "bswap{l}\t$dst",
Chris Lattner8917cd32010-10-05 06:52:26 +0000681 [(set GR32:$dst, (bswap GR32:$src))]>, TB;
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000682
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000683def BSWAP64r : RI<0xC8, AddRegFrm, (outs GR64:$dst), (ins GR64:$src),
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000684 "bswap{q}\t$dst",
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000685 [(set GR64:$dst, (bswap GR64:$src))]>, TB;
Chris Lattner8917cd32010-10-05 06:52:26 +0000686} // Constraints = "$src = $dst"
Chris Lattner1cca5e32003-08-03 21:54:21 +0000687
Evan Cheng18efe262007-12-14 02:13:44 +0000688// Bit scan instructions.
689let Defs = [EFLAGS] in {
Evan Chengfd9e4732007-12-14 18:49:43 +0000690def BSF16rr : I<0xBC, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000691 "bsf{w}\t{$src, $dst|$dst, $src}",
Kevin Enderby9ac72822010-04-28 23:20:40 +0000692 [(set GR16:$dst, EFLAGS, (X86bsf GR16:$src))]>, TB, OpSize;
Evan Cheng18efe262007-12-14 02:13:44 +0000693def BSF16rm : I<0xBC, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000694 "bsf{w}\t{$src, $dst|$dst, $src}",
Kevin Enderby9ac72822010-04-28 23:20:40 +0000695 [(set GR16:$dst, EFLAGS, (X86bsf (loadi16 addr:$src)))]>, TB,
696 OpSize;
Evan Chengfd9e4732007-12-14 18:49:43 +0000697def BSF32rr : I<0xBC, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000698 "bsf{l}\t{$src, $dst|$dst, $src}",
Chris Lattnerd486d772010-03-28 05:07:17 +0000699 [(set GR32:$dst, EFLAGS, (X86bsf GR32:$src))]>, TB;
Evan Cheng18efe262007-12-14 02:13:44 +0000700def BSF32rm : I<0xBC, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000701 "bsf{l}\t{$src, $dst|$dst, $src}",
Chris Lattnerd486d772010-03-28 05:07:17 +0000702 [(set GR32:$dst, EFLAGS, (X86bsf (loadi32 addr:$src)))]>, TB;
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000703def BSF64rr : RI<0xBC, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
704 "bsf{q}\t{$src, $dst|$dst, $src}",
705 [(set GR64:$dst, EFLAGS, (X86bsf GR64:$src))]>, TB;
706def BSF64rm : RI<0xBC, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
707 "bsf{q}\t{$src, $dst|$dst, $src}",
708 [(set GR64:$dst, EFLAGS, (X86bsf (loadi64 addr:$src)))]>, TB;
Evan Cheng18efe262007-12-14 02:13:44 +0000709
Evan Chengfd9e4732007-12-14 18:49:43 +0000710def BSR16rr : I<0xBD, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000711 "bsr{w}\t{$src, $dst|$dst, $src}",
Kevin Enderby9ac72822010-04-28 23:20:40 +0000712 [(set GR16:$dst, EFLAGS, (X86bsr GR16:$src))]>, TB, OpSize;
Evan Cheng18efe262007-12-14 02:13:44 +0000713def BSR16rm : I<0xBD, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000714 "bsr{w}\t{$src, $dst|$dst, $src}",
Kevin Enderby9ac72822010-04-28 23:20:40 +0000715 [(set GR16:$dst, EFLAGS, (X86bsr (loadi16 addr:$src)))]>, TB,
716 OpSize;
Evan Chengfd9e4732007-12-14 18:49:43 +0000717def BSR32rr : I<0xBD, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000718 "bsr{l}\t{$src, $dst|$dst, $src}",
Chris Lattnerd486d772010-03-28 05:07:17 +0000719 [(set GR32:$dst, EFLAGS, (X86bsr GR32:$src))]>, TB;
Evan Cheng18efe262007-12-14 02:13:44 +0000720def BSR32rm : I<0xBD, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000721 "bsr{l}\t{$src, $dst|$dst, $src}",
Chris Lattnerd486d772010-03-28 05:07:17 +0000722 [(set GR32:$dst, EFLAGS, (X86bsr (loadi32 addr:$src)))]>, TB;
Chris Lattnerd8cc2722010-10-05 06:47:35 +0000723def BSR64rr : RI<0xBD, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
724 "bsr{q}\t{$src, $dst|$dst, $src}",
725 [(set GR64:$dst, EFLAGS, (X86bsr GR64:$src))]>, TB;
726def BSR64rm : RI<0xBD, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
727 "bsr{q}\t{$src, $dst|$dst, $src}",
728 [(set GR64:$dst, EFLAGS, (X86bsr (loadi64 addr:$src)))]>, TB;
Evan Cheng18efe262007-12-14 02:13:44 +0000729} // Defs = [EFLAGS]
730
Chris Lattner915e5e52004-02-12 17:53:22 +0000731
Kevin Enderby12ce0de2010-02-03 21:04:42 +0000732// These uses the DF flag in the EFLAGS register to inc or dec EDI and ESI
733let Defs = [EDI,ESI], Uses = [EDI,ESI,EFLAGS] in {
734def MOVSB : I<0xA4, RawFrm, (outs), (ins), "{movsb}", []>;
735def MOVSW : I<0xA5, RawFrm, (outs), (ins), "{movsw}", []>, OpSize;
736def MOVSD : I<0xA5, RawFrm, (outs), (ins), "{movsl|movsd}", []>;
Chris Lattnerd3f033d2010-10-05 06:27:48 +0000737def MOVSQ : RI<0xA5, RawFrm, (outs), (ins), "movsq", []>;
Kevin Enderby12ce0de2010-02-03 21:04:42 +0000738}
739
Kevin Enderby12ce0de2010-02-03 21:04:42 +0000740// These uses the DF flag in the EFLAGS register to inc or dec EDI and ESI
741let Defs = [EDI], Uses = [AL,EDI,EFLAGS] in
742def STOSB : I<0xAA, RawFrm, (outs), (ins), "{stosb}", []>;
743let Defs = [EDI], Uses = [AX,EDI,EFLAGS] in
744def STOSW : I<0xAB, RawFrm, (outs), (ins), "{stosw}", []>, OpSize;
745let Defs = [EDI], Uses = [EAX,EDI,EFLAGS] in
746def STOSD : I<0xAB, RawFrm, (outs), (ins), "{stosl|stosd}", []>;
Chris Lattnerd3f033d2010-10-05 06:27:48 +0000747let Defs = [RCX,RDI], Uses = [RAX,RCX,RDI,EFLAGS] in
748def STOSQ : RI<0xAB, RawFrm, (outs), (ins), "stosq", []>;
Kevin Enderby12ce0de2010-02-03 21:04:42 +0000749
Sean Callanana82e4652009-09-12 00:37:19 +0000750def SCAS8 : I<0xAE, RawFrm, (outs), (ins), "scas{b}", []>;
751def SCAS16 : I<0xAF, RawFrm, (outs), (ins), "scas{w}", []>, OpSize;
752def SCAS32 : I<0xAF, RawFrm, (outs), (ins), "scas{l}", []>;
Chris Lattnerd3f033d2010-10-05 06:27:48 +0000753def SCAS64 : RI<0xAF, RawFrm, (outs), (ins), "scasq", []>;
Sean Callanana82e4652009-09-12 00:37:19 +0000754
Sean Callanan6f8f4622009-09-12 02:25:20 +0000755def CMPS8 : I<0xA6, RawFrm, (outs), (ins), "cmps{b}", []>;
756def CMPS16 : I<0xA7, RawFrm, (outs), (ins), "cmps{w}", []>, OpSize;
757def CMPS32 : I<0xA7, RawFrm, (outs), (ins), "cmps{l}", []>;
Chris Lattnerd3f033d2010-10-05 06:27:48 +0000758def CMPS64 : RI<0xA7, RawFrm, (outs), (ins), "cmpsq", []>;
Sean Callanan6f8f4622009-09-12 02:25:20 +0000759
Chris Lattner02552de2009-08-11 16:58:39 +0000760
Chris Lattner1cca5e32003-08-03 21:54:21 +0000761//===----------------------------------------------------------------------===//
Chris Lattner434c7cb2010-10-05 05:32:15 +0000762// Move Instructions.
Chris Lattner1cca5e32003-08-03 21:54:21 +0000763//
Chris Lattner748a2fe2010-10-05 20:49:15 +0000764
Chris Lattnerba7e7562008-01-10 07:59:24 +0000765let neverHasSideEffects = 1 in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000766def MOV8rr : I<0x88, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000767 "mov{b}\t{$src, $dst|$dst, $src}", []>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000768def MOV16rr : I<0x89, MRMDestReg, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000769 "mov{w}\t{$src, $dst|$dst, $src}", []>, OpSize;
Evan Cheng64d80e32007-07-19 01:14:50 +0000770def MOV32rr : I<0x89, MRMDestReg, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000771 "mov{l}\t{$src, $dst|$dst, $src}", []>;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000772def MOV64rr : RI<0x89, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
773 "mov{q}\t{$src, $dst|$dst, $src}", []>;
Chris Lattnerba7e7562008-01-10 07:59:24 +0000774}
Evan Cheng359e9372008-06-18 08:13:07 +0000775let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000776def MOV8ri : Ii8 <0xB0, AddRegFrm, (outs GR8 :$dst), (ins i8imm :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000777 "mov{b}\t{$src, $dst|$dst, $src}",
Evan Cheng069287d2006-05-16 07:21:53 +0000778 [(set GR8:$dst, imm:$src)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000779def MOV16ri : Ii16<0xB8, AddRegFrm, (outs GR16:$dst), (ins i16imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000780 "mov{w}\t{$src, $dst|$dst, $src}",
Evan Cheng069287d2006-05-16 07:21:53 +0000781 [(set GR16:$dst, imm:$src)]>, OpSize;
Evan Cheng64d80e32007-07-19 01:14:50 +0000782def MOV32ri : Ii32<0xB8, AddRegFrm, (outs GR32:$dst), (ins i32imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000783 "mov{l}\t{$src, $dst|$dst, $src}",
Evan Cheng069287d2006-05-16 07:21:53 +0000784 [(set GR32:$dst, imm:$src)]>;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000785def MOV64ri : RIi64<0xB8, AddRegFrm, (outs GR64:$dst), (ins i64imm:$src),
786 "movabs{q}\t{$src, $dst|$dst, $src}",
787 [(set GR64:$dst, imm:$src)]>;
788def MOV64ri32 : RIi32<0xC7, MRM0r, (outs GR64:$dst), (ins i64i32imm:$src),
789 "mov{q}\t{$src, $dst|$dst, $src}",
790 [(set GR64:$dst, i64immSExt32:$src)]>;
Dan Gohmand45eddd2007-06-26 00:48:07 +0000791}
Kevin Enderby12ce0de2010-02-03 21:04:42 +0000792
Evan Cheng64d80e32007-07-19 01:14:50 +0000793def MOV8mi : Ii8 <0xC6, MRM0m, (outs), (ins i8mem :$dst, i8imm :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000794 "mov{b}\t{$src, $dst|$dst, $src}",
Evan Chengb51a0592005-12-10 00:48:20 +0000795 [(store (i8 imm:$src), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000796def MOV16mi : Ii16<0xC7, MRM0m, (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000797 "mov{w}\t{$src, $dst|$dst, $src}",
Evan Chengb51a0592005-12-10 00:48:20 +0000798 [(store (i16 imm:$src), addr:$dst)]>, OpSize;
Evan Cheng64d80e32007-07-19 01:14:50 +0000799def MOV32mi : Ii32<0xC7, MRM0m, (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000800 "mov{l}\t{$src, $dst|$dst, $src}",
Evan Chengb51a0592005-12-10 00:48:20 +0000801 [(store (i32 imm:$src), addr:$dst)]>;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000802def MOV64mi32 : RIi32<0xC7, MRM0m, (outs), (ins i64mem:$dst, i64i32imm:$src),
803 "mov{q}\t{$src, $dst|$dst, $src}",
804 [(store i64immSExt32:$src, addr:$dst)]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000805
Chris Lattnerb5505d02010-05-13 00:02:47 +0000806/// moffs8, moffs16 and moffs32 versions of moves. The immediate is a
807/// 32-bit offset from the PC. These are only valid in x86-32 mode.
Chris Lattner2745f6e2010-05-12 22:48:24 +0000808def MOV8o8a : Ii32 <0xA0, RawFrm, (outs), (ins offset8:$src),
Daniel Dunbar6c2c9a22010-07-19 06:14:44 +0000809 "mov{b}\t{$src, %al|%al, $src}", []>,
810 Requires<[In32BitMode]>;
Chris Lattner2745f6e2010-05-12 22:48:24 +0000811def MOV16o16a : Ii32 <0xA1, RawFrm, (outs), (ins offset16:$src),
Daniel Dunbar6c2c9a22010-07-19 06:14:44 +0000812 "mov{w}\t{$src, %ax|%ax, $src}", []>, OpSize,
813 Requires<[In32BitMode]>;
Sean Callanan108934c2009-12-18 00:01:26 +0000814def MOV32o32a : Ii32 <0xA1, RawFrm, (outs), (ins offset32:$src),
Daniel Dunbar6c2c9a22010-07-19 06:14:44 +0000815 "mov{l}\t{$src, %eax|%eax, $src}", []>,
816 Requires<[In32BitMode]>;
Chris Lattner2745f6e2010-05-12 22:48:24 +0000817def MOV8ao8 : Ii32 <0xA2, RawFrm, (outs offset8:$dst), (ins),
Daniel Dunbar6c2c9a22010-07-19 06:14:44 +0000818 "mov{b}\t{%al, $dst|$dst, %al}", []>,
819 Requires<[In32BitMode]>;
Chris Lattner2745f6e2010-05-12 22:48:24 +0000820def MOV16ao16 : Ii32 <0xA3, RawFrm, (outs offset16:$dst), (ins),
Daniel Dunbar6c2c9a22010-07-19 06:14:44 +0000821 "mov{w}\t{%ax, $dst|$dst, %ax}", []>, OpSize,
822 Requires<[In32BitMode]>;
Sean Callanan108934c2009-12-18 00:01:26 +0000823def MOV32ao32 : Ii32 <0xA3, RawFrm, (outs offset32:$dst), (ins),
Daniel Dunbar6c2c9a22010-07-19 06:14:44 +0000824 "mov{l}\t{%eax, $dst|$dst, %eax}", []>,
825 Requires<[In32BitMode]>;
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000826
Chris Lattner748a2fe2010-10-05 20:49:15 +0000827// FIXME: These definitions are utterly broken
828// Just leave them commented out for now because they're useless outside
829// of the large code model, and most compilers won't generate the instructions
830// in question.
831/*
832def MOV64o8a : RIi8<0xA0, RawFrm, (outs), (ins offset8:$src),
833 "mov{q}\t{$src, %rax|%rax, $src}", []>;
834def MOV64o64a : RIi32<0xA1, RawFrm, (outs), (ins offset64:$src),
835 "mov{q}\t{$src, %rax|%rax, $src}", []>;
836def MOV64ao8 : RIi8<0xA2, RawFrm, (outs offset8:$dst), (ins),
837 "mov{q}\t{%rax, $dst|$dst, %rax}", []>;
838def MOV64ao64 : RIi32<0xA3, RawFrm, (outs offset64:$dst), (ins),
839 "mov{q}\t{%rax, $dst|$dst, %rax}", []>;
840*/
841
Sean Callanan38fee0e2009-09-15 18:47:29 +0000842
Daniel Dunbardcbab9c2010-05-26 22:21:28 +0000843let isCodeGenOnly = 1 in {
Sean Callanan108934c2009-12-18 00:01:26 +0000844def MOV8rr_REV : I<0x8A, MRMSrcReg, (outs GR8:$dst), (ins GR8:$src),
845 "mov{b}\t{$src, $dst|$dst, $src}", []>;
846def MOV16rr_REV : I<0x8B, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src),
847 "mov{w}\t{$src, $dst|$dst, $src}", []>, OpSize;
848def MOV32rr_REV : I<0x8B, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
849 "mov{l}\t{$src, $dst|$dst, $src}", []>;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000850def MOV64rr_REV : RI<0x8B, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
851 "mov{q}\t{$src, $dst|$dst, $src}", []>;
Daniel Dunbardcbab9c2010-05-26 22:21:28 +0000852}
Sean Callanan108934c2009-12-18 00:01:26 +0000853
Dan Gohmanbc9d98b2010-02-27 23:47:46 +0000854let canFoldAsLoad = 1, isReMaterializable = 1 in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000855def MOV8rm : I<0x8A, MRMSrcMem, (outs GR8 :$dst), (ins i8mem :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000856 "mov{b}\t{$src, $dst|$dst, $src}",
Chris Lattnerc2406f22009-04-10 00:16:23 +0000857 [(set GR8:$dst, (loadi8 addr:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000858def MOV16rm : I<0x8B, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000859 "mov{w}\t{$src, $dst|$dst, $src}",
Chris Lattnerc2406f22009-04-10 00:16:23 +0000860 [(set GR16:$dst, (loadi16 addr:$src))]>, OpSize;
Evan Cheng64d80e32007-07-19 01:14:50 +0000861def MOV32rm : I<0x8B, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000862 "mov{l}\t{$src, $dst|$dst, $src}",
Chris Lattnerc2406f22009-04-10 00:16:23 +0000863 [(set GR32:$dst, (loadi32 addr:$src))]>;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000864def MOV64rm : RI<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
865 "mov{q}\t{$src, $dst|$dst, $src}",
866 [(set GR64:$dst, (load addr:$src))]>;
Evan Cheng2f394262007-08-30 05:49:43 +0000867}
Chris Lattner1cca5e32003-08-03 21:54:21 +0000868
Evan Cheng64d80e32007-07-19 01:14:50 +0000869def MOV8mr : I<0x88, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000870 "mov{b}\t{$src, $dst|$dst, $src}",
Evan Cheng069287d2006-05-16 07:21:53 +0000871 [(store GR8:$src, addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000872def MOV16mr : I<0x89, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000873 "mov{w}\t{$src, $dst|$dst, $src}",
Evan Cheng069287d2006-05-16 07:21:53 +0000874 [(store GR16:$src, addr:$dst)]>, OpSize;
Evan Cheng64d80e32007-07-19 01:14:50 +0000875def MOV32mr : I<0x89, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000876 "mov{l}\t{$src, $dst|$dst, $src}",
Evan Cheng069287d2006-05-16 07:21:53 +0000877 [(store GR32:$src, addr:$dst)]>;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000878def MOV64mr : RI<0x89, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
879 "mov{q}\t{$src, $dst|$dst, $src}",
880 [(store GR64:$src, addr:$dst)]>;
Dan Gohman21e3dfb2009-04-13 16:09:41 +0000881
Dan Gohman4af325d2009-04-27 16:41:36 +0000882// Versions of MOV8rr, MOV8mr, and MOV8rm that use i8mem_NOREX and GR8_NOREX so
883// that they can be used for copying and storing h registers, which can't be
884// encoded when a REX prefix is present.
Daniel Dunbarcf246b72010-07-19 06:14:49 +0000885let isCodeGenOnly = 1 in {
Dan Gohman6d9305c2009-04-15 00:04:23 +0000886let neverHasSideEffects = 1 in
Dan Gohmandf7dfc72009-04-15 19:48:57 +0000887def MOV8rr_NOREX : I<0x88, MRMDestReg,
888 (outs GR8_NOREX:$dst), (ins GR8_NOREX:$src),
Dan Gohman6d9305c2009-04-15 00:04:23 +0000889 "mov{b}\t{$src, $dst|$dst, $src} # NOREX", []>;
Evan Cheng8c147402009-04-30 00:58:57 +0000890let mayStore = 1 in
Dan Gohman6d9305c2009-04-15 00:04:23 +0000891def MOV8mr_NOREX : I<0x88, MRMDestMem,
892 (outs), (ins i8mem_NOREX:$dst, GR8_NOREX:$src),
893 "mov{b}\t{$src, $dst|$dst, $src} # NOREX", []>;
Evan Cheng8c147402009-04-30 00:58:57 +0000894let mayLoad = 1,
Dan Gohmanbc9d98b2010-02-27 23:47:46 +0000895 canFoldAsLoad = 1, isReMaterializable = 1 in
Dan Gohman4af325d2009-04-27 16:41:36 +0000896def MOV8rm_NOREX : I<0x8A, MRMSrcMem,
897 (outs GR8_NOREX:$dst), (ins i8mem_NOREX:$src),
898 "mov{b}\t{$src, $dst|$dst, $src} # NOREX", []>;
Daniel Dunbarcf246b72010-07-19 06:14:49 +0000899}
Dan Gohman21e3dfb2009-04-13 16:09:41 +0000900
Evan Cheng0488db92007-09-25 01:57:46 +0000901
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000902// Condition code ops, incl. set if equal/not equal/...
Chris Lattnerba7e7562008-01-10 07:59:24 +0000903let Defs = [EFLAGS], Uses = [AH], neverHasSideEffects = 1 in
Evan Cheng071a2792007-09-11 19:55:27 +0000904def SAHF : I<0x9E, RawFrm, (outs), (ins), "sahf", []>; // flags = AH
Chris Lattnerba7e7562008-01-10 07:59:24 +0000905let Defs = [AH], Uses = [EFLAGS], neverHasSideEffects = 1 in
Evan Cheng071a2792007-09-11 19:55:27 +0000906def LAHF : I<0x9F, RawFrm, (outs), (ins), "lahf", []>; // AH = flags
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000907
Sean Callanana09caa52009-09-02 00:55:49 +0000908
Chris Lattner748a2fe2010-10-05 20:49:15 +0000909//===----------------------------------------------------------------------===//
910// Bit tests instructions: BT, BTS, BTR, BTC.
Daniel Dunbar1e8ee892010-03-09 22:50:40 +0000911
Dan Gohmanc7a37d42008-12-23 22:45:23 +0000912let Defs = [EFLAGS] in {
Dan Gohman0c89b7e2009-01-13 20:32:45 +0000913def BT16rr : I<0xA3, MRMDestReg, (outs), (ins GR16:$src1, GR16:$src2),
Dan Gohmanc7a37d42008-12-23 22:45:23 +0000914 "bt{w}\t{$src2, $src1|$src1, $src2}",
Chris Lattnere3486a42010-03-19 00:01:11 +0000915 [(set EFLAGS, (X86bt GR16:$src1, GR16:$src2))]>, OpSize, TB;
Dan Gohman0c89b7e2009-01-13 20:32:45 +0000916def BT32rr : I<0xA3, MRMDestReg, (outs), (ins GR32:$src1, GR32:$src2),
Dan Gohmanc7a37d42008-12-23 22:45:23 +0000917 "bt{l}\t{$src2, $src1|$src1, $src2}",
Chris Lattnere3486a42010-03-19 00:01:11 +0000918 [(set EFLAGS, (X86bt GR32:$src1, GR32:$src2))]>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000919def BT64rr : RI<0xA3, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
920 "bt{q}\t{$src2, $src1|$src1, $src2}",
921 [(set EFLAGS, (X86bt GR64:$src1, GR64:$src2))]>, TB;
Dan Gohmanf31408d2009-01-13 23:23:30 +0000922
923// Unlike with the register+register form, the memory+register form of the
924// bt instruction does not ignore the high bits of the index. From ISel's
Sean Callanan108934c2009-12-18 00:01:26 +0000925// perspective, this is pretty bizarre. Make these instructions disassembly
926// only for now.
927
928def BT16mr : I<0xA3, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2),
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000929 "bt{w}\t{$src2, $src1|$src1, $src2}",
Dan Gohmanf31408d2009-01-13 23:23:30 +0000930// [(X86bt (loadi16 addr:$src1), GR16:$src2),
Sean Callanan108934c2009-12-18 00:01:26 +0000931// (implicit EFLAGS)]
932 []
933 >, OpSize, TB, Requires<[FastBTMem]>;
934def BT32mr : I<0xA3, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2),
Michael J. Spencer6e56b182010-10-20 23:40:27 +0000935 "bt{l}\t{$src2, $src1|$src1, $src2}",
Dan Gohmanf31408d2009-01-13 23:23:30 +0000936// [(X86bt (loadi32 addr:$src1), GR32:$src2),
Sean Callanan108934c2009-12-18 00:01:26 +0000937// (implicit EFLAGS)]
938 []
939 >, TB, Requires<[FastBTMem]>;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000940def BT64mr : RI<0xA3, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
941 "bt{q}\t{$src2, $src1|$src1, $src2}",
942// [(X86bt (loadi64 addr:$src1), GR64:$src2),
943// (implicit EFLAGS)]
944 []
945 >, TB;
Dan Gohman4afe15b2009-01-13 20:33:23 +0000946
947def BT16ri8 : Ii8<0xBA, MRM4r, (outs), (ins GR16:$src1, i16i8imm:$src2),
948 "bt{w}\t{$src2, $src1|$src1, $src2}",
Chris Lattnere3486a42010-03-19 00:01:11 +0000949 [(set EFLAGS, (X86bt GR16:$src1, i16immSExt8:$src2))]>,
950 OpSize, TB;
Dan Gohman4afe15b2009-01-13 20:33:23 +0000951def BT32ri8 : Ii8<0xBA, MRM4r, (outs), (ins GR32:$src1, i32i8imm:$src2),
952 "bt{l}\t{$src2, $src1|$src1, $src2}",
Chris Lattnere3486a42010-03-19 00:01:11 +0000953 [(set EFLAGS, (X86bt GR32:$src1, i32immSExt8:$src2))]>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000954def BT64ri8 : RIi8<0xBA, MRM4r, (outs), (ins GR64:$src1, i64i8imm:$src2),
955 "bt{q}\t{$src2, $src1|$src1, $src2}",
956 [(set EFLAGS, (X86bt GR64:$src1, i64immSExt8:$src2))]>, TB;
957
Dan Gohman4afe15b2009-01-13 20:33:23 +0000958// Note that these instructions don't need FastBTMem because that
959// only applies when the other operand is in a register. When it's
960// an immediate, bt is still fast.
961def BT16mi8 : Ii8<0xBA, MRM4m, (outs), (ins i16mem:$src1, i16i8imm:$src2),
962 "bt{w}\t{$src2, $src1|$src1, $src2}",
Chris Lattnere3486a42010-03-19 00:01:11 +0000963 [(set EFLAGS, (X86bt (loadi16 addr:$src1), i16immSExt8:$src2))
964 ]>, OpSize, TB;
Dan Gohman4afe15b2009-01-13 20:33:23 +0000965def BT32mi8 : Ii8<0xBA, MRM4m, (outs), (ins i32mem:$src1, i32i8imm:$src2),
966 "bt{l}\t{$src2, $src1|$src1, $src2}",
Chris Lattnere3486a42010-03-19 00:01:11 +0000967 [(set EFLAGS, (X86bt (loadi32 addr:$src1), i32immSExt8:$src2))
968 ]>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000969def BT64mi8 : RIi8<0xBA, MRM4m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
970 "bt{q}\t{$src2, $src1|$src1, $src2}",
971 [(set EFLAGS, (X86bt (loadi64 addr:$src1),
972 i64immSExt8:$src2))]>, TB;
973
Sean Callanan108934c2009-12-18 00:01:26 +0000974
975def BTC16rr : I<0xBB, MRMDestReg, (outs), (ins GR16:$src1, GR16:$src2),
976 "btc{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
977def BTC32rr : I<0xBB, MRMDestReg, (outs), (ins GR32:$src1, GR32:$src2),
978 "btc{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000979def BTC64rr : RI<0xBB, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
980 "btc{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +0000981def BTC16mr : I<0xBB, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2),
982 "btc{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
983def BTC32mr : I<0xBB, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2),
984 "btc{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000985def BTC64mr : RI<0xBB, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
986 "btc{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +0000987def BTC16ri8 : Ii8<0xBA, MRM7r, (outs), (ins GR16:$src1, i16i8imm:$src2),
988 "btc{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
989def BTC32ri8 : Ii8<0xBA, MRM7r, (outs), (ins GR32:$src1, i32i8imm:$src2),
990 "btc{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000991def BTC64ri8 : RIi8<0xBA, MRM7r, (outs), (ins GR64:$src1, i64i8imm:$src2),
992 "btc{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +0000993def BTC16mi8 : Ii8<0xBA, MRM7m, (outs), (ins i16mem:$src1, i16i8imm:$src2),
994 "btc{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
995def BTC32mi8 : Ii8<0xBA, MRM7m, (outs), (ins i32mem:$src1, i32i8imm:$src2),
996 "btc{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +0000997def BTC64mi8 : RIi8<0xBA, MRM7m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
998 "btc{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +0000999
1000def BTR16rr : I<0xB3, MRMDestReg, (outs), (ins GR16:$src1, GR16:$src2),
1001 "btr{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
1002def BTR32rr : I<0xB3, MRMDestReg, (outs), (ins GR32:$src1, GR32:$src2),
1003 "btr{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +00001004def BTR64rr : RI<0xB3, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
1005 "btr{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001006def BTR16mr : I<0xB3, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2),
1007 "btr{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
1008def BTR32mr : I<0xB3, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2),
1009 "btr{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +00001010def BTR64mr : RI<0xB3, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
1011 "btr{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001012def BTR16ri8 : Ii8<0xBA, MRM6r, (outs), (ins GR16:$src1, i16i8imm:$src2),
1013 "btr{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
1014def BTR32ri8 : Ii8<0xBA, MRM6r, (outs), (ins GR32:$src1, i32i8imm:$src2),
1015 "btr{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +00001016def BTR64ri8 : RIi8<0xBA, MRM6r, (outs), (ins GR64:$src1, i64i8imm:$src2),
1017 "btr{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001018def BTR16mi8 : Ii8<0xBA, MRM6m, (outs), (ins i16mem:$src1, i16i8imm:$src2),
1019 "btr{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
1020def BTR32mi8 : Ii8<0xBA, MRM6m, (outs), (ins i32mem:$src1, i32i8imm:$src2),
1021 "btr{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +00001022def BTR64mi8 : RIi8<0xBA, MRM6m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
1023 "btr{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001024
1025def BTS16rr : I<0xAB, MRMDestReg, (outs), (ins GR16:$src1, GR16:$src2),
1026 "bts{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
1027def BTS32rr : I<0xAB, MRMDestReg, (outs), (ins GR32:$src1, GR32:$src2),
1028 "bts{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +00001029def BTS64rr : RI<0xAB, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
1030 "bts{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001031def BTS16mr : I<0xAB, MRMDestMem, (outs), (ins i16mem:$src1, GR16:$src2),
1032 "bts{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
1033def BTS32mr : I<0xAB, MRMDestMem, (outs), (ins i32mem:$src1, GR32:$src2),
1034 "bts{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +00001035def BTS64mr : RI<0xAB, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
1036 "bts{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001037def BTS16ri8 : Ii8<0xBA, MRM5r, (outs), (ins GR16:$src1, i16i8imm:$src2),
1038 "bts{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
1039def BTS32ri8 : Ii8<0xBA, MRM5r, (outs), (ins GR32:$src1, i32i8imm:$src2),
1040 "bts{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +00001041def BTS64ri8 : RIi8<0xBA, MRM5r, (outs), (ins GR64:$src1, i64i8imm:$src2),
1042 "bts{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001043def BTS16mi8 : Ii8<0xBA, MRM5m, (outs), (ins i16mem:$src1, i16i8imm:$src2),
1044 "bts{w}\t{$src2, $src1|$src1, $src2}", []>, OpSize, TB;
1045def BTS32mi8 : Ii8<0xBA, MRM5m, (outs), (ins i32mem:$src1, i32i8imm:$src2),
1046 "bts{l}\t{$src2, $src1|$src1, $src2}", []>, TB;
Chris Lattner748a2fe2010-10-05 20:49:15 +00001047def BTS64mi8 : RIi8<0xBA, MRM5m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
1048 "bts{q}\t{$src2, $src1|$src1, $src2}", []>, TB;
Dan Gohmanc7a37d42008-12-23 22:45:23 +00001049} // Defs = [EFLAGS]
1050
Anton Korobeynikov2365f512007-07-14 14:06:15 +00001051
1052//===----------------------------------------------------------------------===//
Andrew Lenharthab0b9492008-02-21 06:45:13 +00001053// Atomic support
1054//
Andrew Lenharthea7da502008-03-01 13:37:02 +00001055
Eric Christopher9a9d2752010-07-22 02:48:34 +00001056
Evan Chengbb6939d2008-04-19 01:20:30 +00001057// Atomic swap. These are just normal xchg instructions. But since a memory
1058// operand is referenced, the atomicity is ensured.
Dan Gohman165660e2008-08-06 15:52:50 +00001059let Constraints = "$val = $dst" in {
Chris Lattner010496c2010-10-05 06:22:35 +00001060def XCHG8rm : I<0x86, MRMSrcMem, (outs GR8:$dst), (ins GR8:$val, i8mem:$ptr),
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001061 "xchg{b}\t{$val, $ptr|$ptr, $val}",
Chris Lattner010496c2010-10-05 06:22:35 +00001062 [(set GR8:$dst, (atomic_swap_8 addr:$ptr, GR8:$val))]>;
Chris Lattner5bde7342010-11-06 08:20:59 +00001063def XCHG16rm : I<0x87, MRMSrcMem, (outs GR16:$dst),(ins GR16:$val, i16mem:$ptr),
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001064 "xchg{w}\t{$val, $ptr|$ptr, $val}",
1065 [(set GR16:$dst, (atomic_swap_16 addr:$ptr, GR16:$val))]>,
Evan Chengbb6939d2008-04-19 01:20:30 +00001066 OpSize;
Chris Lattner5bde7342010-11-06 08:20:59 +00001067def XCHG32rm : I<0x87, MRMSrcMem, (outs GR32:$dst),(ins GR32:$val, i32mem:$ptr),
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001068 "xchg{l}\t{$val, $ptr|$ptr, $val}",
Chris Lattner010496c2010-10-05 06:22:35 +00001069 [(set GR32:$dst, (atomic_swap_32 addr:$ptr, GR32:$val))]>;
Chris Lattner5bde7342010-11-06 08:20:59 +00001070def XCHG64rm : RI<0x87, MRMSrcMem, (outs GR64:$dst),(ins GR64:$val,i64mem:$ptr),
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001071 "xchg{q}\t{$val, $ptr|$ptr, $val}",
Chris Lattner010496c2010-10-05 06:22:35 +00001072 [(set GR64:$dst, (atomic_swap_64 addr:$ptr, GR64:$val))]>;
Sean Callanan108934c2009-12-18 00:01:26 +00001073
Sean Callanan108934c2009-12-18 00:01:26 +00001074def XCHG8rr : I<0x86, MRMSrcReg, (outs GR8:$dst), (ins GR8:$val, GR8:$src),
1075 "xchg{b}\t{$val, $src|$src, $val}", []>;
Chris Lattner010496c2010-10-05 06:22:35 +00001076def XCHG16rr : I<0x87, MRMSrcReg, (outs GR16:$dst), (ins GR16:$val, GR16:$src),
1077 "xchg{w}\t{$val, $src|$src, $val}", []>, OpSize;
1078def XCHG32rr : I<0x87, MRMSrcReg, (outs GR32:$dst), (ins GR32:$val, GR32:$src),
1079 "xchg{l}\t{$val, $src|$src, $val}", []>;
1080def XCHG64rr : RI<0x87, MRMSrcReg, (outs GR64:$dst), (ins GR64:$val,GR64:$src),
1081 "xchg{q}\t{$val, $src|$src, $val}", []>;
Evan Chengbb6939d2008-04-19 01:20:30 +00001082}
1083
Sean Callanan108934c2009-12-18 00:01:26 +00001084def XCHG16ar : I<0x90, AddRegFrm, (outs), (ins GR16:$src),
1085 "xchg{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
1086def XCHG32ar : I<0x90, AddRegFrm, (outs), (ins GR32:$src),
1087 "xchg{l}\t{$src, %eax|%eax, $src}", []>;
Chris Lattner010496c2010-10-05 06:22:35 +00001088def XCHG64ar : RI<0x90, AddRegFrm, (outs), (ins GR64:$src),
1089 "xchg{q}\t{$src, %rax|%rax, $src}", []>;
Sean Callanan108934c2009-12-18 00:01:26 +00001090
Andrew Lenharth26ed8692008-03-01 21:52:34 +00001091
Andrew Lenharthea7da502008-03-01 13:37:02 +00001092
Sean Callanan108934c2009-12-18 00:01:26 +00001093def XADD8rr : I<0xC0, MRMDestReg, (outs GR8:$dst), (ins GR8:$src),
1094 "xadd{b}\t{$src, $dst|$dst, $src}", []>, TB;
1095def XADD16rr : I<0xC1, MRMDestReg, (outs GR16:$dst), (ins GR16:$src),
1096 "xadd{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize;
1097def XADD32rr : I<0xC1, MRMDestReg, (outs GR32:$dst), (ins GR32:$src),
1098 "xadd{l}\t{$src, $dst|$dst, $src}", []>, TB;
Chris Lattner010496c2010-10-05 06:22:35 +00001099def XADD64rr : RI<0xC1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
1100 "xadd{q}\t{$src, $dst|$dst, $src}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001101
Dan Gohman7f357ec2010-05-14 16:34:55 +00001102let mayLoad = 1, mayStore = 1 in {
Sean Callanan108934c2009-12-18 00:01:26 +00001103def XADD8rm : I<0xC0, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src),
1104 "xadd{b}\t{$src, $dst|$dst, $src}", []>, TB;
1105def XADD16rm : I<0xC1, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
1106 "xadd{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize;
1107def XADD32rm : I<0xC1, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
1108 "xadd{l}\t{$src, $dst|$dst, $src}", []>, TB;
Chris Lattner010496c2010-10-05 06:22:35 +00001109def XADD64rm : RI<0xC1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
1110 "xadd{q}\t{$src, $dst|$dst, $src}", []>, TB;
1111
Dan Gohman7f357ec2010-05-14 16:34:55 +00001112}
Sean Callanan108934c2009-12-18 00:01:26 +00001113
1114def CMPXCHG8rr : I<0xB0, MRMDestReg, (outs GR8:$dst), (ins GR8:$src),
1115 "cmpxchg{b}\t{$src, $dst|$dst, $src}", []>, TB;
1116def CMPXCHG16rr : I<0xB1, MRMDestReg, (outs GR16:$dst), (ins GR16:$src),
1117 "cmpxchg{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize;
1118def CMPXCHG32rr : I<0xB1, MRMDestReg, (outs GR32:$dst), (ins GR32:$src),
1119 "cmpxchg{l}\t{$src, $dst|$dst, $src}", []>, TB;
Chris Lattner010496c2010-10-05 06:22:35 +00001120def CMPXCHG64rr : RI<0xB1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
1121 "cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB;
Sean Callanan108934c2009-12-18 00:01:26 +00001122
Dan Gohman7f357ec2010-05-14 16:34:55 +00001123let mayLoad = 1, mayStore = 1 in {
Sean Callanan108934c2009-12-18 00:01:26 +00001124def CMPXCHG8rm : I<0xB0, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src),
1125 "cmpxchg{b}\t{$src, $dst|$dst, $src}", []>, TB;
1126def CMPXCHG16rm : I<0xB1, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
1127 "cmpxchg{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize;
1128def CMPXCHG32rm : I<0xB1, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
1129 "cmpxchg{l}\t{$src, $dst|$dst, $src}", []>, TB;
Chris Lattner010496c2010-10-05 06:22:35 +00001130def CMPXCHG64rm : RI<0xB1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
1131 "cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB;
Dan Gohman7f357ec2010-05-14 16:34:55 +00001132}
Sean Callanan108934c2009-12-18 00:01:26 +00001133
Evan Chengb093bd02010-01-08 01:29:19 +00001134let Defs = [EAX, EDX, EFLAGS], Uses = [EAX, EBX, ECX, EDX] in
Sean Callanan108934c2009-12-18 00:01:26 +00001135def CMPXCHG8B : I<0xC7, MRM1m, (outs), (ins i64mem:$dst),
1136 "cmpxchg8b\t$dst", []>, TB;
1137
Chris Lattner010496c2010-10-05 06:22:35 +00001138let Defs = [RAX, RDX, EFLAGS], Uses = [RAX, RBX, RCX, RDX] in
1139def CMPXCHG16B : RI<0xC7, MRM1m, (outs), (ins i128mem:$dst),
1140 "cmpxchg16b\t$dst", []>, TB;
Evan Cheng37b73872009-07-30 08:33:02 +00001141
Evan Cheng37b73872009-07-30 08:33:02 +00001142
Dale Johannesen48c1bc22008-10-02 18:53:47 +00001143
Kevin Enderby12ce0de2010-02-03 21:04:42 +00001144// Lock instruction prefix
1145def LOCK_PREFIX : I<0xF0, RawFrm, (outs), (ins), "lock", []>;
1146
1147// Repeat string operation instruction prefixes
1148// These uses the DF flag in the EFLAGS register to inc or dec ECX
1149let Defs = [ECX], Uses = [ECX,EFLAGS] in {
1150// Repeat (used with INS, OUTS, MOVS, LODS and STOS)
1151def REP_PREFIX : I<0xF3, RawFrm, (outs), (ins), "rep", []>;
1152// Repeat while not equal (used with CMPS and SCAS)
1153def REPNE_PREFIX : I<0xF2, RawFrm, (outs), (ins), "repne", []>;
1154}
1155
Kevin Enderby12ce0de2010-02-03 21:04:42 +00001156
Sean Callanan9a86f102009-09-16 22:59:28 +00001157// String manipulation instructions
Sean Callanan9a86f102009-09-16 22:59:28 +00001158def LODSB : I<0xAC, RawFrm, (outs), (ins), "lodsb", []>;
1159def LODSW : I<0xAD, RawFrm, (outs), (ins), "lodsw", []>, OpSize;
Sean Callanan108934c2009-12-18 00:01:26 +00001160def LODSD : I<0xAD, RawFrm, (outs), (ins), "lods{l|d}", []>;
Chris Lattner010496c2010-10-05 06:22:35 +00001161def LODSQ : RI<0xAD, RawFrm, (outs), (ins), "lodsq", []>;
Sean Callanan108934c2009-12-18 00:01:26 +00001162
1163def OUTSB : I<0x6E, RawFrm, (outs), (ins), "outsb", []>;
1164def OUTSW : I<0x6F, RawFrm, (outs), (ins), "outsw", []>, OpSize;
1165def OUTSD : I<0x6F, RawFrm, (outs), (ins), "outs{l|d}", []>;
1166
Sean Callanan108934c2009-12-18 00:01:26 +00001167
1168// Flag instructions
Sean Callanan108934c2009-12-18 00:01:26 +00001169def CLC : I<0xF8, RawFrm, (outs), (ins), "clc", []>;
1170def STC : I<0xF9, RawFrm, (outs), (ins), "stc", []>;
1171def CLI : I<0xFA, RawFrm, (outs), (ins), "cli", []>;
1172def STI : I<0xFB, RawFrm, (outs), (ins), "sti", []>;
1173def CLD : I<0xFC, RawFrm, (outs), (ins), "cld", []>;
1174def STD : I<0xFD, RawFrm, (outs), (ins), "std", []>;
1175def CMC : I<0xF5, RawFrm, (outs), (ins), "cmc", []>;
1176
1177def CLTS : I<0x06, RawFrm, (outs), (ins), "clts", []>, TB;
1178
1179// Table lookup instructions
Sean Callanan108934c2009-12-18 00:01:26 +00001180def XLAT : I<0xD7, RawFrm, (outs), (ins), "xlatb", []>;
1181
Kevin Enderby7aef62f2010-10-18 17:04:36 +00001182// ASCII Adjust After Addition
1183// sets AL, AH and CF and AF of EFLAGS and uses AL and AF of EFLAGS
1184def AAA : I<0x37, RawFrm, (outs), (ins), "aaa", []>, Requires<[In32BitMode]>;
Evan Cheng510e4782006-01-09 23:10:28 +00001185
Kevin Enderby7aef62f2010-10-18 17:04:36 +00001186// ASCII Adjust AX Before Division
1187// sets AL, AH and EFLAGS and uses AL and AH
1188def AAD8i8 : Ii8<0xD5, RawFrm, (outs), (ins i8imm:$src),
1189 "aad\t$src", []>, Requires<[In32BitMode]>;
1190
1191// ASCII Adjust AX After Multiply
1192// sets AL, AH and EFLAGS and uses AL
1193def AAM8i8 : Ii8<0xD4, RawFrm, (outs), (ins i8imm:$src),
1194 "aam\t$src", []>, Requires<[In32BitMode]>;
1195
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001196// ASCII Adjust AL After Subtraction - sets
Kevin Enderby7aef62f2010-10-18 17:04:36 +00001197// sets AL, AH and CF and AF of EFLAGS and uses AL and AF of EFLAGS
1198def AAS : I<0x3F, RawFrm, (outs), (ins), "aas", []>, Requires<[In32BitMode]>;
1199
1200// Decimal Adjust AL after Addition
1201// sets AL, CF and AF of EFLAGS and uses AL, CF and AF of EFLAGS
1202def DAA : I<0x27, RawFrm, (outs), (ins), "daa", []>, Requires<[In32BitMode]>;
1203
1204// Decimal Adjust AL after Subtraction
1205// sets AL, CF and AF of EFLAGS and uses AL, CF and AF of EFLAGS
1206def DAS : I<0x2F, RawFrm, (outs), (ins), "das", []>, Requires<[In32BitMode]>;
1207
1208// Check Array Index Against Bounds
1209def BOUNDS16rm : I<0x62, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
1210 "bound\t{$src, $dst|$dst, $src}", []>, OpSize,
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001211 Requires<[In32BitMode]>;
Kevin Enderby7aef62f2010-10-18 17:04:36 +00001212def BOUNDS32rm : I<0x62, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
1213 "bound\t{$src, $dst|$dst, $src}", []>,
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001214 Requires<[In32BitMode]>;
Kevin Enderby7aef62f2010-10-18 17:04:36 +00001215
1216// Adjust RPL Field of Segment Selector
1217def ARPL16rr : I<0x63, MRMDestReg, (outs GR16:$src), (ins GR16:$dst),
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001218 "arpl\t{$src, $dst|$dst, $src}", []>, Requires<[In32BitMode]>;
Kevin Enderby7aef62f2010-10-18 17:04:36 +00001219def ARPL16mr : I<0x63, MRMSrcMem, (outs GR16:$src), (ins i16mem:$dst),
Michael J. Spencer6e56b182010-10-20 23:40:27 +00001220 "arpl\t{$src, $dst|$dst, $src}", []>, Requires<[In32BitMode]>;
Dan Gohmane220c4b2009-09-18 19:59:53 +00001221
Bill Wendlingd350e022008-12-12 21:15:41 +00001222//===----------------------------------------------------------------------===//
Chris Lattner434c7cb2010-10-05 05:32:15 +00001223// Subsystems.
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001224//===----------------------------------------------------------------------===//
1225
Chris Lattner6367cfc2010-10-05 16:39:12 +00001226include "X86InstrArithmetic.td"
Chris Lattner35649fc2010-10-05 06:33:16 +00001227include "X86InstrCMovSetCC.td"
Chris Lattner8917cd32010-10-05 06:52:26 +00001228include "X86InstrExtension.td"
Chris Lattner87be16a2010-10-05 06:04:14 +00001229include "X86InstrControl.td"
Chris Lattner5f58e842010-10-05 07:00:12 +00001230include "X86InstrShiftRotate.td"
Chris Lattner87be16a2010-10-05 06:04:14 +00001231
Chris Lattner6367cfc2010-10-05 16:39:12 +00001232// X87 Floating Point Stack.
1233include "X86InstrFPStack.td"
1234
David Greene51898d72010-02-09 23:52:19 +00001235// SIMD support (SSE, MMX and AVX)
David Greene51898d72010-02-09 23:52:19 +00001236include "X86InstrFragmentsSIMD.td"
1237
Bruno Cardoso Lopes6b7e9162010-07-23 00:54:35 +00001238// FMA - Fused Multiply-Add support (requires FMA)
Bruno Cardoso Lopes6b7e9162010-07-23 00:54:35 +00001239include "X86InstrFMA.td"
1240
Chris Lattner434c7cb2010-10-05 05:32:15 +00001241// SSE, MMX and 3DNow! vector support.
Evan Cheng4e4c71e2006-02-21 20:00:20 +00001242include "X86InstrSSE.td"
Evan Cheng80f54042008-04-25 18:19:54 +00001243include "X86InstrMMX.td"
Chris Lattner7330d972010-10-02 23:06:23 +00001244include "X86Instr3DNow.td"
1245
Chris Lattnerd071b832010-10-05 06:06:53 +00001246include "X86InstrVMX.td"
1247
Chris Lattner434c7cb2010-10-05 05:32:15 +00001248// System instructions.
1249include "X86InstrSystem.td"
Chris Lattner87be16a2010-10-05 06:04:14 +00001250
1251// Compiler Pseudo Instructions and Pat Patterns
1252include "X86InstrCompiler.td"
1253
Chris Lattner674c1dc2010-10-30 17:36:36 +00001254//===----------------------------------------------------------------------===//
Chris Lattnerefd8dad2010-11-01 23:07:52 +00001255// Assembler Mnemonic Aliases
Chris Lattner674c1dc2010-10-30 17:36:36 +00001256//===----------------------------------------------------------------------===//
1257
Chris Lattner99f53522010-11-01 21:06:34 +00001258def : MnemonicAlias<"call", "calll">, Requires<[In32BitMode]>;
1259def : MnemonicAlias<"call", "callq">, Requires<[In64BitMode]>;
1260
Chris Lattner674c1dc2010-10-30 17:36:36 +00001261def : MnemonicAlias<"cbw", "cbtw">;
1262def : MnemonicAlias<"cwd", "cwtd">;
1263def : MnemonicAlias<"cdq", "cltd">;
1264def : MnemonicAlias<"cwde", "cwtl">;
1265def : MnemonicAlias<"cdqe", "cltq">;
Chris Lattner8b260a72010-10-30 18:07:17 +00001266
Chris Lattner693173f2010-10-30 19:23:13 +00001267def : MnemonicAlias<"pop", "popl">, Requires<[In32BitMode]>;
1268def : MnemonicAlias<"pop", "popq">, Requires<[In64BitMode]>;
1269def : MnemonicAlias<"popf", "popfl">, Requires<[In32BitMode]>;
1270def : MnemonicAlias<"popf", "popfq">, Requires<[In64BitMode]>;
Chris Lattner8b260a72010-10-30 18:07:17 +00001271def : MnemonicAlias<"popfd", "popfl">;
1272
Chris Lattnera33b93f2010-10-31 18:43:46 +00001273// FIXME: This is wrong for "push reg". "push %bx" should turn into pushw in
1274// all modes. However: "push (addr)" and "push $42" should default to
1275// pushl/pushq depending on the current mode. Similar for "pop %bx"
Chris Lattner693173f2010-10-30 19:23:13 +00001276def : MnemonicAlias<"push", "pushl">, Requires<[In32BitMode]>;
1277def : MnemonicAlias<"push", "pushq">, Requires<[In64BitMode]>;
1278def : MnemonicAlias<"pushf", "pushfl">, Requires<[In32BitMode]>;
1279def : MnemonicAlias<"pushf", "pushfq">, Requires<[In64BitMode]>;
1280def : MnemonicAlias<"pushfd", "pushfl">;
1281
Chris Lattner6f96b082010-10-30 18:17:33 +00001282def : MnemonicAlias<"repe", "rep">;
1283def : MnemonicAlias<"repz", "rep">;
1284def : MnemonicAlias<"repnz", "repne">;
1285
Chris Lattner693173f2010-10-30 19:23:13 +00001286def : MnemonicAlias<"retl", "ret">, Requires<[In32BitMode]>;
1287def : MnemonicAlias<"retq", "ret">, Requires<[In64BitMode]>;
1288
Chris Lattnera17a9a02010-10-30 18:14:54 +00001289def : MnemonicAlias<"salb", "shlb">;
1290def : MnemonicAlias<"salw", "shlw">;
1291def : MnemonicAlias<"sall", "shll">;
1292def : MnemonicAlias<"salq", "shlq">;
1293
Chris Lattner674c1dc2010-10-30 17:36:36 +00001294def : MnemonicAlias<"smovb", "movsb">;
1295def : MnemonicAlias<"smovw", "movsw">;
1296def : MnemonicAlias<"smovl", "movsl">;
1297def : MnemonicAlias<"smovq", "movsq">;
1298
Chris Lattner674c1dc2010-10-30 17:36:36 +00001299def : MnemonicAlias<"ud2a", "ud2">;
1300def : MnemonicAlias<"verrw", "verr">;
1301
Chris Lattner99f53522010-11-01 21:06:34 +00001302// System instruction aliases.
1303def : MnemonicAlias<"iret", "iretl">;
1304def : MnemonicAlias<"sysret", "sysretl">;
1305
1306def : MnemonicAlias<"lgdtl", "lgdt">, Requires<[In32BitMode]>;
1307def : MnemonicAlias<"lgdtq", "lgdt">, Requires<[In64BitMode]>;
1308def : MnemonicAlias<"lidtl", "lidt">, Requires<[In32BitMode]>;
1309def : MnemonicAlias<"lidtq", "lidt">, Requires<[In64BitMode]>;
1310def : MnemonicAlias<"sgdtl", "sgdt">, Requires<[In32BitMode]>;
1311def : MnemonicAlias<"sgdtq", "sgdt">, Requires<[In64BitMode]>;
1312def : MnemonicAlias<"sidtl", "sidt">, Requires<[In32BitMode]>;
1313def : MnemonicAlias<"sidtq", "sidt">, Requires<[In64BitMode]>;
1314
Chris Lattner674c1dc2010-10-30 17:36:36 +00001315
Chris Lattner8b260a72010-10-30 18:07:17 +00001316// Floating point stack aliases.
1317def : MnemonicAlias<"fcmovz", "fcmove">;
1318def : MnemonicAlias<"fcmova", "fcmovnbe">;
1319def : MnemonicAlias<"fcmovnae", "fcmovb">;
1320def : MnemonicAlias<"fcmovna", "fcmovbe">;
1321def : MnemonicAlias<"fcmovae", "fcmovnb">;
Chris Lattnerdb287882010-11-06 21:37:06 +00001322def : MnemonicAlias<"fcomip", "fcompi">;
Chris Lattner8b260a72010-10-30 18:07:17 +00001323def : MnemonicAlias<"fildq", "fildll">;
1324def : MnemonicAlias<"fldcww", "fldcw">;
1325def : MnemonicAlias<"fnstcww", "fnstcw">;
1326def : MnemonicAlias<"fnstsww", "fnstsw">;
Chris Lattnerdb287882010-11-06 21:37:06 +00001327def : MnemonicAlias<"fucomip", "fucompi">;
Chris Lattner8b260a72010-10-30 18:07:17 +00001328def : MnemonicAlias<"fwait", "wait">;
1329
1330
Chris Lattner8cb441c2010-10-30 17:56:50 +00001331class CondCodeAlias<string Prefix,string Suffix, string OldCond, string NewCond>
1332 : MnemonicAlias<!strconcat(Prefix, OldCond, Suffix),
1333 !strconcat(Prefix, NewCond, Suffix)>;
Chris Lattnerb69fc282010-10-30 17:51:45 +00001334
1335/// IntegerCondCodeMnemonicAlias - This multiclass defines a bunch of
1336/// MnemonicAlias's that canonicalize the condition code in a mnemonic, for
1337/// example "setz" -> "sete".
Chris Lattner8cb441c2010-10-30 17:56:50 +00001338multiclass IntegerCondCodeMnemonicAlias<string Prefix, string Suffix> {
1339 def C : CondCodeAlias<Prefix, Suffix, "c", "b">; // setc -> setb
1340 def Z : CondCodeAlias<Prefix, Suffix, "z" , "e">; // setz -> sete
1341 def NA : CondCodeAlias<Prefix, Suffix, "na", "be">; // setna -> setbe
1342 def NB : CondCodeAlias<Prefix, Suffix, "nb", "ae">; // setnb -> setae
1343 def NC : CondCodeAlias<Prefix, Suffix, "nc", "ae">; // setnc -> setae
1344 def NG : CondCodeAlias<Prefix, Suffix, "ng", "le">; // setng -> setle
1345 def NL : CondCodeAlias<Prefix, Suffix, "nl", "ge">; // setnl -> setge
1346 def NZ : CondCodeAlias<Prefix, Suffix, "nz", "ne">; // setnz -> setne
1347 def PE : CondCodeAlias<Prefix, Suffix, "pe", "p">; // setpe -> setp
1348 def PO : CondCodeAlias<Prefix, Suffix, "po", "np">; // setpo -> setnp
Chris Lattnerb69fc282010-10-30 17:51:45 +00001349
Chris Lattner8cb441c2010-10-30 17:56:50 +00001350 def NAE : CondCodeAlias<Prefix, Suffix, "nae", "b">; // setnae -> setb
1351 def NBE : CondCodeAlias<Prefix, Suffix, "nbe", "a">; // setnbe -> seta
1352 def NGE : CondCodeAlias<Prefix, Suffix, "nge", "l">; // setnge -> setl
1353 def NLE : CondCodeAlias<Prefix, Suffix, "nle", "g">; // setnle -> setg
Chris Lattnerb69fc282010-10-30 17:51:45 +00001354}
1355
1356// Aliases for set<CC>
Chris Lattner8cb441c2010-10-30 17:56:50 +00001357defm : IntegerCondCodeMnemonicAlias<"set", "">;
Chris Lattnerb69fc282010-10-30 17:51:45 +00001358// Aliases for j<CC>
Chris Lattner8cb441c2010-10-30 17:56:50 +00001359defm : IntegerCondCodeMnemonicAlias<"j", "">;
1360// Aliases for cmov<CC>{w,l,q}
1361defm : IntegerCondCodeMnemonicAlias<"cmov", "w">;
1362defm : IntegerCondCodeMnemonicAlias<"cmov", "l">;
1363defm : IntegerCondCodeMnemonicAlias<"cmov", "q">;
Chris Lattner674c1dc2010-10-30 17:36:36 +00001364
Chris Lattnerefd8dad2010-11-01 23:07:52 +00001365
1366//===----------------------------------------------------------------------===//
1367// Assembler Instruction Aliases
1368//===----------------------------------------------------------------------===//
1369
Chris Lattner98c870f2010-11-06 19:25:43 +00001370// aad/aam default to base 10 if no operand is specified.
1371def : InstAlias<"aad", (AAD8i8 10)>;
1372def : InstAlias<"aam", (AAM8i8 10)>;
1373
Chris Lattner41409852010-11-06 07:31:43 +00001374// clr aliases.
1375def : InstAlias<"clrb $reg", (XOR8rr GR8 :$reg, GR8 :$reg)>;
1376def : InstAlias<"clrw $reg", (XOR16rr GR16:$reg, GR16:$reg)>;
1377def : InstAlias<"clrl $reg", (XOR32rr GR32:$reg, GR32:$reg)>;
1378def : InstAlias<"clrq $reg", (XOR64rr GR64:$reg, GR64:$reg)>;
1379
Chris Lattner3af0e7d2010-11-06 20:47:38 +00001380// Various unary fpstack operations default to operating on on ST1.
1381// For example, "fxch" -> "fxch %st(1)"
1382def : InstAlias<"faddp", (ADD_FPrST0 ST1)>;
1383def : InstAlias<"fsubp", (SUBR_FPrST0 ST1)>;
1384def : InstAlias<"fsubrp", (SUB_FPrST0 ST1)>;
1385def : InstAlias<"fmulp", (MUL_FPrST0 ST1)>;
1386def : InstAlias<"fdivp", (DIVR_FPrST0 ST1)>;
1387def : InstAlias<"fdivrp", (DIV_FPrST0 ST1)>;
1388def : InstAlias<"fxch", (XCH_F ST1)>;
1389def : InstAlias<"fcomi", (COM_FIr ST1)>;
Chris Lattnerdb287882010-11-06 21:37:06 +00001390def : InstAlias<"fcompi", (COM_FIPr ST1)>;
Chris Lattner3af0e7d2010-11-06 20:47:38 +00001391def : InstAlias<"fucom", (UCOM_Fr ST1)>;
1392def : InstAlias<"fucomp", (UCOM_FPr ST1)>;
1393def : InstAlias<"fucomi", (UCOM_FIr ST1)>;
Chris Lattnerdb287882010-11-06 21:37:06 +00001394def : InstAlias<"fucompi", (UCOM_FIPr ST1)>;
Chris Lattner3af0e7d2010-11-06 20:47:38 +00001395
1396// Handle fmul/fadd/fsub/fdiv instructions with explicitly written st(0) op.
1397// For example, "fadd %st(4), %st(0)" -> "fadd %st(4)". We also disambiguate
1398// instructions like "fadd %st(0), %st(0)" as "fadd %st(0)" for consistency with
1399// gas.
1400multiclass FpUnaryAlias<string Mnemonic, Instruction Inst> {
1401 def : InstAlias<!strconcat(Mnemonic, " $op, %st(0)"), (Inst RST:$op)>;
1402 def : InstAlias<!strconcat(Mnemonic, " %st(0), %st(0)"), (Inst ST0)>;
1403}
1404
1405defm : FpUnaryAlias<"fadd", ADD_FST0r>;
1406defm : FpUnaryAlias<"faddp", ADD_FPrST0>;
1407defm : FpUnaryAlias<"fsub", SUB_FST0r>;
1408defm : FpUnaryAlias<"fsubp", SUBR_FPrST0>;
1409defm : FpUnaryAlias<"fsubr", SUBR_FST0r>;
1410defm : FpUnaryAlias<"fsubrp", SUB_FPrST0>;
1411defm : FpUnaryAlias<"fmul", MUL_FST0r>;
1412defm : FpUnaryAlias<"fmulp", MUL_FPrST0>;
1413defm : FpUnaryAlias<"fdiv", DIV_FST0r>;
1414defm : FpUnaryAlias<"fdivp", DIVR_FPrST0>;
1415defm : FpUnaryAlias<"fdivr", DIVR_FST0r>;
1416defm : FpUnaryAlias<"fdivrp", DIV_FPrST0>;
Chris Lattner235705b2010-11-06 20:55:09 +00001417defm : FpUnaryAlias<"fcomi", COM_FIr>;
Chris Lattner235705b2010-11-06 20:55:09 +00001418defm : FpUnaryAlias<"fucomi", UCOM_FIr>;
Chris Lattnerdb287882010-11-06 21:37:06 +00001419defm : FpUnaryAlias<"fcompi", COM_FIPr>;
1420defm : FpUnaryAlias<"fucompi", UCOM_FIPr>;
Chris Lattner235705b2010-11-06 20:55:09 +00001421
Chris Lattner3af0e7d2010-11-06 20:47:38 +00001422
1423// Handle "f{mulp,addp} st(0), $op" the same as "f{mulp,addp} $op", since they
1424// commute. We also allow fdivrp/fsubrp even though they don't commute, solely
1425// because gas supports it.
1426def : InstAlias<"faddp %st(0), $op", (ADD_FPrST0 RST:$op)>;
1427def : InstAlias<"fmulp %st(0), $op", (MUL_FPrST0 RST:$op)>;
1428def : InstAlias<"fsubrp %st(0), $op", (SUB_FPrST0 RST:$op)>;
1429def : InstAlias<"fdivrp %st(0), $op", (DIV_FPrST0 RST:$op)>;
Chris Lattner90fd7972010-11-06 19:57:21 +00001430
Chris Lattnerdea546b2010-11-06 18:58:32 +00001431// We accepts "fnstsw %eax" even though it only writes %ax.
1432def : InstAlias<"fnstsw %eax", (FNSTSW8r)>;
1433def : InstAlias<"fnstsw %al" , (FNSTSW8r)>;
1434def : InstAlias<"fnstsw" , (FNSTSW8r)>;
1435
Chris Lattner8caa2902010-11-06 07:48:45 +00001436// lcall and ljmp aliases. This seems to be an odd mapping in 64-bit mode, but
1437// this is compatible with what GAS does.
1438def : InstAlias<"lcall $seg, $off", (FARCALL32i i32imm:$off, i16imm:$seg)>;
1439def : InstAlias<"ljmp $seg, $off", (FARJMP32i i32imm:$off, i16imm:$seg)>;
1440def : InstAlias<"lcall *$dst", (FARCALL32m opaque48mem:$dst)>;
1441def : InstAlias<"ljmp *$dst", (FARJMP32m opaque48mem:$dst)>;
1442
Chris Lattner9c1dbc62010-11-06 18:44:26 +00001443// "imul <imm>, B" is an alias for "imul <imm>, B, B".
1444def : InstAlias<"imulw $imm, $r", (IMUL16rri GR16:$r, GR16:$r, i16imm:$imm)>;
1445def : InstAlias<"imulw $imm, $r", (IMUL16rri8 GR16:$r, GR16:$r, i16i8imm:$imm)>;
1446def : InstAlias<"imull $imm, $r", (IMUL32rri GR32:$r, GR32:$r, i32imm:$imm)>;
1447def : InstAlias<"imull $imm, $r", (IMUL32rri8 GR32:$r, GR32:$r, i32i8imm:$imm)>;
1448def : InstAlias<"imulq $imm, $r",(IMUL64rri32 GR64:$r, GR64:$r,i64i32imm:$imm)>;
1449def : InstAlias<"imulq $imm, $r", (IMUL64rri8 GR64:$r, GR64:$r, i64i8imm:$imm)>;
1450
Chris Lattner7e925cc2010-11-06 18:52:40 +00001451// inb %dx -> inb %al, %dx
1452def : InstAlias<"inb %dx", (IN8rr)>;
1453def : InstAlias<"inw %dx", (IN16rr)>;
1454def : InstAlias<"inl %dx", (IN32rr)>;
1455def : InstAlias<"inb $port", (IN8ri i8imm:$port)>;
Chris Lattnerdea546b2010-11-06 18:58:32 +00001456def : InstAlias<"inw $port", (IN16ri i8imm:$port)>;
Chris Lattner7e925cc2010-11-06 18:52:40 +00001457def : InstAlias<"inl $port", (IN32ri i8imm:$port)>;
1458
Chris Lattner9c1dbc62010-11-06 18:44:26 +00001459
Chris Lattner8caa2902010-11-06 07:48:45 +00001460// jmp and call aliases for lcall and ljmp. jmp $42,$5 -> ljmp
1461def : InstAlias<"call $seg, $off", (FARCALL32i i32imm:$off, i16imm:$seg)>;
1462def : InstAlias<"jmp $seg, $off", (FARJMP32i i32imm:$off, i16imm:$seg)>;
1463def : InstAlias<"callw $seg, $off", (FARCALL16i i16imm:$off, i16imm:$seg)>;
1464def : InstAlias<"jmpw $seg, $off", (FARJMP16i i16imm:$off, i16imm:$seg)>;
1465def : InstAlias<"calll $seg, $off", (FARCALL32i i32imm:$off, i16imm:$seg)>;
1466def : InstAlias<"jmpl $seg, $off", (FARJMP32i i32imm:$off, i16imm:$seg)>;
1467
1468
Chris Lattner9c1dbc62010-11-06 18:44:26 +00001469// Match 'movq <largeimm>, <reg>' as an alias for movabsq.
1470def : InstAlias<"movq $imm, $reg", (MOV64ri GR64:$reg, i64imm:$imm)>;
1471
Chris Lattner8caa2902010-11-06 07:48:45 +00001472// movsd with no operands (as opposed to the SSE scalar move of a double) is an
1473// alias for movsl. (as in rep; movsd)
1474def : InstAlias<"movsd", (MOVSD)>;
1475
Chris Lattnerefd8dad2010-11-01 23:07:52 +00001476// movsx aliases
Chris Lattner02ff6ba2010-11-06 07:34:58 +00001477def : InstAlias<"movsx $src, $dst", (MOVSX16rr8W GR16:$dst, GR8:$src)>;
1478def : InstAlias<"movsx $src, $dst", (MOVSX16rm8W GR16:$dst, i8mem:$src)>;
1479def : InstAlias<"movsx $src, $dst", (MOVSX32rr8 GR32:$dst, GR8:$src)>;
1480def : InstAlias<"movsx $src, $dst", (MOVSX32rr16 GR32:$dst, GR16:$src)>;
1481def : InstAlias<"movsx $src, $dst", (MOVSX64rr8 GR64:$dst, GR8:$src)>;
1482def : InstAlias<"movsx $src, $dst", (MOVSX64rr16 GR64:$dst, GR16:$src)>;
1483def : InstAlias<"movsx $src, $dst", (MOVSX64rr32 GR64:$dst, GR32:$src)>;
Chris Lattnerefd8dad2010-11-01 23:07:52 +00001484
1485// movzx aliases
Chris Lattner02ff6ba2010-11-06 07:34:58 +00001486def : InstAlias<"movzx $src, $dst", (MOVZX16rr8W GR16:$dst, GR8:$src)>;
1487def : InstAlias<"movzx $src, $dst", (MOVZX16rm8W GR16:$dst, i8mem:$src)>;
1488def : InstAlias<"movzx $src, $dst", (MOVZX32rr8 GR32:$dst, GR8:$src)>;
1489def : InstAlias<"movzx $src, $dst", (MOVZX32rr16 GR32:$dst, GR16:$src)>;
1490def : InstAlias<"movzx $src, $dst", (MOVZX64rr8_Q GR64:$dst, GR8:$src)>;
1491def : InstAlias<"movzx $src, $dst", (MOVZX64rr16_Q GR64:$dst, GR16:$src)>;
Chris Lattnerefd8dad2010-11-01 23:07:52 +00001492// Note: No GR32->GR64 movzx form.
1493
Chris Lattner7e925cc2010-11-06 18:52:40 +00001494// outb %dx -> outb %al, %dx
1495def : InstAlias<"outb %dx", (OUT8rr)>;
1496def : InstAlias<"outw %dx", (OUT16rr)>;
1497def : InstAlias<"outl %dx", (OUT32rr)>;
1498def : InstAlias<"outb $port", (OUT8ir i8imm:$port)>;
1499def : InstAlias<"outw $port", (OUT16ir i8imm:$port)>;
1500def : InstAlias<"outl $port", (OUT32ir i8imm:$port)>;
1501
Chris Lattner9c1dbc62010-11-06 18:44:26 +00001502// 'sldt <mem>' can be encoded with either sldtw or sldtq with the same
1503// effect (both store to a 16-bit mem). Force to sldtw to avoid ambiguity
1504// errors, since its encoding is the most compact.
1505def : InstAlias<"sldt $mem", (SLDT16m i16mem:$mem)>;
1506
Chris Lattner8c24b0c2010-11-06 21:23:40 +00001507/*
Chris Lattner17671512010-11-06 22:05:43 +00001508// "shl X, $1" is an alias for "shl X".
1509multiclass ShiftRotateByOneAlias<string Mnemonic, string Opc> {
Chris Lattner8c24b0c2010-11-06 21:23:40 +00001510 def : InstAlias<!strconcat(Mnemonic, "b $op, $$1"),
1511 (!cast<Instruction>(!strconcat(Opc, "8r1")) GR8:$op)>;
1512 def : InstAlias<!strconcat(Mnemonic, "w $op, $$1"),
1513 (!cast<Instruction>(!strconcat(Opc, "16r1")) GR16:$op)>;
1514 def : InstAlias<!strconcat(Mnemonic, "l $op, $$1"),
1515 (!cast<Instruction>(!strconcat(Opc, "32r1")) GR32:$op)>;
1516 def : InstAlias<!strconcat(Mnemonic, "q $op, $$1"),
1517 (!cast<Instruction>(!strconcat(Opc, "64r1")) GR64:$op)>;
1518 def : InstAlias<!strconcat(Mnemonic, "b $op, $$1"),
1519 (!cast<Instruction>(!strconcat(Opc, "8m1")) i8mem:$op)>;
1520 def : InstAlias<!strconcat(Mnemonic, "w $op, $$1"),
1521 (!cast<Instruction>(!strconcat(Opc, "16m1")) i16mem:$op)>;
1522 def : InstAlias<!strconcat(Mnemonic, "l $op, $$1"),
1523 (!cast<Instruction>(!strconcat(Opc, "32m1")) i32mem:$op)>;
1524 def : InstAlias<!strconcat(Mnemonic, "q $op, $$1"),
1525 (!cast<Instruction>(!strconcat(Opc, "64m1")) i64mem:$op)>;
1526}
1527
Chris Lattner17671512010-11-06 22:05:43 +00001528defm : ShiftRotateByOneAlias<"rcl", "RCL">;
1529defm : ShiftRotateByOneAlias<"rcr", "RCR">;
1530defm : ShiftRotateByOneAlias<"rol", "ROL">;
1531defm : ShiftRotateByOneAlias<"ror", "ROR">;
Chris Lattner8c24b0c2010-11-06 21:23:40 +00001532*/
1533
Chris Lattner5bde7342010-11-06 08:20:59 +00001534// test: We accept "testX <reg>, <mem>" and "testX <mem>, <reg>" as synonyms.
1535def : InstAlias<"testb $val, $mem", (TEST8rm GR8 :$val, i8mem :$mem)>;
1536def : InstAlias<"testw $val, $mem", (TEST16rm GR16:$val, i16mem:$mem)>;
1537def : InstAlias<"testl $val, $mem", (TEST32rm GR32:$val, i32mem:$mem)>;
1538def : InstAlias<"testq $val, $mem", (TEST64rm GR64:$val, i64mem:$mem)>;
1539
1540// xchg: We accept "xchgX <reg>, <mem>" and "xchgX <mem>, <reg>" as synonyms.
1541def : InstAlias<"xchgb $mem, $val", (XCHG8rm GR8 :$val, i8mem :$mem)>;
1542def : InstAlias<"xchgw $mem, $val", (XCHG16rm GR16:$val, i16mem:$mem)>;
1543def : InstAlias<"xchgl $mem, $val", (XCHG32rm GR32:$val, i32mem:$mem)>;
1544def : InstAlias<"xchgq $mem, $val", (XCHG64rm GR64:$val, i64mem:$mem)>;
Chris Lattnerefd8dad2010-11-01 23:07:52 +00001545