blob: 30643dc80abb3757fb54ad3ec553ecb798f47b7b [file] [log] [blame]
Chris Lattner6367cfc2010-10-05 16:39:12 +00001//===- X86InstrArithmetic.td - Integer Arithmetic Instrs ---*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the integer arithmetic instructions in the X86
11// architecture.
12//
13//===----------------------------------------------------------------------===//
14
15//===----------------------------------------------------------------------===//
16// LEA - Load Effective Address
17
18let neverHasSideEffects = 1 in
19def LEA16r : I<0x8D, MRMSrcMem,
20 (outs GR16:$dst), (ins i32mem:$src),
21 "lea{w}\t{$src|$dst}, {$dst|$src}", []>, OpSize;
22let isReMaterializable = 1 in
23def LEA32r : I<0x8D, MRMSrcMem,
24 (outs GR32:$dst), (ins i32mem:$src),
25 "lea{l}\t{$src|$dst}, {$dst|$src}",
26 [(set GR32:$dst, lea32addr:$src)]>, Requires<[In32BitMode]>;
27
28def LEA64_32r : I<0x8D, MRMSrcMem,
29 (outs GR32:$dst), (ins lea64_32mem:$src),
30 "lea{l}\t{$src|$dst}, {$dst|$src}",
31 [(set GR32:$dst, lea32addr:$src)]>, Requires<[In64BitMode]>;
32
33let isReMaterializable = 1 in
34def LEA64r : RI<0x8D, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
35 "lea{q}\t{$src|$dst}, {$dst|$src}",
36 [(set GR64:$dst, lea64addr:$src)]>;
37
38
39
40//===----------------------------------------------------------------------===//
41// Fixed-Register Multiplication and Division Instructions.
42//
43
44// Extra precision multiplication
45
46// AL is really implied by AX, but the registers in Defs must match the
47// SDNode results (i8, i32).
48let Defs = [AL,EFLAGS,AX], Uses = [AL] in
49def MUL8r : I<0xF6, MRM4r, (outs), (ins GR8:$src), "mul{b}\t$src",
50 // FIXME: Used for 8-bit mul, ignore result upper 8 bits.
51 // This probably ought to be moved to a def : Pat<> if the
52 // syntax can be accepted.
53 [(set AL, (mul AL, GR8:$src)),
54 (implicit EFLAGS)]>; // AL,AH = AL*GR8
55
56let Defs = [AX,DX,EFLAGS], Uses = [AX], neverHasSideEffects = 1 in
57def MUL16r : I<0xF7, MRM4r, (outs), (ins GR16:$src),
58 "mul{w}\t$src",
59 []>, OpSize; // AX,DX = AX*GR16
60
61let Defs = [EAX,EDX,EFLAGS], Uses = [EAX], neverHasSideEffects = 1 in
62def MUL32r : I<0xF7, MRM4r, (outs), (ins GR32:$src),
63 "mul{l}\t$src",
64 []>; // EAX,EDX = EAX*GR32
65
66let Defs = [AL,EFLAGS,AX], Uses = [AL] in
67def MUL8m : I<0xF6, MRM4m, (outs), (ins i8mem :$src),
68 "mul{b}\t$src",
69 // FIXME: Used for 8-bit mul, ignore result upper 8 bits.
70 // This probably ought to be moved to a def : Pat<> if the
71 // syntax can be accepted.
72 [(set AL, (mul AL, (loadi8 addr:$src))),
73 (implicit EFLAGS)]>; // AL,AH = AL*[mem8]
74
75let mayLoad = 1, neverHasSideEffects = 1 in {
76let Defs = [AX,DX,EFLAGS], Uses = [AX] in
77def MUL16m : I<0xF7, MRM4m, (outs), (ins i16mem:$src),
78 "mul{w}\t$src",
79 []>, OpSize; // AX,DX = AX*[mem16]
80
81let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
82def MUL32m : I<0xF7, MRM4m, (outs), (ins i32mem:$src),
83 "mul{l}\t$src",
84 []>; // EAX,EDX = EAX*[mem32]
85}
86
87let neverHasSideEffects = 1 in {
88let Defs = [AL,EFLAGS,AX], Uses = [AL] in
89def IMUL8r : I<0xF6, MRM5r, (outs), (ins GR8:$src), "imul{b}\t$src", []>;
90 // AL,AH = AL*GR8
91let Defs = [AX,DX,EFLAGS], Uses = [AX] in
92def IMUL16r : I<0xF7, MRM5r, (outs), (ins GR16:$src), "imul{w}\t$src", []>,
93 OpSize; // AX,DX = AX*GR16
94let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
95def IMUL32r : I<0xF7, MRM5r, (outs), (ins GR32:$src), "imul{l}\t$src", []>;
96 // EAX,EDX = EAX*GR32
97let mayLoad = 1 in {
98let Defs = [AL,EFLAGS,AX], Uses = [AL] in
99def IMUL8m : I<0xF6, MRM5m, (outs), (ins i8mem :$src),
100 "imul{b}\t$src", []>; // AL,AH = AL*[mem8]
101let Defs = [AX,DX,EFLAGS], Uses = [AX] in
102def IMUL16m : I<0xF7, MRM5m, (outs), (ins i16mem:$src),
103 "imul{w}\t$src", []>, OpSize; // AX,DX = AX*[mem16]
104let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
105def IMUL32m : I<0xF7, MRM5m, (outs), (ins i32mem:$src),
106 "imul{l}\t$src", []>; // EAX,EDX = EAX*[mem32]
107}
108} // neverHasSideEffects
109
110// unsigned division/remainder
111let Defs = [AL,EFLAGS,AX], Uses = [AX] in
112def DIV8r : I<0xF6, MRM6r, (outs), (ins GR8:$src), // AX/r8 = AL,AH
113 "div{b}\t$src", []>;
114let Defs = [AX,DX,EFLAGS], Uses = [AX,DX] in
115def DIV16r : I<0xF7, MRM6r, (outs), (ins GR16:$src), // DX:AX/r16 = AX,DX
116 "div{w}\t$src", []>, OpSize;
117let Defs = [EAX,EDX,EFLAGS], Uses = [EAX,EDX] in
118def DIV32r : I<0xF7, MRM6r, (outs), (ins GR32:$src), // EDX:EAX/r32 = EAX,EDX
119 "div{l}\t$src", []>;
120let mayLoad = 1 in {
121let Defs = [AL,EFLAGS,AX], Uses = [AX] in
122def DIV8m : I<0xF6, MRM6m, (outs), (ins i8mem:$src), // AX/[mem8] = AL,AH
123 "div{b}\t$src", []>;
124let Defs = [AX,DX,EFLAGS], Uses = [AX,DX] in
125def DIV16m : I<0xF7, MRM6m, (outs), (ins i16mem:$src), // DX:AX/[mem16] = AX,DX
126 "div{w}\t$src", []>, OpSize;
127let Defs = [EAX,EDX,EFLAGS], Uses = [EAX,EDX] in
128 // EDX:EAX/[mem32] = EAX,EDX
129def DIV32m : I<0xF7, MRM6m, (outs), (ins i32mem:$src),
130 "div{l}\t$src", []>;
131}
132
133// Signed division/remainder.
134let Defs = [AL,EFLAGS,AX], Uses = [AX] in
135def IDIV8r : I<0xF6, MRM7r, (outs), (ins GR8:$src), // AX/r8 = AL,AH
136 "idiv{b}\t$src", []>;
137let Defs = [AX,DX,EFLAGS], Uses = [AX,DX] in
138def IDIV16r: I<0xF7, MRM7r, (outs), (ins GR16:$src), // DX:AX/r16 = AX,DX
139 "idiv{w}\t$src", []>, OpSize;
140let Defs = [EAX,EDX,EFLAGS], Uses = [EAX,EDX] in
141def IDIV32r: I<0xF7, MRM7r, (outs), (ins GR32:$src), // EDX:EAX/r32 = EAX,EDX
142 "idiv{l}\t$src", []>;
143let mayLoad = 1, mayLoad = 1 in {
144let Defs = [AL,EFLAGS,AX], Uses = [AX] in
145def IDIV8m : I<0xF6, MRM7m, (outs), (ins i8mem:$src), // AX/[mem8] = AL,AH
146 "idiv{b}\t$src", []>;
147let Defs = [AX,DX,EFLAGS], Uses = [AX,DX] in
148def IDIV16m: I<0xF7, MRM7m, (outs), (ins i16mem:$src), // DX:AX/[mem16] = AX,DX
149 "idiv{w}\t$src", []>, OpSize;
150let Defs = [EAX,EDX,EFLAGS], Uses = [EAX,EDX] in
151def IDIV32m: I<0xF7, MRM7m, (outs), (ins i32mem:$src),
152 // EDX:EAX/[mem32] = EAX,EDX
153 "idiv{l}\t$src", []>;
154}
155
156//===----------------------------------------------------------------------===//
157// Two address Instructions.
158//
Chris Lattner6367cfc2010-10-05 16:39:12 +0000159
160// unary instructions
161let CodeSize = 2 in {
162let Defs = [EFLAGS] in {
Chris Lattnerc7d46552010-10-05 16:52:25 +0000163let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000164def NEG8r : I<0xF6, MRM3r, (outs GR8 :$dst), (ins GR8 :$src1),
165 "neg{b}\t$dst",
166 [(set GR8:$dst, (ineg GR8:$src1)),
167 (implicit EFLAGS)]>;
168def NEG16r : I<0xF7, MRM3r, (outs GR16:$dst), (ins GR16:$src1),
169 "neg{w}\t$dst",
170 [(set GR16:$dst, (ineg GR16:$src1)),
171 (implicit EFLAGS)]>, OpSize;
172def NEG32r : I<0xF7, MRM3r, (outs GR32:$dst), (ins GR32:$src1),
173 "neg{l}\t$dst",
174 [(set GR32:$dst, (ineg GR32:$src1)),
175 (implicit EFLAGS)]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000176} // Constraints = "$src1 = $dst"
177
178def NEG8m : I<0xF6, MRM3m, (outs), (ins i8mem :$dst),
179 "neg{b}\t$dst",
180 [(store (ineg (loadi8 addr:$dst)), addr:$dst),
181 (implicit EFLAGS)]>;
182def NEG16m : I<0xF7, MRM3m, (outs), (ins i16mem:$dst),
183 "neg{w}\t$dst",
184 [(store (ineg (loadi16 addr:$dst)), addr:$dst),
185 (implicit EFLAGS)]>, OpSize;
186def NEG32m : I<0xF7, MRM3m, (outs), (ins i32mem:$dst),
187 "neg{l}\t$dst",
188 [(store (ineg (loadi32 addr:$dst)), addr:$dst),
189 (implicit EFLAGS)]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000190} // Defs = [EFLAGS]
191
Chris Lattnerc7d46552010-10-05 16:52:25 +0000192
193// FIXME: NOT sets EFLAGS!
194
195let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000196// Match xor -1 to not. Favors these over a move imm + xor to save code size.
197let AddedComplexity = 15 in {
198def NOT8r : I<0xF6, MRM2r, (outs GR8 :$dst), (ins GR8 :$src1),
199 "not{b}\t$dst",
200 [(set GR8:$dst, (not GR8:$src1))]>;
201def NOT16r : I<0xF7, MRM2r, (outs GR16:$dst), (ins GR16:$src1),
202 "not{w}\t$dst",
203 [(set GR16:$dst, (not GR16:$src1))]>, OpSize;
204def NOT32r : I<0xF7, MRM2r, (outs GR32:$dst), (ins GR32:$src1),
205 "not{l}\t$dst",
206 [(set GR32:$dst, (not GR32:$src1))]>;
207}
Chris Lattnerc7d46552010-10-05 16:52:25 +0000208} // Constraints = "$src1 = $dst"
209
210def NOT8m : I<0xF6, MRM2m, (outs), (ins i8mem :$dst),
211 "not{b}\t$dst",
212 [(store (not (loadi8 addr:$dst)), addr:$dst)]>;
213def NOT16m : I<0xF7, MRM2m, (outs), (ins i16mem:$dst),
214 "not{w}\t$dst",
215 [(store (not (loadi16 addr:$dst)), addr:$dst)]>, OpSize;
216def NOT32m : I<0xF7, MRM2m, (outs), (ins i32mem:$dst),
217 "not{l}\t$dst",
218 [(store (not (loadi32 addr:$dst)), addr:$dst)]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000219} // CodeSize
220
221// TODO: inc/dec is slow for P4, but fast for Pentium-M.
222let Defs = [EFLAGS] in {
Chris Lattnerc7d46552010-10-05 16:52:25 +0000223let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000224let CodeSize = 2 in
225def INC8r : I<0xFE, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1),
226 "inc{b}\t$dst",
227 [(set GR8:$dst, EFLAGS, (X86inc_flag GR8:$src1))]>;
228
229let isConvertibleToThreeAddress = 1, CodeSize = 1 in { // Can xform into LEA.
230def INC16r : I<0x40, AddRegFrm, (outs GR16:$dst), (ins GR16:$src1),
231 "inc{w}\t$dst",
232 [(set GR16:$dst, EFLAGS, (X86inc_flag GR16:$src1))]>,
233 OpSize, Requires<[In32BitMode]>;
234def INC32r : I<0x40, AddRegFrm, (outs GR32:$dst), (ins GR32:$src1),
235 "inc{l}\t$dst",
236 [(set GR32:$dst, EFLAGS, (X86inc_flag GR32:$src1))]>,
237 Requires<[In32BitMode]>;
238}
Chris Lattnerc7d46552010-10-05 16:52:25 +0000239} // Constraints = "$src1 = $dst"
240
241let CodeSize = 2 in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000242 def INC8m : I<0xFE, MRM0m, (outs), (ins i8mem :$dst), "inc{b}\t$dst",
243 [(store (add (loadi8 addr:$dst), 1), addr:$dst),
244 (implicit EFLAGS)]>;
245 def INC16m : I<0xFF, MRM0m, (outs), (ins i16mem:$dst), "inc{w}\t$dst",
246 [(store (add (loadi16 addr:$dst), 1), addr:$dst),
247 (implicit EFLAGS)]>,
248 OpSize, Requires<[In32BitMode]>;
249 def INC32m : I<0xFF, MRM0m, (outs), (ins i32mem:$dst), "inc{l}\t$dst",
250 [(store (add (loadi32 addr:$dst), 1), addr:$dst),
251 (implicit EFLAGS)]>,
252 Requires<[In32BitMode]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000253} // CodeSize = 2
Chris Lattner6367cfc2010-10-05 16:39:12 +0000254
Chris Lattnerc7d46552010-10-05 16:52:25 +0000255let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000256let CodeSize = 2 in
257def DEC8r : I<0xFE, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1),
258 "dec{b}\t$dst",
259 [(set GR8:$dst, EFLAGS, (X86dec_flag GR8:$src1))]>;
260let isConvertibleToThreeAddress = 1, CodeSize = 1 in { // Can xform into LEA.
261def DEC16r : I<0x48, AddRegFrm, (outs GR16:$dst), (ins GR16:$src1),
262 "dec{w}\t$dst",
263 [(set GR16:$dst, EFLAGS, (X86dec_flag GR16:$src1))]>,
264 OpSize, Requires<[In32BitMode]>;
265def DEC32r : I<0x48, AddRegFrm, (outs GR32:$dst), (ins GR32:$src1),
266 "dec{l}\t$dst",
267 [(set GR32:$dst, EFLAGS, (X86dec_flag GR32:$src1))]>,
268 Requires<[In32BitMode]>;
269} // CodeSize = 2
Chris Lattnerc7d46552010-10-05 16:52:25 +0000270} // Constraints = "$src1 = $dst"
Chris Lattner6367cfc2010-10-05 16:39:12 +0000271
Chris Lattnerc7d46552010-10-05 16:52:25 +0000272
273let CodeSize = 2 in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000274 def DEC8m : I<0xFE, MRM1m, (outs), (ins i8mem :$dst), "dec{b}\t$dst",
275 [(store (add (loadi8 addr:$dst), -1), addr:$dst),
276 (implicit EFLAGS)]>;
277 def DEC16m : I<0xFF, MRM1m, (outs), (ins i16mem:$dst), "dec{w}\t$dst",
278 [(store (add (loadi16 addr:$dst), -1), addr:$dst),
279 (implicit EFLAGS)]>,
280 OpSize, Requires<[In32BitMode]>;
281 def DEC32m : I<0xFF, MRM1m, (outs), (ins i32mem:$dst), "dec{l}\t$dst",
282 [(store (add (loadi32 addr:$dst), -1), addr:$dst),
283 (implicit EFLAGS)]>,
284 Requires<[In32BitMode]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000285} // CodeSize = 2
Chris Lattner6367cfc2010-10-05 16:39:12 +0000286} // Defs = [EFLAGS]
287
Chris Lattnerc7d46552010-10-05 16:52:25 +0000288// Logical operators.
Chris Lattner6367cfc2010-10-05 16:39:12 +0000289let Defs = [EFLAGS] in {
Chris Lattnerc7d46552010-10-05 16:52:25 +0000290let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000291let isCommutable = 1 in { // X = AND Y, Z --> X = AND Z, Y
292def AND8rr : I<0x20, MRMDestReg,
293 (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
294 "and{b}\t{$src2, $dst|$dst, $src2}",
295 [(set GR8:$dst, EFLAGS, (X86and_flag GR8:$src1, GR8:$src2))]>;
296def AND16rr : I<0x21, MRMDestReg,
297 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
298 "and{w}\t{$src2, $dst|$dst, $src2}",
299 [(set GR16:$dst, EFLAGS, (X86and_flag GR16:$src1,
300 GR16:$src2))]>, OpSize;
301def AND32rr : I<0x21, MRMDestReg,
302 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
303 "and{l}\t{$src2, $dst|$dst, $src2}",
304 [(set GR32:$dst, EFLAGS, (X86and_flag GR32:$src1,
305 GR32:$src2))]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000306} // isCommutable
307
Chris Lattner6367cfc2010-10-05 16:39:12 +0000308
309// AND instructions with the destination register in REG and the source register
310// in R/M. Included for the disassembler.
311let isCodeGenOnly = 1 in {
312def AND8rr_REV : I<0x22, MRMSrcReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
313 "and{b}\t{$src2, $dst|$dst, $src2}", []>;
314def AND16rr_REV : I<0x23, MRMSrcReg, (outs GR16:$dst),
315 (ins GR16:$src1, GR16:$src2),
316 "and{w}\t{$src2, $dst|$dst, $src2}", []>, OpSize;
317def AND32rr_REV : I<0x23, MRMSrcReg, (outs GR32:$dst),
318 (ins GR32:$src1, GR32:$src2),
319 "and{l}\t{$src2, $dst|$dst, $src2}", []>;
320}
321
322def AND8rm : I<0x22, MRMSrcMem,
323 (outs GR8 :$dst), (ins GR8 :$src1, i8mem :$src2),
324 "and{b}\t{$src2, $dst|$dst, $src2}",
325 [(set GR8:$dst, EFLAGS, (X86and_flag GR8:$src1,
326 (loadi8 addr:$src2)))]>;
327def AND16rm : I<0x23, MRMSrcMem,
328 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
329 "and{w}\t{$src2, $dst|$dst, $src2}",
330 [(set GR16:$dst, EFLAGS, (X86and_flag GR16:$src1,
331 (loadi16 addr:$src2)))]>,
332 OpSize;
333def AND32rm : I<0x23, MRMSrcMem,
334 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
335 "and{l}\t{$src2, $dst|$dst, $src2}",
336 [(set GR32:$dst, EFLAGS, (X86and_flag GR32:$src1,
337 (loadi32 addr:$src2)))]>;
338
339def AND8ri : Ii8<0x80, MRM4r,
340 (outs GR8 :$dst), (ins GR8 :$src1, i8imm :$src2),
341 "and{b}\t{$src2, $dst|$dst, $src2}",
342 [(set GR8:$dst, EFLAGS, (X86and_flag GR8:$src1,
343 imm:$src2))]>;
344def AND16ri : Ii16<0x81, MRM4r,
345 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
346 "and{w}\t{$src2, $dst|$dst, $src2}",
347 [(set GR16:$dst, EFLAGS, (X86and_flag GR16:$src1,
348 imm:$src2))]>, OpSize;
349def AND32ri : Ii32<0x81, MRM4r,
350 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
351 "and{l}\t{$src2, $dst|$dst, $src2}",
352 [(set GR32:$dst, EFLAGS, (X86and_flag GR32:$src1,
353 imm:$src2))]>;
354def AND16ri8 : Ii8<0x83, MRM4r,
355 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
356 "and{w}\t{$src2, $dst|$dst, $src2}",
357 [(set GR16:$dst, EFLAGS, (X86and_flag GR16:$src1,
358 i16immSExt8:$src2))]>,
359 OpSize;
360def AND32ri8 : Ii8<0x83, MRM4r,
361 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
362 "and{l}\t{$src2, $dst|$dst, $src2}",
363 [(set GR32:$dst, EFLAGS, (X86and_flag GR32:$src1,
364 i32immSExt8:$src2))]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000365} // Constraints = "$src1 = $dst"
Chris Lattner6367cfc2010-10-05 16:39:12 +0000366
Chris Lattnerc7d46552010-10-05 16:52:25 +0000367def AND8mr : I<0x20, MRMDestMem,
368 (outs), (ins i8mem :$dst, GR8 :$src),
369 "and{b}\t{$src, $dst|$dst, $src}",
370 [(store (and (load addr:$dst), GR8:$src), addr:$dst),
371 (implicit EFLAGS)]>;
372def AND16mr : I<0x21, MRMDestMem,
373 (outs), (ins i16mem:$dst, GR16:$src),
374 "and{w}\t{$src, $dst|$dst, $src}",
375 [(store (and (load addr:$dst), GR16:$src), addr:$dst),
376 (implicit EFLAGS)]>,
377 OpSize;
378def AND32mr : I<0x21, MRMDestMem,
379 (outs), (ins i32mem:$dst, GR32:$src),
380 "and{l}\t{$src, $dst|$dst, $src}",
381 [(store (and (load addr:$dst), GR32:$src), addr:$dst),
382 (implicit EFLAGS)]>;
383def AND8mi : Ii8<0x80, MRM4m,
384 (outs), (ins i8mem :$dst, i8imm :$src),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000385 "and{b}\t{$src, $dst|$dst, $src}",
Chris Lattnerc7d46552010-10-05 16:52:25 +0000386 [(store (and (loadi8 addr:$dst), imm:$src), addr:$dst),
387 (implicit EFLAGS)]>;
388def AND16mi : Ii16<0x81, MRM4m,
389 (outs), (ins i16mem:$dst, i16imm:$src),
390 "and{w}\t{$src, $dst|$dst, $src}",
391 [(store (and (loadi16 addr:$dst), imm:$src), addr:$dst),
392 (implicit EFLAGS)]>,
393 OpSize;
394def AND32mi : Ii32<0x81, MRM4m,
395 (outs), (ins i32mem:$dst, i32imm:$src),
396 "and{l}\t{$src, $dst|$dst, $src}",
397 [(store (and (loadi32 addr:$dst), imm:$src), addr:$dst),
398 (implicit EFLAGS)]>;
399def AND16mi8 : Ii8<0x83, MRM4m,
400 (outs), (ins i16mem:$dst, i16i8imm :$src),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000401 "and{w}\t{$src, $dst|$dst, $src}",
Chris Lattnerc7d46552010-10-05 16:52:25 +0000402 [(store (and (load addr:$dst), i16immSExt8:$src), addr:$dst),
403 (implicit EFLAGS)]>,
Chris Lattner6367cfc2010-10-05 16:39:12 +0000404 OpSize;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000405def AND32mi8 : Ii8<0x83, MRM4m,
406 (outs), (ins i32mem:$dst, i32i8imm :$src),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000407 "and{l}\t{$src, $dst|$dst, $src}",
Chris Lattnerc7d46552010-10-05 16:52:25 +0000408 [(store (and (load addr:$dst), i32immSExt8:$src), addr:$dst),
409 (implicit EFLAGS)]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000410
Chris Lattnerc7d46552010-10-05 16:52:25 +0000411// FIXME: Implicitly modifiers AL.
412def AND8i8 : Ii8<0x24, RawFrm, (outs), (ins i8imm:$src),
413 "and{b}\t{$src, %al|%al, $src}", []>;
414def AND16i16 : Ii16<0x25, RawFrm, (outs), (ins i16imm:$src),
415 "and{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
416def AND32i32 : Ii32<0x25, RawFrm, (outs), (ins i32imm:$src),
417 "and{l}\t{$src, %eax|%eax, $src}", []>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000418
Chris Lattnerc7d46552010-10-05 16:52:25 +0000419let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000420
421let isCommutable = 1 in { // X = OR Y, Z --> X = OR Z, Y
422def OR8rr : I<0x08, MRMDestReg, (outs GR8 :$dst),
423 (ins GR8 :$src1, GR8 :$src2),
424 "or{b}\t{$src2, $dst|$dst, $src2}",
425 [(set GR8:$dst, EFLAGS, (X86or_flag GR8:$src1, GR8:$src2))]>;
426def OR16rr : I<0x09, MRMDestReg, (outs GR16:$dst),
427 (ins GR16:$src1, GR16:$src2),
428 "or{w}\t{$src2, $dst|$dst, $src2}",
429 [(set GR16:$dst, EFLAGS, (X86or_flag GR16:$src1,GR16:$src2))]>,
430 OpSize;
431def OR32rr : I<0x09, MRMDestReg, (outs GR32:$dst),
432 (ins GR32:$src1, GR32:$src2),
433 "or{l}\t{$src2, $dst|$dst, $src2}",
434 [(set GR32:$dst, EFLAGS, (X86or_flag GR32:$src1,GR32:$src2))]>;
435}
436
437// OR instructions with the destination register in REG and the source register
438// in R/M. Included for the disassembler.
439let isCodeGenOnly = 1 in {
440def OR8rr_REV : I<0x0A, MRMSrcReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
441 "or{b}\t{$src2, $dst|$dst, $src2}", []>;
442def OR16rr_REV : I<0x0B, MRMSrcReg, (outs GR16:$dst),
443 (ins GR16:$src1, GR16:$src2),
444 "or{w}\t{$src2, $dst|$dst, $src2}", []>, OpSize;
445def OR32rr_REV : I<0x0B, MRMSrcReg, (outs GR32:$dst),
446 (ins GR32:$src1, GR32:$src2),
447 "or{l}\t{$src2, $dst|$dst, $src2}", []>;
448}
449
450def OR8rm : I<0x0A, MRMSrcMem, (outs GR8 :$dst),
451 (ins GR8 :$src1, i8mem :$src2),
452 "or{b}\t{$src2, $dst|$dst, $src2}",
453 [(set GR8:$dst, EFLAGS, (X86or_flag GR8:$src1,
454 (load addr:$src2)))]>;
455def OR16rm : I<0x0B, MRMSrcMem, (outs GR16:$dst),
456 (ins GR16:$src1, i16mem:$src2),
457 "or{w}\t{$src2, $dst|$dst, $src2}",
458 [(set GR16:$dst, EFLAGS, (X86or_flag GR16:$src1,
459 (load addr:$src2)))]>,
460 OpSize;
461def OR32rm : I<0x0B, MRMSrcMem, (outs GR32:$dst),
462 (ins GR32:$src1, i32mem:$src2),
463 "or{l}\t{$src2, $dst|$dst, $src2}",
464 [(set GR32:$dst, EFLAGS, (X86or_flag GR32:$src1,
465 (load addr:$src2)))]>;
466
467def OR8ri : Ii8 <0x80, MRM1r, (outs GR8 :$dst),
468 (ins GR8 :$src1, i8imm:$src2),
469 "or{b}\t{$src2, $dst|$dst, $src2}",
470 [(set GR8:$dst,EFLAGS, (X86or_flag GR8:$src1, imm:$src2))]>;
471def OR16ri : Ii16<0x81, MRM1r, (outs GR16:$dst),
472 (ins GR16:$src1, i16imm:$src2),
473 "or{w}\t{$src2, $dst|$dst, $src2}",
474 [(set GR16:$dst, EFLAGS, (X86or_flag GR16:$src1,
475 imm:$src2))]>, OpSize;
476def OR32ri : Ii32<0x81, MRM1r, (outs GR32:$dst),
477 (ins GR32:$src1, i32imm:$src2),
478 "or{l}\t{$src2, $dst|$dst, $src2}",
479 [(set GR32:$dst, EFLAGS, (X86or_flag GR32:$src1,
480 imm:$src2))]>;
481
482def OR16ri8 : Ii8<0x83, MRM1r, (outs GR16:$dst),
483 (ins GR16:$src1, i16i8imm:$src2),
484 "or{w}\t{$src2, $dst|$dst, $src2}",
485 [(set GR16:$dst, EFLAGS, (X86or_flag GR16:$src1,
486 i16immSExt8:$src2))]>, OpSize;
487def OR32ri8 : Ii8<0x83, MRM1r, (outs GR32:$dst),
488 (ins GR32:$src1, i32i8imm:$src2),
489 "or{l}\t{$src2, $dst|$dst, $src2}",
490 [(set GR32:$dst, EFLAGS, (X86or_flag GR32:$src1,
491 i32immSExt8:$src2))]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000492} // Constraints = "$src1 = $dst"
Chris Lattner6367cfc2010-10-05 16:39:12 +0000493
Chris Lattnerc7d46552010-10-05 16:52:25 +0000494def OR8mr : I<0x08, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src),
495 "or{b}\t{$src, $dst|$dst, $src}",
496 [(store (or (load addr:$dst), GR8:$src), addr:$dst),
497 (implicit EFLAGS)]>;
498def OR16mr : I<0x09, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
499 "or{w}\t{$src, $dst|$dst, $src}",
500 [(store (or (load addr:$dst), GR16:$src), addr:$dst),
501 (implicit EFLAGS)]>, OpSize;
502def OR32mr : I<0x09, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
503 "or{l}\t{$src, $dst|$dst, $src}",
504 [(store (or (load addr:$dst), GR32:$src), addr:$dst),
505 (implicit EFLAGS)]>;
506def OR8mi : Ii8<0x80, MRM1m, (outs), (ins i8mem :$dst, i8imm:$src),
507 "or{b}\t{$src, $dst|$dst, $src}",
508 [(store (or (loadi8 addr:$dst), imm:$src), addr:$dst),
509 (implicit EFLAGS)]>;
510def OR16mi : Ii16<0x81, MRM1m, (outs), (ins i16mem:$dst, i16imm:$src),
511 "or{w}\t{$src, $dst|$dst, $src}",
512 [(store (or (loadi16 addr:$dst), imm:$src), addr:$dst),
513 (implicit EFLAGS)]>,
514 OpSize;
515def OR32mi : Ii32<0x81, MRM1m, (outs), (ins i32mem:$dst, i32imm:$src),
516 "or{l}\t{$src, $dst|$dst, $src}",
517 [(store (or (loadi32 addr:$dst), imm:$src), addr:$dst),
518 (implicit EFLAGS)]>;
519def OR16mi8 : Ii8<0x83, MRM1m, (outs), (ins i16mem:$dst, i16i8imm:$src),
520 "or{w}\t{$src, $dst|$dst, $src}",
521 [(store (or (load addr:$dst), i16immSExt8:$src), addr:$dst),
522 (implicit EFLAGS)]>,
523 OpSize;
524def OR32mi8 : Ii8<0x83, MRM1m, (outs), (ins i32mem:$dst, i32i8imm:$src),
525 "or{l}\t{$src, $dst|$dst, $src}",
526 [(store (or (load addr:$dst), i32immSExt8:$src), addr:$dst),
527 (implicit EFLAGS)]>;
528
529def OR8i8 : Ii8 <0x0C, RawFrm, (outs), (ins i8imm:$src),
530 "or{b}\t{$src, %al|%al, $src}", []>;
531def OR16i16 : Ii16 <0x0D, RawFrm, (outs), (ins i16imm:$src),
532 "or{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
533def OR32i32 : Ii32 <0x0D, RawFrm, (outs), (ins i32imm:$src),
534 "or{l}\t{$src, %eax|%eax, $src}", []>;
535
536
537let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000538
539let isCommutable = 1 in { // X = XOR Y, Z --> X = XOR Z, Y
540 def XOR8rr : I<0x30, MRMDestReg,
541 (outs GR8 :$dst), (ins GR8 :$src1, GR8 :$src2),
542 "xor{b}\t{$src2, $dst|$dst, $src2}",
543 [(set GR8:$dst, EFLAGS, (X86xor_flag GR8:$src1,
544 GR8:$src2))]>;
545 def XOR16rr : I<0x31, MRMDestReg,
546 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
547 "xor{w}\t{$src2, $dst|$dst, $src2}",
548 [(set GR16:$dst, EFLAGS, (X86xor_flag GR16:$src1,
549 GR16:$src2))]>, OpSize;
550 def XOR32rr : I<0x31, MRMDestReg,
551 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
552 "xor{l}\t{$src2, $dst|$dst, $src2}",
553 [(set GR32:$dst, EFLAGS, (X86xor_flag GR32:$src1,
554 GR32:$src2))]>;
555} // isCommutable = 1
556
557// XOR instructions with the destination register in REG and the source register
558// in R/M. Included for the disassembler.
559let isCodeGenOnly = 1 in {
560def XOR8rr_REV : I<0x32, MRMSrcReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
561 "xor{b}\t{$src2, $dst|$dst, $src2}", []>;
562def XOR16rr_REV : I<0x33, MRMSrcReg, (outs GR16:$dst),
563 (ins GR16:$src1, GR16:$src2),
564 "xor{w}\t{$src2, $dst|$dst, $src2}", []>, OpSize;
565def XOR32rr_REV : I<0x33, MRMSrcReg, (outs GR32:$dst),
566 (ins GR32:$src1, GR32:$src2),
567 "xor{l}\t{$src2, $dst|$dst, $src2}", []>;
568}
569
570def XOR8rm : I<0x32, MRMSrcMem,
571 (outs GR8 :$dst), (ins GR8:$src1, i8mem :$src2),
572 "xor{b}\t{$src2, $dst|$dst, $src2}",
573 [(set GR8:$dst, EFLAGS, (X86xor_flag GR8:$src1,
574 (load addr:$src2)))]>;
575def XOR16rm : I<0x33, MRMSrcMem,
576 (outs GR16:$dst), (ins GR16:$src1, i16mem:$src2),
577 "xor{w}\t{$src2, $dst|$dst, $src2}",
578 [(set GR16:$dst, EFLAGS, (X86xor_flag GR16:$src1,
579 (load addr:$src2)))]>,
580 OpSize;
581def XOR32rm : I<0x33, MRMSrcMem,
582 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
583 "xor{l}\t{$src2, $dst|$dst, $src2}",
584 [(set GR32:$dst, EFLAGS, (X86xor_flag GR32:$src1,
585 (load addr:$src2)))]>;
586
587def XOR8ri : Ii8<0x80, MRM6r,
588 (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
589 "xor{b}\t{$src2, $dst|$dst, $src2}",
590 [(set GR8:$dst, EFLAGS, (X86xor_flag GR8:$src1, imm:$src2))]>;
591def XOR16ri : Ii16<0x81, MRM6r,
592 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
593 "xor{w}\t{$src2, $dst|$dst, $src2}",
594 [(set GR16:$dst, EFLAGS, (X86xor_flag GR16:$src1,
595 imm:$src2))]>, OpSize;
596def XOR32ri : Ii32<0x81, MRM6r,
597 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
598 "xor{l}\t{$src2, $dst|$dst, $src2}",
599 [(set GR32:$dst, EFLAGS, (X86xor_flag GR32:$src1,
600 imm:$src2))]>;
601def XOR16ri8 : Ii8<0x83, MRM6r,
602 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
603 "xor{w}\t{$src2, $dst|$dst, $src2}",
604 [(set GR16:$dst, EFLAGS, (X86xor_flag GR16:$src1,
605 i16immSExt8:$src2))]>,
606 OpSize;
607def XOR32ri8 : Ii8<0x83, MRM6r,
608 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
609 "xor{l}\t{$src2, $dst|$dst, $src2}",
610 [(set GR32:$dst, EFLAGS, (X86xor_flag GR32:$src1,
611 i32immSExt8:$src2))]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000612} // Constraints = "$src1 = $dst"
Chris Lattner6367cfc2010-10-05 16:39:12 +0000613
Chris Lattnerc7d46552010-10-05 16:52:25 +0000614
615def XOR8mr : I<0x30, MRMDestMem,
616 (outs), (ins i8mem :$dst, GR8 :$src),
617 "xor{b}\t{$src, $dst|$dst, $src}",
618 [(store (xor (load addr:$dst), GR8:$src), addr:$dst),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000619 (implicit EFLAGS)]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000620def XOR16mr : I<0x31, MRMDestMem,
621 (outs), (ins i16mem:$dst, GR16:$src),
622 "xor{w}\t{$src, $dst|$dst, $src}",
623 [(store (xor (load addr:$dst), GR16:$src), addr:$dst),
624 (implicit EFLAGS)]>,
625 OpSize;
626def XOR32mr : I<0x31, MRMDestMem,
627 (outs), (ins i32mem:$dst, GR32:$src),
628 "xor{l}\t{$src, $dst|$dst, $src}",
629 [(store (xor (load addr:$dst), GR32:$src), addr:$dst),
630 (implicit EFLAGS)]>;
631def XOR8mi : Ii8<0x80, MRM6m,
632 (outs), (ins i8mem :$dst, i8imm :$src),
633 "xor{b}\t{$src, $dst|$dst, $src}",
634 [(store (xor (loadi8 addr:$dst), imm:$src), addr:$dst),
635 (implicit EFLAGS)]>;
636def XOR16mi : Ii16<0x81, MRM6m,
637 (outs), (ins i16mem:$dst, i16imm:$src),
638 "xor{w}\t{$src, $dst|$dst, $src}",
639 [(store (xor (loadi16 addr:$dst), imm:$src), addr:$dst),
640 (implicit EFLAGS)]>,
641 OpSize;
642def XOR32mi : Ii32<0x81, MRM6m,
643 (outs), (ins i32mem:$dst, i32imm:$src),
644 "xor{l}\t{$src, $dst|$dst, $src}",
645 [(store (xor (loadi32 addr:$dst), imm:$src), addr:$dst),
646 (implicit EFLAGS)]>;
647def XOR16mi8 : Ii8<0x83, MRM6m,
648 (outs), (ins i16mem:$dst, i16i8imm :$src),
649 "xor{w}\t{$src, $dst|$dst, $src}",
650 [(store (xor (load addr:$dst), i16immSExt8:$src), addr:$dst),
651 (implicit EFLAGS)]>,
652 OpSize;
653def XOR32mi8 : Ii8<0x83, MRM6m,
654 (outs), (ins i32mem:$dst, i32i8imm :$src),
655 "xor{l}\t{$src, $dst|$dst, $src}",
656 [(store (xor (load addr:$dst), i32immSExt8:$src), addr:$dst),
657 (implicit EFLAGS)]>;
658
659def XOR8i8 : Ii8 <0x34, RawFrm, (outs), (ins i8imm:$src),
660 "xor{b}\t{$src, %al|%al, $src}", []>;
661def XOR16i16 : Ii16<0x35, RawFrm, (outs), (ins i16imm:$src),
662 "xor{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
663def XOR32i32 : Ii32<0x35, RawFrm, (outs), (ins i32imm:$src),
664 "xor{l}\t{$src, %eax|%eax, $src}", []>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000665} // Defs = [EFLAGS]
666
667
668// Arithmetic.
669let Defs = [EFLAGS] in {
Chris Lattnerc7d46552010-10-05 16:52:25 +0000670let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000671let isCommutable = 1 in { // X = ADD Y, Z --> X = ADD Z, Y
672// Register-Register Addition
673def ADD8rr : I<0x00, MRMDestReg, (outs GR8 :$dst),
674 (ins GR8 :$src1, GR8 :$src2),
675 "add{b}\t{$src2, $dst|$dst, $src2}",
676 [(set GR8:$dst, EFLAGS, (X86add_flag GR8:$src1, GR8:$src2))]>;
677
678let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
679// Register-Register Addition
680def ADD16rr : I<0x01, MRMDestReg, (outs GR16:$dst),
681 (ins GR16:$src1, GR16:$src2),
682 "add{w}\t{$src2, $dst|$dst, $src2}",
683 [(set GR16:$dst, EFLAGS, (X86add_flag GR16:$src1,
684 GR16:$src2))]>, OpSize;
685def ADD32rr : I<0x01, MRMDestReg, (outs GR32:$dst),
686 (ins GR32:$src1, GR32:$src2),
687 "add{l}\t{$src2, $dst|$dst, $src2}",
688 [(set GR32:$dst, EFLAGS, (X86add_flag GR32:$src1,
689 GR32:$src2))]>;
Chris Lattner64227942010-10-05 16:59:08 +0000690def ADD64rr : RI<0x01, MRMDestReg, (outs GR64:$dst),
691 (ins GR64:$src1, GR64:$src2),
692 "add{q}\t{$src2, $dst|$dst, $src2}",
693 [(set GR64:$dst, EFLAGS,
694 (X86add_flag GR64:$src1, GR64:$src2))]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000695} // end isConvertibleToThreeAddress
696} // end isCommutable
697
698// These are alternate spellings for use by the disassembler, we mark them as
699// code gen only to ensure they aren't matched by the assembler.
700let isCodeGenOnly = 1 in {
Chris Lattner64227942010-10-05 16:59:08 +0000701 def ADD8rr_alt: I<0x02, MRMSrcReg,
702 (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000703 "add{b}\t{$src2, $dst|$dst, $src2}", []>;
Chris Lattner64227942010-10-05 16:59:08 +0000704 def ADD16rr_alt: I<0x03, MRMSrcReg,
705 (outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000706 "add{w}\t{$src2, $dst|$dst, $src2}", []>, OpSize;
Chris Lattner64227942010-10-05 16:59:08 +0000707 def ADD32rr_alt: I<0x03, MRMSrcReg,
708 (outs GR32:$dst), (ins GR32:$src1, GR32:$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000709 "add{l}\t{$src2, $dst|$dst, $src2}", []>;
Chris Lattner64227942010-10-05 16:59:08 +0000710 def ADD64rr_alt : RI<0x03, MRMSrcReg,
711 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
712 "add{l}\t{$src2, $dst|$dst, $src2}", []>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000713}
714
715// Register-Memory Addition
716def ADD8rm : I<0x02, MRMSrcMem, (outs GR8 :$dst),
717 (ins GR8 :$src1, i8mem :$src2),
718 "add{b}\t{$src2, $dst|$dst, $src2}",
719 [(set GR8:$dst, EFLAGS, (X86add_flag GR8:$src1,
720 (load addr:$src2)))]>;
721def ADD16rm : I<0x03, MRMSrcMem, (outs GR16:$dst),
722 (ins GR16:$src1, i16mem:$src2),
723 "add{w}\t{$src2, $dst|$dst, $src2}",
724 [(set GR16:$dst, EFLAGS, (X86add_flag GR16:$src1,
725 (load addr:$src2)))]>, OpSize;
726def ADD32rm : I<0x03, MRMSrcMem, (outs GR32:$dst),
727 (ins GR32:$src1, i32mem:$src2),
728 "add{l}\t{$src2, $dst|$dst, $src2}",
729 [(set GR32:$dst, EFLAGS, (X86add_flag GR32:$src1,
730 (load addr:$src2)))]>;
Chris Lattner64227942010-10-05 16:59:08 +0000731def ADD64rm : RI<0x03, MRMSrcMem, (outs GR64:$dst),
732 (ins GR64:$src1, i64mem:$src2),
733 "add{q}\t{$src2, $dst|$dst, $src2}",
734 [(set GR64:$dst, EFLAGS,
735 (X86add_flag GR64:$src1, (load addr:$src2)))]>;
736
Chris Lattner6367cfc2010-10-05 16:39:12 +0000737// Register-Integer Addition
738def ADD8ri : Ii8<0x80, MRM0r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
739 "add{b}\t{$src2, $dst|$dst, $src2}",
740 [(set GR8:$dst, EFLAGS,
741 (X86add_flag GR8:$src1, imm:$src2))]>;
742
743let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
744// Register-Integer Addition
745def ADD16ri : Ii16<0x81, MRM0r, (outs GR16:$dst),
746 (ins GR16:$src1, i16imm:$src2),
747 "add{w}\t{$src2, $dst|$dst, $src2}",
748 [(set GR16:$dst, EFLAGS,
749 (X86add_flag GR16:$src1, imm:$src2))]>, OpSize;
750def ADD32ri : Ii32<0x81, MRM0r, (outs GR32:$dst),
751 (ins GR32:$src1, i32imm:$src2),
752 "add{l}\t{$src2, $dst|$dst, $src2}",
753 [(set GR32:$dst, EFLAGS,
754 (X86add_flag GR32:$src1, imm:$src2))]>;
755def ADD16ri8 : Ii8<0x83, MRM0r, (outs GR16:$dst),
756 (ins GR16:$src1, i16i8imm:$src2),
757 "add{w}\t{$src2, $dst|$dst, $src2}",
758 [(set GR16:$dst, EFLAGS,
759 (X86add_flag GR16:$src1, i16immSExt8:$src2))]>, OpSize;
760def ADD32ri8 : Ii8<0x83, MRM0r, (outs GR32:$dst),
761 (ins GR32:$src1, i32i8imm:$src2),
762 "add{l}\t{$src2, $dst|$dst, $src2}",
763 [(set GR32:$dst, EFLAGS,
764 (X86add_flag GR32:$src1, i32immSExt8:$src2))]>;
Chris Lattner64227942010-10-05 16:59:08 +0000765def ADD64ri8 : RIi8<0x83, MRM0r, (outs GR64:$dst),
766 (ins GR64:$src1, i64i8imm:$src2),
767 "add{q}\t{$src2, $dst|$dst, $src2}",
768 [(set GR64:$dst, EFLAGS,
769 (X86add_flag GR64:$src1, i64immSExt8:$src2))]>;
770def ADD64ri32 : RIi32<0x81, MRM0r, (outs GR64:$dst),
771 (ins GR64:$src1, i64i32imm:$src2),
772 "add{q}\t{$src2, $dst|$dst, $src2}",
773 [(set GR64:$dst, EFLAGS,
774 (X86add_flag GR64:$src1, i64immSExt32:$src2))]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000775}
Chris Lattnerc7d46552010-10-05 16:52:25 +0000776} // Constraints = "$src1 = $dst"
Chris Lattner6367cfc2010-10-05 16:39:12 +0000777
Chris Lattnerc7d46552010-10-05 16:52:25 +0000778// Memory-Register Addition
779def ADD8mr : I<0x00, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src2),
780 "add{b}\t{$src2, $dst|$dst, $src2}",
781 [(store (add (load addr:$dst), GR8:$src2), addr:$dst),
782 (implicit EFLAGS)]>;
783def ADD16mr : I<0x01, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
784 "add{w}\t{$src2, $dst|$dst, $src2}",
785 [(store (add (load addr:$dst), GR16:$src2), addr:$dst),
786 (implicit EFLAGS)]>, OpSize;
787def ADD32mr : I<0x01, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
788 "add{l}\t{$src2, $dst|$dst, $src2}",
789 [(store (add (load addr:$dst), GR32:$src2), addr:$dst),
790 (implicit EFLAGS)]>;
Chris Lattner64227942010-10-05 16:59:08 +0000791def ADD64mr : RI<0x01, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
792 "add{q}\t{$src2, $dst|$dst, $src2}",
793 [(store (add (load addr:$dst), GR64:$src2), addr:$dst),
794 (implicit EFLAGS)]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000795def ADD8mi : Ii8<0x80, MRM0m, (outs), (ins i8mem :$dst, i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000796 "add{b}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +0000797 [(store (add (loadi8 addr:$dst), imm:$src2), addr:$dst),
798 (implicit EFLAGS)]>;
799def ADD16mi : Ii16<0x81, MRM0m, (outs), (ins i16mem:$dst, i16imm:$src2),
800 "add{w}\t{$src2, $dst|$dst, $src2}",
801 [(store (add (loadi16 addr:$dst), imm:$src2), addr:$dst),
802 (implicit EFLAGS)]>, OpSize;
803def ADD32mi : Ii32<0x81, MRM0m, (outs), (ins i32mem:$dst, i32imm:$src2),
804 "add{l}\t{$src2, $dst|$dst, $src2}",
805 [(store (add (loadi32 addr:$dst), imm:$src2), addr:$dst),
806 (implicit EFLAGS)]>;
Chris Lattner64227942010-10-05 16:59:08 +0000807def ADD64mi32 : RIi32<0x81, MRM0m, (outs), (ins i64mem:$dst, i64i32imm :$src2),
808 "add{q}\t{$src2, $dst|$dst, $src2}",
809 [(store (add (load addr:$dst), i64immSExt32:$src2), addr:$dst),
810 (implicit EFLAGS)]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000811def ADD16mi8 : Ii8<0x83, MRM0m, (outs), (ins i16mem:$dst, i16i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000812 "add{w}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +0000813 [(store (add (load addr:$dst), i16immSExt8:$src2),
814 addr:$dst),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000815 (implicit EFLAGS)]>, OpSize;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000816def ADD32mi8 : Ii8<0x83, MRM0m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000817 "add{l}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +0000818 [(store (add (load addr:$dst), i32immSExt8:$src2),
819 addr:$dst),
820 (implicit EFLAGS)]>;
Chris Lattner64227942010-10-05 16:59:08 +0000821def ADD64mi8 : RIi8<0x83, MRM0m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
822 "add{q}\t{$src2, $dst|$dst, $src2}",
823 [(store (add (load addr:$dst), i64immSExt8:$src2), addr:$dst),
824 (implicit EFLAGS)]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000825
Chris Lattnerc7d46552010-10-05 16:52:25 +0000826// addition to rAX
827def ADD8i8 : Ii8<0x04, RawFrm, (outs), (ins i8imm:$src),
828 "add{b}\t{$src, %al|%al, $src}", []>;
829def ADD16i16 : Ii16<0x05, RawFrm, (outs), (ins i16imm:$src),
830 "add{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
831def ADD32i32 : Ii32<0x05, RawFrm, (outs), (ins i32imm:$src),
832 "add{l}\t{$src, %eax|%eax, $src}", []>;
Chris Lattner64227942010-10-05 16:59:08 +0000833def ADD64i32 : RIi32<0x05, RawFrm, (outs), (ins i64i32imm:$src),
834 "add{q}\t{$src, %rax|%rax, $src}", []>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000835
836let Uses = [EFLAGS] in {
Chris Lattnerc7d46552010-10-05 16:52:25 +0000837let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +0000838let isCommutable = 1 in { // X = ADC Y, Z --> X = ADC Z, Y
839def ADC8rr : I<0x10, MRMDestReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
840 "adc{b}\t{$src2, $dst|$dst, $src2}",
841 [(set GR8:$dst, (adde GR8:$src1, GR8:$src2))]>;
842def ADC16rr : I<0x11, MRMDestReg, (outs GR16:$dst),
843 (ins GR16:$src1, GR16:$src2),
844 "adc{w}\t{$src2, $dst|$dst, $src2}",
845 [(set GR16:$dst, (adde GR16:$src1, GR16:$src2))]>, OpSize;
846def ADC32rr : I<0x11, MRMDestReg, (outs GR32:$dst),
847 (ins GR32:$src1, GR32:$src2),
848 "adc{l}\t{$src2, $dst|$dst, $src2}",
849 [(set GR32:$dst, (adde GR32:$src1, GR32:$src2))]>;
Chris Lattner64227942010-10-05 16:59:08 +0000850def ADC64rr : RI<0x11, MRMDestReg, (outs GR64:$dst),
851 (ins GR64:$src1, GR64:$src2),
852 "adc{q}\t{$src2, $dst|$dst, $src2}",
853 [(set GR64:$dst, (adde GR64:$src1, GR64:$src2))]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000854}
855
856let isCodeGenOnly = 1 in {
857def ADC8rr_REV : I<0x12, MRMSrcReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
858 "adc{b}\t{$src2, $dst|$dst, $src2}", []>;
859def ADC16rr_REV : I<0x13, MRMSrcReg, (outs GR16:$dst),
860 (ins GR16:$src1, GR16:$src2),
861 "adc{w}\t{$src2, $dst|$dst, $src2}", []>, OpSize;
862def ADC32rr_REV : I<0x13, MRMSrcReg, (outs GR32:$dst),
863 (ins GR32:$src1, GR32:$src2),
864 "adc{l}\t{$src2, $dst|$dst, $src2}", []>;
Chris Lattner64227942010-10-05 16:59:08 +0000865def ADC64rr_REV : RI<0x13, MRMSrcReg , (outs GR32:$dst),
866 (ins GR64:$src1, GR64:$src2),
867 "adc{q}\t{$src2, $dst|$dst, $src2}", []>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000868}
869
Chris Lattner64227942010-10-05 16:59:08 +0000870def ADC8rm : I<0x12, MRMSrcMem ,
871 (outs GR8:$dst), (ins GR8:$src1, i8mem:$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000872 "adc{b}\t{$src2, $dst|$dst, $src2}",
873 [(set GR8:$dst, (adde GR8:$src1, (load addr:$src2)))]>;
874def ADC16rm : I<0x13, MRMSrcMem , (outs GR16:$dst),
875 (ins GR16:$src1, i16mem:$src2),
876 "adc{w}\t{$src2, $dst|$dst, $src2}",
877 [(set GR16:$dst, (adde GR16:$src1, (load addr:$src2)))]>,
878 OpSize;
Chris Lattner64227942010-10-05 16:59:08 +0000879def ADC32rm : I<0x13, MRMSrcMem ,
880 (outs GR32:$dst), (ins GR32:$src1, i32mem:$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000881 "adc{l}\t{$src2, $dst|$dst, $src2}",
882 [(set GR32:$dst, (adde GR32:$src1, (load addr:$src2)))]>;
Chris Lattner64227942010-10-05 16:59:08 +0000883def ADC64rm : RI<0x13, MRMSrcMem , (outs GR64:$dst),
884 (ins GR64:$src1, i64mem:$src2),
885 "adc{q}\t{$src2, $dst|$dst, $src2}",
886 [(set GR64:$dst, (adde GR64:$src1, (load addr:$src2)))]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000887def ADC8ri : Ii8<0x80, MRM2r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
888 "adc{b}\t{$src2, $dst|$dst, $src2}",
889 [(set GR8:$dst, (adde GR8:$src1, imm:$src2))]>;
Chris Lattner64227942010-10-05 16:59:08 +0000890def ADC16ri : Ii16<0x81, MRM2r,
891 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000892 "adc{w}\t{$src2, $dst|$dst, $src2}",
893 [(set GR16:$dst, (adde GR16:$src1, imm:$src2))]>, OpSize;
894def ADC16ri8 : Ii8<0x83, MRM2r, (outs GR16:$dst),
895 (ins GR16:$src1, i16i8imm:$src2),
896 "adc{w}\t{$src2, $dst|$dst, $src2}",
897 [(set GR16:$dst, (adde GR16:$src1, i16immSExt8:$src2))]>,
898 OpSize;
899def ADC32ri : Ii32<0x81, MRM2r, (outs GR32:$dst),
900 (ins GR32:$src1, i32imm:$src2),
901 "adc{l}\t{$src2, $dst|$dst, $src2}",
902 [(set GR32:$dst, (adde GR32:$src1, imm:$src2))]>;
903def ADC32ri8 : Ii8<0x83, MRM2r, (outs GR32:$dst),
904 (ins GR32:$src1, i32i8imm:$src2),
905 "adc{l}\t{$src2, $dst|$dst, $src2}",
906 [(set GR32:$dst, (adde GR32:$src1, i32immSExt8:$src2))]>;
Chris Lattner64227942010-10-05 16:59:08 +0000907def ADC64ri32 : RIi32<0x81, MRM2r, (outs GR64:$dst),
908 (ins GR64:$src1, i64i32imm:$src2),
909 "adc{q}\t{$src2, $dst|$dst, $src2}",
910 [(set GR64:$dst, (adde GR64:$src1, i64immSExt32:$src2))]>;
911def ADC64ri8 : RIi8<0x83, MRM2r, (outs GR64:$dst),
912 (ins GR64:$src1, i64i8imm:$src2),
913 "adc{q}\t{$src2, $dst|$dst, $src2}",
914 [(set GR64:$dst, (adde GR64:$src1, i64immSExt8:$src2))]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000915} // Constraints = "$src1 = $dst"
Chris Lattner6367cfc2010-10-05 16:39:12 +0000916
Chris Lattnerc7d46552010-10-05 16:52:25 +0000917def ADC8mr : I<0x10, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src2),
918 "adc{b}\t{$src2, $dst|$dst, $src2}",
919 [(store (adde (load addr:$dst), GR8:$src2), addr:$dst)]>;
920def ADC16mr : I<0x11, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
921 "adc{w}\t{$src2, $dst|$dst, $src2}",
922 [(store (adde (load addr:$dst), GR16:$src2), addr:$dst)]>,
923 OpSize;
924def ADC32mr : I<0x11, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
925 "adc{l}\t{$src2, $dst|$dst, $src2}",
926 [(store (adde (load addr:$dst), GR32:$src2), addr:$dst)]>;
Chris Lattner64227942010-10-05 16:59:08 +0000927def ADC64mr : RI<0x11, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
928 "adc{q}\t{$src2, $dst|$dst, $src2}",
929 [(store (adde (load addr:$dst), GR64:$src2), addr:$dst)]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +0000930def ADC8mi : Ii8<0x80, MRM2m, (outs), (ins i8mem:$dst, i8imm:$src2),
931 "adc{b}\t{$src2, $dst|$dst, $src2}",
932 [(store (adde (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
933def ADC16mi : Ii16<0x81, MRM2m, (outs), (ins i16mem:$dst, i16imm:$src2),
934 "adc{w}\t{$src2, $dst|$dst, $src2}",
935 [(store (adde (loadi16 addr:$dst), imm:$src2), addr:$dst)]>,
936 OpSize;
937def ADC16mi8 : Ii8<0x83, MRM2m, (outs), (ins i16mem:$dst, i16i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000938 "adc{w}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +0000939 [(store (adde (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>,
940 OpSize;
941def ADC32mi : Ii32<0x81, MRM2m, (outs), (ins i32mem:$dst, i32imm:$src2),
942 "adc{l}\t{$src2, $dst|$dst, $src2}",
943 [(store (adde (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
944def ADC32mi8 : Ii8<0x83, MRM2m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +0000945 "adc{l}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +0000946 [(store (adde (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000947
Chris Lattner64227942010-10-05 16:59:08 +0000948def ADC64mi32 : RIi32<0x81, MRM2m, (outs), (ins i64mem:$dst, i64i32imm:$src2),
949 "adc{q}\t{$src2, $dst|$dst, $src2}",
950 [(store (adde (load addr:$dst), i64immSExt32:$src2),
951 addr:$dst)]>;
952def ADC64mi8 : RIi8<0x83, MRM2m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
953 "adc{q}\t{$src2, $dst|$dst, $src2}",
954 [(store (adde (load addr:$dst), i64immSExt8:$src2),
955 addr:$dst)]>;
956
Chris Lattnerc7d46552010-10-05 16:52:25 +0000957def ADC8i8 : Ii8<0x14, RawFrm, (outs), (ins i8imm:$src),
958 "adc{b}\t{$src, %al|%al, $src}", []>;
959def ADC16i16 : Ii16<0x15, RawFrm, (outs), (ins i16imm:$src),
960 "adc{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
961def ADC32i32 : Ii32<0x15, RawFrm, (outs), (ins i32imm:$src),
962 "adc{l}\t{$src, %eax|%eax, $src}", []>;
Chris Lattner64227942010-10-05 16:59:08 +0000963def ADC64i32 : RIi32<0x15, RawFrm, (outs), (ins i64i32imm:$src),
964 "adc{q}\t{$src, %rax|%rax, $src}", []>;
Chris Lattner6367cfc2010-10-05 16:39:12 +0000965} // Uses = [EFLAGS]
966
Chris Lattnerc7d46552010-10-05 16:52:25 +0000967let Constraints = "$src1 = $dst" in {
968
Chris Lattner6367cfc2010-10-05 16:39:12 +0000969// Register-Register Subtraction
970def SUB8rr : I<0x28, MRMDestReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
971 "sub{b}\t{$src2, $dst|$dst, $src2}",
972 [(set GR8:$dst, EFLAGS,
973 (X86sub_flag GR8:$src1, GR8:$src2))]>;
974def SUB16rr : I<0x29, MRMDestReg, (outs GR16:$dst), (ins GR16:$src1,GR16:$src2),
975 "sub{w}\t{$src2, $dst|$dst, $src2}",
976 [(set GR16:$dst, EFLAGS,
977 (X86sub_flag GR16:$src1, GR16:$src2))]>, OpSize;
978def SUB32rr : I<0x29, MRMDestReg, (outs GR32:$dst), (ins GR32:$src1,GR32:$src2),
979 "sub{l}\t{$src2, $dst|$dst, $src2}",
980 [(set GR32:$dst, EFLAGS,
981 (X86sub_flag GR32:$src1, GR32:$src2))]>;
982
983let isCodeGenOnly = 1 in {
984def SUB8rr_REV : I<0x2A, MRMSrcReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
985 "sub{b}\t{$src2, $dst|$dst, $src2}", []>;
986def SUB16rr_REV : I<0x2B, MRMSrcReg, (outs GR16:$dst),
987 (ins GR16:$src1, GR16:$src2),
988 "sub{w}\t{$src2, $dst|$dst, $src2}", []>, OpSize;
989def SUB32rr_REV : I<0x2B, MRMSrcReg, (outs GR32:$dst),
990 (ins GR32:$src1, GR32:$src2),
991 "sub{l}\t{$src2, $dst|$dst, $src2}", []>;
992}
993
994// Register-Memory Subtraction
995def SUB8rm : I<0x2A, MRMSrcMem, (outs GR8 :$dst),
996 (ins GR8 :$src1, i8mem :$src2),
997 "sub{b}\t{$src2, $dst|$dst, $src2}",
998 [(set GR8:$dst, EFLAGS,
999 (X86sub_flag GR8:$src1, (load addr:$src2)))]>;
1000def SUB16rm : I<0x2B, MRMSrcMem, (outs GR16:$dst),
1001 (ins GR16:$src1, i16mem:$src2),
1002 "sub{w}\t{$src2, $dst|$dst, $src2}",
1003 [(set GR16:$dst, EFLAGS,
1004 (X86sub_flag GR16:$src1, (load addr:$src2)))]>, OpSize;
1005def SUB32rm : I<0x2B, MRMSrcMem, (outs GR32:$dst),
1006 (ins GR32:$src1, i32mem:$src2),
1007 "sub{l}\t{$src2, $dst|$dst, $src2}",
1008 [(set GR32:$dst, EFLAGS,
1009 (X86sub_flag GR32:$src1, (load addr:$src2)))]>;
1010
1011// Register-Integer Subtraction
1012def SUB8ri : Ii8 <0x80, MRM5r, (outs GR8:$dst),
1013 (ins GR8:$src1, i8imm:$src2),
1014 "sub{b}\t{$src2, $dst|$dst, $src2}",
1015 [(set GR8:$dst, EFLAGS,
1016 (X86sub_flag GR8:$src1, imm:$src2))]>;
1017def SUB16ri : Ii16<0x81, MRM5r, (outs GR16:$dst),
1018 (ins GR16:$src1, i16imm:$src2),
1019 "sub{w}\t{$src2, $dst|$dst, $src2}",
1020 [(set GR16:$dst, EFLAGS,
1021 (X86sub_flag GR16:$src1, imm:$src2))]>, OpSize;
1022def SUB32ri : Ii32<0x81, MRM5r, (outs GR32:$dst),
1023 (ins GR32:$src1, i32imm:$src2),
1024 "sub{l}\t{$src2, $dst|$dst, $src2}",
1025 [(set GR32:$dst, EFLAGS,
1026 (X86sub_flag GR32:$src1, imm:$src2))]>;
1027def SUB16ri8 : Ii8<0x83, MRM5r, (outs GR16:$dst),
1028 (ins GR16:$src1, i16i8imm:$src2),
1029 "sub{w}\t{$src2, $dst|$dst, $src2}",
1030 [(set GR16:$dst, EFLAGS,
1031 (X86sub_flag GR16:$src1, i16immSExt8:$src2))]>, OpSize;
1032def SUB32ri8 : Ii8<0x83, MRM5r, (outs GR32:$dst),
1033 (ins GR32:$src1, i32i8imm:$src2),
1034 "sub{l}\t{$src2, $dst|$dst, $src2}",
1035 [(set GR32:$dst, EFLAGS,
1036 (X86sub_flag GR32:$src1, i32immSExt8:$src2))]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +00001037} // Constraints = "$src1 = $dst"
Chris Lattner6367cfc2010-10-05 16:39:12 +00001038
Chris Lattnerc7d46552010-10-05 16:52:25 +00001039// Memory-Register Subtraction
1040def SUB8mr : I<0x28, MRMDestMem, (outs), (ins i8mem :$dst, GR8 :$src2),
1041 "sub{b}\t{$src2, $dst|$dst, $src2}",
1042 [(store (sub (load addr:$dst), GR8:$src2), addr:$dst),
1043 (implicit EFLAGS)]>;
1044def SUB16mr : I<0x29, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
1045 "sub{w}\t{$src2, $dst|$dst, $src2}",
1046 [(store (sub (load addr:$dst), GR16:$src2), addr:$dst),
1047 (implicit EFLAGS)]>, OpSize;
1048def SUB32mr : I<0x29, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
1049 "sub{l}\t{$src2, $dst|$dst, $src2}",
1050 [(store (sub (load addr:$dst), GR32:$src2), addr:$dst),
1051 (implicit EFLAGS)]>;
1052
1053// Memory-Integer Subtraction
1054def SUB8mi : Ii8<0x80, MRM5m, (outs), (ins i8mem :$dst, i8imm:$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +00001055 "sub{b}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +00001056 [(store (sub (loadi8 addr:$dst), imm:$src2), addr:$dst),
Chris Lattner6367cfc2010-10-05 16:39:12 +00001057 (implicit EFLAGS)]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +00001058def SUB16mi : Ii16<0x81, MRM5m, (outs), (ins i16mem:$dst, i16imm:$src2),
1059 "sub{w}\t{$src2, $dst|$dst, $src2}",
1060 [(store (sub (loadi16 addr:$dst), imm:$src2),addr:$dst),
1061 (implicit EFLAGS)]>, OpSize;
1062def SUB32mi : Ii32<0x81, MRM5m, (outs), (ins i32mem:$dst, i32imm:$src2),
1063 "sub{l}\t{$src2, $dst|$dst, $src2}",
1064 [(store (sub (loadi32 addr:$dst), imm:$src2),addr:$dst),
1065 (implicit EFLAGS)]>;
1066def SUB16mi8 : Ii8<0x83, MRM5m, (outs), (ins i16mem:$dst, i16i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +00001067 "sub{w}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +00001068 [(store (sub (load addr:$dst), i16immSExt8:$src2),
1069 addr:$dst),
Chris Lattner6367cfc2010-10-05 16:39:12 +00001070 (implicit EFLAGS)]>, OpSize;
Chris Lattnerc7d46552010-10-05 16:52:25 +00001071def SUB32mi8 : Ii8<0x83, MRM5m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +00001072 "sub{l}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +00001073 [(store (sub (load addr:$dst), i32immSExt8:$src2),
1074 addr:$dst),
Chris Lattner6367cfc2010-10-05 16:39:12 +00001075 (implicit EFLAGS)]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +00001076
1077def SUB8i8 : Ii8<0x2C, RawFrm, (outs), (ins i8imm:$src),
1078 "sub{b}\t{$src, %al|%al, $src}", []>;
1079def SUB16i16 : Ii16<0x2D, RawFrm, (outs), (ins i16imm:$src),
1080 "sub{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
1081def SUB32i32 : Ii32<0x2D, RawFrm, (outs), (ins i32imm:$src),
1082 "sub{l}\t{$src, %eax|%eax, $src}", []>;
Chris Lattner6367cfc2010-10-05 16:39:12 +00001083
1084let Uses = [EFLAGS] in {
Chris Lattnerc7d46552010-10-05 16:52:25 +00001085let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +00001086def SBB8rr : I<0x18, MRMDestReg, (outs GR8:$dst),
1087 (ins GR8:$src1, GR8:$src2),
1088 "sbb{b}\t{$src2, $dst|$dst, $src2}",
1089 [(set GR8:$dst, (sube GR8:$src1, GR8:$src2))]>;
1090def SBB16rr : I<0x19, MRMDestReg, (outs GR16:$dst),
1091 (ins GR16:$src1, GR16:$src2),
1092 "sbb{w}\t{$src2, $dst|$dst, $src2}",
1093 [(set GR16:$dst, (sube GR16:$src1, GR16:$src2))]>, OpSize;
1094def SBB32rr : I<0x19, MRMDestReg, (outs GR32:$dst),
1095 (ins GR32:$src1, GR32:$src2),
1096 "sbb{l}\t{$src2, $dst|$dst, $src2}",
1097 [(set GR32:$dst, (sube GR32:$src1, GR32:$src2))]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +00001098} // Constraints = "$src1 = $dst"
Chris Lattner6367cfc2010-10-05 16:39:12 +00001099
Chris Lattnerc7d46552010-10-05 16:52:25 +00001100
1101def SBB8mr : I<0x18, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src2),
1102 "sbb{b}\t{$src2, $dst|$dst, $src2}",
1103 [(store (sube (load addr:$dst), GR8:$src2), addr:$dst)]>;
1104def SBB16mr : I<0x19, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
1105 "sbb{w}\t{$src2, $dst|$dst, $src2}",
1106 [(store (sube (load addr:$dst), GR16:$src2), addr:$dst)]>,
1107 OpSize;
1108def SBB32mr : I<0x19, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
1109 "sbb{l}\t{$src2, $dst|$dst, $src2}",
1110 [(store (sube (load addr:$dst), GR32:$src2), addr:$dst)]>;
1111def SBB8mi : Ii8<0x80, MRM3m, (outs), (ins i8mem:$dst, i8imm:$src2),
1112 "sbb{b}\t{$src2, $dst|$dst, $src2}",
1113 [(store (sube (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
1114def SBB16mi : Ii16<0x81, MRM3m, (outs), (ins i16mem:$dst, i16imm:$src2),
1115 "sbb{w}\t{$src2, $dst|$dst, $src2}",
1116 [(store (sube (loadi16 addr:$dst), imm:$src2), addr:$dst)]>,
1117 OpSize;
1118def SBB16mi8 : Ii8<0x83, MRM3m, (outs), (ins i16mem:$dst, i16i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +00001119 "sbb{w}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +00001120 [(store (sube (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>,
1121 OpSize;
1122def SBB32mi : Ii32<0x81, MRM3m, (outs), (ins i32mem:$dst, i32imm:$src2),
1123 "sbb{l}\t{$src2, $dst|$dst, $src2}",
1124 [(store (sube (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
1125def SBB32mi8 : Ii8<0x83, MRM3m, (outs), (ins i32mem:$dst, i32i8imm :$src2),
Chris Lattner6367cfc2010-10-05 16:39:12 +00001126 "sbb{l}\t{$src2, $dst|$dst, $src2}",
Chris Lattnerc7d46552010-10-05 16:52:25 +00001127 [(store (sube (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
1128
1129def SBB8i8 : Ii8<0x1C, RawFrm, (outs), (ins i8imm:$src),
1130 "sbb{b}\t{$src, %al|%al, $src}", []>;
1131def SBB16i16 : Ii16<0x1D, RawFrm, (outs), (ins i16imm:$src),
1132 "sbb{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
1133def SBB32i32 : Ii32<0x1D, RawFrm, (outs), (ins i32imm:$src),
1134 "sbb{l}\t{$src, %eax|%eax, $src}", []>;
1135
1136let Constraints = "$src1 = $dst" in {
Chris Lattner6367cfc2010-10-05 16:39:12 +00001137
1138let isCodeGenOnly = 1 in {
1139def SBB8rr_REV : I<0x1A, MRMSrcReg, (outs GR8:$dst), (ins GR8:$src1, GR8:$src2),
1140 "sbb{b}\t{$src2, $dst|$dst, $src2}", []>;
1141def SBB16rr_REV : I<0x1B, MRMSrcReg, (outs GR16:$dst),
1142 (ins GR16:$src1, GR16:$src2),
1143 "sbb{w}\t{$src2, $dst|$dst, $src2}", []>, OpSize;
1144def SBB32rr_REV : I<0x1B, MRMSrcReg, (outs GR32:$dst),
1145 (ins GR32:$src1, GR32:$src2),
1146 "sbb{l}\t{$src2, $dst|$dst, $src2}", []>;
1147}
1148
1149def SBB8rm : I<0x1A, MRMSrcMem, (outs GR8:$dst), (ins GR8:$src1, i8mem:$src2),
1150 "sbb{b}\t{$src2, $dst|$dst, $src2}",
1151 [(set GR8:$dst, (sube GR8:$src1, (load addr:$src2)))]>;
1152def SBB16rm : I<0x1B, MRMSrcMem, (outs GR16:$dst),
1153 (ins GR16:$src1, i16mem:$src2),
1154 "sbb{w}\t{$src2, $dst|$dst, $src2}",
1155 [(set GR16:$dst, (sube GR16:$src1, (load addr:$src2)))]>,
1156 OpSize;
1157def SBB32rm : I<0x1B, MRMSrcMem, (outs GR32:$dst),
1158 (ins GR32:$src1, i32mem:$src2),
1159 "sbb{l}\t{$src2, $dst|$dst, $src2}",
1160 [(set GR32:$dst, (sube GR32:$src1, (load addr:$src2)))]>;
1161def SBB8ri : Ii8<0x80, MRM3r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
1162 "sbb{b}\t{$src2, $dst|$dst, $src2}",
1163 [(set GR8:$dst, (sube GR8:$src1, imm:$src2))]>;
1164def SBB16ri : Ii16<0x81, MRM3r, (outs GR16:$dst),
1165 (ins GR16:$src1, i16imm:$src2),
1166 "sbb{w}\t{$src2, $dst|$dst, $src2}",
1167 [(set GR16:$dst, (sube GR16:$src1, imm:$src2))]>, OpSize;
1168def SBB16ri8 : Ii8<0x83, MRM3r, (outs GR16:$dst),
1169 (ins GR16:$src1, i16i8imm:$src2),
1170 "sbb{w}\t{$src2, $dst|$dst, $src2}",
1171 [(set GR16:$dst, (sube GR16:$src1, i16immSExt8:$src2))]>,
1172 OpSize;
1173def SBB32ri : Ii32<0x81, MRM3r, (outs GR32:$dst),
1174 (ins GR32:$src1, i32imm:$src2),
1175 "sbb{l}\t{$src2, $dst|$dst, $src2}",
1176 [(set GR32:$dst, (sube GR32:$src1, imm:$src2))]>;
1177def SBB32ri8 : Ii8<0x83, MRM3r, (outs GR32:$dst),
1178 (ins GR32:$src1, i32i8imm:$src2),
1179 "sbb{l}\t{$src2, $dst|$dst, $src2}",
1180 [(set GR32:$dst, (sube GR32:$src1, i32immSExt8:$src2))]>;
Chris Lattnerc7d46552010-10-05 16:52:25 +00001181} // Constraints = "$src1 = $dst"
1182
Chris Lattner6367cfc2010-10-05 16:39:12 +00001183} // Uses = [EFLAGS]
1184} // Defs = [EFLAGS]
1185
1186let Defs = [EFLAGS] in {
Chris Lattnerc7d46552010-10-05 16:52:25 +00001187let Constraints = "$src1 = $dst" in {
1188
Chris Lattner6367cfc2010-10-05 16:39:12 +00001189let isCommutable = 1 in { // X = IMUL Y, Z --> X = IMUL Z, Y
1190// Register-Register Signed Integer Multiply
1191def IMUL16rr : I<0xAF, MRMSrcReg, (outs GR16:$dst), (ins GR16:$src1,GR16:$src2),
1192 "imul{w}\t{$src2, $dst|$dst, $src2}",
1193 [(set GR16:$dst, EFLAGS,
1194 (X86smul_flag GR16:$src1, GR16:$src2))]>, TB, OpSize;
1195def IMUL32rr : I<0xAF, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src1,GR32:$src2),
1196 "imul{l}\t{$src2, $dst|$dst, $src2}",
1197 [(set GR32:$dst, EFLAGS,
1198 (X86smul_flag GR32:$src1, GR32:$src2))]>, TB;
1199}
1200
1201// Register-Memory Signed Integer Multiply
1202def IMUL16rm : I<0xAF, MRMSrcMem, (outs GR16:$dst),
1203 (ins GR16:$src1, i16mem:$src2),
1204 "imul{w}\t{$src2, $dst|$dst, $src2}",
1205 [(set GR16:$dst, EFLAGS,
1206 (X86smul_flag GR16:$src1, (load addr:$src2)))]>,
1207 TB, OpSize;
1208def IMUL32rm : I<0xAF, MRMSrcMem, (outs GR32:$dst),
1209 (ins GR32:$src1, i32mem:$src2),
1210 "imul{l}\t{$src2, $dst|$dst, $src2}",
1211 [(set GR32:$dst, EFLAGS,
1212 (X86smul_flag GR32:$src1, (load addr:$src2)))]>, TB;
Chris Lattnerc7d46552010-10-05 16:52:25 +00001213} // Constraints = "$src1 = $dst"
1214
Chris Lattner6367cfc2010-10-05 16:39:12 +00001215} // Defs = [EFLAGS]
Chris Lattner6367cfc2010-10-05 16:39:12 +00001216
1217// Suprisingly enough, these are not two address instructions!
1218let Defs = [EFLAGS] in {
1219// Register-Integer Signed Integer Multiply
1220def IMUL16rri : Ii16<0x69, MRMSrcReg, // GR16 = GR16*I16
1221 (outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
1222 "imul{w}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
1223 [(set GR16:$dst, EFLAGS,
1224 (X86smul_flag GR16:$src1, imm:$src2))]>, OpSize;
1225def IMUL32rri : Ii32<0x69, MRMSrcReg, // GR32 = GR32*I32
1226 (outs GR32:$dst), (ins GR32:$src1, i32imm:$src2),
1227 "imul{l}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
1228 [(set GR32:$dst, EFLAGS,
1229 (X86smul_flag GR32:$src1, imm:$src2))]>;
1230def IMUL16rri8 : Ii8<0x6B, MRMSrcReg, // GR16 = GR16*I8
1231 (outs GR16:$dst), (ins GR16:$src1, i16i8imm:$src2),
1232 "imul{w}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
1233 [(set GR16:$dst, EFLAGS,
1234 (X86smul_flag GR16:$src1, i16immSExt8:$src2))]>,
1235 OpSize;
1236def IMUL32rri8 : Ii8<0x6B, MRMSrcReg, // GR32 = GR32*I8
1237 (outs GR32:$dst), (ins GR32:$src1, i32i8imm:$src2),
1238 "imul{l}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
1239 [(set GR32:$dst, EFLAGS,
1240 (X86smul_flag GR32:$src1, i32immSExt8:$src2))]>;
1241
1242// Memory-Integer Signed Integer Multiply
1243def IMUL16rmi : Ii16<0x69, MRMSrcMem, // GR16 = [mem16]*I16
1244 (outs GR16:$dst), (ins i16mem:$src1, i16imm:$src2),
1245 "imul{w}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
1246 [(set GR16:$dst, EFLAGS,
1247 (X86smul_flag (load addr:$src1), imm:$src2))]>,
1248 OpSize;
1249def IMUL32rmi : Ii32<0x69, MRMSrcMem, // GR32 = [mem32]*I32
1250 (outs GR32:$dst), (ins i32mem:$src1, i32imm:$src2),
1251 "imul{l}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
1252 [(set GR32:$dst, EFLAGS,
1253 (X86smul_flag (load addr:$src1), imm:$src2))]>;
1254def IMUL16rmi8 : Ii8<0x6B, MRMSrcMem, // GR16 = [mem16]*I8
1255 (outs GR16:$dst), (ins i16mem:$src1, i16i8imm :$src2),
1256 "imul{w}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
1257 [(set GR16:$dst, EFLAGS,
1258 (X86smul_flag (load addr:$src1),
1259 i16immSExt8:$src2))]>, OpSize;
1260def IMUL32rmi8 : Ii8<0x6B, MRMSrcMem, // GR32 = [mem32]*I8
1261 (outs GR32:$dst), (ins i32mem:$src1, i32i8imm: $src2),
1262 "imul{l}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
1263 [(set GR32:$dst, EFLAGS,
1264 (X86smul_flag (load addr:$src1),
1265 i32immSExt8:$src2))]>;
1266} // Defs = [EFLAGS]
1267
1268//===----------------------------------------------------------------------===//
1269// Test instructions are just like AND, except they don't generate a result.
1270//
1271let Defs = [EFLAGS] in {
1272let isCommutable = 1 in { // TEST X, Y --> TEST Y, X
1273def TEST8rr : I<0x84, MRMSrcReg, (outs), (ins GR8:$src1, GR8:$src2),
1274 "test{b}\t{$src2, $src1|$src1, $src2}",
1275 [(set EFLAGS, (X86cmp (and_su GR8:$src1, GR8:$src2), 0))]>;
1276def TEST16rr : I<0x85, MRMSrcReg, (outs), (ins GR16:$src1, GR16:$src2),
1277 "test{w}\t{$src2, $src1|$src1, $src2}",
1278 [(set EFLAGS, (X86cmp (and_su GR16:$src1, GR16:$src2),
1279 0))]>,
1280 OpSize;
1281def TEST32rr : I<0x85, MRMSrcReg, (outs), (ins GR32:$src1, GR32:$src2),
1282 "test{l}\t{$src2, $src1|$src1, $src2}",
1283 [(set EFLAGS, (X86cmp (and_su GR32:$src1, GR32:$src2),
1284 0))]>;
1285}
1286
1287def TEST8i8 : Ii8<0xA8, RawFrm, (outs), (ins i8imm:$src),
1288 "test{b}\t{$src, %al|%al, $src}", []>;
1289def TEST16i16 : Ii16<0xA9, RawFrm, (outs), (ins i16imm:$src),
1290 "test{w}\t{$src, %ax|%ax, $src}", []>, OpSize;
1291def TEST32i32 : Ii32<0xA9, RawFrm, (outs), (ins i32imm:$src),
1292 "test{l}\t{$src, %eax|%eax, $src}", []>;
1293
1294def TEST8rm : I<0x84, MRMSrcMem, (outs), (ins GR8 :$src1, i8mem :$src2),
1295 "test{b}\t{$src2, $src1|$src1, $src2}",
1296 [(set EFLAGS, (X86cmp (and GR8:$src1, (loadi8 addr:$src2)),
1297 0))]>;
1298def TEST16rm : I<0x85, MRMSrcMem, (outs), (ins GR16:$src1, i16mem:$src2),
1299 "test{w}\t{$src2, $src1|$src1, $src2}",
1300 [(set EFLAGS, (X86cmp (and GR16:$src1,
1301 (loadi16 addr:$src2)), 0))]>, OpSize;
1302def TEST32rm : I<0x85, MRMSrcMem, (outs), (ins GR32:$src1, i32mem:$src2),
1303 "test{l}\t{$src2, $src1|$src1, $src2}",
1304 [(set EFLAGS, (X86cmp (and GR32:$src1,
1305 (loadi32 addr:$src2)), 0))]>;
1306
1307def TEST8ri : Ii8 <0xF6, MRM0r, // flags = GR8 & imm8
1308 (outs), (ins GR8:$src1, i8imm:$src2),
1309 "test{b}\t{$src2, $src1|$src1, $src2}",
1310 [(set EFLAGS, (X86cmp (and_su GR8:$src1, imm:$src2), 0))]>;
1311def TEST16ri : Ii16<0xF7, MRM0r, // flags = GR16 & imm16
1312 (outs), (ins GR16:$src1, i16imm:$src2),
1313 "test{w}\t{$src2, $src1|$src1, $src2}",
1314 [(set EFLAGS, (X86cmp (and_su GR16:$src1, imm:$src2), 0))]>,
1315 OpSize;
1316def TEST32ri : Ii32<0xF7, MRM0r, // flags = GR32 & imm32
1317 (outs), (ins GR32:$src1, i32imm:$src2),
1318 "test{l}\t{$src2, $src1|$src1, $src2}",
1319 [(set EFLAGS, (X86cmp (and_su GR32:$src1, imm:$src2), 0))]>;
1320
1321def TEST8mi : Ii8 <0xF6, MRM0m, // flags = [mem8] & imm8
1322 (outs), (ins i8mem:$src1, i8imm:$src2),
1323 "test{b}\t{$src2, $src1|$src1, $src2}",
1324 [(set EFLAGS, (X86cmp (and (loadi8 addr:$src1), imm:$src2),
1325 0))]>;
1326def TEST16mi : Ii16<0xF7, MRM0m, // flags = [mem16] & imm16
1327 (outs), (ins i16mem:$src1, i16imm:$src2),
1328 "test{w}\t{$src2, $src1|$src1, $src2}",
1329 [(set EFLAGS, (X86cmp (and (loadi16 addr:$src1), imm:$src2),
1330 0))]>, OpSize;
1331def TEST32mi : Ii32<0xF7, MRM0m, // flags = [mem32] & imm32
1332 (outs), (ins i32mem:$src1, i32imm:$src2),
1333 "test{l}\t{$src2, $src1|$src1, $src2}",
1334 [(set EFLAGS, (X86cmp (and (loadi32 addr:$src1), imm:$src2),
1335 0))]>;
1336} // Defs = [EFLAGS]
1337