blob: 31dd52904e2c6dcc73596d8eecedf58a521fa74e [file] [log] [blame]
Chris Lattner87be16a2010-10-05 06:04:14 +00001//===- X86InstrControl.td - Control Flow Instructions ------*- tablegen -*-===//
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +00002//
Chris Lattner87be16a2010-10-05 06:04:14 +00003// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +00007//
Chris Lattner87be16a2010-10-05 06:04:14 +00008//===----------------------------------------------------------------------===//
9//
10// This file describes the X86 jump, return, call, and related instructions.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15// Control Flow Instructions.
16//
17
18// Return instructions.
19let isTerminator = 1, isReturn = 1, isBarrier = 1,
20 hasCtrlDep = 1, FPForm = SpecialFP in {
21 def RET : I <0xC3, RawFrm, (outs), (ins variable_ops),
22 "ret",
Andrew Trick922d3142012-02-01 23:20:51 +000023 [(X86retflag 0)], IIC_RET>;
Chris Lattner87be16a2010-10-05 06:04:14 +000024 def RETI : Ii16<0xC2, RawFrm, (outs), (ins i16imm:$amt, variable_ops),
25 "ret\t$amt",
Andrew Trick922d3142012-02-01 23:20:51 +000026 [(X86retflag timm:$amt)], IIC_RET_IMM>;
Kevin Enderby7aef62f2010-10-18 17:04:36 +000027 def RETIW : Ii16<0xC2, RawFrm, (outs), (ins i16imm:$amt, variable_ops),
28 "retw\t$amt",
Andrew Trick922d3142012-02-01 23:20:51 +000029 [], IIC_RET_IMM>, OpSize;
Chris Lattner269f10b2010-11-12 18:54:56 +000030 def LRETL : I <0xCB, RawFrm, (outs), (ins),
Andrew Trick922d3142012-02-01 23:20:51 +000031 "lretl", [], IIC_RET>;
Chris Lattner6b5e3972010-11-12 17:41:20 +000032 def LRETQ : RI <0xCB, RawFrm, (outs), (ins),
Andrew Trick922d3142012-02-01 23:20:51 +000033 "lretq", [], IIC_RET>;
Chris Lattner87be16a2010-10-05 06:04:14 +000034 def LRETI : Ii16<0xCA, RawFrm, (outs), (ins i16imm:$amt),
Andrew Trick922d3142012-02-01 23:20:51 +000035 "lret\t$amt", [], IIC_RET>;
Kevin Enderby7aef62f2010-10-18 17:04:36 +000036 def LRETIW : Ii16<0xCA, RawFrm, (outs), (ins i16imm:$amt),
Andrew Trick922d3142012-02-01 23:20:51 +000037 "lretw\t$amt", [], IIC_RET>, OpSize;
Chris Lattner87be16a2010-10-05 06:04:14 +000038}
39
40// Unconditional branches.
41let isBarrier = 1, isBranch = 1, isTerminator = 1 in {
42 def JMP_4 : Ii32PCRel<0xE9, RawFrm, (outs), (ins brtarget:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +000043 "jmp\t$dst", [(br bb:$dst)], IIC_JMP_REL>;
Chris Lattner87be16a2010-10-05 06:04:14 +000044 def JMP_1 : Ii8PCRel<0xEB, RawFrm, (outs), (ins brtarget8:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +000045 "jmp\t$dst", [], IIC_JMP_REL>;
Devang Patelcf0e2692012-01-20 21:14:06 +000046 // FIXME : Intel syntax for JMP64pcrel32 such that it is not ambiguious
47 // with JMP_1.
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +000048 def JMP64pcrel32 : I<0xE9, RawFrm, (outs), (ins brtarget:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +000049 "jmpq\t$dst", [], IIC_JMP_REL>;
Chris Lattner87be16a2010-10-05 06:04:14 +000050}
51
52// Conditional Branches.
53let isBranch = 1, isTerminator = 1, Uses = [EFLAGS] in {
54 multiclass ICBr<bits<8> opc1, bits<8> opc4, string asm, PatFrag Cond> {
Andrew Trick922d3142012-02-01 23:20:51 +000055 def _1 : Ii8PCRel <opc1, RawFrm, (outs), (ins brtarget8:$dst), asm, [],
56 IIC_Jcc>;
Chris Lattner87be16a2010-10-05 06:04:14 +000057 def _4 : Ii32PCRel<opc4, RawFrm, (outs), (ins brtarget:$dst), asm,
Andrew Trick922d3142012-02-01 23:20:51 +000058 [(X86brcond bb:$dst, Cond, EFLAGS)], IIC_Jcc>, TB;
Chris Lattner87be16a2010-10-05 06:04:14 +000059 }
60}
61
62defm JO : ICBr<0x70, 0x80, "jo\t$dst" , X86_COND_O>;
63defm JNO : ICBr<0x71, 0x81, "jno\t$dst" , X86_COND_NO>;
64defm JB : ICBr<0x72, 0x82, "jb\t$dst" , X86_COND_B>;
65defm JAE : ICBr<0x73, 0x83, "jae\t$dst", X86_COND_AE>;
66defm JE : ICBr<0x74, 0x84, "je\t$dst" , X86_COND_E>;
67defm JNE : ICBr<0x75, 0x85, "jne\t$dst", X86_COND_NE>;
68defm JBE : ICBr<0x76, 0x86, "jbe\t$dst", X86_COND_BE>;
69defm JA : ICBr<0x77, 0x87, "ja\t$dst" , X86_COND_A>;
70defm JS : ICBr<0x78, 0x88, "js\t$dst" , X86_COND_S>;
71defm JNS : ICBr<0x79, 0x89, "jns\t$dst", X86_COND_NS>;
72defm JP : ICBr<0x7A, 0x8A, "jp\t$dst" , X86_COND_P>;
73defm JNP : ICBr<0x7B, 0x8B, "jnp\t$dst", X86_COND_NP>;
74defm JL : ICBr<0x7C, 0x8C, "jl\t$dst" , X86_COND_L>;
75defm JGE : ICBr<0x7D, 0x8D, "jge\t$dst", X86_COND_GE>;
76defm JLE : ICBr<0x7E, 0x8E, "jle\t$dst", X86_COND_LE>;
77defm JG : ICBr<0x7F, 0x8F, "jg\t$dst" , X86_COND_G>;
78
79// jcx/jecx/jrcx instructions.
80let isAsmParserOnly = 1, isBranch = 1, isTerminator = 1 in {
81 // These are the 32-bit versions of this instruction for the asmparser. In
82 // 32-bit mode, the address size prefix is jcxz and the unprefixed version is
83 // jecxz.
84 let Uses = [CX] in
85 def JCXZ : Ii8PCRel<0xE3, RawFrm, (outs), (ins brtarget8:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +000086 "jcxz\t$dst", [], IIC_JCXZ>, AdSize, Requires<[In32BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +000087 let Uses = [ECX] in
88 def JECXZ_32 : Ii8PCRel<0xE3, RawFrm, (outs), (ins brtarget8:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +000089 "jecxz\t$dst", [], IIC_JCXZ>, Requires<[In32BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +000090
91 // J*CXZ instruction: 64-bit versions of this instruction for the asmparser.
92 // In 64-bit mode, the address size prefix is jecxz and the unprefixed version
93 // is jrcxz.
94 let Uses = [ECX] in
95 def JECXZ_64 : Ii8PCRel<0xE3, RawFrm, (outs), (ins brtarget8:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +000096 "jecxz\t$dst", [], IIC_JCXZ>, AdSize, Requires<[In64BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +000097 let Uses = [RCX] in
98 def JRCXZ : Ii8PCRel<0xE3, RawFrm, (outs), (ins brtarget8:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +000099 "jrcxz\t$dst", [], IIC_JCXZ>, Requires<[In64BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000100}
101
102// Indirect branches
103let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
104 def JMP32r : I<0xFF, MRM4r, (outs), (ins GR32:$dst), "jmp{l}\t{*}$dst",
Andrew Trick922d3142012-02-01 23:20:51 +0000105 [(brind GR32:$dst)], IIC_JMP_REG>, Requires<[In32BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000106 def JMP32m : I<0xFF, MRM4m, (outs), (ins i32mem:$dst), "jmp{l}\t{*}$dst",
Andrew Trick922d3142012-02-01 23:20:51 +0000107 [(brind (loadi32 addr:$dst))], IIC_JMP_MEM>, Requires<[In32BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000108
109 def JMP64r : I<0xFF, MRM4r, (outs), (ins GR64:$dst), "jmp{q}\t{*}$dst",
Andrew Trick922d3142012-02-01 23:20:51 +0000110 [(brind GR64:$dst)], IIC_JMP_REG>, Requires<[In64BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000111 def JMP64m : I<0xFF, MRM4m, (outs), (ins i64mem:$dst), "jmp{q}\t{*}$dst",
Andrew Trick922d3142012-02-01 23:20:51 +0000112 [(brind (loadi64 addr:$dst))], IIC_JMP_MEM>, Requires<[In64BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000113
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000114 def FARJMP16i : Iseg16<0xEA, RawFrmImm16, (outs),
Chris Lattner87be16a2010-10-05 06:04:14 +0000115 (ins i16imm:$off, i16imm:$seg),
Andrew Trick922d3142012-02-01 23:20:51 +0000116 "ljmp{w}\t{$seg, $off|$off, $seg}", [], IIC_JMP_FAR_PTR>, OpSize;
Chris Lattner87be16a2010-10-05 06:04:14 +0000117 def FARJMP32i : Iseg32<0xEA, RawFrmImm16, (outs),
118 (ins i32imm:$off, i16imm:$seg),
Andrew Trick922d3142012-02-01 23:20:51 +0000119 "ljmp{l}\t{$seg, $off|$off, $seg}", [], IIC_JMP_FAR_PTR>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000120 def FARJMP64 : RI<0xFF, MRM5m, (outs), (ins opaque80mem:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +0000121 "ljmp{q}\t{*}$dst", [], IIC_JMP_FAR_MEM>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000122
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000123 def FARJMP16m : I<0xFF, MRM5m, (outs), (ins opaque32mem:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +0000124 "ljmp{w}\t{*}$dst", [], IIC_JMP_FAR_MEM>, OpSize;
Chris Lattner87be16a2010-10-05 06:04:14 +0000125 def FARJMP32m : I<0xFF, MRM5m, (outs), (ins opaque48mem:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +0000126 "ljmp{l}\t{*}$dst", [], IIC_JMP_FAR_MEM>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000127}
128
129
130// Loop instructions
131
Andrew Trick922d3142012-02-01 23:20:51 +0000132def LOOP : Ii8PCRel<0xE2, RawFrm, (outs), (ins brtarget8:$dst), "loop\t$dst", [], IIC_LOOP>;
133def LOOPE : Ii8PCRel<0xE1, RawFrm, (outs), (ins brtarget8:$dst), "loope\t$dst", [], IIC_LOOPE>;
134def LOOPNE : Ii8PCRel<0xE0, RawFrm, (outs), (ins brtarget8:$dst), "loopne\t$dst", [], IIC_LOOPNE>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000135
136//===----------------------------------------------------------------------===//
137// Call Instructions...
138//
139let isCall = 1 in
140 // All calls clobber the non-callee saved registers. ESP is marked as
141 // a use to prevent stack-pointer assignments that appear immediately
142 // before calls from potentially appearing dead. Uses for argument
143 // registers are added manually.
144 let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
145 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
146 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
147 XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS],
148 Uses = [ESP] in {
149 def CALLpcrel32 : Ii32PCRel<0xE8, RawFrm,
150 (outs), (ins i32imm_pcrel:$dst,variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000151 "call{l}\t$dst", [], IIC_CALL_RI>, Requires<[In32BitMode]>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000152 def CALL32r : I<0xFF, MRM2r, (outs), (ins GR32:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000153 "call{l}\t{*}$dst", [(X86call GR32:$dst)], IIC_CALL_RI>,
Chris Lattner87be16a2010-10-05 06:04:14 +0000154 Requires<[In32BitMode]>;
155 def CALL32m : I<0xFF, MRM2m, (outs), (ins i32mem:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000156 "call{l}\t{*}$dst", [(X86call (loadi32 addr:$dst))], IIC_CALL_MEM>,
Chris Lattner87be16a2010-10-05 06:04:14 +0000157 Requires<[In32BitMode]>;
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000158
159 def FARCALL16i : Iseg16<0x9A, RawFrmImm16, (outs),
Chris Lattner87be16a2010-10-05 06:04:14 +0000160 (ins i16imm:$off, i16imm:$seg),
Andrew Trick922d3142012-02-01 23:20:51 +0000161 "lcall{w}\t{$seg, $off|$off, $seg}", [],
162 IIC_CALL_FAR_PTR>, OpSize;
Chris Lattner87be16a2010-10-05 06:04:14 +0000163 def FARCALL32i : Iseg32<0x9A, RawFrmImm16, (outs),
164 (ins i32imm:$off, i16imm:$seg),
Andrew Trick922d3142012-02-01 23:20:51 +0000165 "lcall{l}\t{$seg, $off|$off, $seg}", [],
166 IIC_CALL_FAR_PTR>;
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000167
Chris Lattner87be16a2010-10-05 06:04:14 +0000168 def FARCALL16m : I<0xFF, MRM3m, (outs), (ins opaque32mem:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +0000169 "lcall{w}\t{*}$dst", [], IIC_CALL_FAR_MEM>, OpSize;
Chris Lattner87be16a2010-10-05 06:04:14 +0000170 def FARCALL32m : I<0xFF, MRM3m, (outs), (ins opaque48mem:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +0000171 "lcall{l}\t{*}$dst", [], IIC_CALL_FAR_MEM>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000172
173 // callw for 16 bit code for the assembler.
174 let isAsmParserOnly = 1 in
175 def CALLpcrel16 : Ii16PCRel<0xE8, RawFrm,
176 (outs), (ins i16imm_pcrel:$dst, variable_ops),
177 "callw\t$dst", []>, OpSize;
178 }
179
180
181// Tail call stuff.
182
183let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
184 isCodeGenOnly = 1 in
185 let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
186 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
187 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
188 XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS],
189 Uses = [ESP] in {
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000190 def TCRETURNdi : PseudoI<(outs),
Eric Christopher6bac79d2010-11-30 21:37:36 +0000191 (ins i32imm_pcrel:$dst, i32imm:$offset, variable_ops), []>;
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000192 def TCRETURNri : PseudoI<(outs),
Eric Christopher6bac79d2010-11-30 21:37:36 +0000193 (ins GR32_TC:$dst, i32imm:$offset, variable_ops), []>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000194 let mayLoad = 1 in
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000195 def TCRETURNmi : PseudoI<(outs),
Eric Christopher6bac79d2010-11-30 21:37:36 +0000196 (ins i32mem_TC:$dst, i32imm:$offset, variable_ops), []>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000197
198 // FIXME: The should be pseudo instructions that are lowered when going to
199 // mcinst.
200 def TAILJMPd : Ii32PCRel<0xE9, RawFrm, (outs),
201 (ins i32imm_pcrel:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000202 "jmp\t$dst # TAILCALL",
203 [], IIC_JMP_REL>;
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000204 def TAILJMPr : I<0xFF, MRM4r, (outs), (ins GR32_TC:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000205 "", [], IIC_JMP_REG>; // FIXME: Remove encoding when JIT is dead.
Chris Lattner87be16a2010-10-05 06:04:14 +0000206 let mayLoad = 1 in
207 def TAILJMPm : I<0xFF, MRM4m, (outs), (ins i32mem_TC:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000208 "jmp{l}\t{*}$dst # TAILCALL", [], IIC_JMP_MEM>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000209}
210
211
212//===----------------------------------------------------------------------===//
213// Call Instructions...
214//
215let isCall = 1 in
216 // All calls clobber the non-callee saved registers. RSP is marked as
217 // a use to prevent stack-pointer assignments that appear immediately
218 // before calls from potentially appearing dead. Uses for argument
219 // registers are added manually.
220 let Defs = [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11,
221 FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0, ST1,
222 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
223 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
224 XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS],
225 Uses = [RSP] in {
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000226
Chris Lattner87be16a2010-10-05 06:04:14 +0000227 // NOTE: this pattern doesn't match "X86call imm", because we do not know
228 // that the offset between an arbitrary immediate and the call will fit in
229 // the 32-bit pcrel field that we have.
230 def CALL64pcrel32 : Ii32PCRel<0xE8, RawFrm,
231 (outs), (ins i64i32imm_pcrel:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000232 "call{q}\t$dst", [], IIC_CALL_RI>,
Chris Lattner87be16a2010-10-05 06:04:14 +0000233 Requires<[In64BitMode, NotWin64]>;
234 def CALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000235 "call{q}\t{*}$dst", [(X86call GR64:$dst)],
236 IIC_CALL_RI>,
Chris Lattner87be16a2010-10-05 06:04:14 +0000237 Requires<[In64BitMode, NotWin64]>;
238 def CALL64m : I<0xFF, MRM2m, (outs), (ins i64mem:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000239 "call{q}\t{*}$dst", [(X86call (loadi64 addr:$dst))],
240 IIC_CALL_MEM>,
Chris Lattner87be16a2010-10-05 06:04:14 +0000241 Requires<[In64BitMode, NotWin64]>;
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000242
Chris Lattner87be16a2010-10-05 06:04:14 +0000243 def FARCALL64 : RI<0xFF, MRM3m, (outs), (ins opaque80mem:$dst),
Andrew Trick922d3142012-02-01 23:20:51 +0000244 "lcall{q}\t{*}$dst", [], IIC_CALL_FAR_MEM>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000245 }
246
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000247 // FIXME: We need to teach codegen about single list of call-clobbered
Chris Lattner87be16a2010-10-05 06:04:14 +0000248 // registers.
249let isCall = 1, isCodeGenOnly = 1 in
250 // All calls clobber the non-callee saved registers. RSP is marked as
251 // a use to prevent stack-pointer assignments that appear immediately
252 // before calls from potentially appearing dead. Uses for argument
253 // registers are added manually.
254 let Defs = [RAX, RCX, RDX, R8, R9, R10, R11,
255 FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0, ST1,
256 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
Jakob Stoklund Olesen53fa56e2012-01-26 22:59:28 +0000257 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, YMM_HI_6_15, EFLAGS],
Chris Lattner87be16a2010-10-05 06:04:14 +0000258 Uses = [RSP] in {
259 def WINCALL64pcrel32 : Ii32PCRel<0xE8, RawFrm,
260 (outs), (ins i64i32imm_pcrel:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000261 "call{q}\t$dst", [], IIC_CALL_RI>,
Chris Lattner87be16a2010-10-05 06:04:14 +0000262 Requires<[IsWin64]>;
263 def WINCALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst, variable_ops),
264 "call{q}\t{*}$dst",
Andrew Trick922d3142012-02-01 23:20:51 +0000265 [(X86call GR64:$dst)], IIC_CALL_RI>,
266 Requires<[IsWin64]>;
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000267 def WINCALL64m : I<0xFF, MRM2m, (outs),
Eric Christopher6bac79d2010-11-30 21:37:36 +0000268 (ins i64mem:$dst,variable_ops),
Chris Lattner87be16a2010-10-05 06:04:14 +0000269 "call{q}\t{*}$dst",
Andrew Trick922d3142012-02-01 23:20:51 +0000270 [(X86call (loadi64 addr:$dst))], IIC_CALL_MEM>,
Chris Lattner87be16a2010-10-05 06:04:14 +0000271 Requires<[IsWin64]>;
272 }
273
NAKAMURA Takumia2e07622011-03-24 07:07:00 +0000274let isCall = 1, isCodeGenOnly = 1 in
275 // __chkstk(MSVC): clobber R10, R11 and EFLAGS.
276 // ___chkstk(Mingw64): clobber R10, R11, RAX and EFLAGS, and update RSP.
277 let Defs = [RAX, R10, R11, RSP, EFLAGS],
278 Uses = [RSP] in {
279 def W64ALLOCA : Ii32PCRel<0xE8, RawFrm,
280 (outs), (ins i64i32imm_pcrel:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000281 "call{q}\t$dst", [], IIC_CALL_RI>,
NAKAMURA Takumia2e07622011-03-24 07:07:00 +0000282 Requires<[IsWin64]>;
283 }
Chris Lattner87be16a2010-10-05 06:04:14 +0000284
285let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
286 isCodeGenOnly = 1 in
NAKAMURA Takumi7754f852011-01-26 02:04:09 +0000287 // AMD64 cc clobbers RSI, RDI, XMM6-XMM15.
288 let Defs = [RAX, RCX, RDX, R8, R9, R10, R11,
Chris Lattner87be16a2010-10-05 06:04:14 +0000289 FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0, ST1,
290 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
NAKAMURA Takumi7754f852011-01-26 02:04:09 +0000291 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, EFLAGS],
292 Uses = [RSP],
293 usesCustomInserter = 1 in {
Eric Christopher6bac79d2010-11-30 21:37:36 +0000294 def TCRETURNdi64 : PseudoI<(outs),
295 (ins i64i32imm_pcrel:$dst, i32imm:$offset, variable_ops),
296 []>;
297 def TCRETURNri64 : PseudoI<(outs),
NAKAMURA Takumi7754f852011-01-26 02:04:09 +0000298 (ins ptr_rc_tailcall:$dst, i32imm:$offset, variable_ops), []>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000299 let mayLoad = 1 in
NAKAMURA Takumie5fffe92011-01-26 02:03:37 +0000300 def TCRETURNmi64 : PseudoI<(outs),
Eric Christopher6bac79d2010-11-30 21:37:36 +0000301 (ins i64mem_TC:$dst, i32imm:$offset, variable_ops), []>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000302
303 def TAILJMPd64 : Ii32PCRel<0xE9, RawFrm, (outs),
304 (ins i64i32imm_pcrel:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000305 "jmp\t$dst # TAILCALL", [], IIC_JMP_REL>;
NAKAMURA Takumi7754f852011-01-26 02:04:09 +0000306 def TAILJMPr64 : I<0xFF, MRM4r, (outs), (ins ptr_rc_tailcall:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000307 "jmp{q}\t{*}$dst # TAILCALL", [], IIC_JMP_MEM>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000308
309 let mayLoad = 1 in
310 def TAILJMPm64 : I<0xFF, MRM4m, (outs), (ins i64mem_TC:$dst, variable_ops),
Andrew Trick922d3142012-02-01 23:20:51 +0000311 "jmp{q}\t{*}$dst # TAILCALL", [], IIC_JMP_MEM>;
Chris Lattner87be16a2010-10-05 06:04:14 +0000312}