blob: e0d284f73f78166c928212a4af7b4adc6c20b450 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===- X86InstrInfo.td - Describe the X86 Instruction Set -------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
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
16//===----------------------------------------------------------------------===//
17// X86 specific DAG Nodes.
18//
19
20def SDTIntShiftDOp: SDTypeProfile<1, 3,
21 [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
22 SDTCisInt<0>, SDTCisInt<3>]>;
23
24def SDTX86CmpTest : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>;
25
26def SDTX86Cmov : SDTypeProfile<1, 3,
27 [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>,
28 SDTCisVT<3, i8>]>;
29
30def SDTX86BrCond : SDTypeProfile<0, 2,
31 [SDTCisVT<0, OtherVT>, SDTCisVT<1, i8>]>;
32
33def SDTX86SetCC : SDTypeProfile<1, 1,
34 [SDTCisVT<0, i8>, SDTCisVT<1, i8>]>;
35
36def SDTX86Ret : SDTypeProfile<0, 1, [SDTCisVT<0, i16>]>;
37
38def SDT_X86CallSeqStart : SDTypeProfile<0, 1, [ SDTCisVT<0, i32> ]>;
39def SDT_X86CallSeqEnd : SDTypeProfile<0, 2, [ SDTCisVT<0, i32>,
40 SDTCisVT<1, i32> ]>;
41
42def SDT_X86Call : SDTypeProfile<0, 1, [SDTCisVT<0, iPTR>]>;
43
44def SDTX86RepStr : SDTypeProfile<0, 1, [SDTCisVT<0, OtherVT>]>;
45
46def SDTX86RdTsc : SDTypeProfile<0, 0, []>;
47
48def SDTX86Wrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>;
49
50def SDT_X86TLSADDR : SDTypeProfile<1, 1, [SDTCisPtrTy<0>, SDTCisInt<1>]>;
51
52def SDT_X86TLSTP : SDTypeProfile<1, 0, [SDTCisPtrTy<0>]>;
53
54def SDT_X86EHRET : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
55
56def X86shld : SDNode<"X86ISD::SHLD", SDTIntShiftDOp>;
57def X86shrd : SDNode<"X86ISD::SHRD", SDTIntShiftDOp>;
58
59def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest,
60 [SDNPHasChain, SDNPOutFlag]>;
61
62def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov,
63 [SDNPInFlag, SDNPOutFlag]>;
64def X86brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond,
65 [SDNPHasChain, SDNPInFlag]>;
66def X86setcc : SDNode<"X86ISD::SETCC", SDTX86SetCC,
67 [SDNPInFlag, SDNPOutFlag]>;
68
69def X86retflag : SDNode<"X86ISD::RET_FLAG", SDTX86Ret,
70 [SDNPHasChain, SDNPOptInFlag]>;
71
72def X86callseq_start :
73 SDNode<"ISD::CALLSEQ_START", SDT_X86CallSeqStart,
74 [SDNPHasChain, SDNPOutFlag]>;
75def X86callseq_end :
76 SDNode<"ISD::CALLSEQ_END", SDT_X86CallSeqEnd,
77 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
78
79def X86call : SDNode<"X86ISD::CALL", SDT_X86Call,
80 [SDNPHasChain, SDNPOutFlag, SDNPOptInFlag]>;
81
82def X86tailcall: SDNode<"X86ISD::TAILCALL", SDT_X86Call,
83 [SDNPHasChain, SDNPOutFlag, SDNPOptInFlag]>;
84
85def X86rep_stos: SDNode<"X86ISD::REP_STOS", SDTX86RepStr,
86 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
87def X86rep_movs: SDNode<"X86ISD::REP_MOVS", SDTX86RepStr,
88 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
89
90def X86rdtsc : SDNode<"X86ISD::RDTSC_DAG",SDTX86RdTsc,
91 [SDNPHasChain, SDNPOutFlag]>;
92
93def X86Wrapper : SDNode<"X86ISD::Wrapper", SDTX86Wrapper>;
94def X86WrapperRIP : SDNode<"X86ISD::WrapperRIP", SDTX86Wrapper>;
95
96def X86tlsaddr : SDNode<"X86ISD::TLSADDR", SDT_X86TLSADDR,
97 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
98def X86TLStp : SDNode<"X86ISD::THREAD_POINTER", SDT_X86TLSTP, []>;
99
100def X86ehret : SDNode<"X86ISD::EH_RETURN", SDT_X86EHRET,
101 [SDNPHasChain]>;
102
103
104//===----------------------------------------------------------------------===//
105// X86 Operand Definitions.
106//
107
108// *mem - Operand definitions for the funky X86 addressing mode operands.
109//
110class X86MemOperand<string printMethod> : Operand<iPTR> {
111 let PrintMethod = printMethod;
112 let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc, i32imm);
113}
114
115def i8mem : X86MemOperand<"printi8mem">;
116def i16mem : X86MemOperand<"printi16mem">;
117def i32mem : X86MemOperand<"printi32mem">;
118def i64mem : X86MemOperand<"printi64mem">;
119def i128mem : X86MemOperand<"printi128mem">;
120def f32mem : X86MemOperand<"printf32mem">;
121def f64mem : X86MemOperand<"printf64mem">;
122def f128mem : X86MemOperand<"printf128mem">;
123
124def lea32mem : Operand<i32> {
125 let PrintMethod = "printi32mem";
126 let MIOperandInfo = (ops GR32, i8imm, GR32, i32imm);
127}
128
129def SSECC : Operand<i8> {
130 let PrintMethod = "printSSECC";
131}
132
133def piclabel: Operand<i32> {
134 let PrintMethod = "printPICLabel";
135}
136
137// A couple of more descriptive operand definitions.
138// 16-bits but only 8 bits are significant.
139def i16i8imm : Operand<i16>;
140// 32-bits but only 8 bits are significant.
141def i32i8imm : Operand<i32>;
142
143// Branch targets have OtherVT type.
144def brtarget : Operand<OtherVT>;
145
146//===----------------------------------------------------------------------===//
147// X86 Complex Pattern Definitions.
148//
149
150// Define X86 specific addressing mode.
151def addr : ComplexPattern<iPTR, 4, "SelectAddr", [], []>;
152def lea32addr : ComplexPattern<i32, 4, "SelectLEAAddr",
153 [add, mul, shl, or, frameindex], []>;
154
155//===----------------------------------------------------------------------===//
156// X86 Instruction Format Definitions.
157//
158
159// Format specifies the encoding used by the instruction. This is part of the
160// ad-hoc solution used to emit machine instruction encodings by our machine
161// code emitter.
162class Format<bits<6> val> {
163 bits<6> Value = val;
164}
165
166def Pseudo : Format<0>; def RawFrm : Format<1>;
167def AddRegFrm : Format<2>; def MRMDestReg : Format<3>;
168def MRMDestMem : Format<4>; def MRMSrcReg : Format<5>;
169def MRMSrcMem : Format<6>;
170def MRM0r : Format<16>; def MRM1r : Format<17>; def MRM2r : Format<18>;
171def MRM3r : Format<19>; def MRM4r : Format<20>; def MRM5r : Format<21>;
172def MRM6r : Format<22>; def MRM7r : Format<23>;
173def MRM0m : Format<24>; def MRM1m : Format<25>; def MRM2m : Format<26>;
174def MRM3m : Format<27>; def MRM4m : Format<28>; def MRM5m : Format<29>;
175def MRM6m : Format<30>; def MRM7m : Format<31>;
176def MRMInitReg : Format<32>;
177
178//===----------------------------------------------------------------------===//
179// X86 Instruction Predicate Definitions.
180def HasMMX : Predicate<"Subtarget->hasMMX()">;
181def HasSSE1 : Predicate<"Subtarget->hasSSE1()">;
182def HasSSE2 : Predicate<"Subtarget->hasSSE2()">;
183def HasSSE3 : Predicate<"Subtarget->hasSSE3()">;
184def HasSSSE3 : Predicate<"Subtarget->hasSSSE3()">;
185def FPStack : Predicate<"!Subtarget->hasSSE2()">;
186def In32BitMode : Predicate<"!Subtarget->is64Bit()">;
187def In64BitMode : Predicate<"Subtarget->is64Bit()">;
188def SmallCode : Predicate<"TM.getCodeModel() == CodeModel::Small">;
189def NotSmallCode : Predicate<"TM.getCodeModel() != CodeModel::Small">;
190def IsStatic : Predicate<"TM.getRelocationModel() == Reloc::Static">;
191
192//===----------------------------------------------------------------------===//
193// X86 specific pattern fragments.
194//
195
196// ImmType - This specifies the immediate type used by an instruction. This is
197// part of the ad-hoc solution used to emit machine instruction encodings by our
198// machine code emitter.
199class ImmType<bits<3> val> {
200 bits<3> Value = val;
201}
202def NoImm : ImmType<0>;
203def Imm8 : ImmType<1>;
204def Imm16 : ImmType<2>;
205def Imm32 : ImmType<3>;
206def Imm64 : ImmType<4>;
207
208// FPFormat - This specifies what form this FP instruction has. This is used by
209// the Floating-Point stackifier pass.
210class FPFormat<bits<3> val> {
211 bits<3> Value = val;
212}
213def NotFP : FPFormat<0>;
214def ZeroArgFP : FPFormat<1>;
215def OneArgFP : FPFormat<2>;
216def OneArgFPRW : FPFormat<3>;
217def TwoArgFP : FPFormat<4>;
218def CompareFP : FPFormat<5>;
219def CondMovFP : FPFormat<6>;
220def SpecialFP : FPFormat<7>;
221
222
Evan Chengb783fa32007-07-19 01:14:50 +0000223class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins,
224 string AsmStr>
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000225 : Instruction {
226 let Namespace = "X86";
227
228 bits<8> Opcode = opcod;
229 Format Form = f;
230 bits<6> FormBits = Form.Value;
231 ImmType ImmT = i;
232 bits<3> ImmTypeBits = ImmT.Value;
233
Evan Chengb783fa32007-07-19 01:14:50 +0000234 dag OutOperandList = outs;
235 dag InOperandList = ins;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000236 string AsmString = AsmStr;
237
238 //
239 // Attributes specific to X86 instructions...
240 //
241 bit hasOpSizePrefix = 0; // Does this inst have a 0x66 prefix?
242 bit hasAdSizePrefix = 0; // Does this inst have a 0x67 prefix?
243
244 bits<4> Prefix = 0; // Which prefix byte does this inst have?
245 bit hasREX_WPrefix = 0; // Does this inst requires the REX.W prefix?
246 FPFormat FPForm; // What flavor of FP instruction is this?
247 bits<3> FPFormBits = 0;
248}
249
250
251// Prefix byte classes which are used to indicate to the ad-hoc machine code
252// emitter that various prefix bytes are required.
253class OpSize { bit hasOpSizePrefix = 1; }
254class AdSize { bit hasAdSizePrefix = 1; }
255class REX_W { bit hasREX_WPrefix = 1; }
256class TB { bits<4> Prefix = 1; }
257class REP { bits<4> Prefix = 2; }
258class D8 { bits<4> Prefix = 3; }
259class D9 { bits<4> Prefix = 4; }
260class DA { bits<4> Prefix = 5; }
261class DB { bits<4> Prefix = 6; }
262class DC { bits<4> Prefix = 7; }
263class DD { bits<4> Prefix = 8; }
264class DE { bits<4> Prefix = 9; }
265class DF { bits<4> Prefix = 10; }
266class XD { bits<4> Prefix = 11; }
267class XS { bits<4> Prefix = 12; }
268class T8 { bits<4> Prefix = 13; }
269class TA { bits<4> Prefix = 14; }
270
271
272//===----------------------------------------------------------------------===//
273// Pattern fragments...
274//
275
276// X86 specific condition code. These correspond to CondCode in
277// X86InstrInfo.h. They must be kept in synch.
278def X86_COND_A : PatLeaf<(i8 0)>;
279def X86_COND_AE : PatLeaf<(i8 1)>;
280def X86_COND_B : PatLeaf<(i8 2)>;
281def X86_COND_BE : PatLeaf<(i8 3)>;
282def X86_COND_E : PatLeaf<(i8 4)>;
283def X86_COND_G : PatLeaf<(i8 5)>;
284def X86_COND_GE : PatLeaf<(i8 6)>;
285def X86_COND_L : PatLeaf<(i8 7)>;
286def X86_COND_LE : PatLeaf<(i8 8)>;
287def X86_COND_NE : PatLeaf<(i8 9)>;
288def X86_COND_NO : PatLeaf<(i8 10)>;
289def X86_COND_NP : PatLeaf<(i8 11)>;
290def X86_COND_NS : PatLeaf<(i8 12)>;
291def X86_COND_O : PatLeaf<(i8 13)>;
292def X86_COND_P : PatLeaf<(i8 14)>;
293def X86_COND_S : PatLeaf<(i8 15)>;
294
295def i16immSExt8 : PatLeaf<(i16 imm), [{
296 // i16immSExt8 predicate - True if the 16-bit immediate fits in a 8-bit
297 // sign extended field.
298 return (int16_t)N->getValue() == (int8_t)N->getValue();
299}]>;
300
301def i32immSExt8 : PatLeaf<(i32 imm), [{
302 // i32immSExt8 predicate - True if the 32-bit immediate fits in a 8-bit
303 // sign extended field.
304 return (int32_t)N->getValue() == (int8_t)N->getValue();
305}]>;
306
307// Helper fragments for loads.
308def loadi8 : PatFrag<(ops node:$ptr), (i8 (load node:$ptr))>;
309def loadi16 : PatFrag<(ops node:$ptr), (i16 (load node:$ptr))>;
310def loadi32 : PatFrag<(ops node:$ptr), (i32 (load node:$ptr))>;
311def loadi64 : PatFrag<(ops node:$ptr), (i64 (load node:$ptr))>;
312
313def loadf32 : PatFrag<(ops node:$ptr), (f32 (load node:$ptr))>;
314def loadf64 : PatFrag<(ops node:$ptr), (f64 (load node:$ptr))>;
315
316def sextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (sextloadi1 node:$ptr))>;
317def sextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (sextloadi1 node:$ptr))>;
318def sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextloadi8 node:$ptr))>;
319def sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextloadi8 node:$ptr))>;
320def sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextloadi16 node:$ptr))>;
321
322def zextloadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextloadi1 node:$ptr))>;
323def zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextloadi1 node:$ptr))>;
324def zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextloadi1 node:$ptr))>;
325def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>;
326def zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextloadi8 node:$ptr))>;
327def zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextloadi16 node:$ptr))>;
328
329def extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extloadi1 node:$ptr))>;
330def extloadi16i1 : PatFrag<(ops node:$ptr), (i16 (extloadi1 node:$ptr))>;
331def extloadi32i1 : PatFrag<(ops node:$ptr), (i32 (extloadi1 node:$ptr))>;
332def extloadi16i8 : PatFrag<(ops node:$ptr), (i16 (extloadi8 node:$ptr))>;
333def extloadi32i8 : PatFrag<(ops node:$ptr), (i32 (extloadi8 node:$ptr))>;
334def extloadi32i16 : PatFrag<(ops node:$ptr), (i32 (extloadi16 node:$ptr))>;
335
336//===----------------------------------------------------------------------===//
337// Instruction templates...
338//
339
Evan Chengb783fa32007-07-19 01:14:50 +0000340class I<bits<8> o, Format f, dag outs, dag ins, string asm, list<dag> pattern>
341 : X86Inst<o, f, NoImm, outs, ins, asm> {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000342 let Pattern = pattern;
343 let CodeSize = 3;
344}
Evan Chengb783fa32007-07-19 01:14:50 +0000345class Ii8 <bits<8> o, Format f, dag outs, dag ins, string asm, list<dag> pattern>
346 : X86Inst<o, f, Imm8 , outs, ins, asm> {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000347 let Pattern = pattern;
348 let CodeSize = 3;
349}
Evan Chengb783fa32007-07-19 01:14:50 +0000350class Ii16<bits<8> o, Format f, dag outs, dag ins, string asm, list<dag> pattern>
351 : X86Inst<o, f, Imm16, outs, ins, asm> {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000352 let Pattern = pattern;
353 let CodeSize = 3;
354}
Evan Chengb783fa32007-07-19 01:14:50 +0000355class Ii32<bits<8> o, Format f, dag outs, dag ins, string asm, list<dag> pattern>
356 : X86Inst<o, f, Imm32, outs, ins, asm> {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000357 let Pattern = pattern;
358 let CodeSize = 3;
359}
360
361//===----------------------------------------------------------------------===//
362// Instruction list...
363//
364
365// ADJCALLSTACKDOWN/UP implicitly use/def ESP because they may be expanded into
366// a stack adjustment and the codegen must know that they may modify the stack
367// pointer before prolog-epilog rewriting occurs.
Evan Chengb783fa32007-07-19 01:14:50 +0000368def ADJCALLSTACKDOWN : I<0, Pseudo, (outs), (ins i32imm:$amt), "#ADJCALLSTACKDOWN",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000369 [(X86callseq_start imm:$amt)]>, Imp<[ESP],[ESP]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000370def ADJCALLSTACKUP : I<0, Pseudo, (outs), (ins i32imm:$amt1, i32imm:$amt2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000371 "#ADJCALLSTACKUP",
372 [(X86callseq_end imm:$amt1, imm:$amt2)]>,
373 Imp<[ESP],[ESP]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000374def IMPLICIT_USE : I<0, Pseudo, (outs), (ins variable_ops),
375 "#IMPLICIT_USE", []>;
376def IMPLICIT_DEF : I<0, Pseudo, (outs variable_ops), (ins),
377 "#IMPLICIT_DEF", []>;
378def IMPLICIT_DEF_GR8 : I<0, Pseudo, (outs GR8:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000379 "#IMPLICIT_DEF $dst",
380 [(set GR8:$dst, (undef))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000381def IMPLICIT_DEF_GR16 : I<0, Pseudo, (outs GR16:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000382 "#IMPLICIT_DEF $dst",
383 [(set GR16:$dst, (undef))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000384def IMPLICIT_DEF_GR32 : I<0, Pseudo, (outs GR32:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000385 "#IMPLICIT_DEF $dst",
386 [(set GR32:$dst, (undef))]>;
387
388// Nop
Evan Chengb783fa32007-07-19 01:14:50 +0000389def NOOP : I<0x90, RawFrm, (outs), (ins), "nop", []>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000390
391// Truncate
Evan Chengb783fa32007-07-19 01:14:50 +0000392def TRUNC_32_to8 : I<0x88, MRMDestReg, (outs GR8:$dst), (ins GR32_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000393 "mov{b} {${src:subreg8}, $dst|$dst, ${src:subreg8}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000394def TRUNC_16_to8 : I<0x88, MRMDestReg, (outs GR8:$dst), (ins GR16_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000395 "mov{b} {${src:subreg8}, $dst|$dst, ${src:subreg8}}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000396def TRUNC_32to16 : I<0x89, MRMDestReg, (outs GR16:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000397 "mov{w} {${src:subreg16}, $dst|$dst, ${src:subreg16}}",
398 [(set GR16:$dst, (trunc GR32:$src))]>;
399
400//===----------------------------------------------------------------------===//
401// Control Flow Instructions...
402//
403
404// Return instructions.
405let isTerminator = 1, isReturn = 1, isBarrier = 1,
Evan Cheng37e7c752007-07-21 00:34:19 +0000406 hasCtrlDep = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000407 def RET : I<0xC3, RawFrm, (outs), (ins), "ret", [(X86retflag 0)]>;
408 def RETI : Ii16<0xC2, RawFrm, (outs), (ins i16imm:$amt), "ret $amt",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000409 [(X86retflag imm:$amt)]>;
410}
411
412// All branches are RawFrm, Void, Branch, and Terminators
Evan Cheng37e7c752007-07-21 00:34:19 +0000413let isBranch = 1, isTerminator = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000414 class IBr<bits<8> opcode, dag ins, string asm, list<dag> pattern> :
415 I<opcode, RawFrm, (outs), ins, asm, pattern>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000416
417// Indirect branches
418let isBranch = 1, isBarrier = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000419 def JMP : IBr<0xE9, (ins brtarget:$dst), "jmp $dst", [(br bb:$dst)]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000420
Evan Cheng37e7c752007-07-21 00:34:19 +0000421let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000422 def JMP32r : I<0xFF, MRM4r, (outs), (ins GR32:$dst), "jmp{l} {*}$dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000423 [(brind GR32:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000424 def JMP32m : I<0xFF, MRM4m, (outs), (ins i32mem:$dst), "jmp{l} {*}$dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000425 [(brind (loadi32 addr:$dst))]>;
426}
427
428// Conditional branches
Evan Chengb783fa32007-07-19 01:14:50 +0000429def JE : IBr<0x84, (ins brtarget:$dst), "je $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000430 [(X86brcond bb:$dst, X86_COND_E)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000431def JNE : IBr<0x85, (ins brtarget:$dst), "jne $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000432 [(X86brcond bb:$dst, X86_COND_NE)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000433def JL : IBr<0x8C, (ins brtarget:$dst), "jl $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000434 [(X86brcond bb:$dst, X86_COND_L)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000435def JLE : IBr<0x8E, (ins brtarget:$dst), "jle $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000436 [(X86brcond bb:$dst, X86_COND_LE)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000437def JG : IBr<0x8F, (ins brtarget:$dst), "jg $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000438 [(X86brcond bb:$dst, X86_COND_G)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000439def JGE : IBr<0x8D, (ins brtarget:$dst), "jge $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000440 [(X86brcond bb:$dst, X86_COND_GE)]>, TB;
441
Evan Chengb783fa32007-07-19 01:14:50 +0000442def JB : IBr<0x82, (ins brtarget:$dst), "jb $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000443 [(X86brcond bb:$dst, X86_COND_B)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000444def JBE : IBr<0x86, (ins brtarget:$dst), "jbe $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000445 [(X86brcond bb:$dst, X86_COND_BE)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000446def JA : IBr<0x87, (ins brtarget:$dst), "ja $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000447 [(X86brcond bb:$dst, X86_COND_A)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000448def JAE : IBr<0x83, (ins brtarget:$dst), "jae $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000449 [(X86brcond bb:$dst, X86_COND_AE)]>, TB;
450
Evan Chengb783fa32007-07-19 01:14:50 +0000451def JS : IBr<0x88, (ins brtarget:$dst), "js $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000452 [(X86brcond bb:$dst, X86_COND_S)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000453def JNS : IBr<0x89, (ins brtarget:$dst), "jns $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000454 [(X86brcond bb:$dst, X86_COND_NS)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000455def JP : IBr<0x8A, (ins brtarget:$dst), "jp $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000456 [(X86brcond bb:$dst, X86_COND_P)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000457def JNP : IBr<0x8B, (ins brtarget:$dst), "jnp $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000458 [(X86brcond bb:$dst, X86_COND_NP)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000459def JO : IBr<0x80, (ins brtarget:$dst), "jo $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000460 [(X86brcond bb:$dst, X86_COND_O)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000461def JNO : IBr<0x81, (ins brtarget:$dst), "jno $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000462 [(X86brcond bb:$dst, X86_COND_NO)]>, TB;
463
464//===----------------------------------------------------------------------===//
465// Call Instructions...
466//
Evan Cheng37e7c752007-07-21 00:34:19 +0000467let isCall = 1 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000468 // All calls clobber the non-callee saved registers...
469 let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
470 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
471 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7] in {
Evan Chengb783fa32007-07-19 01:14:50 +0000472 def CALLpcrel32 : I<0xE8, RawFrm, (outs), (ins i32imm:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000473 "call ${dst:call}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000474 def CALL32r : I<0xFF, MRM2r, (outs), (ins GR32:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000475 "call {*}$dst", [(X86call GR32:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000476 def CALL32m : I<0xFF, MRM2m, (outs), (ins i32mem:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000477 "call {*}$dst", []>;
478 }
479
480// Tail call stuff.
Evan Cheng37e7c752007-07-21 00:34:19 +0000481let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000482 def TAILJMPd : IBr<0xE9, (ins i32imm:$dst), "jmp ${dst:call} # TAIL CALL",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000483 []>;
Evan Cheng37e7c752007-07-21 00:34:19 +0000484let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000485 def TAILJMPr : I<0xFF, MRM4r, (outs), (ins GR32:$dst), "jmp {*}$dst # TAIL CALL",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000486 []>;
Evan Cheng37e7c752007-07-21 00:34:19 +0000487let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000488 def TAILJMPm : I<0xFF, MRM4m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000489 "jmp {*}$dst # TAIL CALL", []>;
490
491//===----------------------------------------------------------------------===//
492// Miscellaneous Instructions...
493//
494def LEAVE : I<0xC9, RawFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000495 (outs), (ins), "leave", []>, Imp<[EBP,ESP],[EBP,ESP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000496def POP32r : I<0x58, AddRegFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000497 (outs GR32:$reg), (ins), "pop{l} $reg", []>, Imp<[ESP],[ESP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000498
499def PUSH32r : I<0x50, AddRegFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000500 (outs), (ins GR32:$reg), "push{l} $reg", []>, Imp<[ESP],[ESP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000501
Evan Chengb783fa32007-07-19 01:14:50 +0000502def MovePCtoStack : I<0, Pseudo, (outs), (ins piclabel:$label),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000503 "call $label", []>;
504
505let isTwoAddress = 1 in // GR32 = bswap GR32
506 def BSWAP32r : I<0xC8, AddRegFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000507 (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000508 "bswap{l} $dst",
509 [(set GR32:$dst, (bswap GR32:$src))]>, TB;
510
Evan Chengb783fa32007-07-19 01:14:50 +0000511// FIXME: Model xchg* as two address instructions?
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000512def XCHG8rr : I<0x86, MRMDestReg, // xchg GR8, GR8
Evan Chengb783fa32007-07-19 01:14:50 +0000513 (outs), (ins GR8:$src1, GR8:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000514 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
515def XCHG16rr : I<0x87, MRMDestReg, // xchg GR16, GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000516 (outs), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000517 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
518def XCHG32rr : I<0x87, MRMDestReg, // xchg GR32, GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000519 (outs), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000520 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
521
522def XCHG8mr : I<0x86, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000523 (outs), (ins i8mem:$src1, GR8:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000524 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
525def XCHG16mr : I<0x87, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000526 (outs), (ins i16mem:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000527 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
528def XCHG32mr : I<0x87, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000529 (outs), (ins i32mem:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000530 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
531def XCHG8rm : I<0x86, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000532 (outs), (ins GR8:$src1, i8mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000533 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
534def XCHG16rm : I<0x87, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000535 (outs), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000536 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
537def XCHG32rm : I<0x87, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000538 (outs), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000539 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
540
541def LEA16r : I<0x8D, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000542 (outs GR16:$dst), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000543 "lea{w} {$src|$dst}, {$dst|$src}", []>, OpSize;
544def LEA32r : I<0x8D, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000545 (outs GR32:$dst), (ins lea32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000546 "lea{l} {$src|$dst}, {$dst|$src}",
547 [(set GR32:$dst, lea32addr:$src)]>, Requires<[In32BitMode]>;
548
Evan Chengb783fa32007-07-19 01:14:50 +0000549def REP_MOVSB : I<0xA4, RawFrm, (outs), (ins), "{rep;movsb|rep movsb}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000550 [(X86rep_movs i8)]>,
551 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP;
Evan Chengb783fa32007-07-19 01:14:50 +0000552def REP_MOVSW : I<0xA5, RawFrm, (outs), (ins), "{rep;movsw|rep movsw}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000553 [(X86rep_movs i16)]>,
554 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000555def REP_MOVSD : I<0xA5, RawFrm, (outs), (ins), "{rep;movsl|rep movsd}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000556 [(X86rep_movs i32)]>,
557 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP;
558
Evan Chengb783fa32007-07-19 01:14:50 +0000559def REP_STOSB : I<0xAA, RawFrm, (outs), (ins), "{rep;stosb|rep stosb}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000560 [(X86rep_stos i8)]>,
561 Imp<[AL,ECX,EDI], [ECX,EDI]>, REP;
Evan Chengb783fa32007-07-19 01:14:50 +0000562def REP_STOSW : I<0xAB, RawFrm, (outs), (ins), "{rep;stosw|rep stosw}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000563 [(X86rep_stos i16)]>,
564 Imp<[AX,ECX,EDI], [ECX,EDI]>, REP, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000565def REP_STOSD : I<0xAB, RawFrm, (outs), (ins), "{rep;stosl|rep stosd}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000566 [(X86rep_stos i32)]>,
567 Imp<[EAX,ECX,EDI], [ECX,EDI]>, REP;
568
Evan Chengb783fa32007-07-19 01:14:50 +0000569def RDTSC : I<0x31, RawFrm, (outs), (ins), "rdtsc", [(X86rdtsc)]>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000570 TB, Imp<[],[RAX,RDX]>;
571
572//===----------------------------------------------------------------------===//
573// Input/Output Instructions...
574//
Evan Chengb783fa32007-07-19 01:14:50 +0000575def IN8rr : I<0xEC, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000576 "in{b} {%dx, %al|%AL, %DX}",
577 []>, Imp<[DX], [AL]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000578def IN16rr : I<0xED, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000579 "in{w} {%dx, %ax|%AX, %DX}",
580 []>, Imp<[DX], [AX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000581def IN32rr : I<0xED, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000582 "in{l} {%dx, %eax|%EAX, %DX}",
583 []>, Imp<[DX],[EAX]>;
584
Evan Chengb783fa32007-07-19 01:14:50 +0000585def IN8ri : Ii8<0xE4, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000586 "in{b} {$port, %al|%AL, $port}",
587 []>,
588 Imp<[], [AL]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000589def IN16ri : Ii8<0xE5, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000590 "in{w} {$port, %ax|%AX, $port}",
591 []>,
592 Imp<[], [AX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000593def IN32ri : Ii8<0xE5, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000594 "in{l} {$port, %eax|%EAX, $port}",
595 []>,
596 Imp<[],[EAX]>;
597
Evan Chengb783fa32007-07-19 01:14:50 +0000598def OUT8rr : I<0xEE, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000599 "out{b} {%al, %dx|%DX, %AL}",
600 []>, Imp<[DX, AL], []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000601def OUT16rr : I<0xEF, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000602 "out{w} {%ax, %dx|%DX, %AX}",
603 []>, Imp<[DX, AX], []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000604def OUT32rr : I<0xEF, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000605 "out{l} {%eax, %dx|%DX, %EAX}",
606 []>, Imp<[DX, EAX], []>;
607
Evan Chengb783fa32007-07-19 01:14:50 +0000608def OUT8ir : Ii8<0xE6, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000609 "out{b} {%al, $port|$port, %AL}",
610 []>,
611 Imp<[AL], []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000612def OUT16ir : Ii8<0xE7, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000613 "out{w} {%ax, $port|$port, %AX}",
614 []>,
615 Imp<[AX], []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000616def OUT32ir : Ii8<0xE7, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000617 "out{l} {%eax, $port|$port, %EAX}",
618 []>,
619 Imp<[EAX], []>;
620
621//===----------------------------------------------------------------------===//
622// Move Instructions...
623//
Evan Chengb783fa32007-07-19 01:14:50 +0000624def MOV8rr : I<0x88, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000625 "mov{b} {$src, $dst|$dst, $src}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000626def MOV16rr : I<0x89, MRMDestReg, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000627 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000628def MOV32rr : I<0x89, MRMDestReg, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000629 "mov{l} {$src, $dst|$dst, $src}", []>;
630let isReMaterializable = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000631def MOV8ri : Ii8 <0xB0, AddRegFrm, (outs GR8 :$dst), (ins i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000632 "mov{b} {$src, $dst|$dst, $src}",
633 [(set GR8:$dst, imm:$src)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000634def MOV16ri : Ii16<0xB8, AddRegFrm, (outs GR16:$dst), (ins i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000635 "mov{w} {$src, $dst|$dst, $src}",
636 [(set GR16:$dst, imm:$src)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000637def MOV32ri : Ii32<0xB8, AddRegFrm, (outs GR32:$dst), (ins i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000638 "mov{l} {$src, $dst|$dst, $src}",
639 [(set GR32:$dst, imm:$src)]>;
640}
Evan Chengb783fa32007-07-19 01:14:50 +0000641def MOV8mi : Ii8 <0xC6, MRM0m, (outs), (ins i8mem :$dst, i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000642 "mov{b} {$src, $dst|$dst, $src}",
643 [(store (i8 imm:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000644def MOV16mi : Ii16<0xC7, MRM0m, (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000645 "mov{w} {$src, $dst|$dst, $src}",
646 [(store (i16 imm:$src), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000647def MOV32mi : Ii32<0xC7, MRM0m, (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000648 "mov{l} {$src, $dst|$dst, $src}",
649 [(store (i32 imm:$src), addr:$dst)]>;
650
Evan Chengb783fa32007-07-19 01:14:50 +0000651def MOV8rm : I<0x8A, MRMSrcMem, (outs GR8 :$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000652 "mov{b} {$src, $dst|$dst, $src}",
653 [(set GR8:$dst, (load addr:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000654def MOV16rm : I<0x8B, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000655 "mov{w} {$src, $dst|$dst, $src}",
656 [(set GR16:$dst, (load addr:$src))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000657def MOV32rm : I<0x8B, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000658 "mov{l} {$src, $dst|$dst, $src}",
659 [(set GR32:$dst, (load addr:$src))]>;
660
Evan Chengb783fa32007-07-19 01:14:50 +0000661def MOV8mr : I<0x88, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000662 "mov{b} {$src, $dst|$dst, $src}",
663 [(store GR8:$src, addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000664def MOV16mr : I<0x89, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000665 "mov{w} {$src, $dst|$dst, $src}",
666 [(store GR16:$src, addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000667def MOV32mr : I<0x89, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000668 "mov{l} {$src, $dst|$dst, $src}",
669 [(store GR32:$src, addr:$dst)]>;
670
671//===----------------------------------------------------------------------===//
672// Fixed-Register Multiplication and Division Instructions...
673//
674
675// Extra precision multiplication
Evan Chengb783fa32007-07-19 01:14:50 +0000676def MUL8r : I<0xF6, MRM4r, (outs), (ins GR8:$src), "mul{b} $src",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000677 // FIXME: Used for 8-bit mul, ignore result upper 8 bits.
678 // This probably ought to be moved to a def : Pat<> if the
679 // syntax can be accepted.
680 [(set AL, (mul AL, GR8:$src))]>,
681 Imp<[AL],[AX]>; // AL,AH = AL*GR8
Evan Chengb783fa32007-07-19 01:14:50 +0000682def MUL16r : I<0xF7, MRM4r, (outs), (ins GR16:$src), "mul{w} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000683 Imp<[AX],[AX,DX]>, OpSize; // AX,DX = AX*GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000684def MUL32r : I<0xF7, MRM4r, (outs), (ins GR32:$src), "mul{l} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000685 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000686def MUL8m : I<0xF6, MRM4m, (outs), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000687 "mul{b} $src",
688 // FIXME: Used for 8-bit mul, ignore result upper 8 bits.
689 // This probably ought to be moved to a def : Pat<> if the
690 // syntax can be accepted.
691 [(set AL, (mul AL, (loadi8 addr:$src)))]>,
692 Imp<[AL],[AX]>; // AL,AH = AL*[mem8]
Evan Chengb783fa32007-07-19 01:14:50 +0000693def MUL16m : I<0xF7, MRM4m, (outs), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000694 "mul{w} $src", []>, Imp<[AX],[AX,DX]>,
695 OpSize; // AX,DX = AX*[mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000696def MUL32m : I<0xF7, MRM4m, (outs), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000697 "mul{l} $src", []>, Imp<[EAX],[EAX,EDX]>;// EAX,EDX = EAX*[mem32]
698
Evan Chengb783fa32007-07-19 01:14:50 +0000699def IMUL8r : I<0xF6, MRM5r, (outs), (ins GR8:$src), "imul{b} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000700 Imp<[AL],[AX]>; // AL,AH = AL*GR8
Evan Chengb783fa32007-07-19 01:14:50 +0000701def IMUL16r : I<0xF7, MRM5r, (outs), (ins GR16:$src), "imul{w} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000702 Imp<[AX],[AX,DX]>, OpSize; // AX,DX = AX*GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000703def IMUL32r : I<0xF7, MRM5r, (outs), (ins GR32:$src), "imul{l} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000704 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000705def IMUL8m : I<0xF6, MRM5m, (outs), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000706 "imul{b} $src", []>, Imp<[AL],[AX]>; // AL,AH = AL*[mem8]
Evan Chengb783fa32007-07-19 01:14:50 +0000707def IMUL16m : I<0xF7, MRM5m, (outs), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000708 "imul{w} $src", []>, Imp<[AX],[AX,DX]>,
709 OpSize; // AX,DX = AX*[mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000710def IMUL32m : I<0xF7, MRM5m, (outs), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000711 "imul{l} $src", []>,
712 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*[mem32]
713
714// unsigned division/remainder
Evan Chengb783fa32007-07-19 01:14:50 +0000715def DIV8r : I<0xF6, MRM6r, (outs), (ins GR8:$src), // AX/r8 = AL,AH
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000716 "div{b} $src", []>, Imp<[AX],[AX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000717def DIV16r : I<0xF7, MRM6r, (outs), (ins GR16:$src), // DX:AX/r16 = AX,DX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000718 "div{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000719def DIV32r : I<0xF7, MRM6r, (outs), (ins GR32:$src), // EDX:EAX/r32 = EAX,EDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000720 "div{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000721def DIV8m : I<0xF6, MRM6m, (outs), (ins i8mem:$src), // AX/[mem8] = AL,AH
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000722 "div{b} $src", []>, Imp<[AX],[AX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000723def DIV16m : I<0xF7, MRM6m, (outs), (ins i16mem:$src), // DX:AX/[mem16] = AX,DX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000724 "div{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000725def DIV32m : I<0xF7, MRM6m, (outs), (ins i32mem:$src), // EDX:EAX/[mem32] = EAX,EDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000726 "div{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
727
728// Signed division/remainder.
Evan Chengb783fa32007-07-19 01:14:50 +0000729def IDIV8r : I<0xF6, MRM7r, (outs), (ins GR8:$src), // AX/r8 = AL,AH
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000730 "idiv{b} $src", []>, Imp<[AX],[AX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000731def IDIV16r: I<0xF7, MRM7r, (outs), (ins GR16:$src), // DX:AX/r16 = AX,DX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000732 "idiv{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000733def IDIV32r: I<0xF7, MRM7r, (outs), (ins GR32:$src), // EDX:EAX/r32 = EAX,EDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000734 "idiv{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000735def IDIV8m : I<0xF6, MRM7m, (outs), (ins i8mem:$src), // AX/[mem8] = AL,AH
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000736 "idiv{b} $src", []>, Imp<[AX],[AX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000737def IDIV16m: I<0xF7, MRM7m, (outs), (ins i16mem:$src), // DX:AX/[mem16] = AX,DX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000738 "idiv{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000739def IDIV32m: I<0xF7, MRM7m, (outs), (ins i32mem:$src), // EDX:EAX/[mem32] = EAX,EDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000740 "idiv{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
741
742
743//===----------------------------------------------------------------------===//
744// Two address Instructions...
745//
746let isTwoAddress = 1 in {
747
748// Conditional moves
749def CMOVB16rr : I<0x42, MRMSrcReg, // if <u, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000750 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000751 "cmovb {$src2, $dst|$dst, $src2}",
752 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
753 X86_COND_B))]>,
754 TB, OpSize;
755def CMOVB16rm : I<0x42, MRMSrcMem, // if <u, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000756 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000757 "cmovb {$src2, $dst|$dst, $src2}",
758 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
759 X86_COND_B))]>,
760 TB, OpSize;
761def CMOVB32rr : I<0x42, MRMSrcReg, // if <u, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000762 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000763 "cmovb {$src2, $dst|$dst, $src2}",
764 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
765 X86_COND_B))]>,
766 TB;
767def CMOVB32rm : I<0x42, MRMSrcMem, // if <u, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000768 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000769 "cmovb {$src2, $dst|$dst, $src2}",
770 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
771 X86_COND_B))]>,
772 TB;
773
774def CMOVAE16rr: I<0x43, MRMSrcReg, // if >=u, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000775 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000776 "cmovae {$src2, $dst|$dst, $src2}",
777 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
778 X86_COND_AE))]>,
779 TB, OpSize;
780def CMOVAE16rm: I<0x43, MRMSrcMem, // if >=u, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000781 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000782 "cmovae {$src2, $dst|$dst, $src2}",
783 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
784 X86_COND_AE))]>,
785 TB, OpSize;
786def CMOVAE32rr: I<0x43, MRMSrcReg, // if >=u, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000787 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000788 "cmovae {$src2, $dst|$dst, $src2}",
789 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
790 X86_COND_AE))]>,
791 TB;
792def CMOVAE32rm: I<0x43, MRMSrcMem, // if >=u, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000793 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000794 "cmovae {$src2, $dst|$dst, $src2}",
795 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
796 X86_COND_AE))]>,
797 TB;
798
799def CMOVE16rr : I<0x44, MRMSrcReg, // if ==, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000800 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000801 "cmove {$src2, $dst|$dst, $src2}",
802 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
803 X86_COND_E))]>,
804 TB, OpSize;
805def CMOVE16rm : I<0x44, MRMSrcMem, // if ==, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000806 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000807 "cmove {$src2, $dst|$dst, $src2}",
808 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
809 X86_COND_E))]>,
810 TB, OpSize;
811def CMOVE32rr : I<0x44, MRMSrcReg, // if ==, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000812 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000813 "cmove {$src2, $dst|$dst, $src2}",
814 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
815 X86_COND_E))]>,
816 TB;
817def CMOVE32rm : I<0x44, MRMSrcMem, // if ==, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000818 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000819 "cmove {$src2, $dst|$dst, $src2}",
820 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
821 X86_COND_E))]>,
822 TB;
823
824def CMOVNE16rr: I<0x45, MRMSrcReg, // if !=, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000825 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000826 "cmovne {$src2, $dst|$dst, $src2}",
827 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
828 X86_COND_NE))]>,
829 TB, OpSize;
830def CMOVNE16rm: I<0x45, MRMSrcMem, // if !=, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000831 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000832 "cmovne {$src2, $dst|$dst, $src2}",
833 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
834 X86_COND_NE))]>,
835 TB, OpSize;
836def CMOVNE32rr: I<0x45, MRMSrcReg, // if !=, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000837 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000838 "cmovne {$src2, $dst|$dst, $src2}",
839 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
840 X86_COND_NE))]>,
841 TB;
842def CMOVNE32rm: I<0x45, MRMSrcMem, // if !=, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000843 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000844 "cmovne {$src2, $dst|$dst, $src2}",
845 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
846 X86_COND_NE))]>,
847 TB;
848
849def CMOVBE16rr: I<0x46, MRMSrcReg, // if <=u, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000850 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000851 "cmovbe {$src2, $dst|$dst, $src2}",
852 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
853 X86_COND_BE))]>,
854 TB, OpSize;
855def CMOVBE16rm: I<0x46, MRMSrcMem, // if <=u, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000856 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000857 "cmovbe {$src2, $dst|$dst, $src2}",
858 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
859 X86_COND_BE))]>,
860 TB, OpSize;
861def CMOVBE32rr: I<0x46, MRMSrcReg, // if <=u, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000862 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000863 "cmovbe {$src2, $dst|$dst, $src2}",
864 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
865 X86_COND_BE))]>,
866 TB;
867def CMOVBE32rm: I<0x46, MRMSrcMem, // if <=u, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000868 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000869 "cmovbe {$src2, $dst|$dst, $src2}",
870 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
871 X86_COND_BE))]>,
872 TB;
873
874def CMOVA16rr : I<0x47, MRMSrcReg, // if >u, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000875 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000876 "cmova {$src2, $dst|$dst, $src2}",
877 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
878 X86_COND_A))]>,
879 TB, OpSize;
880def CMOVA16rm : I<0x47, MRMSrcMem, // if >u, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000881 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000882 "cmova {$src2, $dst|$dst, $src2}",
883 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
884 X86_COND_A))]>,
885 TB, OpSize;
886def CMOVA32rr : I<0x47, MRMSrcReg, // if >u, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000887 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000888 "cmova {$src2, $dst|$dst, $src2}",
889 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
890 X86_COND_A))]>,
891 TB;
892def CMOVA32rm : I<0x47, MRMSrcMem, // if >u, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000893 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000894 "cmova {$src2, $dst|$dst, $src2}",
895 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
896 X86_COND_A))]>,
897 TB;
898
899def CMOVL16rr : I<0x4C, MRMSrcReg, // if <s, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000900 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000901 "cmovl {$src2, $dst|$dst, $src2}",
902 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
903 X86_COND_L))]>,
904 TB, OpSize;
905def CMOVL16rm : I<0x4C, MRMSrcMem, // if <s, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000906 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000907 "cmovl {$src2, $dst|$dst, $src2}",
908 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
909 X86_COND_L))]>,
910 TB, OpSize;
911def CMOVL32rr : I<0x4C, MRMSrcReg, // if <s, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000912 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000913 "cmovl {$src2, $dst|$dst, $src2}",
914 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
915 X86_COND_L))]>,
916 TB;
917def CMOVL32rm : I<0x4C, MRMSrcMem, // if <s, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000918 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000919 "cmovl {$src2, $dst|$dst, $src2}",
920 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
921 X86_COND_L))]>,
922 TB;
923
924def CMOVGE16rr: I<0x4D, MRMSrcReg, // if >=s, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000925 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000926 "cmovge {$src2, $dst|$dst, $src2}",
927 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
928 X86_COND_GE))]>,
929 TB, OpSize;
930def CMOVGE16rm: I<0x4D, MRMSrcMem, // if >=s, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000931 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000932 "cmovge {$src2, $dst|$dst, $src2}",
933 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
934 X86_COND_GE))]>,
935 TB, OpSize;
936def CMOVGE32rr: I<0x4D, MRMSrcReg, // if >=s, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000937 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000938 "cmovge {$src2, $dst|$dst, $src2}",
939 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
940 X86_COND_GE))]>,
941 TB;
942def CMOVGE32rm: I<0x4D, MRMSrcMem, // if >=s, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000943 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000944 "cmovge {$src2, $dst|$dst, $src2}",
945 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
946 X86_COND_GE))]>,
947 TB;
948
949def CMOVLE16rr: I<0x4E, MRMSrcReg, // if <=s, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000950 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000951 "cmovle {$src2, $dst|$dst, $src2}",
952 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
953 X86_COND_LE))]>,
954 TB, OpSize;
955def CMOVLE16rm: I<0x4E, MRMSrcMem, // if <=s, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000956 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000957 "cmovle {$src2, $dst|$dst, $src2}",
958 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
959 X86_COND_LE))]>,
960 TB, OpSize;
961def CMOVLE32rr: I<0x4E, MRMSrcReg, // if <=s, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000962 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000963 "cmovle {$src2, $dst|$dst, $src2}",
964 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
965 X86_COND_LE))]>,
966 TB;
967def CMOVLE32rm: I<0x4E, MRMSrcMem, // if <=s, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000968 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000969 "cmovle {$src2, $dst|$dst, $src2}",
970 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
971 X86_COND_LE))]>,
972 TB;
973
974def CMOVG16rr : I<0x4F, MRMSrcReg, // if >s, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000975 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000976 "cmovg {$src2, $dst|$dst, $src2}",
977 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
978 X86_COND_G))]>,
979 TB, OpSize;
980def CMOVG16rm : I<0x4F, MRMSrcMem, // if >s, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000981 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000982 "cmovg {$src2, $dst|$dst, $src2}",
983 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
984 X86_COND_G))]>,
985 TB, OpSize;
986def CMOVG32rr : I<0x4F, MRMSrcReg, // if >s, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000987 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000988 "cmovg {$src2, $dst|$dst, $src2}",
989 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
990 X86_COND_G))]>,
991 TB;
992def CMOVG32rm : I<0x4F, MRMSrcMem, // if >s, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000993 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000994 "cmovg {$src2, $dst|$dst, $src2}",
995 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
996 X86_COND_G))]>,
997 TB;
998
999def CMOVS16rr : I<0x48, MRMSrcReg, // if signed, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +00001000 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001001 "cmovs {$src2, $dst|$dst, $src2}",
1002 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
1003 X86_COND_S))]>,
1004 TB, OpSize;
1005def CMOVS16rm : I<0x48, MRMSrcMem, // if signed, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +00001006 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001007 "cmovs {$src2, $dst|$dst, $src2}",
1008 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
1009 X86_COND_S))]>,
1010 TB, OpSize;
1011def CMOVS32rr : I<0x48, MRMSrcReg, // if signed, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +00001012 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001013 "cmovs {$src2, $dst|$dst, $src2}",
1014 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
1015 X86_COND_S))]>,
1016 TB;
1017def CMOVS32rm : I<0x48, MRMSrcMem, // if signed, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +00001018 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001019 "cmovs {$src2, $dst|$dst, $src2}",
1020 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
1021 X86_COND_S))]>,
1022 TB;
1023
1024def CMOVNS16rr: I<0x49, MRMSrcReg, // if !signed, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +00001025 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001026 "cmovns {$src2, $dst|$dst, $src2}",
1027 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
1028 X86_COND_NS))]>,
1029 TB, OpSize;
1030def CMOVNS16rm: I<0x49, MRMSrcMem, // if !signed, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +00001031 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001032 "cmovns {$src2, $dst|$dst, $src2}",
1033 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
1034 X86_COND_NS))]>,
1035 TB, OpSize;
1036def CMOVNS32rr: I<0x49, MRMSrcReg, // if !signed, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +00001037 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001038 "cmovns {$src2, $dst|$dst, $src2}",
1039 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
1040 X86_COND_NS))]>,
1041 TB;
1042def CMOVNS32rm: I<0x49, MRMSrcMem, // if !signed, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +00001043 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001044 "cmovns {$src2, $dst|$dst, $src2}",
1045 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
1046 X86_COND_NS))]>,
1047 TB;
1048
1049def CMOVP16rr : I<0x4A, MRMSrcReg, // if parity, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +00001050 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001051 "cmovp {$src2, $dst|$dst, $src2}",
1052 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
1053 X86_COND_P))]>,
1054 TB, OpSize;
1055def CMOVP16rm : I<0x4A, MRMSrcMem, // if parity, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +00001056 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001057 "cmovp {$src2, $dst|$dst, $src2}",
1058 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
1059 X86_COND_P))]>,
1060 TB, OpSize;
1061def CMOVP32rr : I<0x4A, MRMSrcReg, // if parity, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +00001062 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001063 "cmovp {$src2, $dst|$dst, $src2}",
1064 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
1065 X86_COND_P))]>,
1066 TB;
1067def CMOVP32rm : I<0x4A, MRMSrcMem, // if parity, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +00001068 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001069 "cmovp {$src2, $dst|$dst, $src2}",
1070 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
1071 X86_COND_P))]>,
1072 TB;
1073
1074def CMOVNP16rr : I<0x4B, MRMSrcReg, // if !parity, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +00001075 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001076 "cmovnp {$src2, $dst|$dst, $src2}",
1077 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
1078 X86_COND_NP))]>,
1079 TB, OpSize;
1080def CMOVNP16rm : I<0x4B, MRMSrcMem, // if !parity, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +00001081 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001082 "cmovnp {$src2, $dst|$dst, $src2}",
1083 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
1084 X86_COND_NP))]>,
1085 TB, OpSize;
1086def CMOVNP32rr : I<0x4B, MRMSrcReg, // if !parity, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +00001087 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001088 "cmovnp {$src2, $dst|$dst, $src2}",
1089 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
1090 X86_COND_NP))]>,
1091 TB;
1092def CMOVNP32rm : I<0x4B, MRMSrcMem, // if !parity, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +00001093 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001094 "cmovnp {$src2, $dst|$dst, $src2}",
1095 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
1096 X86_COND_NP))]>,
1097 TB;
1098
1099
1100// unary instructions
1101let CodeSize = 2 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001102def NEG8r : I<0xF6, MRM3r, (outs GR8 :$dst), (ins GR8 :$src), "neg{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001103 [(set GR8:$dst, (ineg GR8:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001104def NEG16r : I<0xF7, MRM3r, (outs GR16:$dst), (ins GR16:$src), "neg{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001105 [(set GR16:$dst, (ineg GR16:$src))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001106def NEG32r : I<0xF7, MRM3r, (outs GR32:$dst), (ins GR32:$src), "neg{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001107 [(set GR32:$dst, (ineg GR32:$src))]>;
1108let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001109 def NEG8m : I<0xF6, MRM3m, (outs), (ins i8mem :$dst), "neg{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001110 [(store (ineg (loadi8 addr:$dst)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001111 def NEG16m : I<0xF7, MRM3m, (outs), (ins i16mem:$dst), "neg{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001112 [(store (ineg (loadi16 addr:$dst)), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001113 def NEG32m : I<0xF7, MRM3m, (outs), (ins i32mem:$dst), "neg{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001114 [(store (ineg (loadi32 addr:$dst)), addr:$dst)]>;
1115
1116}
1117
Evan Chengb783fa32007-07-19 01:14:50 +00001118def NOT8r : I<0xF6, MRM2r, (outs GR8 :$dst), (ins GR8 :$src), "not{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001119 [(set GR8:$dst, (not GR8:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001120def NOT16r : I<0xF7, MRM2r, (outs GR16:$dst), (ins GR16:$src), "not{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001121 [(set GR16:$dst, (not GR16:$src))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001122def NOT32r : I<0xF7, MRM2r, (outs GR32:$dst), (ins GR32:$src), "not{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001123 [(set GR32:$dst, (not GR32:$src))]>;
1124let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001125 def NOT8m : I<0xF6, MRM2m, (outs), (ins i8mem :$dst), "not{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001126 [(store (not (loadi8 addr:$dst)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001127 def NOT16m : I<0xF7, MRM2m, (outs), (ins i16mem:$dst), "not{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001128 [(store (not (loadi16 addr:$dst)), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001129 def NOT32m : I<0xF7, MRM2m, (outs), (ins i32mem:$dst), "not{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001130 [(store (not (loadi32 addr:$dst)), addr:$dst)]>;
1131}
1132} // CodeSize
1133
1134// TODO: inc/dec is slow for P4, but fast for Pentium-M.
1135let CodeSize = 2 in
Evan Chengb783fa32007-07-19 01:14:50 +00001136def INC8r : I<0xFE, MRM0r, (outs GR8 :$dst), (ins GR8 :$src), "inc{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001137 [(set GR8:$dst, (add GR8:$src, 1))]>;
1138let isConvertibleToThreeAddress = 1, CodeSize = 1 in { // Can xform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001139def INC16r : I<0x40, AddRegFrm, (outs GR16:$dst), (ins GR16:$src), "inc{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001140 [(set GR16:$dst, (add GR16:$src, 1))]>,
1141 OpSize, Requires<[In32BitMode]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001142def INC32r : I<0x40, AddRegFrm, (outs GR32:$dst), (ins GR32:$src), "inc{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001143 [(set GR32:$dst, (add GR32:$src, 1))]>, Requires<[In32BitMode]>;
1144}
1145let isTwoAddress = 0, CodeSize = 2 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001146 def INC8m : I<0xFE, MRM0m, (outs), (ins i8mem :$dst), "inc{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001147 [(store (add (loadi8 addr:$dst), 1), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001148 def INC16m : I<0xFF, MRM0m, (outs), (ins i16mem:$dst), "inc{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001149 [(store (add (loadi16 addr:$dst), 1), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001150 def INC32m : I<0xFF, MRM0m, (outs), (ins i32mem:$dst), "inc{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001151 [(store (add (loadi32 addr:$dst), 1), addr:$dst)]>;
1152}
1153
1154let CodeSize = 2 in
Evan Chengb783fa32007-07-19 01:14:50 +00001155def DEC8r : I<0xFE, MRM1r, (outs GR8 :$dst), (ins GR8 :$src), "dec{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001156 [(set GR8:$dst, (add GR8:$src, -1))]>;
1157let isConvertibleToThreeAddress = 1, CodeSize = 1 in { // Can xform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001158def DEC16r : I<0x48, AddRegFrm, (outs GR16:$dst), (ins GR16:$src), "dec{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001159 [(set GR16:$dst, (add GR16:$src, -1))]>,
1160 OpSize, Requires<[In32BitMode]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001161def DEC32r : I<0x48, AddRegFrm, (outs GR32:$dst), (ins GR32:$src), "dec{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001162 [(set GR32:$dst, (add GR32:$src, -1))]>, Requires<[In32BitMode]>;
1163}
1164
1165let isTwoAddress = 0, CodeSize = 2 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001166 def DEC8m : I<0xFE, MRM1m, (outs), (ins i8mem :$dst), "dec{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001167 [(store (add (loadi8 addr:$dst), -1), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001168 def DEC16m : I<0xFF, MRM1m, (outs), (ins i16mem:$dst), "dec{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001169 [(store (add (loadi16 addr:$dst), -1), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001170 def DEC32m : I<0xFF, MRM1m, (outs), (ins i32mem:$dst), "dec{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001171 [(store (add (loadi32 addr:$dst), -1), addr:$dst)]>;
1172}
1173
1174// Logical operators...
1175let isCommutable = 1 in { // X = AND Y, Z --> X = AND Z, Y
1176def AND8rr : I<0x20, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001177 (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001178 "and{b} {$src2, $dst|$dst, $src2}",
1179 [(set GR8:$dst, (and GR8:$src1, GR8:$src2))]>;
1180def AND16rr : I<0x21, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001181 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001182 "and{w} {$src2, $dst|$dst, $src2}",
1183 [(set GR16:$dst, (and GR16:$src1, GR16:$src2))]>, OpSize;
1184def AND32rr : I<0x21, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001185 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001186 "and{l} {$src2, $dst|$dst, $src2}",
1187 [(set GR32:$dst, (and GR32:$src1, GR32:$src2))]>;
1188}
1189
1190def AND8rm : I<0x22, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001191 (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001192 "and{b} {$src2, $dst|$dst, $src2}",
1193 [(set GR8:$dst, (and GR8:$src1, (load addr:$src2)))]>;
1194def AND16rm : I<0x23, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001195 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001196 "and{w} {$src2, $dst|$dst, $src2}",
1197 [(set GR16:$dst, (and GR16:$src1, (load addr:$src2)))]>, OpSize;
1198def AND32rm : I<0x23, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001199 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001200 "and{l} {$src2, $dst|$dst, $src2}",
1201 [(set GR32:$dst, (and GR32:$src1, (load addr:$src2)))]>;
1202
1203def AND8ri : Ii8<0x80, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001204 (outs GR8 :$dst), (ins GR8 :$src1, i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001205 "and{b} {$src2, $dst|$dst, $src2}",
1206 [(set GR8:$dst, (and GR8:$src1, imm:$src2))]>;
1207def AND16ri : Ii16<0x81, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001208 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001209 "and{w} {$src2, $dst|$dst, $src2}",
1210 [(set GR16:$dst, (and GR16:$src1, imm:$src2))]>, OpSize;
1211def AND32ri : Ii32<0x81, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001212 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001213 "and{l} {$src2, $dst|$dst, $src2}",
1214 [(set GR32:$dst, (and GR32:$src1, imm:$src2))]>;
1215def AND16ri8 : Ii8<0x83, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001216 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001217 "and{w} {$src2, $dst|$dst, $src2}",
1218 [(set GR16:$dst, (and GR16:$src1, i16immSExt8:$src2))]>,
1219 OpSize;
1220def AND32ri8 : Ii8<0x83, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001221 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001222 "and{l} {$src2, $dst|$dst, $src2}",
1223 [(set GR32:$dst, (and GR32:$src1, i32immSExt8:$src2))]>;
1224
1225let isTwoAddress = 0 in {
1226 def AND8mr : I<0x20, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001227 (outs), (ins i8mem :$dst, GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001228 "and{b} {$src, $dst|$dst, $src}",
1229 [(store (and (load addr:$dst), GR8:$src), addr:$dst)]>;
1230 def AND16mr : I<0x21, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001231 (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001232 "and{w} {$src, $dst|$dst, $src}",
1233 [(store (and (load addr:$dst), GR16:$src), addr:$dst)]>,
1234 OpSize;
1235 def AND32mr : I<0x21, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001236 (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001237 "and{l} {$src, $dst|$dst, $src}",
1238 [(store (and (load addr:$dst), GR32:$src), addr:$dst)]>;
1239 def AND8mi : Ii8<0x80, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001240 (outs), (ins i8mem :$dst, i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001241 "and{b} {$src, $dst|$dst, $src}",
1242 [(store (and (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
1243 def AND16mi : Ii16<0x81, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001244 (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001245 "and{w} {$src, $dst|$dst, $src}",
1246 [(store (and (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
1247 OpSize;
1248 def AND32mi : Ii32<0x81, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001249 (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001250 "and{l} {$src, $dst|$dst, $src}",
1251 [(store (and (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
1252 def AND16mi8 : Ii8<0x83, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001253 (outs), (ins i16mem:$dst, i16i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001254 "and{w} {$src, $dst|$dst, $src}",
1255 [(store (and (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1256 OpSize;
1257 def AND32mi8 : Ii8<0x83, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001258 (outs), (ins i32mem:$dst, i32i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001259 "and{l} {$src, $dst|$dst, $src}",
1260 [(store (and (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
1261}
1262
1263
1264let isCommutable = 1 in { // X = OR Y, Z --> X = OR Z, Y
Evan Chengb783fa32007-07-19 01:14:50 +00001265def OR8rr : I<0x08, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001266 "or{b} {$src2, $dst|$dst, $src2}",
1267 [(set GR8:$dst, (or GR8:$src1, GR8:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001268def OR16rr : I<0x09, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001269 "or{w} {$src2, $dst|$dst, $src2}",
1270 [(set GR16:$dst, (or GR16:$src1, GR16:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001271def OR32rr : I<0x09, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001272 "or{l} {$src2, $dst|$dst, $src2}",
1273 [(set GR32:$dst, (or GR32:$src1, GR32:$src2))]>;
1274}
Evan Chengb783fa32007-07-19 01:14:50 +00001275def OR8rm : I<0x0A, MRMSrcMem , (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001276 "or{b} {$src2, $dst|$dst, $src2}",
1277 [(set GR8:$dst, (or GR8:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001278def OR16rm : I<0x0B, MRMSrcMem , (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001279 "or{w} {$src2, $dst|$dst, $src2}",
1280 [(set GR16:$dst, (or GR16:$src1, (load addr:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001281def OR32rm : I<0x0B, MRMSrcMem , (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001282 "or{l} {$src2, $dst|$dst, $src2}",
1283 [(set GR32:$dst, (or GR32:$src1, (load addr:$src2)))]>;
1284
Evan Chengb783fa32007-07-19 01:14:50 +00001285def OR8ri : Ii8 <0x80, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001286 "or{b} {$src2, $dst|$dst, $src2}",
1287 [(set GR8:$dst, (or GR8:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001288def OR16ri : Ii16<0x81, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001289 "or{w} {$src2, $dst|$dst, $src2}",
1290 [(set GR16:$dst, (or GR16:$src1, imm:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001291def OR32ri : Ii32<0x81, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001292 "or{l} {$src2, $dst|$dst, $src2}",
1293 [(set GR32:$dst, (or GR32:$src1, imm:$src2))]>;
1294
Evan Chengb783fa32007-07-19 01:14:50 +00001295def OR16ri8 : Ii8<0x83, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001296 "or{w} {$src2, $dst|$dst, $src2}",
1297 [(set GR16:$dst, (or GR16:$src1, i16immSExt8:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001298def OR32ri8 : Ii8<0x83, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001299 "or{l} {$src2, $dst|$dst, $src2}",
1300 [(set GR32:$dst, (or GR32:$src1, i32immSExt8:$src2))]>;
1301let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001302 def OR8mr : I<0x08, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001303 "or{b} {$src, $dst|$dst, $src}",
1304 [(store (or (load addr:$dst), GR8:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001305 def OR16mr : I<0x09, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001306 "or{w} {$src, $dst|$dst, $src}",
1307 [(store (or (load addr:$dst), GR16:$src), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001308 def OR32mr : I<0x09, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001309 "or{l} {$src, $dst|$dst, $src}",
1310 [(store (or (load addr:$dst), GR32:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001311 def OR8mi : Ii8<0x80, MRM1m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001312 "or{b} {$src, $dst|$dst, $src}",
1313 [(store (or (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001314 def OR16mi : Ii16<0x81, MRM1m, (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001315 "or{w} {$src, $dst|$dst, $src}",
1316 [(store (or (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
1317 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001318 def OR32mi : Ii32<0x81, MRM1m, (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001319 "or{l} {$src, $dst|$dst, $src}",
1320 [(store (or (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001321 def OR16mi8 : Ii8<0x83, MRM1m, (outs), (ins i16mem:$dst, i16i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001322 "or{w} {$src, $dst|$dst, $src}",
1323 [(store (or (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1324 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001325 def OR32mi8 : Ii8<0x83, MRM1m, (outs), (ins i32mem:$dst, i32i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001326 "or{l} {$src, $dst|$dst, $src}",
1327 [(store (or (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
1328}
1329
1330
1331let isCommutable = 1 in { // X = XOR Y, Z --> X = XOR Z, Y
1332def XOR8rr : I<0x30, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001333 (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001334 "xor{b} {$src2, $dst|$dst, $src2}",
1335 [(set GR8:$dst, (xor GR8:$src1, GR8:$src2))]>;
1336def XOR16rr : I<0x31, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001337 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001338 "xor{w} {$src2, $dst|$dst, $src2}",
1339 [(set GR16:$dst, (xor GR16:$src1, GR16:$src2))]>, OpSize;
1340def XOR32rr : I<0x31, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001341 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001342 "xor{l} {$src2, $dst|$dst, $src2}",
1343 [(set GR32:$dst, (xor GR32:$src1, GR32:$src2))]>;
1344}
1345
1346def XOR8rm : I<0x32, MRMSrcMem ,
Evan Chengb783fa32007-07-19 01:14:50 +00001347 (outs GR8 :$dst), (ins GR8:$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001348 "xor{b} {$src2, $dst|$dst, $src2}",
1349 [(set GR8:$dst, (xor GR8:$src1, (load addr:$src2)))]>;
1350def XOR16rm : I<0x33, MRMSrcMem ,
Evan Chengb783fa32007-07-19 01:14:50 +00001351 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001352 "xor{w} {$src2, $dst|$dst, $src2}",
1353 [(set GR16:$dst, (xor GR16:$src1, (load addr:$src2)))]>, OpSize;
1354def XOR32rm : I<0x33, MRMSrcMem ,
Evan Chengb783fa32007-07-19 01:14:50 +00001355 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001356 "xor{l} {$src2, $dst|$dst, $src2}",
1357 [(set GR32:$dst, (xor GR32:$src1, (load addr:$src2)))]>;
1358
1359def XOR8ri : Ii8<0x80, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001360 (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001361 "xor{b} {$src2, $dst|$dst, $src2}",
1362 [(set GR8:$dst, (xor GR8:$src1, imm:$src2))]>;
1363def XOR16ri : Ii16<0x81, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001364 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001365 "xor{w} {$src2, $dst|$dst, $src2}",
1366 [(set GR16:$dst, (xor GR16:$src1, imm:$src2))]>, OpSize;
1367def XOR32ri : Ii32<0x81, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001368 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001369 "xor{l} {$src2, $dst|$dst, $src2}",
1370 [(set GR32:$dst, (xor GR32:$src1, imm:$src2))]>;
1371def XOR16ri8 : Ii8<0x83, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001372 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001373 "xor{w} {$src2, $dst|$dst, $src2}",
1374 [(set GR16:$dst, (xor GR16:$src1, i16immSExt8:$src2))]>,
1375 OpSize;
1376def XOR32ri8 : Ii8<0x83, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001377 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001378 "xor{l} {$src2, $dst|$dst, $src2}",
1379 [(set GR32:$dst, (xor GR32:$src1, i32immSExt8:$src2))]>;
1380let isTwoAddress = 0 in {
1381 def XOR8mr : I<0x30, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001382 (outs), (ins i8mem :$dst, GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001383 "xor{b} {$src, $dst|$dst, $src}",
1384 [(store (xor (load addr:$dst), GR8:$src), addr:$dst)]>;
1385 def XOR16mr : I<0x31, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001386 (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001387 "xor{w} {$src, $dst|$dst, $src}",
1388 [(store (xor (load addr:$dst), GR16:$src), addr:$dst)]>,
1389 OpSize;
1390 def XOR32mr : I<0x31, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001391 (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001392 "xor{l} {$src, $dst|$dst, $src}",
1393 [(store (xor (load addr:$dst), GR32:$src), addr:$dst)]>;
1394 def XOR8mi : Ii8<0x80, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001395 (outs), (ins i8mem :$dst, i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001396 "xor{b} {$src, $dst|$dst, $src}",
1397 [(store (xor (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
1398 def XOR16mi : Ii16<0x81, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001399 (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001400 "xor{w} {$src, $dst|$dst, $src}",
1401 [(store (xor (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
1402 OpSize;
1403 def XOR32mi : Ii32<0x81, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001404 (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001405 "xor{l} {$src, $dst|$dst, $src}",
1406 [(store (xor (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
1407 def XOR16mi8 : Ii8<0x83, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001408 (outs), (ins i16mem:$dst, i16i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001409 "xor{w} {$src, $dst|$dst, $src}",
1410 [(store (xor (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1411 OpSize;
1412 def XOR32mi8 : Ii8<0x83, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001413 (outs), (ins i32mem:$dst, i32i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001414 "xor{l} {$src, $dst|$dst, $src}",
1415 [(store (xor (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
1416}
1417
1418// Shift instructions
Evan Chengb783fa32007-07-19 01:14:50 +00001419def SHL8rCL : I<0xD2, MRM4r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001420 "shl{b} {%cl, $dst|$dst, %CL}",
1421 [(set GR8:$dst, (shl GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001422def SHL16rCL : I<0xD3, MRM4r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001423 "shl{w} {%cl, $dst|$dst, %CL}",
1424 [(set GR16:$dst, (shl GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001425def SHL32rCL : I<0xD3, MRM4r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001426 "shl{l} {%cl, $dst|$dst, %CL}",
1427 [(set GR32:$dst, (shl GR32:$src, CL))]>, Imp<[CL],[]>;
1428
Evan Chengb783fa32007-07-19 01:14:50 +00001429def SHL8ri : Ii8<0xC0, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001430 "shl{b} {$src2, $dst|$dst, $src2}",
1431 [(set GR8:$dst, (shl GR8:$src1, (i8 imm:$src2)))]>;
1432let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001433def SHL16ri : Ii8<0xC1, MRM4r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001434 "shl{w} {$src2, $dst|$dst, $src2}",
1435 [(set GR16:$dst, (shl GR16:$src1, (i8 imm:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001436def SHL32ri : Ii8<0xC1, MRM4r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001437 "shl{l} {$src2, $dst|$dst, $src2}",
1438 [(set GR32:$dst, (shl GR32:$src1, (i8 imm:$src2)))]>;
1439}
1440
1441// Shift left by one. Not used because (add x, x) is slightly cheaper.
Evan Chengb783fa32007-07-19 01:14:50 +00001442def SHL8r1 : I<0xD0, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001443 "shl{b} $dst", []>;
Evan Chengb783fa32007-07-19 01:14:50 +00001444def SHL16r1 : I<0xD1, MRM4r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001445 "shl{w} $dst", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001446def SHL32r1 : I<0xD1, MRM4r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001447 "shl{l} $dst", []>;
1448
1449let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001450 def SHL8mCL : I<0xD2, MRM4m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001451 "shl{b} {%cl, $dst|$dst, %CL}",
1452 [(store (shl (loadi8 addr:$dst), CL), addr:$dst)]>,
1453 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001454 def SHL16mCL : I<0xD3, MRM4m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001455 "shl{w} {%cl, $dst|$dst, %CL}",
1456 [(store (shl (loadi16 addr:$dst), CL), addr:$dst)]>,
1457 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001458 def SHL32mCL : I<0xD3, MRM4m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001459 "shl{l} {%cl, $dst|$dst, %CL}",
1460 [(store (shl (loadi32 addr:$dst), CL), addr:$dst)]>,
1461 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001462 def SHL8mi : Ii8<0xC0, MRM4m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001463 "shl{b} {$src, $dst|$dst, $src}",
1464 [(store (shl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001465 def SHL16mi : Ii8<0xC1, MRM4m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001466 "shl{w} {$src, $dst|$dst, $src}",
1467 [(store (shl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1468 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001469 def SHL32mi : Ii8<0xC1, MRM4m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001470 "shl{l} {$src, $dst|$dst, $src}",
1471 [(store (shl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1472
1473 // Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001474 def SHL8m1 : I<0xD0, MRM4m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001475 "shl{b} $dst",
1476 [(store (shl (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001477 def SHL16m1 : I<0xD1, MRM4m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001478 "shl{w} $dst",
1479 [(store (shl (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,
1480 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001481 def SHL32m1 : I<0xD1, MRM4m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001482 "shl{l} $dst",
1483 [(store (shl (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1484}
1485
Evan Chengb783fa32007-07-19 01:14:50 +00001486def SHR8rCL : I<0xD2, MRM5r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001487 "shr{b} {%cl, $dst|$dst, %CL}",
1488 [(set GR8:$dst, (srl GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001489def SHR16rCL : I<0xD3, MRM5r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001490 "shr{w} {%cl, $dst|$dst, %CL}",
1491 [(set GR16:$dst, (srl GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001492def SHR32rCL : I<0xD3, MRM5r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001493 "shr{l} {%cl, $dst|$dst, %CL}",
1494 [(set GR32:$dst, (srl GR32:$src, CL))]>, Imp<[CL],[]>;
1495
Evan Chengb783fa32007-07-19 01:14:50 +00001496def SHR8ri : Ii8<0xC0, MRM5r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001497 "shr{b} {$src2, $dst|$dst, $src2}",
1498 [(set GR8:$dst, (srl GR8:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001499def SHR16ri : Ii8<0xC1, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001500 "shr{w} {$src2, $dst|$dst, $src2}",
1501 [(set GR16:$dst, (srl GR16:$src1, (i8 imm:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001502def SHR32ri : Ii8<0xC1, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001503 "shr{l} {$src2, $dst|$dst, $src2}",
1504 [(set GR32:$dst, (srl GR32:$src1, (i8 imm:$src2)))]>;
1505
1506// Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001507def SHR8r1 : I<0xD0, MRM5r, (outs GR8:$dst), (ins GR8:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001508 "shr{b} $dst",
1509 [(set GR8:$dst, (srl GR8:$src1, (i8 1)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001510def SHR16r1 : I<0xD1, MRM5r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001511 "shr{w} $dst",
1512 [(set GR16:$dst, (srl GR16:$src1, (i8 1)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001513def SHR32r1 : I<0xD1, MRM5r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001514 "shr{l} $dst",
1515 [(set GR32:$dst, (srl GR32:$src1, (i8 1)))]>;
1516
1517let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001518 def SHR8mCL : I<0xD2, MRM5m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001519 "shr{b} {%cl, $dst|$dst, %CL}",
1520 [(store (srl (loadi8 addr:$dst), CL), addr:$dst)]>,
1521 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001522 def SHR16mCL : I<0xD3, MRM5m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001523 "shr{w} {%cl, $dst|$dst, %CL}",
1524 [(store (srl (loadi16 addr:$dst), CL), addr:$dst)]>,
1525 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001526 def SHR32mCL : I<0xD3, MRM5m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001527 "shr{l} {%cl, $dst|$dst, %CL}",
1528 [(store (srl (loadi32 addr:$dst), CL), addr:$dst)]>,
1529 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001530 def SHR8mi : Ii8<0xC0, MRM5m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001531 "shr{b} {$src, $dst|$dst, $src}",
1532 [(store (srl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001533 def SHR16mi : Ii8<0xC1, MRM5m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001534 "shr{w} {$src, $dst|$dst, $src}",
1535 [(store (srl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1536 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001537 def SHR32mi : Ii8<0xC1, MRM5m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001538 "shr{l} {$src, $dst|$dst, $src}",
1539 [(store (srl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1540
1541 // Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001542 def SHR8m1 : I<0xD0, MRM5m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001543 "shr{b} $dst",
1544 [(store (srl (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001545 def SHR16m1 : I<0xD1, MRM5m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001546 "shr{w} $dst",
1547 [(store (srl (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001548 def SHR32m1 : I<0xD1, MRM5m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001549 "shr{l} $dst",
1550 [(store (srl (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1551}
1552
Evan Chengb783fa32007-07-19 01:14:50 +00001553def SAR8rCL : I<0xD2, MRM7r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001554 "sar{b} {%cl, $dst|$dst, %CL}",
1555 [(set GR8:$dst, (sra GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001556def SAR16rCL : I<0xD3, MRM7r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001557 "sar{w} {%cl, $dst|$dst, %CL}",
1558 [(set GR16:$dst, (sra GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001559def SAR32rCL : I<0xD3, MRM7r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001560 "sar{l} {%cl, $dst|$dst, %CL}",
1561 [(set GR32:$dst, (sra GR32:$src, CL))]>, Imp<[CL],[]>;
1562
Evan Chengb783fa32007-07-19 01:14:50 +00001563def SAR8ri : Ii8<0xC0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001564 "sar{b} {$src2, $dst|$dst, $src2}",
1565 [(set GR8:$dst, (sra GR8:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001566def SAR16ri : Ii8<0xC1, MRM7r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001567 "sar{w} {$src2, $dst|$dst, $src2}",
1568 [(set GR16:$dst, (sra GR16:$src1, (i8 imm:$src2)))]>,
1569 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001570def SAR32ri : Ii8<0xC1, MRM7r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001571 "sar{l} {$src2, $dst|$dst, $src2}",
1572 [(set GR32:$dst, (sra GR32:$src1, (i8 imm:$src2)))]>;
1573
1574// Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001575def SAR8r1 : I<0xD0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001576 "sar{b} $dst",
1577 [(set GR8:$dst, (sra GR8:$src1, (i8 1)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001578def SAR16r1 : I<0xD1, MRM7r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001579 "sar{w} $dst",
1580 [(set GR16:$dst, (sra GR16:$src1, (i8 1)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001581def SAR32r1 : I<0xD1, MRM7r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001582 "sar{l} $dst",
1583 [(set GR32:$dst, (sra GR32:$src1, (i8 1)))]>;
1584
1585let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001586 def SAR8mCL : I<0xD2, MRM7m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001587 "sar{b} {%cl, $dst|$dst, %CL}",
1588 [(store (sra (loadi8 addr:$dst), CL), addr:$dst)]>,
1589 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001590 def SAR16mCL : I<0xD3, MRM7m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001591 "sar{w} {%cl, $dst|$dst, %CL}",
1592 [(store (sra (loadi16 addr:$dst), CL), addr:$dst)]>,
1593 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001594 def SAR32mCL : I<0xD3, MRM7m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001595 "sar{l} {%cl, $dst|$dst, %CL}",
1596 [(store (sra (loadi32 addr:$dst), CL), addr:$dst)]>,
1597 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001598 def SAR8mi : Ii8<0xC0, MRM7m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001599 "sar{b} {$src, $dst|$dst, $src}",
1600 [(store (sra (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001601 def SAR16mi : Ii8<0xC1, MRM7m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001602 "sar{w} {$src, $dst|$dst, $src}",
1603 [(store (sra (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1604 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001605 def SAR32mi : Ii8<0xC1, MRM7m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001606 "sar{l} {$src, $dst|$dst, $src}",
1607 [(store (sra (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1608
1609 // Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001610 def SAR8m1 : I<0xD0, MRM7m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001611 "sar{b} $dst",
1612 [(store (sra (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001613 def SAR16m1 : I<0xD1, MRM7m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001614 "sar{w} $dst",
1615 [(store (sra (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,
1616 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001617 def SAR32m1 : I<0xD1, MRM7m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001618 "sar{l} $dst",
1619 [(store (sra (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1620}
1621
1622// Rotate instructions
1623// FIXME: provide shorter instructions when imm8 == 1
Evan Chengb783fa32007-07-19 01:14:50 +00001624def ROL8rCL : I<0xD2, MRM0r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001625 "rol{b} {%cl, $dst|$dst, %CL}",
1626 [(set GR8:$dst, (rotl GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001627def ROL16rCL : I<0xD3, MRM0r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001628 "rol{w} {%cl, $dst|$dst, %CL}",
1629 [(set GR16:$dst, (rotl GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001630def ROL32rCL : I<0xD3, MRM0r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001631 "rol{l} {%cl, $dst|$dst, %CL}",
1632 [(set GR32:$dst, (rotl GR32:$src, CL))]>, Imp<[CL],[]>;
1633
Evan Chengb783fa32007-07-19 01:14:50 +00001634def ROL8ri : Ii8<0xC0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001635 "rol{b} {$src2, $dst|$dst, $src2}",
1636 [(set GR8:$dst, (rotl GR8:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001637def ROL16ri : Ii8<0xC1, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001638 "rol{w} {$src2, $dst|$dst, $src2}",
1639 [(set GR16:$dst, (rotl GR16:$src1, (i8 imm:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001640def ROL32ri : Ii8<0xC1, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001641 "rol{l} {$src2, $dst|$dst, $src2}",
1642 [(set GR32:$dst, (rotl GR32:$src1, (i8 imm:$src2)))]>;
1643
1644// Rotate by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001645def ROL8r1 : I<0xD0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001646 "rol{b} $dst",
1647 [(set GR8:$dst, (rotl GR8:$src1, (i8 1)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001648def ROL16r1 : I<0xD1, MRM0r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001649 "rol{w} $dst",
1650 [(set GR16:$dst, (rotl GR16:$src1, (i8 1)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001651def ROL32r1 : I<0xD1, MRM0r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001652 "rol{l} $dst",
1653 [(set GR32:$dst, (rotl GR32:$src1, (i8 1)))]>;
1654
1655let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001656 def ROL8mCL : I<0xD2, MRM0m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001657 "rol{b} {%cl, $dst|$dst, %CL}",
1658 [(store (rotl (loadi8 addr:$dst), CL), addr:$dst)]>,
1659 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001660 def ROL16mCL : I<0xD3, MRM0m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001661 "rol{w} {%cl, $dst|$dst, %CL}",
1662 [(store (rotl (loadi16 addr:$dst), CL), addr:$dst)]>,
1663 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001664 def ROL32mCL : I<0xD3, MRM0m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001665 "rol{l} {%cl, $dst|$dst, %CL}",
1666 [(store (rotl (loadi32 addr:$dst), CL), addr:$dst)]>,
1667 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001668 def ROL8mi : Ii8<0xC0, MRM0m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001669 "rol{b} {$src, $dst|$dst, $src}",
1670 [(store (rotl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001671 def ROL16mi : Ii8<0xC1, MRM0m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001672 "rol{w} {$src, $dst|$dst, $src}",
1673 [(store (rotl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1674 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001675 def ROL32mi : Ii8<0xC1, MRM0m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001676 "rol{l} {$src, $dst|$dst, $src}",
1677 [(store (rotl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1678
1679 // Rotate by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001680 def ROL8m1 : I<0xD0, MRM0m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001681 "rol{b} $dst",
1682 [(store (rotl (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001683 def ROL16m1 : I<0xD1, MRM0m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001684 "rol{w} $dst",
1685 [(store (rotl (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,
1686 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001687 def ROL32m1 : I<0xD1, MRM0m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001688 "rol{l} $dst",
1689 [(store (rotl (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1690}
1691
Evan Chengb783fa32007-07-19 01:14:50 +00001692def ROR8rCL : I<0xD2, MRM1r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001693 "ror{b} {%cl, $dst|$dst, %CL}",
1694 [(set GR8:$dst, (rotr GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001695def ROR16rCL : I<0xD3, MRM1r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001696 "ror{w} {%cl, $dst|$dst, %CL}",
1697 [(set GR16:$dst, (rotr GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001698def ROR32rCL : I<0xD3, MRM1r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001699 "ror{l} {%cl, $dst|$dst, %CL}",
1700 [(set GR32:$dst, (rotr GR32:$src, CL))]>, Imp<[CL],[]>;
1701
Evan Chengb783fa32007-07-19 01:14:50 +00001702def ROR8ri : Ii8<0xC0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001703 "ror{b} {$src2, $dst|$dst, $src2}",
1704 [(set GR8:$dst, (rotr GR8:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001705def ROR16ri : Ii8<0xC1, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001706 "ror{w} {$src2, $dst|$dst, $src2}",
1707 [(set GR16:$dst, (rotr GR16:$src1, (i8 imm:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001708def ROR32ri : Ii8<0xC1, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001709 "ror{l} {$src2, $dst|$dst, $src2}",
1710 [(set GR32:$dst, (rotr GR32:$src1, (i8 imm:$src2)))]>;
1711
1712// Rotate by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001713def ROR8r1 : I<0xD0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001714 "ror{b} $dst",
1715 [(set GR8:$dst, (rotr GR8:$src1, (i8 1)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001716def ROR16r1 : I<0xD1, MRM1r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001717 "ror{w} $dst",
1718 [(set GR16:$dst, (rotr GR16:$src1, (i8 1)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001719def ROR32r1 : I<0xD1, MRM1r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001720 "ror{l} $dst",
1721 [(set GR32:$dst, (rotr GR32:$src1, (i8 1)))]>;
1722
1723let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001724 def ROR8mCL : I<0xD2, MRM1m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001725 "ror{b} {%cl, $dst|$dst, %CL}",
1726 [(store (rotr (loadi8 addr:$dst), CL), addr:$dst)]>,
1727 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001728 def ROR16mCL : I<0xD3, MRM1m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001729 "ror{w} {%cl, $dst|$dst, %CL}",
1730 [(store (rotr (loadi16 addr:$dst), CL), addr:$dst)]>,
1731 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001732 def ROR32mCL : I<0xD3, MRM1m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001733 "ror{l} {%cl, $dst|$dst, %CL}",
1734 [(store (rotr (loadi32 addr:$dst), CL), addr:$dst)]>,
1735 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001736 def ROR8mi : Ii8<0xC0, MRM1m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001737 "ror{b} {$src, $dst|$dst, $src}",
1738 [(store (rotr (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001739 def ROR16mi : Ii8<0xC1, MRM1m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001740 "ror{w} {$src, $dst|$dst, $src}",
1741 [(store (rotr (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1742 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001743 def ROR32mi : Ii8<0xC1, MRM1m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001744 "ror{l} {$src, $dst|$dst, $src}",
1745 [(store (rotr (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1746
1747 // Rotate by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001748 def ROR8m1 : I<0xD0, MRM1m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001749 "ror{b} $dst",
1750 [(store (rotr (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001751 def ROR16m1 : I<0xD1, MRM1m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001752 "ror{w} $dst",
1753 [(store (rotr (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,
1754 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001755 def ROR32m1 : I<0xD1, MRM1m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001756 "ror{l} $dst",
1757 [(store (rotr (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1758}
1759
1760
1761
1762// Double shift instructions (generalizations of rotate)
Evan Chengb783fa32007-07-19 01:14:50 +00001763def SHLD32rrCL : I<0xA5, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001764 "shld{l} {%cl, $src2, $dst|$dst, $src2, %CL}",
1765 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2, CL))]>,
1766 Imp<[CL],[]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00001767def SHRD32rrCL : I<0xAD, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001768 "shrd{l} {%cl, $src2, $dst|$dst, $src2, %CL}",
1769 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2, CL))]>,
1770 Imp<[CL],[]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00001771def SHLD16rrCL : I<0xA5, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001772 "shld{w} {%cl, $src2, $dst|$dst, $src2, %CL}",
1773 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2, CL))]>,
1774 Imp<[CL],[]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001775def SHRD16rrCL : I<0xAD, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001776 "shrd{w} {%cl, $src2, $dst|$dst, $src2, %CL}",
1777 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2, CL))]>,
1778 Imp<[CL],[]>, TB, OpSize;
1779
1780let isCommutable = 1 in { // These instructions commute to each other.
1781def SHLD32rri8 : Ii8<0xA4, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001782 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001783 "shld{l} {$src3, $src2, $dst|$dst, $src2, $src3}",
1784 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2,
1785 (i8 imm:$src3)))]>,
1786 TB;
1787def SHRD32rri8 : Ii8<0xAC, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001788 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001789 "shrd{l} {$src3, $src2, $dst|$dst, $src2, $src3}",
1790 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2,
1791 (i8 imm:$src3)))]>,
1792 TB;
1793def SHLD16rri8 : Ii8<0xA4, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001794 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001795 "shld{w} {$src3, $src2, $dst|$dst, $src2, $src3}",
1796 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2,
1797 (i8 imm:$src3)))]>,
1798 TB, OpSize;
1799def SHRD16rri8 : Ii8<0xAC, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001800 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001801 "shrd{w} {$src3, $src2, $dst|$dst, $src2, $src3}",
1802 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2,
1803 (i8 imm:$src3)))]>,
1804 TB, OpSize;
1805}
1806
1807let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001808 def SHLD32mrCL : I<0xA5, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001809 "shld{l} {%cl, $src2, $dst|$dst, $src2, %CL}",
1810 [(store (X86shld (loadi32 addr:$dst), GR32:$src2, CL),
1811 addr:$dst)]>,
1812 Imp<[CL],[]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00001813 def SHRD32mrCL : I<0xAD, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001814 "shrd{l} {%cl, $src2, $dst|$dst, $src2, %CL}",
1815 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2, CL),
1816 addr:$dst)]>,
1817 Imp<[CL],[]>, TB;
1818 def SHLD32mri8 : Ii8<0xA4, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001819 (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001820 "shld{l} {$src3, $src2, $dst|$dst, $src2, $src3}",
1821 [(store (X86shld (loadi32 addr:$dst), GR32:$src2,
1822 (i8 imm:$src3)), addr:$dst)]>,
1823 TB;
1824 def SHRD32mri8 : Ii8<0xAC, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001825 (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001826 "shrd{l} {$src3, $src2, $dst|$dst, $src2, $src3}",
1827 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2,
1828 (i8 imm:$src3)), addr:$dst)]>,
1829 TB;
1830
Evan Chengb783fa32007-07-19 01:14:50 +00001831 def SHLD16mrCL : I<0xA5, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001832 "shld{w} {%cl, $src2, $dst|$dst, $src2, %CL}",
1833 [(store (X86shld (loadi16 addr:$dst), GR16:$src2, CL),
1834 addr:$dst)]>,
1835 Imp<[CL],[]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001836 def SHRD16mrCL : I<0xAD, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001837 "shrd{w} {%cl, $src2, $dst|$dst, $src2, %CL}",
1838 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2, CL),
1839 addr:$dst)]>,
1840 Imp<[CL],[]>, TB, OpSize;
1841 def SHLD16mri8 : Ii8<0xA4, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001842 (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001843 "shld{w} {$src3, $src2, $dst|$dst, $src2, $src3}",
1844 [(store (X86shld (loadi16 addr:$dst), GR16:$src2,
1845 (i8 imm:$src3)), addr:$dst)]>,
1846 TB, OpSize;
1847 def SHRD16mri8 : Ii8<0xAC, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001848 (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001849 "shrd{w} {$src3, $src2, $dst|$dst, $src2, $src3}",
1850 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2,
1851 (i8 imm:$src3)), addr:$dst)]>,
1852 TB, OpSize;
1853}
1854
1855
1856// Arithmetic.
1857let isCommutable = 1 in { // X = ADD Y, Z --> X = ADD Z, Y
Evan Chengb783fa32007-07-19 01:14:50 +00001858def ADD8rr : I<0x00, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001859 "add{b} {$src2, $dst|$dst, $src2}",
1860 [(set GR8:$dst, (add GR8:$src1, GR8:$src2))]>;
1861let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001862def ADD16rr : I<0x01, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001863 "add{w} {$src2, $dst|$dst, $src2}",
1864 [(set GR16:$dst, (add GR16:$src1, GR16:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001865def ADD32rr : I<0x01, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001866 "add{l} {$src2, $dst|$dst, $src2}",
1867 [(set GR32:$dst, (add GR32:$src1, GR32:$src2))]>;
1868} // end isConvertibleToThreeAddress
1869} // end isCommutable
Evan Chengb783fa32007-07-19 01:14:50 +00001870def ADD8rm : I<0x02, MRMSrcMem, (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001871 "add{b} {$src2, $dst|$dst, $src2}",
1872 [(set GR8:$dst, (add GR8:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001873def ADD16rm : I<0x03, MRMSrcMem, (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001874 "add{w} {$src2, $dst|$dst, $src2}",
1875 [(set GR16:$dst, (add GR16:$src1, (load addr:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001876def ADD32rm : I<0x03, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001877 "add{l} {$src2, $dst|$dst, $src2}",
1878 [(set GR32:$dst, (add GR32:$src1, (load addr:$src2)))]>;
1879
Evan Chengb783fa32007-07-19 01:14:50 +00001880def ADD8ri : Ii8<0x80, MRM0r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001881 "add{b} {$src2, $dst|$dst, $src2}",
1882 [(set GR8:$dst, (add GR8:$src1, imm:$src2))]>;
1883
1884let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001885def ADD16ri : Ii16<0x81, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001886 "add{w} {$src2, $dst|$dst, $src2}",
1887 [(set GR16:$dst, (add GR16:$src1, imm:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001888def ADD32ri : Ii32<0x81, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001889 "add{l} {$src2, $dst|$dst, $src2}",
1890 [(set GR32:$dst, (add GR32:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001891def ADD16ri8 : Ii8<0x83, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001892 "add{w} {$src2, $dst|$dst, $src2}",
1893 [(set GR16:$dst, (add GR16:$src1, i16immSExt8:$src2))]>,
1894 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001895def ADD32ri8 : Ii8<0x83, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001896 "add{l} {$src2, $dst|$dst, $src2}",
1897 [(set GR32:$dst, (add GR32:$src1, i32immSExt8:$src2))]>;
1898}
1899
1900let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001901 def ADD8mr : I<0x00, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001902 "add{b} {$src2, $dst|$dst, $src2}",
1903 [(store (add (load addr:$dst), GR8:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001904 def ADD16mr : I<0x01, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001905 "add{w} {$src2, $dst|$dst, $src2}",
1906 [(store (add (load addr:$dst), GR16:$src2), addr:$dst)]>,
1907 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001908 def ADD32mr : I<0x01, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001909 "add{l} {$src2, $dst|$dst, $src2}",
1910 [(store (add (load addr:$dst), GR32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001911 def ADD8mi : Ii8<0x80, MRM0m, (outs), (ins i8mem :$dst, i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001912 "add{b} {$src2, $dst|$dst, $src2}",
1913 [(store (add (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001914 def ADD16mi : Ii16<0x81, MRM0m, (outs), (ins i16mem:$dst, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001915 "add{w} {$src2, $dst|$dst, $src2}",
1916 [(store (add (loadi16 addr:$dst), imm:$src2), addr:$dst)]>,
1917 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001918 def ADD32mi : Ii32<0x81, MRM0m, (outs), (ins i32mem:$dst, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001919 "add{l} {$src2, $dst|$dst, $src2}",
1920 [(store (add (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001921 def ADD16mi8 : Ii8<0x83, MRM0m, (outs), (ins i16mem:$dst, i16i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001922 "add{w} {$src2, $dst|$dst, $src2}",
1923 [(store (add (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>,
1924 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001925 def ADD32mi8 : Ii8<0x83, MRM0m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001926 "add{l} {$src2, $dst|$dst, $src2}",
1927 [(store (add (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
1928}
1929
1930let isCommutable = 1 in { // X = ADC Y, Z --> X = ADC Z, Y
Evan Chengb783fa32007-07-19 01:14:50 +00001931def ADC32rr : I<0x11, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001932 "adc{l} {$src2, $dst|$dst, $src2}",
1933 [(set GR32:$dst, (adde GR32:$src1, GR32:$src2))]>;
1934}
Evan Chengb783fa32007-07-19 01:14:50 +00001935def ADC32rm : I<0x13, MRMSrcMem , (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001936 "adc{l} {$src2, $dst|$dst, $src2}",
1937 [(set GR32:$dst, (adde GR32:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001938def ADC32ri : Ii32<0x81, MRM2r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001939 "adc{l} {$src2, $dst|$dst, $src2}",
1940 [(set GR32:$dst, (adde GR32:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001941def ADC32ri8 : Ii8<0x83, MRM2r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001942 "adc{l} {$src2, $dst|$dst, $src2}",
1943 [(set GR32:$dst, (adde GR32:$src1, i32immSExt8:$src2))]>;
1944
1945let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001946 def ADC32mr : I<0x11, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001947 "adc{l} {$src2, $dst|$dst, $src2}",
1948 [(store (adde (load addr:$dst), GR32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001949 def ADC32mi : Ii32<0x81, MRM2m, (outs), (ins i32mem:$dst, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001950 "adc{l} {$src2, $dst|$dst, $src2}",
1951 [(store (adde (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001952 def ADC32mi8 : Ii8<0x83, MRM2m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001953 "adc{l} {$src2, $dst|$dst, $src2}",
1954 [(store (adde (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
1955}
1956
Evan Chengb783fa32007-07-19 01:14:50 +00001957def SUB8rr : I<0x28, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001958 "sub{b} {$src2, $dst|$dst, $src2}",
1959 [(set GR8:$dst, (sub GR8:$src1, GR8:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001960def SUB16rr : I<0x29, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001961 "sub{w} {$src2, $dst|$dst, $src2}",
1962 [(set GR16:$dst, (sub GR16:$src1, GR16:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001963def SUB32rr : I<0x29, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001964 "sub{l} {$src2, $dst|$dst, $src2}",
1965 [(set GR32:$dst, (sub GR32:$src1, GR32:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001966def SUB8rm : I<0x2A, MRMSrcMem, (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001967 "sub{b} {$src2, $dst|$dst, $src2}",
1968 [(set GR8:$dst, (sub GR8:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001969def SUB16rm : I<0x2B, MRMSrcMem, (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001970 "sub{w} {$src2, $dst|$dst, $src2}",
1971 [(set GR16:$dst, (sub GR16:$src1, (load addr:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001972def SUB32rm : I<0x2B, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001973 "sub{l} {$src2, $dst|$dst, $src2}",
1974 [(set GR32:$dst, (sub GR32:$src1, (load addr:$src2)))]>;
1975
Evan Chengb783fa32007-07-19 01:14:50 +00001976def SUB8ri : Ii8 <0x80, MRM5r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001977 "sub{b} {$src2, $dst|$dst, $src2}",
1978 [(set GR8:$dst, (sub GR8:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001979def SUB16ri : Ii16<0x81, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001980 "sub{w} {$src2, $dst|$dst, $src2}",
1981 [(set GR16:$dst, (sub GR16:$src1, imm:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001982def SUB32ri : Ii32<0x81, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001983 "sub{l} {$src2, $dst|$dst, $src2}",
1984 [(set GR32:$dst, (sub GR32:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001985def SUB16ri8 : Ii8<0x83, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001986 "sub{w} {$src2, $dst|$dst, $src2}",
1987 [(set GR16:$dst, (sub GR16:$src1, i16immSExt8:$src2))]>,
1988 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001989def SUB32ri8 : Ii8<0x83, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001990 "sub{l} {$src2, $dst|$dst, $src2}",
1991 [(set GR32:$dst, (sub GR32:$src1, i32immSExt8:$src2))]>;
1992let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001993 def SUB8mr : I<0x28, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001994 "sub{b} {$src2, $dst|$dst, $src2}",
1995 [(store (sub (load addr:$dst), GR8:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001996 def SUB16mr : I<0x29, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001997 "sub{w} {$src2, $dst|$dst, $src2}",
1998 [(store (sub (load addr:$dst), GR16:$src2), addr:$dst)]>,
1999 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002000 def SUB32mr : I<0x29, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002001 "sub{l} {$src2, $dst|$dst, $src2}",
2002 [(store (sub (load addr:$dst), GR32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002003 def SUB8mi : Ii8<0x80, MRM5m, (outs), (ins i8mem :$dst, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002004 "sub{b} {$src2, $dst|$dst, $src2}",
2005 [(store (sub (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002006 def SUB16mi : Ii16<0x81, MRM5m, (outs), (ins i16mem:$dst, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002007 "sub{w} {$src2, $dst|$dst, $src2}",
2008 [(store (sub (loadi16 addr:$dst), imm:$src2), addr:$dst)]>,
2009 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002010 def SUB32mi : Ii32<0x81, MRM5m, (outs), (ins i32mem:$dst, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002011 "sub{l} {$src2, $dst|$dst, $src2}",
2012 [(store (sub (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002013 def SUB16mi8 : Ii8<0x83, MRM5m, (outs), (ins i16mem:$dst, i16i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002014 "sub{w} {$src2, $dst|$dst, $src2}",
2015 [(store (sub (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>,
2016 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002017 def SUB32mi8 : Ii8<0x83, MRM5m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002018 "sub{l} {$src2, $dst|$dst, $src2}",
2019 [(store (sub (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
2020}
2021
Evan Chengb783fa32007-07-19 01:14:50 +00002022def SBB32rr : I<0x19, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002023 "sbb{l} {$src2, $dst|$dst, $src2}",
2024 [(set GR32:$dst, (sube GR32:$src1, GR32:$src2))]>;
2025
2026let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00002027 def SBB32mr : I<0x19, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002028 "sbb{l} {$src2, $dst|$dst, $src2}",
2029 [(store (sube (load addr:$dst), GR32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002030 def SBB8mi : Ii32<0x80, MRM3m, (outs), (ins i8mem:$dst, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002031 "sbb{b} {$src2, $dst|$dst, $src2}",
2032 [(store (sube (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002033 def SBB32mi : Ii32<0x81, MRM3m, (outs), (ins i32mem:$dst, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002034 "sbb{l} {$src2, $dst|$dst, $src2}",
2035 [(store (sube (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002036 def SBB32mi8 : Ii8<0x83, MRM3m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002037 "sbb{l} {$src2, $dst|$dst, $src2}",
2038 [(store (sube (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
2039}
Evan Chengb783fa32007-07-19 01:14:50 +00002040def SBB32rm : I<0x1B, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002041 "sbb{l} {$src2, $dst|$dst, $src2}",
2042 [(set GR32:$dst, (sube GR32:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002043def SBB32ri : Ii32<0x81, MRM3r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002044 "sbb{l} {$src2, $dst|$dst, $src2}",
2045 [(set GR32:$dst, (sube GR32:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002046def SBB32ri8 : Ii8<0x83, MRM3r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002047 "sbb{l} {$src2, $dst|$dst, $src2}",
2048 [(set GR32:$dst, (sube GR32:$src1, i32immSExt8:$src2))]>;
2049
2050let isCommutable = 1 in { // X = IMUL Y, Z --> X = IMUL Z, Y
Evan Chengb783fa32007-07-19 01:14:50 +00002051def IMUL16rr : I<0xAF, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002052 "imul{w} {$src2, $dst|$dst, $src2}",
2053 [(set GR16:$dst, (mul GR16:$src1, GR16:$src2))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002054def IMUL32rr : I<0xAF, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002055 "imul{l} {$src2, $dst|$dst, $src2}",
2056 [(set GR32:$dst, (mul GR32:$src1, GR32:$src2))]>, TB;
2057}
Evan Chengb783fa32007-07-19 01:14:50 +00002058def IMUL16rm : I<0xAF, MRMSrcMem, (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002059 "imul{w} {$src2, $dst|$dst, $src2}",
2060 [(set GR16:$dst, (mul GR16:$src1, (load addr:$src2)))]>,
2061 TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002062def IMUL32rm : I<0xAF, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002063 "imul{l} {$src2, $dst|$dst, $src2}",
2064 [(set GR32:$dst, (mul GR32:$src1, (load addr:$src2)))]>, TB;
2065
2066} // end Two Address instructions
2067
2068// Suprisingly enough, these are not two address instructions!
2069def IMUL16rri : Ii16<0x69, MRMSrcReg, // GR16 = GR16*I16
Evan Chengb783fa32007-07-19 01:14:50 +00002070 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002071 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
2072 [(set GR16:$dst, (mul GR16:$src1, imm:$src2))]>, OpSize;
2073def IMUL32rri : Ii32<0x69, MRMSrcReg, // GR32 = GR32*I32
Evan Chengb783fa32007-07-19 01:14:50 +00002074 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002075 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
2076 [(set GR32:$dst, (mul GR32:$src1, imm:$src2))]>;
2077def IMUL16rri8 : Ii8<0x6B, MRMSrcReg, // GR16 = GR16*I8
Evan Chengb783fa32007-07-19 01:14:50 +00002078 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002079 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
2080 [(set GR16:$dst, (mul GR16:$src1, i16immSExt8:$src2))]>,
2081 OpSize;
2082def IMUL32rri8 : Ii8<0x6B, MRMSrcReg, // GR32 = GR32*I8
Evan Chengb783fa32007-07-19 01:14:50 +00002083 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002084 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
2085 [(set GR32:$dst, (mul GR32:$src1, i32immSExt8:$src2))]>;
2086
2087def IMUL16rmi : Ii16<0x69, MRMSrcMem, // GR16 = [mem16]*I16
Evan Chengb783fa32007-07-19 01:14:50 +00002088 (outs GR16:$dst), (ins i16mem:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002089 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
2090 [(set GR16:$dst, (mul (load addr:$src1), imm:$src2))]>,
2091 OpSize;
2092def IMUL32rmi : Ii32<0x69, MRMSrcMem, // GR32 = [mem32]*I32
Evan Chengb783fa32007-07-19 01:14:50 +00002093 (outs GR32:$dst), (ins i32mem:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002094 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
2095 [(set GR32:$dst, (mul (load addr:$src1), imm:$src2))]>;
2096def IMUL16rmi8 : Ii8<0x6B, MRMSrcMem, // GR16 = [mem16]*I8
Evan Chengb783fa32007-07-19 01:14:50 +00002097 (outs GR16:$dst), (ins i16mem:$src1, i16i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002098 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
2099 [(set GR16:$dst, (mul (load addr:$src1), i16immSExt8:$src2))]>,
2100 OpSize;
2101def IMUL32rmi8 : Ii8<0x6B, MRMSrcMem, // GR32 = [mem32]*I8
Evan Chengb783fa32007-07-19 01:14:50 +00002102 (outs GR32:$dst), (ins i32mem:$src1, i32i8imm: $src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002103 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
2104 [(set GR32:$dst, (mul (load addr:$src1), i32immSExt8:$src2))]>;
2105
2106//===----------------------------------------------------------------------===//
2107// Test instructions are just like AND, except they don't generate a result.
2108//
2109let isCommutable = 1 in { // TEST X, Y --> TEST Y, X
Evan Chengb783fa32007-07-19 01:14:50 +00002110def TEST8rr : I<0x84, MRMDestReg, (outs), (ins GR8:$src1, GR8:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002111 "test{b} {$src2, $src1|$src1, $src2}",
2112 [(X86cmp (and GR8:$src1, GR8:$src2), 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002113def TEST16rr : I<0x85, MRMDestReg, (outs), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002114 "test{w} {$src2, $src1|$src1, $src2}",
2115 [(X86cmp (and GR16:$src1, GR16:$src2), 0)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002116def TEST32rr : I<0x85, MRMDestReg, (outs), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002117 "test{l} {$src2, $src1|$src1, $src2}",
2118 [(X86cmp (and GR32:$src1, GR32:$src2), 0)]>;
2119}
2120
Evan Chengb783fa32007-07-19 01:14:50 +00002121def TEST8rm : I<0x84, MRMSrcMem, (outs), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002122 "test{b} {$src2, $src1|$src1, $src2}",
2123 [(X86cmp (and GR8:$src1, (loadi8 addr:$src2)), 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002124def TEST16rm : I<0x85, MRMSrcMem, (outs), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002125 "test{w} {$src2, $src1|$src1, $src2}",
2126 [(X86cmp (and GR16:$src1, (loadi16 addr:$src2)), 0)]>,
2127 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002128def TEST32rm : I<0x85, MRMSrcMem, (outs), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002129 "test{l} {$src2, $src1|$src1, $src2}",
2130 [(X86cmp (and GR32:$src1, (loadi32 addr:$src2)), 0)]>;
2131
2132def TEST8ri : Ii8 <0xF6, MRM0r, // flags = GR8 & imm8
Evan Chengb783fa32007-07-19 01:14:50 +00002133 (outs), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002134 "test{b} {$src2, $src1|$src1, $src2}",
2135 [(X86cmp (and GR8:$src1, imm:$src2), 0)]>;
2136def TEST16ri : Ii16<0xF7, MRM0r, // flags = GR16 & imm16
Evan Chengb783fa32007-07-19 01:14:50 +00002137 (outs), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002138 "test{w} {$src2, $src1|$src1, $src2}",
2139 [(X86cmp (and GR16:$src1, imm:$src2), 0)]>, OpSize;
2140def TEST32ri : Ii32<0xF7, MRM0r, // flags = GR32 & imm32
Evan Chengb783fa32007-07-19 01:14:50 +00002141 (outs), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002142 "test{l} {$src2, $src1|$src1, $src2}",
2143 [(X86cmp (and GR32:$src1, imm:$src2), 0)]>;
2144
2145def TEST8mi : Ii8 <0xF6, MRM0m, // flags = [mem8] & imm8
Evan Chengb783fa32007-07-19 01:14:50 +00002146 (outs), (ins i8mem:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002147 "test{b} {$src2, $src1|$src1, $src2}",
2148 [(X86cmp (and (loadi8 addr:$src1), imm:$src2), 0)]>;
2149def TEST16mi : Ii16<0xF7, MRM0m, // flags = [mem16] & imm16
Evan Chengb783fa32007-07-19 01:14:50 +00002150 (outs), (ins i16mem:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002151 "test{w} {$src2, $src1|$src1, $src2}",
2152 [(X86cmp (and (loadi16 addr:$src1), imm:$src2), 0)]>,
2153 OpSize;
2154def TEST32mi : Ii32<0xF7, MRM0m, // flags = [mem32] & imm32
Evan Chengb783fa32007-07-19 01:14:50 +00002155 (outs), (ins i32mem:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002156 "test{l} {$src2, $src1|$src1, $src2}",
2157 [(X86cmp (and (loadi32 addr:$src1), imm:$src2), 0)]>;
2158
2159
2160// Condition code ops, incl. set if equal/not equal/...
Evan Chengb783fa32007-07-19 01:14:50 +00002161def SAHF : I<0x9E, RawFrm, (outs), (ins), "sahf", []>, Imp<[AH],[]>; // flags = AH
2162def LAHF : I<0x9F, RawFrm, (outs), (ins), "lahf", []>, Imp<[],[AH]>; // AH = flags
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002163
2164def SETEr : I<0x94, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002165 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002166 "sete $dst",
2167 [(set GR8:$dst, (X86setcc X86_COND_E))]>,
2168 TB; // GR8 = ==
2169def SETEm : I<0x94, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002170 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002171 "sete $dst",
2172 [(store (X86setcc X86_COND_E), addr:$dst)]>,
2173 TB; // [mem8] = ==
2174def SETNEr : I<0x95, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002175 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002176 "setne $dst",
2177 [(set GR8:$dst, (X86setcc X86_COND_NE))]>,
2178 TB; // GR8 = !=
2179def SETNEm : I<0x95, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002180 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002181 "setne $dst",
2182 [(store (X86setcc X86_COND_NE), addr:$dst)]>,
2183 TB; // [mem8] = !=
2184def SETLr : I<0x9C, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002185 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002186 "setl $dst",
2187 [(set GR8:$dst, (X86setcc X86_COND_L))]>,
2188 TB; // GR8 = < signed
2189def SETLm : I<0x9C, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002190 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002191 "setl $dst",
2192 [(store (X86setcc X86_COND_L), addr:$dst)]>,
2193 TB; // [mem8] = < signed
2194def SETGEr : I<0x9D, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002195 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002196 "setge $dst",
2197 [(set GR8:$dst, (X86setcc X86_COND_GE))]>,
2198 TB; // GR8 = >= signed
2199def SETGEm : I<0x9D, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002200 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002201 "setge $dst",
2202 [(store (X86setcc X86_COND_GE), addr:$dst)]>,
2203 TB; // [mem8] = >= signed
2204def SETLEr : I<0x9E, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002205 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002206 "setle $dst",
2207 [(set GR8:$dst, (X86setcc X86_COND_LE))]>,
2208 TB; // GR8 = <= signed
2209def SETLEm : I<0x9E, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002210 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002211 "setle $dst",
2212 [(store (X86setcc X86_COND_LE), addr:$dst)]>,
2213 TB; // [mem8] = <= signed
2214def SETGr : I<0x9F, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002215 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002216 "setg $dst",
2217 [(set GR8:$dst, (X86setcc X86_COND_G))]>,
2218 TB; // GR8 = > signed
2219def SETGm : I<0x9F, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002220 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002221 "setg $dst",
2222 [(store (X86setcc X86_COND_G), addr:$dst)]>,
2223 TB; // [mem8] = > signed
2224
2225def SETBr : I<0x92, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002226 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002227 "setb $dst",
2228 [(set GR8:$dst, (X86setcc X86_COND_B))]>,
2229 TB; // GR8 = < unsign
2230def SETBm : I<0x92, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002231 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002232 "setb $dst",
2233 [(store (X86setcc X86_COND_B), addr:$dst)]>,
2234 TB; // [mem8] = < unsign
2235def SETAEr : I<0x93, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002236 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002237 "setae $dst",
2238 [(set GR8:$dst, (X86setcc X86_COND_AE))]>,
2239 TB; // GR8 = >= unsign
2240def SETAEm : I<0x93, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002241 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002242 "setae $dst",
2243 [(store (X86setcc X86_COND_AE), addr:$dst)]>,
2244 TB; // [mem8] = >= unsign
2245def SETBEr : I<0x96, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002246 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002247 "setbe $dst",
2248 [(set GR8:$dst, (X86setcc X86_COND_BE))]>,
2249 TB; // GR8 = <= unsign
2250def SETBEm : I<0x96, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002251 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002252 "setbe $dst",
2253 [(store (X86setcc X86_COND_BE), addr:$dst)]>,
2254 TB; // [mem8] = <= unsign
2255def SETAr : I<0x97, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002256 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002257 "seta $dst",
2258 [(set GR8:$dst, (X86setcc X86_COND_A))]>,
2259 TB; // GR8 = > signed
2260def SETAm : I<0x97, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002261 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002262 "seta $dst",
2263 [(store (X86setcc X86_COND_A), addr:$dst)]>,
2264 TB; // [mem8] = > signed
2265
2266def SETSr : I<0x98, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002267 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002268 "sets $dst",
2269 [(set GR8:$dst, (X86setcc X86_COND_S))]>,
2270 TB; // GR8 = <sign bit>
2271def SETSm : I<0x98, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002272 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002273 "sets $dst",
2274 [(store (X86setcc X86_COND_S), addr:$dst)]>,
2275 TB; // [mem8] = <sign bit>
2276def SETNSr : I<0x99, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002277 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002278 "setns $dst",
2279 [(set GR8:$dst, (X86setcc X86_COND_NS))]>,
2280 TB; // GR8 = !<sign bit>
2281def SETNSm : I<0x99, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002282 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002283 "setns $dst",
2284 [(store (X86setcc X86_COND_NS), addr:$dst)]>,
2285 TB; // [mem8] = !<sign bit>
2286def SETPr : I<0x9A, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002287 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002288 "setp $dst",
2289 [(set GR8:$dst, (X86setcc X86_COND_P))]>,
2290 TB; // GR8 = parity
2291def SETPm : I<0x9A, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002292 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002293 "setp $dst",
2294 [(store (X86setcc X86_COND_P), addr:$dst)]>,
2295 TB; // [mem8] = parity
2296def SETNPr : I<0x9B, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002297 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002298 "setnp $dst",
2299 [(set GR8:$dst, (X86setcc X86_COND_NP))]>,
2300 TB; // GR8 = not parity
2301def SETNPm : I<0x9B, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002302 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002303 "setnp $dst",
2304 [(store (X86setcc X86_COND_NP), addr:$dst)]>,
2305 TB; // [mem8] = not parity
2306
2307// Integer comparisons
2308def CMP8rr : I<0x38, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00002309 (outs), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002310 "cmp{b} {$src2, $src1|$src1, $src2}",
2311 [(X86cmp GR8:$src1, GR8:$src2)]>;
2312def CMP16rr : I<0x39, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00002313 (outs), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002314 "cmp{w} {$src2, $src1|$src1, $src2}",
2315 [(X86cmp GR16:$src1, GR16:$src2)]>, OpSize;
2316def CMP32rr : I<0x39, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00002317 (outs), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002318 "cmp{l} {$src2, $src1|$src1, $src2}",
2319 [(X86cmp GR32:$src1, GR32:$src2)]>;
2320def CMP8mr : I<0x38, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002321 (outs), (ins i8mem :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002322 "cmp{b} {$src2, $src1|$src1, $src2}",
2323 [(X86cmp (loadi8 addr:$src1), GR8:$src2)]>;
2324def CMP16mr : I<0x39, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002325 (outs), (ins i16mem:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002326 "cmp{w} {$src2, $src1|$src1, $src2}",
2327 [(X86cmp (loadi16 addr:$src1), GR16:$src2)]>, OpSize;
2328def CMP32mr : I<0x39, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002329 (outs), (ins i32mem:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002330 "cmp{l} {$src2, $src1|$src1, $src2}",
2331 [(X86cmp (loadi32 addr:$src1), GR32:$src2)]>;
2332def CMP8rm : I<0x3A, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002333 (outs), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002334 "cmp{b} {$src2, $src1|$src1, $src2}",
2335 [(X86cmp GR8:$src1, (loadi8 addr:$src2))]>;
2336def CMP16rm : I<0x3B, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002337 (outs), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002338 "cmp{w} {$src2, $src1|$src1, $src2}",
2339 [(X86cmp GR16:$src1, (loadi16 addr:$src2))]>, OpSize;
2340def CMP32rm : I<0x3B, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002341 (outs), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002342 "cmp{l} {$src2, $src1|$src1, $src2}",
2343 [(X86cmp GR32:$src1, (loadi32 addr:$src2))]>;
2344def CMP8ri : Ii8<0x80, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002345 (outs), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002346 "cmp{b} {$src2, $src1|$src1, $src2}",
2347 [(X86cmp GR8:$src1, imm:$src2)]>;
2348def CMP16ri : Ii16<0x81, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002349 (outs), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002350 "cmp{w} {$src2, $src1|$src1, $src2}",
2351 [(X86cmp GR16:$src1, imm:$src2)]>, OpSize;
2352def CMP32ri : Ii32<0x81, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002353 (outs), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002354 "cmp{l} {$src2, $src1|$src1, $src2}",
2355 [(X86cmp GR32:$src1, imm:$src2)]>;
2356def CMP8mi : Ii8 <0x80, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002357 (outs), (ins i8mem :$src1, i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002358 "cmp{b} {$src2, $src1|$src1, $src2}",
2359 [(X86cmp (loadi8 addr:$src1), imm:$src2)]>;
2360def CMP16mi : Ii16<0x81, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002361 (outs), (ins i16mem:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002362 "cmp{w} {$src2, $src1|$src1, $src2}",
2363 [(X86cmp (loadi16 addr:$src1), imm:$src2)]>, OpSize;
2364def CMP32mi : Ii32<0x81, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002365 (outs), (ins i32mem:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002366 "cmp{l} {$src2, $src1|$src1, $src2}",
2367 [(X86cmp (loadi32 addr:$src1), imm:$src2)]>;
2368def CMP16ri8 : Ii8<0x83, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002369 (outs), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002370 "cmp{w} {$src2, $src1|$src1, $src2}",
2371 [(X86cmp GR16:$src1, i16immSExt8:$src2)]>, OpSize;
2372def CMP16mi8 : Ii8<0x83, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002373 (outs), (ins i16mem:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002374 "cmp{w} {$src2, $src1|$src1, $src2}",
2375 [(X86cmp (loadi16 addr:$src1), i16immSExt8:$src2)]>, OpSize;
2376def CMP32mi8 : Ii8<0x83, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002377 (outs), (ins i32mem:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002378 "cmp{l} {$src2, $src1|$src1, $src2}",
2379 [(X86cmp (loadi32 addr:$src1), i32immSExt8:$src2)]>;
2380def CMP32ri8 : Ii8<0x83, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002381 (outs), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002382 "cmp{l} {$src2, $src1|$src1, $src2}",
2383 [(X86cmp GR32:$src1, i32immSExt8:$src2)]>;
2384
2385// Sign/Zero extenders
Evan Chengb783fa32007-07-19 01:14:50 +00002386def MOVSX16rr8 : I<0xBE, MRMSrcReg, (outs GR16:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002387 "movs{bw|x} {$src, $dst|$dst, $src}",
2388 [(set GR16:$dst, (sext GR8:$src))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002389def MOVSX16rm8 : I<0xBE, MRMSrcMem, (outs GR16:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002390 "movs{bw|x} {$src, $dst|$dst, $src}",
2391 [(set GR16:$dst, (sextloadi16i8 addr:$src))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002392def MOVSX32rr8 : I<0xBE, MRMSrcReg, (outs GR32:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002393 "movs{bl|x} {$src, $dst|$dst, $src}",
2394 [(set GR32:$dst, (sext GR8:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002395def MOVSX32rm8 : I<0xBE, MRMSrcMem, (outs GR32:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002396 "movs{bl|x} {$src, $dst|$dst, $src}",
2397 [(set GR32:$dst, (sextloadi32i8 addr:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002398def MOVSX32rr16: I<0xBF, MRMSrcReg, (outs GR32:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002399 "movs{wl|x} {$src, $dst|$dst, $src}",
2400 [(set GR32:$dst, (sext GR16:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002401def MOVSX32rm16: I<0xBF, MRMSrcMem, (outs GR32:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002402 "movs{wl|x} {$src, $dst|$dst, $src}",
2403 [(set GR32:$dst, (sextloadi32i16 addr:$src))]>, TB;
2404
Evan Chengb783fa32007-07-19 01:14:50 +00002405def MOVZX16rr8 : I<0xB6, MRMSrcReg, (outs GR16:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002406 "movz{bw|x} {$src, $dst|$dst, $src}",
2407 [(set GR16:$dst, (zext GR8:$src))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002408def MOVZX16rm8 : I<0xB6, MRMSrcMem, (outs GR16:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002409 "movz{bw|x} {$src, $dst|$dst, $src}",
2410 [(set GR16:$dst, (zextloadi16i8 addr:$src))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002411def MOVZX32rr8 : I<0xB6, MRMSrcReg, (outs GR32:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002412 "movz{bl|x} {$src, $dst|$dst, $src}",
2413 [(set GR32:$dst, (zext GR8:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002414def MOVZX32rm8 : I<0xB6, MRMSrcMem, (outs GR32:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002415 "movz{bl|x} {$src, $dst|$dst, $src}",
2416 [(set GR32:$dst, (zextloadi32i8 addr:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002417def MOVZX32rr16: I<0xB7, MRMSrcReg, (outs GR32:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002418 "movz{wl|x} {$src, $dst|$dst, $src}",
2419 [(set GR32:$dst, (zext GR16:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002420def MOVZX32rm16: I<0xB7, MRMSrcMem, (outs GR32:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002421 "movz{wl|x} {$src, $dst|$dst, $src}",
2422 [(set GR32:$dst, (zextloadi32i16 addr:$src))]>, TB;
2423
Evan Chengb783fa32007-07-19 01:14:50 +00002424def CBW : I<0x98, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002425 "{cbtw|cbw}", []>, Imp<[AL],[AX]>, OpSize; // AX = signext(AL)
Evan Chengb783fa32007-07-19 01:14:50 +00002426def CWDE : I<0x98, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002427 "{cwtl|cwde}", []>, Imp<[AX],[EAX]>; // EAX = signext(AX)
2428
Evan Chengb783fa32007-07-19 01:14:50 +00002429def CWD : I<0x99, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002430 "{cwtd|cwd}", []>, Imp<[AX],[AX,DX]>, OpSize; // DX:AX = signext(AX)
Evan Chengb783fa32007-07-19 01:14:50 +00002431def CDQ : I<0x99, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002432 "{cltd|cdq}", []>, Imp<[EAX],[EAX,EDX]>; // EDX:EAX = signext(EAX)
2433
2434
2435//===----------------------------------------------------------------------===//
2436// Alias Instructions
2437//===----------------------------------------------------------------------===//
2438
2439// Alias instructions that map movr0 to xor.
2440// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengb783fa32007-07-19 01:14:50 +00002441def MOV8r0 : I<0x30, MRMInitReg, (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002442 "xor{b} $dst, $dst",
2443 [(set GR8:$dst, 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002444def MOV16r0 : I<0x31, MRMInitReg, (outs GR16:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002445 "xor{w} $dst, $dst",
2446 [(set GR16:$dst, 0)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002447def MOV32r0 : I<0x31, MRMInitReg, (outs GR32:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002448 "xor{l} $dst, $dst",
2449 [(set GR32:$dst, 0)]>;
2450
2451// Basic operations on GR16 / GR32 subclasses GR16_ and GR32_ which contains only
2452// those registers that have GR8 sub-registers (i.e. AX - DX, EAX - EDX).
Evan Chengb783fa32007-07-19 01:14:50 +00002453def MOV16to16_ : I<0x89, MRMDestReg, (outs GR16_:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002454 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002455def MOV32to32_ : I<0x89, MRMDestReg, (outs GR32_:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002456 "mov{l} {$src, $dst|$dst, $src}", []>;
2457
Evan Chengb783fa32007-07-19 01:14:50 +00002458def MOV16_rr : I<0x89, MRMDestReg, (outs GR16_:$dst), (ins GR16_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002459 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002460def MOV32_rr : I<0x89, MRMDestReg, (outs GR32_:$dst), (ins GR32_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002461 "mov{l} {$src, $dst|$dst, $src}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +00002462def MOV16_rm : I<0x8B, MRMSrcMem, (outs GR16_:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002463 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002464def MOV32_rm : I<0x8B, MRMSrcMem, (outs GR32_:$dst), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002465 "mov{l} {$src, $dst|$dst, $src}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +00002466def MOV16_mr : I<0x89, MRMDestMem, (outs), (ins i16mem:$dst, GR16_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002467 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002468def MOV32_mr : I<0x89, MRMDestMem, (outs), (ins i32mem:$dst, GR32_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002469 "mov{l} {$src, $dst|$dst, $src}", []>;
2470
2471//===----------------------------------------------------------------------===//
2472// Thread Local Storage Instructions
2473//
2474
Evan Chengb783fa32007-07-19 01:14:50 +00002475def TLS_addr : I<0, Pseudo, (outs GR32:$dst), (ins i32imm:$sym),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002476 "leal ${sym:mem}(,%ebx,1), $dst",
2477 [(set GR32:$dst, (X86tlsaddr tglobaltlsaddr:$sym))]>,
2478 Imp<[EBX],[]>;
2479
2480let AddedComplexity = 10 in
Evan Chengb783fa32007-07-19 01:14:50 +00002481def TLS_gs_rr : I<0, Pseudo, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002482 "movl %gs:($src), $dst",
2483 [(set GR32:$dst, (load (add X86TLStp, GR32:$src)))]>;
2484
2485let AddedComplexity = 15 in
Evan Chengb783fa32007-07-19 01:14:50 +00002486def TLS_gs_ri : I<0, Pseudo, (outs GR32:$dst), (ins i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002487 "movl %gs:${src:mem}, $dst",
2488 [(set GR32:$dst,
2489 (load (add X86TLStp, (X86Wrapper tglobaltlsaddr:$src))))]>;
2490
Evan Chengb783fa32007-07-19 01:14:50 +00002491def TLS_tp : I<0, Pseudo, (outs GR32:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002492 "movl %gs:0, $dst",
2493 [(set GR32:$dst, X86TLStp)]>;
2494
2495//===----------------------------------------------------------------------===//
2496// DWARF Pseudo Instructions
2497//
2498
Evan Chengb783fa32007-07-19 01:14:50 +00002499def DWARF_LOC : I<0, Pseudo, (outs),
2500 (ins i32imm:$line, i32imm:$col, i32imm:$file),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002501 "; .loc $file, $line, $col",
2502 [(dwarf_loc (i32 imm:$line), (i32 imm:$col),
2503 (i32 imm:$file))]>;
2504
2505//===----------------------------------------------------------------------===//
2506// EH Pseudo Instructions
2507//
2508let isTerminator = 1, isReturn = 1, isBarrier = 1,
Evan Cheng37e7c752007-07-21 00:34:19 +00002509 hasCtrlDep = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +00002510def EH_RETURN : I<0xC3, RawFrm, (outs), (ins GR32:$addr),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002511 "ret #eh_return, addr: $addr",
2512 [(X86ehret GR32:$addr)]>;
2513
2514}
2515
2516//===----------------------------------------------------------------------===//
2517// Non-Instruction Patterns
2518//===----------------------------------------------------------------------===//
2519
2520// ConstantPool GlobalAddress, ExternalSymbol, and JumpTable
2521def : Pat<(i32 (X86Wrapper tconstpool :$dst)), (MOV32ri tconstpool :$dst)>;
2522def : Pat<(i32 (X86Wrapper tjumptable :$dst)), (MOV32ri tjumptable :$dst)>;
2523def : Pat<(i32 (X86Wrapper tglobaltlsaddr:$dst)), (MOV32ri tglobaltlsaddr:$dst)>;
2524def : Pat<(i32 (X86Wrapper tglobaladdr :$dst)), (MOV32ri tglobaladdr :$dst)>;
2525def : Pat<(i32 (X86Wrapper texternalsym:$dst)), (MOV32ri texternalsym:$dst)>;
2526
2527def : Pat<(add GR32:$src1, (X86Wrapper tconstpool:$src2)),
2528 (ADD32ri GR32:$src1, tconstpool:$src2)>;
2529def : Pat<(add GR32:$src1, (X86Wrapper tjumptable:$src2)),
2530 (ADD32ri GR32:$src1, tjumptable:$src2)>;
2531def : Pat<(add GR32:$src1, (X86Wrapper tglobaladdr :$src2)),
2532 (ADD32ri GR32:$src1, tglobaladdr:$src2)>;
2533def : Pat<(add GR32:$src1, (X86Wrapper texternalsym:$src2)),
2534 (ADD32ri GR32:$src1, texternalsym:$src2)>;
2535
2536def : Pat<(store (i32 (X86Wrapper tglobaladdr:$src)), addr:$dst),
2537 (MOV32mi addr:$dst, tglobaladdr:$src)>;
2538def : Pat<(store (i32 (X86Wrapper texternalsym:$src)), addr:$dst),
2539 (MOV32mi addr:$dst, texternalsym:$src)>;
2540
2541// Calls
2542def : Pat<(X86tailcall GR32:$dst),
2543 (CALL32r GR32:$dst)>;
2544
2545def : Pat<(X86tailcall (i32 tglobaladdr:$dst)),
2546 (CALLpcrel32 tglobaladdr:$dst)>;
2547def : Pat<(X86tailcall (i32 texternalsym:$dst)),
2548 (CALLpcrel32 texternalsym:$dst)>;
2549
2550def : Pat<(X86call (i32 tglobaladdr:$dst)),
2551 (CALLpcrel32 tglobaladdr:$dst)>;
2552def : Pat<(X86call (i32 texternalsym:$dst)),
2553 (CALLpcrel32 texternalsym:$dst)>;
2554
2555// X86 specific add which produces a flag.
2556def : Pat<(addc GR32:$src1, GR32:$src2),
2557 (ADD32rr GR32:$src1, GR32:$src2)>;
2558def : Pat<(addc GR32:$src1, (load addr:$src2)),
2559 (ADD32rm GR32:$src1, addr:$src2)>;
2560def : Pat<(addc GR32:$src1, imm:$src2),
2561 (ADD32ri GR32:$src1, imm:$src2)>;
2562def : Pat<(addc GR32:$src1, i32immSExt8:$src2),
2563 (ADD32ri8 GR32:$src1, i32immSExt8:$src2)>;
2564
2565def : Pat<(subc GR32:$src1, GR32:$src2),
2566 (SUB32rr GR32:$src1, GR32:$src2)>;
2567def : Pat<(subc GR32:$src1, (load addr:$src2)),
2568 (SUB32rm GR32:$src1, addr:$src2)>;
2569def : Pat<(subc GR32:$src1, imm:$src2),
2570 (SUB32ri GR32:$src1, imm:$src2)>;
2571def : Pat<(subc GR32:$src1, i32immSExt8:$src2),
2572 (SUB32ri8 GR32:$src1, i32immSExt8:$src2)>;
2573
2574def : Pat<(truncstorei1 (i8 imm:$src), addr:$dst),
2575 (MOV8mi addr:$dst, imm:$src)>;
2576def : Pat<(truncstorei1 GR8:$src, addr:$dst),
2577 (MOV8mr addr:$dst, GR8:$src)>;
2578
2579// Comparisons.
2580
2581// TEST R,R is smaller than CMP R,0
2582def : Pat<(X86cmp GR8:$src1, 0),
2583 (TEST8rr GR8:$src1, GR8:$src1)>;
2584def : Pat<(X86cmp GR16:$src1, 0),
2585 (TEST16rr GR16:$src1, GR16:$src1)>;
2586def : Pat<(X86cmp GR32:$src1, 0),
2587 (TEST32rr GR32:$src1, GR32:$src1)>;
2588
2589// {s|z}extload bool -> {s|z}extload byte
2590def : Pat<(sextloadi16i1 addr:$src), (MOVSX16rm8 addr:$src)>;
2591def : Pat<(sextloadi32i1 addr:$src), (MOVSX32rm8 addr:$src)>;
2592def : Pat<(zextloadi8i1 addr:$src), (MOV8rm addr:$src)>;
2593def : Pat<(zextloadi16i1 addr:$src), (MOVZX16rm8 addr:$src)>;
2594def : Pat<(zextloadi32i1 addr:$src), (MOVZX32rm8 addr:$src)>;
2595
2596// extload bool -> extload byte
2597def : Pat<(extloadi8i1 addr:$src), (MOV8rm addr:$src)>;
2598def : Pat<(extloadi16i1 addr:$src), (MOVZX16rm8 addr:$src)>;
2599def : Pat<(extloadi32i1 addr:$src), (MOVZX32rm8 addr:$src)>;
2600def : Pat<(extloadi16i8 addr:$src), (MOVZX16rm8 addr:$src)>;
2601def : Pat<(extloadi32i8 addr:$src), (MOVZX32rm8 addr:$src)>;
2602def : Pat<(extloadi32i16 addr:$src), (MOVZX32rm16 addr:$src)>;
2603
2604// anyext -> zext
2605def : Pat<(i16 (anyext GR8 :$src)), (MOVZX16rr8 GR8 :$src)>;
2606def : Pat<(i32 (anyext GR8 :$src)), (MOVZX32rr8 GR8 :$src)>;
2607def : Pat<(i32 (anyext GR16:$src)), (MOVZX32rr16 GR16:$src)>;
2608def : Pat<(i16 (anyext (loadi8 addr:$src))), (MOVZX16rm8 addr:$src)>;
2609def : Pat<(i32 (anyext (loadi8 addr:$src))), (MOVZX32rm8 addr:$src)>;
2610def : Pat<(i32 (anyext (loadi16 addr:$src))), (MOVZX32rm16 addr:$src)>;
2611
2612//===----------------------------------------------------------------------===//
2613// Some peepholes
2614//===----------------------------------------------------------------------===//
2615
2616// (shl x, 1) ==> (add x, x)
2617def : Pat<(shl GR8 :$src1, (i8 1)), (ADD8rr GR8 :$src1, GR8 :$src1)>;
2618def : Pat<(shl GR16:$src1, (i8 1)), (ADD16rr GR16:$src1, GR16:$src1)>;
2619def : Pat<(shl GR32:$src1, (i8 1)), (ADD32rr GR32:$src1, GR32:$src1)>;
2620
2621// (or (x >> c) | (y << (32 - c))) ==> (shrd32 x, y, c)
2622def : Pat<(or (srl GR32:$src1, CL:$amt),
2623 (shl GR32:$src2, (sub 32, CL:$amt))),
2624 (SHRD32rrCL GR32:$src1, GR32:$src2)>;
2625
2626def : Pat<(store (or (srl (loadi32 addr:$dst), CL:$amt),
2627 (shl GR32:$src2, (sub 32, CL:$amt))), addr:$dst),
2628 (SHRD32mrCL addr:$dst, GR32:$src2)>;
2629
2630// (or (x << c) | (y >> (32 - c))) ==> (shld32 x, y, c)
2631def : Pat<(or (shl GR32:$src1, CL:$amt),
2632 (srl GR32:$src2, (sub 32, CL:$amt))),
2633 (SHLD32rrCL GR32:$src1, GR32:$src2)>;
2634
2635def : Pat<(store (or (shl (loadi32 addr:$dst), CL:$amt),
2636 (srl GR32:$src2, (sub 32, CL:$amt))), addr:$dst),
2637 (SHLD32mrCL addr:$dst, GR32:$src2)>;
2638
2639// (or (x >> c) | (y << (16 - c))) ==> (shrd16 x, y, c)
2640def : Pat<(or (srl GR16:$src1, CL:$amt),
2641 (shl GR16:$src2, (sub 16, CL:$amt))),
2642 (SHRD16rrCL GR16:$src1, GR16:$src2)>;
2643
2644def : Pat<(store (or (srl (loadi16 addr:$dst), CL:$amt),
2645 (shl GR16:$src2, (sub 16, CL:$amt))), addr:$dst),
2646 (SHRD16mrCL addr:$dst, GR16:$src2)>;
2647
2648// (or (x << c) | (y >> (16 - c))) ==> (shld16 x, y, c)
2649def : Pat<(or (shl GR16:$src1, CL:$amt),
2650 (srl GR16:$src2, (sub 16, CL:$amt))),
2651 (SHLD16rrCL GR16:$src1, GR16:$src2)>;
2652
2653def : Pat<(store (or (shl (loadi16 addr:$dst), CL:$amt),
2654 (srl GR16:$src2, (sub 16, CL:$amt))), addr:$dst),
2655 (SHLD16mrCL addr:$dst, GR16:$src2)>;
2656
2657
2658//===----------------------------------------------------------------------===//
2659// Floating Point Stack Support
2660//===----------------------------------------------------------------------===//
2661
2662include "X86InstrFPStack.td"
2663
2664//===----------------------------------------------------------------------===//
2665// MMX and XMM Packed Integer support (requires MMX, SSE, and SSE2)
2666//===----------------------------------------------------------------------===//
2667
2668include "X86InstrMMX.td"
2669
2670//===----------------------------------------------------------------------===//
2671// XMM Floating point support (requires SSE / SSE2)
2672//===----------------------------------------------------------------------===//
2673
2674include "X86InstrSSE.td"
2675
2676//===----------------------------------------------------------------------===//
2677// X86-64 Support
2678//===----------------------------------------------------------------------===//
2679
2680include "X86InstrX86-64.td"