blob: 7479db4ea202db0526b55e62ac02eb61ff04a3c2 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//====- X86InstrX86-64.td - Describe the X86 Instruction Set ----*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the Evan Cheng 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-64 instruction set, defining the instructions,
11// and properties of the instructions which are needed for code generation,
12// machine code emission, and analysis.
13//
14//===----------------------------------------------------------------------===//
15
16//===----------------------------------------------------------------------===//
17// Operand Definitions...
18//
19
20// 64-bits but only 32 bits are significant.
21def i64i32imm : Operand<i64>;
22// 64-bits but only 8 bits are significant.
23def i64i8imm : Operand<i64>;
24
25def lea64mem : Operand<i64> {
26 let PrintMethod = "printi64mem";
27 let MIOperandInfo = (ops GR64, i8imm, GR64, i32imm);
28}
29
30def lea64_32mem : Operand<i32> {
31 let PrintMethod = "printlea64_32mem";
32 let MIOperandInfo = (ops GR32, i8imm, GR32, i32imm);
33}
34
35//===----------------------------------------------------------------------===//
36// Complex Pattern Definitions...
37//
38def lea64addr : ComplexPattern<i64, 4, "SelectLEAAddr",
39 [add, mul, shl, or, frameindex, X86Wrapper],
40 []>;
41
42//===----------------------------------------------------------------------===//
43// Instruction templates...
44//
45
Evan Chengb783fa32007-07-19 01:14:50 +000046class RI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
47 : I<o, F, outs, ins, asm, pattern>, REX_W;
48class RIi8 <bits<8> o, Format F, dag outs, dag ins, string asm,
49 list<dag> pattern>
50 : Ii8<o, F, outs, ins, asm, pattern>, REX_W;
51class RIi32 <bits<8> o, Format F, dag outs, dag ins, string asm,
52 list<dag> pattern>
53 : Ii32<o, F, outs, ins, asm, pattern>, REX_W;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000054
Evan Chengb783fa32007-07-19 01:14:50 +000055class RIi64<bits<8> o, Format f, dag outs, dag ins, string asm,
56 list<dag> pattern>
57 : X86Inst<o, f, Imm64, outs, ins, asm>, REX_W {
Dan Gohmanf17a25c2007-07-18 16:29:46 +000058 let Pattern = pattern;
59 let CodeSize = 3;
60}
61
Evan Chengb783fa32007-07-19 01:14:50 +000062class RSSI<bits<8> o, Format F, dag outs, dag ins, string asm,
63 list<dag> pattern>
64 : SSI<o, F, outs, ins, asm, pattern>, REX_W;
65class RSDI<bits<8> o, Format F, dag outs, dag ins, string asm,
66 list<dag> pattern>
67 : SDI<o, F, outs, ins, asm, pattern>, REX_W;
68class RPDI<bits<8> o, Format F, dag outs, dag ins, string asm,
69 list<dag> pattern>
70 : PDI<o, F, outs, ins, asm, pattern>, REX_W;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000071
72//===----------------------------------------------------------------------===//
73// Pattern fragments...
74//
75
76def i64immSExt32 : PatLeaf<(i64 imm), [{
77 // i64immSExt32 predicate - True if the 64-bit immediate fits in a 32-bit
78 // sign extended field.
79 return (int64_t)N->getValue() == (int32_t)N->getValue();
80}]>;
81
82def i64immZExt32 : PatLeaf<(i64 imm), [{
83 // i64immZExt32 predicate - True if the 64-bit immediate fits in a 32-bit
84 // unsignedsign extended field.
85 return (uint64_t)N->getValue() == (uint32_t)N->getValue();
86}]>;
87
88def i64immSExt8 : PatLeaf<(i64 imm), [{
89 // i64immSExt8 predicate - True if the 64-bit immediate fits in a 8-bit
90 // sign extended field.
91 return (int64_t)N->getValue() == (int8_t)N->getValue();
92}]>;
93
94def sextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (sextloadi1 node:$ptr))>;
95def sextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (sextloadi8 node:$ptr))>;
96def sextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (sextloadi16 node:$ptr))>;
97def sextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (sextloadi32 node:$ptr))>;
98
99def zextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (zextloadi1 node:$ptr))>;
100def zextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (zextloadi8 node:$ptr))>;
101def zextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (zextloadi16 node:$ptr))>;
102def zextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (zextloadi32 node:$ptr))>;
103
104def extloadi64i1 : PatFrag<(ops node:$ptr), (i64 (extloadi1 node:$ptr))>;
105def extloadi64i8 : PatFrag<(ops node:$ptr), (i64 (extloadi8 node:$ptr))>;
106def extloadi64i16 : PatFrag<(ops node:$ptr), (i64 (extloadi16 node:$ptr))>;
107def extloadi64i32 : PatFrag<(ops node:$ptr), (i64 (extloadi32 node:$ptr))>;
108
109//===----------------------------------------------------------------------===//
110// Instruction list...
111//
112
Evan Chengb783fa32007-07-19 01:14:50 +0000113def IMPLICIT_DEF_GR64 : I<0, Pseudo, (outs GR64:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000114 "#IMPLICIT_DEF $dst",
115 [(set GR64:$dst, (undef))]>;
116
117//===----------------------------------------------------------------------===//
118// Call Instructions...
119//
120let isCall = 1, noResults = 1 in
121 // All calls clobber the non-callee saved registers...
122 let Defs = [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11,
123 FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
124 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
125 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
126 XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15] in {
Evan Chengb783fa32007-07-19 01:14:50 +0000127 def CALL64pcrel32 : I<0xE8, RawFrm, (outs), (ins i64imm:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000128 "call ${dst:call}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000129 def CALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000130 "call {*}$dst", [(X86call GR64:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000131 def CALL64m : I<0xFF, MRM2m, (outs), (ins i64mem:$dst, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000132 "call {*}$dst", []>;
133 }
134
135// Branches
136let isBranch = 1, isTerminator = 1, noResults = 1, isBarrier = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000137 def JMP64r : I<0xFF, MRM4r, (outs), (ins GR64:$dst), "jmp{q} {*}$dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000138 [(brind GR64:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000139 def JMP64m : I<0xFF, MRM4m, (outs), (ins i64mem:$dst), "jmp{q} {*}$dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000140 [(brind (loadi64 addr:$dst))]>;
141}
142
143//===----------------------------------------------------------------------===//
144// Miscellaneous Instructions...
145//
146def LEAVE64 : I<0xC9, RawFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000147 (outs), (ins), "leave", []>, Imp<[RBP,RSP],[RBP,RSP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000148def POP64r : I<0x58, AddRegFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000149 (outs GR64:$reg), (ins), "pop{q} $reg", []>, Imp<[RSP],[RSP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000150def PUSH64r : I<0x50, AddRegFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000151 (outs), (ins GR64:$reg), "push{q} $reg", []>, Imp<[RSP],[RSP]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000152
153def LEA64_32r : I<0x8D, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000154 (outs GR32:$dst), (ins lea64_32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000155 "lea{l} {$src|$dst}, {$dst|$src}",
156 [(set GR32:$dst, lea32addr:$src)]>, Requires<[In64BitMode]>;
157
Evan Chengb783fa32007-07-19 01:14:50 +0000158def LEA64r : RI<0x8D, MRMSrcMem, (outs GR64:$dst), (ins lea64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000159 "lea{q} {$src|$dst}, {$dst|$src}",
160 [(set GR64:$dst, lea64addr:$src)]>;
161
162let isTwoAddress = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000163def BSWAP64r : RI<0xC8, AddRegFrm, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000164 "bswap{q} $dst",
165 [(set GR64:$dst, (bswap GR64:$src))]>, TB;
166// Exchange
Evan Chengb783fa32007-07-19 01:14:50 +0000167def XCHG64rr : RI<0x87, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000168 "xchg{q} {$src2|$src1}, {$src1|$src2}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000169def XCHG64mr : RI<0x87, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000170 "xchg{q} {$src2|$src1}, {$src1|$src2}", []>;
Evan Chengb783fa32007-07-19 01:14:50 +0000171def XCHG64rm : RI<0x87, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000172 "xchg{q} {$src2|$src1}, {$src1|$src2}", []>;
173
174// Repeat string ops
Evan Chengb783fa32007-07-19 01:14:50 +0000175def REP_MOVSQ : RI<0xA5, RawFrm, (outs), (ins), "{rep;movsq|rep movsq}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000176 [(X86rep_movs i64)]>,
177 Imp<[RCX,RDI,RSI], [RCX,RDI,RSI]>, REP;
Evan Chengb783fa32007-07-19 01:14:50 +0000178def REP_STOSQ : RI<0xAB, RawFrm, (outs), (ins), "{rep;stosq|rep stosq}",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000179 [(X86rep_stos i64)]>,
180 Imp<[RAX,RCX,RDI], [RCX,RDI]>, REP;
181
182//===----------------------------------------------------------------------===//
183// Move Instructions...
184//
185
Evan Chengb783fa32007-07-19 01:14:50 +0000186def MOV64rr : RI<0x89, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000187 "mov{q} {$src, $dst|$dst, $src}", []>;
188
Evan Chengb783fa32007-07-19 01:14:50 +0000189def MOV64ri : RIi64<0xB8, AddRegFrm, (outs GR64:$dst), (ins i64imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000190 "movabs{q} {$src, $dst|$dst, $src}",
191 [(set GR64:$dst, imm:$src)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000192def MOV64ri32 : RIi32<0xC7, MRM0r, (outs GR64:$dst), (ins i64i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000193 "mov{q} {$src, $dst|$dst, $src}",
194 [(set GR64:$dst, i64immSExt32:$src)]>;
195
Evan Chengb783fa32007-07-19 01:14:50 +0000196def MOV64rm : RI<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000197 "mov{q} {$src, $dst|$dst, $src}",
198 [(set GR64:$dst, (load addr:$src))]>;
199
Evan Chengb783fa32007-07-19 01:14:50 +0000200def MOV64mr : RI<0x89, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000201 "mov{q} {$src, $dst|$dst, $src}",
202 [(store GR64:$src, addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000203def MOV64mi32 : RIi32<0xC7, MRM0m, (outs), (ins i64mem:$dst, i64i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000204 "mov{q} {$src, $dst|$dst, $src}",
205 [(store i64immSExt32:$src, addr:$dst)]>;
206
207// Sign/Zero extenders
208
Evan Chengb783fa32007-07-19 01:14:50 +0000209def MOVSX64rr8 : RI<0xBE, MRMSrcReg, (outs GR64:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000210 "movs{bq|x} {$src, $dst|$dst, $src}",
211 [(set GR64:$dst, (sext GR8:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000212def MOVSX64rm8 : RI<0xBE, MRMSrcMem, (outs GR64:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000213 "movs{bq|x} {$src, $dst|$dst, $src}",
214 [(set GR64:$dst, (sextloadi64i8 addr:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000215def MOVSX64rr16: RI<0xBF, MRMSrcReg, (outs GR64:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000216 "movs{wq|x} {$src, $dst|$dst, $src}",
217 [(set GR64:$dst, (sext GR16:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000218def MOVSX64rm16: RI<0xBF, MRMSrcMem, (outs GR64:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000219 "movs{wq|x} {$src, $dst|$dst, $src}",
220 [(set GR64:$dst, (sextloadi64i16 addr:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000221def MOVSX64rr32: RI<0x63, MRMSrcReg, (outs GR64:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000222 "movs{lq|xd} {$src, $dst|$dst, $src}",
223 [(set GR64:$dst, (sext GR32:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000224def MOVSX64rm32: RI<0x63, MRMSrcMem, (outs GR64:$dst), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000225 "movs{lq|xd} {$src, $dst|$dst, $src}",
226 [(set GR64:$dst, (sextloadi64i32 addr:$src))]>;
227
Evan Chengb783fa32007-07-19 01:14:50 +0000228def MOVZX64rr8 : RI<0xB6, MRMSrcReg, (outs GR64:$dst), (ins GR8 :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000229 "movz{bq|x} {$src, $dst|$dst, $src}",
230 [(set GR64:$dst, (zext GR8:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000231def MOVZX64rm8 : RI<0xB6, MRMSrcMem, (outs GR64:$dst), (ins i8mem :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000232 "movz{bq|x} {$src, $dst|$dst, $src}",
233 [(set GR64:$dst, (zextloadi64i8 addr:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000234def MOVZX64rr16: RI<0xB7, MRMSrcReg, (outs GR64:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000235 "movz{wq|x} {$src, $dst|$dst, $src}",
236 [(set GR64:$dst, (zext GR16:$src))]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000237def MOVZX64rm16: RI<0xB7, MRMSrcMem, (outs GR64:$dst), (ins i16mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000238 "movz{wq|x} {$src, $dst|$dst, $src}",
239 [(set GR64:$dst, (zextloadi64i16 addr:$src))]>, TB;
240
Evan Chengb783fa32007-07-19 01:14:50 +0000241def CDQE : RI<0x98, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000242 "{cltq|cdqe}", []>, Imp<[EAX],[RAX]>; // RAX = signext(EAX)
243
Evan Chengb783fa32007-07-19 01:14:50 +0000244def CQO : RI<0x99, RawFrm, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000245 "{cqto|cqo}", []>, Imp<[RAX],[RAX,RDX]>; // RDX:RAX = signext(RAX)
246
247//===----------------------------------------------------------------------===//
248// Arithmetic Instructions...
249//
250
251let isTwoAddress = 1 in {
252let isConvertibleToThreeAddress = 1 in {
253let isCommutable = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000254def ADD64rr : RI<0x01, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000255 "add{q} {$src2, $dst|$dst, $src2}",
256 [(set GR64:$dst, (add GR64:$src1, GR64:$src2))]>;
257
Evan Chengb783fa32007-07-19 01:14:50 +0000258def ADD64ri32 : RIi32<0x81, MRM0r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000259 "add{q} {$src2, $dst|$dst, $src2}",
260 [(set GR64:$dst, (add GR64:$src1, i64immSExt32:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000261def ADD64ri8 : RIi8<0x83, MRM0r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000262 "add{q} {$src2, $dst|$dst, $src2}",
263 [(set GR64:$dst, (add GR64:$src1, i64immSExt8:$src2))]>;
264} // isConvertibleToThreeAddress
265
Evan Chengb783fa32007-07-19 01:14:50 +0000266def ADD64rm : RI<0x03, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000267 "add{q} {$src2, $dst|$dst, $src2}",
268 [(set GR64:$dst, (add GR64:$src1, (load addr:$src2)))]>;
269} // isTwoAddress
270
Evan Chengb783fa32007-07-19 01:14:50 +0000271def ADD64mr : RI<0x01, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000272 "add{q} {$src2, $dst|$dst, $src2}",
273 [(store (add (load addr:$dst), GR64:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000274def ADD64mi32 : RIi32<0x81, MRM0m, (outs), (ins i64mem:$dst, i64i32imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000275 "add{q} {$src2, $dst|$dst, $src2}",
276 [(store (add (load addr:$dst), i64immSExt32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000277def ADD64mi8 : RIi8<0x83, MRM0m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000278 "add{q} {$src2, $dst|$dst, $src2}",
279 [(store (add (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
280
281let isTwoAddress = 1 in {
282let isCommutable = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000283def ADC64rr : RI<0x11, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000284 "adc{q} {$src2, $dst|$dst, $src2}",
285 [(set GR64:$dst, (adde GR64:$src1, GR64:$src2))]>;
286
Evan Chengb783fa32007-07-19 01:14:50 +0000287def ADC64rm : RI<0x13, MRMSrcMem , (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000288 "adc{q} {$src2, $dst|$dst, $src2}",
289 [(set GR64:$dst, (adde GR64:$src1, (load addr:$src2)))]>;
290
Evan Chengb783fa32007-07-19 01:14:50 +0000291def ADC64ri32 : RIi32<0x81, MRM2r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000292 "adc{q} {$src2, $dst|$dst, $src2}",
293 [(set GR64:$dst, (adde GR64:$src1, i64immSExt32:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000294def ADC64ri8 : RIi8<0x83, MRM2r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000295 "adc{q} {$src2, $dst|$dst, $src2}",
296 [(set GR64:$dst, (adde GR64:$src1, i64immSExt8:$src2))]>;
297} // isTwoAddress
298
Evan Chengb783fa32007-07-19 01:14:50 +0000299def ADC64mr : RI<0x11, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000300 "adc{q} {$src2, $dst|$dst, $src2}",
301 [(store (adde (load addr:$dst), GR64:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000302def ADC64mi32 : RIi32<0x81, MRM2m, (outs), (ins i64mem:$dst, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000303 "adc{q} {$src2, $dst|$dst, $src2}",
304 [(store (adde (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000305def ADC64mi8 : RIi8<0x83, MRM2m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000306 "adc{q} {$src2, $dst|$dst, $src2}",
307 [(store (adde (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
308
309let isTwoAddress = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000310def SUB64rr : RI<0x29, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000311 "sub{q} {$src2, $dst|$dst, $src2}",
312 [(set GR64:$dst, (sub GR64:$src1, GR64:$src2))]>;
313
Evan Chengb783fa32007-07-19 01:14:50 +0000314def SUB64rm : RI<0x2B, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000315 "sub{q} {$src2, $dst|$dst, $src2}",
316 [(set GR64:$dst, (sub GR64:$src1, (load addr:$src2)))]>;
317
Evan Chengb783fa32007-07-19 01:14:50 +0000318def SUB64ri32 : RIi32<0x81, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000319 "sub{q} {$src2, $dst|$dst, $src2}",
320 [(set GR64:$dst, (sub GR64:$src1, i64immSExt32:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000321def SUB64ri8 : RIi8<0x83, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000322 "sub{q} {$src2, $dst|$dst, $src2}",
323 [(set GR64:$dst, (sub GR64:$src1, i64immSExt8:$src2))]>;
324} // isTwoAddress
325
Evan Chengb783fa32007-07-19 01:14:50 +0000326def SUB64mr : RI<0x29, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000327 "sub{q} {$src2, $dst|$dst, $src2}",
328 [(store (sub (load addr:$dst), GR64:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000329def SUB64mi32 : RIi32<0x81, MRM5m, (outs), (ins i64mem:$dst, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000330 "sub{q} {$src2, $dst|$dst, $src2}",
331 [(store (sub (load addr:$dst), i64immSExt32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000332def SUB64mi8 : RIi8<0x83, MRM5m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000333 "sub{q} {$src2, $dst|$dst, $src2}",
334 [(store (sub (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
335
336let isTwoAddress = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000337def SBB64rr : RI<0x19, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000338 "sbb{q} {$src2, $dst|$dst, $src2}",
339 [(set GR64:$dst, (sube GR64:$src1, GR64:$src2))]>;
340
Evan Chengb783fa32007-07-19 01:14:50 +0000341def SBB64rm : RI<0x1B, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000342 "sbb{q} {$src2, $dst|$dst, $src2}",
343 [(set GR64:$dst, (sube GR64:$src1, (load addr:$src2)))]>;
344
Evan Chengb783fa32007-07-19 01:14:50 +0000345def SBB64ri32 : RIi32<0x81, MRM3r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000346 "sbb{q} {$src2, $dst|$dst, $src2}",
347 [(set GR64:$dst, (sube GR64:$src1, i64immSExt32:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000348def SBB64ri8 : RIi8<0x83, MRM3r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000349 "sbb{q} {$src2, $dst|$dst, $src2}",
350 [(set GR64:$dst, (sube GR64:$src1, i64immSExt8:$src2))]>;
351} // isTwoAddress
352
Evan Chengb783fa32007-07-19 01:14:50 +0000353def SBB64mr : RI<0x19, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000354 "sbb{q} {$src2, $dst|$dst, $src2}",
355 [(store (sube (load addr:$dst), GR64:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000356def SBB64mi32 : RIi32<0x81, MRM3m, (outs), (ins i64mem:$dst, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000357 "sbb{q} {$src2, $dst|$dst, $src2}",
358 [(store (sube (load addr:$dst), i64immSExt32:$src2), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000359def SBB64mi8 : RIi8<0x83, MRM3m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000360 "sbb{q} {$src2, $dst|$dst, $src2}",
361 [(store (sube (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
362
363// Unsigned multiplication
Evan Chengb783fa32007-07-19 01:14:50 +0000364def MUL64r : RI<0xF7, MRM4r, (outs), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000365 "mul{q} $src", []>,
366 Imp<[RAX],[RAX,RDX]>; // RAX,RDX = RAX*GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000367def MUL64m : RI<0xF7, MRM4m, (outs), (ins i64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000368 "mul{q} $src", []>,
369 Imp<[RAX],[RAX,RDX]>; // RAX,RDX = RAX*[mem64]
370
371// Signed multiplication
Evan Chengb783fa32007-07-19 01:14:50 +0000372def IMUL64r : RI<0xF7, MRM5r, (outs), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000373 "imul{q} $src", []>,
374 Imp<[RAX],[RAX,RDX]>; // RAX,RDX = RAX*GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000375def IMUL64m : RI<0xF7, MRM5m, (outs), (ins i64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000376 "imul{q} $src", []>,
377 Imp<[RAX],[RAX,RDX]>; // RAX,RDX = RAX*[mem64]
378
379let isTwoAddress = 1 in {
380let isCommutable = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000381def IMUL64rr : RI<0xAF, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000382 "imul{q} {$src2, $dst|$dst, $src2}",
383 [(set GR64:$dst, (mul GR64:$src1, GR64:$src2))]>, TB;
384
Evan Chengb783fa32007-07-19 01:14:50 +0000385def IMUL64rm : RI<0xAF, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000386 "imul{q} {$src2, $dst|$dst, $src2}",
387 [(set GR64:$dst, (mul GR64:$src1, (load addr:$src2)))]>, TB;
388} // isTwoAddress
389
390// Suprisingly enough, these are not two address instructions!
391def IMUL64rri32 : RIi32<0x69, MRMSrcReg, // GR64 = GR64*I32
Evan Chengb783fa32007-07-19 01:14:50 +0000392 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000393 "imul{q} {$src2, $src1, $dst|$dst, $src1, $src2}",
394 [(set GR64:$dst, (mul GR64:$src1, i64immSExt32:$src2))]>;
395def IMUL64rri8 : RIi8<0x6B, MRMSrcReg, // GR64 = GR64*I8
Evan Chengb783fa32007-07-19 01:14:50 +0000396 (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000397 "imul{q} {$src2, $src1, $dst|$dst, $src1, $src2}",
398 [(set GR64:$dst, (mul GR64:$src1, i64immSExt8:$src2))]>;
399def IMUL64rmi32 : RIi32<0x69, MRMSrcMem, // GR64 = [mem64]*I32
Evan Chengb783fa32007-07-19 01:14:50 +0000400 (outs GR64:$dst), (ins i64mem:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000401 "imul{q} {$src2, $src1, $dst|$dst, $src1, $src2}",
402 [(set GR64:$dst, (mul (load addr:$src1), i64immSExt32:$src2))]>;
403def IMUL64rmi8 : RIi8<0x6B, MRMSrcMem, // GR64 = [mem64]*I8
Evan Chengb783fa32007-07-19 01:14:50 +0000404 (outs GR64:$dst), (ins i64mem:$src1, i64i8imm: $src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000405 "imul{q} {$src2, $src1, $dst|$dst, $src1, $src2}",
406 [(set GR64:$dst, (mul (load addr:$src1), i64immSExt8:$src2))]>;
407
408// Unsigned division / remainder
Evan Chengb783fa32007-07-19 01:14:50 +0000409def DIV64r : RI<0xF7, MRM6r, (outs), (ins GR64:$src), // RDX:RAX/r64 = RAX,RDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000410 "div{q} $src", []>, Imp<[RAX,RDX],[RAX,RDX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000411def DIV64m : RI<0xF7, MRM6m, (outs), (ins i64mem:$src), // RDX:RAX/[mem64] = RAX,RDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000412 "div{q} $src", []>, Imp<[RAX,RDX],[RAX,RDX]>;
413
414// Signed division / remainder
Evan Chengb783fa32007-07-19 01:14:50 +0000415def IDIV64r: RI<0xF7, MRM7r, (outs), (ins GR64:$src), // RDX:RAX/r64 = RAX,RDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000416 "idiv{q} $src", []>, Imp<[RAX,RDX],[RAX,RDX]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000417def IDIV64m: RI<0xF7, MRM7m, (outs), (ins i64mem:$src), // RDX:RAX/[mem64] = RAX,RDX
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000418 "idiv{q} $src", []>, Imp<[RAX,RDX],[RAX,RDX]>;
419
420// Unary instructions
421let CodeSize = 2 in {
422let isTwoAddress = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000423def NEG64r : RI<0xF7, MRM3r, (outs GR64:$dst), (ins GR64:$src), "neg{q} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000424 [(set GR64:$dst, (ineg GR64:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000425def NEG64m : RI<0xF7, MRM3m, (outs), (ins i64mem:$dst), "neg{q} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000426 [(store (ineg (loadi64 addr:$dst)), addr:$dst)]>;
427
428let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000429def INC64r : RI<0xFF, MRM0r, (outs GR64:$dst), (ins GR64:$src), "inc{q} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000430 [(set GR64:$dst, (add GR64:$src, 1))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000431def INC64m : RI<0xFF, MRM0m, (outs), (ins i64mem:$dst), "inc{q} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000432 [(store (add (loadi64 addr:$dst), 1), addr:$dst)]>;
433
434let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000435def DEC64r : RI<0xFF, MRM1r, (outs GR64:$dst), (ins GR64:$src), "dec{q} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000436 [(set GR64:$dst, (add GR64:$src, -1))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000437def DEC64m : RI<0xFF, MRM1m, (outs), (ins i64mem:$dst), "dec{q} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000438 [(store (add (loadi64 addr:$dst), -1), addr:$dst)]>;
439
440// In 64-bit mode, single byte INC and DEC cannot be encoded.
441let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in {
442// Can transform into LEA.
Evan Chengb783fa32007-07-19 01:14:50 +0000443def INC64_16r : I<0xFF, MRM0r, (outs GR16:$dst), (ins GR16:$src), "inc{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000444 [(set GR16:$dst, (add GR16:$src, 1))]>,
445 OpSize, Requires<[In64BitMode]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000446def INC64_32r : I<0xFF, MRM0r, (outs GR32:$dst), (ins GR32:$src), "inc{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000447 [(set GR32:$dst, (add GR32:$src, 1))]>,
448 Requires<[In64BitMode]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000449def DEC64_16r : I<0xFF, MRM1r, (outs GR16:$dst), (ins GR16:$src), "dec{w} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000450 [(set GR16:$dst, (add GR16:$src, -1))]>,
451 OpSize, Requires<[In64BitMode]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000452def DEC64_32r : I<0xFF, MRM1r, (outs GR32:$dst), (ins GR32:$src), "dec{l} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000453 [(set GR32:$dst, (add GR32:$src, -1))]>,
454 Requires<[In64BitMode]>;
455} // isConvertibleToThreeAddress
456} // CodeSize
457
458
459// Shift instructions
460let isTwoAddress = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000461def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000462 "shl{q} {%cl, $dst|$dst, %CL}",
463 [(set GR64:$dst, (shl GR64:$src, CL))]>,
464 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000465def SHL64ri : RIi8<0xC1, MRM4r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000466 "shl{q} {$src2, $dst|$dst, $src2}",
467 [(set GR64:$dst, (shl GR64:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000468def SHL64r1 : RI<0xD1, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000469 "shl{q} $dst", []>;
470} // isTwoAddress
471
Evan Chengb783fa32007-07-19 01:14:50 +0000472def SHL64mCL : RI<0xD3, MRM4m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000473 "shl{q} {%cl, $dst|$dst, %CL}",
474 [(store (shl (loadi64 addr:$dst), CL), addr:$dst)]>,
475 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000476def SHL64mi : RIi8<0xC1, MRM4m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000477 "shl{q} {$src, $dst|$dst, $src}",
478 [(store (shl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000479def SHL64m1 : RI<0xD1, MRM4m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000480 "shl{q} $dst",
481 [(store (shl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
482
483let isTwoAddress = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000484def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000485 "shr{q} {%cl, $dst|$dst, %CL}",
486 [(set GR64:$dst, (srl GR64:$src, CL))]>,
487 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000488def SHR64ri : RIi8<0xC1, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000489 "shr{q} {$src2, $dst|$dst, $src2}",
490 [(set GR64:$dst, (srl GR64:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000491def SHR64r1 : RI<0xD1, MRM5r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000492 "shr{q} $dst",
493 [(set GR64:$dst, (srl GR64:$src1, (i8 1)))]>;
494} // isTwoAddress
495
Evan Chengb783fa32007-07-19 01:14:50 +0000496def SHR64mCL : RI<0xD3, MRM5m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000497 "shr{q} {%cl, $dst|$dst, %CL}",
498 [(store (srl (loadi64 addr:$dst), CL), addr:$dst)]>,
499 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000500def SHR64mi : RIi8<0xC1, MRM5m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000501 "shr{q} {$src, $dst|$dst, $src}",
502 [(store (srl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000503def SHR64m1 : RI<0xD1, MRM5m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000504 "shr{q} $dst",
505 [(store (srl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
506
507let isTwoAddress = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000508def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000509 "sar{q} {%cl, $dst|$dst, %CL}",
510 [(set GR64:$dst, (sra GR64:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000511def SAR64ri : RIi8<0xC1, MRM7r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000512 "sar{q} {$src2, $dst|$dst, $src2}",
513 [(set GR64:$dst, (sra GR64:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000514def SAR64r1 : RI<0xD1, MRM7r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000515 "sar{q} $dst",
516 [(set GR64:$dst, (sra GR64:$src1, (i8 1)))]>;
517} // isTwoAddress
518
Evan Chengb783fa32007-07-19 01:14:50 +0000519def SAR64mCL : RI<0xD3, MRM7m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000520 "sar{q} {%cl, $dst|$dst, %CL}",
521 [(store (sra (loadi64 addr:$dst), CL), addr:$dst)]>,
522 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000523def SAR64mi : RIi8<0xC1, MRM7m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000524 "sar{q} {$src, $dst|$dst, $src}",
525 [(store (sra (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000526def SAR64m1 : RI<0xD1, MRM7m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000527 "sar{q} $dst",
528 [(store (sra (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
529
530// Rotate instructions
531let isTwoAddress = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000532def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000533 "rol{q} {%cl, $dst|$dst, %CL}",
534 [(set GR64:$dst, (rotl GR64:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000535def ROL64ri : RIi8<0xC1, MRM0r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000536 "rol{q} {$src2, $dst|$dst, $src2}",
537 [(set GR64:$dst, (rotl GR64:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000538def ROL64r1 : RI<0xD1, MRM0r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000539 "rol{q} $dst",
540 [(set GR64:$dst, (rotl GR64:$src1, (i8 1)))]>;
541} // isTwoAddress
542
Evan Chengb783fa32007-07-19 01:14:50 +0000543def ROL64mCL : I<0xD3, MRM0m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000544 "rol{q} {%cl, $dst|$dst, %CL}",
545 [(store (rotl (loadi64 addr:$dst), CL), addr:$dst)]>,
546 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000547def ROL64mi : RIi8<0xC1, MRM0m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000548 "rol{q} {$src, $dst|$dst, $src}",
549 [(store (rotl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000550def ROL64m1 : RI<0xD1, MRM0m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000551 "rol{q} $dst",
552 [(store (rotl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
553
554let isTwoAddress = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000555def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000556 "ror{q} {%cl, $dst|$dst, %CL}",
557 [(set GR64:$dst, (rotr GR64:$src, CL))]>, Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000558def ROR64ri : RIi8<0xC1, MRM1r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000559 "ror{q} {$src2, $dst|$dst, $src2}",
560 [(set GR64:$dst, (rotr GR64:$src1, (i8 imm:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000561def ROR64r1 : RI<0xD1, MRM1r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000562 "ror{q} $dst",
563 [(set GR64:$dst, (rotr GR64:$src1, (i8 1)))]>;
564} // isTwoAddress
565
Evan Chengb783fa32007-07-19 01:14:50 +0000566def ROR64mCL : RI<0xD3, MRM1m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000567 "ror{q} {%cl, $dst|$dst, %CL}",
568 [(store (rotr (loadi64 addr:$dst), CL), addr:$dst)]>,
569 Imp<[CL],[]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000570def ROR64mi : RIi8<0xC1, MRM1m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000571 "ror{q} {$src, $dst|$dst, $src}",
572 [(store (rotr (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000573def ROR64m1 : RI<0xD1, MRM1m, (outs), (ins i64mem:$dst),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000574 "ror{q} $dst",
575 [(store (rotr (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
576
577// Double shift instructions (generalizations of rotate)
578let isTwoAddress = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000579def SHLD64rrCL : RI<0xA5, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000580 "shld{q} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
581 Imp<[CL],[]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000582def SHRD64rrCL : RI<0xAD, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000583 "shrd{q} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
584 Imp<[CL],[]>, TB;
585
586let isCommutable = 1 in { // FIXME: Update X86InstrInfo::commuteInstruction
587def SHLD64rri8 : RIi8<0xA4, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +0000588 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000589 "shld{q} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
590 TB;
591def SHRD64rri8 : RIi8<0xAC, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +0000592 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000593 "shrd{q} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
594 TB;
595} // isCommutable
596} // isTwoAddress
597
598// Temporary hack: there is no patterns associated with these instructions
599// so we have to tell tblgen that these do not produce results.
600let noResults = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000601def SHLD64mrCL : RI<0xA5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000602 "shld{q} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
603 Imp<[CL],[]>, TB;
Evan Chengb783fa32007-07-19 01:14:50 +0000604def SHRD64mrCL : RI<0xAD, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000605 "shrd{q} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
606 Imp<[CL],[]>, TB;
607def SHLD64mri8 : RIi8<0xA4, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000608 (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000609 "shld{q} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
610 TB;
611def SHRD64mri8 : RIi8<0xAC, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000612 (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000613 "shrd{q} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
614 TB;
615} // noResults
616
617//===----------------------------------------------------------------------===//
618// Logical Instructions...
619//
620
621let isTwoAddress = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000622def NOT64r : RI<0xF7, MRM2r, (outs GR64:$dst), (ins GR64:$src), "not{q} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000623 [(set GR64:$dst, (not GR64:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000624def NOT64m : RI<0xF7, MRM2m, (outs), (ins i64mem:$dst), "not{q} $dst",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000625 [(store (not (loadi64 addr:$dst)), addr:$dst)]>;
626
627let isTwoAddress = 1 in {
628let isCommutable = 1 in
629def AND64rr : RI<0x21, MRMDestReg,
Evan Chengb783fa32007-07-19 01:14:50 +0000630 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000631 "and{q} {$src2, $dst|$dst, $src2}",
632 [(set GR64:$dst, (and GR64:$src1, GR64:$src2))]>;
633def AND64rm : RI<0x23, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000634 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000635 "and{q} {$src2, $dst|$dst, $src2}",
636 [(set GR64:$dst, (and GR64:$src1, (load addr:$src2)))]>;
637def AND64ri32 : RIi32<0x81, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +0000638 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000639 "and{q} {$src2, $dst|$dst, $src2}",
640 [(set GR64:$dst, (and GR64:$src1, i64immSExt32:$src2))]>;
641def AND64ri8 : RIi8<0x83, MRM4r,
Evan Chengb783fa32007-07-19 01:14:50 +0000642 (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000643 "and{q} {$src2, $dst|$dst, $src2}",
644 [(set GR64:$dst, (and GR64:$src1, i64immSExt8:$src2))]>;
645} // isTwoAddress
646
647def AND64mr : RI<0x21, MRMDestMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000648 (outs), (ins i64mem:$dst, GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000649 "and{q} {$src, $dst|$dst, $src}",
650 [(store (and (load addr:$dst), GR64:$src), addr:$dst)]>;
651def AND64mi32 : RIi32<0x81, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +0000652 (outs), (ins i64mem:$dst, i64i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000653 "and{q} {$src, $dst|$dst, $src}",
654 [(store (and (loadi64 addr:$dst), i64immSExt32:$src), addr:$dst)]>;
655def AND64mi8 : RIi8<0x83, MRM4m,
Evan Chengb783fa32007-07-19 01:14:50 +0000656 (outs), (ins i64mem:$dst, i64i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000657 "and{q} {$src, $dst|$dst, $src}",
658 [(store (and (load addr:$dst), i64immSExt8:$src), addr:$dst)]>;
659
660let isTwoAddress = 1 in {
661let isCommutable = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000662def OR64rr : RI<0x09, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000663 "or{q} {$src2, $dst|$dst, $src2}",
664 [(set GR64:$dst, (or GR64:$src1, GR64:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000665def OR64rm : RI<0x0B, MRMSrcMem , (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000666 "or{q} {$src2, $dst|$dst, $src2}",
667 [(set GR64:$dst, (or GR64:$src1, (load addr:$src2)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000668def OR64ri32 : RIi32<0x81, MRM1r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000669 "or{q} {$src2, $dst|$dst, $src2}",
670 [(set GR64:$dst, (or GR64:$src1, i64immSExt32:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000671def OR64ri8 : RIi8<0x83, MRM1r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000672 "or{q} {$src2, $dst|$dst, $src2}",
673 [(set GR64:$dst, (or GR64:$src1, i64immSExt8:$src2))]>;
674} // isTwoAddress
675
Evan Chengb783fa32007-07-19 01:14:50 +0000676def OR64mr : RI<0x09, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000677 "or{q} {$src, $dst|$dst, $src}",
678 [(store (or (load addr:$dst), GR64:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000679def OR64mi32 : RIi32<0x81, MRM1m, (outs), (ins i64mem:$dst, i64i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000680 "or{q} {$src, $dst|$dst, $src}",
681 [(store (or (loadi64 addr:$dst), i64immSExt32:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000682def OR64mi8 : RIi8<0x83, MRM1m, (outs), (ins i64mem:$dst, i64i8imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000683 "or{q} {$src, $dst|$dst, $src}",
684 [(store (or (load addr:$dst), i64immSExt8:$src), addr:$dst)]>;
685
686let isTwoAddress = 1 in {
687let isCommutable = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000688def XOR64rr : RI<0x31, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000689 "xor{q} {$src2, $dst|$dst, $src2}",
690 [(set GR64:$dst, (xor GR64:$src1, GR64:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000691def XOR64rm : RI<0x33, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000692 "xor{q} {$src2, $dst|$dst, $src2}",
693 [(set GR64:$dst, (xor GR64:$src1, (load addr:$src2)))]>;
694def XOR64ri32 : RIi32<0x81, MRM6r,
Evan Chengb783fa32007-07-19 01:14:50 +0000695 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000696 "xor{q} {$src2, $dst|$dst, $src2}",
697 [(set GR64:$dst, (xor GR64:$src1, i64immSExt32:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000698def XOR64ri8 : RIi8<0x83, MRM6r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000699 "xor{q} {$src2, $dst|$dst, $src2}",
700 [(set GR64:$dst, (xor GR64:$src1, i64immSExt8:$src2))]>;
701} // isTwoAddress
702
Evan Chengb783fa32007-07-19 01:14:50 +0000703def XOR64mr : RI<0x31, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000704 "xor{q} {$src, $dst|$dst, $src}",
705 [(store (xor (load addr:$dst), GR64:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000706def XOR64mi32 : RIi32<0x81, MRM6m, (outs), (ins i64mem:$dst, i64i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000707 "xor{q} {$src, $dst|$dst, $src}",
708 [(store (xor (loadi64 addr:$dst), i64immSExt32:$src), addr:$dst)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000709def XOR64mi8 : RIi8<0x83, MRM6m, (outs), (ins i64mem:$dst, i64i8imm :$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000710 "xor{q} {$src, $dst|$dst, $src}",
711 [(store (xor (load addr:$dst), i64immSExt8:$src), addr:$dst)]>;
712
713//===----------------------------------------------------------------------===//
714// Comparison Instructions...
715//
716
717// Integer comparison
718let isCommutable = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +0000719def TEST64rr : RI<0x85, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000720 "test{q} {$src2, $src1|$src1, $src2}",
721 [(X86cmp (and GR64:$src1, GR64:$src2), 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000722def TEST64rm : RI<0x85, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000723 "test{q} {$src2, $src1|$src1, $src2}",
724 [(X86cmp (and GR64:$src1, (loadi64 addr:$src2)), 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000725def TEST64ri32 : RIi32<0xF7, MRM0r, (outs), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000726 "test{q} {$src2, $src1|$src1, $src2}",
727 [(X86cmp (and GR64:$src1, i64immSExt32:$src2), 0)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000728def TEST64mi32 : RIi32<0xF7, MRM0m, (outs), (ins i64mem:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000729 "test{q} {$src2, $src1|$src1, $src2}",
730 [(X86cmp (and (loadi64 addr:$src1), i64immSExt32:$src2), 0)]>;
731
Evan Chengb783fa32007-07-19 01:14:50 +0000732def CMP64rr : RI<0x39, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000733 "cmp{q} {$src2, $src1|$src1, $src2}",
734 [(X86cmp GR64:$src1, GR64:$src2)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000735def CMP64mr : RI<0x39, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000736 "cmp{q} {$src2, $src1|$src1, $src2}",
737 [(X86cmp (loadi64 addr:$src1), GR64:$src2)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000738def CMP64rm : RI<0x3B, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000739 "cmp{q} {$src2, $src1|$src1, $src2}",
740 [(X86cmp GR64:$src1, (loadi64 addr:$src2))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000741def CMP64ri32 : RIi32<0x81, MRM7r, (outs), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000742 "cmp{q} {$src2, $src1|$src1, $src2}",
743 [(X86cmp GR64:$src1, i64immSExt32:$src2)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000744def CMP64mi32 : RIi32<0x81, MRM7m, (outs), (ins i64mem:$src1, i64i32imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000745 "cmp{q} {$src2, $src1|$src1, $src2}",
746 [(X86cmp (loadi64 addr:$src1), i64immSExt32:$src2)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000747def CMP64mi8 : RIi8<0x83, MRM7m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000748 "cmp{q} {$src2, $src1|$src1, $src2}",
749 [(X86cmp (loadi64 addr:$src1), i64immSExt8:$src2)]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000750def CMP64ri8 : RIi8<0x83, MRM7r, (outs), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000751 "cmp{q} {$src2, $src1|$src1, $src2}",
752 [(X86cmp GR64:$src1, i64immSExt8:$src2)]>;
753
754// Conditional moves
755let isTwoAddress = 1 in {
756def CMOVB64rr : RI<0x42, MRMSrcReg, // if <u, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000757 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000758 "cmovb {$src2, $dst|$dst, $src2}",
759 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
760 X86_COND_B))]>, TB;
761def CMOVB64rm : RI<0x42, MRMSrcMem, // if <u, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000762 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000763 "cmovb {$src2, $dst|$dst, $src2}",
764 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
765 X86_COND_B))]>, TB;
766def CMOVAE64rr: RI<0x43, MRMSrcReg, // if >=u, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000767 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000768 "cmovae {$src2, $dst|$dst, $src2}",
769 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
770 X86_COND_AE))]>, TB;
771def CMOVAE64rm: RI<0x43, MRMSrcMem, // if >=u, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000772 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000773 "cmovae {$src2, $dst|$dst, $src2}",
774 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
775 X86_COND_AE))]>, TB;
776def CMOVE64rr : RI<0x44, MRMSrcReg, // if ==, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000777 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000778 "cmove {$src2, $dst|$dst, $src2}",
779 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
780 X86_COND_E))]>, TB;
781def CMOVE64rm : RI<0x44, MRMSrcMem, // if ==, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000782 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000783 "cmove {$src2, $dst|$dst, $src2}",
784 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
785 X86_COND_E))]>, TB;
786def CMOVNE64rr: RI<0x45, MRMSrcReg, // if !=, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000787 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000788 "cmovne {$src2, $dst|$dst, $src2}",
789 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
790 X86_COND_NE))]>, TB;
791def CMOVNE64rm: RI<0x45, MRMSrcMem, // if !=, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000792 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000793 "cmovne {$src2, $dst|$dst, $src2}",
794 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
795 X86_COND_NE))]>, TB;
796def CMOVBE64rr: RI<0x46, MRMSrcReg, // if <=u, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000797 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000798 "cmovbe {$src2, $dst|$dst, $src2}",
799 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
800 X86_COND_BE))]>, TB;
801def CMOVBE64rm: RI<0x46, MRMSrcMem, // if <=u, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000802 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000803 "cmovbe {$src2, $dst|$dst, $src2}",
804 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
805 X86_COND_BE))]>, TB;
806def CMOVA64rr : RI<0x47, MRMSrcReg, // if >u, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000807 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000808 "cmova {$src2, $dst|$dst, $src2}",
809 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
810 X86_COND_A))]>, TB;
811def CMOVA64rm : RI<0x47, MRMSrcMem, // if >u, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000812 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000813 "cmova {$src2, $dst|$dst, $src2}",
814 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
815 X86_COND_A))]>, TB;
816def CMOVL64rr : RI<0x4C, MRMSrcReg, // if <s, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000817 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000818 "cmovl {$src2, $dst|$dst, $src2}",
819 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
820 X86_COND_L))]>, TB;
821def CMOVL64rm : RI<0x4C, MRMSrcMem, // if <s, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000822 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000823 "cmovl {$src2, $dst|$dst, $src2}",
824 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
825 X86_COND_L))]>, TB;
826def CMOVGE64rr: RI<0x4D, MRMSrcReg, // if >=s, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000827 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000828 "cmovge {$src2, $dst|$dst, $src2}",
829 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
830 X86_COND_GE))]>, TB;
831def CMOVGE64rm: RI<0x4D, MRMSrcMem, // if >=s, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000832 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000833 "cmovge {$src2, $dst|$dst, $src2}",
834 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
835 X86_COND_GE))]>, TB;
836def CMOVLE64rr: RI<0x4E, MRMSrcReg, // if <=s, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000837 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000838 "cmovle {$src2, $dst|$dst, $src2}",
839 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
840 X86_COND_LE))]>, TB;
841def CMOVLE64rm: RI<0x4E, MRMSrcMem, // if <=s, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000842 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000843 "cmovle {$src2, $dst|$dst, $src2}",
844 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
845 X86_COND_LE))]>, TB;
846def CMOVG64rr : RI<0x4F, MRMSrcReg, // if >s, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000847 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000848 "cmovg {$src2, $dst|$dst, $src2}",
849 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
850 X86_COND_G))]>, TB;
851def CMOVG64rm : RI<0x4F, MRMSrcMem, // if >s, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000852 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000853 "cmovg {$src2, $dst|$dst, $src2}",
854 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
855 X86_COND_G))]>, TB;
856def CMOVS64rr : RI<0x48, MRMSrcReg, // if signed, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000857 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000858 "cmovs {$src2, $dst|$dst, $src2}",
859 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
860 X86_COND_S))]>, TB;
861def CMOVS64rm : RI<0x48, MRMSrcMem, // if signed, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000862 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000863 "cmovs {$src2, $dst|$dst, $src2}",
864 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
865 X86_COND_S))]>, TB;
866def CMOVNS64rr: RI<0x49, MRMSrcReg, // if !signed, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000867 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000868 "cmovns {$src2, $dst|$dst, $src2}",
869 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
870 X86_COND_NS))]>, TB;
871def CMOVNS64rm: RI<0x49, MRMSrcMem, // if !signed, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000872 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000873 "cmovns {$src2, $dst|$dst, $src2}",
874 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
875 X86_COND_NS))]>, TB;
876def CMOVP64rr : RI<0x4A, MRMSrcReg, // if parity, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000877 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000878 "cmovp {$src2, $dst|$dst, $src2}",
879 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
880 X86_COND_P))]>, TB;
881def CMOVP64rm : RI<0x4A, MRMSrcMem, // if parity, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000882 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000883 "cmovp {$src2, $dst|$dst, $src2}",
884 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
885 X86_COND_P))]>, TB;
886def CMOVNP64rr : RI<0x4B, MRMSrcReg, // if !parity, GR64 = GR64
Evan Chengb783fa32007-07-19 01:14:50 +0000887 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000888 "cmovnp {$src2, $dst|$dst, $src2}",
889 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
890 X86_COND_NP))]>, TB;
891def CMOVNP64rm : RI<0x4B, MRMSrcMem, // if !parity, GR64 = [mem64]
Evan Chengb783fa32007-07-19 01:14:50 +0000892 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000893 "cmovnp {$src2, $dst|$dst, $src2}",
894 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
895 X86_COND_NP))]>, TB;
896} // isTwoAddress
897
898//===----------------------------------------------------------------------===//
899// Conversion Instructions...
900//
901
902// f64 -> signed i64
Evan Chengb783fa32007-07-19 01:14:50 +0000903def Int_CVTSD2SI64rr: RSDI<0x2D, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000904 "cvtsd2si{q} {$src, $dst|$dst, $src}",
905 []>; // TODO: add intrinsic
Evan Chengb783fa32007-07-19 01:14:50 +0000906def Int_CVTSD2SI64rm: RSDI<0x2D, MRMSrcMem, (outs GR64:$dst), (ins f128mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000907 "cvtsd2si{q} {$src, $dst|$dst, $src}",
908 []>; // TODO: add intrinsic
Evan Chengb783fa32007-07-19 01:14:50 +0000909def CVTTSD2SI64rr: RSDI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins FR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000910 "cvttsd2si{q} {$src, $dst|$dst, $src}",
911 [(set GR64:$dst, (fp_to_sint FR64:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000912def CVTTSD2SI64rm: RSDI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000913 "cvttsd2si{q} {$src, $dst|$dst, $src}",
914 [(set GR64:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000915def Int_CVTTSD2SI64rr: RSDI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000916 "cvttsd2si{q} {$src, $dst|$dst, $src}",
917 []>; // TODO: add intrinsic
Evan Chengb783fa32007-07-19 01:14:50 +0000918def Int_CVTTSD2SI64rm: RSDI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f128mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000919 "cvttsd2si{q} {$src, $dst|$dst, $src}",
920 []>; // TODO: add intrinsic
921
922// Signed i64 -> f64
Evan Chengb783fa32007-07-19 01:14:50 +0000923def CVTSI2SD64rr: RSDI<0x2A, MRMSrcReg, (outs FR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000924 "cvtsi2sd{q} {$src, $dst|$dst, $src}",
925 [(set FR64:$dst, (sint_to_fp GR64:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000926def CVTSI2SD64rm: RSDI<0x2A, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000927 "cvtsi2sd{q} {$src, $dst|$dst, $src}",
928 [(set FR64:$dst, (sint_to_fp (loadi64 addr:$src)))]>;
929let isTwoAddress = 1 in {
930def Int_CVTSI2SD64rr: RSDI<0x2A, MRMSrcReg,
Evan Chengb783fa32007-07-19 01:14:50 +0000931 (outs VR128:$dst), (ins VR128:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000932 "cvtsi2sd{q} {$src2, $dst|$dst, $src2}",
933 []>; // TODO: add intrinsic
934def Int_CVTSI2SD64rm: RSDI<0x2A, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000935 (outs VR128:$dst), (ins VR128:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000936 "cvtsi2sd{q} {$src2, $dst|$dst, $src2}",
937 []>; // TODO: add intrinsic
938} // isTwoAddress
939
940// Signed i64 -> f32
Evan Chengb783fa32007-07-19 01:14:50 +0000941def CVTSI2SS64rr: RSSI<0x2A, MRMSrcReg, (outs FR32:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000942 "cvtsi2ss{q} {$src, $dst|$dst, $src}",
943 [(set FR32:$dst, (sint_to_fp GR64:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000944def CVTSI2SS64rm: RSSI<0x2A, MRMSrcMem, (outs FR32:$dst), (ins i64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000945 "cvtsi2ss{q} {$src, $dst|$dst, $src}",
946 [(set FR32:$dst, (sint_to_fp (loadi64 addr:$src)))]>;
947let isTwoAddress = 1 in {
948def Int_CVTSI2SS64rr: RSSI<0x2A, MRMSrcReg,
Evan Chengb783fa32007-07-19 01:14:50 +0000949 (outs VR128:$dst), (ins VR128:$src1, GR64:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000950 "cvtsi2ss{q} {$src2, $dst|$dst, $src2}",
951 []>; // TODO: add intrinsic
952def Int_CVTSI2SS64rm: RSSI<0x2A, MRMSrcMem,
Evan Chengb783fa32007-07-19 01:14:50 +0000953 (outs VR128:$dst), (ins VR128:$src1, i64mem:$src2),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000954 "cvtsi2ss{q} {$src2, $dst|$dst, $src2}",
955 []>; // TODO: add intrinsic
956} // isTwoAddress
957
958// f32 -> signed i64
Evan Chengb783fa32007-07-19 01:14:50 +0000959def Int_CVTSS2SI64rr: RSSI<0x2D, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000960 "cvtss2si{q} {$src, $dst|$dst, $src}",
961 []>; // TODO: add intrinsic
Evan Chengb783fa32007-07-19 01:14:50 +0000962def Int_CVTSS2SI64rm: RSSI<0x2D, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000963 "cvtss2si{q} {$src, $dst|$dst, $src}",
964 []>; // TODO: add intrinsic
Evan Chengb783fa32007-07-19 01:14:50 +0000965def CVTTSS2SI64rr: RSSI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins FR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000966 "cvttss2si{q} {$src, $dst|$dst, $src}",
967 [(set GR64:$dst, (fp_to_sint FR32:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000968def CVTTSS2SI64rm: RSSI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000969 "cvttss2si{q} {$src, $dst|$dst, $src}",
970 [(set GR64:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000971def Int_CVTTSS2SI64rr: RSSI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000972 "cvttss2si{q} {$src, $dst|$dst, $src}",
973 []>; // TODO: add intrinsic
Evan Chengb783fa32007-07-19 01:14:50 +0000974def Int_CVTTSS2SI64rm: RSSI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000975 "cvttss2si{q} {$src, $dst|$dst, $src}",
976 []>; // TODO: add intrinsic
977
978//===----------------------------------------------------------------------===//
979// Alias Instructions
980//===----------------------------------------------------------------------===//
981
982// Truncate
983// In 64-mode, each 64-bit and 32-bit registers has a low 8-bit sub-register.
Evan Chengb783fa32007-07-19 01:14:50 +0000984def TRUNC_64to8 : I<0x88, MRMDestReg, (outs GR8:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000985 "mov{b} {${src:subreg8}, $dst|$dst, ${src:subreg8}",
986 [(set GR8:$dst, (trunc GR64:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000987def TRUNC_32to8 : I<0x88, MRMDestReg, (outs GR8:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000988 "mov{b} {${src:subreg8}, $dst|$dst, ${src:subreg8}",
989 [(set GR8:$dst, (trunc GR32:$src))]>,
990 Requires<[In64BitMode]>;
Evan Chengb783fa32007-07-19 01:14:50 +0000991def TRUNC_16to8 : I<0x88, MRMDestReg, (outs GR8:$dst), (ins GR16:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000992 "mov{b} {${src:subreg8}, $dst|$dst, ${src:subreg8}}",
993 [(set GR8:$dst, (trunc GR16:$src))]>,
994 Requires<[In64BitMode]>;
995
Evan Chengb783fa32007-07-19 01:14:50 +0000996def TRUNC_64to16 : I<0x89, MRMDestReg, (outs GR16:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000997 "mov{w} {${src:subreg16}, $dst|$dst, ${src:subreg16}}",
998 [(set GR16:$dst, (trunc GR64:$src))]>;
999
Evan Chengb783fa32007-07-19 01:14:50 +00001000def TRUNC_64to32 : I<0x89, MRMDestReg, (outs GR32:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001001 "mov{l} {${src:subreg32}, $dst|$dst, ${src:subreg32}}",
1002 [(set GR32:$dst, (trunc GR64:$src))]>;
1003
1004// Zero-extension
1005// TODO: Remove this after proper i32 -> i64 zext support.
Evan Chengb783fa32007-07-19 01:14:50 +00001006def PsMOVZX64rr32: I<0x89, MRMDestReg, (outs GR64:$dst), (ins GR32:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001007 "mov{l} {$src, ${dst:subreg32}|${dst:subreg32}, $src}",
1008 [(set GR64:$dst, (zext GR32:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001009def PsMOVZX64rm32: I<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i32mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001010 "mov{l} {$src, ${dst:subreg32}|${dst:subreg32}, $src}",
1011 [(set GR64:$dst, (zextloadi64i32 addr:$src))]>;
1012
1013
1014// Alias instructions that map movr0 to xor.
1015// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
1016// FIXME: AddedComplexity gives MOV64r0 a higher priority than MOV64ri32. Remove
1017// when we have a better way to specify isel priority.
1018let AddedComplexity = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +00001019def MOV64r0 : RI<0x31, MRMInitReg, (outs GR64:$dst), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001020 "xor{q} $dst, $dst",
1021 [(set GR64:$dst, 0)]>;
1022
1023// Materialize i64 constant where top 32-bits are zero.
1024let AddedComplexity = 1 in
Evan Chengb783fa32007-07-19 01:14:50 +00001025def MOV64ri64i32 : Ii32<0xB8, AddRegFrm, (outs GR64:$dst), (ins i64i32imm:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001026 "mov{l} {$src, ${dst:subreg32}|${dst:subreg32}, $src}",
1027 [(set GR64:$dst, i64immZExt32:$src)]>;
1028
1029//===----------------------------------------------------------------------===//
1030// Non-Instruction Patterns
1031//===----------------------------------------------------------------------===//
1032
1033// ConstantPool GlobalAddress, ExternalSymbol, and JumpTable
1034def : Pat<(i64 (X86Wrapper tconstpool :$dst)),
1035 (MOV64ri tconstpool :$dst)>, Requires<[NotSmallCode]>;
1036def : Pat<(i64 (X86Wrapper tjumptable :$dst)),
1037 (MOV64ri tjumptable :$dst)>, Requires<[NotSmallCode]>;
1038def : Pat<(i64 (X86Wrapper tglobaladdr :$dst)),
1039 (MOV64ri tglobaladdr :$dst)>, Requires<[NotSmallCode]>;
1040def : Pat<(i64 (X86Wrapper texternalsym:$dst)),
1041 (MOV64ri texternalsym:$dst)>, Requires<[NotSmallCode]>;
1042
1043def : Pat<(store (i64 (X86Wrapper tconstpool:$src)), addr:$dst),
1044 (MOV64mi32 addr:$dst, tconstpool:$src)>,
1045 Requires<[SmallCode, IsStatic]>;
1046def : Pat<(store (i64 (X86Wrapper tjumptable:$src)), addr:$dst),
1047 (MOV64mi32 addr:$dst, tjumptable:$src)>,
1048 Requires<[SmallCode, IsStatic]>;
1049def : Pat<(store (i64 (X86Wrapper tglobaladdr:$src)), addr:$dst),
1050 (MOV64mi32 addr:$dst, tglobaladdr:$src)>,
1051 Requires<[SmallCode, IsStatic]>;
1052def : Pat<(store (i64 (X86Wrapper texternalsym:$src)), addr:$dst),
1053 (MOV64mi32 addr:$dst, texternalsym:$src)>,
1054 Requires<[SmallCode, IsStatic]>;
1055
1056// Calls
1057// Direct PC relative function call for small code model. 32-bit displacement
1058// sign extended to 64-bit.
1059def : Pat<(X86call (i64 tglobaladdr:$dst)),
1060 (CALL64pcrel32 tglobaladdr:$dst)>;
1061def : Pat<(X86call (i64 texternalsym:$dst)),
1062 (CALL64pcrel32 texternalsym:$dst)>;
1063
1064def : Pat<(X86tailcall (i64 tglobaladdr:$dst)),
1065 (CALL64pcrel32 tglobaladdr:$dst)>;
1066def : Pat<(X86tailcall (i64 texternalsym:$dst)),
1067 (CALL64pcrel32 texternalsym:$dst)>;
1068
1069def : Pat<(X86tailcall GR64:$dst),
1070 (CALL64r GR64:$dst)>;
1071
1072// {s|z}extload bool -> {s|z}extload byte
1073def : Pat<(sextloadi64i1 addr:$src), (MOVSX64rm8 addr:$src)>;
1074def : Pat<(zextloadi64i1 addr:$src), (MOVZX64rm8 addr:$src)>;
1075
1076// extload
1077def : Pat<(extloadi64i1 addr:$src), (MOVZX64rm8 addr:$src)>;
1078def : Pat<(extloadi64i8 addr:$src), (MOVZX64rm8 addr:$src)>;
1079def : Pat<(extloadi64i16 addr:$src), (MOVZX64rm16 addr:$src)>;
1080def : Pat<(extloadi64i32 addr:$src), (PsMOVZX64rm32 addr:$src)>;
1081
1082// anyext -> zext
1083def : Pat<(i64 (anyext GR8 :$src)), (MOVZX64rr8 GR8 :$src)>;
1084def : Pat<(i64 (anyext GR16:$src)), (MOVZX64rr16 GR16:$src)>;
1085def : Pat<(i64 (anyext GR32:$src)), (PsMOVZX64rr32 GR32:$src)>;
1086def : Pat<(i64 (anyext (loadi8 addr:$src))), (MOVZX64rm8 addr:$src)>;
1087def : Pat<(i64 (anyext (loadi16 addr:$src))), (MOVZX64rm16 addr:$src)>;
1088def : Pat<(i64 (anyext (loadi32 addr:$src))), (PsMOVZX64rm32 addr:$src)>;
1089
1090//===----------------------------------------------------------------------===//
1091// Some peepholes
1092//===----------------------------------------------------------------------===//
1093
1094// (shl x, 1) ==> (add x, x)
1095def : Pat<(shl GR64:$src1, (i8 1)), (ADD64rr GR64:$src1, GR64:$src1)>;
1096
1097// (or (x >> c) | (y << (64 - c))) ==> (shrd64 x, y, c)
1098def : Pat<(or (srl GR64:$src1, CL:$amt),
1099 (shl GR64:$src2, (sub 64, CL:$amt))),
1100 (SHRD64rrCL GR64:$src1, GR64:$src2)>;
1101
1102def : Pat<(store (or (srl (loadi64 addr:$dst), CL:$amt),
1103 (shl GR64:$src2, (sub 64, CL:$amt))), addr:$dst),
1104 (SHRD64mrCL addr:$dst, GR64:$src2)>;
1105
1106// (or (x << c) | (y >> (64 - c))) ==> (shld64 x, y, c)
1107def : Pat<(or (shl GR64:$src1, CL:$amt),
1108 (srl GR64:$src2, (sub 64, CL:$amt))),
1109 (SHLD64rrCL GR64:$src1, GR64:$src2)>;
1110
1111def : Pat<(store (or (shl (loadi64 addr:$dst), CL:$amt),
1112 (srl GR64:$src2, (sub 64, CL:$amt))), addr:$dst),
1113 (SHLD64mrCL addr:$dst, GR64:$src2)>;
1114
1115// X86 specific add which produces a flag.
1116def : Pat<(addc GR64:$src1, GR64:$src2),
1117 (ADD64rr GR64:$src1, GR64:$src2)>;
1118def : Pat<(addc GR64:$src1, (load addr:$src2)),
1119 (ADD64rm GR64:$src1, addr:$src2)>;
1120def : Pat<(addc GR64:$src1, i64immSExt32:$src2),
1121 (ADD64ri32 GR64:$src1, imm:$src2)>;
1122def : Pat<(addc GR64:$src1, i64immSExt8:$src2),
1123 (ADD64ri8 GR64:$src1, i64immSExt8:$src2)>;
1124
1125def : Pat<(subc GR64:$src1, GR64:$src2),
1126 (SUB64rr GR64:$src1, GR64:$src2)>;
1127def : Pat<(subc GR64:$src1, (load addr:$src2)),
1128 (SUB64rm GR64:$src1, addr:$src2)>;
1129def : Pat<(subc GR64:$src1, imm:$src2),
1130 (SUB64ri32 GR64:$src1, i64immSExt32:$src2)>;
1131def : Pat<(subc GR64:$src1, i64immSExt8:$src2),
1132 (SUB64ri8 GR64:$src1, i64immSExt8:$src2)>;
1133
1134
1135//===----------------------------------------------------------------------===//
1136// X86-64 SSE Instructions
1137//===----------------------------------------------------------------------===//
1138
1139// Move instructions...
1140
Evan Chengb783fa32007-07-19 01:14:50 +00001141def MOV64toPQIrr : RPDI<0x6E, MRMSrcReg, (outs VR128:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001142 "mov{d|q} {$src, $dst|$dst, $src}",
1143 [(set VR128:$dst,
1144 (v2i64 (scalar_to_vector GR64:$src)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001145def MOV64toPQIrm : RPDI<0x6E, MRMSrcMem, (outs VR128:$dst), (ins i64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001146 "mov{d|q} {$src, $dst|$dst, $src}",
1147 [(set VR128:$dst,
1148 (v2i64 (scalar_to_vector (loadi64 addr:$src))))]>;
1149
Evan Chengb783fa32007-07-19 01:14:50 +00001150def MOVPQIto64rr : RPDI<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001151 "mov{d|q} {$src, $dst|$dst, $src}",
1152 [(set GR64:$dst, (vector_extract (v2i64 VR128:$src),
1153 (iPTR 0)))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001154def MOVPQIto64mr : RPDI<0x7E, MRMDestMem, (outs), (ins i64mem:$dst, VR128:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001155 "mov{d|q} {$src, $dst|$dst, $src}",
1156 [(store (i64 (vector_extract (v2i64 VR128:$src),
1157 (iPTR 0))), addr:$dst)]>;
1158
Evan Chengb783fa32007-07-19 01:14:50 +00001159def MOV64toSDrr : RPDI<0x6E, MRMSrcReg, (outs FR64:$dst), (ins GR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001160 "mov{d|q} {$src, $dst|$dst, $src}",
1161 [(set FR64:$dst, (bitconvert GR64:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001162def MOV64toSDrm : RPDI<0x6E, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001163 "mov{d|q} {$src, $dst|$dst, $src}",
1164 [(set FR64:$dst, (bitconvert (loadi64 addr:$src)))]>;
1165
Evan Chengb783fa32007-07-19 01:14:50 +00001166def MOVSDto64rr : RPDI<0x7E, MRMDestReg, (outs GR64:$dst), (ins FR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001167 "mov{d|q} {$src, $dst|$dst, $src}",
1168 [(set GR64:$dst, (bitconvert FR64:$src))]>;
Evan Chengb783fa32007-07-19 01:14:50 +00001169def MOVSDto64mr : RPDI<0x7E, MRMDestMem, (outs), (ins i64mem:$dst, FR64:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001170 "mov{d|q} {$src, $dst|$dst, $src}",
1171 [(store (i64 (bitconvert FR64:$src)), addr:$dst)]>;