blob: de292c9cad337daa05cf1b8ab01f429b9275cfd5 [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//===----------------------------------------------------------------------===//
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000156// X86 Instruction Predicate Definitions.
157def HasMMX : Predicate<"Subtarget->hasMMX()">;
158def HasSSE1 : Predicate<"Subtarget->hasSSE1()">;
159def HasSSE2 : Predicate<"Subtarget->hasSSE2()">;
160def HasSSE3 : Predicate<"Subtarget->hasSSE3()">;
161def HasSSSE3 : Predicate<"Subtarget->hasSSSE3()">;
162def FPStack : Predicate<"!Subtarget->hasSSE2()">;
163def In32BitMode : Predicate<"!Subtarget->is64Bit()">;
164def In64BitMode : Predicate<"Subtarget->is64Bit()">;
165def SmallCode : Predicate<"TM.getCodeModel() == CodeModel::Small">;
166def NotSmallCode : Predicate<"TM.getCodeModel() != CodeModel::Small">;
167def IsStatic : Predicate<"TM.getRelocationModel() == Reloc::Static">;
168
169//===----------------------------------------------------------------------===//
Evan Cheng86ab7d32007-07-31 08:04:03 +0000170// X86 Instruction Format Definitions.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000171//
172
Evan Cheng86ab7d32007-07-31 08:04:03 +0000173include "X86InstrFormats.td"
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000174
175//===----------------------------------------------------------------------===//
176// Pattern fragments...
177//
178
179// X86 specific condition code. These correspond to CondCode in
180// X86InstrInfo.h. They must be kept in synch.
181def X86_COND_A : PatLeaf<(i8 0)>;
182def X86_COND_AE : PatLeaf<(i8 1)>;
183def X86_COND_B : PatLeaf<(i8 2)>;
184def X86_COND_BE : PatLeaf<(i8 3)>;
185def X86_COND_E : PatLeaf<(i8 4)>;
186def X86_COND_G : PatLeaf<(i8 5)>;
187def X86_COND_GE : PatLeaf<(i8 6)>;
188def X86_COND_L : PatLeaf<(i8 7)>;
189def X86_COND_LE : PatLeaf<(i8 8)>;
190def X86_COND_NE : PatLeaf<(i8 9)>;
191def X86_COND_NO : PatLeaf<(i8 10)>;
192def X86_COND_NP : PatLeaf<(i8 11)>;
193def X86_COND_NS : PatLeaf<(i8 12)>;
194def X86_COND_O : PatLeaf<(i8 13)>;
195def X86_COND_P : PatLeaf<(i8 14)>;
196def X86_COND_S : PatLeaf<(i8 15)>;
197
198def i16immSExt8 : PatLeaf<(i16 imm), [{
199 // i16immSExt8 predicate - True if the 16-bit immediate fits in a 8-bit
200 // sign extended field.
201 return (int16_t)N->getValue() == (int8_t)N->getValue();
202}]>;
203
204def i32immSExt8 : PatLeaf<(i32 imm), [{
205 // i32immSExt8 predicate - True if the 32-bit immediate fits in a 8-bit
206 // sign extended field.
207 return (int32_t)N->getValue() == (int8_t)N->getValue();
208}]>;
209
210// Helper fragments for loads.
211def loadi8 : PatFrag<(ops node:$ptr), (i8 (load node:$ptr))>;
212def loadi16 : PatFrag<(ops node:$ptr), (i16 (load node:$ptr))>;
213def loadi32 : PatFrag<(ops node:$ptr), (i32 (load node:$ptr))>;
214def loadi64 : PatFrag<(ops node:$ptr), (i64 (load node:$ptr))>;
215
216def loadf32 : PatFrag<(ops node:$ptr), (f32 (load node:$ptr))>;
217def loadf64 : PatFrag<(ops node:$ptr), (f64 (load node:$ptr))>;
218
219def sextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (sextloadi1 node:$ptr))>;
220def sextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (sextloadi1 node:$ptr))>;
221def sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextloadi8 node:$ptr))>;
222def sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextloadi8 node:$ptr))>;
223def sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextloadi16 node:$ptr))>;
224
225def zextloadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextloadi1 node:$ptr))>;
226def zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextloadi1 node:$ptr))>;
227def zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextloadi1 node:$ptr))>;
228def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextloadi8 node:$ptr))>;
229def zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextloadi8 node:$ptr))>;
230def zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextloadi16 node:$ptr))>;
231
232def extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extloadi1 node:$ptr))>;
233def extloadi16i1 : PatFrag<(ops node:$ptr), (i16 (extloadi1 node:$ptr))>;
234def extloadi32i1 : PatFrag<(ops node:$ptr), (i32 (extloadi1 node:$ptr))>;
235def extloadi16i8 : PatFrag<(ops node:$ptr), (i16 (extloadi8 node:$ptr))>;
236def extloadi32i8 : PatFrag<(ops node:$ptr), (i32 (extloadi8 node:$ptr))>;
237def extloadi32i16 : PatFrag<(ops node:$ptr), (i32 (extloadi16 node:$ptr))>;
238
239//===----------------------------------------------------------------------===//
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000240// Instruction list...
241//
242
243// ADJCALLSTACKDOWN/UP implicitly use/def ESP because they may be expanded into
244// a stack adjustment and the codegen must know that they may modify the stack
245// pointer before prolog-epilog rewriting occurs.
Evan Chengb783fa32007-07-19 01:14:50 +0000246def ADJCALLSTACKDOWN : I<0, Pseudo, (outs), (ins i32imm:$amt), "#ADJCALLSTACKDOWN",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000247 [(X86callseq_start imm:$amt)]>, Imp<[ESP],[ESP]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000248def ADJCALLSTACKUP : I<0, Pseudo, (outs), (ins i32imm:$amt1, i32imm:$amt2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000249 "#ADJCALLSTACKUP",
250 [(X86callseq_end imm:$amt1, imm:$amt2)]>,
251 Imp<[ESP],[ESP]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000252def IMPLICIT_USE : I<0, Pseudo, (outs), (ins variable_ops),
253 "#IMPLICIT_USE", []>;
254def IMPLICIT_DEF : I<0, Pseudo, (outs variable_ops), (ins),
255 "#IMPLICIT_DEF", []>;
256def IMPLICIT_DEF_GR8 : I<0, Pseudo, (outs GR8:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000257 "#IMPLICIT_DEF $dst",
258 [(set GR8:$dst, (undef))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000259def IMPLICIT_DEF_GR16 : I<0, Pseudo, (outs GR16:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000260 "#IMPLICIT_DEF $dst",
261 [(set GR16:$dst, (undef))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000262def IMPLICIT_DEF_GR32 : I<0, Pseudo, (outs GR32:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000263 "#IMPLICIT_DEF $dst",
264 [(set GR32:$dst, (undef))]>;
265
266// Nop
Evan Chengb783fa32007-07-19 01:14:50 +0000267def NOOP : I<0x90, RawFrm, (outs), (ins), "nop", []>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000268
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000269
270//===----------------------------------------------------------------------===//
271// Control Flow Instructions...
272//
273
274// Return instructions.
275let isTerminator = 1, isReturn = 1, isBarrier = 1,
Evan Cheng37e7c752007-07-21 00:34:19 +0000276 hasCtrlDep = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000277 def RET : I<0xC3, RawFrm, (outs), (ins), "ret", [(X86retflag 0)]>;
278 def RETI : Ii16<0xC2, RawFrm, (outs), (ins i16imm:$amt), "ret $amt",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000279 [(X86retflag imm:$amt)]>;
280}
281
282// All branches are RawFrm, Void, Branch, and Terminators
Evan Cheng37e7c752007-07-21 00:34:19 +0000283let isBranch = 1, isTerminator = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000284 class IBr<bits<8> opcode, dag ins, string asm, list<dag> pattern> :
285 I<opcode, RawFrm, (outs), ins, asm, pattern>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000286
287// Indirect branches
288let isBranch = 1, isBarrier = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000289 def JMP : IBr<0xE9, (ins brtarget:$dst), "jmp $dst", [(br bb:$dst)]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000290
Evan Cheng37e7c752007-07-21 00:34:19 +0000291let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000292 def JMP32r : I<0xFF, MRM4r, (outs), (ins GR32:$dst), "jmp{l} {*}$dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000293 [(brind GR32:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000294 def JMP32m : I<0xFF, MRM4m, (outs), (ins i32mem:$dst), "jmp{l} {*}$dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000295 [(brind (loadi32 addr:$dst))]>;
296}
297
298// Conditional branches
Evan Chengb783fa32007-07-19 01:14:50 +0000299def JE : IBr<0x84, (ins brtarget:$dst), "je $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000300 [(X86brcond bb:$dst, X86_COND_E)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000301def JNE : IBr<0x85, (ins brtarget:$dst), "jne $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000302 [(X86brcond bb:$dst, X86_COND_NE)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000303def JL : IBr<0x8C, (ins brtarget:$dst), "jl $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000304 [(X86brcond bb:$dst, X86_COND_L)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000305def JLE : IBr<0x8E, (ins brtarget:$dst), "jle $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000306 [(X86brcond bb:$dst, X86_COND_LE)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000307def JG : IBr<0x8F, (ins brtarget:$dst), "jg $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000308 [(X86brcond bb:$dst, X86_COND_G)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000309def JGE : IBr<0x8D, (ins brtarget:$dst), "jge $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000310 [(X86brcond bb:$dst, X86_COND_GE)]>, TB;
311
Evan Chengb783fa32007-07-19 01:14:50 +0000312def JB : IBr<0x82, (ins brtarget:$dst), "jb $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000313 [(X86brcond bb:$dst, X86_COND_B)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000314def JBE : IBr<0x86, (ins brtarget:$dst), "jbe $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000315 [(X86brcond bb:$dst, X86_COND_BE)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000316def JA : IBr<0x87, (ins brtarget:$dst), "ja $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000317 [(X86brcond bb:$dst, X86_COND_A)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000318def JAE : IBr<0x83, (ins brtarget:$dst), "jae $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000319 [(X86brcond bb:$dst, X86_COND_AE)]>, TB;
320
Evan Chengb783fa32007-07-19 01:14:50 +0000321def JS : IBr<0x88, (ins brtarget:$dst), "js $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000322 [(X86brcond bb:$dst, X86_COND_S)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000323def JNS : IBr<0x89, (ins brtarget:$dst), "jns $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000324 [(X86brcond bb:$dst, X86_COND_NS)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000325def JP : IBr<0x8A, (ins brtarget:$dst), "jp $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000326 [(X86brcond bb:$dst, X86_COND_P)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000327def JNP : IBr<0x8B, (ins brtarget:$dst), "jnp $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000328 [(X86brcond bb:$dst, X86_COND_NP)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000329def JO : IBr<0x80, (ins brtarget:$dst), "jo $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000330 [(X86brcond bb:$dst, X86_COND_O)]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000331def JNO : IBr<0x81, (ins brtarget:$dst), "jno $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000332 [(X86brcond bb:$dst, X86_COND_NO)]>, TB;
333
334//===----------------------------------------------------------------------===//
335// Call Instructions...
336//
Evan Cheng37e7c752007-07-21 00:34:19 +0000337let isCall = 1 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000338 // All calls clobber the non-callee saved registers...
339 let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
340 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
341 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7] in {
Evan Chengb783fa32007-07-19 01:14:50 +0000342 def CALLpcrel32 : I<0xE8, RawFrm, (outs), (ins i32imm:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000343 "call ${dst:call}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000344 def CALL32r : I<0xFF, MRM2r, (outs), (ins GR32:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000345 "call {*}$dst", [(X86call GR32:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000346 def CALL32m : I<0xFF, MRM2m, (outs), (ins i32mem:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000347 "call {*}$dst", []>;
348 }
349
350// Tail call stuff.
Evan Cheng37e7c752007-07-21 00:34:19 +0000351let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000352 def TAILJMPd : IBr<0xE9, (ins i32imm:$dst), "jmp ${dst:call} # TAIL CALL",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000353 []>;
Evan Cheng37e7c752007-07-21 00:34:19 +0000354let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000355 def TAILJMPr : I<0xFF, MRM4r, (outs), (ins GR32:$dst), "jmp {*}$dst # TAIL CALL",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000356 []>;
Evan Cheng37e7c752007-07-21 00:34:19 +0000357let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000358 def TAILJMPm : I<0xFF, MRM4m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000359 "jmp {*}$dst # TAIL CALL", []>;
360
361//===----------------------------------------------------------------------===//
362// Miscellaneous Instructions...
363//
364def LEAVE : I<0xC9, RawFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000365 (outs), (ins), "leave", []>, Imp<[EBP,ESP],[EBP,ESP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000366def POP32r : I<0x58, AddRegFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000367 (outs GR32:$reg), (ins), "pop{l} $reg", []>, Imp<[ESP],[ESP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000368
369def PUSH32r : I<0x50, AddRegFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000370 (outs), (ins GR32:$reg), "push{l} $reg", []>, Imp<[ESP],[ESP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000371
Evan Chengb783fa32007-07-19 01:14:50 +0000372def MovePCtoStack : I<0, Pseudo, (outs), (ins piclabel:$label),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000373 "call $label", []>;
374
375let isTwoAddress = 1 in // GR32 = bswap GR32
376 def BSWAP32r : I<0xC8, AddRegFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000377 (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000378 "bswap{l} $dst",
379 [(set GR32:$dst, (bswap GR32:$src))]>, TB;
380
Evan Chengb783fa32007-07-19 01:14:50 +0000381// FIXME: Model xchg* as two address instructions?
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000382def XCHG8rr : I<0x86, MRMDestReg, // xchg GR8, GR8
Evan Chengb783fa32007-07-19 01:14:50 +0000383 (outs), (ins GR8:$src1, GR8:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000384 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
385def XCHG16rr : I<0x87, MRMDestReg, // xchg GR16, GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000386 (outs), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000387 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
388def XCHG32rr : I<0x87, MRMDestReg, // xchg GR32, GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000389 (outs), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000390 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
391
392def XCHG8mr : I<0x86, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000393 (outs), (ins i8mem:$src1, GR8:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000394 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
395def XCHG16mr : I<0x87, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000396 (outs), (ins i16mem:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000397 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
398def XCHG32mr : I<0x87, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000399 (outs), (ins i32mem:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000400 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
401def XCHG8rm : I<0x86, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000402 (outs), (ins GR8:$src1, i8mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000403 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
404def XCHG16rm : I<0x87, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000405 (outs), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000406 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
407def XCHG32rm : I<0x87, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000408 (outs), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000409 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
410
411def LEA16r : I<0x8D, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000412 (outs GR16:$dst), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000413 "lea{w} {$src|$dst}, {$dst|$src}", []>, OpSize;
414def LEA32r : I<0x8D, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000415 (outs GR32:$dst), (ins lea32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000416 "lea{l} {$src|$dst}, {$dst|$src}",
417 [(set GR32:$dst, lea32addr:$src)]>, Requires<[In32BitMode]>;
418
Evan Chengb783fa32007-07-19 01:14:50 +0000419def REP_MOVSB : I<0xA4, RawFrm, (outs), (ins), "{rep;movsb|rep movsb}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000420 [(X86rep_movs i8)]>,
421 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP;
Evan Chengb783fa32007-07-19 01:14:50 +0000422def REP_MOVSW : I<0xA5, RawFrm, (outs), (ins), "{rep;movsw|rep movsw}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000423 [(X86rep_movs i16)]>,
424 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000425def REP_MOVSD : I<0xA5, RawFrm, (outs), (ins), "{rep;movsl|rep movsd}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000426 [(X86rep_movs i32)]>,
427 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP;
428
Evan Chengb783fa32007-07-19 01:14:50 +0000429def REP_STOSB : I<0xAA, RawFrm, (outs), (ins), "{rep;stosb|rep stosb}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000430 [(X86rep_stos i8)]>,
431 Imp<[AL,ECX,EDI], [ECX,EDI]>, REP;
Evan Chengb783fa32007-07-19 01:14:50 +0000432def REP_STOSW : I<0xAB, RawFrm, (outs), (ins), "{rep;stosw|rep stosw}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000433 [(X86rep_stos i16)]>,
434 Imp<[AX,ECX,EDI], [ECX,EDI]>, REP, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000435def REP_STOSD : I<0xAB, RawFrm, (outs), (ins), "{rep;stosl|rep stosd}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000436 [(X86rep_stos i32)]>,
437 Imp<[EAX,ECX,EDI], [ECX,EDI]>, REP;
438
Evan Chengb783fa32007-07-19 01:14:50 +0000439def RDTSC : I<0x31, RawFrm, (outs), (ins), "rdtsc", [(X86rdtsc)]>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000440 TB, Imp<[],[RAX,RDX]>;
441
442//===----------------------------------------------------------------------===//
443// Input/Output Instructions...
444//
Evan Chengb783fa32007-07-19 01:14:50 +0000445def IN8rr : I<0xEC, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000446 "in{b} {%dx, %al|%AL, %DX}",
447 []>, Imp<[DX], [AL]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000448def IN16rr : I<0xED, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000449 "in{w} {%dx, %ax|%AX, %DX}",
450 []>, Imp<[DX], [AX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000451def IN32rr : I<0xED, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000452 "in{l} {%dx, %eax|%EAX, %DX}",
453 []>, Imp<[DX],[EAX]>;
454
Evan Chengb783fa32007-07-19 01:14:50 +0000455def IN8ri : Ii8<0xE4, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000456 "in{b} {$port, %al|%AL, $port}",
457 []>,
458 Imp<[], [AL]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000459def IN16ri : Ii8<0xE5, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000460 "in{w} {$port, %ax|%AX, $port}",
461 []>,
462 Imp<[], [AX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000463def IN32ri : Ii8<0xE5, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000464 "in{l} {$port, %eax|%EAX, $port}",
465 []>,
466 Imp<[],[EAX]>;
467
Evan Chengb783fa32007-07-19 01:14:50 +0000468def OUT8rr : I<0xEE, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000469 "out{b} {%al, %dx|%DX, %AL}",
470 []>, Imp<[DX, AL], []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000471def OUT16rr : I<0xEF, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000472 "out{w} {%ax, %dx|%DX, %AX}",
473 []>, Imp<[DX, AX], []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000474def OUT32rr : I<0xEF, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000475 "out{l} {%eax, %dx|%DX, %EAX}",
476 []>, Imp<[DX, EAX], []>;
477
Evan Chengb783fa32007-07-19 01:14:50 +0000478def OUT8ir : Ii8<0xE6, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000479 "out{b} {%al, $port|$port, %AL}",
480 []>,
481 Imp<[AL], []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000482def OUT16ir : Ii8<0xE7, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000483 "out{w} {%ax, $port|$port, %AX}",
484 []>,
485 Imp<[AX], []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000486def OUT32ir : Ii8<0xE7, RawFrm, (outs), (ins i16i8imm:$port),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000487 "out{l} {%eax, $port|$port, %EAX}",
488 []>,
489 Imp<[EAX], []>;
490
491//===----------------------------------------------------------------------===//
492// Move Instructions...
493//
Evan Chengb783fa32007-07-19 01:14:50 +0000494def MOV8rr : I<0x88, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000495 "mov{b} {$src, $dst|$dst, $src}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000496def MOV16rr : I<0x89, MRMDestReg, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000497 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000498def MOV32rr : I<0x89, MRMDestReg, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000499 "mov{l} {$src, $dst|$dst, $src}", []>;
500let isReMaterializable = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000501def MOV8ri : Ii8 <0xB0, AddRegFrm, (outs GR8 :$dst), (ins i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000502 "mov{b} {$src, $dst|$dst, $src}",
503 [(set GR8:$dst, imm:$src)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000504def MOV16ri : Ii16<0xB8, AddRegFrm, (outs GR16:$dst), (ins i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000505 "mov{w} {$src, $dst|$dst, $src}",
506 [(set GR16:$dst, imm:$src)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000507def MOV32ri : Ii32<0xB8, AddRegFrm, (outs GR32:$dst), (ins i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000508 "mov{l} {$src, $dst|$dst, $src}",
509 [(set GR32:$dst, imm:$src)]>;
510}
Evan Chengb783fa32007-07-19 01:14:50 +0000511def MOV8mi : Ii8 <0xC6, MRM0m, (outs), (ins i8mem :$dst, i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000512 "mov{b} {$src, $dst|$dst, $src}",
513 [(store (i8 imm:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000514def MOV16mi : Ii16<0xC7, MRM0m, (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000515 "mov{w} {$src, $dst|$dst, $src}",
516 [(store (i16 imm:$src), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000517def MOV32mi : Ii32<0xC7, MRM0m, (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000518 "mov{l} {$src, $dst|$dst, $src}",
519 [(store (i32 imm:$src), addr:$dst)]>;
520
Evan Chengb783fa32007-07-19 01:14:50 +0000521def MOV8rm : I<0x8A, MRMSrcMem, (outs GR8 :$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000522 "mov{b} {$src, $dst|$dst, $src}",
523 [(set GR8:$dst, (load addr:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000524def MOV16rm : I<0x8B, MRMSrcMem, (outs GR16:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000525 "mov{w} {$src, $dst|$dst, $src}",
526 [(set GR16:$dst, (load addr:$src))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000527def MOV32rm : I<0x8B, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000528 "mov{l} {$src, $dst|$dst, $src}",
529 [(set GR32:$dst, (load addr:$src))]>;
530
Evan Chengb783fa32007-07-19 01:14:50 +0000531def MOV8mr : I<0x88, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000532 "mov{b} {$src, $dst|$dst, $src}",
533 [(store GR8:$src, addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000534def MOV16mr : I<0x89, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000535 "mov{w} {$src, $dst|$dst, $src}",
536 [(store GR16:$src, addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000537def MOV32mr : I<0x89, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000538 "mov{l} {$src, $dst|$dst, $src}",
539 [(store GR32:$src, addr:$dst)]>;
540
541//===----------------------------------------------------------------------===//
542// Fixed-Register Multiplication and Division Instructions...
543//
544
545// Extra precision multiplication
Evan Chengb783fa32007-07-19 01:14:50 +0000546def MUL8r : I<0xF6, MRM4r, (outs), (ins GR8:$src), "mul{b} $src",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000547 // FIXME: Used for 8-bit mul, ignore result upper 8 bits.
548 // This probably ought to be moved to a def : Pat<> if the
549 // syntax can be accepted.
550 [(set AL, (mul AL, GR8:$src))]>,
551 Imp<[AL],[AX]>; // AL,AH = AL*GR8
Evan Chengb783fa32007-07-19 01:14:50 +0000552def MUL16r : I<0xF7, MRM4r, (outs), (ins GR16:$src), "mul{w} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000553 Imp<[AX],[AX,DX]>, OpSize; // AX,DX = AX*GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000554def MUL32r : I<0xF7, MRM4r, (outs), (ins GR32:$src), "mul{l} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000555 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000556def MUL8m : I<0xF6, MRM4m, (outs), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000557 "mul{b} $src",
558 // FIXME: Used for 8-bit mul, ignore result upper 8 bits.
559 // This probably ought to be moved to a def : Pat<> if the
560 // syntax can be accepted.
561 [(set AL, (mul AL, (loadi8 addr:$src)))]>,
562 Imp<[AL],[AX]>; // AL,AH = AL*[mem8]
Evan Chengb783fa32007-07-19 01:14:50 +0000563def MUL16m : I<0xF7, MRM4m, (outs), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000564 "mul{w} $src", []>, Imp<[AX],[AX,DX]>,
565 OpSize; // AX,DX = AX*[mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000566def MUL32m : I<0xF7, MRM4m, (outs), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000567 "mul{l} $src", []>, Imp<[EAX],[EAX,EDX]>;// EAX,EDX = EAX*[mem32]
568
Evan Chengb783fa32007-07-19 01:14:50 +0000569def IMUL8r : I<0xF6, MRM5r, (outs), (ins GR8:$src), "imul{b} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000570 Imp<[AL],[AX]>; // AL,AH = AL*GR8
Evan Chengb783fa32007-07-19 01:14:50 +0000571def IMUL16r : I<0xF7, MRM5r, (outs), (ins GR16:$src), "imul{w} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000572 Imp<[AX],[AX,DX]>, OpSize; // AX,DX = AX*GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000573def IMUL32r : I<0xF7, MRM5r, (outs), (ins GR32:$src), "imul{l} $src", []>,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000574 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000575def IMUL8m : I<0xF6, MRM5m, (outs), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000576 "imul{b} $src", []>, Imp<[AL],[AX]>; // AL,AH = AL*[mem8]
Evan Chengb783fa32007-07-19 01:14:50 +0000577def IMUL16m : I<0xF7, MRM5m, (outs), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000578 "imul{w} $src", []>, Imp<[AX],[AX,DX]>,
579 OpSize; // AX,DX = AX*[mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000580def IMUL32m : I<0xF7, MRM5m, (outs), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000581 "imul{l} $src", []>,
582 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*[mem32]
583
584// unsigned division/remainder
Evan Chengb783fa32007-07-19 01:14:50 +0000585def DIV8r : I<0xF6, MRM6r, (outs), (ins GR8:$src), // AX/r8 = AL,AH
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000586 "div{b} $src", []>, Imp<[AX],[AX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000587def DIV16r : I<0xF7, MRM6r, (outs), (ins GR16:$src), // DX:AX/r16 = AX,DX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000588 "div{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000589def DIV32r : I<0xF7, MRM6r, (outs), (ins GR32:$src), // EDX:EAX/r32 = EAX,EDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000590 "div{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000591def DIV8m : I<0xF6, MRM6m, (outs), (ins i8mem:$src), // AX/[mem8] = AL,AH
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000592 "div{b} $src", []>, Imp<[AX],[AX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000593def DIV16m : I<0xF7, MRM6m, (outs), (ins i16mem:$src), // DX:AX/[mem16] = AX,DX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000594 "div{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000595def DIV32m : I<0xF7, MRM6m, (outs), (ins i32mem:$src), // EDX:EAX/[mem32] = EAX,EDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000596 "div{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
597
598// Signed division/remainder.
Evan Chengb783fa32007-07-19 01:14:50 +0000599def IDIV8r : I<0xF6, MRM7r, (outs), (ins GR8:$src), // AX/r8 = AL,AH
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000600 "idiv{b} $src", []>, Imp<[AX],[AX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000601def IDIV16r: I<0xF7, MRM7r, (outs), (ins GR16:$src), // DX:AX/r16 = AX,DX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000602 "idiv{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000603def IDIV32r: I<0xF7, MRM7r, (outs), (ins GR32:$src), // EDX:EAX/r32 = EAX,EDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000604 "idiv{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000605def IDIV8m : I<0xF6, MRM7m, (outs), (ins i8mem:$src), // AX/[mem8] = AL,AH
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000606 "idiv{b} $src", []>, Imp<[AX],[AX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000607def IDIV16m: I<0xF7, MRM7m, (outs), (ins i16mem:$src), // DX:AX/[mem16] = AX,DX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000608 "idiv{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000609def IDIV32m: I<0xF7, MRM7m, (outs), (ins i32mem:$src), // EDX:EAX/[mem32] = EAX,EDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000610 "idiv{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
611
612
613//===----------------------------------------------------------------------===//
614// Two address Instructions...
615//
616let isTwoAddress = 1 in {
617
618// Conditional moves
619def CMOVB16rr : I<0x42, MRMSrcReg, // if <u, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000620 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000621 "cmovb {$src2, $dst|$dst, $src2}",
622 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
623 X86_COND_B))]>,
624 TB, OpSize;
625def CMOVB16rm : I<0x42, MRMSrcMem, // if <u, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000626 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000627 "cmovb {$src2, $dst|$dst, $src2}",
628 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
629 X86_COND_B))]>,
630 TB, OpSize;
631def CMOVB32rr : I<0x42, MRMSrcReg, // if <u, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000632 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000633 "cmovb {$src2, $dst|$dst, $src2}",
634 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
635 X86_COND_B))]>,
636 TB;
637def CMOVB32rm : I<0x42, MRMSrcMem, // if <u, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000638 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000639 "cmovb {$src2, $dst|$dst, $src2}",
640 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
641 X86_COND_B))]>,
642 TB;
643
644def CMOVAE16rr: I<0x43, MRMSrcReg, // if >=u, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000645 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000646 "cmovae {$src2, $dst|$dst, $src2}",
647 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
648 X86_COND_AE))]>,
649 TB, OpSize;
650def CMOVAE16rm: I<0x43, MRMSrcMem, // if >=u, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000651 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000652 "cmovae {$src2, $dst|$dst, $src2}",
653 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
654 X86_COND_AE))]>,
655 TB, OpSize;
656def CMOVAE32rr: I<0x43, MRMSrcReg, // if >=u, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000657 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000658 "cmovae {$src2, $dst|$dst, $src2}",
659 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
660 X86_COND_AE))]>,
661 TB;
662def CMOVAE32rm: I<0x43, MRMSrcMem, // if >=u, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000663 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000664 "cmovae {$src2, $dst|$dst, $src2}",
665 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
666 X86_COND_AE))]>,
667 TB;
668
669def CMOVE16rr : I<0x44, MRMSrcReg, // if ==, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000670 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000671 "cmove {$src2, $dst|$dst, $src2}",
672 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
673 X86_COND_E))]>,
674 TB, OpSize;
675def CMOVE16rm : I<0x44, MRMSrcMem, // if ==, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000676 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000677 "cmove {$src2, $dst|$dst, $src2}",
678 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
679 X86_COND_E))]>,
680 TB, OpSize;
681def CMOVE32rr : I<0x44, MRMSrcReg, // if ==, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000682 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000683 "cmove {$src2, $dst|$dst, $src2}",
684 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
685 X86_COND_E))]>,
686 TB;
687def CMOVE32rm : I<0x44, MRMSrcMem, // if ==, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000688 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000689 "cmove {$src2, $dst|$dst, $src2}",
690 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
691 X86_COND_E))]>,
692 TB;
693
694def CMOVNE16rr: I<0x45, MRMSrcReg, // if !=, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000695 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000696 "cmovne {$src2, $dst|$dst, $src2}",
697 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
698 X86_COND_NE))]>,
699 TB, OpSize;
700def CMOVNE16rm: I<0x45, MRMSrcMem, // if !=, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000701 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000702 "cmovne {$src2, $dst|$dst, $src2}",
703 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
704 X86_COND_NE))]>,
705 TB, OpSize;
706def CMOVNE32rr: I<0x45, MRMSrcReg, // if !=, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000707 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000708 "cmovne {$src2, $dst|$dst, $src2}",
709 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
710 X86_COND_NE))]>,
711 TB;
712def CMOVNE32rm: I<0x45, MRMSrcMem, // if !=, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000713 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000714 "cmovne {$src2, $dst|$dst, $src2}",
715 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
716 X86_COND_NE))]>,
717 TB;
718
719def CMOVBE16rr: I<0x46, MRMSrcReg, // if <=u, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000720 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000721 "cmovbe {$src2, $dst|$dst, $src2}",
722 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
723 X86_COND_BE))]>,
724 TB, OpSize;
725def CMOVBE16rm: I<0x46, MRMSrcMem, // if <=u, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000726 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000727 "cmovbe {$src2, $dst|$dst, $src2}",
728 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
729 X86_COND_BE))]>,
730 TB, OpSize;
731def CMOVBE32rr: I<0x46, MRMSrcReg, // if <=u, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000732 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000733 "cmovbe {$src2, $dst|$dst, $src2}",
734 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
735 X86_COND_BE))]>,
736 TB;
737def CMOVBE32rm: I<0x46, MRMSrcMem, // if <=u, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000738 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000739 "cmovbe {$src2, $dst|$dst, $src2}",
740 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
741 X86_COND_BE))]>,
742 TB;
743
744def CMOVA16rr : I<0x47, MRMSrcReg, // if >u, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000745 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000746 "cmova {$src2, $dst|$dst, $src2}",
747 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
748 X86_COND_A))]>,
749 TB, OpSize;
750def CMOVA16rm : I<0x47, MRMSrcMem, // if >u, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000751 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000752 "cmova {$src2, $dst|$dst, $src2}",
753 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
754 X86_COND_A))]>,
755 TB, OpSize;
756def CMOVA32rr : I<0x47, MRMSrcReg, // if >u, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000757 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000758 "cmova {$src2, $dst|$dst, $src2}",
759 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
760 X86_COND_A))]>,
761 TB;
762def CMOVA32rm : I<0x47, MRMSrcMem, // if >u, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000763 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000764 "cmova {$src2, $dst|$dst, $src2}",
765 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
766 X86_COND_A))]>,
767 TB;
768
769def CMOVL16rr : I<0x4C, MRMSrcReg, // if <s, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000770 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000771 "cmovl {$src2, $dst|$dst, $src2}",
772 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
773 X86_COND_L))]>,
774 TB, OpSize;
775def CMOVL16rm : I<0x4C, MRMSrcMem, // if <s, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000776 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000777 "cmovl {$src2, $dst|$dst, $src2}",
778 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
779 X86_COND_L))]>,
780 TB, OpSize;
781def CMOVL32rr : I<0x4C, MRMSrcReg, // if <s, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000782 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000783 "cmovl {$src2, $dst|$dst, $src2}",
784 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
785 X86_COND_L))]>,
786 TB;
787def CMOVL32rm : I<0x4C, MRMSrcMem, // if <s, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000788 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000789 "cmovl {$src2, $dst|$dst, $src2}",
790 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
791 X86_COND_L))]>,
792 TB;
793
794def CMOVGE16rr: I<0x4D, MRMSrcReg, // if >=s, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000795 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000796 "cmovge {$src2, $dst|$dst, $src2}",
797 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
798 X86_COND_GE))]>,
799 TB, OpSize;
800def CMOVGE16rm: I<0x4D, MRMSrcMem, // if >=s, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000801 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000802 "cmovge {$src2, $dst|$dst, $src2}",
803 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
804 X86_COND_GE))]>,
805 TB, OpSize;
806def CMOVGE32rr: I<0x4D, MRMSrcReg, // if >=s, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000807 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000808 "cmovge {$src2, $dst|$dst, $src2}",
809 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
810 X86_COND_GE))]>,
811 TB;
812def CMOVGE32rm: I<0x4D, MRMSrcMem, // if >=s, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000813 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000814 "cmovge {$src2, $dst|$dst, $src2}",
815 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
816 X86_COND_GE))]>,
817 TB;
818
819def CMOVLE16rr: I<0x4E, MRMSrcReg, // if <=s, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000820 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000821 "cmovle {$src2, $dst|$dst, $src2}",
822 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
823 X86_COND_LE))]>,
824 TB, OpSize;
825def CMOVLE16rm: I<0x4E, MRMSrcMem, // if <=s, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000826 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000827 "cmovle {$src2, $dst|$dst, $src2}",
828 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
829 X86_COND_LE))]>,
830 TB, OpSize;
831def CMOVLE32rr: I<0x4E, MRMSrcReg, // if <=s, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000832 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000833 "cmovle {$src2, $dst|$dst, $src2}",
834 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
835 X86_COND_LE))]>,
836 TB;
837def CMOVLE32rm: I<0x4E, MRMSrcMem, // if <=s, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000838 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000839 "cmovle {$src2, $dst|$dst, $src2}",
840 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
841 X86_COND_LE))]>,
842 TB;
843
844def CMOVG16rr : I<0x4F, MRMSrcReg, // if >s, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000845 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000846 "cmovg {$src2, $dst|$dst, $src2}",
847 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
848 X86_COND_G))]>,
849 TB, OpSize;
850def CMOVG16rm : I<0x4F, MRMSrcMem, // if >s, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000851 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000852 "cmovg {$src2, $dst|$dst, $src2}",
853 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
854 X86_COND_G))]>,
855 TB, OpSize;
856def CMOVG32rr : I<0x4F, MRMSrcReg, // if >s, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000857 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000858 "cmovg {$src2, $dst|$dst, $src2}",
859 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
860 X86_COND_G))]>,
861 TB;
862def CMOVG32rm : I<0x4F, MRMSrcMem, // if >s, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000863 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000864 "cmovg {$src2, $dst|$dst, $src2}",
865 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
866 X86_COND_G))]>,
867 TB;
868
869def CMOVS16rr : I<0x48, MRMSrcReg, // if signed, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000870 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000871 "cmovs {$src2, $dst|$dst, $src2}",
872 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
873 X86_COND_S))]>,
874 TB, OpSize;
875def CMOVS16rm : I<0x48, MRMSrcMem, // if signed, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000876 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000877 "cmovs {$src2, $dst|$dst, $src2}",
878 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
879 X86_COND_S))]>,
880 TB, OpSize;
881def CMOVS32rr : I<0x48, MRMSrcReg, // if signed, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000882 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000883 "cmovs {$src2, $dst|$dst, $src2}",
884 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
885 X86_COND_S))]>,
886 TB;
887def CMOVS32rm : I<0x48, MRMSrcMem, // if signed, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000888 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000889 "cmovs {$src2, $dst|$dst, $src2}",
890 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
891 X86_COND_S))]>,
892 TB;
893
894def CMOVNS16rr: I<0x49, MRMSrcReg, // if !signed, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000895 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000896 "cmovns {$src2, $dst|$dst, $src2}",
897 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
898 X86_COND_NS))]>,
899 TB, OpSize;
900def CMOVNS16rm: I<0x49, MRMSrcMem, // if !signed, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000901 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000902 "cmovns {$src2, $dst|$dst, $src2}",
903 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
904 X86_COND_NS))]>,
905 TB, OpSize;
906def CMOVNS32rr: I<0x49, MRMSrcReg, // if !signed, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000907 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000908 "cmovns {$src2, $dst|$dst, $src2}",
909 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
910 X86_COND_NS))]>,
911 TB;
912def CMOVNS32rm: I<0x49, MRMSrcMem, // if !signed, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000913 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000914 "cmovns {$src2, $dst|$dst, $src2}",
915 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
916 X86_COND_NS))]>,
917 TB;
918
919def CMOVP16rr : I<0x4A, MRMSrcReg, // if parity, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000920 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000921 "cmovp {$src2, $dst|$dst, $src2}",
922 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
923 X86_COND_P))]>,
924 TB, OpSize;
925def CMOVP16rm : I<0x4A, MRMSrcMem, // if parity, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000926 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000927 "cmovp {$src2, $dst|$dst, $src2}",
928 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
929 X86_COND_P))]>,
930 TB, OpSize;
931def CMOVP32rr : I<0x4A, MRMSrcReg, // if parity, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000932 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000933 "cmovp {$src2, $dst|$dst, $src2}",
934 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
935 X86_COND_P))]>,
936 TB;
937def CMOVP32rm : I<0x4A, MRMSrcMem, // if parity, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000938 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000939 "cmovp {$src2, $dst|$dst, $src2}",
940 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
941 X86_COND_P))]>,
942 TB;
943
944def CMOVNP16rr : I<0x4B, MRMSrcReg, // if !parity, GR16 = GR16
Evan Chengb783fa32007-07-19 01:14:50 +0000945 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000946 "cmovnp {$src2, $dst|$dst, $src2}",
947 [(set GR16:$dst, (X86cmov GR16:$src1, GR16:$src2,
948 X86_COND_NP))]>,
949 TB, OpSize;
950def CMOVNP16rm : I<0x4B, MRMSrcMem, // if !parity, GR16 = [mem16]
Evan Chengb783fa32007-07-19 01:14:50 +0000951 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000952 "cmovnp {$src2, $dst|$dst, $src2}",
953 [(set GR16:$dst, (X86cmov GR16:$src1, (loadi16 addr:$src2),
954 X86_COND_NP))]>,
955 TB, OpSize;
956def CMOVNP32rr : I<0x4B, MRMSrcReg, // if !parity, GR32 = GR32
Evan Chengb783fa32007-07-19 01:14:50 +0000957 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000958 "cmovnp {$src2, $dst|$dst, $src2}",
959 [(set GR32:$dst, (X86cmov GR32:$src1, GR32:$src2,
960 X86_COND_NP))]>,
961 TB;
962def CMOVNP32rm : I<0x4B, MRMSrcMem, // if !parity, GR32 = [mem32]
Evan Chengb783fa32007-07-19 01:14:50 +0000963 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000964 "cmovnp {$src2, $dst|$dst, $src2}",
965 [(set GR32:$dst, (X86cmov GR32:$src1, (loadi32 addr:$src2),
966 X86_COND_NP))]>,
967 TB;
968
969
970// unary instructions
971let CodeSize = 2 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000972def NEG8r : I<0xF6, MRM3r, (outs GR8 :$dst), (ins GR8 :$src), "neg{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000973 [(set GR8:$dst, (ineg GR8:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000974def NEG16r : I<0xF7, MRM3r, (outs GR16:$dst), (ins GR16:$src), "neg{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000975 [(set GR16:$dst, (ineg GR16:$src))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000976def NEG32r : I<0xF7, MRM3r, (outs GR32:$dst), (ins GR32:$src), "neg{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000977 [(set GR32:$dst, (ineg GR32:$src))]>;
978let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000979 def NEG8m : I<0xF6, MRM3m, (outs), (ins i8mem :$dst), "neg{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000980 [(store (ineg (loadi8 addr:$dst)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000981 def NEG16m : I<0xF7, MRM3m, (outs), (ins i16mem:$dst), "neg{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000982 [(store (ineg (loadi16 addr:$dst)), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000983 def NEG32m : I<0xF7, MRM3m, (outs), (ins i32mem:$dst), "neg{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000984 [(store (ineg (loadi32 addr:$dst)), addr:$dst)]>;
985
986}
987
Evan Chengb783fa32007-07-19 01:14:50 +0000988def NOT8r : I<0xF6, MRM2r, (outs GR8 :$dst), (ins GR8 :$src), "not{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000989 [(set GR8:$dst, (not GR8:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000990def NOT16r : I<0xF7, MRM2r, (outs GR16:$dst), (ins GR16:$src), "not{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000991 [(set GR16:$dst, (not GR16:$src))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000992def NOT32r : I<0xF7, MRM2r, (outs GR32:$dst), (ins GR32:$src), "not{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000993 [(set GR32:$dst, (not GR32:$src))]>;
994let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000995 def NOT8m : I<0xF6, MRM2m, (outs), (ins i8mem :$dst), "not{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000996 [(store (not (loadi8 addr:$dst)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000997 def NOT16m : I<0xF7, MRM2m, (outs), (ins i16mem:$dst), "not{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000998 [(store (not (loadi16 addr:$dst)), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +0000999 def NOT32m : I<0xF7, MRM2m, (outs), (ins i32mem:$dst), "not{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001000 [(store (not (loadi32 addr:$dst)), addr:$dst)]>;
1001}
1002} // CodeSize
1003
1004// TODO: inc/dec is slow for P4, but fast for Pentium-M.
1005let CodeSize = 2 in
Evan Chengb783fa32007-07-19 01:14:50 +00001006def INC8r : I<0xFE, MRM0r, (outs GR8 :$dst), (ins GR8 :$src), "inc{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001007 [(set GR8:$dst, (add GR8:$src, 1))]>;
1008let isConvertibleToThreeAddress = 1, CodeSize = 1 in { // Can xform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001009def INC16r : I<0x40, AddRegFrm, (outs GR16:$dst), (ins GR16:$src), "inc{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001010 [(set GR16:$dst, (add GR16:$src, 1))]>,
1011 OpSize, Requires<[In32BitMode]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001012def INC32r : I<0x40, AddRegFrm, (outs GR32:$dst), (ins GR32:$src), "inc{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001013 [(set GR32:$dst, (add GR32:$src, 1))]>, Requires<[In32BitMode]>;
1014}
1015let isTwoAddress = 0, CodeSize = 2 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001016 def INC8m : I<0xFE, MRM0m, (outs), (ins i8mem :$dst), "inc{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001017 [(store (add (loadi8 addr:$dst), 1), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001018 def INC16m : I<0xFF, MRM0m, (outs), (ins i16mem:$dst), "inc{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001019 [(store (add (loadi16 addr:$dst), 1), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001020 def INC32m : I<0xFF, MRM0m, (outs), (ins i32mem:$dst), "inc{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001021 [(store (add (loadi32 addr:$dst), 1), addr:$dst)]>;
1022}
1023
1024let CodeSize = 2 in
Evan Chengb783fa32007-07-19 01:14:50 +00001025def DEC8r : I<0xFE, MRM1r, (outs GR8 :$dst), (ins GR8 :$src), "dec{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001026 [(set GR8:$dst, (add GR8:$src, -1))]>;
1027let isConvertibleToThreeAddress = 1, CodeSize = 1 in { // Can xform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001028def DEC16r : I<0x48, AddRegFrm, (outs GR16:$dst), (ins GR16:$src), "dec{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001029 [(set GR16:$dst, (add GR16:$src, -1))]>,
1030 OpSize, Requires<[In32BitMode]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001031def DEC32r : I<0x48, AddRegFrm, (outs GR32:$dst), (ins GR32:$src), "dec{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001032 [(set GR32:$dst, (add GR32:$src, -1))]>, Requires<[In32BitMode]>;
1033}
1034
1035let isTwoAddress = 0, CodeSize = 2 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001036 def DEC8m : I<0xFE, MRM1m, (outs), (ins i8mem :$dst), "dec{b} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001037 [(store (add (loadi8 addr:$dst), -1), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001038 def DEC16m : I<0xFF, MRM1m, (outs), (ins i16mem:$dst), "dec{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001039 [(store (add (loadi16 addr:$dst), -1), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001040 def DEC32m : I<0xFF, MRM1m, (outs), (ins i32mem:$dst), "dec{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001041 [(store (add (loadi32 addr:$dst), -1), addr:$dst)]>;
1042}
1043
1044// Logical operators...
1045let isCommutable = 1 in { // X = AND Y, Z --> X = AND Z, Y
1046def AND8rr : I<0x20, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001047 (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001048 "and{b} {$src2, $dst|$dst, $src2}",
1049 [(set GR8:$dst, (and GR8:$src1, GR8:$src2))]>;
1050def AND16rr : I<0x21, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001051 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001052 "and{w} {$src2, $dst|$dst, $src2}",
1053 [(set GR16:$dst, (and GR16:$src1, GR16:$src2))]>, OpSize;
1054def AND32rr : I<0x21, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001055 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001056 "and{l} {$src2, $dst|$dst, $src2}",
1057 [(set GR32:$dst, (and GR32:$src1, GR32:$src2))]>;
1058}
1059
1060def AND8rm : I<0x22, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001061 (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001062 "and{b} {$src2, $dst|$dst, $src2}",
1063 [(set GR8:$dst, (and GR8:$src1, (load addr:$src2)))]>;
1064def AND16rm : I<0x23, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001065 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001066 "and{w} {$src2, $dst|$dst, $src2}",
1067 [(set GR16:$dst, (and GR16:$src1, (load addr:$src2)))]>, OpSize;
1068def AND32rm : I<0x23, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001069 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001070 "and{l} {$src2, $dst|$dst, $src2}",
1071 [(set GR32:$dst, (and GR32:$src1, (load addr:$src2)))]>;
1072
1073def AND8ri : Ii8<0x80, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001074 (outs GR8 :$dst), (ins GR8 :$src1, i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001075 "and{b} {$src2, $dst|$dst, $src2}",
1076 [(set GR8:$dst, (and GR8:$src1, imm:$src2))]>;
1077def AND16ri : Ii16<0x81, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001078 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001079 "and{w} {$src2, $dst|$dst, $src2}",
1080 [(set GR16:$dst, (and GR16:$src1, imm:$src2))]>, OpSize;
1081def AND32ri : Ii32<0x81, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001082 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001083 "and{l} {$src2, $dst|$dst, $src2}",
1084 [(set GR32:$dst, (and GR32:$src1, imm:$src2))]>;
1085def AND16ri8 : Ii8<0x83, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001086 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001087 "and{w} {$src2, $dst|$dst, $src2}",
1088 [(set GR16:$dst, (and GR16:$src1, i16immSExt8:$src2))]>,
1089 OpSize;
1090def AND32ri8 : Ii8<0x83, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +00001091 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001092 "and{l} {$src2, $dst|$dst, $src2}",
1093 [(set GR32:$dst, (and GR32:$src1, i32immSExt8:$src2))]>;
1094
1095let isTwoAddress = 0 in {
1096 def AND8mr : I<0x20, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001097 (outs), (ins i8mem :$dst, GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001098 "and{b} {$src, $dst|$dst, $src}",
1099 [(store (and (load addr:$dst), GR8:$src), addr:$dst)]>;
1100 def AND16mr : I<0x21, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001101 (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001102 "and{w} {$src, $dst|$dst, $src}",
1103 [(store (and (load addr:$dst), GR16:$src), addr:$dst)]>,
1104 OpSize;
1105 def AND32mr : I<0x21, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001106 (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001107 "and{l} {$src, $dst|$dst, $src}",
1108 [(store (and (load addr:$dst), GR32:$src), addr:$dst)]>;
1109 def AND8mi : Ii8<0x80, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001110 (outs), (ins i8mem :$dst, i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001111 "and{b} {$src, $dst|$dst, $src}",
1112 [(store (and (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
1113 def AND16mi : Ii16<0x81, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001114 (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001115 "and{w} {$src, $dst|$dst, $src}",
1116 [(store (and (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
1117 OpSize;
1118 def AND32mi : Ii32<0x81, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001119 (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001120 "and{l} {$src, $dst|$dst, $src}",
1121 [(store (and (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
1122 def AND16mi8 : Ii8<0x83, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001123 (outs), (ins i16mem:$dst, i16i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001124 "and{w} {$src, $dst|$dst, $src}",
1125 [(store (and (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1126 OpSize;
1127 def AND32mi8 : Ii8<0x83, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +00001128 (outs), (ins i32mem:$dst, i32i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001129 "and{l} {$src, $dst|$dst, $src}",
1130 [(store (and (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
1131}
1132
1133
1134let isCommutable = 1 in { // X = OR Y, Z --> X = OR Z, Y
Evan Chengb783fa32007-07-19 01:14:50 +00001135def OR8rr : I<0x08, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001136 "or{b} {$src2, $dst|$dst, $src2}",
1137 [(set GR8:$dst, (or GR8:$src1, GR8:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001138def OR16rr : I<0x09, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001139 "or{w} {$src2, $dst|$dst, $src2}",
1140 [(set GR16:$dst, (or GR16:$src1, GR16:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001141def OR32rr : I<0x09, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001142 "or{l} {$src2, $dst|$dst, $src2}",
1143 [(set GR32:$dst, (or GR32:$src1, GR32:$src2))]>;
1144}
Evan Chengb783fa32007-07-19 01:14:50 +00001145def OR8rm : I<0x0A, MRMSrcMem , (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001146 "or{b} {$src2, $dst|$dst, $src2}",
1147 [(set GR8:$dst, (or GR8:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001148def OR16rm : I<0x0B, MRMSrcMem , (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001149 "or{w} {$src2, $dst|$dst, $src2}",
1150 [(set GR16:$dst, (or GR16:$src1, (load addr:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001151def OR32rm : I<0x0B, MRMSrcMem , (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001152 "or{l} {$src2, $dst|$dst, $src2}",
1153 [(set GR32:$dst, (or GR32:$src1, (load addr:$src2)))]>;
1154
Evan Chengb783fa32007-07-19 01:14:50 +00001155def OR8ri : Ii8 <0x80, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001156 "or{b} {$src2, $dst|$dst, $src2}",
1157 [(set GR8:$dst, (or GR8:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001158def OR16ri : Ii16<0x81, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001159 "or{w} {$src2, $dst|$dst, $src2}",
1160 [(set GR16:$dst, (or GR16:$src1, imm:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001161def OR32ri : Ii32<0x81, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001162 "or{l} {$src2, $dst|$dst, $src2}",
1163 [(set GR32:$dst, (or GR32:$src1, imm:$src2))]>;
1164
Evan Chengb783fa32007-07-19 01:14:50 +00001165def OR16ri8 : Ii8<0x83, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001166 "or{w} {$src2, $dst|$dst, $src2}",
1167 [(set GR16:$dst, (or GR16:$src1, i16immSExt8:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001168def OR32ri8 : Ii8<0x83, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001169 "or{l} {$src2, $dst|$dst, $src2}",
1170 [(set GR32:$dst, (or GR32:$src1, i32immSExt8:$src2))]>;
1171let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001172 def OR8mr : I<0x08, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001173 "or{b} {$src, $dst|$dst, $src}",
1174 [(store (or (load addr:$dst), GR8:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001175 def OR16mr : I<0x09, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001176 "or{w} {$src, $dst|$dst, $src}",
1177 [(store (or (load addr:$dst), GR16:$src), addr:$dst)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001178 def OR32mr : I<0x09, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001179 "or{l} {$src, $dst|$dst, $src}",
1180 [(store (or (load addr:$dst), GR32:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001181 def OR8mi : Ii8<0x80, MRM1m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001182 "or{b} {$src, $dst|$dst, $src}",
1183 [(store (or (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001184 def OR16mi : Ii16<0x81, MRM1m, (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001185 "or{w} {$src, $dst|$dst, $src}",
1186 [(store (or (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
1187 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001188 def OR32mi : Ii32<0x81, MRM1m, (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001189 "or{l} {$src, $dst|$dst, $src}",
1190 [(store (or (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001191 def OR16mi8 : Ii8<0x83, MRM1m, (outs), (ins i16mem:$dst, i16i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001192 "or{w} {$src, $dst|$dst, $src}",
1193 [(store (or (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1194 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001195 def OR32mi8 : Ii8<0x83, MRM1m, (outs), (ins i32mem:$dst, i32i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001196 "or{l} {$src, $dst|$dst, $src}",
1197 [(store (or (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
1198}
1199
1200
1201let isCommutable = 1 in { // X = XOR Y, Z --> X = XOR Z, Y
1202def XOR8rr : I<0x30, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001203 (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001204 "xor{b} {$src2, $dst|$dst, $src2}",
1205 [(set GR8:$dst, (xor GR8:$src1, GR8:$src2))]>;
1206def XOR16rr : I<0x31, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001207 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001208 "xor{w} {$src2, $dst|$dst, $src2}",
1209 [(set GR16:$dst, (xor GR16:$src1, GR16:$src2))]>, OpSize;
1210def XOR32rr : I<0x31, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001211 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001212 "xor{l} {$src2, $dst|$dst, $src2}",
1213 [(set GR32:$dst, (xor GR32:$src1, GR32:$src2))]>;
1214}
1215
1216def XOR8rm : I<0x32, MRMSrcMem ,
Evan Chengb783fa32007-07-19 01:14:50 +00001217 (outs GR8 :$dst), (ins GR8:$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001218 "xor{b} {$src2, $dst|$dst, $src2}",
1219 [(set GR8:$dst, (xor GR8:$src1, (load addr:$src2)))]>;
1220def XOR16rm : I<0x33, MRMSrcMem ,
Evan Chengb783fa32007-07-19 01:14:50 +00001221 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001222 "xor{w} {$src2, $dst|$dst, $src2}",
1223 [(set GR16:$dst, (xor GR16:$src1, (load addr:$src2)))]>, OpSize;
1224def XOR32rm : I<0x33, MRMSrcMem ,
Evan Chengb783fa32007-07-19 01:14:50 +00001225 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001226 "xor{l} {$src2, $dst|$dst, $src2}",
1227 [(set GR32:$dst, (xor GR32:$src1, (load addr:$src2)))]>;
1228
1229def XOR8ri : Ii8<0x80, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001230 (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001231 "xor{b} {$src2, $dst|$dst, $src2}",
1232 [(set GR8:$dst, (xor GR8:$src1, imm:$src2))]>;
1233def XOR16ri : Ii16<0x81, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001234 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001235 "xor{w} {$src2, $dst|$dst, $src2}",
1236 [(set GR16:$dst, (xor GR16:$src1, imm:$src2))]>, OpSize;
1237def XOR32ri : Ii32<0x81, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001238 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001239 "xor{l} {$src2, $dst|$dst, $src2}",
1240 [(set GR32:$dst, (xor GR32:$src1, imm:$src2))]>;
1241def XOR16ri8 : Ii8<0x83, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001242 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001243 "xor{w} {$src2, $dst|$dst, $src2}",
1244 [(set GR16:$dst, (xor GR16:$src1, i16immSExt8:$src2))]>,
1245 OpSize;
1246def XOR32ri8 : Ii8<0x83, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +00001247 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001248 "xor{l} {$src2, $dst|$dst, $src2}",
1249 [(set GR32:$dst, (xor GR32:$src1, i32immSExt8:$src2))]>;
1250let isTwoAddress = 0 in {
1251 def XOR8mr : I<0x30, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001252 (outs), (ins i8mem :$dst, GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001253 "xor{b} {$src, $dst|$dst, $src}",
1254 [(store (xor (load addr:$dst), GR8:$src), addr:$dst)]>;
1255 def XOR16mr : I<0x31, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001256 (outs), (ins i16mem:$dst, GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001257 "xor{w} {$src, $dst|$dst, $src}",
1258 [(store (xor (load addr:$dst), GR16:$src), addr:$dst)]>,
1259 OpSize;
1260 def XOR32mr : I<0x31, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001261 (outs), (ins i32mem:$dst, GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001262 "xor{l} {$src, $dst|$dst, $src}",
1263 [(store (xor (load addr:$dst), GR32:$src), addr:$dst)]>;
1264 def XOR8mi : Ii8<0x80, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001265 (outs), (ins i8mem :$dst, i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001266 "xor{b} {$src, $dst|$dst, $src}",
1267 [(store (xor (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
1268 def XOR16mi : Ii16<0x81, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001269 (outs), (ins i16mem:$dst, i16imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001270 "xor{w} {$src, $dst|$dst, $src}",
1271 [(store (xor (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
1272 OpSize;
1273 def XOR32mi : Ii32<0x81, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001274 (outs), (ins i32mem:$dst, i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001275 "xor{l} {$src, $dst|$dst, $src}",
1276 [(store (xor (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
1277 def XOR16mi8 : Ii8<0x83, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001278 (outs), (ins i16mem:$dst, i16i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001279 "xor{w} {$src, $dst|$dst, $src}",
1280 [(store (xor (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1281 OpSize;
1282 def XOR32mi8 : Ii8<0x83, MRM6m,
Evan Chengb783fa32007-07-19 01:14:50 +00001283 (outs), (ins i32mem:$dst, i32i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001284 "xor{l} {$src, $dst|$dst, $src}",
1285 [(store (xor (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
1286}
1287
1288// Shift instructions
Evan Chengb783fa32007-07-19 01:14:50 +00001289def SHL8rCL : I<0xD2, MRM4r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001290 "shl{b} {%cl, $dst|$dst, %CL}",
1291 [(set GR8:$dst, (shl GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001292def SHL16rCL : I<0xD3, MRM4r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001293 "shl{w} {%cl, $dst|$dst, %CL}",
1294 [(set GR16:$dst, (shl GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001295def SHL32rCL : I<0xD3, MRM4r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001296 "shl{l} {%cl, $dst|$dst, %CL}",
1297 [(set GR32:$dst, (shl GR32:$src, CL))]>, Imp<[CL],[]>;
1298
Evan Chengb783fa32007-07-19 01:14:50 +00001299def SHL8ri : Ii8<0xC0, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001300 "shl{b} {$src2, $dst|$dst, $src2}",
1301 [(set GR8:$dst, (shl GR8:$src1, (i8 imm:$src2)))]>;
1302let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001303def SHL16ri : Ii8<0xC1, MRM4r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001304 "shl{w} {$src2, $dst|$dst, $src2}",
1305 [(set GR16:$dst, (shl GR16:$src1, (i8 imm:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001306def SHL32ri : Ii8<0xC1, MRM4r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001307 "shl{l} {$src2, $dst|$dst, $src2}",
1308 [(set GR32:$dst, (shl GR32:$src1, (i8 imm:$src2)))]>;
1309}
1310
1311// Shift left by one. Not used because (add x, x) is slightly cheaper.
Evan Chengb783fa32007-07-19 01:14:50 +00001312def SHL8r1 : I<0xD0, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001313 "shl{b} $dst", []>;
Evan Chengb783fa32007-07-19 01:14:50 +00001314def SHL16r1 : I<0xD1, MRM4r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001315 "shl{w} $dst", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001316def SHL32r1 : I<0xD1, MRM4r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001317 "shl{l} $dst", []>;
1318
1319let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001320 def SHL8mCL : I<0xD2, MRM4m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001321 "shl{b} {%cl, $dst|$dst, %CL}",
1322 [(store (shl (loadi8 addr:$dst), CL), addr:$dst)]>,
1323 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001324 def SHL16mCL : I<0xD3, MRM4m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001325 "shl{w} {%cl, $dst|$dst, %CL}",
1326 [(store (shl (loadi16 addr:$dst), CL), addr:$dst)]>,
1327 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001328 def SHL32mCL : I<0xD3, MRM4m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001329 "shl{l} {%cl, $dst|$dst, %CL}",
1330 [(store (shl (loadi32 addr:$dst), CL), addr:$dst)]>,
1331 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001332 def SHL8mi : Ii8<0xC0, MRM4m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001333 "shl{b} {$src, $dst|$dst, $src}",
1334 [(store (shl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001335 def SHL16mi : Ii8<0xC1, MRM4m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001336 "shl{w} {$src, $dst|$dst, $src}",
1337 [(store (shl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1338 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001339 def SHL32mi : Ii8<0xC1, MRM4m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001340 "shl{l} {$src, $dst|$dst, $src}",
1341 [(store (shl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1342
1343 // Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001344 def SHL8m1 : I<0xD0, MRM4m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001345 "shl{b} $dst",
1346 [(store (shl (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001347 def SHL16m1 : I<0xD1, MRM4m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001348 "shl{w} $dst",
1349 [(store (shl (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,
1350 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001351 def SHL32m1 : I<0xD1, MRM4m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001352 "shl{l} $dst",
1353 [(store (shl (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1354}
1355
Evan Chengb783fa32007-07-19 01:14:50 +00001356def SHR8rCL : I<0xD2, MRM5r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001357 "shr{b} {%cl, $dst|$dst, %CL}",
1358 [(set GR8:$dst, (srl GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001359def SHR16rCL : I<0xD3, MRM5r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001360 "shr{w} {%cl, $dst|$dst, %CL}",
1361 [(set GR16:$dst, (srl GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001362def SHR32rCL : I<0xD3, MRM5r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001363 "shr{l} {%cl, $dst|$dst, %CL}",
1364 [(set GR32:$dst, (srl GR32:$src, CL))]>, Imp<[CL],[]>;
1365
Evan Chengb783fa32007-07-19 01:14:50 +00001366def SHR8ri : Ii8<0xC0, MRM5r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001367 "shr{b} {$src2, $dst|$dst, $src2}",
1368 [(set GR8:$dst, (srl GR8:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001369def SHR16ri : Ii8<0xC1, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001370 "shr{w} {$src2, $dst|$dst, $src2}",
1371 [(set GR16:$dst, (srl GR16:$src1, (i8 imm:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001372def SHR32ri : Ii8<0xC1, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001373 "shr{l} {$src2, $dst|$dst, $src2}",
1374 [(set GR32:$dst, (srl GR32:$src1, (i8 imm:$src2)))]>;
1375
1376// Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001377def SHR8r1 : I<0xD0, MRM5r, (outs GR8:$dst), (ins GR8:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001378 "shr{b} $dst",
1379 [(set GR8:$dst, (srl GR8:$src1, (i8 1)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001380def SHR16r1 : I<0xD1, MRM5r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001381 "shr{w} $dst",
1382 [(set GR16:$dst, (srl GR16:$src1, (i8 1)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001383def SHR32r1 : I<0xD1, MRM5r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001384 "shr{l} $dst",
1385 [(set GR32:$dst, (srl GR32:$src1, (i8 1)))]>;
1386
1387let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001388 def SHR8mCL : I<0xD2, MRM5m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001389 "shr{b} {%cl, $dst|$dst, %CL}",
1390 [(store (srl (loadi8 addr:$dst), CL), addr:$dst)]>,
1391 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001392 def SHR16mCL : I<0xD3, MRM5m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001393 "shr{w} {%cl, $dst|$dst, %CL}",
1394 [(store (srl (loadi16 addr:$dst), CL), addr:$dst)]>,
1395 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001396 def SHR32mCL : I<0xD3, MRM5m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001397 "shr{l} {%cl, $dst|$dst, %CL}",
1398 [(store (srl (loadi32 addr:$dst), CL), addr:$dst)]>,
1399 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001400 def SHR8mi : Ii8<0xC0, MRM5m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001401 "shr{b} {$src, $dst|$dst, $src}",
1402 [(store (srl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001403 def SHR16mi : Ii8<0xC1, MRM5m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001404 "shr{w} {$src, $dst|$dst, $src}",
1405 [(store (srl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1406 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001407 def SHR32mi : Ii8<0xC1, MRM5m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001408 "shr{l} {$src, $dst|$dst, $src}",
1409 [(store (srl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1410
1411 // Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001412 def SHR8m1 : I<0xD0, MRM5m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001413 "shr{b} $dst",
1414 [(store (srl (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001415 def SHR16m1 : I<0xD1, MRM5m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001416 "shr{w} $dst",
1417 [(store (srl (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001418 def SHR32m1 : I<0xD1, MRM5m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001419 "shr{l} $dst",
1420 [(store (srl (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1421}
1422
Evan Chengb783fa32007-07-19 01:14:50 +00001423def SAR8rCL : I<0xD2, MRM7r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001424 "sar{b} {%cl, $dst|$dst, %CL}",
1425 [(set GR8:$dst, (sra GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001426def SAR16rCL : I<0xD3, MRM7r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001427 "sar{w} {%cl, $dst|$dst, %CL}",
1428 [(set GR16:$dst, (sra GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001429def SAR32rCL : I<0xD3, MRM7r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001430 "sar{l} {%cl, $dst|$dst, %CL}",
1431 [(set GR32:$dst, (sra GR32:$src, CL))]>, Imp<[CL],[]>;
1432
Evan Chengb783fa32007-07-19 01:14:50 +00001433def SAR8ri : Ii8<0xC0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001434 "sar{b} {$src2, $dst|$dst, $src2}",
1435 [(set GR8:$dst, (sra GR8:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001436def SAR16ri : Ii8<0xC1, MRM7r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001437 "sar{w} {$src2, $dst|$dst, $src2}",
1438 [(set GR16:$dst, (sra GR16:$src1, (i8 imm:$src2)))]>,
1439 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001440def SAR32ri : Ii8<0xC1, MRM7r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001441 "sar{l} {$src2, $dst|$dst, $src2}",
1442 [(set GR32:$dst, (sra GR32:$src1, (i8 imm:$src2)))]>;
1443
1444// Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001445def SAR8r1 : I<0xD0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001446 "sar{b} $dst",
1447 [(set GR8:$dst, (sra GR8:$src1, (i8 1)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001448def SAR16r1 : I<0xD1, MRM7r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001449 "sar{w} $dst",
1450 [(set GR16:$dst, (sra GR16:$src1, (i8 1)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001451def SAR32r1 : I<0xD1, MRM7r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001452 "sar{l} $dst",
1453 [(set GR32:$dst, (sra GR32:$src1, (i8 1)))]>;
1454
1455let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001456 def SAR8mCL : I<0xD2, MRM7m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001457 "sar{b} {%cl, $dst|$dst, %CL}",
1458 [(store (sra (loadi8 addr:$dst), CL), addr:$dst)]>,
1459 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001460 def SAR16mCL : I<0xD3, MRM7m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001461 "sar{w} {%cl, $dst|$dst, %CL}",
1462 [(store (sra (loadi16 addr:$dst), CL), addr:$dst)]>,
1463 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001464 def SAR32mCL : I<0xD3, MRM7m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001465 "sar{l} {%cl, $dst|$dst, %CL}",
1466 [(store (sra (loadi32 addr:$dst), CL), addr:$dst)]>,
1467 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001468 def SAR8mi : Ii8<0xC0, MRM7m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001469 "sar{b} {$src, $dst|$dst, $src}",
1470 [(store (sra (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001471 def SAR16mi : Ii8<0xC1, MRM7m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001472 "sar{w} {$src, $dst|$dst, $src}",
1473 [(store (sra (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1474 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001475 def SAR32mi : Ii8<0xC1, MRM7m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001476 "sar{l} {$src, $dst|$dst, $src}",
1477 [(store (sra (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1478
1479 // Shift by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001480 def SAR8m1 : I<0xD0, MRM7m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001481 "sar{b} $dst",
1482 [(store (sra (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001483 def SAR16m1 : I<0xD1, MRM7m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001484 "sar{w} $dst",
1485 [(store (sra (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,
1486 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001487 def SAR32m1 : I<0xD1, MRM7m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001488 "sar{l} $dst",
1489 [(store (sra (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1490}
1491
1492// Rotate instructions
1493// FIXME: provide shorter instructions when imm8 == 1
Evan Chengb783fa32007-07-19 01:14:50 +00001494def ROL8rCL : I<0xD2, MRM0r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001495 "rol{b} {%cl, $dst|$dst, %CL}",
1496 [(set GR8:$dst, (rotl GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001497def ROL16rCL : I<0xD3, MRM0r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001498 "rol{w} {%cl, $dst|$dst, %CL}",
1499 [(set GR16:$dst, (rotl GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001500def ROL32rCL : I<0xD3, MRM0r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001501 "rol{l} {%cl, $dst|$dst, %CL}",
1502 [(set GR32:$dst, (rotl GR32:$src, CL))]>, Imp<[CL],[]>;
1503
Evan Chengb783fa32007-07-19 01:14:50 +00001504def ROL8ri : Ii8<0xC0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001505 "rol{b} {$src2, $dst|$dst, $src2}",
1506 [(set GR8:$dst, (rotl GR8:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001507def ROL16ri : Ii8<0xC1, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001508 "rol{w} {$src2, $dst|$dst, $src2}",
1509 [(set GR16:$dst, (rotl GR16:$src1, (i8 imm:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001510def ROL32ri : Ii8<0xC1, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001511 "rol{l} {$src2, $dst|$dst, $src2}",
1512 [(set GR32:$dst, (rotl GR32:$src1, (i8 imm:$src2)))]>;
1513
1514// Rotate by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001515def ROL8r1 : I<0xD0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001516 "rol{b} $dst",
1517 [(set GR8:$dst, (rotl GR8:$src1, (i8 1)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001518def ROL16r1 : I<0xD1, MRM0r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001519 "rol{w} $dst",
1520 [(set GR16:$dst, (rotl GR16:$src1, (i8 1)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001521def ROL32r1 : I<0xD1, MRM0r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001522 "rol{l} $dst",
1523 [(set GR32:$dst, (rotl GR32:$src1, (i8 1)))]>;
1524
1525let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001526 def ROL8mCL : I<0xD2, MRM0m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001527 "rol{b} {%cl, $dst|$dst, %CL}",
1528 [(store (rotl (loadi8 addr:$dst), CL), addr:$dst)]>,
1529 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001530 def ROL16mCL : I<0xD3, MRM0m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001531 "rol{w} {%cl, $dst|$dst, %CL}",
1532 [(store (rotl (loadi16 addr:$dst), CL), addr:$dst)]>,
1533 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001534 def ROL32mCL : I<0xD3, MRM0m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001535 "rol{l} {%cl, $dst|$dst, %CL}",
1536 [(store (rotl (loadi32 addr:$dst), CL), addr:$dst)]>,
1537 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001538 def ROL8mi : Ii8<0xC0, MRM0m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001539 "rol{b} {$src, $dst|$dst, $src}",
1540 [(store (rotl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001541 def ROL16mi : Ii8<0xC1, MRM0m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001542 "rol{w} {$src, $dst|$dst, $src}",
1543 [(store (rotl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1544 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001545 def ROL32mi : Ii8<0xC1, MRM0m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001546 "rol{l} {$src, $dst|$dst, $src}",
1547 [(store (rotl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1548
1549 // Rotate by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001550 def ROL8m1 : I<0xD0, MRM0m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001551 "rol{b} $dst",
1552 [(store (rotl (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001553 def ROL16m1 : I<0xD1, MRM0m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001554 "rol{w} $dst",
1555 [(store (rotl (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,
1556 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001557 def ROL32m1 : I<0xD1, MRM0m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001558 "rol{l} $dst",
1559 [(store (rotl (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1560}
1561
Evan Chengb783fa32007-07-19 01:14:50 +00001562def ROR8rCL : I<0xD2, MRM1r, (outs GR8 :$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001563 "ror{b} {%cl, $dst|$dst, %CL}",
1564 [(set GR8:$dst, (rotr GR8:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001565def ROR16rCL : I<0xD3, MRM1r, (outs GR16:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001566 "ror{w} {%cl, $dst|$dst, %CL}",
1567 [(set GR16:$dst, (rotr GR16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001568def ROR32rCL : I<0xD3, MRM1r, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001569 "ror{l} {%cl, $dst|$dst, %CL}",
1570 [(set GR32:$dst, (rotr GR32:$src, CL))]>, Imp<[CL],[]>;
1571
Evan Chengb783fa32007-07-19 01:14:50 +00001572def ROR8ri : Ii8<0xC0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001573 "ror{b} {$src2, $dst|$dst, $src2}",
1574 [(set GR8:$dst, (rotr GR8:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001575def ROR16ri : Ii8<0xC1, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001576 "ror{w} {$src2, $dst|$dst, $src2}",
1577 [(set GR16:$dst, (rotr GR16:$src1, (i8 imm:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001578def ROR32ri : Ii8<0xC1, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001579 "ror{l} {$src2, $dst|$dst, $src2}",
1580 [(set GR32:$dst, (rotr GR32:$src1, (i8 imm:$src2)))]>;
1581
1582// Rotate by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001583def ROR8r1 : I<0xD0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001584 "ror{b} $dst",
1585 [(set GR8:$dst, (rotr GR8:$src1, (i8 1)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001586def ROR16r1 : I<0xD1, MRM1r, (outs GR16:$dst), (ins GR16:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001587 "ror{w} $dst",
1588 [(set GR16:$dst, (rotr GR16:$src1, (i8 1)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001589def ROR32r1 : I<0xD1, MRM1r, (outs GR32:$dst), (ins GR32:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001590 "ror{l} $dst",
1591 [(set GR32:$dst, (rotr GR32:$src1, (i8 1)))]>;
1592
1593let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001594 def ROR8mCL : I<0xD2, MRM1m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001595 "ror{b} {%cl, $dst|$dst, %CL}",
1596 [(store (rotr (loadi8 addr:$dst), CL), addr:$dst)]>,
1597 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001598 def ROR16mCL : I<0xD3, MRM1m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001599 "ror{w} {%cl, $dst|$dst, %CL}",
1600 [(store (rotr (loadi16 addr:$dst), CL), addr:$dst)]>,
1601 Imp<[CL],[]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001602 def ROR32mCL : I<0xD3, MRM1m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001603 "ror{l} {%cl, $dst|$dst, %CL}",
1604 [(store (rotr (loadi32 addr:$dst), CL), addr:$dst)]>,
1605 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001606 def ROR8mi : Ii8<0xC0, MRM1m, (outs), (ins i8mem :$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001607 "ror{b} {$src, $dst|$dst, $src}",
1608 [(store (rotr (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001609 def ROR16mi : Ii8<0xC1, MRM1m, (outs), (ins i16mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001610 "ror{w} {$src, $dst|$dst, $src}",
1611 [(store (rotr (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1612 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001613 def ROR32mi : Ii8<0xC1, MRM1m, (outs), (ins i32mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001614 "ror{l} {$src, $dst|$dst, $src}",
1615 [(store (rotr (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
1616
1617 // Rotate by 1
Evan Chengb783fa32007-07-19 01:14:50 +00001618 def ROR8m1 : I<0xD0, MRM1m, (outs), (ins i8mem :$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001619 "ror{b} $dst",
1620 [(store (rotr (loadi8 addr:$dst), (i8 1)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001621 def ROR16m1 : I<0xD1, MRM1m, (outs), (ins i16mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001622 "ror{w} $dst",
1623 [(store (rotr (loadi16 addr:$dst), (i8 1)), addr:$dst)]>,
1624 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001625 def ROR32m1 : I<0xD1, MRM1m, (outs), (ins i32mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001626 "ror{l} $dst",
1627 [(store (rotr (loadi32 addr:$dst), (i8 1)), addr:$dst)]>;
1628}
1629
1630
1631
1632// Double shift instructions (generalizations of rotate)
Evan Chengb783fa32007-07-19 01:14:50 +00001633def SHLD32rrCL : I<0xA5, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001634 "shld{l} {%cl, $src2, $dst|$dst, $src2, %CL}",
1635 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2, CL))]>,
1636 Imp<[CL],[]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00001637def SHRD32rrCL : I<0xAD, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001638 "shrd{l} {%cl, $src2, $dst|$dst, $src2, %CL}",
1639 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2, CL))]>,
1640 Imp<[CL],[]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00001641def SHLD16rrCL : I<0xA5, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001642 "shld{w} {%cl, $src2, $dst|$dst, $src2, %CL}",
1643 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2, CL))]>,
1644 Imp<[CL],[]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001645def SHRD16rrCL : I<0xAD, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001646 "shrd{w} {%cl, $src2, $dst|$dst, $src2, %CL}",
1647 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2, CL))]>,
1648 Imp<[CL],[]>, TB, OpSize;
1649
1650let isCommutable = 1 in { // These instructions commute to each other.
1651def SHLD32rri8 : Ii8<0xA4, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001652 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001653 "shld{l} {$src3, $src2, $dst|$dst, $src2, $src3}",
1654 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2,
1655 (i8 imm:$src3)))]>,
1656 TB;
1657def SHRD32rri8 : Ii8<0xAC, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001658 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001659 "shrd{l} {$src3, $src2, $dst|$dst, $src2, $src3}",
1660 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2,
1661 (i8 imm:$src3)))]>,
1662 TB;
1663def SHLD16rri8 : Ii8<0xA4, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001664 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001665 "shld{w} {$src3, $src2, $dst|$dst, $src2, $src3}",
1666 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2,
1667 (i8 imm:$src3)))]>,
1668 TB, OpSize;
1669def SHRD16rri8 : Ii8<0xAC, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00001670 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001671 "shrd{w} {$src3, $src2, $dst|$dst, $src2, $src3}",
1672 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2,
1673 (i8 imm:$src3)))]>,
1674 TB, OpSize;
1675}
1676
1677let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001678 def SHLD32mrCL : I<0xA5, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001679 "shld{l} {%cl, $src2, $dst|$dst, $src2, %CL}",
1680 [(store (X86shld (loadi32 addr:$dst), GR32:$src2, CL),
1681 addr:$dst)]>,
1682 Imp<[CL],[]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00001683 def SHRD32mrCL : I<0xAD, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001684 "shrd{l} {%cl, $src2, $dst|$dst, $src2, %CL}",
1685 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2, CL),
1686 addr:$dst)]>,
1687 Imp<[CL],[]>, TB;
1688 def SHLD32mri8 : Ii8<0xA4, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001689 (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001690 "shld{l} {$src3, $src2, $dst|$dst, $src2, $src3}",
1691 [(store (X86shld (loadi32 addr:$dst), GR32:$src2,
1692 (i8 imm:$src3)), addr:$dst)]>,
1693 TB;
1694 def SHRD32mri8 : Ii8<0xAC, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001695 (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001696 "shrd{l} {$src3, $src2, $dst|$dst, $src2, $src3}",
1697 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2,
1698 (i8 imm:$src3)), addr:$dst)]>,
1699 TB;
1700
Evan Chengb783fa32007-07-19 01:14:50 +00001701 def SHLD16mrCL : I<0xA5, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001702 "shld{w} {%cl, $src2, $dst|$dst, $src2, %CL}",
1703 [(store (X86shld (loadi16 addr:$dst), GR16:$src2, CL),
1704 addr:$dst)]>,
1705 Imp<[CL],[]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001706 def SHRD16mrCL : I<0xAD, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001707 "shrd{w} {%cl, $src2, $dst|$dst, $src2, %CL}",
1708 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2, CL),
1709 addr:$dst)]>,
1710 Imp<[CL],[]>, TB, OpSize;
1711 def SHLD16mri8 : Ii8<0xA4, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001712 (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001713 "shld{w} {$src3, $src2, $dst|$dst, $src2, $src3}",
1714 [(store (X86shld (loadi16 addr:$dst), GR16:$src2,
1715 (i8 imm:$src3)), addr:$dst)]>,
1716 TB, OpSize;
1717 def SHRD16mri8 : Ii8<0xAC, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00001718 (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001719 "shrd{w} {$src3, $src2, $dst|$dst, $src2, $src3}",
1720 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2,
1721 (i8 imm:$src3)), addr:$dst)]>,
1722 TB, OpSize;
1723}
1724
1725
1726// Arithmetic.
1727let isCommutable = 1 in { // X = ADD Y, Z --> X = ADD Z, Y
Evan Chengb783fa32007-07-19 01:14:50 +00001728def ADD8rr : I<0x00, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001729 "add{b} {$src2, $dst|$dst, $src2}",
1730 [(set GR8:$dst, (add GR8:$src1, GR8:$src2))]>;
1731let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001732def ADD16rr : I<0x01, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001733 "add{w} {$src2, $dst|$dst, $src2}",
1734 [(set GR16:$dst, (add GR16:$src1, GR16:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001735def ADD32rr : I<0x01, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001736 "add{l} {$src2, $dst|$dst, $src2}",
1737 [(set GR32:$dst, (add GR32:$src1, GR32:$src2))]>;
1738} // end isConvertibleToThreeAddress
1739} // end isCommutable
Evan Chengb783fa32007-07-19 01:14:50 +00001740def ADD8rm : I<0x02, MRMSrcMem, (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001741 "add{b} {$src2, $dst|$dst, $src2}",
1742 [(set GR8:$dst, (add GR8:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001743def ADD16rm : I<0x03, MRMSrcMem, (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001744 "add{w} {$src2, $dst|$dst, $src2}",
1745 [(set GR16:$dst, (add GR16:$src1, (load addr:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001746def ADD32rm : I<0x03, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001747 "add{l} {$src2, $dst|$dst, $src2}",
1748 [(set GR32:$dst, (add GR32:$src1, (load addr:$src2)))]>;
1749
Evan Chengb783fa32007-07-19 01:14:50 +00001750def ADD8ri : Ii8<0x80, MRM0r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001751 "add{b} {$src2, $dst|$dst, $src2}",
1752 [(set GR8:$dst, (add GR8:$src1, imm:$src2))]>;
1753
1754let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +00001755def ADD16ri : Ii16<0x81, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001756 "add{w} {$src2, $dst|$dst, $src2}",
1757 [(set GR16:$dst, (add GR16:$src1, imm:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001758def ADD32ri : Ii32<0x81, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001759 "add{l} {$src2, $dst|$dst, $src2}",
1760 [(set GR32:$dst, (add GR32:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001761def ADD16ri8 : Ii8<0x83, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001762 "add{w} {$src2, $dst|$dst, $src2}",
1763 [(set GR16:$dst, (add GR16:$src1, i16immSExt8:$src2))]>,
1764 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001765def ADD32ri8 : Ii8<0x83, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001766 "add{l} {$src2, $dst|$dst, $src2}",
1767 [(set GR32:$dst, (add GR32:$src1, i32immSExt8:$src2))]>;
1768}
1769
1770let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001771 def ADD8mr : I<0x00, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001772 "add{b} {$src2, $dst|$dst, $src2}",
1773 [(store (add (load addr:$dst), GR8:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001774 def ADD16mr : I<0x01, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001775 "add{w} {$src2, $dst|$dst, $src2}",
1776 [(store (add (load addr:$dst), GR16:$src2), addr:$dst)]>,
1777 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001778 def ADD32mr : I<0x01, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001779 "add{l} {$src2, $dst|$dst, $src2}",
1780 [(store (add (load addr:$dst), GR32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001781 def ADD8mi : Ii8<0x80, MRM0m, (outs), (ins i8mem :$dst, i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001782 "add{b} {$src2, $dst|$dst, $src2}",
1783 [(store (add (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001784 def ADD16mi : Ii16<0x81, MRM0m, (outs), (ins i16mem:$dst, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001785 "add{w} {$src2, $dst|$dst, $src2}",
1786 [(store (add (loadi16 addr:$dst), imm:$src2), addr:$dst)]>,
1787 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001788 def ADD32mi : Ii32<0x81, MRM0m, (outs), (ins i32mem:$dst, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001789 "add{l} {$src2, $dst|$dst, $src2}",
1790 [(store (add (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001791 def ADD16mi8 : Ii8<0x83, MRM0m, (outs), (ins i16mem:$dst, i16i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001792 "add{w} {$src2, $dst|$dst, $src2}",
1793 [(store (add (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>,
1794 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001795 def ADD32mi8 : Ii8<0x83, MRM0m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001796 "add{l} {$src2, $dst|$dst, $src2}",
1797 [(store (add (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
1798}
1799
1800let isCommutable = 1 in { // X = ADC Y, Z --> X = ADC Z, Y
Evan Chengb783fa32007-07-19 01:14:50 +00001801def ADC32rr : I<0x11, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001802 "adc{l} {$src2, $dst|$dst, $src2}",
1803 [(set GR32:$dst, (adde GR32:$src1, GR32:$src2))]>;
1804}
Evan Chengb783fa32007-07-19 01:14:50 +00001805def ADC32rm : I<0x13, MRMSrcMem , (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001806 "adc{l} {$src2, $dst|$dst, $src2}",
1807 [(set GR32:$dst, (adde GR32:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001808def ADC32ri : Ii32<0x81, MRM2r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001809 "adc{l} {$src2, $dst|$dst, $src2}",
1810 [(set GR32:$dst, (adde GR32:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001811def ADC32ri8 : Ii8<0x83, MRM2r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001812 "adc{l} {$src2, $dst|$dst, $src2}",
1813 [(set GR32:$dst, (adde GR32:$src1, i32immSExt8:$src2))]>;
1814
1815let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001816 def ADC32mr : I<0x11, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001817 "adc{l} {$src2, $dst|$dst, $src2}",
1818 [(store (adde (load addr:$dst), GR32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001819 def ADC32mi : Ii32<0x81, MRM2m, (outs), (ins i32mem:$dst, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001820 "adc{l} {$src2, $dst|$dst, $src2}",
1821 [(store (adde (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001822 def ADC32mi8 : Ii8<0x83, MRM2m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001823 "adc{l} {$src2, $dst|$dst, $src2}",
1824 [(store (adde (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
1825}
1826
Evan Chengb783fa32007-07-19 01:14:50 +00001827def SUB8rr : I<0x28, MRMDestReg, (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001828 "sub{b} {$src2, $dst|$dst, $src2}",
1829 [(set GR8:$dst, (sub GR8:$src1, GR8:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001830def SUB16rr : I<0x29, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001831 "sub{w} {$src2, $dst|$dst, $src2}",
1832 [(set GR16:$dst, (sub GR16:$src1, GR16:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001833def SUB32rr : I<0x29, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001834 "sub{l} {$src2, $dst|$dst, $src2}",
1835 [(set GR32:$dst, (sub GR32:$src1, GR32:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001836def SUB8rm : I<0x2A, MRMSrcMem, (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001837 "sub{b} {$src2, $dst|$dst, $src2}",
1838 [(set GR8:$dst, (sub GR8:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001839def SUB16rm : I<0x2B, MRMSrcMem, (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001840 "sub{w} {$src2, $dst|$dst, $src2}",
1841 [(set GR16:$dst, (sub GR16:$src1, (load addr:$src2)))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001842def SUB32rm : I<0x2B, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001843 "sub{l} {$src2, $dst|$dst, $src2}",
1844 [(set GR32:$dst, (sub GR32:$src1, (load addr:$src2)))]>;
1845
Evan Chengb783fa32007-07-19 01:14:50 +00001846def SUB8ri : Ii8 <0x80, MRM5r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001847 "sub{b} {$src2, $dst|$dst, $src2}",
1848 [(set GR8:$dst, (sub GR8:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001849def SUB16ri : Ii16<0x81, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001850 "sub{w} {$src2, $dst|$dst, $src2}",
1851 [(set GR16:$dst, (sub GR16:$src1, imm:$src2))]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001852def SUB32ri : Ii32<0x81, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001853 "sub{l} {$src2, $dst|$dst, $src2}",
1854 [(set GR32:$dst, (sub GR32:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001855def SUB16ri8 : Ii8<0x83, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001856 "sub{w} {$src2, $dst|$dst, $src2}",
1857 [(set GR16:$dst, (sub GR16:$src1, i16immSExt8:$src2))]>,
1858 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001859def SUB32ri8 : Ii8<0x83, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001860 "sub{l} {$src2, $dst|$dst, $src2}",
1861 [(set GR32:$dst, (sub GR32:$src1, i32immSExt8:$src2))]>;
1862let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001863 def SUB8mr : I<0x28, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001864 "sub{b} {$src2, $dst|$dst, $src2}",
1865 [(store (sub (load addr:$dst), GR8:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001866 def SUB16mr : I<0x29, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001867 "sub{w} {$src2, $dst|$dst, $src2}",
1868 [(store (sub (load addr:$dst), GR16:$src2), addr:$dst)]>,
1869 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001870 def SUB32mr : I<0x29, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001871 "sub{l} {$src2, $dst|$dst, $src2}",
1872 [(store (sub (load addr:$dst), GR32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001873 def SUB8mi : Ii8<0x80, MRM5m, (outs), (ins i8mem :$dst, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001874 "sub{b} {$src2, $dst|$dst, $src2}",
1875 [(store (sub (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001876 def SUB16mi : Ii16<0x81, MRM5m, (outs), (ins i16mem:$dst, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001877 "sub{w} {$src2, $dst|$dst, $src2}",
1878 [(store (sub (loadi16 addr:$dst), imm:$src2), addr:$dst)]>,
1879 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001880 def SUB32mi : Ii32<0x81, MRM5m, (outs), (ins i32mem:$dst, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001881 "sub{l} {$src2, $dst|$dst, $src2}",
1882 [(store (sub (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001883 def SUB16mi8 : Ii8<0x83, MRM5m, (outs), (ins i16mem:$dst, i16i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001884 "sub{w} {$src2, $dst|$dst, $src2}",
1885 [(store (sub (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>,
1886 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001887 def SUB32mi8 : Ii8<0x83, MRM5m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001888 "sub{l} {$src2, $dst|$dst, $src2}",
1889 [(store (sub (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
1890}
1891
Evan Chengb783fa32007-07-19 01:14:50 +00001892def SBB32rr : I<0x19, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001893 "sbb{l} {$src2, $dst|$dst, $src2}",
1894 [(set GR32:$dst, (sube GR32:$src1, GR32:$src2))]>;
1895
1896let isTwoAddress = 0 in {
Evan Chengb783fa32007-07-19 01:14:50 +00001897 def SBB32mr : I<0x19, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001898 "sbb{l} {$src2, $dst|$dst, $src2}",
1899 [(store (sube (load addr:$dst), GR32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001900 def SBB8mi : Ii32<0x80, MRM3m, (outs), (ins i8mem:$dst, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001901 "sbb{b} {$src2, $dst|$dst, $src2}",
1902 [(store (sube (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001903 def SBB32mi : Ii32<0x81, MRM3m, (outs), (ins i32mem:$dst, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001904 "sbb{l} {$src2, $dst|$dst, $src2}",
1905 [(store (sube (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001906 def SBB32mi8 : Ii8<0x83, MRM3m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001907 "sbb{l} {$src2, $dst|$dst, $src2}",
1908 [(store (sube (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
1909}
Evan Chengb783fa32007-07-19 01:14:50 +00001910def SBB32rm : I<0x1B, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001911 "sbb{l} {$src2, $dst|$dst, $src2}",
1912 [(set GR32:$dst, (sube GR32:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001913def SBB32ri : Ii32<0x81, MRM3r, (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001914 "sbb{l} {$src2, $dst|$dst, $src2}",
1915 [(set GR32:$dst, (sube GR32:$src1, imm:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001916def SBB32ri8 : Ii8<0x83, MRM3r, (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001917 "sbb{l} {$src2, $dst|$dst, $src2}",
1918 [(set GR32:$dst, (sube GR32:$src1, i32immSExt8:$src2))]>;
1919
1920let isCommutable = 1 in { // X = IMUL Y, Z --> X = IMUL Z, Y
Evan Chengb783fa32007-07-19 01:14:50 +00001921def IMUL16rr : I<0xAF, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001922 "imul{w} {$src2, $dst|$dst, $src2}",
1923 [(set GR16:$dst, (mul GR16:$src1, GR16:$src2))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001924def IMUL32rr : I<0xAF, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001925 "imul{l} {$src2, $dst|$dst, $src2}",
1926 [(set GR32:$dst, (mul GR32:$src1, GR32:$src2))]>, TB;
1927}
Evan Chengb783fa32007-07-19 01:14:50 +00001928def IMUL16rm : I<0xAF, MRMSrcMem, (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001929 "imul{w} {$src2, $dst|$dst, $src2}",
1930 [(set GR16:$dst, (mul GR16:$src1, (load addr:$src2)))]>,
1931 TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001932def IMUL32rm : I<0xAF, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001933 "imul{l} {$src2, $dst|$dst, $src2}",
1934 [(set GR32:$dst, (mul GR32:$src1, (load addr:$src2)))]>, TB;
1935
1936} // end Two Address instructions
1937
1938// Suprisingly enough, these are not two address instructions!
1939def IMUL16rri : Ii16<0x69, MRMSrcReg, // GR16 = GR16*I16
Evan Chengb783fa32007-07-19 01:14:50 +00001940 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001941 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
1942 [(set GR16:$dst, (mul GR16:$src1, imm:$src2))]>, OpSize;
1943def IMUL32rri : Ii32<0x69, MRMSrcReg, // GR32 = GR32*I32
Evan Chengb783fa32007-07-19 01:14:50 +00001944 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001945 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
1946 [(set GR32:$dst, (mul GR32:$src1, imm:$src2))]>;
1947def IMUL16rri8 : Ii8<0x6B, MRMSrcReg, // GR16 = GR16*I8
Evan Chengb783fa32007-07-19 01:14:50 +00001948 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001949 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
1950 [(set GR16:$dst, (mul GR16:$src1, i16immSExt8:$src2))]>,
1951 OpSize;
1952def IMUL32rri8 : Ii8<0x6B, MRMSrcReg, // GR32 = GR32*I8
Evan Chengb783fa32007-07-19 01:14:50 +00001953 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001954 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
1955 [(set GR32:$dst, (mul GR32:$src1, i32immSExt8:$src2))]>;
1956
1957def IMUL16rmi : Ii16<0x69, MRMSrcMem, // GR16 = [mem16]*I16
Evan Chengb783fa32007-07-19 01:14:50 +00001958 (outs GR16:$dst), (ins i16mem:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001959 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
1960 [(set GR16:$dst, (mul (load addr:$src1), imm:$src2))]>,
1961 OpSize;
1962def IMUL32rmi : Ii32<0x69, MRMSrcMem, // GR32 = [mem32]*I32
Evan Chengb783fa32007-07-19 01:14:50 +00001963 (outs GR32:$dst), (ins i32mem:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001964 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
1965 [(set GR32:$dst, (mul (load addr:$src1), imm:$src2))]>;
1966def IMUL16rmi8 : Ii8<0x6B, MRMSrcMem, // GR16 = [mem16]*I8
Evan Chengb783fa32007-07-19 01:14:50 +00001967 (outs GR16:$dst), (ins i16mem:$src1, i16i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001968 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
1969 [(set GR16:$dst, (mul (load addr:$src1), i16immSExt8:$src2))]>,
1970 OpSize;
1971def IMUL32rmi8 : Ii8<0x6B, MRMSrcMem, // GR32 = [mem32]*I8
Evan Chengb783fa32007-07-19 01:14:50 +00001972 (outs GR32:$dst), (ins i32mem:$src1, i32i8imm: $src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001973 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
1974 [(set GR32:$dst, (mul (load addr:$src1), i32immSExt8:$src2))]>;
1975
1976//===----------------------------------------------------------------------===//
1977// Test instructions are just like AND, except they don't generate a result.
1978//
1979let isCommutable = 1 in { // TEST X, Y --> TEST Y, X
Evan Chengb783fa32007-07-19 01:14:50 +00001980def TEST8rr : I<0x84, MRMDestReg, (outs), (ins GR8:$src1, GR8:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001981 "test{b} {$src2, $src1|$src1, $src2}",
1982 [(X86cmp (and GR8:$src1, GR8:$src2), 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001983def TEST16rr : I<0x85, MRMDestReg, (outs), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001984 "test{w} {$src2, $src1|$src1, $src2}",
1985 [(X86cmp (and GR16:$src1, GR16:$src2), 0)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001986def TEST32rr : I<0x85, MRMDestReg, (outs), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001987 "test{l} {$src2, $src1|$src1, $src2}",
1988 [(X86cmp (and GR32:$src1, GR32:$src2), 0)]>;
1989}
1990
Evan Chengb783fa32007-07-19 01:14:50 +00001991def TEST8rm : I<0x84, MRMSrcMem, (outs), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001992 "test{b} {$src2, $src1|$src1, $src2}",
1993 [(X86cmp (and GR8:$src1, (loadi8 addr:$src2)), 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001994def TEST16rm : I<0x85, MRMSrcMem, (outs), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001995 "test{w} {$src2, $src1|$src1, $src2}",
1996 [(X86cmp (and GR16:$src1, (loadi16 addr:$src2)), 0)]>,
1997 OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00001998def TEST32rm : I<0x85, MRMSrcMem, (outs), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001999 "test{l} {$src2, $src1|$src1, $src2}",
2000 [(X86cmp (and GR32:$src1, (loadi32 addr:$src2)), 0)]>;
2001
2002def TEST8ri : Ii8 <0xF6, MRM0r, // flags = GR8 & imm8
Evan Chengb783fa32007-07-19 01:14:50 +00002003 (outs), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002004 "test{b} {$src2, $src1|$src1, $src2}",
2005 [(X86cmp (and GR8:$src1, imm:$src2), 0)]>;
2006def TEST16ri : Ii16<0xF7, MRM0r, // flags = GR16 & imm16
Evan Chengb783fa32007-07-19 01:14:50 +00002007 (outs), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002008 "test{w} {$src2, $src1|$src1, $src2}",
2009 [(X86cmp (and GR16:$src1, imm:$src2), 0)]>, OpSize;
2010def TEST32ri : Ii32<0xF7, MRM0r, // flags = GR32 & imm32
Evan Chengb783fa32007-07-19 01:14:50 +00002011 (outs), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002012 "test{l} {$src2, $src1|$src1, $src2}",
2013 [(X86cmp (and GR32:$src1, imm:$src2), 0)]>;
2014
2015def TEST8mi : Ii8 <0xF6, MRM0m, // flags = [mem8] & imm8
Evan Chengb783fa32007-07-19 01:14:50 +00002016 (outs), (ins i8mem:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002017 "test{b} {$src2, $src1|$src1, $src2}",
2018 [(X86cmp (and (loadi8 addr:$src1), imm:$src2), 0)]>;
2019def TEST16mi : Ii16<0xF7, MRM0m, // flags = [mem16] & imm16
Evan Chengb783fa32007-07-19 01:14:50 +00002020 (outs), (ins i16mem:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002021 "test{w} {$src2, $src1|$src1, $src2}",
2022 [(X86cmp (and (loadi16 addr:$src1), imm:$src2), 0)]>,
2023 OpSize;
2024def TEST32mi : Ii32<0xF7, MRM0m, // flags = [mem32] & imm32
Evan Chengb783fa32007-07-19 01:14:50 +00002025 (outs), (ins i32mem:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002026 "test{l} {$src2, $src1|$src1, $src2}",
2027 [(X86cmp (and (loadi32 addr:$src1), imm:$src2), 0)]>;
2028
2029
2030// Condition code ops, incl. set if equal/not equal/...
Evan Chengb783fa32007-07-19 01:14:50 +00002031def SAHF : I<0x9E, RawFrm, (outs), (ins), "sahf", []>, Imp<[AH],[]>; // flags = AH
2032def LAHF : I<0x9F, RawFrm, (outs), (ins), "lahf", []>, Imp<[],[AH]>; // AH = flags
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002033
2034def SETEr : I<0x94, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002035 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002036 "sete $dst",
2037 [(set GR8:$dst, (X86setcc X86_COND_E))]>,
2038 TB; // GR8 = ==
2039def SETEm : I<0x94, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002040 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002041 "sete $dst",
2042 [(store (X86setcc X86_COND_E), addr:$dst)]>,
2043 TB; // [mem8] = ==
2044def SETNEr : I<0x95, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002045 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002046 "setne $dst",
2047 [(set GR8:$dst, (X86setcc X86_COND_NE))]>,
2048 TB; // GR8 = !=
2049def SETNEm : I<0x95, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002050 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002051 "setne $dst",
2052 [(store (X86setcc X86_COND_NE), addr:$dst)]>,
2053 TB; // [mem8] = !=
2054def SETLr : I<0x9C, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002055 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002056 "setl $dst",
2057 [(set GR8:$dst, (X86setcc X86_COND_L))]>,
2058 TB; // GR8 = < signed
2059def SETLm : I<0x9C, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002060 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002061 "setl $dst",
2062 [(store (X86setcc X86_COND_L), addr:$dst)]>,
2063 TB; // [mem8] = < signed
2064def SETGEr : I<0x9D, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002065 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002066 "setge $dst",
2067 [(set GR8:$dst, (X86setcc X86_COND_GE))]>,
2068 TB; // GR8 = >= signed
2069def SETGEm : I<0x9D, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002070 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002071 "setge $dst",
2072 [(store (X86setcc X86_COND_GE), addr:$dst)]>,
2073 TB; // [mem8] = >= signed
2074def SETLEr : I<0x9E, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002075 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002076 "setle $dst",
2077 [(set GR8:$dst, (X86setcc X86_COND_LE))]>,
2078 TB; // GR8 = <= signed
2079def SETLEm : I<0x9E, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002080 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002081 "setle $dst",
2082 [(store (X86setcc X86_COND_LE), addr:$dst)]>,
2083 TB; // [mem8] = <= signed
2084def SETGr : I<0x9F, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002085 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002086 "setg $dst",
2087 [(set GR8:$dst, (X86setcc X86_COND_G))]>,
2088 TB; // GR8 = > signed
2089def SETGm : I<0x9F, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002090 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002091 "setg $dst",
2092 [(store (X86setcc X86_COND_G), addr:$dst)]>,
2093 TB; // [mem8] = > signed
2094
2095def SETBr : I<0x92, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002096 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002097 "setb $dst",
2098 [(set GR8:$dst, (X86setcc X86_COND_B))]>,
2099 TB; // GR8 = < unsign
2100def SETBm : I<0x92, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002101 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002102 "setb $dst",
2103 [(store (X86setcc X86_COND_B), addr:$dst)]>,
2104 TB; // [mem8] = < unsign
2105def SETAEr : I<0x93, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002106 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002107 "setae $dst",
2108 [(set GR8:$dst, (X86setcc X86_COND_AE))]>,
2109 TB; // GR8 = >= unsign
2110def SETAEm : I<0x93, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002111 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002112 "setae $dst",
2113 [(store (X86setcc X86_COND_AE), addr:$dst)]>,
2114 TB; // [mem8] = >= unsign
2115def SETBEr : I<0x96, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002116 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002117 "setbe $dst",
2118 [(set GR8:$dst, (X86setcc X86_COND_BE))]>,
2119 TB; // GR8 = <= unsign
2120def SETBEm : I<0x96, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002121 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002122 "setbe $dst",
2123 [(store (X86setcc X86_COND_BE), addr:$dst)]>,
2124 TB; // [mem8] = <= unsign
2125def SETAr : I<0x97, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002126 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002127 "seta $dst",
2128 [(set GR8:$dst, (X86setcc X86_COND_A))]>,
2129 TB; // GR8 = > signed
2130def SETAm : I<0x97, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002131 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002132 "seta $dst",
2133 [(store (X86setcc X86_COND_A), addr:$dst)]>,
2134 TB; // [mem8] = > signed
2135
2136def SETSr : I<0x98, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002137 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002138 "sets $dst",
2139 [(set GR8:$dst, (X86setcc X86_COND_S))]>,
2140 TB; // GR8 = <sign bit>
2141def SETSm : I<0x98, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002142 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002143 "sets $dst",
2144 [(store (X86setcc X86_COND_S), addr:$dst)]>,
2145 TB; // [mem8] = <sign bit>
2146def SETNSr : I<0x99, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002147 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002148 "setns $dst",
2149 [(set GR8:$dst, (X86setcc X86_COND_NS))]>,
2150 TB; // GR8 = !<sign bit>
2151def SETNSm : I<0x99, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002152 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002153 "setns $dst",
2154 [(store (X86setcc X86_COND_NS), addr:$dst)]>,
2155 TB; // [mem8] = !<sign bit>
2156def SETPr : I<0x9A, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002157 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002158 "setp $dst",
2159 [(set GR8:$dst, (X86setcc X86_COND_P))]>,
2160 TB; // GR8 = parity
2161def SETPm : I<0x9A, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002162 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002163 "setp $dst",
2164 [(store (X86setcc X86_COND_P), addr:$dst)]>,
2165 TB; // [mem8] = parity
2166def SETNPr : I<0x9B, MRM0r,
Evan Chengb783fa32007-07-19 01:14:50 +00002167 (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002168 "setnp $dst",
2169 [(set GR8:$dst, (X86setcc X86_COND_NP))]>,
2170 TB; // GR8 = not parity
2171def SETNPm : I<0x9B, MRM0m,
Evan Chengb783fa32007-07-19 01:14:50 +00002172 (outs), (ins i8mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002173 "setnp $dst",
2174 [(store (X86setcc X86_COND_NP), addr:$dst)]>,
2175 TB; // [mem8] = not parity
2176
2177// Integer comparisons
2178def CMP8rr : I<0x38, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00002179 (outs), (ins GR8 :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002180 "cmp{b} {$src2, $src1|$src1, $src2}",
2181 [(X86cmp GR8:$src1, GR8:$src2)]>;
2182def CMP16rr : I<0x39, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00002183 (outs), (ins GR16:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002184 "cmp{w} {$src2, $src1|$src1, $src2}",
2185 [(X86cmp GR16:$src1, GR16:$src2)]>, OpSize;
2186def CMP32rr : I<0x39, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +00002187 (outs), (ins GR32:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002188 "cmp{l} {$src2, $src1|$src1, $src2}",
2189 [(X86cmp GR32:$src1, GR32:$src2)]>;
2190def CMP8mr : I<0x38, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002191 (outs), (ins i8mem :$src1, GR8 :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002192 "cmp{b} {$src2, $src1|$src1, $src2}",
2193 [(X86cmp (loadi8 addr:$src1), GR8:$src2)]>;
2194def CMP16mr : I<0x39, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002195 (outs), (ins i16mem:$src1, GR16:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002196 "cmp{w} {$src2, $src1|$src1, $src2}",
2197 [(X86cmp (loadi16 addr:$src1), GR16:$src2)]>, OpSize;
2198def CMP32mr : I<0x39, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002199 (outs), (ins i32mem:$src1, GR32:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002200 "cmp{l} {$src2, $src1|$src1, $src2}",
2201 [(X86cmp (loadi32 addr:$src1), GR32:$src2)]>;
2202def CMP8rm : I<0x3A, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002203 (outs), (ins GR8 :$src1, i8mem :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002204 "cmp{b} {$src2, $src1|$src1, $src2}",
2205 [(X86cmp GR8:$src1, (loadi8 addr:$src2))]>;
2206def CMP16rm : I<0x3B, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002207 (outs), (ins GR16:$src1, i16mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002208 "cmp{w} {$src2, $src1|$src1, $src2}",
2209 [(X86cmp GR16:$src1, (loadi16 addr:$src2))]>, OpSize;
2210def CMP32rm : I<0x3B, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +00002211 (outs), (ins GR32:$src1, i32mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002212 "cmp{l} {$src2, $src1|$src1, $src2}",
2213 [(X86cmp GR32:$src1, (loadi32 addr:$src2))]>;
2214def CMP8ri : Ii8<0x80, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002215 (outs), (ins GR8:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002216 "cmp{b} {$src2, $src1|$src1, $src2}",
2217 [(X86cmp GR8:$src1, imm:$src2)]>;
2218def CMP16ri : Ii16<0x81, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002219 (outs), (ins GR16:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002220 "cmp{w} {$src2, $src1|$src1, $src2}",
2221 [(X86cmp GR16:$src1, imm:$src2)]>, OpSize;
2222def CMP32ri : Ii32<0x81, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002223 (outs), (ins GR32:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002224 "cmp{l} {$src2, $src1|$src1, $src2}",
2225 [(X86cmp GR32:$src1, imm:$src2)]>;
2226def CMP8mi : Ii8 <0x80, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002227 (outs), (ins i8mem :$src1, i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002228 "cmp{b} {$src2, $src1|$src1, $src2}",
2229 [(X86cmp (loadi8 addr:$src1), imm:$src2)]>;
2230def CMP16mi : Ii16<0x81, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002231 (outs), (ins i16mem:$src1, i16imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002232 "cmp{w} {$src2, $src1|$src1, $src2}",
2233 [(X86cmp (loadi16 addr:$src1), imm:$src2)]>, OpSize;
2234def CMP32mi : Ii32<0x81, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002235 (outs), (ins i32mem:$src1, i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002236 "cmp{l} {$src2, $src1|$src1, $src2}",
2237 [(X86cmp (loadi32 addr:$src1), imm:$src2)]>;
2238def CMP16ri8 : Ii8<0x83, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002239 (outs), (ins GR16:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002240 "cmp{w} {$src2, $src1|$src1, $src2}",
2241 [(X86cmp GR16:$src1, i16immSExt8:$src2)]>, OpSize;
2242def CMP16mi8 : Ii8<0x83, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002243 (outs), (ins i16mem:$src1, i16i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002244 "cmp{w} {$src2, $src1|$src1, $src2}",
2245 [(X86cmp (loadi16 addr:$src1), i16immSExt8:$src2)]>, OpSize;
2246def CMP32mi8 : Ii8<0x83, MRM7m,
Evan Chengb783fa32007-07-19 01:14:50 +00002247 (outs), (ins i32mem:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002248 "cmp{l} {$src2, $src1|$src1, $src2}",
2249 [(X86cmp (loadi32 addr:$src1), i32immSExt8:$src2)]>;
2250def CMP32ri8 : Ii8<0x83, MRM7r,
Evan Chengb783fa32007-07-19 01:14:50 +00002251 (outs), (ins GR32:$src1, i32i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002252 "cmp{l} {$src2, $src1|$src1, $src2}",
2253 [(X86cmp GR32:$src1, i32immSExt8:$src2)]>;
2254
2255// Sign/Zero extenders
Evan Chengb783fa32007-07-19 01:14:50 +00002256def MOVSX16rr8 : I<0xBE, MRMSrcReg, (outs GR16:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002257 "movs{bw|x} {$src, $dst|$dst, $src}",
2258 [(set GR16:$dst, (sext GR8:$src))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002259def MOVSX16rm8 : I<0xBE, MRMSrcMem, (outs GR16:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002260 "movs{bw|x} {$src, $dst|$dst, $src}",
2261 [(set GR16:$dst, (sextloadi16i8 addr:$src))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002262def MOVSX32rr8 : I<0xBE, MRMSrcReg, (outs GR32:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002263 "movs{bl|x} {$src, $dst|$dst, $src}",
2264 [(set GR32:$dst, (sext GR8:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002265def MOVSX32rm8 : I<0xBE, MRMSrcMem, (outs GR32:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002266 "movs{bl|x} {$src, $dst|$dst, $src}",
2267 [(set GR32:$dst, (sextloadi32i8 addr:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002268def MOVSX32rr16: I<0xBF, MRMSrcReg, (outs GR32:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002269 "movs{wl|x} {$src, $dst|$dst, $src}",
2270 [(set GR32:$dst, (sext GR16:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002271def MOVSX32rm16: I<0xBF, MRMSrcMem, (outs GR32:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002272 "movs{wl|x} {$src, $dst|$dst, $src}",
2273 [(set GR32:$dst, (sextloadi32i16 addr:$src))]>, TB;
2274
Evan Chengb783fa32007-07-19 01:14:50 +00002275def MOVZX16rr8 : I<0xB6, MRMSrcReg, (outs GR16:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002276 "movz{bw|x} {$src, $dst|$dst, $src}",
2277 [(set GR16:$dst, (zext GR8:$src))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002278def MOVZX16rm8 : I<0xB6, MRMSrcMem, (outs GR16:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002279 "movz{bw|x} {$src, $dst|$dst, $src}",
2280 [(set GR16:$dst, (zextloadi16i8 addr:$src))]>, TB, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002281def MOVZX32rr8 : I<0xB6, MRMSrcReg, (outs GR32:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002282 "movz{bl|x} {$src, $dst|$dst, $src}",
2283 [(set GR32:$dst, (zext GR8:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002284def MOVZX32rm8 : I<0xB6, MRMSrcMem, (outs GR32:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002285 "movz{bl|x} {$src, $dst|$dst, $src}",
2286 [(set GR32:$dst, (zextloadi32i8 addr:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002287def MOVZX32rr16: I<0xB7, MRMSrcReg, (outs GR32:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002288 "movz{wl|x} {$src, $dst|$dst, $src}",
2289 [(set GR32:$dst, (zext GR16:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +00002290def MOVZX32rm16: I<0xB7, MRMSrcMem, (outs GR32:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002291 "movz{wl|x} {$src, $dst|$dst, $src}",
2292 [(set GR32:$dst, (zextloadi32i16 addr:$src))]>, TB;
2293
Evan Chengb783fa32007-07-19 01:14:50 +00002294def CBW : I<0x98, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002295 "{cbtw|cbw}", []>, Imp<[AL],[AX]>, OpSize; // AX = signext(AL)
Evan Chengb783fa32007-07-19 01:14:50 +00002296def CWDE : I<0x98, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002297 "{cwtl|cwde}", []>, Imp<[AX],[EAX]>; // EAX = signext(AX)
2298
Evan Chengb783fa32007-07-19 01:14:50 +00002299def CWD : I<0x99, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002300 "{cwtd|cwd}", []>, Imp<[AX],[AX,DX]>, OpSize; // DX:AX = signext(AX)
Evan Chengb783fa32007-07-19 01:14:50 +00002301def CDQ : I<0x99, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002302 "{cltd|cdq}", []>, Imp<[EAX],[EAX,EDX]>; // EDX:EAX = signext(EAX)
2303
2304
2305//===----------------------------------------------------------------------===//
2306// Alias Instructions
2307//===----------------------------------------------------------------------===//
2308
2309// Alias instructions that map movr0 to xor.
2310// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengb783fa32007-07-19 01:14:50 +00002311def MOV8r0 : I<0x30, MRMInitReg, (outs GR8 :$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002312 "xor{b} $dst, $dst",
2313 [(set GR8:$dst, 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +00002314def MOV16r0 : I<0x31, MRMInitReg, (outs GR16:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002315 "xor{w} $dst, $dst",
2316 [(set GR16:$dst, 0)]>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002317def MOV32r0 : I<0x31, MRMInitReg, (outs GR32:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002318 "xor{l} $dst, $dst",
2319 [(set GR32:$dst, 0)]>;
2320
2321// Basic operations on GR16 / GR32 subclasses GR16_ and GR32_ which contains only
2322// those registers that have GR8 sub-registers (i.e. AX - DX, EAX - EDX).
Evan Chengb783fa32007-07-19 01:14:50 +00002323def MOV16to16_ : I<0x89, MRMDestReg, (outs GR16_:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002324 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002325def MOV32to32_ : I<0x89, MRMDestReg, (outs GR32_:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002326 "mov{l} {$src, $dst|$dst, $src}", []>;
2327
Evan Chengb783fa32007-07-19 01:14:50 +00002328def MOV16_rr : I<0x89, MRMDestReg, (outs GR16_:$dst), (ins GR16_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002329 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002330def MOV32_rr : I<0x89, MRMDestReg, (outs GR32_:$dst), (ins GR32_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002331 "mov{l} {$src, $dst|$dst, $src}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +00002332def MOV16_rm : I<0x8B, MRMSrcMem, (outs GR16_:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002333 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002334def MOV32_rm : I<0x8B, MRMSrcMem, (outs GR32_:$dst), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002335 "mov{l} {$src, $dst|$dst, $src}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +00002336def MOV16_mr : I<0x89, MRMDestMem, (outs), (ins i16mem:$dst, GR16_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002337 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Evan Chengb783fa32007-07-19 01:14:50 +00002338def MOV32_mr : I<0x89, MRMDestMem, (outs), (ins i32mem:$dst, GR32_:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002339 "mov{l} {$src, $dst|$dst, $src}", []>;
2340
2341//===----------------------------------------------------------------------===//
2342// Thread Local Storage Instructions
2343//
2344
Evan Chengb783fa32007-07-19 01:14:50 +00002345def TLS_addr : I<0, Pseudo, (outs GR32:$dst), (ins i32imm:$sym),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002346 "leal ${sym:mem}(,%ebx,1), $dst",
2347 [(set GR32:$dst, (X86tlsaddr tglobaltlsaddr:$sym))]>,
2348 Imp<[EBX],[]>;
2349
2350let AddedComplexity = 10 in
Evan Chengb783fa32007-07-19 01:14:50 +00002351def TLS_gs_rr : I<0, Pseudo, (outs GR32:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002352 "movl %gs:($src), $dst",
2353 [(set GR32:$dst, (load (add X86TLStp, GR32:$src)))]>;
2354
2355let AddedComplexity = 15 in
Evan Chengb783fa32007-07-19 01:14:50 +00002356def TLS_gs_ri : I<0, Pseudo, (outs GR32:$dst), (ins i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002357 "movl %gs:${src:mem}, $dst",
2358 [(set GR32:$dst,
2359 (load (add X86TLStp, (X86Wrapper tglobaltlsaddr:$src))))]>;
2360
Evan Chengb783fa32007-07-19 01:14:50 +00002361def TLS_tp : I<0, Pseudo, (outs GR32:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002362 "movl %gs:0, $dst",
2363 [(set GR32:$dst, X86TLStp)]>;
2364
2365//===----------------------------------------------------------------------===//
2366// DWARF Pseudo Instructions
2367//
2368
Evan Chengb783fa32007-07-19 01:14:50 +00002369def DWARF_LOC : I<0, Pseudo, (outs),
2370 (ins i32imm:$line, i32imm:$col, i32imm:$file),
Dan Gohmanf8133d72007-07-26 15:24:15 +00002371 "; .loc ${file:debug}, ${line:debug}, ${col:debug}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002372 [(dwarf_loc (i32 imm:$line), (i32 imm:$col),
2373 (i32 imm:$file))]>;
2374
2375//===----------------------------------------------------------------------===//
2376// EH Pseudo Instructions
2377//
2378let isTerminator = 1, isReturn = 1, isBarrier = 1,
Evan Cheng37e7c752007-07-21 00:34:19 +00002379 hasCtrlDep = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +00002380def EH_RETURN : I<0xC3, RawFrm, (outs), (ins GR32:$addr),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002381 "ret #eh_return, addr: $addr",
2382 [(X86ehret GR32:$addr)]>;
2383
2384}
2385
2386//===----------------------------------------------------------------------===//
2387// Non-Instruction Patterns
2388//===----------------------------------------------------------------------===//
2389
2390// ConstantPool GlobalAddress, ExternalSymbol, and JumpTable
2391def : Pat<(i32 (X86Wrapper tconstpool :$dst)), (MOV32ri tconstpool :$dst)>;
2392def : Pat<(i32 (X86Wrapper tjumptable :$dst)), (MOV32ri tjumptable :$dst)>;
2393def : Pat<(i32 (X86Wrapper tglobaltlsaddr:$dst)), (MOV32ri tglobaltlsaddr:$dst)>;
2394def : Pat<(i32 (X86Wrapper tglobaladdr :$dst)), (MOV32ri tglobaladdr :$dst)>;
2395def : Pat<(i32 (X86Wrapper texternalsym:$dst)), (MOV32ri texternalsym:$dst)>;
2396
2397def : Pat<(add GR32:$src1, (X86Wrapper tconstpool:$src2)),
2398 (ADD32ri GR32:$src1, tconstpool:$src2)>;
2399def : Pat<(add GR32:$src1, (X86Wrapper tjumptable:$src2)),
2400 (ADD32ri GR32:$src1, tjumptable:$src2)>;
2401def : Pat<(add GR32:$src1, (X86Wrapper tglobaladdr :$src2)),
2402 (ADD32ri GR32:$src1, tglobaladdr:$src2)>;
2403def : Pat<(add GR32:$src1, (X86Wrapper texternalsym:$src2)),
2404 (ADD32ri GR32:$src1, texternalsym:$src2)>;
2405
2406def : Pat<(store (i32 (X86Wrapper tglobaladdr:$src)), addr:$dst),
2407 (MOV32mi addr:$dst, tglobaladdr:$src)>;
2408def : Pat<(store (i32 (X86Wrapper texternalsym:$src)), addr:$dst),
2409 (MOV32mi addr:$dst, texternalsym:$src)>;
2410
2411// Calls
2412def : Pat<(X86tailcall GR32:$dst),
2413 (CALL32r GR32:$dst)>;
2414
2415def : Pat<(X86tailcall (i32 tglobaladdr:$dst)),
2416 (CALLpcrel32 tglobaladdr:$dst)>;
2417def : Pat<(X86tailcall (i32 texternalsym:$dst)),
2418 (CALLpcrel32 texternalsym:$dst)>;
2419
2420def : Pat<(X86call (i32 tglobaladdr:$dst)),
2421 (CALLpcrel32 tglobaladdr:$dst)>;
2422def : Pat<(X86call (i32 texternalsym:$dst)),
2423 (CALLpcrel32 texternalsym:$dst)>;
2424
2425// X86 specific add which produces a flag.
2426def : Pat<(addc GR32:$src1, GR32:$src2),
2427 (ADD32rr GR32:$src1, GR32:$src2)>;
2428def : Pat<(addc GR32:$src1, (load addr:$src2)),
2429 (ADD32rm GR32:$src1, addr:$src2)>;
2430def : Pat<(addc GR32:$src1, imm:$src2),
2431 (ADD32ri GR32:$src1, imm:$src2)>;
2432def : Pat<(addc GR32:$src1, i32immSExt8:$src2),
2433 (ADD32ri8 GR32:$src1, i32immSExt8:$src2)>;
2434
2435def : Pat<(subc GR32:$src1, GR32:$src2),
2436 (SUB32rr GR32:$src1, GR32:$src2)>;
2437def : Pat<(subc GR32:$src1, (load addr:$src2)),
2438 (SUB32rm GR32:$src1, addr:$src2)>;
2439def : Pat<(subc GR32:$src1, imm:$src2),
2440 (SUB32ri GR32:$src1, imm:$src2)>;
2441def : Pat<(subc GR32:$src1, i32immSExt8:$src2),
2442 (SUB32ri8 GR32:$src1, i32immSExt8:$src2)>;
2443
2444def : Pat<(truncstorei1 (i8 imm:$src), addr:$dst),
2445 (MOV8mi addr:$dst, imm:$src)>;
2446def : Pat<(truncstorei1 GR8:$src, addr:$dst),
2447 (MOV8mr addr:$dst, GR8:$src)>;
2448
2449// Comparisons.
2450
2451// TEST R,R is smaller than CMP R,0
2452def : Pat<(X86cmp GR8:$src1, 0),
2453 (TEST8rr GR8:$src1, GR8:$src1)>;
2454def : Pat<(X86cmp GR16:$src1, 0),
2455 (TEST16rr GR16:$src1, GR16:$src1)>;
2456def : Pat<(X86cmp GR32:$src1, 0),
2457 (TEST32rr GR32:$src1, GR32:$src1)>;
2458
2459// {s|z}extload bool -> {s|z}extload byte
2460def : Pat<(sextloadi16i1 addr:$src), (MOVSX16rm8 addr:$src)>;
2461def : Pat<(sextloadi32i1 addr:$src), (MOVSX32rm8 addr:$src)>;
2462def : Pat<(zextloadi8i1 addr:$src), (MOV8rm addr:$src)>;
2463def : Pat<(zextloadi16i1 addr:$src), (MOVZX16rm8 addr:$src)>;
2464def : Pat<(zextloadi32i1 addr:$src), (MOVZX32rm8 addr:$src)>;
2465
2466// extload bool -> extload byte
2467def : Pat<(extloadi8i1 addr:$src), (MOV8rm addr:$src)>;
2468def : Pat<(extloadi16i1 addr:$src), (MOVZX16rm8 addr:$src)>;
2469def : Pat<(extloadi32i1 addr:$src), (MOVZX32rm8 addr:$src)>;
2470def : Pat<(extloadi16i8 addr:$src), (MOVZX16rm8 addr:$src)>;
2471def : Pat<(extloadi32i8 addr:$src), (MOVZX32rm8 addr:$src)>;
2472def : Pat<(extloadi32i16 addr:$src), (MOVZX32rm16 addr:$src)>;
2473
2474// anyext -> zext
2475def : Pat<(i16 (anyext GR8 :$src)), (MOVZX16rr8 GR8 :$src)>;
2476def : Pat<(i32 (anyext GR8 :$src)), (MOVZX32rr8 GR8 :$src)>;
2477def : Pat<(i32 (anyext GR16:$src)), (MOVZX32rr16 GR16:$src)>;
2478def : Pat<(i16 (anyext (loadi8 addr:$src))), (MOVZX16rm8 addr:$src)>;
2479def : Pat<(i32 (anyext (loadi8 addr:$src))), (MOVZX32rm8 addr:$src)>;
2480def : Pat<(i32 (anyext (loadi16 addr:$src))), (MOVZX32rm16 addr:$src)>;
2481
2482//===----------------------------------------------------------------------===//
2483// Some peepholes
2484//===----------------------------------------------------------------------===//
2485
2486// (shl x, 1) ==> (add x, x)
2487def : Pat<(shl GR8 :$src1, (i8 1)), (ADD8rr GR8 :$src1, GR8 :$src1)>;
2488def : Pat<(shl GR16:$src1, (i8 1)), (ADD16rr GR16:$src1, GR16:$src1)>;
2489def : Pat<(shl GR32:$src1, (i8 1)), (ADD32rr GR32:$src1, GR32:$src1)>;
2490
2491// (or (x >> c) | (y << (32 - c))) ==> (shrd32 x, y, c)
2492def : Pat<(or (srl GR32:$src1, CL:$amt),
2493 (shl GR32:$src2, (sub 32, CL:$amt))),
2494 (SHRD32rrCL GR32:$src1, GR32:$src2)>;
2495
2496def : Pat<(store (or (srl (loadi32 addr:$dst), CL:$amt),
2497 (shl GR32:$src2, (sub 32, CL:$amt))), addr:$dst),
2498 (SHRD32mrCL addr:$dst, GR32:$src2)>;
2499
2500// (or (x << c) | (y >> (32 - c))) ==> (shld32 x, y, c)
2501def : Pat<(or (shl GR32:$src1, CL:$amt),
2502 (srl GR32:$src2, (sub 32, CL:$amt))),
2503 (SHLD32rrCL GR32:$src1, GR32:$src2)>;
2504
2505def : Pat<(store (or (shl (loadi32 addr:$dst), CL:$amt),
2506 (srl GR32:$src2, (sub 32, CL:$amt))), addr:$dst),
2507 (SHLD32mrCL addr:$dst, GR32:$src2)>;
2508
2509// (or (x >> c) | (y << (16 - c))) ==> (shrd16 x, y, c)
2510def : Pat<(or (srl GR16:$src1, CL:$amt),
2511 (shl GR16:$src2, (sub 16, CL:$amt))),
2512 (SHRD16rrCL GR16:$src1, GR16:$src2)>;
2513
2514def : Pat<(store (or (srl (loadi16 addr:$dst), CL:$amt),
2515 (shl GR16:$src2, (sub 16, CL:$amt))), addr:$dst),
2516 (SHRD16mrCL addr:$dst, GR16:$src2)>;
2517
2518// (or (x << c) | (y >> (16 - c))) ==> (shld16 x, y, c)
2519def : Pat<(or (shl GR16:$src1, CL:$amt),
2520 (srl GR16:$src2, (sub 16, CL:$amt))),
2521 (SHLD16rrCL GR16:$src1, GR16:$src2)>;
2522
2523def : Pat<(store (or (shl (loadi16 addr:$dst), CL:$amt),
2524 (srl GR16:$src2, (sub 16, CL:$amt))), addr:$dst),
2525 (SHLD16mrCL addr:$dst, GR16:$src2)>;
2526
2527
2528//===----------------------------------------------------------------------===//
2529// Floating Point Stack Support
2530//===----------------------------------------------------------------------===//
2531
2532include "X86InstrFPStack.td"
2533
2534//===----------------------------------------------------------------------===//
Evan Cheng86ab7d32007-07-31 08:04:03 +00002535// X86-64 Support
2536//===----------------------------------------------------------------------===//
2537
2538include "X86InstrX86-64.td"
2539
2540//===----------------------------------------------------------------------===//
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002541// MMX and XMM Packed Integer support (requires MMX, SSE, and SSE2)
2542//===----------------------------------------------------------------------===//
2543
2544include "X86InstrMMX.td"
2545
2546//===----------------------------------------------------------------------===//
2547// XMM Floating point support (requires SSE / SSE2)
2548//===----------------------------------------------------------------------===//
2549
2550include "X86InstrSSE.td"