blob: af8957f006fc87b69aabe74f1ca5f2f35f7c3b42 [file] [log] [blame]
Arnold Schwaighofer48abc5c2007-10-12 21:30:57 +00001//====- X86InstrX86-64.td - Describe the X86 Instr. Set ----*- tablegen -*-===//
Evan Cheng25ab6902006-09-08 06:48:29 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Evan Cheng25ab6902006-09-08 06:48:29 +00007//
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";
Evan Cheng25ab6902006-09-08 06:48:29 +000027 let MIOperandInfo = (ops GR64, i8imm, GR64, i32imm);
28}
29
30def lea64_32mem : Operand<i32> {
31 let PrintMethod = "printlea64_32mem";
Evan Cheng25ab6902006-09-08 06:48:29 +000032 let MIOperandInfo = (ops GR32, i8imm, GR32, i32imm);
33}
34
35//===----------------------------------------------------------------------===//
36// Complex Pattern Definitions...
37//
38def lea64addr : ComplexPattern<i64, 4, "SelectLEAAddr",
Evan Cheng19f2ffc2006-12-05 04:01:03 +000039 [add, mul, shl, or, frameindex, X86Wrapper],
Evan Cheng0085a282006-11-30 21:55:46 +000040 []>;
Evan Cheng25ab6902006-09-08 06:48:29 +000041
42//===----------------------------------------------------------------------===//
Evan Cheng25ab6902006-09-08 06:48:29 +000043// Pattern fragments...
44//
45
46def i64immSExt32 : PatLeaf<(i64 imm), [{
47 // i64immSExt32 predicate - True if the 64-bit immediate fits in a 32-bit
48 // sign extended field.
49 return (int64_t)N->getValue() == (int32_t)N->getValue();
50}]>;
51
52def i64immZExt32 : PatLeaf<(i64 imm), [{
53 // i64immZExt32 predicate - True if the 64-bit immediate fits in a 32-bit
54 // unsignedsign extended field.
55 return (uint64_t)N->getValue() == (uint32_t)N->getValue();
56}]>;
57
58def i64immSExt8 : PatLeaf<(i64 imm), [{
59 // i64immSExt8 predicate - True if the 64-bit immediate fits in a 8-bit
60 // sign extended field.
61 return (int64_t)N->getValue() == (int8_t)N->getValue();
62}]>;
63
Evan Cheng466685d2006-10-09 20:57:25 +000064def sextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (sextloadi1 node:$ptr))>;
65def sextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (sextloadi8 node:$ptr))>;
66def sextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (sextloadi16 node:$ptr))>;
67def sextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (sextloadi32 node:$ptr))>;
Evan Cheng25ab6902006-09-08 06:48:29 +000068
Evan Cheng466685d2006-10-09 20:57:25 +000069def zextloadi64i1 : PatFrag<(ops node:$ptr), (i64 (zextloadi1 node:$ptr))>;
70def zextloadi64i8 : PatFrag<(ops node:$ptr), (i64 (zextloadi8 node:$ptr))>;
71def zextloadi64i16 : PatFrag<(ops node:$ptr), (i64 (zextloadi16 node:$ptr))>;
72def zextloadi64i32 : PatFrag<(ops node:$ptr), (i64 (zextloadi32 node:$ptr))>;
Evan Cheng25ab6902006-09-08 06:48:29 +000073
Evan Cheng466685d2006-10-09 20:57:25 +000074def extloadi64i1 : PatFrag<(ops node:$ptr), (i64 (extloadi1 node:$ptr))>;
75def extloadi64i8 : PatFrag<(ops node:$ptr), (i64 (extloadi8 node:$ptr))>;
76def extloadi64i16 : PatFrag<(ops node:$ptr), (i64 (extloadi16 node:$ptr))>;
77def extloadi64i32 : PatFrag<(ops node:$ptr), (i64 (extloadi32 node:$ptr))>;
Evan Cheng25ab6902006-09-08 06:48:29 +000078
79//===----------------------------------------------------------------------===//
80// Instruction list...
81//
82
Evan Cheng6e141fd2007-12-12 23:12:09 +000083let isImplicitDef = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +000084def IMPLICIT_DEF_GR64 : I<0, Pseudo, (outs GR64:$dst), (ins),
Evan Cheng25ab6902006-09-08 06:48:29 +000085 "#IMPLICIT_DEF $dst",
86 [(set GR64:$dst, (undef))]>;
87
88//===----------------------------------------------------------------------===//
89// Call Instructions...
90//
Evan Chengffbacca2007-07-21 00:34:19 +000091let isCall = 1 in
Evan Cheng25ab6902006-09-08 06:48:29 +000092 // All calls clobber the non-callee saved registers...
93 let Defs = [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11,
94 FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
Bill Wendlingbff35d12007-04-26 21:06:48 +000095 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
Evan Cheng25ab6902006-09-08 06:48:29 +000096 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
Evan Cheng1ed37fd2007-09-27 19:01:55 +000097 XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS] in {
Evan Cheng64d80e32007-07-19 01:14:50 +000098 def CALL64pcrel32 : I<0xE8, RawFrm, (outs), (ins i64imm:$dst, variable_ops),
Dan Gohmanb1576f52007-07-31 20:11:57 +000099 "call\t${dst:call}", []>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000100 def CALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst, variable_ops),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000101 "call\t{*}$dst", [(X86call GR64:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000102 def CALL64m : I<0xFF, MRM2m, (outs), (ins i64mem:$dst, variable_ops),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000103 "call\t{*}$dst", []>;
Evan Cheng25ab6902006-09-08 06:48:29 +0000104 }
105
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000106
107
108let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
109def TCRETURNdi64 : I<0, Pseudo, (outs), (ins i64imm:$dst, i32imm:$offset),
110 "#TC_RETURN $dst $offset",
111 []>;
112
113let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
114def TCRETURNri64 : I<0, Pseudo, (outs), (ins GR64:$dst, i32imm:$offset),
115 "#TC_RETURN $dst $offset",
116 []>;
117
118
119let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
120 def TAILJMPr64 : I<0xFF, MRM4r, (outs), (ins GR64:$dst), "jmp{q}\t{*}$dst # TAILCALL",
121 []>;
122
Evan Cheng25ab6902006-09-08 06:48:29 +0000123// Branches
Owen Anderson20ab2902007-11-12 07:39:39 +0000124let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
Dan Gohmanb1576f52007-07-31 20:11:57 +0000125 def JMP64r : I<0xFF, MRM4r, (outs), (ins GR64:$dst), "jmp{q}\t{*}$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000126 [(brind GR64:$dst)]>;
Dan Gohmanb1576f52007-07-31 20:11:57 +0000127 def JMP64m : I<0xFF, MRM4m, (outs), (ins i64mem:$dst), "jmp{q}\t{*}$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000128 [(brind (loadi64 addr:$dst))]>;
129}
130
131//===----------------------------------------------------------------------===//
132// Miscellaneous Instructions...
133//
Evan Cheng071a2792007-09-11 19:55:27 +0000134let Defs = [RBP,RSP], Uses = [RBP,RSP] in
Evan Cheng25ab6902006-09-08 06:48:29 +0000135def LEAVE64 : I<0xC9, RawFrm,
Evan Cheng071a2792007-09-11 19:55:27 +0000136 (outs), (ins), "leave", []>;
137let Defs = [RSP], Uses = [RSP] in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000138def POP64r : I<0x58, AddRegFrm,
Evan Cheng071a2792007-09-11 19:55:27 +0000139 (outs GR64:$reg), (ins), "pop{q}\t$reg", []>;
Dan Gohman638c96d2007-06-18 14:12:56 +0000140def PUSH64r : I<0x50, AddRegFrm,
Evan Cheng071a2792007-09-11 19:55:27 +0000141 (outs), (ins GR64:$reg), "push{q}\t$reg", []>;
142}
Evan Cheng25ab6902006-09-08 06:48:29 +0000143
Evan Cheng2f245ba2007-09-26 01:29:06 +0000144let Defs = [RSP, EFLAGS], Uses = [RSP] in
Evan Chengbf4f89d2007-09-26 21:28:00 +0000145def POPFQ : I<0x9D, RawFrm, (outs), (ins), "popf", []>, REX_W;
Evan Cheng2f245ba2007-09-26 01:29:06 +0000146let Defs = [RSP], Uses = [RSP, EFLAGS] in
Evan Chengbf4f89d2007-09-26 21:28:00 +0000147def PUSHFQ : I<0x9C, RawFrm, (outs), (ins), "pushf", []>;
Evan Cheng2f245ba2007-09-26 01:29:06 +0000148
Evan Cheng25ab6902006-09-08 06:48:29 +0000149def LEA64_32r : I<0x8D, MRMSrcMem,
Evan Cheng64d80e32007-07-19 01:14:50 +0000150 (outs GR32:$dst), (ins lea64_32mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000151 "lea{l}\t{$src|$dst}, {$dst|$src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000152 [(set GR32:$dst, lea32addr:$src)]>, Requires<[In64BitMode]>;
153
Evan Cheng64d80e32007-07-19 01:14:50 +0000154def LEA64r : RI<0x8D, MRMSrcMem, (outs GR64:$dst), (ins lea64mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000155 "lea{q}\t{$src|$dst}, {$dst|$src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000156 [(set GR64:$dst, lea64addr:$src)]>;
157
158let isTwoAddress = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +0000159def BSWAP64r : RI<0xC8, AddRegFrm, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000160 "bswap{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000161 [(set GR64:$dst, (bswap GR64:$src))]>, TB;
162// Exchange
Evan Cheng64d80e32007-07-19 01:14:50 +0000163def XCHG64rr : RI<0x87, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000164 "xchg{q}\t{$src2|$src1}, {$src1|$src2}", []>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000165def XCHG64mr : RI<0x87, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000166 "xchg{q}\t{$src2|$src1}, {$src1|$src2}", []>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000167def XCHG64rm : RI<0x87, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000168 "xchg{q}\t{$src2|$src1}, {$src1|$src2}", []>;
Evan Cheng25ab6902006-09-08 06:48:29 +0000169
Evan Cheng18efe262007-12-14 02:13:44 +0000170// Bit scan instructions.
171let Defs = [EFLAGS] in {
Evan Chengfd9e4732007-12-14 18:49:43 +0000172def BSF64rr : RI<0xBC, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000173 "bsf{q}\t{$src, $dst|$dst, $src}",
Evan Cheng8ec86112007-12-14 18:25:34 +0000174 [(set GR64:$dst, (X86bsf GR64:$src)), (implicit EFLAGS)]>, TB;
Evan Cheng18efe262007-12-14 02:13:44 +0000175def BSF64rm : RI<0xBC, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000176 "bsf{q}\t{$src, $dst|$dst, $src}",
Evan Cheng8ec86112007-12-14 18:25:34 +0000177 [(set GR64:$dst, (X86bsf (loadi64 addr:$src))),
178 (implicit EFLAGS)]>, TB;
Evan Cheng18efe262007-12-14 02:13:44 +0000179
Evan Chengfd9e4732007-12-14 18:49:43 +0000180def BSR64rr : RI<0xBD, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000181 "bsr{q}\t{$src, $dst|$dst, $src}",
Evan Cheng8ec86112007-12-14 18:25:34 +0000182 [(set GR64:$dst, (X86bsr GR64:$src)), (implicit EFLAGS)]>, TB;
Evan Cheng18efe262007-12-14 02:13:44 +0000183def BSR64rm : RI<0xBD, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
Dan Gohman1a8001e2007-12-14 15:10:00 +0000184 "bsr{q}\t{$src, $dst|$dst, $src}",
Evan Cheng8ec86112007-12-14 18:25:34 +0000185 [(set GR64:$dst, (X86bsr (loadi64 addr:$src))),
186 (implicit EFLAGS)]>, TB;
Evan Cheng18efe262007-12-14 02:13:44 +0000187} // Defs = [EFLAGS]
188
Evan Cheng25ab6902006-09-08 06:48:29 +0000189// Repeat string ops
Evan Cheng071a2792007-09-11 19:55:27 +0000190let Defs = [RCX,RDI,RSI], Uses = [RCX,RDI,RSI] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000191def REP_MOVSQ : RI<0xA5, RawFrm, (outs), (ins), "{rep;movsq|rep movsq}",
Evan Cheng071a2792007-09-11 19:55:27 +0000192 [(X86rep_movs i64)]>, REP;
193let Defs = [RCX,RDI], Uses = [RAX,RCX,RDI] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000194def REP_STOSQ : RI<0xAB, RawFrm, (outs), (ins), "{rep;stosq|rep stosq}",
Evan Cheng071a2792007-09-11 19:55:27 +0000195 [(X86rep_stos i64)]>, REP;
Evan Cheng25ab6902006-09-08 06:48:29 +0000196
197//===----------------------------------------------------------------------===//
198// Move Instructions...
199//
200
Evan Cheng64d80e32007-07-19 01:14:50 +0000201def MOV64rr : RI<0x89, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000202 "mov{q}\t{$src, $dst|$dst, $src}", []>;
Evan Cheng25ab6902006-09-08 06:48:29 +0000203
Bill Wendling627c00b2007-12-17 23:07:56 +0000204let isReMaterializable = 1, neverHasSideEffects = 1 in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000205def MOV64ri : RIi64<0xB8, AddRegFrm, (outs GR64:$dst), (ins i64imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000206 "movabs{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000207 [(set GR64:$dst, imm:$src)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000208def MOV64ri32 : RIi32<0xC7, MRM0r, (outs GR64:$dst), (ins i64i32imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000209 "mov{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000210 [(set GR64:$dst, i64immSExt32:$src)]>;
Dan Gohman1ab79892007-09-07 21:32:51 +0000211}
Evan Cheng25ab6902006-09-08 06:48:29 +0000212
Evan Cheng2f394262007-08-30 05:49:43 +0000213let isLoad = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +0000214def MOV64rm : RI<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000215 "mov{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000216 [(set GR64:$dst, (load addr:$src))]>;
217
Evan Cheng64d80e32007-07-19 01:14:50 +0000218def MOV64mr : RI<0x89, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000219 "mov{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000220 [(store GR64:$src, addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000221def MOV64mi32 : RIi32<0xC7, MRM0m, (outs), (ins i64mem:$dst, i64i32imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000222 "mov{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000223 [(store i64immSExt32:$src, addr:$dst)]>;
224
225// Sign/Zero extenders
226
Evan Cheng64d80e32007-07-19 01:14:50 +0000227def MOVSX64rr8 : RI<0xBE, MRMSrcReg, (outs GR64:$dst), (ins GR8 :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000228 "movs{bq|x}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000229 [(set GR64:$dst, (sext GR8:$src))]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000230def MOVSX64rm8 : RI<0xBE, MRMSrcMem, (outs GR64:$dst), (ins i8mem :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000231 "movs{bq|x}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000232 [(set GR64:$dst, (sextloadi64i8 addr:$src))]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000233def MOVSX64rr16: RI<0xBF, MRMSrcReg, (outs GR64:$dst), (ins GR16:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000234 "movs{wq|x}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000235 [(set GR64:$dst, (sext GR16:$src))]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000236def MOVSX64rm16: RI<0xBF, MRMSrcMem, (outs GR64:$dst), (ins i16mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000237 "movs{wq|x}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000238 [(set GR64:$dst, (sextloadi64i16 addr:$src))]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000239def MOVSX64rr32: RI<0x63, MRMSrcReg, (outs GR64:$dst), (ins GR32:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000240 "movs{lq|xd}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000241 [(set GR64:$dst, (sext GR32:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000242def MOVSX64rm32: RI<0x63, MRMSrcMem, (outs GR64:$dst), (ins i32mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000243 "movs{lq|xd}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000244 [(set GR64:$dst, (sextloadi64i32 addr:$src))]>;
245
Evan Cheng64d80e32007-07-19 01:14:50 +0000246def MOVZX64rr8 : RI<0xB6, MRMSrcReg, (outs GR64:$dst), (ins GR8 :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000247 "movz{bq|x}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000248 [(set GR64:$dst, (zext GR8:$src))]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000249def MOVZX64rm8 : RI<0xB6, MRMSrcMem, (outs GR64:$dst), (ins i8mem :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000250 "movz{bq|x}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000251 [(set GR64:$dst, (zextloadi64i8 addr:$src))]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000252def MOVZX64rr16: RI<0xB7, MRMSrcReg, (outs GR64:$dst), (ins GR16:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000253 "movz{wq|x}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000254 [(set GR64:$dst, (zext GR16:$src))]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000255def MOVZX64rm16: RI<0xB7, MRMSrcMem, (outs GR64:$dst), (ins i16mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000256 "movz{wq|x}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000257 [(set GR64:$dst, (zextloadi64i16 addr:$src))]>, TB;
258
Evan Cheng071a2792007-09-11 19:55:27 +0000259let Defs = [RAX], Uses = [EAX] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000260def CDQE : RI<0x98, RawFrm, (outs), (ins),
Evan Cheng071a2792007-09-11 19:55:27 +0000261 "{cltq|cdqe}", []>; // RAX = signext(EAX)
Evan Cheng25ab6902006-09-08 06:48:29 +0000262
Evan Cheng071a2792007-09-11 19:55:27 +0000263let Defs = [RAX,RDX], Uses = [RAX] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000264def CQO : RI<0x99, RawFrm, (outs), (ins),
Evan Cheng071a2792007-09-11 19:55:27 +0000265 "{cqto|cqo}", []>; // RDX:RAX = signext(RAX)
Evan Cheng25ab6902006-09-08 06:48:29 +0000266
267//===----------------------------------------------------------------------===//
268// Arithmetic Instructions...
269//
270
Evan Cheng24f2ea32007-09-14 21:48:26 +0000271let Defs = [EFLAGS] in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000272let isTwoAddress = 1 in {
273let isConvertibleToThreeAddress = 1 in {
274let isCommutable = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +0000275def ADD64rr : RI<0x01, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000276 "add{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000277 [(set GR64:$dst, (add GR64:$src1, GR64:$src2))]>;
278
Evan Cheng64d80e32007-07-19 01:14:50 +0000279def ADD64ri32 : RIi32<0x81, MRM0r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000280 "add{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000281 [(set GR64:$dst, (add GR64:$src1, i64immSExt32:$src2))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000282def ADD64ri8 : RIi8<0x83, MRM0r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000283 "add{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000284 [(set GR64:$dst, (add GR64:$src1, i64immSExt8:$src2))]>;
285} // isConvertibleToThreeAddress
286
Evan Cheng64d80e32007-07-19 01:14:50 +0000287def ADD64rm : RI<0x03, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000288 "add{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000289 [(set GR64:$dst, (add GR64:$src1, (load addr:$src2)))]>;
290} // isTwoAddress
291
Evan Cheng64d80e32007-07-19 01:14:50 +0000292def ADD64mr : RI<0x01, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000293 "add{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000294 [(store (add (load addr:$dst), GR64:$src2), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000295def ADD64mi32 : RIi32<0x81, MRM0m, (outs), (ins i64mem:$dst, i64i32imm :$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000296 "add{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000297 [(store (add (load addr:$dst), i64immSExt32:$src2), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000298def ADD64mi8 : RIi8<0x83, MRM0m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000299 "add{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000300 [(store (add (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
301
Evan Cheng3154cb62007-10-05 17:59:57 +0000302let Uses = [EFLAGS] in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000303let isTwoAddress = 1 in {
304let isCommutable = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +0000305def ADC64rr : RI<0x11, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000306 "adc{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000307 [(set GR64:$dst, (adde GR64:$src1, GR64:$src2))]>;
308
Evan Cheng64d80e32007-07-19 01:14:50 +0000309def ADC64rm : RI<0x13, MRMSrcMem , (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000310 "adc{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000311 [(set GR64:$dst, (adde GR64:$src1, (load addr:$src2)))]>;
312
Evan Cheng64d80e32007-07-19 01:14:50 +0000313def ADC64ri32 : RIi32<0x81, MRM2r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000314 "adc{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000315 [(set GR64:$dst, (adde GR64:$src1, i64immSExt32:$src2))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000316def ADC64ri8 : RIi8<0x83, MRM2r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000317 "adc{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000318 [(set GR64:$dst, (adde GR64:$src1, i64immSExt8:$src2))]>;
319} // isTwoAddress
320
Evan Cheng64d80e32007-07-19 01:14:50 +0000321def ADC64mr : RI<0x11, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000322 "adc{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000323 [(store (adde (load addr:$dst), GR64:$src2), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000324def ADC64mi32 : RIi32<0x81, MRM2m, (outs), (ins i64mem:$dst, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000325 "adc{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000326 [(store (adde (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000327def ADC64mi8 : RIi8<0x83, MRM2m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000328 "adc{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000329 [(store (adde (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
Evan Cheng3154cb62007-10-05 17:59:57 +0000330} // Uses = [EFLAGS]
Evan Cheng25ab6902006-09-08 06:48:29 +0000331
332let isTwoAddress = 1 in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000333def SUB64rr : RI<0x29, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000334 "sub{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000335 [(set GR64:$dst, (sub GR64:$src1, GR64:$src2))]>;
336
Evan Cheng64d80e32007-07-19 01:14:50 +0000337def SUB64rm : RI<0x2B, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000338 "sub{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000339 [(set GR64:$dst, (sub GR64:$src1, (load addr:$src2)))]>;
340
Evan Cheng64d80e32007-07-19 01:14:50 +0000341def SUB64ri32 : RIi32<0x81, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000342 "sub{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000343 [(set GR64:$dst, (sub GR64:$src1, i64immSExt32:$src2))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000344def SUB64ri8 : RIi8<0x83, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000345 "sub{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000346 [(set GR64:$dst, (sub GR64:$src1, i64immSExt8:$src2))]>;
347} // isTwoAddress
348
Evan Cheng64d80e32007-07-19 01:14:50 +0000349def SUB64mr : RI<0x29, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000350 "sub{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000351 [(store (sub (load addr:$dst), GR64:$src2), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000352def SUB64mi32 : RIi32<0x81, MRM5m, (outs), (ins i64mem:$dst, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000353 "sub{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000354 [(store (sub (load addr:$dst), i64immSExt32:$src2), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000355def SUB64mi8 : RIi8<0x83, MRM5m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000356 "sub{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000357 [(store (sub (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
358
Evan Cheng3154cb62007-10-05 17:59:57 +0000359let Uses = [EFLAGS] in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000360let isTwoAddress = 1 in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000361def SBB64rr : RI<0x19, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000362 "sbb{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000363 [(set GR64:$dst, (sube GR64:$src1, GR64:$src2))]>;
364
Evan Cheng64d80e32007-07-19 01:14:50 +0000365def SBB64rm : RI<0x1B, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000366 "sbb{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000367 [(set GR64:$dst, (sube GR64:$src1, (load addr:$src2)))]>;
368
Evan Cheng64d80e32007-07-19 01:14:50 +0000369def SBB64ri32 : RIi32<0x81, MRM3r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000370 "sbb{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000371 [(set GR64:$dst, (sube GR64:$src1, i64immSExt32:$src2))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000372def SBB64ri8 : RIi8<0x83, MRM3r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000373 "sbb{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000374 [(set GR64:$dst, (sube GR64:$src1, i64immSExt8:$src2))]>;
375} // isTwoAddress
376
Evan Cheng64d80e32007-07-19 01:14:50 +0000377def SBB64mr : RI<0x19, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000378 "sbb{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000379 [(store (sube (load addr:$dst), GR64:$src2), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000380def SBB64mi32 : RIi32<0x81, MRM3m, (outs), (ins i64mem:$dst, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000381 "sbb{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000382 [(store (sube (load addr:$dst), i64immSExt32:$src2), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000383def SBB64mi8 : RIi8<0x83, MRM3m, (outs), (ins i64mem:$dst, i64i8imm :$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000384 "sbb{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000385 [(store (sube (load addr:$dst), i64immSExt8:$src2), addr:$dst)]>;
Evan Cheng3154cb62007-10-05 17:59:57 +0000386} // Uses = [EFLAGS]
Evan Cheng24f2ea32007-09-14 21:48:26 +0000387} // Defs = [EFLAGS]
Evan Cheng25ab6902006-09-08 06:48:29 +0000388
389// Unsigned multiplication
Evan Cheng24f2ea32007-09-14 21:48:26 +0000390let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000391def MUL64r : RI<0xF7, MRM4r, (outs), (ins GR64:$src),
Evan Cheng071a2792007-09-11 19:55:27 +0000392 "mul{q}\t$src", []>; // RAX,RDX = RAX*GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000393def MUL64m : RI<0xF7, MRM4m, (outs), (ins i64mem:$src),
Evan Cheng071a2792007-09-11 19:55:27 +0000394 "mul{q}\t$src", []>; // RAX,RDX = RAX*[mem64]
Evan Cheng25ab6902006-09-08 06:48:29 +0000395
396// Signed multiplication
Evan Cheng64d80e32007-07-19 01:14:50 +0000397def IMUL64r : RI<0xF7, MRM5r, (outs), (ins GR64:$src),
Evan Cheng071a2792007-09-11 19:55:27 +0000398 "imul{q}\t$src", []>; // RAX,RDX = RAX*GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000399def IMUL64m : RI<0xF7, MRM5m, (outs), (ins i64mem:$src),
Evan Cheng071a2792007-09-11 19:55:27 +0000400 "imul{q}\t$src", []>; // RAX,RDX = RAX*[mem64]
401}
Evan Cheng25ab6902006-09-08 06:48:29 +0000402
Evan Cheng24f2ea32007-09-14 21:48:26 +0000403let Defs = [EFLAGS] in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000404let isTwoAddress = 1 in {
405let isCommutable = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +0000406def IMUL64rr : RI<0xAF, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000407 "imul{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000408 [(set GR64:$dst, (mul GR64:$src1, GR64:$src2))]>, TB;
409
Evan Cheng64d80e32007-07-19 01:14:50 +0000410def IMUL64rm : RI<0xAF, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000411 "imul{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000412 [(set GR64:$dst, (mul GR64:$src1, (load addr:$src2)))]>, TB;
413} // isTwoAddress
414
415// Suprisingly enough, these are not two address instructions!
416def IMUL64rri32 : RIi32<0x69, MRMSrcReg, // GR64 = GR64*I32
Evan Cheng64d80e32007-07-19 01:14:50 +0000417 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000418 "imul{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000419 [(set GR64:$dst, (mul GR64:$src1, i64immSExt32:$src2))]>;
420def IMUL64rri8 : RIi8<0x6B, MRMSrcReg, // GR64 = GR64*I8
Evan Cheng64d80e32007-07-19 01:14:50 +0000421 (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000422 "imul{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000423 [(set GR64:$dst, (mul GR64:$src1, i64immSExt8:$src2))]>;
424def IMUL64rmi32 : RIi32<0x69, MRMSrcMem, // GR64 = [mem64]*I32
Evan Cheng64d80e32007-07-19 01:14:50 +0000425 (outs GR64:$dst), (ins i64mem:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000426 "imul{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000427 [(set GR64:$dst, (mul (load addr:$src1), i64immSExt32:$src2))]>;
428def IMUL64rmi8 : RIi8<0x6B, MRMSrcMem, // GR64 = [mem64]*I8
Evan Cheng64d80e32007-07-19 01:14:50 +0000429 (outs GR64:$dst), (ins i64mem:$src1, i64i8imm: $src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000430 "imul{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000431 [(set GR64:$dst, (mul (load addr:$src1), i64immSExt8:$src2))]>;
Evan Cheng24f2ea32007-09-14 21:48:26 +0000432} // Defs = [EFLAGS]
Evan Cheng25ab6902006-09-08 06:48:29 +0000433
434// Unsigned division / remainder
Evan Cheng24f2ea32007-09-14 21:48:26 +0000435let Defs = [RAX,RDX,EFLAGS], Uses = [RAX,RDX] in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000436def DIV64r : RI<0xF7, MRM6r, (outs), (ins GR64:$src), // RDX:RAX/r64 = RAX,RDX
Evan Cheng071a2792007-09-11 19:55:27 +0000437 "div{q}\t$src", []>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000438def DIV64m : RI<0xF7, MRM6m, (outs), (ins i64mem:$src), // RDX:RAX/[mem64] = RAX,RDX
Evan Cheng071a2792007-09-11 19:55:27 +0000439 "div{q}\t$src", []>;
Evan Cheng25ab6902006-09-08 06:48:29 +0000440
441// Signed division / remainder
Evan Cheng64d80e32007-07-19 01:14:50 +0000442def IDIV64r: RI<0xF7, MRM7r, (outs), (ins GR64:$src), // RDX:RAX/r64 = RAX,RDX
Evan Cheng071a2792007-09-11 19:55:27 +0000443 "idiv{q}\t$src", []>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000444def IDIV64m: RI<0xF7, MRM7m, (outs), (ins i64mem:$src), // RDX:RAX/[mem64] = RAX,RDX
Evan Cheng071a2792007-09-11 19:55:27 +0000445 "idiv{q}\t$src", []>;
446}
Evan Cheng25ab6902006-09-08 06:48:29 +0000447
448// Unary instructions
Evan Cheng24f2ea32007-09-14 21:48:26 +0000449let Defs = [EFLAGS], CodeSize = 2 in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000450let isTwoAddress = 1 in
Dan Gohmanb1576f52007-07-31 20:11:57 +0000451def NEG64r : RI<0xF7, MRM3r, (outs GR64:$dst), (ins GR64:$src), "neg{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000452 [(set GR64:$dst, (ineg GR64:$src))]>;
Dan Gohmanb1576f52007-07-31 20:11:57 +0000453def NEG64m : RI<0xF7, MRM3m, (outs), (ins i64mem:$dst), "neg{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000454 [(store (ineg (loadi64 addr:$dst)), addr:$dst)]>;
455
456let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in
Dan Gohmanb1576f52007-07-31 20:11:57 +0000457def INC64r : RI<0xFF, MRM0r, (outs GR64:$dst), (ins GR64:$src), "inc{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000458 [(set GR64:$dst, (add GR64:$src, 1))]>;
Dan Gohmanb1576f52007-07-31 20:11:57 +0000459def INC64m : RI<0xFF, MRM0m, (outs), (ins i64mem:$dst), "inc{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000460 [(store (add (loadi64 addr:$dst), 1), addr:$dst)]>;
461
462let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in
Dan Gohmanb1576f52007-07-31 20:11:57 +0000463def DEC64r : RI<0xFF, MRM1r, (outs GR64:$dst), (ins GR64:$src), "dec{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000464 [(set GR64:$dst, (add GR64:$src, -1))]>;
Dan Gohmanb1576f52007-07-31 20:11:57 +0000465def DEC64m : RI<0xFF, MRM1m, (outs), (ins i64mem:$dst), "dec{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000466 [(store (add (loadi64 addr:$dst), -1), addr:$dst)]>;
467
468// In 64-bit mode, single byte INC and DEC cannot be encoded.
469let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in {
470// Can transform into LEA.
Dan Gohmanb1576f52007-07-31 20:11:57 +0000471def INC64_16r : I<0xFF, MRM0r, (outs GR16:$dst), (ins GR16:$src), "inc{w}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000472 [(set GR16:$dst, (add GR16:$src, 1))]>,
473 OpSize, Requires<[In64BitMode]>;
Dan Gohmanb1576f52007-07-31 20:11:57 +0000474def INC64_32r : I<0xFF, MRM0r, (outs GR32:$dst), (ins GR32:$src), "inc{l}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000475 [(set GR32:$dst, (add GR32:$src, 1))]>,
476 Requires<[In64BitMode]>;
Dan Gohmanb1576f52007-07-31 20:11:57 +0000477def DEC64_16r : I<0xFF, MRM1r, (outs GR16:$dst), (ins GR16:$src), "dec{w}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000478 [(set GR16:$dst, (add GR16:$src, -1))]>,
479 OpSize, Requires<[In64BitMode]>;
Dan Gohmanb1576f52007-07-31 20:11:57 +0000480def DEC64_32r : I<0xFF, MRM1r, (outs GR32:$dst), (ins GR32:$src), "dec{l}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000481 [(set GR32:$dst, (add GR32:$src, -1))]>,
482 Requires<[In64BitMode]>;
483} // isConvertibleToThreeAddress
Evan Cheng66f71632007-10-19 21:23:22 +0000484
485// These are duplicates of their 32-bit counterparts. Only needed so X86 knows
486// how to unfold them.
487let isTwoAddress = 0, CodeSize = 2 in {
488 def INC64_16m : I<0xFF, MRM0m, (outs), (ins i16mem:$dst), "inc{w}\t$dst",
489 [(store (add (loadi16 addr:$dst), 1), addr:$dst)]>,
490 OpSize, Requires<[In64BitMode]>;
491 def INC64_32m : I<0xFF, MRM0m, (outs), (ins i32mem:$dst), "inc{l}\t$dst",
492 [(store (add (loadi32 addr:$dst), 1), addr:$dst)]>,
493 Requires<[In64BitMode]>;
494 def DEC64_16m : I<0xFF, MRM1m, (outs), (ins i16mem:$dst), "dec{w}\t$dst",
495 [(store (add (loadi16 addr:$dst), -1), addr:$dst)]>,
496 OpSize, Requires<[In64BitMode]>;
497 def DEC64_32m : I<0xFF, MRM1m, (outs), (ins i32mem:$dst), "dec{l}\t$dst",
498 [(store (add (loadi32 addr:$dst), -1), addr:$dst)]>,
499 Requires<[In64BitMode]>;
500}
Evan Cheng24f2ea32007-09-14 21:48:26 +0000501} // Defs = [EFLAGS], CodeSize
Evan Cheng25ab6902006-09-08 06:48:29 +0000502
503
Evan Cheng24f2ea32007-09-14 21:48:26 +0000504let Defs = [EFLAGS] in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000505// Shift instructions
506let isTwoAddress = 1 in {
Evan Cheng071a2792007-09-11 19:55:27 +0000507let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000508def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000509 "shl{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000510 [(set GR64:$dst, (shl GR64:$src, CL))]>;
Evan Chengb952d1f2007-10-05 18:20:36 +0000511let isConvertibleToThreeAddress = 1 in // Can transform into LEA.
Evan Cheng64d80e32007-07-19 01:14:50 +0000512def SHL64ri : RIi8<0xC1, MRM4r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000513 "shl{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000514 [(set GR64:$dst, (shl GR64:$src1, (i8 imm:$src2)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000515def SHL64r1 : RI<0xD1, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000516 "shl{q}\t$dst", []>;
Evan Cheng25ab6902006-09-08 06:48:29 +0000517} // isTwoAddress
518
Evan Cheng071a2792007-09-11 19:55:27 +0000519let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000520def SHL64mCL : RI<0xD3, MRM4m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000521 "shl{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000522 [(store (shl (loadi64 addr:$dst), CL), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000523def SHL64mi : RIi8<0xC1, MRM4m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000524 "shl{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000525 [(store (shl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000526def SHL64m1 : RI<0xD1, MRM4m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000527 "shl{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000528 [(store (shl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
529
530let isTwoAddress = 1 in {
Evan Cheng071a2792007-09-11 19:55:27 +0000531let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000532def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000533 "shr{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000534 [(set GR64:$dst, (srl GR64:$src, CL))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000535def SHR64ri : RIi8<0xC1, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000536 "shr{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000537 [(set GR64:$dst, (srl GR64:$src1, (i8 imm:$src2)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000538def SHR64r1 : RI<0xD1, MRM5r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000539 "shr{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000540 [(set GR64:$dst, (srl GR64:$src1, (i8 1)))]>;
541} // isTwoAddress
542
Evan Cheng071a2792007-09-11 19:55:27 +0000543let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000544def SHR64mCL : RI<0xD3, MRM5m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000545 "shr{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000546 [(store (srl (loadi64 addr:$dst), CL), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000547def SHR64mi : RIi8<0xC1, MRM5m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000548 "shr{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000549 [(store (srl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000550def SHR64m1 : RI<0xD1, MRM5m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000551 "shr{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000552 [(store (srl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
553
554let isTwoAddress = 1 in {
Evan Cheng071a2792007-09-11 19:55:27 +0000555let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000556def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000557 "sar{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000558 [(set GR64:$dst, (sra GR64:$src, CL))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000559def SAR64ri : RIi8<0xC1, MRM7r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000560 "sar{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000561 [(set GR64:$dst, (sra GR64:$src1, (i8 imm:$src2)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000562def SAR64r1 : RI<0xD1, MRM7r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000563 "sar{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000564 [(set GR64:$dst, (sra GR64:$src1, (i8 1)))]>;
565} // isTwoAddress
566
Evan Cheng071a2792007-09-11 19:55:27 +0000567let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000568def SAR64mCL : RI<0xD3, MRM7m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000569 "sar{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000570 [(store (sra (loadi64 addr:$dst), CL), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000571def SAR64mi : RIi8<0xC1, MRM7m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000572 "sar{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000573 [(store (sra (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000574def SAR64m1 : RI<0xD1, MRM7m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000575 "sar{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000576 [(store (sra (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
577
578// Rotate instructions
579let isTwoAddress = 1 in {
Evan Cheng071a2792007-09-11 19:55:27 +0000580let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000581def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000582 "rol{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000583 [(set GR64:$dst, (rotl GR64:$src, CL))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000584def ROL64ri : RIi8<0xC1, MRM0r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000585 "rol{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000586 [(set GR64:$dst, (rotl GR64:$src1, (i8 imm:$src2)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000587def ROL64r1 : RI<0xD1, MRM0r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000588 "rol{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000589 [(set GR64:$dst, (rotl GR64:$src1, (i8 1)))]>;
590} // isTwoAddress
591
Evan Cheng071a2792007-09-11 19:55:27 +0000592let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000593def ROL64mCL : I<0xD3, MRM0m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000594 "rol{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000595 [(store (rotl (loadi64 addr:$dst), CL), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000596def ROL64mi : RIi8<0xC1, MRM0m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000597 "rol{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000598 [(store (rotl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000599def ROL64m1 : RI<0xD1, MRM0m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000600 "rol{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000601 [(store (rotl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
602
603let isTwoAddress = 1 in {
Evan Cheng071a2792007-09-11 19:55:27 +0000604let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000605def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000606 "ror{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000607 [(set GR64:$dst, (rotr GR64:$src, CL))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000608def ROR64ri : RIi8<0xC1, MRM1r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000609 "ror{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000610 [(set GR64:$dst, (rotr GR64:$src1, (i8 imm:$src2)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000611def ROR64r1 : RI<0xD1, MRM1r, (outs GR64:$dst), (ins GR64:$src1),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000612 "ror{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000613 [(set GR64:$dst, (rotr GR64:$src1, (i8 1)))]>;
614} // isTwoAddress
615
Evan Cheng071a2792007-09-11 19:55:27 +0000616let Uses = [CL] in
Evan Cheng64d80e32007-07-19 01:14:50 +0000617def ROR64mCL : RI<0xD3, MRM1m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000618 "ror{q}\t{%cl, $dst|$dst, %CL}",
Evan Cheng071a2792007-09-11 19:55:27 +0000619 [(store (rotr (loadi64 addr:$dst), CL), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000620def ROR64mi : RIi8<0xC1, MRM1m, (outs), (ins i64mem:$dst, i8imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000621 "ror{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000622 [(store (rotr (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000623def ROR64m1 : RI<0xD1, MRM1m, (outs), (ins i64mem:$dst),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000624 "ror{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000625 [(store (rotr (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
626
627// Double shift instructions (generalizations of rotate)
628let isTwoAddress = 1 in {
Evan Cheng071a2792007-09-11 19:55:27 +0000629let Uses = [CL] in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000630def SHLD64rrCL : RI<0xA5, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmane47f1f92007-09-14 23:17:45 +0000631 "shld{q}\t{%cl, $src2, $dst|$dst, $src2, %CL}",
632 [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2, CL))]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000633def SHRD64rrCL : RI<0xAD, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmane47f1f92007-09-14 23:17:45 +0000634 "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, %CL}",
635 [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2, CL))]>, TB;
Evan Cheng071a2792007-09-11 19:55:27 +0000636}
Evan Cheng25ab6902006-09-08 06:48:29 +0000637
638let isCommutable = 1 in { // FIXME: Update X86InstrInfo::commuteInstruction
639def SHLD64rri8 : RIi8<0xA4, MRMDestReg,
Evan Cheng64d80e32007-07-19 01:14:50 +0000640 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2, i8imm:$src3),
Dan Gohmane47f1f92007-09-14 23:17:45 +0000641 "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
642 [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2,
643 (i8 imm:$src3)))]>,
644 TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000645def SHRD64rri8 : RIi8<0xAC, MRMDestReg,
Evan Cheng64d80e32007-07-19 01:14:50 +0000646 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2, i8imm:$src3),
Dan Gohmane47f1f92007-09-14 23:17:45 +0000647 "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
648 [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2,
649 (i8 imm:$src3)))]>,
Evan Cheng25ab6902006-09-08 06:48:29 +0000650 TB;
651} // isCommutable
652} // isTwoAddress
653
Evan Cheng071a2792007-09-11 19:55:27 +0000654let Uses = [CL] in {
Evan Cheng64d80e32007-07-19 01:14:50 +0000655def SHLD64mrCL : RI<0xA5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmane47f1f92007-09-14 23:17:45 +0000656 "shld{q}\t{%cl, $src2, $dst|$dst, $src2, %CL}",
657 [(store (X86shld (loadi64 addr:$dst), GR64:$src2, CL),
658 addr:$dst)]>, TB;
Evan Cheng64d80e32007-07-19 01:14:50 +0000659def SHRD64mrCL : RI<0xAD, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Dan Gohmane47f1f92007-09-14 23:17:45 +0000660 "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, %CL}",
661 [(store (X86shrd (loadi64 addr:$dst), GR64:$src2, CL),
662 addr:$dst)]>, TB;
Evan Cheng071a2792007-09-11 19:55:27 +0000663}
Evan Cheng25ab6902006-09-08 06:48:29 +0000664def SHLD64mri8 : RIi8<0xA4, MRMDestMem,
Evan Cheng64d80e32007-07-19 01:14:50 +0000665 (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3),
Dan Gohmane47f1f92007-09-14 23:17:45 +0000666 "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
667 [(store (X86shld (loadi64 addr:$dst), GR64:$src2,
668 (i8 imm:$src3)), addr:$dst)]>,
Evan Cheng25ab6902006-09-08 06:48:29 +0000669 TB;
670def SHRD64mri8 : RIi8<0xAC, MRMDestMem,
Evan Cheng64d80e32007-07-19 01:14:50 +0000671 (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3),
Dan Gohmane47f1f92007-09-14 23:17:45 +0000672 "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
673 [(store (X86shrd (loadi64 addr:$dst), GR64:$src2,
674 (i8 imm:$src3)), addr:$dst)]>,
Evan Cheng25ab6902006-09-08 06:48:29 +0000675 TB;
Evan Cheng24f2ea32007-09-14 21:48:26 +0000676} // Defs = [EFLAGS]
Evan Cheng25ab6902006-09-08 06:48:29 +0000677
678//===----------------------------------------------------------------------===//
679// Logical Instructions...
680//
681
682let isTwoAddress = 1 in
Dan Gohmanb1576f52007-07-31 20:11:57 +0000683def NOT64r : RI<0xF7, MRM2r, (outs GR64:$dst), (ins GR64:$src), "not{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000684 [(set GR64:$dst, (not GR64:$src))]>;
Dan Gohmanb1576f52007-07-31 20:11:57 +0000685def NOT64m : RI<0xF7, MRM2m, (outs), (ins i64mem:$dst), "not{q}\t$dst",
Evan Cheng25ab6902006-09-08 06:48:29 +0000686 [(store (not (loadi64 addr:$dst)), addr:$dst)]>;
687
Evan Cheng24f2ea32007-09-14 21:48:26 +0000688let Defs = [EFLAGS] in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000689let isTwoAddress = 1 in {
690let isCommutable = 1 in
691def AND64rr : RI<0x21, MRMDestReg,
Evan Cheng64d80e32007-07-19 01:14:50 +0000692 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000693 "and{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000694 [(set GR64:$dst, (and GR64:$src1, GR64:$src2))]>;
695def AND64rm : RI<0x23, MRMSrcMem,
Evan Cheng64d80e32007-07-19 01:14:50 +0000696 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000697 "and{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000698 [(set GR64:$dst, (and GR64:$src1, (load addr:$src2)))]>;
699def AND64ri32 : RIi32<0x81, MRM4r,
Evan Cheng64d80e32007-07-19 01:14:50 +0000700 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000701 "and{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000702 [(set GR64:$dst, (and GR64:$src1, i64immSExt32:$src2))]>;
703def AND64ri8 : RIi8<0x83, MRM4r,
Evan Cheng64d80e32007-07-19 01:14:50 +0000704 (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000705 "and{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000706 [(set GR64:$dst, (and GR64:$src1, i64immSExt8:$src2))]>;
707} // isTwoAddress
708
709def AND64mr : RI<0x21, MRMDestMem,
Evan Cheng64d80e32007-07-19 01:14:50 +0000710 (outs), (ins i64mem:$dst, GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000711 "and{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000712 [(store (and (load addr:$dst), GR64:$src), addr:$dst)]>;
713def AND64mi32 : RIi32<0x81, MRM4m,
Evan Cheng64d80e32007-07-19 01:14:50 +0000714 (outs), (ins i64mem:$dst, i64i32imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000715 "and{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000716 [(store (and (loadi64 addr:$dst), i64immSExt32:$src), addr:$dst)]>;
717def AND64mi8 : RIi8<0x83, MRM4m,
Evan Cheng64d80e32007-07-19 01:14:50 +0000718 (outs), (ins i64mem:$dst, i64i8imm :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000719 "and{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000720 [(store (and (load addr:$dst), i64immSExt8:$src), addr:$dst)]>;
721
722let isTwoAddress = 1 in {
723let isCommutable = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +0000724def OR64rr : RI<0x09, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000725 "or{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000726 [(set GR64:$dst, (or GR64:$src1, GR64:$src2))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000727def OR64rm : RI<0x0B, MRMSrcMem , (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000728 "or{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000729 [(set GR64:$dst, (or GR64:$src1, (load addr:$src2)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000730def OR64ri32 : RIi32<0x81, MRM1r, (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000731 "or{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000732 [(set GR64:$dst, (or GR64:$src1, i64immSExt32:$src2))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000733def OR64ri8 : RIi8<0x83, MRM1r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000734 "or{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000735 [(set GR64:$dst, (or GR64:$src1, i64immSExt8:$src2))]>;
736} // isTwoAddress
737
Evan Cheng64d80e32007-07-19 01:14:50 +0000738def OR64mr : RI<0x09, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000739 "or{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000740 [(store (or (load addr:$dst), GR64:$src), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000741def OR64mi32 : RIi32<0x81, MRM1m, (outs), (ins i64mem:$dst, i64i32imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000742 "or{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000743 [(store (or (loadi64 addr:$dst), i64immSExt32:$src), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000744def OR64mi8 : RIi8<0x83, MRM1m, (outs), (ins i64mem:$dst, i64i8imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000745 "or{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000746 [(store (or (load addr:$dst), i64immSExt8:$src), addr:$dst)]>;
747
748let isTwoAddress = 1 in {
749let isCommutable = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +0000750def XOR64rr : RI<0x31, MRMDestReg, (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000751 "xor{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000752 [(set GR64:$dst, (xor GR64:$src1, GR64:$src2))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000753def XOR64rm : RI<0x33, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000754 "xor{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000755 [(set GR64:$dst, (xor GR64:$src1, (load addr:$src2)))]>;
756def XOR64ri32 : RIi32<0x81, MRM6r,
Evan Cheng64d80e32007-07-19 01:14:50 +0000757 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000758 "xor{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000759 [(set GR64:$dst, (xor GR64:$src1, i64immSExt32:$src2))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000760def XOR64ri8 : RIi8<0x83, MRM6r, (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000761 "xor{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000762 [(set GR64:$dst, (xor GR64:$src1, i64immSExt8:$src2))]>;
763} // isTwoAddress
764
Evan Cheng64d80e32007-07-19 01:14:50 +0000765def XOR64mr : RI<0x31, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000766 "xor{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000767 [(store (xor (load addr:$dst), GR64:$src), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000768def XOR64mi32 : RIi32<0x81, MRM6m, (outs), (ins i64mem:$dst, i64i32imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000769 "xor{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000770 [(store (xor (loadi64 addr:$dst), i64immSExt32:$src), addr:$dst)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000771def XOR64mi8 : RIi8<0x83, MRM6m, (outs), (ins i64mem:$dst, i64i8imm :$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000772 "xor{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000773 [(store (xor (load addr:$dst), i64immSExt8:$src), addr:$dst)]>;
Evan Cheng24f2ea32007-09-14 21:48:26 +0000774} // Defs = [EFLAGS]
Evan Cheng25ab6902006-09-08 06:48:29 +0000775
776//===----------------------------------------------------------------------===//
777// Comparison Instructions...
778//
779
780// Integer comparison
Evan Cheng24f2ea32007-09-14 21:48:26 +0000781let Defs = [EFLAGS] in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000782let isCommutable = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +0000783def TEST64rr : RI<0x85, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000784 "test{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000785 [(X86cmp (and GR64:$src1, GR64:$src2), 0),
786 (implicit EFLAGS)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000787def TEST64rm : RI<0x85, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000788 "test{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000789 [(X86cmp (and GR64:$src1, (loadi64 addr:$src2)), 0),
790 (implicit EFLAGS)]>;
791def TEST64ri32 : RIi32<0xF7, MRM0r, (outs),
792 (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000793 "test{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000794 [(X86cmp (and GR64:$src1, i64immSExt32:$src2), 0),
795 (implicit EFLAGS)]>;
796def TEST64mi32 : RIi32<0xF7, MRM0m, (outs),
797 (ins i64mem:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000798 "test{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000799 [(X86cmp (and (loadi64 addr:$src1), i64immSExt32:$src2), 0),
800 (implicit EFLAGS)]>;
Evan Cheng25ab6902006-09-08 06:48:29 +0000801
Evan Cheng64d80e32007-07-19 01:14:50 +0000802def CMP64rr : RI<0x39, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000803 "cmp{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000804 [(X86cmp GR64:$src1, GR64:$src2),
805 (implicit EFLAGS)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000806def CMP64mr : RI<0x39, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000807 "cmp{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000808 [(X86cmp (loadi64 addr:$src1), GR64:$src2),
809 (implicit EFLAGS)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000810def CMP64rm : RI<0x3B, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000811 "cmp{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000812 [(X86cmp GR64:$src1, (loadi64 addr:$src2)),
813 (implicit EFLAGS)]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000814def CMP64ri32 : RIi32<0x81, MRM7r, (outs), (ins GR64:$src1, i64i32imm:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000815 "cmp{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000816 [(X86cmp GR64:$src1, i64immSExt32:$src2),
Evan Cheng0488db92007-09-25 01:57:46 +0000817 (implicit EFLAGS)]>;
Evan Chenge5f62042007-09-29 00:00:36 +0000818def CMP64mi32 : RIi32<0x81, MRM7m, (outs),
Evan Cheng0488db92007-09-25 01:57:46 +0000819 (ins i64mem:$src1, i64i32imm:$src2),
820 "cmp{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000821 [(X86cmp (loadi64 addr:$src1), i64immSExt32:$src2),
Evan Cheng0488db92007-09-25 01:57:46 +0000822 (implicit EFLAGS)]>;
Evan Chenge5f62042007-09-29 00:00:36 +0000823def CMP64mi8 : RIi8<0x83, MRM7m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
Evan Cheng0488db92007-09-25 01:57:46 +0000824 "cmp{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000825 [(X86cmp (loadi64 addr:$src1), i64immSExt8:$src2),
Evan Cheng0488db92007-09-25 01:57:46 +0000826 (implicit EFLAGS)]>;
Evan Chenge5f62042007-09-29 00:00:36 +0000827def CMP64ri8 : RIi8<0x83, MRM7r, (outs), (ins GR64:$src1, i64i8imm:$src2),
Evan Cheng0488db92007-09-25 01:57:46 +0000828 "cmp{q}\t{$src2, $src1|$src1, $src2}",
Evan Chenge5f62042007-09-29 00:00:36 +0000829 [(X86cmp GR64:$src1, i64immSExt8:$src2),
Evan Cheng0488db92007-09-25 01:57:46 +0000830 (implicit EFLAGS)]>;
831} // Defs = [EFLAGS]
832
Evan Cheng25ab6902006-09-08 06:48:29 +0000833// Conditional moves
Evan Cheng0488db92007-09-25 01:57:46 +0000834let Uses = [EFLAGS], isTwoAddress = 1 in {
Evan Cheng7ad42d92007-10-05 23:13:21 +0000835let isCommutable = 1 in {
Evan Cheng25ab6902006-09-08 06:48:29 +0000836def CMOVB64rr : RI<0x42, MRMSrcReg, // if <u, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000837 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000838 "cmovb\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000839 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000840 X86_COND_B, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000841def CMOVAE64rr: RI<0x43, MRMSrcReg, // if >=u, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000842 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000843 "cmovae\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000844 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000845 X86_COND_AE, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000846def CMOVE64rr : RI<0x44, MRMSrcReg, // if ==, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000847 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000848 "cmove\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000849 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000850 X86_COND_E, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000851def CMOVNE64rr: RI<0x45, MRMSrcReg, // if !=, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000852 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000853 "cmovne\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000854 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000855 X86_COND_NE, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000856def CMOVBE64rr: RI<0x46, MRMSrcReg, // if <=u, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000857 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000858 "cmovbe\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000859 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000860 X86_COND_BE, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000861def CMOVA64rr : RI<0x47, MRMSrcReg, // if >u, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000862 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000863 "cmova\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000864 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000865 X86_COND_A, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000866def CMOVL64rr : RI<0x4C, MRMSrcReg, // if <s, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000867 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000868 "cmovl\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000869 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000870 X86_COND_L, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000871def CMOVGE64rr: RI<0x4D, MRMSrcReg, // if >=s, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000872 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000873 "cmovge\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000874 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000875 X86_COND_GE, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000876def CMOVLE64rr: RI<0x4E, MRMSrcReg, // if <=s, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000877 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000878 "cmovle\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000879 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000880 X86_COND_LE, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000881def CMOVG64rr : RI<0x4F, MRMSrcReg, // if >s, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000882 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000883 "cmovg\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000884 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000885 X86_COND_G, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000886def CMOVS64rr : RI<0x48, MRMSrcReg, // if signed, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000887 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000888 "cmovs\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000889 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000890 X86_COND_S, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000891def CMOVNS64rr: RI<0x49, MRMSrcReg, // if !signed, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000892 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000893 "cmovns\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000894 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000895 X86_COND_NS, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000896def CMOVP64rr : RI<0x4A, MRMSrcReg, // if parity, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000897 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000898 "cmovp\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000899 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000900 X86_COND_P, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000901def CMOVNP64rr : RI<0x4B, MRMSrcReg, // if !parity, GR64 = GR64
Evan Cheng64d80e32007-07-19 01:14:50 +0000902 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000903 "cmovnp\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000904 [(set GR64:$dst, (X86cmov GR64:$src1, GR64:$src2,
Evan Chenge5f62042007-09-29 00:00:36 +0000905 X86_COND_NP, EFLAGS))]>, TB;
Evan Cheng7ad42d92007-10-05 23:13:21 +0000906} // isCommutable = 1
907
908def CMOVB64rm : RI<0x42, MRMSrcMem, // if <u, GR64 = [mem64]
909 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
910 "cmovb\t{$src2, $dst|$dst, $src2}",
911 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
912 X86_COND_B, EFLAGS))]>, TB;
913def CMOVAE64rm: RI<0x43, MRMSrcMem, // if >=u, GR64 = [mem64]
914 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
915 "cmovae\t{$src2, $dst|$dst, $src2}",
916 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
917 X86_COND_AE, EFLAGS))]>, TB;
918def CMOVE64rm : RI<0x44, MRMSrcMem, // if ==, GR64 = [mem64]
919 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
920 "cmove\t{$src2, $dst|$dst, $src2}",
921 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
922 X86_COND_E, EFLAGS))]>, TB;
923def CMOVNE64rm: RI<0x45, MRMSrcMem, // if !=, GR64 = [mem64]
924 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
925 "cmovne\t{$src2, $dst|$dst, $src2}",
926 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
927 X86_COND_NE, EFLAGS))]>, TB;
928def CMOVBE64rm: RI<0x46, MRMSrcMem, // if <=u, GR64 = [mem64]
929 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
930 "cmovbe\t{$src2, $dst|$dst, $src2}",
931 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
932 X86_COND_BE, EFLAGS))]>, TB;
933def CMOVA64rm : RI<0x47, MRMSrcMem, // if >u, GR64 = [mem64]
934 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
935 "cmova\t{$src2, $dst|$dst, $src2}",
936 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
937 X86_COND_A, EFLAGS))]>, TB;
938def CMOVL64rm : RI<0x4C, MRMSrcMem, // if <s, GR64 = [mem64]
939 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
940 "cmovl\t{$src2, $dst|$dst, $src2}",
941 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
942 X86_COND_L, EFLAGS))]>, TB;
943def CMOVGE64rm: RI<0x4D, MRMSrcMem, // if >=s, GR64 = [mem64]
944 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
945 "cmovge\t{$src2, $dst|$dst, $src2}",
946 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
947 X86_COND_GE, EFLAGS))]>, TB;
948def CMOVLE64rm: RI<0x4E, MRMSrcMem, // if <=s, GR64 = [mem64]
949 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
950 "cmovle\t{$src2, $dst|$dst, $src2}",
951 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
952 X86_COND_LE, EFLAGS))]>, TB;
953def CMOVG64rm : RI<0x4F, MRMSrcMem, // if >s, GR64 = [mem64]
954 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
955 "cmovg\t{$src2, $dst|$dst, $src2}",
956 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
957 X86_COND_G, EFLAGS))]>, TB;
958def CMOVS64rm : RI<0x48, MRMSrcMem, // if signed, GR64 = [mem64]
959 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
960 "cmovs\t{$src2, $dst|$dst, $src2}",
961 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
962 X86_COND_S, EFLAGS))]>, TB;
963def CMOVNS64rm: RI<0x49, MRMSrcMem, // if !signed, GR64 = [mem64]
964 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
965 "cmovns\t{$src2, $dst|$dst, $src2}",
966 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
967 X86_COND_NS, EFLAGS))]>, TB;
968def CMOVP64rm : RI<0x4A, MRMSrcMem, // if parity, GR64 = [mem64]
969 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
970 "cmovp\t{$src2, $dst|$dst, $src2}",
971 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
972 X86_COND_P, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000973def CMOVNP64rm : RI<0x4B, MRMSrcMem, // if !parity, GR64 = [mem64]
Evan Cheng64d80e32007-07-19 01:14:50 +0000974 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000975 "cmovnp\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000976 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
Evan Cheng0488db92007-09-25 01:57:46 +0000977 X86_COND_NP, EFLAGS))]>, TB;
Evan Cheng25ab6902006-09-08 06:48:29 +0000978} // isTwoAddress
979
980//===----------------------------------------------------------------------===//
981// Conversion Instructions...
982//
983
984// f64 -> signed i64
Evan Cheng64d80e32007-07-19 01:14:50 +0000985def Int_CVTSD2SI64rr: RSDI<0x2D, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000986 "cvtsd2si{q}\t{$src, $dst|$dst, $src}",
Bill Wendling6a20cf02007-07-23 03:07:27 +0000987 [(set GR64:$dst,
988 (int_x86_sse2_cvtsd2si64 VR128:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000989def Int_CVTSD2SI64rm: RSDI<0x2D, MRMSrcMem, (outs GR64:$dst), (ins f128mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000990 "cvtsd2si{q}\t{$src, $dst|$dst, $src}",
Bill Wendling6a20cf02007-07-23 03:07:27 +0000991 [(set GR64:$dst, (int_x86_sse2_cvtsd2si64
992 (load addr:$src)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000993def CVTTSD2SI64rr: RSDI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins FR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000994 "cvttsd2si{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000995 [(set GR64:$dst, (fp_to_sint FR64:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000996def CVTTSD2SI64rm: RSDI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f64mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +0000997 "cvttsd2si{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +0000998 [(set GR64:$dst, (fp_to_sint (loadf64 addr:$src)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000999def Int_CVTTSD2SI64rr: RSDI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001000 "cvttsd2si{q}\t{$src, $dst|$dst, $src}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001001 [(set GR64:$dst,
1002 (int_x86_sse2_cvttsd2si64 VR128:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001003def Int_CVTTSD2SI64rm: RSDI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f128mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001004 "cvttsd2si{q}\t{$src, $dst|$dst, $src}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001005 [(set GR64:$dst,
1006 (int_x86_sse2_cvttsd2si64
1007 (load addr:$src)))]>;
Evan Cheng25ab6902006-09-08 06:48:29 +00001008
1009// Signed i64 -> f64
Evan Cheng64d80e32007-07-19 01:14:50 +00001010def CVTSI2SD64rr: RSDI<0x2A, MRMSrcReg, (outs FR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001011 "cvtsi2sd{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001012 [(set FR64:$dst, (sint_to_fp GR64:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001013def CVTSI2SD64rm: RSDI<0x2A, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001014 "cvtsi2sd{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001015 [(set FR64:$dst, (sint_to_fp (loadi64 addr:$src)))]>;
1016let isTwoAddress = 1 in {
1017def Int_CVTSI2SD64rr: RSDI<0x2A, MRMSrcReg,
Evan Cheng64d80e32007-07-19 01:14:50 +00001018 (outs VR128:$dst), (ins VR128:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001019 "cvtsi2sd{q}\t{$src2, $dst|$dst, $src2}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001020 [(set VR128:$dst,
1021 (int_x86_sse2_cvtsi642sd VR128:$src1,
1022 GR64:$src2))]>;
Evan Cheng25ab6902006-09-08 06:48:29 +00001023def Int_CVTSI2SD64rm: RSDI<0x2A, MRMSrcMem,
Evan Cheng64d80e32007-07-19 01:14:50 +00001024 (outs VR128:$dst), (ins VR128:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001025 "cvtsi2sd{q}\t{$src2, $dst|$dst, $src2}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001026 [(set VR128:$dst,
1027 (int_x86_sse2_cvtsi642sd VR128:$src1,
1028 (loadi64 addr:$src2)))]>;
Evan Cheng25ab6902006-09-08 06:48:29 +00001029} // isTwoAddress
1030
1031// Signed i64 -> f32
Evan Cheng64d80e32007-07-19 01:14:50 +00001032def CVTSI2SS64rr: RSSI<0x2A, MRMSrcReg, (outs FR32:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001033 "cvtsi2ss{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001034 [(set FR32:$dst, (sint_to_fp GR64:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001035def CVTSI2SS64rm: RSSI<0x2A, MRMSrcMem, (outs FR32:$dst), (ins i64mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001036 "cvtsi2ss{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001037 [(set FR32:$dst, (sint_to_fp (loadi64 addr:$src)))]>;
1038let isTwoAddress = 1 in {
1039def Int_CVTSI2SS64rr: RSSI<0x2A, MRMSrcReg,
Evan Cheng64d80e32007-07-19 01:14:50 +00001040 (outs VR128:$dst), (ins VR128:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001041 "cvtsi2ss{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001042 []>; // TODO: add intrinsic
1043def Int_CVTSI2SS64rm: RSSI<0x2A, MRMSrcMem,
Evan Cheng64d80e32007-07-19 01:14:50 +00001044 (outs VR128:$dst), (ins VR128:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001045 "cvtsi2ss{q}\t{$src2, $dst|$dst, $src2}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001046 []>; // TODO: add intrinsic
1047} // isTwoAddress
1048
1049// f32 -> signed i64
Evan Cheng64d80e32007-07-19 01:14:50 +00001050def Int_CVTSS2SI64rr: RSSI<0x2D, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001051 "cvtss2si{q}\t{$src, $dst|$dst, $src}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001052 [(set GR64:$dst,
1053 (int_x86_sse_cvtss2si64 VR128:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001054def Int_CVTSS2SI64rm: RSSI<0x2D, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001055 "cvtss2si{q}\t{$src, $dst|$dst, $src}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001056 [(set GR64:$dst, (int_x86_sse_cvtss2si64
1057 (load addr:$src)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001058def CVTTSS2SI64rr: RSSI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins FR32:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001059 "cvttss2si{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001060 [(set GR64:$dst, (fp_to_sint FR32:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001061def CVTTSS2SI64rm: RSSI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001062 "cvttss2si{q}\t{$src, $dst|$dst, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001063 [(set GR64:$dst, (fp_to_sint (loadf32 addr:$src)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001064def Int_CVTTSS2SI64rr: RSSI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001065 "cvttss2si{q}\t{$src, $dst|$dst, $src}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001066 [(set GR64:$dst,
1067 (int_x86_sse_cvttss2si64 VR128:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001068def Int_CVTTSS2SI64rm: RSSI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001069 "cvttss2si{q}\t{$src, $dst|$dst, $src}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001070 [(set GR64:$dst,
1071 (int_x86_sse_cvttss2si64 (load addr:$src)))]>;
1072
1073let isTwoAddress = 1 in {
1074 def Int_CVTSI642SSrr : RSSI<0x2A, MRMSrcReg,
1075 (outs VR128:$dst), (ins VR128:$src1, GR64:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001076 "cvtsi2ss{q}\t{$src2, $dst|$dst, $src2}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001077 [(set VR128:$dst,
1078 (int_x86_sse_cvtsi642ss VR128:$src1,
1079 GR64:$src2))]>;
1080 def Int_CVTSI642SSrm : RSSI<0x2A, MRMSrcMem,
1081 (outs VR128:$dst), (ins VR128:$src1, i64mem:$src2),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001082 "cvtsi2ss{q}\t{$src2, $dst|$dst, $src2}",
Bill Wendling6a20cf02007-07-23 03:07:27 +00001083 [(set VR128:$dst,
1084 (int_x86_sse_cvtsi642ss VR128:$src1,
1085 (loadi64 addr:$src2)))]>;
1086}
Evan Cheng25ab6902006-09-08 06:48:29 +00001087
1088//===----------------------------------------------------------------------===//
1089// Alias Instructions
1090//===----------------------------------------------------------------------===//
1091
Evan Cheng25ab6902006-09-08 06:48:29 +00001092// Zero-extension
1093// TODO: Remove this after proper i32 -> i64 zext support.
Evan Cheng64d80e32007-07-19 01:14:50 +00001094def PsMOVZX64rr32: I<0x89, MRMDestReg, (outs GR64:$dst), (ins GR32:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001095 "mov{l}\t{$src, ${dst:subreg32}|${dst:subreg32}, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001096 [(set GR64:$dst, (zext GR32:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001097def PsMOVZX64rm32: I<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i32mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001098 "mov{l}\t{$src, ${dst:subreg32}|${dst:subreg32}, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001099 [(set GR64:$dst, (zextloadi64i32 addr:$src))]>;
1100
1101
Dan Gohman95906242007-09-17 14:55:08 +00001102// Alias instructions that map movr0 to xor. Use xorl instead of xorq; it's
1103// equivalent due to implicit zero-extending, and it sometimes has a smaller
1104// encoding.
Evan Cheng25ab6902006-09-08 06:48:29 +00001105// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
1106// FIXME: AddedComplexity gives MOV64r0 a higher priority than MOV64ri32. Remove
1107// when we have a better way to specify isel priority.
Bill Wendling627c00b2007-12-17 23:07:56 +00001108let Defs = [EFLAGS], AddedComplexity = 1, isReMaterializable = 1,
1109 neverHasSideEffects = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +00001110def MOV64r0 : RI<0x31, MRMInitReg, (outs GR64:$dst), (ins),
Dan Gohman95906242007-09-17 14:55:08 +00001111 "xor{l}\t${dst:subreg32}, ${dst:subreg32}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001112 [(set GR64:$dst, 0)]>;
1113
1114// Materialize i64 constant where top 32-bits are zero.
Bill Wendling627c00b2007-12-17 23:07:56 +00001115let AddedComplexity = 1, isReMaterializable = 1, neverHasSideEffects = 1 in
Evan Cheng64d80e32007-07-19 01:14:50 +00001116def MOV64ri64i32 : Ii32<0xB8, AddRegFrm, (outs GR64:$dst), (ins i64i32imm:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001117 "mov{l}\t{$src, ${dst:subreg32}|${dst:subreg32}, $src}",
Evan Cheng25ab6902006-09-08 06:48:29 +00001118 [(set GR64:$dst, i64immZExt32:$src)]>;
1119
1120//===----------------------------------------------------------------------===//
1121// Non-Instruction Patterns
1122//===----------------------------------------------------------------------===//
1123
Evan Cheng0085a282006-11-30 21:55:46 +00001124// ConstantPool GlobalAddress, ExternalSymbol, and JumpTable
1125def : Pat<(i64 (X86Wrapper tconstpool :$dst)),
Evan Cheng0085a282006-11-30 21:55:46 +00001126 (MOV64ri tconstpool :$dst)>, Requires<[NotSmallCode]>;
1127def : Pat<(i64 (X86Wrapper tjumptable :$dst)),
1128 (MOV64ri tjumptable :$dst)>, Requires<[NotSmallCode]>;
1129def : Pat<(i64 (X86Wrapper tglobaladdr :$dst)),
1130 (MOV64ri tglobaladdr :$dst)>, Requires<[NotSmallCode]>;
1131def : Pat<(i64 (X86Wrapper texternalsym:$dst)),
1132 (MOV64ri texternalsym:$dst)>, Requires<[NotSmallCode]>;
1133
Evan Cheng28b514392006-12-05 19:50:18 +00001134def : Pat<(store (i64 (X86Wrapper tconstpool:$src)), addr:$dst),
1135 (MOV64mi32 addr:$dst, tconstpool:$src)>,
Evan Cheng0db079e2007-08-01 23:46:10 +00001136 Requires<[SmallCode, HasLow4G, IsStatic]>;
Evan Cheng28b514392006-12-05 19:50:18 +00001137def : Pat<(store (i64 (X86Wrapper tjumptable:$src)), addr:$dst),
1138 (MOV64mi32 addr:$dst, tjumptable:$src)>,
Evan Cheng0db079e2007-08-01 23:46:10 +00001139 Requires<[SmallCode, HasLow4G, IsStatic]>;
Evan Cheng0085a282006-11-30 21:55:46 +00001140def : Pat<(store (i64 (X86Wrapper tglobaladdr:$src)), addr:$dst),
Evan Cheng28b514392006-12-05 19:50:18 +00001141 (MOV64mi32 addr:$dst, tglobaladdr:$src)>,
Evan Cheng0db079e2007-08-01 23:46:10 +00001142 Requires<[SmallCode, HasLow4G, IsStatic]>;
Evan Cheng0085a282006-11-30 21:55:46 +00001143def : Pat<(store (i64 (X86Wrapper texternalsym:$src)), addr:$dst),
Evan Cheng28b514392006-12-05 19:50:18 +00001144 (MOV64mi32 addr:$dst, texternalsym:$src)>,
Evan Cheng0db079e2007-08-01 23:46:10 +00001145 Requires<[SmallCode, HasLow4G, IsStatic]>;
Evan Cheng0085a282006-11-30 21:55:46 +00001146
Evan Cheng25ab6902006-09-08 06:48:29 +00001147// Calls
1148// Direct PC relative function call for small code model. 32-bit displacement
1149// sign extended to 64-bit.
1150def : Pat<(X86call (i64 tglobaladdr:$dst)),
1151 (CALL64pcrel32 tglobaladdr:$dst)>;
1152def : Pat<(X86call (i64 texternalsym:$dst)),
1153 (CALL64pcrel32 texternalsym:$dst)>;
1154
1155def : Pat<(X86tailcall (i64 tglobaladdr:$dst)),
1156 (CALL64pcrel32 tglobaladdr:$dst)>;
1157def : Pat<(X86tailcall (i64 texternalsym:$dst)),
1158 (CALL64pcrel32 texternalsym:$dst)>;
1159
1160def : Pat<(X86tailcall GR64:$dst),
1161 (CALL64r GR64:$dst)>;
1162
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001163
1164// tailcall stuff
1165def : Pat<(X86tailcall GR32:$dst),
1166 (TAILCALL)>;
1167def : Pat<(X86tailcall (i64 tglobaladdr:$dst)),
1168 (TAILCALL)>;
1169def : Pat<(X86tailcall (i64 texternalsym:$dst)),
1170 (TAILCALL)>;
1171
1172def : Pat<(X86tcret GR64:$dst, imm:$off),
1173 (TCRETURNri64 GR64:$dst, imm:$off)>;
1174
1175def : Pat<(X86tcret (i64 tglobaladdr:$dst), imm:$off),
1176 (TCRETURNdi64 texternalsym:$dst, imm:$off)>;
1177
1178def : Pat<(X86tcret (i64 texternalsym:$dst), imm:$off),
1179 (TCRETURNdi64 texternalsym:$dst, imm:$off)>;
1180
Dan Gohman11f7bfb2007-09-17 14:35:24 +00001181// Comparisons.
1182
1183// TEST R,R is smaller than CMP R,0
Evan Chenge5f62042007-09-29 00:00:36 +00001184def : Pat<(parallel (X86cmp GR64:$src1, 0), (implicit EFLAGS)),
Dan Gohman11f7bfb2007-09-17 14:35:24 +00001185 (TEST64rr GR64:$src1, GR64:$src1)>;
1186
Evan Cheng25ab6902006-09-08 06:48:29 +00001187// {s|z}extload bool -> {s|z}extload byte
1188def : Pat<(sextloadi64i1 addr:$src), (MOVSX64rm8 addr:$src)>;
1189def : Pat<(zextloadi64i1 addr:$src), (MOVZX64rm8 addr:$src)>;
1190
1191// extload
1192def : Pat<(extloadi64i1 addr:$src), (MOVZX64rm8 addr:$src)>;
1193def : Pat<(extloadi64i8 addr:$src), (MOVZX64rm8 addr:$src)>;
1194def : Pat<(extloadi64i16 addr:$src), (MOVZX64rm16 addr:$src)>;
1195def : Pat<(extloadi64i32 addr:$src), (PsMOVZX64rm32 addr:$src)>;
1196
1197// anyext -> zext
1198def : Pat<(i64 (anyext GR8 :$src)), (MOVZX64rr8 GR8 :$src)>;
1199def : Pat<(i64 (anyext GR16:$src)), (MOVZX64rr16 GR16:$src)>;
1200def : Pat<(i64 (anyext GR32:$src)), (PsMOVZX64rr32 GR32:$src)>;
1201def : Pat<(i64 (anyext (loadi8 addr:$src))), (MOVZX64rm8 addr:$src)>;
1202def : Pat<(i64 (anyext (loadi16 addr:$src))), (MOVZX64rm16 addr:$src)>;
1203def : Pat<(i64 (anyext (loadi32 addr:$src))), (PsMOVZX64rm32 addr:$src)>;
1204
1205//===----------------------------------------------------------------------===//
1206// Some peepholes
1207//===----------------------------------------------------------------------===//
1208
1209// (shl x, 1) ==> (add x, x)
1210def : Pat<(shl GR64:$src1, (i8 1)), (ADD64rr GR64:$src1, GR64:$src1)>;
1211
1212// (or (x >> c) | (y << (64 - c))) ==> (shrd64 x, y, c)
1213def : Pat<(or (srl GR64:$src1, CL:$amt),
1214 (shl GR64:$src2, (sub 64, CL:$amt))),
1215 (SHRD64rrCL GR64:$src1, GR64:$src2)>;
1216
1217def : Pat<(store (or (srl (loadi64 addr:$dst), CL:$amt),
1218 (shl GR64:$src2, (sub 64, CL:$amt))), addr:$dst),
1219 (SHRD64mrCL addr:$dst, GR64:$src2)>;
1220
1221// (or (x << c) | (y >> (64 - c))) ==> (shld64 x, y, c)
1222def : Pat<(or (shl GR64:$src1, CL:$amt),
1223 (srl GR64:$src2, (sub 64, CL:$amt))),
1224 (SHLD64rrCL GR64:$src1, GR64:$src2)>;
1225
1226def : Pat<(store (or (shl (loadi64 addr:$dst), CL:$amt),
1227 (srl GR64:$src2, (sub 64, CL:$amt))), addr:$dst),
1228 (SHLD64mrCL addr:$dst, GR64:$src2)>;
Evan Chengebf01d62006-11-16 23:33:25 +00001229
Chris Lattnera0668102007-05-17 06:35:11 +00001230// X86 specific add which produces a flag.
1231def : Pat<(addc GR64:$src1, GR64:$src2),
1232 (ADD64rr GR64:$src1, GR64:$src2)>;
1233def : Pat<(addc GR64:$src1, (load addr:$src2)),
1234 (ADD64rm GR64:$src1, addr:$src2)>;
1235def : Pat<(addc GR64:$src1, i64immSExt32:$src2),
1236 (ADD64ri32 GR64:$src1, imm:$src2)>;
1237def : Pat<(addc GR64:$src1, i64immSExt8:$src2),
1238 (ADD64ri8 GR64:$src1, i64immSExt8:$src2)>;
1239
1240def : Pat<(subc GR64:$src1, GR64:$src2),
1241 (SUB64rr GR64:$src1, GR64:$src2)>;
1242def : Pat<(subc GR64:$src1, (load addr:$src2)),
1243 (SUB64rm GR64:$src1, addr:$src2)>;
1244def : Pat<(subc GR64:$src1, imm:$src2),
1245 (SUB64ri32 GR64:$src1, i64immSExt32:$src2)>;
1246def : Pat<(subc GR64:$src1, i64immSExt8:$src2),
1247 (SUB64ri8 GR64:$src1, i64immSExt8:$src2)>;
1248
1249
Evan Chengebf01d62006-11-16 23:33:25 +00001250//===----------------------------------------------------------------------===//
1251// X86-64 SSE Instructions
1252//===----------------------------------------------------------------------===//
1253
1254// Move instructions...
1255
Evan Cheng64d80e32007-07-19 01:14:50 +00001256def MOV64toPQIrr : RPDI<0x6E, MRMSrcReg, (outs VR128:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001257 "mov{d|q}\t{$src, $dst|$dst, $src}",
Evan Chengebf01d62006-11-16 23:33:25 +00001258 [(set VR128:$dst,
1259 (v2i64 (scalar_to_vector GR64:$src)))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001260def MOVPQIto64rr : RPDI<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR128:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001261 "mov{d|q}\t{$src, $dst|$dst, $src}",
Evan Chengebf01d62006-11-16 23:33:25 +00001262 [(set GR64:$dst, (vector_extract (v2i64 VR128:$src),
1263 (iPTR 0)))]>;
Evan Cheng21b76122006-12-14 21:55:39 +00001264
Evan Cheng64d80e32007-07-19 01:14:50 +00001265def MOV64toSDrr : RPDI<0x6E, MRMSrcReg, (outs FR64:$dst), (ins GR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001266 "mov{d|q}\t{$src, $dst|$dst, $src}",
Evan Cheng21b76122006-12-14 21:55:39 +00001267 [(set FR64:$dst, (bitconvert GR64:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001268def MOV64toSDrm : RPDI<0x6E, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001269 "mov{d|q}\t{$src, $dst|$dst, $src}",
Evan Cheng21b76122006-12-14 21:55:39 +00001270 [(set FR64:$dst, (bitconvert (loadi64 addr:$src)))]>;
1271
Evan Cheng64d80e32007-07-19 01:14:50 +00001272def MOVSDto64rr : RPDI<0x7E, MRMDestReg, (outs GR64:$dst), (ins FR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001273 "mov{d|q}\t{$src, $dst|$dst, $src}",
Evan Cheng21b76122006-12-14 21:55:39 +00001274 [(set GR64:$dst, (bitconvert FR64:$src))]>;
Evan Cheng64d80e32007-07-19 01:14:50 +00001275def MOVSDto64mr : RPDI<0x7E, MRMDestMem, (outs), (ins i64mem:$dst, FR64:$src),
Dan Gohmanb1576f52007-07-31 20:11:57 +00001276 "mov{d|q}\t{$src, $dst|$dst, $src}",
Evan Cheng21b76122006-12-14 21:55:39 +00001277 [(store (i64 (bitconvert FR64:$src)), addr:$dst)]>;