blob: 9c7fcb0237f15e8cd801d4330ca41b5a6afe4c51 [file] [log] [blame]
Chris Lattner1cca5e32003-08-03 21:54:21 +00001//===- X86InstrInfo.td - Describe the X86 Instruction Set -------*- C++ -*-===//
John Criswell856ba762003-10-21 15:17:13 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattner1cca5e32003-08-03 21:54:21 +00009//
10// This file describes the X86 instruction set, defining the instructions, and
11// properties of the instructions which are needed for code generation, machine
12// code emission, and analysis.
13//
14//===----------------------------------------------------------------------===//
15
Evan Chengaed7c722005-12-17 01:24:02 +000016//===----------------------------------------------------------------------===//
17// X86 specific DAG Nodes.
18//
19
20def SDTX86CmpTest : SDTypeProfile<1, 2, [SDTCisVT<0, FlagVT>, SDTCisInt<1>,
21 SDTCisSameAs<1, 2>]>;
22
23def SDTX86Cmov : SDTypeProfile<1, 4,
24 [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>,
25 SDTCisVT<3, OtherVT>, SDTCisVT<4, FlagVT>]>;
26
Evan Cheng898101c2005-12-19 23:12:38 +000027def SDTX86BrCond : SDTypeProfile<0, 3,
28 [SDTCisVT<0, OtherVT>,
29 SDTCisVT<1, OtherVT>, SDTCisVT<2, FlagVT>]>;
Evan Chengaed7c722005-12-17 01:24:02 +000030
Evan Chengd5781fc2005-12-21 20:21:51 +000031def SDTX86SetCC : SDTypeProfile<1, 2,
32 [SDTCisVT<0, i8>, SDTCisVT<1, OtherVT>,
33 SDTCisVT<2, FlagVT>]>;
34
35def SDTX86RetFlag : SDTypeProfile<0, 2, [SDTCisVT<0, i16>,
36 SDTCisVT<1, FlagVT>]>;
Evan Cheng898101c2005-12-19 23:12:38 +000037
Evan Chengb077b842005-12-21 02:39:21 +000038def SDTX86Fld : SDTypeProfile<1, 2, [SDTCisFP<0>,
39 SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>]>;
40
41def SDTX86FpSet : SDTypeProfile<0, 1, [SDTCisFP<0>]>;
42
Evan Chengd5781fc2005-12-21 20:21:51 +000043def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest, []>;
44def X86test : SDNode<"X86ISD::TEST", SDTX86CmpTest, []>;
Evan Chengb077b842005-12-21 02:39:21 +000045
Evan Chengd5781fc2005-12-21 20:21:51 +000046def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov, []>;
47def X86Brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond, [SDNPHasChain]>;
48def X86SetCC : SDNode<"X86ISD::SETCC", SDTX86SetCC, []>;
Evan Chengb077b842005-12-21 02:39:21 +000049
Evan Chengd5781fc2005-12-21 20:21:51 +000050def X86retflag : SDNode<"X86ISD::RET_FLAG", SDTX86RetFlag, [SDNPHasChain]>;
Evan Chengb077b842005-12-21 02:39:21 +000051
Evan Chengd5781fc2005-12-21 20:21:51 +000052def X86fld : SDNode<"X86ISD::FLD", SDTX86Fld, [SDNPHasChain]>;
Evan Chengb077b842005-12-21 02:39:21 +000053
Evan Chengd5781fc2005-12-21 20:21:51 +000054def X86fpset : SDNode<"X86ISD::FP_SET_RESULT",
55 SDTX86FpSet, [SDNPHasChain]>;
Evan Chengaed7c722005-12-17 01:24:02 +000056
57//===----------------------------------------------------------------------===//
58// X86 Operand Definitions.
59//
60
Chris Lattner66fa1dc2004-08-11 02:25:00 +000061// *mem - Operand definitions for the funky X86 addressing mode operands.
62//
Chris Lattner45432512005-12-17 19:47:05 +000063class X86MemOperand<string printMethod> : Operand<i32> {
Nate Begeman391c5d22005-11-30 18:54:35 +000064 let PrintMethod = printMethod;
Chris Lattner6adaf792005-11-19 07:01:30 +000065 let NumMIOperands = 4;
66 let MIOperandInfo = (ops R32, i8imm, R32, i32imm);
Chris Lattner66fa1dc2004-08-11 02:25:00 +000067}
Nate Begeman391c5d22005-11-30 18:54:35 +000068
Chris Lattner45432512005-12-17 19:47:05 +000069def i8mem : X86MemOperand<"printi8mem">;
70def i16mem : X86MemOperand<"printi16mem">;
71def i32mem : X86MemOperand<"printi32mem">;
72def i64mem : X86MemOperand<"printi64mem">;
73def f32mem : X86MemOperand<"printf32mem">;
74def f64mem : X86MemOperand<"printf64mem">;
75def f80mem : X86MemOperand<"printf80mem">;
Nate Begeman391c5d22005-11-30 18:54:35 +000076
Nate Begeman16b04f32005-07-15 00:38:55 +000077def SSECC : Operand<i8> {
78 let PrintMethod = "printSSECC";
79}
Chris Lattner66fa1dc2004-08-11 02:25:00 +000080
Chris Lattnerf124d5e2005-11-18 01:04:42 +000081// A couple of more descriptive operand definitions.
82// 16-bits but only 8 bits are significant.
83def i16i8imm : Operand<i16>;
84// 32-bits but only 8 bits are significant.
85def i32i8imm : Operand<i32>;
86
Chris Lattnere4ead0c2004-08-11 06:59:12 +000087// PCRelative calls need special operand formatting.
88let PrintMethod = "printCallOperand" in
89 def calltarget : Operand<i32>;
90
Evan Chengd35b8c12005-12-04 08:19:43 +000091// Branch targets have OtherVT type.
92def brtarget : Operand<OtherVT>;
93
Evan Chengaed7c722005-12-17 01:24:02 +000094//===----------------------------------------------------------------------===//
95// X86 Complex Pattern Definitions.
96//
97
Evan Chengec693f72005-12-08 02:01:35 +000098// Define X86 specific addressing mode.
Evan Cheng670fd8f2005-12-08 02:15:07 +000099def addr : ComplexPattern<i32, 4, "SelectAddr", []>;
Evan Cheng502c5bb2005-12-15 08:31:04 +0000100def leaaddr : ComplexPattern<i32, 4, "SelectLEAAddr",
101 [add,
102 frameindex, constpool, globaladdr, externalsym]>;
Evan Chengec693f72005-12-08 02:01:35 +0000103
Evan Chengaed7c722005-12-17 01:24:02 +0000104//===----------------------------------------------------------------------===//
105// X86 Instruction Format Definitions.
106//
107
Chris Lattner1cca5e32003-08-03 21:54:21 +0000108// Format specifies the encoding used by the instruction. This is part of the
109// ad-hoc solution used to emit machine instruction encodings by our machine
110// code emitter.
111class Format<bits<5> val> {
112 bits<5> Value = val;
113}
114
115def Pseudo : Format<0>; def RawFrm : Format<1>;
116def AddRegFrm : Format<2>; def MRMDestReg : Format<3>;
117def MRMDestMem : Format<4>; def MRMSrcReg : Format<5>;
118def MRMSrcMem : Format<6>;
Alkis Evlogimenos169584e2004-02-27 18:55:12 +0000119def MRM0r : Format<16>; def MRM1r : Format<17>; def MRM2r : Format<18>;
120def MRM3r : Format<19>; def MRM4r : Format<20>; def MRM5r : Format<21>;
121def MRM6r : Format<22>; def MRM7r : Format<23>;
122def MRM0m : Format<24>; def MRM1m : Format<25>; def MRM2m : Format<26>;
123def MRM3m : Format<27>; def MRM4m : Format<28>; def MRM5m : Format<29>;
124def MRM6m : Format<30>; def MRM7m : Format<31>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000125
Evan Chengaed7c722005-12-17 01:24:02 +0000126//===----------------------------------------------------------------------===//
Evan Chengbbc8ddb2005-12-20 22:59:51 +0000127// X86 Instruction Predicate Definitions.
128def HasSSE1 : Predicate<"X86Vector >= SSE">;
129def HasSSE2 : Predicate<"X86Vector >= SSE2">;
130def HasSSE3 : Predicate<"X86Vector >= SSE3">;
131
132//===----------------------------------------------------------------------===//
Evan Chengaed7c722005-12-17 01:24:02 +0000133// X86 specific pattern fragments.
134//
135
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000136// ImmType - This specifies the immediate type used by an instruction. This is
Chris Lattner1cca5e32003-08-03 21:54:21 +0000137// part of the ad-hoc solution used to emit machine instruction encodings by our
138// machine code emitter.
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000139class ImmType<bits<2> val> {
140 bits<2> Value = val;
141}
142def NoImm : ImmType<0>;
143def Imm8 : ImmType<1>;
144def Imm16 : ImmType<2>;
145def Imm32 : ImmType<3>;
146
Chris Lattner1cca5e32003-08-03 21:54:21 +0000147// FPFormat - This specifies what form this FP instruction has. This is used by
148// the Floating-Point stackifier pass.
149class FPFormat<bits<3> val> {
150 bits<3> Value = val;
151}
152def NotFP : FPFormat<0>;
153def ZeroArgFP : FPFormat<1>;
154def OneArgFP : FPFormat<2>;
155def OneArgFPRW : FPFormat<3>;
156def TwoArgFP : FPFormat<4>;
Chris Lattnerab8decc2004-06-11 04:41:24 +0000157def CompareFP : FPFormat<5>;
158def CondMovFP : FPFormat<6>;
159def SpecialFP : FPFormat<7>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000160
161
Chris Lattner3a173df2004-10-03 20:35:00 +0000162class X86Inst<bits<8> opcod, Format f, ImmType i, dag ops, string AsmStr>
163 : Instruction {
Chris Lattnerc8f45872003-08-04 04:59:56 +0000164 let Namespace = "X86";
Chris Lattner1cca5e32003-08-03 21:54:21 +0000165
Chris Lattner1cca5e32003-08-03 21:54:21 +0000166 bits<8> Opcode = opcod;
167 Format Form = f;
168 bits<5> FormBits = Form.Value;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000169 ImmType ImmT = i;
170 bits<2> ImmTypeBits = ImmT.Value;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000171
Chris Lattnerc96bb812004-08-11 07:12:04 +0000172 dag OperandList = ops;
173 string AsmString = AsmStr;
174
John Criswell4ffff9e2004-04-08 20:31:47 +0000175 //
Chris Lattner1cca5e32003-08-03 21:54:21 +0000176 // Attributes specific to X86 instructions...
John Criswell4ffff9e2004-04-08 20:31:47 +0000177 //
Chris Lattner1cca5e32003-08-03 21:54:21 +0000178 bit hasOpSizePrefix = 0; // Does this inst have a 0x66 prefix?
John Criswell4ffff9e2004-04-08 20:31:47 +0000179
Chris Lattner1cca5e32003-08-03 21:54:21 +0000180 bits<4> Prefix = 0; // Which prefix byte does this inst have?
181 FPFormat FPForm; // What flavor of FP instruction is this?
182 bits<3> FPFormBits = 0;
183}
184
185class Imp<list<Register> uses, list<Register> defs> {
186 list<Register> Uses = uses;
187 list<Register> Defs = defs;
188}
189
190
191// Prefix byte classes which are used to indicate to the ad-hoc machine code
192// emitter that various prefix bytes are required.
193class OpSize { bit hasOpSizePrefix = 1; }
194class TB { bits<4> Prefix = 1; }
Chris Lattner915e5e52004-02-12 17:53:22 +0000195class REP { bits<4> Prefix = 2; }
196class D8 { bits<4> Prefix = 3; }
197class D9 { bits<4> Prefix = 4; }
198class DA { bits<4> Prefix = 5; }
199class DB { bits<4> Prefix = 6; }
200class DC { bits<4> Prefix = 7; }
201class DD { bits<4> Prefix = 8; }
202class DE { bits<4> Prefix = 9; }
203class DF { bits<4> Prefix = 10; }
Nate Begemanf1702ac2005-06-27 21:20:31 +0000204class XD { bits<4> Prefix = 11; }
205class XS { bits<4> Prefix = 12; }
Chris Lattner1cca5e32003-08-03 21:54:21 +0000206
207
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000208//===----------------------------------------------------------------------===//
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000209// Pattern fragments...
210//
Evan Cheng9b6b6422005-12-13 00:14:11 +0000211def i16immSExt8 : PatLeaf<(i16 imm), [{
212 // i16immSExt8 predicate - True if the 16-bit immediate fits in a 8-bit
Evan Chengb3558542005-12-13 00:01:09 +0000213 // sign extended field.
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000214 return (int)N->getValue() == (signed char)N->getValue();
215}]>;
216
Evan Cheng9b6b6422005-12-13 00:14:11 +0000217def i32immSExt8 : PatLeaf<(i32 imm), [{
218 // i32immSExt8 predicate - True if the 32-bit immediate fits in a 8-bit
Evan Chengb3558542005-12-13 00:01:09 +0000219 // sign extended field.
220 return (int)N->getValue() == (signed char)N->getValue();
221}]>;
222
Evan Cheng9b6b6422005-12-13 00:14:11 +0000223def i16immZExt8 : PatLeaf<(i16 imm), [{
224 // i16immZExt8 predicate - True if the 16-bit immediate fits in a 8-bit zero
Evan Chengb3558542005-12-13 00:01:09 +0000225 // extended field.
Chris Lattner3d36a9f2005-12-05 02:40:25 +0000226 return (unsigned)N->getValue() == (unsigned char)N->getValue();
227}]>;
228
Evan Cheng605c4152005-12-13 01:57:51 +0000229// Helper fragments for loads.
Evan Cheng7a7e8372005-12-14 02:22:27 +0000230def loadi8 : PatFrag<(ops node:$ptr), (i8 (load node:$ptr))>;
231def loadi16 : PatFrag<(ops node:$ptr), (i16 (load node:$ptr))>;
232def loadi32 : PatFrag<(ops node:$ptr), (i32 (load node:$ptr))>;
Evan Chengbbc8ddb2005-12-20 22:59:51 +0000233def loadf32 : PatFrag<(ops node:$ptr), (f32 (load node:$ptr))>;
234def loadf64 : PatFrag<(ops node:$ptr), (f64 (load node:$ptr))>;
Evan Cheng7a7e8372005-12-14 02:22:27 +0000235
236def sextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (sextload node:$ptr, i1))>;
237def sextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i1))>;
238def sextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (sextload node:$ptr, i8))>;
239def sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i8))>;
240def sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i16))>;
241
242def zextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (zextload node:$ptr, i1))>;
243def zextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i1))>;
244def zextloadi16i8 : PatFrag<(ops node:$ptr), (i16 (zextload node:$ptr, i8))>;
245def zextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i8))>;
246def zextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (zextload node:$ptr, i16))>;
247
Evan Chengcb17bac2005-12-15 19:49:23 +0000248def extloadi8i1 : PatFrag<(ops node:$ptr), (i8 (extload node:$ptr, i1))>;
249
Evan Cheng605c4152005-12-13 01:57:51 +0000250
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000251//===----------------------------------------------------------------------===//
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000252// Instruction templates...
253
Evan Chengf0701842005-11-29 19:38:52 +0000254class I<bits<8> o, Format f, dag ops, string asm, list<dag> pattern>
255 : X86Inst<o, f, NoImm, ops, asm> {
256 let Pattern = pattern;
257}
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000258class Ii8 <bits<8> o, Format f, dag ops, string asm, list<dag> pattern>
259 : X86Inst<o, f, Imm8 , ops, asm> {
260 let Pattern = pattern;
261}
Chris Lattner78432fe2005-11-17 02:01:55 +0000262class Ii16<bits<8> o, Format f, dag ops, string asm, list<dag> pattern>
263 : X86Inst<o, f, Imm16, ops, asm> {
264 let Pattern = pattern;
265}
Chris Lattner7a125372005-11-16 22:59:19 +0000266class Ii32<bits<8> o, Format f, dag ops, string asm, list<dag> pattern>
267 : X86Inst<o, f, Imm32, ops, asm> {
268 let Pattern = pattern;
269}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000270
Chris Lattner1cca5e32003-08-03 21:54:21 +0000271//===----------------------------------------------------------------------===//
272// Instruction list...
273//
274
Evan Chengf0701842005-11-29 19:38:52 +0000275def PHI : I<0, Pseudo, (ops variable_ops), "PHINODE", []>; // PHI node.
276def NOOP : I<0x90, RawFrm, (ops), "nop", []>; // nop
Chris Lattner1cca5e32003-08-03 21:54:21 +0000277
Evan Chengf0701842005-11-29 19:38:52 +0000278def ADJCALLSTACKDOWN : I<0, Pseudo, (ops i32imm:$amt), "#ADJCALLSTACKDOWN", []>;
Chris Lattner43ef1312005-09-14 21:10:24 +0000279def ADJCALLSTACKUP : I<0, Pseudo, (ops i32imm:$amt1, i32imm:$amt2),
Evan Chengf0701842005-11-29 19:38:52 +0000280 "#ADJCALLSTACKUP", []>;
281def IMPLICIT_USE : I<0, Pseudo, (ops variable_ops), "#IMPLICIT_USE", []>;
282def IMPLICIT_DEF : I<0, Pseudo, (ops variable_ops), "#IMPLICIT_DEF", []>;
Alkis Evlogimenose0bb3e72003-12-20 16:22:59 +0000283let isTerminator = 1 in
284 let Defs = [FP0, FP1, FP2, FP3, FP4, FP5, FP6] in
Evan Chengf0701842005-11-29 19:38:52 +0000285 def FP_REG_KILL : I<0, Pseudo, (ops), "#FP_REG_KILL", []>;
Chris Lattner62cce392004-07-31 02:10:53 +0000286
Chris Lattner1cca5e32003-08-03 21:54:21 +0000287//===----------------------------------------------------------------------===//
288// Control Flow Instructions...
289//
290
Chris Lattner1be48112005-05-13 17:56:48 +0000291// Return instructions.
Evan Chengd5781fc2005-12-21 20:21:51 +0000292let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in
293 def RET : I<0xC3, RawFrm, (ops), "ret", []>;
294let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in
Chris Lattner78432fe2005-11-17 02:01:55 +0000295 def RETI : Ii16<0xC2, RawFrm, (ops i16imm:$amt), "ret $amt", []>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000296
Evan Chengd5781fc2005-12-21 20:21:51 +0000297def : Pat<(X86retflag 0, FLAG), (RET)>;
298def : Pat<(X86retflag imm:$amt, FLAG), (RETI imm:$amt)>;
Evan Chengb077b842005-12-21 02:39:21 +0000299
Chris Lattner1cca5e32003-08-03 21:54:21 +0000300// All branches are RawFrm, Void, Branch, and Terminators
Evan Cheng8d202232005-12-05 23:09:43 +0000301let isBranch = 1, isTerminator = 1 in
Evan Chengd35b8c12005-12-04 08:19:43 +0000302 class IBr<bits<8> opcode, dag ops, string asm, list<dag> pattern> :
303 I<opcode, RawFrm, ops, asm, pattern>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000304
Chris Lattner62cce392004-07-31 02:10:53 +0000305let isBarrier = 1 in
Evan Chengd35b8c12005-12-04 08:19:43 +0000306 def JMP : IBr<0xE9, (ops brtarget:$dst), "jmp $dst", [(br bb:$dst)]>;
Evan Cheng898101c2005-12-19 23:12:38 +0000307
308def JE : IBr<0x84, (ops brtarget:$dst), "je $dst",
309 [(X86Brcond bb:$dst, SETEQ, STATUS)]>, Imp<[STATUS],[]>, TB;
310def JNE : IBr<0x85, (ops brtarget:$dst), "jne $dst",
311 [(X86Brcond bb:$dst, SETNE, STATUS)]>, Imp<[STATUS],[]>, TB;
312def JL : IBr<0x8C, (ops brtarget:$dst), "jl $dst",
313 [(X86Brcond bb:$dst, SETLT, STATUS)]>, Imp<[STATUS],[]>, TB;
314def JLE : IBr<0x8E, (ops brtarget:$dst), "jle $dst",
315 [(X86Brcond bb:$dst, SETLE, STATUS)]>, Imp<[STATUS],[]>, TB;
316def JG : IBr<0x8F, (ops brtarget:$dst), "jg $dst",
317 [(X86Brcond bb:$dst, SETGT, STATUS)]>, Imp<[STATUS],[]>, TB;
318def JGE : IBr<0x8D, (ops brtarget:$dst), "jge $dst",
319 [(X86Brcond bb:$dst, SETGE, STATUS)]>, Imp<[STATUS],[]>, TB;
320
Evan Chengd35b8c12005-12-04 08:19:43 +0000321def JB : IBr<0x82, (ops brtarget:$dst), "jb $dst",
Evan Cheng898101c2005-12-19 23:12:38 +0000322 [(X86Brcond bb:$dst, SETULT, STATUS)]>, Imp<[STATUS],[]>, TB;
323def JBE : IBr<0x86, (ops brtarget:$dst), "jbe $dst",
324 [(X86Brcond bb:$dst, SETULE, STATUS)]>, Imp<[STATUS],[]>, TB;
325def JA : IBr<0x87, (ops brtarget:$dst), "ja $dst",
326 [(X86Brcond bb:$dst, SETUGT, STATUS)]>, Imp<[STATUS],[]>, TB;
327def JAE : IBr<0x83, (ops brtarget:$dst), "jae $dst",
328 [(X86Brcond bb:$dst, SETUGE, STATUS)]>, Imp<[STATUS],[]>, TB;
329
Evan Chengd35b8c12005-12-04 08:19:43 +0000330def JS : IBr<0x88, (ops brtarget:$dst), "js $dst", []>, TB;
331def JNS : IBr<0x89, (ops brtarget:$dst), "jns $dst", []>, TB;
332def JP : IBr<0x8A, (ops brtarget:$dst), "jp $dst", []>, TB;
333def JNP : IBr<0x8B, (ops brtarget:$dst), "jnp $dst", []>, TB;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000334
335//===----------------------------------------------------------------------===//
336// Call Instructions...
337//
Chris Lattnerc8f45872003-08-04 04:59:56 +0000338let isCall = 1 in
Chris Lattner1cca5e32003-08-03 21:54:21 +0000339 // All calls clobber the non-callee saved registers...
Nate Begemanf63be7d2005-07-06 18:59:04 +0000340 let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
Nate Begeman16b04f32005-07-15 00:38:55 +0000341 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7] in {
Evan Chengf0701842005-11-29 19:38:52 +0000342 def CALLpcrel32 : I<0xE8, RawFrm, (ops calltarget:$dst), "call $dst", []>;
343 def CALL32r : I<0xFF, MRM2r, (ops R32:$dst), "call {*}$dst", []>;
344 def CALL32m : I<0xFF, MRM2m, (ops i32mem:$dst), "call {*}$dst", []>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000345 }
346
Chris Lattner1e9448b2005-05-15 03:10:37 +0000347// Tail call stuff.
Chris Lattner2b3d56e2005-05-14 23:35:21 +0000348let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengd35b8c12005-12-04 08:19:43 +0000349 def TAILJMPd : IBr<0xE9, (ops calltarget:$dst), "jmp $dst # TAIL CALL", []>;
Chris Lattner2b3d56e2005-05-14 23:35:21 +0000350let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengf0701842005-11-29 19:38:52 +0000351 def TAILJMPr : I<0xFF, MRM4r, (ops R32:$dst), "jmp {*}$dst # TAIL CALL", []>;
Chris Lattner2b3d56e2005-05-14 23:35:21 +0000352let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in
Evan Chengf0701842005-11-29 19:38:52 +0000353 def TAILJMPm : I<0xFF, MRM4m, (ops i32mem:$dst),
354 "jmp {*}$dst # TAIL CALL", []>;
Chris Lattner1e9448b2005-05-15 03:10:37 +0000355
356// ADJSTACKPTRri - This is a standard ADD32ri instruction, identical in every
357// way, except that it is marked as being a terminator. This causes the epilog
358// inserter to insert reloads of callee saved registers BEFORE this. We need
359// this until we have a more accurate way of tracking where the stack pointer is
360// within a function.
361let isTerminator = 1, isTwoAddress = 1 in
362 def ADJSTACKPTRri : Ii32<0x81, MRM0r, (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +0000363 "add{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner1e9448b2005-05-15 03:10:37 +0000364
Chris Lattner1cca5e32003-08-03 21:54:21 +0000365//===----------------------------------------------------------------------===//
366// Miscellaneous Instructions...
367//
Chris Lattner30bf2d82004-08-10 20:17:41 +0000368def LEAVE : I<0xC9, RawFrm,
Evan Chengf0701842005-11-29 19:38:52 +0000369 (ops), "leave", []>, Imp<[EBP,ESP],[EBP,ESP]>;
Chris Lattner30bf2d82004-08-10 20:17:41 +0000370def POP32r : I<0x58, AddRegFrm,
Evan Chengf0701842005-11-29 19:38:52 +0000371 (ops R32:$reg), "pop{l} $reg", []>, Imp<[ESP],[ESP]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000372
Chris Lattner3a173df2004-10-03 20:35:00 +0000373let isTwoAddress = 1 in // R32 = bswap R32
Chris Lattner30bf2d82004-08-10 20:17:41 +0000374 def BSWAP32r : I<0xC8, AddRegFrm,
Evan Chengf0701842005-11-29 19:38:52 +0000375 (ops R32:$dst, R32:$src), "bswap{l} $dst", []>, TB;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000376
Chris Lattner30bf2d82004-08-10 20:17:41 +0000377def XCHG8rr : I<0x86, MRMDestReg, // xchg R8, R8
Chris Lattner3a173df2004-10-03 20:35:00 +0000378 (ops R8:$src1, R8:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000379 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
Chris Lattner30bf2d82004-08-10 20:17:41 +0000380def XCHG16rr : I<0x87, MRMDestReg, // xchg R16, R16
Chris Lattner3a173df2004-10-03 20:35:00 +0000381 (ops R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000382 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
Chris Lattner30bf2d82004-08-10 20:17:41 +0000383def XCHG32rr : I<0x87, MRMDestReg, // xchg R32, R32
Chris Lattner3a173df2004-10-03 20:35:00 +0000384 (ops R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000385 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
Chris Lattnerfc752712004-08-01 09:52:59 +0000386
Chris Lattner3a173df2004-10-03 20:35:00 +0000387def XCHG8mr : I<0x86, MRMDestMem,
388 (ops i8mem:$src1, R8:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000389 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000390def XCHG16mr : I<0x87, MRMDestMem,
391 (ops i16mem:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000392 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000393def XCHG32mr : I<0x87, MRMDestMem,
394 (ops i32mem:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000395 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000396def XCHG8rm : I<0x86, MRMSrcMem,
397 (ops R8:$src1, i8mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000398 "xchg{b} {$src2|$src1}, {$src1|$src2}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000399def XCHG16rm : I<0x87, MRMSrcMem,
400 (ops R16:$src1, i16mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000401 "xchg{w} {$src2|$src1}, {$src1|$src2}", []>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000402def XCHG32rm : I<0x87, MRMSrcMem,
403 (ops R32:$src1, i32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000404 "xchg{l} {$src2|$src1}, {$src1|$src2}", []>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000405
Chris Lattner3a173df2004-10-03 20:35:00 +0000406def LEA16r : I<0x8D, MRMSrcMem,
407 (ops R16:$dst, i32mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +0000408 "lea{w} {$src|$dst}, {$dst|$src}", []>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000409def LEA32r : I<0x8D, MRMSrcMem,
410 (ops R32:$dst, i32mem:$src),
Evan Chengec693f72005-12-08 02:01:35 +0000411 "lea{l} {$src|$dst}, {$dst|$src}",
412 [(set R32:$dst, leaaddr:$src)]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000413
Evan Chengf0701842005-11-29 19:38:52 +0000414def REP_MOVSB : I<0xA4, RawFrm, (ops), "{rep;movsb|rep movsb}", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000415 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP;
Evan Chengf0701842005-11-29 19:38:52 +0000416def REP_MOVSW : I<0xA5, RawFrm, (ops), "{rep;movsw|rep movsw}", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000417 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP, OpSize;
Evan Chengf0701842005-11-29 19:38:52 +0000418def REP_MOVSD : I<0xA5, RawFrm, (ops), "{rep;movsd|rep movsd}", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000419 Imp<[ECX,EDI,ESI], [ECX,EDI,ESI]>, REP;
Chris Lattner915e5e52004-02-12 17:53:22 +0000420
Evan Chengf0701842005-11-29 19:38:52 +0000421def REP_STOSB : I<0xAA, RawFrm, (ops), "{rep;stosb|rep stosb}", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000422 Imp<[AL,ECX,EDI], [ECX,EDI]>, REP;
Evan Chengf0701842005-11-29 19:38:52 +0000423def REP_STOSW : I<0xAB, RawFrm, (ops), "{rep;stosw|rep stosw}", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000424 Imp<[AX,ECX,EDI], [ECX,EDI]>, REP, OpSize;
Evan Chengf0701842005-11-29 19:38:52 +0000425def REP_STOSD : I<0xAB, RawFrm, (ops), "{rep;stosl|rep stosd}", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000426 Imp<[EAX,ECX,EDI], [ECX,EDI]>, REP;
427
Chris Lattnerb89abef2004-02-14 04:45:37 +0000428
Chris Lattner1cca5e32003-08-03 21:54:21 +0000429//===----------------------------------------------------------------------===//
John Criswell4ffff9e2004-04-08 20:31:47 +0000430// Input/Output Instructions...
431//
Chris Lattner30bf2d82004-08-10 20:17:41 +0000432def IN8rr : I<0xEC, RawFrm, (ops),
Evan Chenga5386b02005-12-20 07:38:38 +0000433 "in{b} {%dx, %al|%AL, %DX}",
434 [(set AL, (readport DX))]>, Imp<[DX], [AL]>;
Chris Lattner30bf2d82004-08-10 20:17:41 +0000435def IN16rr : I<0xED, RawFrm, (ops),
Evan Chenga5386b02005-12-20 07:38:38 +0000436 "in{w} {%dx, %ax|%AX, %DX}",
437 [(set AX, (readport DX))]>, Imp<[DX], [AX]>, OpSize;
Chris Lattner30bf2d82004-08-10 20:17:41 +0000438def IN32rr : I<0xED, RawFrm, (ops),
Evan Chenga5386b02005-12-20 07:38:38 +0000439 "in{l} {%dx, %eax|%EAX, %DX}",
440 [(set EAX, (readport DX))]>, Imp<[DX],[EAX]>;
John Criswell4ffff9e2004-04-08 20:31:47 +0000441
Evan Chenga5386b02005-12-20 07:38:38 +0000442def IN8ri : Ii8<0xE4, RawFrm, (ops i16i8imm:$port),
443 "in{b} {$port, %al|%AL, $port}",
444 [(set AL, (readport i16immZExt8:$port))]>,
445 Imp<[], [AL]>;
446def IN16ri : Ii8<0xE5, RawFrm, (ops i16i8imm:$port),
447 "in{w} {$port, %ax|%AX, $port}",
448 [(set AX, (readport i16immZExt8:$port))]>,
449 Imp<[], [AX]>, OpSize;
450def IN32ri : Ii8<0xE5, RawFrm, (ops i16i8imm:$port),
451 "in{l} {$port, %eax|%EAX, $port}",
452 [(set EAX, (readport i16immZExt8:$port))]>,
453 Imp<[],[EAX]>;
Chris Lattner440bbc22004-04-13 17:19:31 +0000454
Evan Cheng8d202232005-12-05 23:09:43 +0000455def OUT8rr : I<0xEE, RawFrm, (ops),
456 "out{b} {%al, %dx|%DX, %AL}",
457 [(writeport AL, DX)]>, Imp<[DX, AL], []>;
458def OUT16rr : I<0xEF, RawFrm, (ops),
459 "out{w} {%ax, %dx|%DX, %AX}",
460 [(writeport AX, DX)]>, Imp<[DX, AX], []>, OpSize;
461def OUT32rr : I<0xEF, RawFrm, (ops),
462 "out{l} {%eax, %dx|%DX, %EAX}",
463 [(writeport EAX, DX)]>, Imp<[DX, EAX], []>;
Chris Lattnerffff7082004-08-01 07:44:35 +0000464
Evan Cheng8d202232005-12-05 23:09:43 +0000465def OUT8ir : Ii8<0xE6, RawFrm, (ops i16i8imm:$port),
466 "out{b} {%al, $port|$port, %AL}",
Evan Cheng5a38e022005-12-13 00:25:07 +0000467 [(writeport AL, i16immZExt8:$port)]>,
Evan Chenga5386b02005-12-20 07:38:38 +0000468 Imp<[AL], []>;
Evan Cheng8d202232005-12-05 23:09:43 +0000469def OUT16ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port),
470 "out{w} {%ax, $port|$port, %AX}",
Evan Cheng5a38e022005-12-13 00:25:07 +0000471 [(writeport AX, i16immZExt8:$port)]>,
Evan Chenga5386b02005-12-20 07:38:38 +0000472 Imp<[AX], []>, OpSize;
Evan Cheng8d202232005-12-05 23:09:43 +0000473def OUT32ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port),
474 "out{l} {%eax, $port|$port, %EAX}",
Evan Cheng5a38e022005-12-13 00:25:07 +0000475 [(writeport EAX, i16immZExt8:$port)]>,
Evan Chenga5386b02005-12-20 07:38:38 +0000476 Imp<[EAX], []>;
John Criswell4ffff9e2004-04-08 20:31:47 +0000477
478//===----------------------------------------------------------------------===//
Chris Lattner1cca5e32003-08-03 21:54:21 +0000479// Move Instructions...
480//
Chris Lattner3a173df2004-10-03 20:35:00 +0000481def MOV8rr : I<0x88, MRMDestReg, (ops R8 :$dst, R8 :$src),
Evan Chengf0701842005-11-29 19:38:52 +0000482 "mov{b} {$src, $dst|$dst, $src}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000483def MOV16rr : I<0x89, MRMDestReg, (ops R16:$dst, R16:$src),
Evan Chengf0701842005-11-29 19:38:52 +0000484 "mov{w} {$src, $dst|$dst, $src}", []>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000485def MOV32rr : I<0x89, MRMDestReg, (ops R32:$dst, R32:$src),
Evan Chengf0701842005-11-29 19:38:52 +0000486 "mov{l} {$src, $dst|$dst, $src}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000487def MOV8ri : Ii8 <0xB0, AddRegFrm, (ops R8 :$dst, i8imm :$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000488 "mov{b} {$src, $dst|$dst, $src}",
489 [(set R8:$dst, imm:$src)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000490def MOV16ri : Ii16<0xB8, AddRegFrm, (ops R16:$dst, i16imm:$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000491 "mov{w} {$src, $dst|$dst, $src}",
492 [(set R16:$dst, imm:$src)]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000493def MOV32ri : Ii32<0xB8, AddRegFrm, (ops R32:$dst, i32imm:$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +0000494 "mov{l} {$src, $dst|$dst, $src}",
495 [(set R32:$dst, imm:$src)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000496def MOV8mi : Ii8 <0xC6, MRM0m, (ops i8mem :$dst, i8imm :$src),
Evan Chengb51a0592005-12-10 00:48:20 +0000497 "mov{b} {$src, $dst|$dst, $src}",
498 [(store (i8 imm:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000499def MOV16mi : Ii16<0xC7, MRM0m, (ops i16mem:$dst, i16imm:$src),
Evan Chengb51a0592005-12-10 00:48:20 +0000500 "mov{w} {$src, $dst|$dst, $src}",
501 [(store (i16 imm:$src), addr:$dst)]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000502def MOV32mi : Ii32<0xC7, MRM0m, (ops i32mem:$dst, i32imm:$src),
Evan Chengb51a0592005-12-10 00:48:20 +0000503 "mov{l} {$src, $dst|$dst, $src}",
504 [(store (i32 imm:$src), addr:$dst)]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000505
Chris Lattner3a173df2004-10-03 20:35:00 +0000506def MOV8rm : I<0x8A, MRMSrcMem, (ops R8 :$dst, i8mem :$src),
Evan Chengec693f72005-12-08 02:01:35 +0000507 "mov{b} {$src, $dst|$dst, $src}",
508 [(set R8:$dst, (load addr:$src))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000509def MOV16rm : I<0x8B, MRMSrcMem, (ops R16:$dst, i16mem:$src),
Evan Chengec693f72005-12-08 02:01:35 +0000510 "mov{w} {$src, $dst|$dst, $src}",
511 [(set R16:$dst, (load addr:$src))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000512def MOV32rm : I<0x8B, MRMSrcMem, (ops R32:$dst, i32mem:$src),
Evan Chengec693f72005-12-08 02:01:35 +0000513 "mov{l} {$src, $dst|$dst, $src}",
514 [(set R32:$dst, (load addr:$src))]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000515
Chris Lattner3a173df2004-10-03 20:35:00 +0000516def MOV8mr : I<0x88, MRMDestMem, (ops i8mem :$dst, R8 :$src),
Evan Chengb51a0592005-12-10 00:48:20 +0000517 "mov{b} {$src, $dst|$dst, $src}",
518 [(store R8:$src, addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000519def MOV16mr : I<0x89, MRMDestMem, (ops i16mem:$dst, R16:$src),
Evan Chengb51a0592005-12-10 00:48:20 +0000520 "mov{w} {$src, $dst|$dst, $src}",
521 [(store R16:$src, addr:$dst)]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000522def MOV32mr : I<0x89, MRMDestMem, (ops i32mem:$dst, R32:$src),
Evan Chengb51a0592005-12-10 00:48:20 +0000523 "mov{l} {$src, $dst|$dst, $src}",
524 [(store R32:$src, addr:$dst)]>;
Nate Begemanf1702ac2005-06-27 21:20:31 +0000525
Chris Lattner1cca5e32003-08-03 21:54:21 +0000526//===----------------------------------------------------------------------===//
527// Fixed-Register Multiplication and Division Instructions...
528//
Chris Lattner1cca5e32003-08-03 21:54:21 +0000529
Chris Lattnerc8f45872003-08-04 04:59:56 +0000530// Extra precision multiplication
Evan Chengf0701842005-11-29 19:38:52 +0000531def MUL8r : I<0xF6, MRM4r, (ops R8:$src), "mul{b} $src", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000532 Imp<[AL],[AX]>; // AL,AH = AL*R8
Evan Chengf0701842005-11-29 19:38:52 +0000533def MUL16r : I<0xF7, MRM4r, (ops R16:$src), "mul{w} $src", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000534 Imp<[AX],[AX,DX]>, OpSize; // AX,DX = AX*R16
Evan Chengf0701842005-11-29 19:38:52 +0000535def MUL32r : I<0xF7, MRM4r, (ops R32:$src), "mul{l} $src", []>,
Chris Lattner30bf2d82004-08-10 20:17:41 +0000536 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*R32
Chris Lattner57a02302004-08-11 04:31:00 +0000537def MUL8m : I<0xF6, MRM4m, (ops i8mem :$src),
Evan Chengf0701842005-11-29 19:38:52 +0000538 "mul{b} $src", []>, Imp<[AL],[AX]>; // AL,AH = AL*[mem8]
Chris Lattner57a02302004-08-11 04:31:00 +0000539def MUL16m : I<0xF7, MRM4m, (ops i16mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +0000540 "mul{w} $src", []>, Imp<[AX],[AX,DX]>,
541 OpSize; // AX,DX = AX*[mem16]
Chris Lattner57a02302004-08-11 04:31:00 +0000542def MUL32m : I<0xF7, MRM4m, (ops i32mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +0000543 "mul{l} $src", []>, Imp<[EAX],[EAX,EDX]>;// EAX,EDX = EAX*[mem32]
Chris Lattner1cca5e32003-08-03 21:54:21 +0000544
Evan Chengf0701842005-11-29 19:38:52 +0000545def IMUL8r : I<0xF6, MRM5r, (ops R8:$src), "imul{b} $src", []>,
Chris Lattner1e6a7152005-04-06 04:19:22 +0000546 Imp<[AL],[AX]>; // AL,AH = AL*R8
Evan Chengf0701842005-11-29 19:38:52 +0000547def IMUL16r : I<0xF7, MRM5r, (ops R16:$src), "imul{w} $src", []>,
Chris Lattner1e6a7152005-04-06 04:19:22 +0000548 Imp<[AX],[AX,DX]>, OpSize; // AX,DX = AX*R16
Evan Chengf0701842005-11-29 19:38:52 +0000549def IMUL32r : I<0xF7, MRM5r, (ops R32:$src), "imul{l} $src", []>,
Chris Lattner1e6a7152005-04-06 04:19:22 +0000550 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*R32
551def IMUL8m : I<0xF6, MRM5m, (ops i8mem :$src),
Evan Chengf0701842005-11-29 19:38:52 +0000552 "imul{b} $src", []>, Imp<[AL],[AX]>; // AL,AH = AL*[mem8]
Chris Lattner1e6a7152005-04-06 04:19:22 +0000553def IMUL16m : I<0xF7, MRM5m, (ops i16mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +0000554 "imul{w} $src", []>, Imp<[AX],[AX,DX]>,
555 OpSize; // AX,DX = AX*[mem16]
Chris Lattner1e6a7152005-04-06 04:19:22 +0000556def IMUL32m : I<0xF7, MRM5m, (ops i32mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +0000557 "imul{l} $src", []>,
558 Imp<[EAX],[EAX,EDX]>; // EAX,EDX = EAX*[mem32]
Chris Lattner1e6a7152005-04-06 04:19:22 +0000559
Chris Lattnerc8f45872003-08-04 04:59:56 +0000560// unsigned division/remainder
Chris Lattner3a173df2004-10-03 20:35:00 +0000561def DIV8r : I<0xF6, MRM6r, (ops R8:$src), // AX/r8 = AL,AH
Evan Chengf0701842005-11-29 19:38:52 +0000562 "div{b} $src", []>, Imp<[AX],[AX]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000563def DIV16r : I<0xF7, MRM6r, (ops R16:$src), // DX:AX/r16 = AX,DX
Evan Chengf0701842005-11-29 19:38:52 +0000564 "div{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000565def DIV32r : I<0xF7, MRM6r, (ops R32:$src), // EDX:EAX/r32 = EAX,EDX
Evan Chengf0701842005-11-29 19:38:52 +0000566 "div{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000567def DIV8m : I<0xF6, MRM6m, (ops i8mem:$src), // AX/[mem8] = AL,AH
Evan Chengf0701842005-11-29 19:38:52 +0000568 "div{b} $src", []>, Imp<[AX],[AX]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000569def DIV16m : I<0xF7, MRM6m, (ops i16mem:$src), // DX:AX/[mem16] = AX,DX
Evan Chengf0701842005-11-29 19:38:52 +0000570 "div{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000571def DIV32m : I<0xF7, MRM6m, (ops i32mem:$src), // EDX:EAX/[mem32] = EAX,EDX
Evan Chengf0701842005-11-29 19:38:52 +0000572 "div{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +0000573
Chris Lattnerfc752712004-08-01 09:52:59 +0000574// Signed division/remainder.
Chris Lattner3a173df2004-10-03 20:35:00 +0000575def IDIV8r : I<0xF6, MRM7r, (ops R8:$src), // AX/r8 = AL,AH
Evan Chengf0701842005-11-29 19:38:52 +0000576 "idiv{b} $src", []>, Imp<[AX],[AX]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000577def IDIV16r: I<0xF7, MRM7r, (ops R16:$src), // DX:AX/r16 = AX,DX
Evan Chengf0701842005-11-29 19:38:52 +0000578 "idiv{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000579def IDIV32r: I<0xF7, MRM7r, (ops R32:$src), // EDX:EAX/r32 = EAX,EDX
Evan Chengf0701842005-11-29 19:38:52 +0000580 "idiv{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000581def IDIV8m : I<0xF6, MRM7m, (ops i8mem:$src), // AX/[mem8] = AL,AH
Evan Chengf0701842005-11-29 19:38:52 +0000582 "idiv{b} $src", []>, Imp<[AX],[AX]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000583def IDIV16m: I<0xF7, MRM7m, (ops i16mem:$src), // DX:AX/[mem16] = AX,DX
Evan Chengf0701842005-11-29 19:38:52 +0000584 "idiv{w} $src", []>, Imp<[AX,DX],[AX,DX]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000585def IDIV32m: I<0xF7, MRM7m, (ops i32mem:$src), // EDX:EAX/[mem32] = EAX,EDX
Evan Chengf0701842005-11-29 19:38:52 +0000586 "idiv{l} $src", []>, Imp<[EAX,EDX],[EAX,EDX]>;
Chris Lattnerc8f45872003-08-04 04:59:56 +0000587
Chris Lattnerfc752712004-08-01 09:52:59 +0000588// Sign-extenders for division.
Chris Lattner3a173df2004-10-03 20:35:00 +0000589def CBW : I<0x98, RawFrm, (ops),
Evan Chengf0701842005-11-29 19:38:52 +0000590 "{cbtw|cbw}", []>, Imp<[AL],[AH]>; // AX = signext(AL)
Chris Lattner3a173df2004-10-03 20:35:00 +0000591def CWD : I<0x99, RawFrm, (ops),
Evan Chengf0701842005-11-29 19:38:52 +0000592 "{cwtd|cwd}", []>, Imp<[AX],[DX]>; // DX:AX = signext(AX)
Chris Lattner3a173df2004-10-03 20:35:00 +0000593def CDQ : I<0x99, RawFrm, (ops),
Evan Chengf0701842005-11-29 19:38:52 +0000594 "{cltd|cdq}", []>, Imp<[EAX],[EDX]>; // EDX:EAX = signext(EAX)
Chris Lattnerfc752712004-08-01 09:52:59 +0000595
Chris Lattner1cca5e32003-08-03 21:54:21 +0000596
Chris Lattner1cca5e32003-08-03 21:54:21 +0000597//===----------------------------------------------------------------------===//
598// Two address Instructions...
599//
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000600let isTwoAddress = 1 in {
Chris Lattner1cca5e32003-08-03 21:54:21 +0000601
Alkis Evlogimenosa3f66842004-03-12 17:59:56 +0000602// Conditional moves
Chris Lattner3a173df2004-10-03 20:35:00 +0000603def CMOVB16rr : I<0x42, MRMSrcReg, // if <u, R16 = R16
604 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000605 "cmovb {$src2, $dst|$dst, $src2}",
606 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
607 SETULT, STATUS))]>,
608 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000609def CMOVB16rm : I<0x42, MRMSrcMem, // if <u, R16 = [mem16]
610 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000611 "cmovb {$src2, $dst|$dst, $src2}",
612 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
613 SETULT, STATUS))]>,
614 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000615def CMOVB32rr : I<0x42, MRMSrcReg, // if <u, R32 = R32
616 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000617 "cmovb {$src2, $dst|$dst, $src2}",
618 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
619 SETULT, STATUS))]>,
620 Imp<[STATUS],[]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +0000621def CMOVB32rm : I<0x42, MRMSrcMem, // if <u, R32 = [mem32]
622 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000623 "cmovb {$src2, $dst|$dst, $src2}",
624 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
625 SETULT, STATUS))]>,
626 Imp<[STATUS],[]>, TB;
Alkis Evlogimenosa3f66842004-03-12 17:59:56 +0000627
Chris Lattner3a173df2004-10-03 20:35:00 +0000628def CMOVAE16rr: I<0x43, MRMSrcReg, // if >=u, R16 = R16
629 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000630 "cmovae {$src2, $dst|$dst, $src2}",
631 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
632 SETUGE, STATUS))]>,
633 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000634def CMOVAE16rm: I<0x43, MRMSrcMem, // if >=u, R16 = [mem16]
635 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000636 "cmovae {$src2, $dst|$dst, $src2}",
637 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
638 SETUGE, STATUS))]>,
639 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000640def CMOVAE32rr: I<0x43, MRMSrcReg, // if >=u, R32 = R32
641 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000642 "cmovae {$src2, $dst|$dst, $src2}",
643 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
644 SETUGE, STATUS))]>,
645 Imp<[STATUS],[]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +0000646def CMOVAE32rm: I<0x43, MRMSrcMem, // if >=u, R32 = [mem32]
647 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000648 "cmovae {$src2, $dst|$dst, $src2}",
649 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
650 SETUGE, STATUS))]>,
651 Imp<[STATUS],[]>, TB;
Alkis Evlogimenosa3f66842004-03-12 17:59:56 +0000652
Chris Lattner3a173df2004-10-03 20:35:00 +0000653def CMOVE16rr : I<0x44, MRMSrcReg, // if ==, R16 = R16
654 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000655 "cmove {$src2, $dst|$dst, $src2}",
656 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
657 SETEQ, STATUS))]>,
658 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000659def CMOVE16rm : I<0x44, MRMSrcMem, // if ==, R16 = [mem16]
660 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000661 "cmove {$src2, $dst|$dst, $src2}",
662 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
663 SETEQ, STATUS))]>,
664 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000665def CMOVE32rr : I<0x44, MRMSrcReg, // if ==, R32 = R32
666 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000667 "cmove {$src2, $dst|$dst, $src2}",
668 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
669 SETEQ, STATUS))]>,
670 Imp<[STATUS],[]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +0000671def CMOVE32rm : I<0x44, MRMSrcMem, // if ==, R32 = [mem32]
672 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000673 "cmove {$src2, $dst|$dst, $src2}",
674 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
675 SETEQ, STATUS))]>,
676 Imp<[STATUS],[]>, TB;
Alkis Evlogimenosa3f66842004-03-12 17:59:56 +0000677
Chris Lattner3a173df2004-10-03 20:35:00 +0000678def CMOVNE16rr: I<0x45, MRMSrcReg, // if !=, R16 = R16
679 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000680 "cmovne {$src2, $dst|$dst, $src2}",
681 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
682 SETNE, STATUS))]>,
683 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000684def CMOVNE16rm: I<0x45, MRMSrcMem, // if !=, R16 = [mem16]
685 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000686 "cmovne {$src2, $dst|$dst, $src2}",
687 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
688 SETNE, STATUS))]>,
689 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000690def CMOVNE32rr: I<0x45, MRMSrcReg, // if !=, R32 = R32
691 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000692 "cmovne {$src2, $dst|$dst, $src2}",
693 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
694 SETNE, STATUS))]>,
695 Imp<[STATUS],[]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +0000696def CMOVNE32rm: I<0x45, MRMSrcMem, // if !=, R32 = [mem32]
697 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000698 "cmovne {$src2, $dst|$dst, $src2}",
699 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
700 SETNE, STATUS))]>,
701 Imp<[STATUS],[]>, TB;
Alkis Evlogimenosa3f66842004-03-12 17:59:56 +0000702
Chris Lattner3a173df2004-10-03 20:35:00 +0000703def CMOVBE16rr: I<0x46, MRMSrcReg, // if <=u, R16 = R16
704 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000705 "cmovbe {$src2, $dst|$dst, $src2}",
706 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
707 SETULE, STATUS))]>,
708 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000709def CMOVBE16rm: I<0x46, MRMSrcMem, // if <=u, R16 = [mem16]
710 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000711 "cmovbe {$src2, $dst|$dst, $src2}",
712 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
713 SETULE, STATUS))]>,
714 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000715def CMOVBE32rr: I<0x46, MRMSrcReg, // if <=u, R32 = R32
716 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000717 "cmovbe {$src2, $dst|$dst, $src2}",
718 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
719 SETULE, STATUS))]>,
720 Imp<[STATUS],[]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +0000721def CMOVBE32rm: I<0x46, MRMSrcMem, // if <=u, R32 = [mem32]
722 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000723 "cmovbe {$src2, $dst|$dst, $src2}",
724 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
725 SETULE, STATUS))]>,
726 Imp<[STATUS],[]>, TB;
Alkis Evlogimenosa3f66842004-03-12 17:59:56 +0000727
Chris Lattner3a173df2004-10-03 20:35:00 +0000728def CMOVA16rr : I<0x47, MRMSrcReg, // if >u, R16 = R16
729 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000730 "cmova {$src2, $dst|$dst, $src2}",
731 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
732 SETUGT, STATUS))]>,
733 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000734def CMOVA16rm : I<0x47, MRMSrcMem, // if >u, R16 = [mem16]
735 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000736 "cmova {$src2, $dst|$dst, $src2}",
737 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
738 SETUGT, STATUS))]>,
739 Imp<[STATUS],[]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000740def CMOVA32rr : I<0x47, MRMSrcReg, // if >u, R32 = R32
741 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000742 "cmova {$src2, $dst|$dst, $src2}",
743 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
744 SETUGT, STATUS))]>,
745 Imp<[STATUS],[]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +0000746def CMOVA32rm : I<0x47, MRMSrcMem, // if >u, R32 = [mem32]
747 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +0000748 "cmova {$src2, $dst|$dst, $src2}",
749 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
750 SETUGT, STATUS))]>,
751 Imp<[STATUS],[]>, TB;
752
753def CMOVL16rr : I<0x4C, MRMSrcReg, // if <s, R16 = R16
754 (ops R16:$dst, R16:$src1, R16:$src2),
755 "cmovl {$src2, $dst|$dst, $src2}",
756 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
757 SETLT, STATUS))]>,
758 Imp<[STATUS],[]>, TB, OpSize;
759def CMOVL16rm : I<0x4C, MRMSrcMem, // if <s, R16 = [mem16]
760 (ops R16:$dst, R16:$src1, i16mem:$src2),
761 "cmovl {$src2, $dst|$dst, $src2}",
762 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
763 SETLT, STATUS))]>,
764 Imp<[STATUS],[]>, TB, OpSize;
765def CMOVL32rr : I<0x4C, MRMSrcReg, // if <s, R32 = R32
766 (ops R32:$dst, R32:$src1, R32:$src2),
767 "cmovl {$src2, $dst|$dst, $src2}",
768 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
769 SETLT, STATUS))]>,
770 Imp<[STATUS],[]>, TB;
771def CMOVL32rm : I<0x4C, MRMSrcMem, // if <s, R32 = [mem32]
772 (ops R32:$dst, R32:$src1, i32mem:$src2),
773 "cmovl {$src2, $dst|$dst, $src2}",
774 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
775 SETLT, STATUS))]>,
776 Imp<[STATUS],[]>, TB;
777
778def CMOVGE16rr: I<0x4D, MRMSrcReg, // if >=s, R16 = R16
779 (ops R16:$dst, R16:$src1, R16:$src2),
780 "cmovge {$src2, $dst|$dst, $src2}",
781 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
782 SETGE, STATUS))]>,
783 Imp<[STATUS],[]>, TB, OpSize;
784def CMOVGE16rm: I<0x4D, MRMSrcMem, // if >=s, R16 = [mem16]
785 (ops R16:$dst, R16:$src1, i16mem:$src2),
786 "cmovge {$src2, $dst|$dst, $src2}",
787 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
788 SETGE, STATUS))]>,
789 Imp<[STATUS],[]>, TB, OpSize;
790def CMOVGE32rr: I<0x4D, MRMSrcReg, // if >=s, R32 = R32
791 (ops R32:$dst, R32:$src1, R32:$src2),
792 "cmovge {$src2, $dst|$dst, $src2}",
793 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
794 SETGE, STATUS))]>,
795 Imp<[STATUS],[]>, TB;
796def CMOVGE32rm: I<0x4D, MRMSrcMem, // if >=s, R32 = [mem32]
797 (ops R32:$dst, R32:$src1, i32mem:$src2),
798 "cmovge {$src2, $dst|$dst, $src2}",
799 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
800 SETGE, STATUS))]>,
801 Imp<[STATUS],[]>, TB;
802
803def CMOVLE16rr: I<0x4E, MRMSrcReg, // if <=s, R16 = R16
804 (ops R16:$dst, R16:$src1, R16:$src2),
805 "cmovle {$src2, $dst|$dst, $src2}",
806 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
807 SETLE, STATUS))]>,
808 Imp<[STATUS],[]>, TB, OpSize;
809def CMOVLE16rm: I<0x4E, MRMSrcMem, // if <=s, R16 = [mem16]
810 (ops R16:$dst, R16:$src1, i16mem:$src2),
811 "cmovle {$src2, $dst|$dst, $src2}",
812 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
813 SETLE, STATUS))]>,
814 Imp<[STATUS],[]>, TB, OpSize;
815def CMOVLE32rr: I<0x4E, MRMSrcReg, // if <=s, R32 = R32
816 (ops R32:$dst, R32:$src1, R32:$src2),
817 "cmovle {$src2, $dst|$dst, $src2}",
818 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
819 SETLE, STATUS))]>,
820 Imp<[STATUS],[]>, TB;
821def CMOVLE32rm: I<0x4E, MRMSrcMem, // if <=s, R32 = [mem32]
822 (ops R32:$dst, R32:$src1, i32mem:$src2),
823 "cmovle {$src2, $dst|$dst, $src2}",
824 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
825 SETLE, STATUS))]>,
826 Imp<[STATUS],[]>, TB;
827
828def CMOVG16rr : I<0x4F, MRMSrcReg, // if >s, R16 = R16
829 (ops R16:$dst, R16:$src1, R16:$src2),
830 "cmovg {$src2, $dst|$dst, $src2}",
831 [(set R16:$dst, (X86cmov R16:$src1, R16:$src2,
832 SETGT, STATUS))]>,
833 Imp<[STATUS],[]>, TB, OpSize;
834def CMOVG16rm : I<0x4F, MRMSrcMem, // if >s, R16 = [mem16]
835 (ops R16:$dst, R16:$src1, i16mem:$src2),
836 "cmovg {$src2, $dst|$dst, $src2}",
837 [(set R16:$dst, (X86cmov R16:$src1, (loadi16 addr:$src2),
838 SETGT, STATUS))]>,
839 Imp<[STATUS],[]>, TB, OpSize;
840def CMOVG32rr : I<0x4F, MRMSrcReg, // if >s, R32 = R32
841 (ops R32:$dst, R32:$src1, R32:$src2),
842 "cmovg {$src2, $dst|$dst, $src2}",
843 [(set R32:$dst, (X86cmov R32:$src1, R32:$src2,
844 SETGT, STATUS))]>,
845 Imp<[STATUS],[]>, TB;
846def CMOVG32rm : I<0x4F, MRMSrcMem, // if >s, R32 = [mem32]
847 (ops R32:$dst, R32:$src1, i32mem:$src2),
848 "cmovg {$src2, $dst|$dst, $src2}",
849 [(set R32:$dst, (X86cmov R32:$src1, (loadi32 addr:$src2),
850 SETGT, STATUS))]>,
851 Imp<[STATUS],[]>, TB;
Alkis Evlogimenosa3f66842004-03-12 17:59:56 +0000852
Chris Lattner3a173df2004-10-03 20:35:00 +0000853def CMOVS16rr : I<0x48, MRMSrcReg, // if signed, R16 = R16
854 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000855 "cmovs {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000856def CMOVS16rm : I<0x48, MRMSrcMem, // if signed, R16 = [mem16]
857 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000858 "cmovs {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000859def CMOVS32rr : I<0x48, MRMSrcReg, // if signed, R32 = R32
860 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000861 "cmovs {$src2, $dst|$dst, $src2}", []>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +0000862def CMOVS32rm : I<0x48, MRMSrcMem, // if signed, R32 = [mem32]
863 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000864 "cmovs {$src2, $dst|$dst, $src2}", []>, TB;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000865
Chris Lattner3a173df2004-10-03 20:35:00 +0000866def CMOVNS16rr: I<0x49, MRMSrcReg, // if !signed, R16 = R16
867 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000868 "cmovns {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000869def CMOVNS16rm: I<0x49, MRMSrcMem, // if !signed, R16 = [mem16]
870 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000871 "cmovns {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000872def CMOVNS32rr: I<0x49, MRMSrcReg, // if !signed, R32 = R32
873 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000874 "cmovns {$src2, $dst|$dst, $src2}", []>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +0000875def CMOVNS32rm: I<0x49, MRMSrcMem, // if !signed, R32 = [mem32]
876 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000877 "cmovns {$src2, $dst|$dst, $src2}", []>, TB;
Alkis Evlogimenosa3f66842004-03-12 17:59:56 +0000878
Chris Lattner57fbfb52005-01-10 22:09:33 +0000879def CMOVP16rr : I<0x4A, MRMSrcReg, // if parity, R16 = R16
880 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000881 "cmovp {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Chris Lattner57fbfb52005-01-10 22:09:33 +0000882def CMOVP16rm : I<0x4A, MRMSrcMem, // if parity, R16 = [mem16]
883 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000884 "cmovp {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Chris Lattner57fbfb52005-01-10 22:09:33 +0000885def CMOVP32rr : I<0x4A, MRMSrcReg, // if parity, R32 = R32
886 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000887 "cmovp {$src2, $dst|$dst, $src2}", []>, TB;
Chris Lattner57fbfb52005-01-10 22:09:33 +0000888def CMOVP32rm : I<0x4A, MRMSrcMem, // if parity, R32 = [mem32]
889 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000890 "cmovp {$src2, $dst|$dst, $src2}", []>, TB;
Chris Lattner57fbfb52005-01-10 22:09:33 +0000891
Chris Lattner57fbfb52005-01-10 22:09:33 +0000892def CMOVNP16rr : I<0x4B, MRMSrcReg, // if !parity, R16 = R16
893 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000894 "cmovnp {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Chris Lattner57fbfb52005-01-10 22:09:33 +0000895def CMOVNP16rm : I<0x4B, MRMSrcMem, // if !parity, R16 = [mem16]
896 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000897 "cmovnp {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Chris Lattner57fbfb52005-01-10 22:09:33 +0000898def CMOVNP32rr : I<0x4B, MRMSrcReg, // if !parity, R32 = R32
899 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000900 "cmovnp {$src2, $dst|$dst, $src2}", []>, TB;
Chris Lattner57fbfb52005-01-10 22:09:33 +0000901def CMOVNP32rm : I<0x4B, MRMSrcMem, // if !parity, R32 = [mem32]
902 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000903 "cmovnp {$src2, $dst|$dst, $src2}", []>, TB;
Chris Lattner57fbfb52005-01-10 22:09:33 +0000904
905
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000906// unary instructions
Evan Chengf0701842005-11-29 19:38:52 +0000907def NEG8r : I<0xF6, MRM3r, (ops R8 :$dst, R8 :$src), "neg{b} $dst",
908 [(set R8:$dst, (ineg R8:$src))]>;
909def NEG16r : I<0xF7, MRM3r, (ops R16:$dst, R16:$src), "neg{w} $dst",
910 [(set R16:$dst, (ineg R16:$src))]>, OpSize;
911def NEG32r : I<0xF7, MRM3r, (ops R32:$dst, R32:$src), "neg{l} $dst",
912 [(set R32:$dst, (ineg R32:$src))]>;
Chris Lattner57a02302004-08-11 04:31:00 +0000913let isTwoAddress = 0 in {
Evan Cheng5ce4edb2005-12-13 00:54:44 +0000914 def NEG8m : I<0xF6, MRM3m, (ops i8mem :$dst), "neg{b} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000915 [(store (ineg (loadi8 addr:$dst)), addr:$dst)]>;
Evan Cheng5ce4edb2005-12-13 00:54:44 +0000916 def NEG16m : I<0xF7, MRM3m, (ops i16mem:$dst), "neg{w} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000917 [(store (ineg (loadi16 addr:$dst)), addr:$dst)]>, OpSize;
Evan Cheng5ce4edb2005-12-13 00:54:44 +0000918 def NEG32m : I<0xF7, MRM3m, (ops i32mem:$dst), "neg{l} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000919 [(store (ineg (loadi32 addr:$dst)), addr:$dst)]>;
920
Chris Lattner57a02302004-08-11 04:31:00 +0000921}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000922
Evan Chengf0701842005-11-29 19:38:52 +0000923def NOT8r : I<0xF6, MRM2r, (ops R8 :$dst, R8 :$src), "not{b} $dst",
924 [(set R8:$dst, (not R8:$src))]>;
925def NOT16r : I<0xF7, MRM2r, (ops R16:$dst, R16:$src), "not{w} $dst",
926 [(set R16:$dst, (not R16:$src))]>, OpSize;
927def NOT32r : I<0xF7, MRM2r, (ops R32:$dst, R32:$src), "not{l} $dst",
928 [(set R32:$dst, (not R32:$src))]>;
Chris Lattner57a02302004-08-11 04:31:00 +0000929let isTwoAddress = 0 in {
Evan Cheng5ce4edb2005-12-13 00:54:44 +0000930 def NOT8m : I<0xF6, MRM2m, (ops i8mem :$dst), "not{b} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000931 [(store (not (loadi8 addr:$dst)), addr:$dst)]>;
Evan Cheng5ce4edb2005-12-13 00:54:44 +0000932 def NOT16m : I<0xF7, MRM2m, (ops i16mem:$dst), "not{w} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000933 [(store (not (loadi16 addr:$dst)), addr:$dst)]>, OpSize;
Evan Cheng5ce4edb2005-12-13 00:54:44 +0000934 def NOT32m : I<0xF7, MRM2m, (ops i32mem:$dst), "not{l} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000935 [(store (not (loadi32 addr:$dst)), addr:$dst)]>;
Chris Lattner57a02302004-08-11 04:31:00 +0000936}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000937
Evan Chengb51a0592005-12-10 00:48:20 +0000938// TODO: inc/dec is slow for P4, but fast for Pentium-M.
Evan Chengf0701842005-11-29 19:38:52 +0000939def INC8r : I<0xFE, MRM0r, (ops R8 :$dst, R8 :$src), "inc{b} $dst",
940 [(set R8:$dst, (add R8:$src, 1))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +0000941let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Evan Chengf0701842005-11-29 19:38:52 +0000942def INC16r : I<0xFF, MRM0r, (ops R16:$dst, R16:$src), "inc{w} $dst",
943 [(set R16:$dst, (add R16:$src, 1))]>, OpSize;
944def INC32r : I<0xFF, MRM0r, (ops R32:$dst, R32:$src), "inc{l} $dst",
945 [(set R32:$dst, (add R32:$src, 1))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +0000946}
Chris Lattner57a02302004-08-11 04:31:00 +0000947let isTwoAddress = 0 in {
Evan Cheng6cad2762005-12-13 01:02:47 +0000948 def INC8m : I<0xFE, MRM0m, (ops i8mem :$dst), "inc{b} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000949 [(store (add (loadi8 addr:$dst), 1), addr:$dst)]>;
Evan Cheng6cad2762005-12-13 01:02:47 +0000950 def INC16m : I<0xFF, MRM0m, (ops i16mem:$dst), "inc{w} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000951 [(store (add (loadi16 addr:$dst), 1), addr:$dst)]>, OpSize;
Evan Cheng6cad2762005-12-13 01:02:47 +0000952 def INC32m : I<0xFF, MRM0m, (ops i32mem:$dst), "inc{l} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000953 [(store (add (loadi32 addr:$dst), 1), addr:$dst)]>;
Chris Lattner57a02302004-08-11 04:31:00 +0000954}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000955
Evan Chengb51a0592005-12-10 00:48:20 +0000956def DEC8r : I<0xFE, MRM1r, (ops R8 :$dst, R8 :$src), "dec{b} $dst",
957 [(set R8:$dst, (add R8:$src, -1))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +0000958let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Evan Chengb51a0592005-12-10 00:48:20 +0000959def DEC16r : I<0xFF, MRM1r, (ops R16:$dst, R16:$src), "dec{w} $dst",
960 [(set R16:$dst, (add R16:$src, -1))]>, OpSize;
961def DEC32r : I<0xFF, MRM1r, (ops R32:$dst, R32:$src), "dec{l} $dst",
962 [(set R32:$dst, (add R32:$src, -1))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +0000963}
Chris Lattner57a02302004-08-11 04:31:00 +0000964
965let isTwoAddress = 0 in {
Evan Cheng6cad2762005-12-13 01:02:47 +0000966 def DEC8m : I<0xFE, MRM1m, (ops i8mem :$dst), "dec{b} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000967 [(store (add (loadi8 addr:$dst), -1), addr:$dst)]>;
Evan Cheng6cad2762005-12-13 01:02:47 +0000968 def DEC16m : I<0xFF, MRM1m, (ops i16mem:$dst), "dec{w} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000969 [(store (add (loadi16 addr:$dst), -1), addr:$dst)]>, OpSize;
Evan Cheng6cad2762005-12-13 01:02:47 +0000970 def DEC32m : I<0xFF, MRM1m, (ops i32mem:$dst), "dec{l} $dst",
Evan Cheng605c4152005-12-13 01:57:51 +0000971 [(store (add (loadi32 addr:$dst), -1), addr:$dst)]>;
Chris Lattner57a02302004-08-11 04:31:00 +0000972}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +0000973
974// Logical operators...
Chris Lattnercc65bee2005-01-02 02:35:46 +0000975let isCommutable = 1 in { // X = AND Y, Z --> X = AND Z, Y
Chris Lattner3a173df2004-10-03 20:35:00 +0000976def AND8rr : I<0x20, MRMDestReg,
977 (ops R8 :$dst, R8 :$src1, R8 :$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000978 "and{b} {$src2, $dst|$dst, $src2}",
979 [(set R8:$dst, (and R8:$src1, R8:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000980def AND16rr : I<0x21, MRMDestReg,
981 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000982 "and{w} {$src2, $dst|$dst, $src2}",
983 [(set R16:$dst, (and R16:$src1, R16:$src2))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000984def AND32rr : I<0x21, MRMDestReg,
985 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +0000986 "and{l} {$src2, $dst|$dst, $src2}",
987 [(set R32:$dst, (and R32:$src1, R32:$src2))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +0000988}
Chris Lattner57a02302004-08-11 04:31:00 +0000989
Chris Lattner3a173df2004-10-03 20:35:00 +0000990def AND8rm : I<0x22, MRMSrcMem,
991 (ops R8 :$dst, R8 :$src1, i8mem :$src2),
Evan Cheng0ef3a772005-12-13 01:41:36 +0000992 "and{b} {$src2, $dst|$dst, $src2}",
993 [(set R8:$dst, (and R8:$src1, (load addr:$src2)))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +0000994def AND16rm : I<0x23, MRMSrcMem,
995 (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Cheng0ef3a772005-12-13 01:41:36 +0000996 "and{w} {$src2, $dst|$dst, $src2}",
997 [(set R16:$dst, (and R16:$src1, (load addr:$src2)))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +0000998def AND32rm : I<0x23, MRMSrcMem,
999 (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001000 "and{l} {$src2, $dst|$dst, $src2}",
1001 [(set R32:$dst, (and R32:$src1, (load addr:$src2)))]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001002
Chris Lattner3a173df2004-10-03 20:35:00 +00001003def AND8ri : Ii8<0x80, MRM4r,
1004 (ops R8 :$dst, R8 :$src1, i8imm :$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001005 "and{b} {$src2, $dst|$dst, $src2}",
1006 [(set R8:$dst, (and R8:$src1, imm:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001007def AND16ri : Ii16<0x81, MRM4r,
1008 (ops R16:$dst, R16:$src1, i16imm:$src2),
Chris Lattner78432fe2005-11-17 02:01:55 +00001009 "and{w} {$src2, $dst|$dst, $src2}",
1010 [(set R16:$dst, (and R16:$src1, imm:$src2))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001011def AND32ri : Ii32<0x81, MRM4r,
1012 (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001013 "and{l} {$src2, $dst|$dst, $src2}",
1014 [(set R32:$dst, (and R32:$src1, imm:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001015def AND16ri8 : Ii8<0x83, MRM4r,
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001016 (ops R16:$dst, R16:$src1, i16i8imm:$src2),
1017 "and{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001018 [(set R16:$dst, (and R16:$src1, i16immSExt8:$src2))]>,
1019 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001020def AND32ri8 : Ii8<0x83, MRM4r,
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001021 (ops R32:$dst, R32:$src1, i32i8imm:$src2),
1022 "and{l} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001023 [(set R32:$dst, (and R32:$src1, i32immSExt8:$src2))]>;
Chris Lattnerf29ed092004-08-11 05:07:25 +00001024
1025let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001026 def AND8mr : I<0x20, MRMDestMem,
1027 (ops i8mem :$dst, R8 :$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001028 "and{b} {$src, $dst|$dst, $src}",
1029 [(store (and (load addr:$dst), R8:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001030 def AND16mr : I<0x21, MRMDestMem,
1031 (ops i16mem:$dst, R16:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001032 "and{w} {$src, $dst|$dst, $src}",
1033 [(store (and (load addr:$dst), R16:$src), addr:$dst)]>,
1034 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001035 def AND32mr : I<0x21, MRMDestMem,
1036 (ops i32mem:$dst, R32:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001037 "and{l} {$src, $dst|$dst, $src}",
1038 [(store (and (load addr:$dst), R32:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001039 def AND8mi : Ii8<0x80, MRM4m,
1040 (ops i8mem :$dst, i8imm :$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001041 "and{b} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001042 [(store (and (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001043 def AND16mi : Ii16<0x81, MRM4m,
1044 (ops i16mem:$dst, i16imm:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001045 "and{w} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001046 [(store (and (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001047 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001048 def AND32mi : Ii32<0x81, MRM4m,
1049 (ops i32mem:$dst, i32imm:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001050 "and{l} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001051 [(store (and (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001052 def AND16mi8 : Ii8<0x83, MRM4m,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001053 (ops i16mem:$dst, i16i8imm :$src),
1054 "and{w} {$src, $dst|$dst, $src}",
1055 [(store (and (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1056 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001057 def AND32mi8 : Ii8<0x83, MRM4m,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001058 (ops i32mem:$dst, i32i8imm :$src),
1059 "and{l} {$src, $dst|$dst, $src}",
1060 [(store (add (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
Chris Lattnerf29ed092004-08-11 05:07:25 +00001061}
1062
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001063
Chris Lattnercc65bee2005-01-02 02:35:46 +00001064let isCommutable = 1 in { // X = OR Y, Z --> X = OR Z, Y
Chris Lattner36b68902004-08-10 21:21:30 +00001065def OR8rr : I<0x08, MRMDestReg, (ops R8 :$dst, R8 :$src1, R8 :$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001066 "or{b} {$src2, $dst|$dst, $src2}",
1067 [(set R8:$dst, (or R8:$src1, R8:$src2))]>;
Chris Lattner36b68902004-08-10 21:21:30 +00001068def OR16rr : I<0x09, MRMDestReg, (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001069 "or{w} {$src2, $dst|$dst, $src2}",
1070 [(set R16:$dst, (or R16:$src1, R16:$src2))]>, OpSize;
Chris Lattner36b68902004-08-10 21:21:30 +00001071def OR32rr : I<0x09, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001072 "or{l} {$src2, $dst|$dst, $src2}",
1073 [(set R32:$dst, (or R32:$src1, R32:$src2))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001074}
Chris Lattner57a02302004-08-11 04:31:00 +00001075def OR8rm : I<0x0A, MRMSrcMem , (ops R8 :$dst, R8 :$src1, i8mem :$src2),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001076 "or{b} {$src2, $dst|$dst, $src2}",
1077 [(set R8:$dst, (or R8:$src1, (load addr:$src2)))]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001078def OR16rm : I<0x0B, MRMSrcMem , (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001079 "or{w} {$src2, $dst|$dst, $src2}",
1080 [(set R16:$dst, (or R16:$src1, (load addr:$src2)))]>, OpSize;
Chris Lattner57a02302004-08-11 04:31:00 +00001081def OR32rm : I<0x0B, MRMSrcMem , (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001082 "or{l} {$src2, $dst|$dst, $src2}",
1083 [(set R32:$dst, (or R32:$src1, (load addr:$src2)))]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001084
Chris Lattner36b68902004-08-10 21:21:30 +00001085def OR8ri : Ii8 <0x80, MRM1r, (ops R8 :$dst, R8 :$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001086 "or{b} {$src2, $dst|$dst, $src2}",
1087 [(set R8:$dst, (or R8:$src1, imm:$src2))]>;
Chris Lattner36b68902004-08-10 21:21:30 +00001088def OR16ri : Ii16<0x81, MRM1r, (ops R16:$dst, R16:$src1, i16imm:$src2),
Chris Lattner78432fe2005-11-17 02:01:55 +00001089 "or{w} {$src2, $dst|$dst, $src2}",
1090 [(set R16:$dst, (or R16:$src1, imm:$src2))]>, OpSize;
Chris Lattner36b68902004-08-10 21:21:30 +00001091def OR32ri : Ii32<0x81, MRM1r, (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001092 "or{l} {$src2, $dst|$dst, $src2}",
1093 [(set R32:$dst, (or R32:$src1, imm:$src2))]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001094
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001095def OR16ri8 : Ii8<0x83, MRM1r, (ops R16:$dst, R16:$src1, i16i8imm:$src2),
1096 "or{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001097 [(set R16:$dst, (or R16:$src1, i16immSExt8:$src2))]>, OpSize;
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001098def OR32ri8 : Ii8<0x83, MRM1r, (ops R32:$dst, R32:$src1, i32i8imm:$src2),
1099 "or{l} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001100 [(set R32:$dst, (or R32:$src1, i32immSExt8:$src2))]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001101let isTwoAddress = 0 in {
Chris Lattnerf29ed092004-08-11 05:07:25 +00001102 def OR8mr : I<0x08, MRMDestMem, (ops i8mem:$dst, R8:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001103 "or{b} {$src, $dst|$dst, $src}",
1104 [(store (or (load addr:$dst), R8:$src), addr:$dst)]>;
Chris Lattnerf29ed092004-08-11 05:07:25 +00001105 def OR16mr : I<0x09, MRMDestMem, (ops i16mem:$dst, R16:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001106 "or{w} {$src, $dst|$dst, $src}",
1107 [(store (or (load addr:$dst), R16:$src), addr:$dst)]>, OpSize;
Chris Lattnerf29ed092004-08-11 05:07:25 +00001108 def OR32mr : I<0x09, MRMDestMem, (ops i32mem:$dst, R32:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001109 "or{l} {$src, $dst|$dst, $src}",
1110 [(store (or (load addr:$dst), R32:$src), addr:$dst)]>;
Chris Lattnerf5d3a832004-08-11 05:31:07 +00001111 def OR8mi : Ii8<0x80, MRM1m, (ops i8mem :$dst, i8imm:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001112 "or{b} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001113 [(store (or (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
Chris Lattnerf5d3a832004-08-11 05:31:07 +00001114 def OR16mi : Ii16<0x81, MRM1m, (ops i16mem:$dst, i16imm:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001115 "or{w} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001116 [(store (or (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001117 OpSize;
Chris Lattnerf5d3a832004-08-11 05:31:07 +00001118 def OR32mi : Ii32<0x81, MRM1m, (ops i32mem:$dst, i32imm:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001119 "or{l} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001120 [(store (or (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
Evan Cheng0ef3a772005-12-13 01:41:36 +00001121 def OR16mi8 : Ii8<0x83, MRM1m, (ops i16mem:$dst, i16i8imm:$src),
1122 "or{w} {$src, $dst|$dst, $src}",
1123 [(store (or (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1124 OpSize;
1125 def OR32mi8 : Ii8<0x83, MRM1m, (ops i32mem:$dst, i32i8imm:$src),
1126 "or{l} {$src, $dst|$dst, $src}",
1127 [(store (or (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001128}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001129
1130
Chris Lattnercc65bee2005-01-02 02:35:46 +00001131let isCommutable = 1 in { // X = XOR Y, Z --> X = XOR Z, Y
Chris Lattner3a173df2004-10-03 20:35:00 +00001132def XOR8rr : I<0x30, MRMDestReg,
1133 (ops R8 :$dst, R8 :$src1, R8 :$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001134 "xor{b} {$src2, $dst|$dst, $src2}",
1135 [(set R8:$dst, (xor R8:$src1, R8:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001136def XOR16rr : I<0x31, MRMDestReg,
1137 (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001138 "xor{w} {$src2, $dst|$dst, $src2}",
1139 [(set R16:$dst, (xor R16:$src1, R16:$src2))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001140def XOR32rr : I<0x31, MRMDestReg,
1141 (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001142 "xor{l} {$src2, $dst|$dst, $src2}",
1143 [(set R32:$dst, (xor R32:$src1, R32:$src2))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001144}
1145
Chris Lattner3a173df2004-10-03 20:35:00 +00001146def XOR8rm : I<0x32, MRMSrcMem ,
1147 (ops R8 :$dst, R8:$src1, i8mem :$src2),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001148 "xor{b} {$src2, $dst|$dst, $src2}",
1149 [(set R8:$dst, (xor R8:$src1, (load addr:$src2)))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001150def XOR16rm : I<0x33, MRMSrcMem ,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001151 (ops R16:$dst, R16:$src1, i16mem:$src2),
1152 "xor{w} {$src2, $dst|$dst, $src2}",
1153 [(set R16:$dst, (xor R16:$src1, (load addr:$src2)))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001154def XOR32rm : I<0x33, MRMSrcMem ,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001155 (ops R32:$dst, R32:$src1, i32mem:$src2),
1156 "xor{l} {$src2, $dst|$dst, $src2}",
1157 [(set R32:$dst, (xor R32:$src1, (load addr:$src2)))]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001158
Chris Lattner3a173df2004-10-03 20:35:00 +00001159def XOR8ri : Ii8<0x80, MRM6r,
1160 (ops R8:$dst, R8:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001161 "xor{b} {$src2, $dst|$dst, $src2}",
1162 [(set R8:$dst, (xor R8:$src1, imm:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001163def XOR16ri : Ii16<0x81, MRM6r,
1164 (ops R16:$dst, R16:$src1, i16imm:$src2),
Chris Lattner78432fe2005-11-17 02:01:55 +00001165 "xor{w} {$src2, $dst|$dst, $src2}",
1166 [(set R16:$dst, (xor R16:$src1, imm:$src2))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001167def XOR32ri : Ii32<0x81, MRM6r,
1168 (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001169 "xor{l} {$src2, $dst|$dst, $src2}",
1170 [(set R32:$dst, (xor R32:$src1, imm:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001171def XOR16ri8 : Ii8<0x83, MRM6r,
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001172 (ops R16:$dst, R16:$src1, i16i8imm:$src2),
1173 "xor{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001174 [(set R16:$dst, (xor R16:$src1, i16immSExt8:$src2))]>,
1175 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001176def XOR32ri8 : Ii8<0x83, MRM6r,
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001177 (ops R32:$dst, R32:$src1, i32i8imm:$src2),
1178 "xor{l} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001179 [(set R32:$dst, (xor R32:$src1, i32immSExt8:$src2))]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001180let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001181 def XOR8mr : I<0x30, MRMDestMem,
1182 (ops i8mem :$dst, R8 :$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001183 "xor{b} {$src, $dst|$dst, $src}",
1184 [(store (xor (load addr:$dst), R8:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001185 def XOR16mr : I<0x31, MRMDestMem,
1186 (ops i16mem:$dst, R16:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001187 "xor{w} {$src, $dst|$dst, $src}",
1188 [(store (xor (load addr:$dst), R16:$src), addr:$dst)]>,
1189 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001190 def XOR32mr : I<0x31, MRMDestMem,
1191 (ops i32mem:$dst, R32:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001192 "xor{l} {$src, $dst|$dst, $src}",
1193 [(store (xor (load addr:$dst), R32:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001194 def XOR8mi : Ii8<0x80, MRM6m,
1195 (ops i8mem :$dst, i8imm :$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001196 "xor{b} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001197 [(store (xor (loadi8 addr:$dst), imm:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001198 def XOR16mi : Ii16<0x81, MRM6m,
1199 (ops i16mem:$dst, i16imm:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001200 "xor{w} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001201 [(store (xor (loadi16 addr:$dst), imm:$src), addr:$dst)]>,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001202 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001203 def XOR32mi : Ii32<0x81, MRM6m,
1204 (ops i32mem:$dst, i32imm:$src),
Evan Cheng0ef3a772005-12-13 01:41:36 +00001205 "xor{l} {$src, $dst|$dst, $src}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001206 [(store (xor (loadi32 addr:$dst), imm:$src), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001207 def XOR16mi8 : Ii8<0x83, MRM6m,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001208 (ops i16mem:$dst, i16i8imm :$src),
1209 "xor{w} {$src, $dst|$dst, $src}",
1210 [(store (xor (load addr:$dst), i16immSExt8:$src), addr:$dst)]>,
1211 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001212 def XOR32mi8 : Ii8<0x83, MRM6m,
Evan Cheng0ef3a772005-12-13 01:41:36 +00001213 (ops i32mem:$dst, i32i8imm :$src),
1214 "xor{l} {$src, $dst|$dst, $src}",
1215 [(store (xor (load addr:$dst), i32immSExt8:$src), addr:$dst)]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001216}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001217
1218// Shift instructions
Alkis Evlogimenos13d362f2004-03-07 03:19:11 +00001219// FIXME: provide shorter instructions when imm8 == 1
Chris Lattner3a173df2004-10-03 20:35:00 +00001220def SHL8rCL : I<0xD2, MRM4r, (ops R8 :$dst, R8 :$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001221 "shl{b} {%cl, $dst|$dst, %CL}",
1222 [(set R8:$dst, (shl R8:$src, CL))]>, Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001223def SHL16rCL : I<0xD3, MRM4r, (ops R16:$dst, R16:$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001224 "shl{w} {%cl, $dst|$dst, %CL}",
1225 [(set R16:$dst, (shl R16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001226def SHL32rCL : I<0xD3, MRM4r, (ops R32:$dst, R32:$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001227 "shl{l} {%cl, $dst|$dst, %CL}",
1228 [(set R32:$dst, (shl R32:$src, CL))]>, Imp<[CL],[]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001229
Chris Lattner36b68902004-08-10 21:21:30 +00001230def SHL8ri : Ii8<0xC0, MRM4r, (ops R8 :$dst, R8 :$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001231 "shl{b} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001232 [(set R8:$dst, (shl R8:$src1, (i8 imm:$src2)))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001233let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001234def SHL16ri : Ii8<0xC1, MRM4r, (ops R16:$dst, R16:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001235 "shl{w} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001236 [(set R16:$dst, (shl R16:$src1, (i8 imm:$src2)))]>, OpSize;
1237def SHL32ri : Ii8<0xC1, MRM4r, (ops R32:$dst, R32:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001238 "shl{l} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001239 [(set R32:$dst, (shl R32:$src1, (i8 imm:$src2)))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001240}
Chris Lattnerf29ed092004-08-11 05:07:25 +00001241
1242let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001243 def SHL8mCL : I<0xD2, MRM4m, (ops i8mem :$dst),
Evan Cheng763b0292005-12-13 02:34:51 +00001244 "shl{b} {%cl, $dst|$dst, %CL}",
1245 [(store (shl (loadi8 addr:$dst), CL), addr:$dst)]>,
1246 Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001247 def SHL16mCL : I<0xD3, MRM4m, (ops i16mem:$dst),
Evan Cheng763b0292005-12-13 02:34:51 +00001248 "shl{w} {%cl, $dst|$dst, %CL}",
1249 [(store (shl (loadi16 addr:$dst), CL), addr:$dst)]>,
1250 Imp<[CL],[]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001251 def SHL32mCL : I<0xD3, MRM4m, (ops i32mem:$dst),
Evan Cheng763b0292005-12-13 02:34:51 +00001252 "shl{l} {%cl, $dst|$dst, %CL}",
1253 [(store (shl (loadi32 addr:$dst), CL), addr:$dst)]>,
1254 Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001255 def SHL8mi : Ii8<0xC0, MRM4m, (ops i8mem :$dst, i8imm:$src),
Evan Cheng763b0292005-12-13 02:34:51 +00001256 "shl{b} {$src, $dst|$dst, $src}",
1257 [(store (shl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001258 def SHL16mi : Ii8<0xC1, MRM4m, (ops i16mem:$dst, i8imm:$src),
Evan Cheng763b0292005-12-13 02:34:51 +00001259 "shl{w} {$src, $dst|$dst, $src}",
1260 [(store (shl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1261 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001262 def SHL32mi : Ii8<0xC1, MRM4m, (ops i32mem:$dst, i8imm:$src),
Evan Cheng763b0292005-12-13 02:34:51 +00001263 "shl{l} {$src, $dst|$dst, $src}",
1264 [(store (shl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Chris Lattnerf29ed092004-08-11 05:07:25 +00001265}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001266
Chris Lattner3a173df2004-10-03 20:35:00 +00001267def SHR8rCL : I<0xD2, MRM5r, (ops R8 :$dst, R8 :$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001268 "shr{b} {%cl, $dst|$dst, %CL}",
1269 [(set R8:$dst, (srl R8:$src, CL))]>, Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001270def SHR16rCL : I<0xD3, MRM5r, (ops R16:$dst, R16:$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001271 "shr{w} {%cl, $dst|$dst, %CL}",
1272 [(set R16:$dst, (srl R16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001273def SHR32rCL : I<0xD3, MRM5r, (ops R32:$dst, R32:$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001274 "shr{l} {%cl, $dst|$dst, %CL}",
1275 [(set R32:$dst, (srl R32:$src, CL))]>, Imp<[CL],[]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001276
Chris Lattner3a173df2004-10-03 20:35:00 +00001277def SHR8ri : Ii8<0xC0, MRM5r, (ops R8:$dst, R8:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001278 "shr{b} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001279 [(set R8:$dst, (srl R8:$src1, (i8 imm:$src2)))]>;
1280def SHR16ri : Ii8<0xC1, MRM5r, (ops R16:$dst, R16:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001281 "shr{w} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001282 [(set R16:$dst, (srl R16:$src1, (i8 imm:$src2)))]>, OpSize;
1283def SHR32ri : Ii8<0xC1, MRM5r, (ops R32:$dst, R32:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001284 "shr{l} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001285 [(set R32:$dst, (srl R32:$src1, (i8 imm:$src2)))]>;
Chris Lattnerf29ed092004-08-11 05:07:25 +00001286
Chris Lattner57a02302004-08-11 04:31:00 +00001287let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001288 def SHR8mCL : I<0xD2, MRM5m, (ops i8mem :$dst),
Evan Cheng85dd8892005-12-13 07:24:22 +00001289 "shr{b} {%cl, $dst|$dst, %CL}",
1290 [(store (srl (loadi8 addr:$dst), CL), addr:$dst)]>,
1291 Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001292 def SHR16mCL : I<0xD3, MRM5m, (ops i16mem:$dst),
Evan Cheng85dd8892005-12-13 07:24:22 +00001293 "shr{w} {%cl, $dst|$dst, %CL}",
1294 [(store (srl (loadi16 addr:$dst), CL), addr:$dst)]>,
1295 Imp<[CL],[]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001296 def SHR32mCL : I<0xD3, MRM5m, (ops i32mem:$dst),
Evan Cheng85dd8892005-12-13 07:24:22 +00001297 "shr{l} {%cl, $dst|$dst, %CL}",
1298 [(store (srl (loadi32 addr:$dst), CL), addr:$dst)]>,
1299 Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001300 def SHR8mi : Ii8<0xC0, MRM5m, (ops i8mem :$dst, i8imm:$src),
Evan Cheng85dd8892005-12-13 07:24:22 +00001301 "shr{b} {$src, $dst|$dst, $src}",
1302 [(store (srl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001303 def SHR16mi : Ii8<0xC1, MRM5m, (ops i16mem:$dst, i8imm:$src),
Evan Cheng85dd8892005-12-13 07:24:22 +00001304 "shr{w} {$src, $dst|$dst, $src}",
1305 [(store (srl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1306 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001307 def SHR32mi : Ii8<0xC1, MRM5m, (ops i32mem:$dst, i8imm:$src),
Evan Cheng85dd8892005-12-13 07:24:22 +00001308 "shr{l} {$src, $dst|$dst, $src}",
1309 [(store (srl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001310}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001311
Chris Lattner3a173df2004-10-03 20:35:00 +00001312def SAR8rCL : I<0xD2, MRM7r, (ops R8 :$dst, R8 :$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001313 "sar{b} {%cl, $dst|$dst, %CL}",
1314 [(set R8:$dst, (sra R8:$src, CL))]>, Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001315def SAR16rCL : I<0xD3, MRM7r, (ops R16:$dst, R16:$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001316 "sar{w} {%cl, $dst|$dst, %CL}",
1317 [(set R16:$dst, (sra R16:$src, CL))]>, Imp<[CL],[]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001318def SAR32rCL : I<0xD3, MRM7r, (ops R32:$dst, R32:$src),
Evan Cheng640f2992005-12-01 00:43:55 +00001319 "sar{l} {%cl, $dst|$dst, %CL}",
1320 [(set R32:$dst, (sra R32:$src, CL))]>, Imp<[CL],[]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001321
Chris Lattner36b68902004-08-10 21:21:30 +00001322def SAR8ri : Ii8<0xC0, MRM7r, (ops R8 :$dst, R8 :$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001323 "sar{b} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001324 [(set R8:$dst, (sra R8:$src1, (i8 imm:$src2)))]>;
1325def SAR16ri : Ii8<0xC1, MRM7r, (ops R16:$dst, R16:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001326 "sar{w} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001327 [(set R16:$dst, (sra R16:$src1, (i8 imm:$src2)))]>,
1328 OpSize;
1329def SAR32ri : Ii8<0xC1, MRM7r, (ops R32:$dst, R32:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001330 "sar{l} {$src2, $dst|$dst, $src2}",
Chris Lattner3d36a9f2005-12-05 02:40:25 +00001331 [(set R32:$dst, (sra R32:$src1, (i8 imm:$src2)))]>;
Chris Lattnerf29ed092004-08-11 05:07:25 +00001332let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001333 def SAR8mCL : I<0xD2, MRM7m, (ops i8mem :$dst),
Evan Cheng85dd8892005-12-13 07:24:22 +00001334 "sar{b} {%cl, $dst|$dst, %CL}",
1335 [(store (sra (loadi8 addr:$dst), CL), addr:$dst)]>,
1336 Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001337 def SAR16mCL : I<0xD3, MRM7m, (ops i16mem:$dst),
Evan Cheng85dd8892005-12-13 07:24:22 +00001338 "sar{w} {%cl, $dst|$dst, %CL}",
1339 [(store (sra (loadi16 addr:$dst), CL), addr:$dst)]>,
1340 Imp<[CL],[]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001341 def SAR32mCL : I<0xD3, MRM7m, (ops i32mem:$dst),
Evan Cheng85dd8892005-12-13 07:24:22 +00001342 "sar{l} {%cl, $dst|$dst, %CL}",
1343 [(store (sra (loadi32 addr:$dst), CL), addr:$dst)]>,
1344 Imp<[CL],[]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001345 def SAR8mi : Ii8<0xC0, MRM7m, (ops i8mem :$dst, i8imm:$src),
Evan Cheng85dd8892005-12-13 07:24:22 +00001346 "sar{b} {$src, $dst|$dst, $src}",
1347 [(store (sra (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001348 def SAR16mi : Ii8<0xC1, MRM7m, (ops i16mem:$dst, i8imm:$src),
Evan Cheng85dd8892005-12-13 07:24:22 +00001349 "sar{w} {$src, $dst|$dst, $src}",
1350 [(store (sra (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)]>,
1351 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001352 def SAR32mi : Ii8<0xC1, MRM7m, (ops i32mem:$dst, i8imm:$src),
Evan Cheng85dd8892005-12-13 07:24:22 +00001353 "sar{l} {$src, $dst|$dst, $src}",
1354 [(store (sra (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)]>;
Chris Lattnerf29ed092004-08-11 05:07:25 +00001355}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001356
Chris Lattner40ff6332005-01-19 07:50:03 +00001357// Rotate instructions
1358// FIXME: provide shorter instructions when imm8 == 1
1359def ROL8rCL : I<0xD2, MRM0r, (ops R8 :$dst, R8 :$src),
Evan Chengf0701842005-11-29 19:38:52 +00001360 "rol{b} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001361def ROL16rCL : I<0xD3, MRM0r, (ops R16:$dst, R16:$src),
Evan Chengf0701842005-11-29 19:38:52 +00001362 "rol{w} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>, OpSize;
Chris Lattner40ff6332005-01-19 07:50:03 +00001363def ROL32rCL : I<0xD3, MRM0r, (ops R32:$dst, R32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00001364 "rol{l} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001365
1366def ROL8ri : Ii8<0xC0, MRM0r, (ops R8 :$dst, R8 :$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001367 "rol{b} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001368def ROL16ri : Ii8<0xC1, MRM0r, (ops R16:$dst, R16:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001369 "rol{w} {$src2, $dst|$dst, $src2}", []>, OpSize;
Chris Lattner40ff6332005-01-19 07:50:03 +00001370def ROL32ri : Ii8<0xC1, MRM0r, (ops R32:$dst, R32:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001371 "rol{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001372
1373let isTwoAddress = 0 in {
1374 def ROL8mCL : I<0xD2, MRM0m, (ops i8mem :$dst),
Evan Chengf0701842005-11-29 19:38:52 +00001375 "rol{b} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001376 def ROL16mCL : I<0xD3, MRM0m, (ops i16mem:$dst),
Evan Chengf0701842005-11-29 19:38:52 +00001377 "rol{w} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>, OpSize;
Chris Lattner40ff6332005-01-19 07:50:03 +00001378 def ROL32mCL : I<0xD3, MRM0m, (ops i32mem:$dst),
Evan Chengf0701842005-11-29 19:38:52 +00001379 "rol{l} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001380 def ROL8mi : Ii8<0xC0, MRM0m, (ops i8mem :$dst, i8imm:$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001381 "rol{b} {$src, $dst|$dst, $src}", []>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001382 def ROL16mi : Ii8<0xC1, MRM0m, (ops i16mem:$dst, i8imm:$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001383 "rol{w} {$src, $dst|$dst, $src}", []>, OpSize;
Chris Lattner40ff6332005-01-19 07:50:03 +00001384 def ROL32mi : Ii8<0xC1, MRM0m, (ops i32mem:$dst, i8imm:$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001385 "rol{l} {$src, $dst|$dst, $src}", []>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001386}
1387
1388def ROR8rCL : I<0xD2, MRM1r, (ops R8 :$dst, R8 :$src),
Evan Chengf0701842005-11-29 19:38:52 +00001389 "ror{b} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001390def ROR16rCL : I<0xD3, MRM1r, (ops R16:$dst, R16:$src),
Evan Chengf0701842005-11-29 19:38:52 +00001391 "ror{w} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>, OpSize;
Chris Lattner40ff6332005-01-19 07:50:03 +00001392def ROR32rCL : I<0xD3, MRM1r, (ops R32:$dst, R32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00001393 "ror{l} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001394
1395def ROR8ri : Ii8<0xC0, MRM1r, (ops R8 :$dst, R8 :$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001396 "ror{b} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001397def ROR16ri : Ii8<0xC1, MRM1r, (ops R16:$dst, R16:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001398 "ror{w} {$src2, $dst|$dst, $src2}", []>, OpSize;
Chris Lattner40ff6332005-01-19 07:50:03 +00001399def ROR32ri : Ii8<0xC1, MRM1r, (ops R32:$dst, R32:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001400 "ror{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001401let isTwoAddress = 0 in {
1402 def ROR8mCL : I<0xD2, MRM1m, (ops i8mem :$dst),
Evan Chengf0701842005-11-29 19:38:52 +00001403 "ror{b} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001404 def ROR16mCL : I<0xD3, MRM1m, (ops i16mem:$dst),
Evan Chengf0701842005-11-29 19:38:52 +00001405 "ror{w} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>, OpSize;
Chris Lattner40ff6332005-01-19 07:50:03 +00001406 def ROR32mCL : I<0xD3, MRM1m, (ops i32mem:$dst),
Evan Chengf0701842005-11-29 19:38:52 +00001407 "ror{l} {%cl, $dst|$dst, %CL}", []>, Imp<[CL],[]>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001408 def ROR8mi : Ii8<0xC0, MRM1m, (ops i8mem :$dst, i8imm:$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001409 "ror{b} {$src, $dst|$dst, $src}", []>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001410 def ROR16mi : Ii8<0xC1, MRM1m, (ops i16mem:$dst, i8imm:$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001411 "ror{w} {$src, $dst|$dst, $src}", []>, OpSize;
Chris Lattner40ff6332005-01-19 07:50:03 +00001412 def ROR32mi : Ii8<0xC1, MRM1m, (ops i32mem:$dst, i8imm:$src),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001413 "ror{l} {$src, $dst|$dst, $src}", []>;
Chris Lattner40ff6332005-01-19 07:50:03 +00001414}
1415
1416
1417
1418// Double shift instructions (generalizations of rotate)
1419
Chris Lattner57a02302004-08-11 04:31:00 +00001420def SHLD32rrCL : I<0xA5, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001421 "shld{l} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
Chris Lattner3a173df2004-10-03 20:35:00 +00001422 Imp<[CL],[]>, TB;
Chris Lattner57a02302004-08-11 04:31:00 +00001423def SHRD32rrCL : I<0xAD, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001424 "shrd{l} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
Chris Lattner3a173df2004-10-03 20:35:00 +00001425 Imp<[CL],[]>, TB;
Chris Lattner0df53d22005-01-19 07:31:24 +00001426def SHLD16rrCL : I<0xA5, MRMDestReg, (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001427 "shld{w} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
Chris Lattner0df53d22005-01-19 07:31:24 +00001428 Imp<[CL],[]>, TB, OpSize;
1429def SHRD16rrCL : I<0xAD, MRMDestReg, (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001430 "shrd{w} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
Chris Lattner0df53d22005-01-19 07:31:24 +00001431 Imp<[CL],[]>, TB, OpSize;
Chris Lattner41e431b2005-01-19 07:11:01 +00001432
1433let isCommutable = 1 in { // These instructions commute to each other.
Chris Lattner3a173df2004-10-03 20:35:00 +00001434def SHLD32rri8 : Ii8<0xA4, MRMDestReg,
1435 (ops R32:$dst, R32:$src1, R32:$src2, i8imm:$src3),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001436 "shld{l} {$src3, $src2, $dst|$dst, $src2, $src3}", []>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +00001437def SHRD32rri8 : Ii8<0xAC, MRMDestReg,
1438 (ops R32:$dst, R32:$src1, R32:$src2, i8imm:$src3),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001439 "shrd{l} {$src3, $src2, $dst|$dst, $src2, $src3}", []>, TB;
Chris Lattner0df53d22005-01-19 07:31:24 +00001440def SHLD16rri8 : Ii8<0xA4, MRMDestReg,
1441 (ops R16:$dst, R16:$src1, R16:$src2, i8imm:$src3),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001442 "shld{w} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
Chris Lattner0df53d22005-01-19 07:31:24 +00001443 TB, OpSize;
1444def SHRD16rri8 : Ii8<0xAC, MRMDestReg,
1445 (ops R16:$dst, R16:$src1, R16:$src2, i8imm:$src3),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001446 "shrd{w} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
Chris Lattner0df53d22005-01-19 07:31:24 +00001447 TB, OpSize;
Chris Lattner41e431b2005-01-19 07:11:01 +00001448}
Chris Lattner0e967d42004-08-01 08:13:11 +00001449
Chris Lattner57a02302004-08-11 04:31:00 +00001450let isTwoAddress = 0 in {
1451 def SHLD32mrCL : I<0xA5, MRMDestMem, (ops i32mem:$dst, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001452 "shld{l} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
Chris Lattner3a173df2004-10-03 20:35:00 +00001453 Imp<[CL],[]>, TB;
Chris Lattner57a02302004-08-11 04:31:00 +00001454 def SHRD32mrCL : I<0xAD, MRMDestMem, (ops i32mem:$dst, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001455 "shrd{l} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
Chris Lattner3a173df2004-10-03 20:35:00 +00001456 Imp<[CL],[]>, TB;
1457 def SHLD32mri8 : Ii8<0xA4, MRMDestMem,
1458 (ops i32mem:$dst, R32:$src2, i8imm:$src3),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001459 "shld{l} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
1460 TB;
Chris Lattner3a173df2004-10-03 20:35:00 +00001461 def SHRD32mri8 : Ii8<0xAC, MRMDestMem,
1462 (ops i32mem:$dst, R32:$src2, i8imm:$src3),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001463 "shrd{l} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
1464 TB;
Chris Lattner0df53d22005-01-19 07:31:24 +00001465
1466 def SHLD16mrCL : I<0xA5, MRMDestMem, (ops i16mem:$dst, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001467 "shld{w} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
Chris Lattner0df53d22005-01-19 07:31:24 +00001468 Imp<[CL],[]>, TB, OpSize;
1469 def SHRD16mrCL : I<0xAD, MRMDestMem, (ops i16mem:$dst, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001470 "shrd{w} {%cl, $src2, $dst|$dst, $src2, %CL}", []>,
Chris Lattner0df53d22005-01-19 07:31:24 +00001471 Imp<[CL],[]>, TB, OpSize;
1472 def SHLD16mri8 : Ii8<0xA4, MRMDestMem,
1473 (ops i16mem:$dst, R16:$src2, i8imm:$src3),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001474 "shld{w} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
Chris Lattner0df53d22005-01-19 07:31:24 +00001475 TB, OpSize;
1476 def SHRD16mri8 : Ii8<0xAC, MRMDestMem,
1477 (ops i16mem:$dst, R16:$src2, i8imm:$src3),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001478 "shrd{w} {$src3, $src2, $dst|$dst, $src2, $src3}", []>,
Chris Lattner0df53d22005-01-19 07:31:24 +00001479 TB, OpSize;
Chris Lattner57a02302004-08-11 04:31:00 +00001480}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001481
1482
Chris Lattnercc65bee2005-01-02 02:35:46 +00001483// Arithmetic.
1484let isCommutable = 1 in { // X = ADD Y, Z --> X = ADD Z, Y
Chris Lattner3a173df2004-10-03 20:35:00 +00001485def ADD8rr : I<0x00, MRMDestReg, (ops R8 :$dst, R8 :$src1, R8 :$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001486 "add{b} {$src2, $dst|$dst, $src2}",
1487 [(set R8:$dst, (add R8:$src1, R8:$src2))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001488let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Chris Lattner3a173df2004-10-03 20:35:00 +00001489def ADD16rr : I<0x01, MRMDestReg, (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001490 "add{w} {$src2, $dst|$dst, $src2}",
1491 [(set R16:$dst, (add R16:$src1, R16:$src2))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001492def ADD32rr : I<0x01, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001493 "add{l} {$src2, $dst|$dst, $src2}",
1494 [(set R32:$dst, (add R32:$src1, R32:$src2))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001495} // end isConvertibleToThreeAddress
1496} // end isCommutable
Chris Lattner3a173df2004-10-03 20:35:00 +00001497def ADD8rm : I<0x02, MRMSrcMem, (ops R8 :$dst, R8 :$src1, i8mem :$src2),
Evan Chengab24ed22005-12-09 22:48:48 +00001498 "add{b} {$src2, $dst|$dst, $src2}",
1499 [(set R8:$dst, (add R8:$src1, (load addr:$src2)))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001500def ADD16rm : I<0x03, MRMSrcMem, (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengab24ed22005-12-09 22:48:48 +00001501 "add{w} {$src2, $dst|$dst, $src2}",
1502 [(set R16:$dst, (add R16:$src1, (load addr:$src2)))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001503def ADD32rm : I<0x03, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengab24ed22005-12-09 22:48:48 +00001504 "add{l} {$src2, $dst|$dst, $src2}",
1505 [(set R32:$dst, (add R32:$src1, (load addr:$src2)))]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001506
Chris Lattner3a173df2004-10-03 20:35:00 +00001507def ADD8ri : Ii8<0x80, MRM0r, (ops R8:$dst, R8:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001508 "add{b} {$src2, $dst|$dst, $src2}",
1509 [(set R8:$dst, (add R8:$src1, imm:$src2))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001510
1511let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
Chris Lattner3a173df2004-10-03 20:35:00 +00001512def ADD16ri : Ii16<0x81, MRM0r, (ops R16:$dst, R16:$src1, i16imm:$src2),
Chris Lattner78432fe2005-11-17 02:01:55 +00001513 "add{w} {$src2, $dst|$dst, $src2}",
1514 [(set R16:$dst, (add R16:$src1, imm:$src2))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001515def ADD32ri : Ii32<0x81, MRM0r, (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001516 "add{l} {$src2, $dst|$dst, $src2}",
1517 [(set R32:$dst, (add R32:$src1, imm:$src2))]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001518}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001519
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001520// FIXME: move ADD16ri8 above ADD16ri to optimize for space.
1521def ADD16ri8 : Ii8<0x83, MRM0r, (ops R16:$dst, R16:$src1, i16i8imm:$src2),
1522 "add{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001523 [(set R16:$dst, (add R16:$src1, i16immSExt8:$src2))]>,
1524 OpSize;
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001525def ADD32ri8 : Ii8<0x83, MRM0r, (ops R32:$dst, R32:$src1, i32i8imm:$src2),
1526 "add{l} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001527 [(set R32:$dst, (add R32:$src1, i32immSExt8:$src2))]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001528
1529let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001530 def ADD8mr : I<0x00, MRMDestMem, (ops i8mem :$dst, R8 :$src2),
Evan Chengee93f9d2005-12-12 19:45:23 +00001531 "add{b} {$src2, $dst|$dst, $src2}",
1532 [(store (add (load addr:$dst), R8:$src2), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001533 def ADD16mr : I<0x01, MRMDestMem, (ops i16mem:$dst, R16:$src2),
Evan Chengee93f9d2005-12-12 19:45:23 +00001534 "add{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001535 [(store (add (load addr:$dst), R16:$src2), addr:$dst)]>,
1536 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001537 def ADD32mr : I<0x01, MRMDestMem, (ops i32mem:$dst, R32:$src2),
Evan Chengee93f9d2005-12-12 19:45:23 +00001538 "add{l} {$src2, $dst|$dst, $src2}",
1539 [(store (add (load addr:$dst), R32:$src2), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001540 def ADD8mi : Ii8<0x80, MRM0m, (ops i8mem :$dst, i8imm :$src2),
Evan Chengee93f9d2005-12-12 19:45:23 +00001541 "add{b} {$src2, $dst|$dst, $src2}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001542 [(store (add (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001543 def ADD16mi : Ii16<0x81, MRM0m, (ops i16mem:$dst, i16imm:$src2),
Evan Chengee93f9d2005-12-12 19:45:23 +00001544 "add{w} {$src2, $dst|$dst, $src2}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001545 [(store (add (loadi16 addr:$dst), imm:$src2), addr:$dst)]>,
Evan Cheng9b6b6422005-12-13 00:14:11 +00001546 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001547 def ADD32mi : Ii32<0x81, MRM0m, (ops i32mem:$dst, i32imm:$src2),
Evan Chengee93f9d2005-12-12 19:45:23 +00001548 "add{l} {$src2, $dst|$dst, $src2}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001549 [(store (add (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengee93f9d2005-12-12 19:45:23 +00001550 def ADD16mi8 : Ii8<0x83, MRM0m, (ops i16mem:$dst, i16i8imm :$src2),
1551 "add{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001552 [(store (add (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>,
1553 OpSize;
Evan Chengee93f9d2005-12-12 19:45:23 +00001554 def ADD32mi8 : Ii8<0x83, MRM0m, (ops i32mem:$dst, i32i8imm :$src2),
1555 "add{l} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001556 [(store (add (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001557}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001558
Chris Lattner10197ff2005-01-03 01:27:59 +00001559let isCommutable = 1 in { // X = ADC Y, Z --> X = ADC Z, Y
Chris Lattner3a173df2004-10-03 20:35:00 +00001560def ADC32rr : I<0x11, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001561 "adc{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner10197ff2005-01-03 01:27:59 +00001562}
Chris Lattner3a173df2004-10-03 20:35:00 +00001563def ADC32rm : I<0x13, MRMSrcMem , (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001564 "adc{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001565def ADC32ri : Ii32<0x81, MRM2r, (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001566 "adc{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001567def ADC32ri8 : Ii8<0x83, MRM2r, (ops R32:$dst, R32:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001568 "adc{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner57a02302004-08-11 04:31:00 +00001569
1570let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001571 def ADC32mr : I<0x11, MRMDestMem, (ops i32mem:$dst, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001572 "adc{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001573 def ADC32mi : Ii32<0x81, MRM2m, (ops i32mem:$dst, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001574 "adc{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001575 def ADC32mi8 : Ii8<0x83, MRM2m, (ops i32mem:$dst, i8imm :$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001576 "adc{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner57a02302004-08-11 04:31:00 +00001577}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001578
Chris Lattner3a173df2004-10-03 20:35:00 +00001579def SUB8rr : I<0x28, MRMDestReg, (ops R8 :$dst, R8 :$src1, R8 :$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001580 "sub{b} {$src2, $dst|$dst, $src2}",
1581 [(set R8:$dst, (sub R8:$src1, R8:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001582def SUB16rr : I<0x29, MRMDestReg, (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001583 "sub{w} {$src2, $dst|$dst, $src2}",
1584 [(set R16:$dst, (sub R16:$src1, R16:$src2))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001585def SUB32rr : I<0x29, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001586 "sub{l} {$src2, $dst|$dst, $src2}",
1587 [(set R32:$dst, (sub R32:$src1, R32:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001588def SUB8rm : I<0x2A, MRMSrcMem, (ops R8 :$dst, R8 :$src1, i8mem :$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001589 "sub{b} {$src2, $dst|$dst, $src2}",
1590 [(set R8:$dst, (sub R8:$src1, (load addr:$src2)))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001591def SUB16rm : I<0x2B, MRMSrcMem, (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001592 "sub{w} {$src2, $dst|$dst, $src2}",
1593 [(set R16:$dst, (sub R16:$src1, (load addr:$src2)))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001594def SUB32rm : I<0x2B, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001595 "sub{l} {$src2, $dst|$dst, $src2}",
1596 [(set R32:$dst, (sub R32:$src1, (load addr:$src2)))]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001597
Chris Lattner36b68902004-08-10 21:21:30 +00001598def SUB8ri : Ii8 <0x80, MRM5r, (ops R8:$dst, R8:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001599 "sub{b} {$src2, $dst|$dst, $src2}",
1600 [(set R8:$dst, (sub R8:$src1, imm:$src2))]>;
Chris Lattner36b68902004-08-10 21:21:30 +00001601def SUB16ri : Ii16<0x81, MRM5r, (ops R16:$dst, R16:$src1, i16imm:$src2),
Chris Lattner78432fe2005-11-17 02:01:55 +00001602 "sub{w} {$src2, $dst|$dst, $src2}",
1603 [(set R16:$dst, (sub R16:$src1, imm:$src2))]>, OpSize;
Chris Lattner36b68902004-08-10 21:21:30 +00001604def SUB32ri : Ii32<0x81, MRM5r, (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001605 "sub{l} {$src2, $dst|$dst, $src2}",
1606 [(set R32:$dst, (sub R32:$src1, imm:$src2))]>;
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001607def SUB16ri8 : Ii8<0x83, MRM5r, (ops R16:$dst, R16:$src1, i16i8imm:$src2),
1608 "sub{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001609 [(set R16:$dst, (sub R16:$src1, i16immSExt8:$src2))]>,
1610 OpSize;
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001611def SUB32ri8 : Ii8<0x83, MRM5r, (ops R32:$dst, R32:$src1, i32i8imm:$src2),
1612 "sub{l} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001613 [(set R32:$dst, (sub R32:$src1, i32immSExt8:$src2))]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001614let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001615 def SUB8mr : I<0x28, MRMDestMem, (ops i8mem :$dst, R8 :$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001616 "sub{b} {$src2, $dst|$dst, $src2}",
1617 [(store (sub (load addr:$dst), R8:$src2), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001618 def SUB16mr : I<0x29, MRMDestMem, (ops i16mem:$dst, R16:$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001619 "sub{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001620 [(store (sub (load addr:$dst), R16:$src2), addr:$dst)]>,
1621 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001622 def SUB32mr : I<0x29, MRMDestMem, (ops i32mem:$dst, R32:$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001623 "sub{l} {$src2, $dst|$dst, $src2}",
1624 [(store (sub (load addr:$dst), R32:$src2), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001625 def SUB8mi : Ii8<0x80, MRM5m, (ops i8mem :$dst, i8imm:$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001626 "sub{b} {$src2, $dst|$dst, $src2}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001627 [(store (sub (loadi8 addr:$dst), imm:$src2), addr:$dst)]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001628 def SUB16mi : Ii16<0x81, MRM5m, (ops i16mem:$dst, i16imm:$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001629 "sub{w} {$src2, $dst|$dst, $src2}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001630 [(store (sub (loadi16 addr:$dst), imm:$src2), addr:$dst)]>,
Evan Cheng9b6b6422005-12-13 00:14:11 +00001631 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001632 def SUB32mi : Ii32<0x81, MRM5m, (ops i32mem:$dst, i32imm:$src2),
Evan Chengd160d482005-12-12 21:54:05 +00001633 "sub{l} {$src2, $dst|$dst, $src2}",
Evan Chengc937ffa2005-12-13 02:40:18 +00001634 [(store (sub (loadi32 addr:$dst), imm:$src2), addr:$dst)]>;
Evan Chengd160d482005-12-12 21:54:05 +00001635 def SUB16mi8 : Ii8<0x83, MRM5m, (ops i16mem:$dst, i16i8imm :$src2),
1636 "sub{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001637 [(store (sub (load addr:$dst), i16immSExt8:$src2), addr:$dst)]>,
1638 OpSize;
Evan Chengd160d482005-12-12 21:54:05 +00001639 def SUB32mi8 : Ii8<0x83, MRM5m, (ops i32mem:$dst, i32i8imm :$src2),
1640 "sub{l} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001641 [(store (sub (load addr:$dst), i32immSExt8:$src2), addr:$dst)]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001642}
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001643
Chris Lattner3a173df2004-10-03 20:35:00 +00001644def SBB32rr : I<0x19, MRMDestReg, (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001645 "sbb{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattnerd93d3b02004-10-06 04:01:02 +00001646
Chris Lattner57a02302004-08-11 04:31:00 +00001647let isTwoAddress = 0 in {
Chris Lattner3a173df2004-10-03 20:35:00 +00001648 def SBB32mr : I<0x19, MRMDestMem, (ops i32mem:$dst, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001649 "sbb{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattnerd93d3b02004-10-06 04:01:02 +00001650 def SBB8mi : Ii32<0x80, MRM3m, (ops i8mem:$dst, i8imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001651 "sbb{b} {$src2, $dst|$dst, $src2}", []>;
Chris Lattnerd93d3b02004-10-06 04:01:02 +00001652 def SBB16mi : Ii32<0x81, MRM3m, (ops i16mem:$dst, i16imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001653 "sbb{w} {$src2, $dst|$dst, $src2}", []>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001654 def SBB32mi : Ii32<0x81, MRM3m, (ops i32mem:$dst, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001655 "sbb{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattnerd93d3b02004-10-06 04:01:02 +00001656 def SBB16mi8 : Ii8<0x83, MRM3m, (ops i16mem:$dst, i8imm :$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001657 "sbb{w} {$src2, $dst|$dst, $src2}", []>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001658 def SBB32mi8 : Ii8<0x83, MRM3m, (ops i32mem:$dst, i8imm :$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001659 "sbb{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner57a02302004-08-11 04:31:00 +00001660}
Chris Lattnerd93d3b02004-10-06 04:01:02 +00001661def SBB8ri : Ii8<0x80, MRM3r, (ops R8:$dst, R8:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001662 "sbb{b} {$src2, $dst|$dst, $src2}", []>;
Chris Lattnerd93d3b02004-10-06 04:01:02 +00001663def SBB16ri : Ii16<0x81, MRM3r, (ops R16:$dst, R16:$src1, i16imm:$src2),
Chris Lattner78432fe2005-11-17 02:01:55 +00001664 "sbb{w} {$src2, $dst|$dst, $src2}", []>, OpSize;
Chris Lattnerd93d3b02004-10-06 04:01:02 +00001665
Chris Lattner57a02302004-08-11 04:31:00 +00001666def SBB32rm : I<0x1B, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001667 "sbb{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattner36b68902004-08-10 21:21:30 +00001668def SBB32ri : Ii32<0x81, MRM3r, (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001669 "sbb{l} {$src2, $dst|$dst, $src2}", []>;
Chris Lattnerd93d3b02004-10-06 04:01:02 +00001670
Chris Lattner09c750f2004-10-06 14:31:50 +00001671def SBB16ri8 : Ii8<0x83, MRM3r, (ops R16:$dst, R16:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001672 "sbb{w} {$src2, $dst|$dst, $src2}", []>, OpSize;
Chris Lattner36b68902004-08-10 21:21:30 +00001673def SBB32ri8 : Ii8<0x83, MRM3r, (ops R32:$dst, R32:$src1, i8imm:$src2),
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001674 "sbb{l} {$src2, $dst|$dst, $src2}", []>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001675
Chris Lattner10197ff2005-01-03 01:27:59 +00001676let isCommutable = 1 in { // X = IMUL Y, Z --> X = IMUL Z, Y
Chris Lattner3a173df2004-10-03 20:35:00 +00001677def IMUL16rr : I<0xAF, MRMSrcReg, (ops R16:$dst, R16:$src1, R16:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001678 "imul{w} {$src2, $dst|$dst, $src2}",
1679 [(set R16:$dst, (mul R16:$src1, R16:$src2))]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001680def IMUL32rr : I<0xAF, MRMSrcReg, (ops R32:$dst, R32:$src1, R32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00001681 "imul{l} {$src2, $dst|$dst, $src2}",
1682 [(set R32:$dst, (mul R32:$src1, R32:$src2))]>, TB;
Chris Lattner10197ff2005-01-03 01:27:59 +00001683}
Chris Lattner3a173df2004-10-03 20:35:00 +00001684def IMUL16rm : I<0xAF, MRMSrcMem, (ops R16:$dst, R16:$src1, i16mem:$src2),
Evan Chengf281e022005-12-12 23:47:46 +00001685 "imul{w} {$src2, $dst|$dst, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001686 [(set R16:$dst, (mul R16:$src1, (load addr:$src2)))]>,
1687 TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001688def IMUL32rm : I<0xAF, MRMSrcMem, (ops R32:$dst, R32:$src1, i32mem:$src2),
Evan Chengf281e022005-12-12 23:47:46 +00001689 "imul{l} {$src2, $dst|$dst, $src2}",
1690 [(set R32:$dst, (mul R32:$src1, (load addr:$src2)))]>, TB;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001691
1692} // end Two Address instructions
1693
Chris Lattnerf5d3a832004-08-11 05:31:07 +00001694// Suprisingly enough, these are not two address instructions!
Chris Lattner3a173df2004-10-03 20:35:00 +00001695def IMUL16rri : Ii16<0x69, MRMSrcReg, // R16 = R16*I16
1696 (ops R16:$dst, R16:$src1, i16imm:$src2),
Chris Lattner78432fe2005-11-17 02:01:55 +00001697 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Chengf281e022005-12-12 23:47:46 +00001698 [(set R16:$dst, (mul R16:$src1, imm:$src2))]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001699def IMUL32rri : Ii32<0x69, MRMSrcReg, // R32 = R32*I32
1700 (ops R32:$dst, R32:$src1, i32imm:$src2),
Chris Lattner7a125372005-11-16 22:59:19 +00001701 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
1702 [(set R32:$dst, (mul R32:$src1, imm:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001703def IMUL16rri8 : Ii8<0x6B, MRMSrcReg, // R16 = R16*I8
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001704 (ops R16:$dst, R16:$src1, i16i8imm:$src2),
1705 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001706 [(set R16:$dst, (mul R16:$src1, i16immSExt8:$src2))]>,
1707 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001708def IMUL32rri8 : Ii8<0x6B, MRMSrcReg, // R32 = R32*I8
Chris Lattnerf124d5e2005-11-18 01:04:42 +00001709 (ops R32:$dst, R32:$src1, i32i8imm:$src2),
1710 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001711 [(set R32:$dst, (mul R32:$src1, i32immSExt8:$src2))]>;
Chris Lattnerf5d3a832004-08-11 05:31:07 +00001712
Chris Lattner3a173df2004-10-03 20:35:00 +00001713def IMUL16rmi : Ii16<0x69, MRMSrcMem, // R16 = [mem16]*I16
Evan Chengf281e022005-12-12 23:47:46 +00001714 (ops R16:$dst, i16mem:$src1, i16imm:$src2),
1715 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
1716 [(set R16:$dst, (mul (load addr:$src1), imm:$src2))]>,
1717 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001718def IMUL32rmi : Ii32<0x69, MRMSrcMem, // R32 = [mem32]*I32
1719 (ops R32:$dst, i32mem:$src1, i32imm:$src2),
Evan Chengf281e022005-12-12 23:47:46 +00001720 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
1721 [(set R32:$dst, (mul (load addr:$src1), imm:$src2))]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001722def IMUL16rmi8 : Ii8<0x6B, MRMSrcMem, // R16 = [mem16]*I8
Evan Chengf281e022005-12-12 23:47:46 +00001723 (ops R16:$dst, i16mem:$src1, i16i8imm :$src2),
1724 "imul{w} {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001725 [(set R16:$dst, (mul (load addr:$src1), i16immSExt8:$src2))]>,
1726 OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001727def IMUL32rmi8 : Ii8<0x6B, MRMSrcMem, // R32 = [mem32]*I8
Evan Chengf281e022005-12-12 23:47:46 +00001728 (ops R32:$dst, i32mem:$src1, i32i8imm: $src2),
1729 "imul{l} {$src2, $src1, $dst|$dst, $src1, $src2}",
Evan Cheng9b6b6422005-12-13 00:14:11 +00001730 [(set R32:$dst, (mul (load addr:$src1), i32immSExt8:$src2))]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001731
1732//===----------------------------------------------------------------------===//
1733// Test instructions are just like AND, except they don't generate a result.
Chris Lattner3a173df2004-10-03 20:35:00 +00001734//
Chris Lattnercc65bee2005-01-02 02:35:46 +00001735let isCommutable = 1 in { // TEST X, Y --> TEST Y, X
Chris Lattner36b68902004-08-10 21:21:30 +00001736def TEST8rr : I<0x84, MRMDestReg, (ops R8:$src1, R8:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001737 "test{b} {$src2, $src1|$src1, $src2}",
1738 [(set STATUS, (X86test R8:$src1, R8:$src2))]>,
1739 Imp<[],[STATUS]>;
Chris Lattner36b68902004-08-10 21:21:30 +00001740def TEST16rr : I<0x85, MRMDestReg, (ops R16:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001741 "test{w} {$src2, $src1|$src1, $src2}",
1742 [(set STATUS, (X86test R16:$src1, R16:$src2))]>,
1743 Imp<[],[STATUS]>, OpSize;
Chris Lattner36b68902004-08-10 21:21:30 +00001744def TEST32rr : I<0x85, MRMDestReg, (ops R32:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001745 "test{l} {$src2, $src1|$src1, $src2}",
1746 [(set STATUS, (X86test R32:$src1, R32:$src2))]>,
1747 Imp<[],[STATUS]>;
Chris Lattnercc65bee2005-01-02 02:35:46 +00001748}
Chris Lattner57a02302004-08-11 04:31:00 +00001749def TEST8mr : I<0x84, MRMDestMem, (ops i8mem :$src1, R8 :$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001750 "test{b} {$src2, $src1|$src1, $src2}",
1751 [(set STATUS, (X86test (loadi8 addr:$src1), R8:$src2))]>,
1752 Imp<[],[STATUS]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001753def TEST16mr : I<0x85, MRMDestMem, (ops i16mem:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001754 "test{w} {$src2, $src1|$src1, $src2}",
1755 [(set STATUS, (X86test (loadi16 addr:$src1), R16:$src2))]>,
1756 Imp<[],[STATUS]>, OpSize;
Chris Lattner57a02302004-08-11 04:31:00 +00001757def TEST32mr : I<0x85, MRMDestMem, (ops i32mem:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001758 "test{l} {$src2, $src1|$src1, $src2}",
1759 [(set STATUS, (X86test (loadi32 addr:$src1), R32:$src2))]>,
1760 Imp<[],[STATUS]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001761def TEST8rm : I<0x84, MRMSrcMem, (ops R8 :$src1, i8mem :$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001762 "test{b} {$src2, $src1|$src1, $src2}",
1763 [(set STATUS, (X86test R8:$src1, (loadi8 addr:$src2)))]>,
1764 Imp<[],[STATUS]>;
Chris Lattner57a02302004-08-11 04:31:00 +00001765def TEST16rm : I<0x85, MRMSrcMem, (ops R16:$src1, i16mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001766 "test{w} {$src2, $src1|$src1, $src2}",
1767 [(set STATUS, (X86test R16:$src1, (loadi16 addr:$src2)))]>,
1768 Imp<[],[STATUS]>, OpSize;
Chris Lattner57a02302004-08-11 04:31:00 +00001769def TEST32rm : I<0x85, MRMSrcMem, (ops R32:$src1, i32mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001770 "test{l} {$src2, $src1|$src1, $src2}",
1771 [(set STATUS, (X86test R32:$src1, (loadi32 addr:$src2)))]>,
1772 Imp<[],[STATUS]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001773
Chris Lattner707c6fe2004-10-04 01:38:10 +00001774def TEST8ri : Ii8 <0xF6, MRM0r, // flags = R8 & imm8
1775 (ops R8:$src1, i8imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001776 "test{b} {$src2, $src1|$src1, $src2}",
1777 [(set STATUS, (X86test R8:$src1, imm:$src2))]>,
1778 Imp<[],[STATUS]>;
Chris Lattner707c6fe2004-10-04 01:38:10 +00001779def TEST16ri : Ii16<0xF7, MRM0r, // flags = R16 & imm16
1780 (ops R16:$src1, i16imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001781 "test{w} {$src2, $src1|$src1, $src2}",
1782 [(set STATUS, (X86test R16:$src1, imm:$src2))]>,
1783 Imp<[],[STATUS]>, OpSize;
Chris Lattner707c6fe2004-10-04 01:38:10 +00001784def TEST32ri : Ii32<0xF7, MRM0r, // flags = R32 & imm32
1785 (ops R32:$src1, i32imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001786 "test{l} {$src2, $src1|$src1, $src2}",
1787 [(set STATUS, (X86test R32:$src1, imm:$src2))]>,
1788 Imp<[],[STATUS]>;
Chris Lattner707c6fe2004-10-04 01:38:10 +00001789def TEST8mi : Ii8 <0xF6, MRM0m, // flags = [mem8] & imm8
Evan Chengaed7c722005-12-17 01:24:02 +00001790 (ops i8mem:$src1, i8imm:$src2),
1791 "test{b} {$src2, $src1|$src1, $src2}",
1792 [(set STATUS, (X86test (loadi8 addr:$src1), imm:$src2))]>,
1793 Imp<[],[STATUS]>;
Chris Lattner707c6fe2004-10-04 01:38:10 +00001794def TEST16mi : Ii16<0xF7, MRM0m, // flags = [mem16] & imm16
1795 (ops i16mem:$src1, i16imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001796 "test{w} {$src2, $src1|$src1, $src2}",
1797 [(set STATUS, (X86test (loadi16 addr:$src1), imm:$src2))]>,
1798 Imp<[],[STATUS]>, OpSize;
Chris Lattner707c6fe2004-10-04 01:38:10 +00001799def TEST32mi : Ii32<0xF7, MRM0m, // flags = [mem32] & imm32
1800 (ops i32mem:$src1, i32imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001801 "test{l} {$src2, $src1|$src1, $src2}",
1802 [(set STATUS, (X86test (loadi32 addr:$src1), imm:$src2))]>,
1803 Imp<[],[STATUS]>;
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001804
1805
1806// Condition code ops, incl. set if equal/not equal/...
Evan Chengf0701842005-11-29 19:38:52 +00001807def SAHF : I<0x9E, RawFrm, (ops), "sahf", []>, Imp<[AH],[]>; // flags = AH
1808def LAHF : I<0x9F, RawFrm, (ops), "lahf", []>, Imp<[],[AH]>; // AH = flags
Alkis Evlogimenos5ab29b52004-02-28 22:02:05 +00001809
Chris Lattner3a173df2004-10-03 20:35:00 +00001810def SETEr : I<0x94, MRM0r,
Chris Lattner9fb24222005-12-21 05:34:58 +00001811 (ops R8 :$dst),
Evan Chengd5781fc2005-12-21 20:21:51 +00001812 "sete $dst", [(set R8:$dst, (X86SetCC SETEQ, STATUS))]>,
1813 TB; // R8 = ==
Chris Lattner3a173df2004-10-03 20:35:00 +00001814def SETEm : I<0x94, MRM0m,
Chris Lattner9fb24222005-12-21 05:34:58 +00001815 (ops i8mem:$dst),
Evan Chengd5781fc2005-12-21 20:21:51 +00001816 "sete $dst", [(store (X86SetCC SETEQ, STATUS), addr:$dst)]>,
1817 TB; // [mem8] = ==
Chris Lattner3a173df2004-10-03 20:35:00 +00001818def SETNEr : I<0x95, MRM0r,
Chris Lattner9fb24222005-12-21 05:34:58 +00001819 (ops R8 :$dst),
Evan Chengd5781fc2005-12-21 20:21:51 +00001820 "setne $dst", [(set R8:$dst, (X86SetCC SETNE, STATUS))]>,
1821 TB; // R8 = !=
Chris Lattner3a173df2004-10-03 20:35:00 +00001822def SETNEm : I<0x95, MRM0m,
Chris Lattner9fb24222005-12-21 05:34:58 +00001823 (ops i8mem:$dst),
Evan Chengd5781fc2005-12-21 20:21:51 +00001824 "setne $dst", [(store (X86SetCC SETNE, STATUS), addr:$dst)]>,
1825 TB; // [mem8] = !=
1826def SETLr : I<0x9C, MRM0r,
1827 (ops R8 :$dst),
1828 "setl $dst", [(set R8:$dst, (X86SetCC SETLT, STATUS))]>,
1829 TB; // R8 = < signed
1830def SETLm : I<0x9C, MRM0m,
1831 (ops i8mem:$dst),
1832 "setl $dst", [(store (X86SetCC SETLT, STATUS), addr:$dst)]>,
1833 TB; // [mem8] = < signed
1834def SETGEr : I<0x9D, MRM0r,
1835 (ops R8 :$dst),
1836 "setge $dst", [(set R8:$dst, (X86SetCC SETGE, STATUS))]>,
1837 TB; // R8 = >= signed
1838def SETGEm : I<0x9D, MRM0m,
1839 (ops i8mem:$dst),
1840 "setge $dst", [(store (X86SetCC SETGE, STATUS), addr:$dst)]>,
1841 TB; // [mem8] = >= signed
1842def SETLEr : I<0x9E, MRM0r,
1843 (ops R8 :$dst),
1844 "setle $dst", [(set R8:$dst, (X86SetCC SETLE, STATUS))]>,
1845 TB; // R8 = <= signed
1846def SETLEm : I<0x9E, MRM0m,
1847 (ops i8mem:$dst),
1848 "setle $dst", [(store (X86SetCC SETLE, STATUS), addr:$dst)]>,
1849 TB; // [mem8] = <= signed
1850def SETGr : I<0x9F, MRM0r,
1851 (ops R8 :$dst),
1852 "setg $dst", [(set R8:$dst, (X86SetCC SETGT, STATUS))]>,
1853 TB; // R8 = > signed
1854def SETGm : I<0x9F, MRM0m,
1855 (ops i8mem:$dst),
1856 "setg $dst", [(store (X86SetCC SETGT, STATUS), addr:$dst)]>,
1857 TB; // [mem8] = > signed
1858
1859def SETBr : I<0x92, MRM0r,
1860 (ops R8 :$dst),
1861 "setb $dst", [(set R8:$dst, (X86SetCC SETULT, STATUS))]>,
1862 TB; // R8 = < unsign
1863def SETBm : I<0x92, MRM0m,
1864 (ops i8mem:$dst),
1865 "setb $dst", [(store (X86SetCC SETULT, STATUS), addr:$dst)]>,
1866 TB; // [mem8] = < unsign
1867def SETAEr : I<0x93, MRM0r,
1868 (ops R8 :$dst),
1869 "setae $dst", [(set R8:$dst, (X86SetCC SETUGE, STATUS))]>,
1870 TB; // R8 = >= unsign
1871def SETAEm : I<0x93, MRM0m,
1872 (ops i8mem:$dst),
1873 "setae $dst", [(store (X86SetCC SETUGE, STATUS), addr:$dst)]>,
1874 TB; // [mem8] = >= unsign
Chris Lattner3a173df2004-10-03 20:35:00 +00001875def SETBEr : I<0x96, MRM0r,
Chris Lattner9fb24222005-12-21 05:34:58 +00001876 (ops R8 :$dst),
Evan Chengd5781fc2005-12-21 20:21:51 +00001877 "setbe $dst", [(set R8:$dst, (X86SetCC SETULE, STATUS))]>,
1878 TB; // R8 = <= unsign
Chris Lattner3a173df2004-10-03 20:35:00 +00001879def SETBEm : I<0x96, MRM0m,
Chris Lattner9fb24222005-12-21 05:34:58 +00001880 (ops i8mem:$dst),
Evan Chengd5781fc2005-12-21 20:21:51 +00001881 "setbe $dst", [(store (X86SetCC SETULE, STATUS), addr:$dst)]>,
1882 TB; // [mem8] = <= unsign
Chris Lattner3a173df2004-10-03 20:35:00 +00001883def SETAr : I<0x97, MRM0r,
Chris Lattner9fb24222005-12-21 05:34:58 +00001884 (ops R8 :$dst),
Evan Chengd5781fc2005-12-21 20:21:51 +00001885 "seta $dst", [(set R8:$dst, (X86SetCC SETUGT, STATUS))]>,
1886 TB; // R8 = > signed
Chris Lattner3a173df2004-10-03 20:35:00 +00001887def SETAm : I<0x97, MRM0m,
Chris Lattner9fb24222005-12-21 05:34:58 +00001888 (ops i8mem:$dst),
Evan Chengd5781fc2005-12-21 20:21:51 +00001889 "seta $dst", [(store (X86SetCC SETUGT, STATUS), addr:$dst)]>,
1890 TB; // [mem8] = > signed
Chris Lattner3a173df2004-10-03 20:35:00 +00001891def SETSr : I<0x98, MRM0r,
Chris Lattner9fb24222005-12-21 05:34:58 +00001892 (ops R8 :$dst),
1893 "sets $dst", []>, TB; // R8 = <sign bit>
Chris Lattner3a173df2004-10-03 20:35:00 +00001894def SETSm : I<0x98, MRM0m,
Chris Lattner9fb24222005-12-21 05:34:58 +00001895 (ops i8mem:$dst),
1896 "sets $dst", []>, TB; // [mem8] = <sign bit>
Chris Lattner3a173df2004-10-03 20:35:00 +00001897def SETNSr : I<0x99, MRM0r,
Chris Lattner9fb24222005-12-21 05:34:58 +00001898 (ops R8 :$dst),
1899 "setns $dst", []>, TB; // R8 = !<sign bit>
Chris Lattner3a173df2004-10-03 20:35:00 +00001900def SETNSm : I<0x99, MRM0m,
Chris Lattner9fb24222005-12-21 05:34:58 +00001901 (ops i8mem:$dst),
1902 "setns $dst", []>, TB; // [mem8] = !<sign bit>
Chris Lattner3a173df2004-10-03 20:35:00 +00001903def SETPr : I<0x9A, MRM0r,
Chris Lattner9fb24222005-12-21 05:34:58 +00001904 (ops R8 :$dst),
1905 "setp $dst", []>, TB; // R8 = parity
Chris Lattner3a173df2004-10-03 20:35:00 +00001906def SETPm : I<0x9A, MRM0m,
Chris Lattner9fb24222005-12-21 05:34:58 +00001907 (ops i8mem:$dst),
1908 "setp $dst", []>, TB; // [mem8] = parity
Chris Lattnercc65bee2005-01-02 02:35:46 +00001909def SETNPr : I<0x9B, MRM0r,
Chris Lattner9fb24222005-12-21 05:34:58 +00001910 (ops R8 :$dst),
1911 "setnp $dst", []>, TB; // R8 = not parity
Chris Lattnercc65bee2005-01-02 02:35:46 +00001912def SETNPm : I<0x9B, MRM0m,
Chris Lattner9fb24222005-12-21 05:34:58 +00001913 (ops i8mem:$dst),
1914 "setnp $dst", []>, TB; // [mem8] = not parity
Chris Lattner1cca5e32003-08-03 21:54:21 +00001915
1916// Integer comparisons
Chris Lattner3a173df2004-10-03 20:35:00 +00001917def CMP8rr : I<0x38, MRMDestReg,
1918 (ops R8 :$src1, R8 :$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001919 "cmp{b} {$src2, $src1|$src1, $src2}",
1920 [(set STATUS, (X86cmp R8:$src1, R8:$src2))]>,
1921 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001922def CMP16rr : I<0x39, MRMDestReg,
1923 (ops R16:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001924 "cmp{w} {$src2, $src1|$src1, $src2}",
1925 [(set STATUS, (X86cmp R16:$src1, R16:$src2))]>,
1926 Imp<[],[STATUS]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001927def CMP32rr : I<0x39, MRMDestReg,
1928 (ops R32:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001929 "cmp{l} {$src2, $src1|$src1, $src2}",
1930 [(set STATUS, (X86cmp R32:$src1, R32:$src2))]>,
1931 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001932def CMP8mr : I<0x38, MRMDestMem,
1933 (ops i8mem :$src1, R8 :$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001934 "cmp{b} {$src2, $src1|$src1, $src2}",
1935 [(set STATUS, (X86cmp (loadi8 addr:$src1), R8:$src2))]>,
1936 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001937def CMP16mr : I<0x39, MRMDestMem,
1938 (ops i16mem:$src1, R16:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001939 "cmp{w} {$src2, $src1|$src1, $src2}",
1940 [(set STATUS, (X86cmp (loadi16 addr:$src1), R16:$src2))]>,
1941 Imp<[],[STATUS]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001942def CMP32mr : I<0x39, MRMDestMem,
1943 (ops i32mem:$src1, R32:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001944 "cmp{l} {$src2, $src1|$src1, $src2}",
1945 [(set STATUS, (X86cmp (loadi32 addr:$src1), R32:$src2))]>,
1946 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001947def CMP8rm : I<0x3A, MRMSrcMem,
1948 (ops R8 :$src1, i8mem :$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001949 "cmp{b} {$src2, $src1|$src1, $src2}",
1950 [(set STATUS, (X86cmp R8:$src1, (loadi8 addr:$src2)))]>,
1951 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001952def CMP16rm : I<0x3B, MRMSrcMem,
1953 (ops R16:$src1, i16mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001954 "cmp{w} {$src2, $src1|$src1, $src2}",
1955 [(set STATUS, (X86cmp R16:$src1, (loadi16 addr:$src2)))]>,
1956 Imp<[],[STATUS]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001957def CMP32rm : I<0x3B, MRMSrcMem,
1958 (ops R32:$src1, i32mem:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001959 "cmp{l} {$src2, $src1|$src1, $src2}",
1960 [(set STATUS, (X86cmp R32:$src1, (loadi32 addr:$src2)))]>,
1961 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001962def CMP8ri : Ii8<0x80, MRM7r,
Evan Chengaed7c722005-12-17 01:24:02 +00001963 (ops R8:$src1, i8imm:$src2),
1964 "cmp{b} {$src2, $src1|$src1, $src2}",
1965 [(set STATUS, (X86cmp R8:$src1, imm:$src2))]>,
1966 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001967def CMP16ri : Ii16<0x81, MRM7r,
1968 (ops R16:$src1, i16imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001969 "cmp{w} {$src2, $src1|$src1, $src2}",
1970 [(set STATUS, (X86cmp R16:$src1, imm:$src2))]>,
1971 Imp<[],[STATUS]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001972def CMP32ri : Ii32<0x81, MRM7r,
1973 (ops R32:$src1, i32imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001974 "cmp{l} {$src2, $src1|$src1, $src2}",
1975 [(set STATUS, (X86cmp R32:$src1, imm:$src2))]>,
1976 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001977def CMP8mi : Ii8 <0x80, MRM7m,
1978 (ops i8mem :$src1, i8imm :$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001979 "cmp{b} {$src2, $src1|$src1, $src2}",
1980 [(set STATUS, (X86cmp (loadi8 addr:$src1), imm:$src2))]>,
1981 Imp<[],[STATUS]>;
Chris Lattner3a173df2004-10-03 20:35:00 +00001982def CMP16mi : Ii16<0x81, MRM7m,
1983 (ops i16mem:$src1, i16imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001984 "cmp{w} {$src2, $src1|$src1, $src2}",
1985 [(set STATUS, (X86cmp (loadi16 addr:$src1), imm:$src2))]>,
1986 Imp<[],[STATUS]>, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001987def CMP32mi : Ii32<0x81, MRM7m,
1988 (ops i32mem:$src1, i32imm:$src2),
Evan Chengaed7c722005-12-17 01:24:02 +00001989 "cmp{l} {$src2, $src1|$src1, $src2}",
1990 [(set STATUS, (X86cmp (loadi32 addr:$src1), imm:$src2))]>,
1991 Imp<[],[STATUS]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +00001992
1993// Sign/Zero extenders
Chris Lattner3a173df2004-10-03 20:35:00 +00001994def MOVSX16rr8 : I<0xBE, MRMSrcReg, (ops R16:$dst, R8 :$src),
Evan Chengf0701842005-11-29 19:38:52 +00001995 "movs{bw|x} {$src, $dst|$dst, $src}",
1996 [(set R16:$dst, (sext R8:$src))]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00001997def MOVSX16rm8 : I<0xBE, MRMSrcMem, (ops R16:$dst, i8mem :$src),
Evan Cheng7a7e8372005-12-14 02:22:27 +00001998 "movs{bw|x} {$src, $dst|$dst, $src}",
1999 [(set R16:$dst, (sextloadi16i8 addr:$src))]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00002000def MOVSX32rr8 : I<0xBE, MRMSrcReg, (ops R32:$dst, R8 :$src),
Evan Chengf0701842005-11-29 19:38:52 +00002001 "movs{bl|x} {$src, $dst|$dst, $src}",
2002 [(set R32:$dst, (sext R8:$src))]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +00002003def MOVSX32rm8 : I<0xBE, MRMSrcMem, (ops R32:$dst, i8mem :$src),
Evan Cheng7a7e8372005-12-14 02:22:27 +00002004 "movs{bl|x} {$src, $dst|$dst, $src}",
2005 [(set R32:$dst, (sextloadi32i8 addr:$src))]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +00002006def MOVSX32rr16: I<0xBF, MRMSrcReg, (ops R32:$dst, R16:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002007 "movs{wl|x} {$src, $dst|$dst, $src}",
2008 [(set R32:$dst, (sext R16:$src))]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +00002009def MOVSX32rm16: I<0xBF, MRMSrcMem, (ops R32:$dst, i16mem:$src),
Evan Cheng7a7e8372005-12-14 02:22:27 +00002010 "movs{wl|x} {$src, $dst|$dst, $src}",
2011 [(set R32:$dst, (sextloadi32i16 addr:$src))]>, TB;
Alkis Evlogimenosa7be9822004-02-17 09:14:23 +00002012
Chris Lattner3a173df2004-10-03 20:35:00 +00002013def MOVZX16rr8 : I<0xB6, MRMSrcReg, (ops R16:$dst, R8 :$src),
Evan Chengf0701842005-11-29 19:38:52 +00002014 "movz{bw|x} {$src, $dst|$dst, $src}",
2015 [(set R16:$dst, (zext R8:$src))]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00002016def MOVZX16rm8 : I<0xB6, MRMSrcMem, (ops R16:$dst, i8mem :$src),
Evan Cheng7a7e8372005-12-14 02:22:27 +00002017 "movz{bw|x} {$src, $dst|$dst, $src}",
2018 [(set R16:$dst, (zextloadi16i8 addr:$src))]>, TB, OpSize;
Chris Lattner3a173df2004-10-03 20:35:00 +00002019def MOVZX32rr8 : I<0xB6, MRMSrcReg, (ops R32:$dst, R8 :$src),
Evan Chengf0701842005-11-29 19:38:52 +00002020 "movz{bl|x} {$src, $dst|$dst, $src}",
2021 [(set R32:$dst, (zext R8:$src))]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +00002022def MOVZX32rm8 : I<0xB6, MRMSrcMem, (ops R32:$dst, i8mem :$src),
Evan Cheng7a7e8372005-12-14 02:22:27 +00002023 "movz{bl|x} {$src, $dst|$dst, $src}",
2024 [(set R32:$dst, (zextloadi32i8 addr:$src))]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +00002025def MOVZX32rr16: I<0xB7, MRMSrcReg, (ops R32:$dst, R16:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002026 "movz{wl|x} {$src, $dst|$dst, $src}",
2027 [(set R32:$dst, (zext R16:$src))]>, TB;
Chris Lattner3a173df2004-10-03 20:35:00 +00002028def MOVZX32rm16: I<0xB7, MRMSrcMem, (ops R32:$dst, i16mem:$src),
Evan Cheng7a7e8372005-12-14 02:22:27 +00002029 "movz{wl|x} {$src, $dst|$dst, $src}",
2030 [(set R32:$dst, (zextloadi32i16 addr:$src))]>, TB;
2031
2032// Handling 1 bit zextload and sextload
2033def : Pat<(sextloadi16i1 addr:$src), (MOVSX16rm8 addr:$src)>;
2034def : Pat<(sextloadi32i1 addr:$src), (MOVSX32rm8 addr:$src)>;
2035def : Pat<(zextloadi16i1 addr:$src), (MOVZX16rm8 addr:$src)>;
2036def : Pat<(zextloadi32i1 addr:$src), (MOVZX32rm8 addr:$src)>;
Chris Lattner1cca5e32003-08-03 21:54:21 +00002037
Evan Chengcb17bac2005-12-15 19:49:23 +00002038// Handling 1 bit extload
2039def : Pat<(extloadi8i1 addr:$src), (MOV8rm addr:$src)>;
2040
Evan Cheng1aabc4e2005-12-17 01:47:57 +00002041// Modeling anyext as zext
2042def : Pat<(i16 (anyext R8 :$src)), (MOVZX16rr8 R8 :$src)>;
2043def : Pat<(i32 (anyext R8 :$src)), (MOVZX32rr8 R8 :$src)>;
2044def : Pat<(i32 (anyext R16:$src)), (MOVZX32rr16 R16:$src)>;
2045
Nate Begemanf1702ac2005-06-27 21:20:31 +00002046//===----------------------------------------------------------------------===//
2047// XMM Floating point support (requires SSE2)
2048//===----------------------------------------------------------------------===//
2049
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002050def MOVSSrr : I<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002051 "movss {$src, $dst|$dst, $src}", []>, XS;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002052def MOVSDrr : I<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002053 "movsd {$src, $dst|$dst, $src}", []>, XD;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002054
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002055def MOVSSrm : I<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
2056 "movss {$src, $dst|$dst, $src}",
2057 [(set FR32:$dst, (loadf32 addr:$src))]>,
2058 Requires<[HasSSE2]>, XS;
2059def MOVSSmr : I<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src),
2060 "movss {$src, $dst|$dst, $src}",
2061 [(store FR32:$src, addr:$dst)]>, XS;
2062def MOVSDrm : I<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
2063 "movsd {$src, $dst|$dst, $src}",
2064 [(set FR64:$dst, (loadf64 addr:$src))]>,
2065 Requires<[HasSSE2]>, XD;
2066def MOVSDmr : I<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src),
2067 "movsd {$src, $dst|$dst, $src}",
2068 [(store FR64:$src, addr:$dst)]>,
2069 Requires<[HasSSE2]>, XD;
2070
2071def CVTTSD2SIrr: I<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002072 "cvttsd2si {$src, $dst|$dst, $src}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002073 [(set R32:$dst, (fp_to_sint FR64:$src))]>,
2074 Requires<[HasSSE2]>, XD;
Nate Begeman16b04f32005-07-15 00:38:55 +00002075def CVTTSD2SIrm: I<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src),
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002076 "cvttsd2si {$src, $dst|$dst, $src}",
2077 [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>,
2078 Requires<[HasSSE2]>, XD;
2079def CVTTSS2SIrr: I<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002080 "cvttss2si {$src, $dst|$dst, $src}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002081 [(set R32:$dst, (fp_to_sint FR32:$src))]>,
2082 Requires<[HasSSE2]>, XS;
Nate Begeman16b04f32005-07-15 00:38:55 +00002083def CVTTSS2SIrm: I<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src),
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002084 "cvttss2si {$src, $dst|$dst, $src}",
2085 [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>,
2086 Requires<[HasSSE2]>, XS;
2087def CVTSD2SSrr: I<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002088 "cvtsd2ss {$src, $dst|$dst, $src}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002089 [(set FR32:$dst, (fround FR64:$src))]>,
2090 Requires<[HasSSE2]>, XS;
2091def CVTSD2SSrm: I<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src),
2092 "cvtsd2ss {$src, $dst|$dst, $src}",
2093 [(set FR32:$dst, (fround (loadf64 addr:$src)))]>,
2094 Requires<[HasSSE2]>, XS;
2095def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002096 "cvtss2sd {$src, $dst|$dst, $src}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002097 [(set FR64:$dst, (fextend FR32:$src))]>,
2098 Requires<[HasSSE2]>, XD;
2099def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src),
2100 "cvtss2sd {$src, $dst|$dst, $src}",
2101 [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>,
2102 Requires<[HasSSE2]>, XD;
2103def CVTSI2SSrr: I<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002104 "cvtsi2ss {$src, $dst|$dst, $src}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002105 [(set FR32:$dst, (sint_to_fp R32:$src))]>,
2106 Requires<[HasSSE2]>, XS;
2107def CVTSI2SSrm: I<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src),
2108 "cvtsi2ss {$src, $dst|$dst, $src}",
2109 [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>,
2110 Requires<[HasSSE2]>, XS;
2111def CVTSI2SDrr: I<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002112 "cvtsi2sd {$src, $dst|$dst, $src}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002113 [(set FR64:$dst, (sint_to_fp R32:$src))]>,
2114 Requires<[HasSSE2]>, XD;
2115def CVTSI2SDrm: I<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src),
2116 "cvtsi2sd {$src, $dst|$dst, $src}",
2117 [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>,
2118 Requires<[HasSSE2]>, XD;
Nate Begemanf63be7d2005-07-06 18:59:04 +00002119
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002120def SQRTSSrm : I<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002121 "sqrtss {$src, $dst|$dst, $src}", []>, XS;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002122def SQRTSSrr : I<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002123 "sqrtss {$src, $dst|$dst, $src}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002124 [(set FR32:$dst, (fsqrt FR32:$src))]>, XS;
2125def SQRTSDrm : I<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002126 "sqrtsd {$src, $dst|$dst, $src}", []>, XD;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002127def SQRTSDrr : I<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002128 "sqrtsd {$src, $dst|$dst, $src}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002129 [(set FR64:$dst, (fsqrt FR64:$src))]>, XD;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002130
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002131def UCOMISDrr: I<0x2E, MRMSrcReg, (ops FR64:$dst, FR64:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002132 "ucomisd {$src, $dst|$dst, $src}", []>, TB, OpSize;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002133def UCOMISDrm: I<0x2E, MRMSrcMem, (ops FR64:$dst, f64mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002134 "ucomisd {$src, $dst|$dst, $src}", []>, TB, OpSize;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002135def UCOMISSrr: I<0x2E, MRMSrcReg, (ops FR32:$dst, FR32:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002136 "ucomiss {$src, $dst|$dst, $src}", []>, TB;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002137def UCOMISSrm: I<0x2E, MRMSrcMem, (ops FR32:$dst, f32mem:$src),
Evan Chengf0701842005-11-29 19:38:52 +00002138 "ucomiss {$src, $dst|$dst, $src}", []>, TB;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002139
Evan Chengf0701842005-11-29 19:38:52 +00002140// Pseudo-instructions that map fld0 to xorps/xorpd for sse.
Nate Begeman1c73c7b2005-08-03 23:26:28 +00002141// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002142def FLD0SS : I<0x57, MRMSrcReg, (ops FR32:$dst),
Evan Chengf0701842005-11-29 19:38:52 +00002143 "xorps $dst, $dst", []>, TB;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002144def FLD0SD : I<0x57, MRMSrcReg, (ops FR64:$dst),
Evan Chengf0701842005-11-29 19:38:52 +00002145 "xorpd $dst, $dst", []>, TB, OpSize;
Nate Begeman1c73c7b2005-08-03 23:26:28 +00002146
Nate Begemanf1702ac2005-06-27 21:20:31 +00002147let isTwoAddress = 1 in {
2148let isCommutable = 1 in {
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002149def ADDSSrr : I<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002150 "addss {$src2, $dst|$dst, $src2}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002151 [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>, XS;
2152def ADDSDrr : I<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002153 "addsd {$src2, $dst|$dst, $src2}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002154 [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>, XD;
2155def ANDPSrr : I<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002156 "andps {$src2, $dst|$dst, $src2}", []>, TB;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002157def ANDPDrr : I<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002158 "andpd {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002159def MULSSrr : I<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002160 "mulss {$src2, $dst|$dst, $src2}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002161 [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>, XS;
2162def MULSDrr : I<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002163 "mulsd {$src2, $dst|$dst, $src2}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002164 [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>, XD;
2165def ORPSrr : I<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002166 "orps {$src2, $dst|$dst, $src2}", []>, TB;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002167def ORPDrr : I<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002168 "orpd {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002169def XORPSrr : I<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002170 "xorps {$src2, $dst|$dst, $src2}", []>, TB;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002171def XORPDrr : I<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002172 "xorpd {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002173}
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002174def ANDNPSrr : I<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002175 "andnps {$src2, $dst|$dst, $src2}", []>, TB;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002176def ANDNPDrr : I<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002177 "andnpd {$src2, $dst|$dst, $src2}", []>, TB, OpSize;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002178def ADDSSrm : I<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002179 "addss {$src2, $dst|$dst, $src2}", []>, XS;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002180def ADDSDrm : I<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002181 "addsd {$src2, $dst|$dst, $src2}", []>, XD;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002182def MULSSrm : I<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002183 "mulss {$src2, $dst|$dst, $src2}", []>, XS;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002184def MULSDrm : I<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002185 "mulsd {$src2, $dst|$dst, $src2}", []>, XD;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002186
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002187def DIVSSrm : I<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002188 "divss {$src2, $dst|$dst, $src2}", []>, XS;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002189def DIVSSrr : I<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002190 "divss {$src2, $dst|$dst, $src2}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002191 [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>, XS;
2192def DIVSDrm : I<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002193 "divsd {$src2, $dst|$dst, $src2}", []>, XD;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002194def DIVSDrr : I<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002195 "divsd {$src2, $dst|$dst, $src2}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002196 [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>, XD;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002197
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002198def SUBSSrm : I<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002199 "subss {$src2, $dst|$dst, $src2}", []>, XS;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002200def SUBSSrr : I<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002201 "subss {$src2, $dst|$dst, $src2}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002202 [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>, XS;
2203def SUBSDrm : I<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002204 "subsd {$src2, $dst|$dst, $src2}", []>, XD;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002205def SUBSDrr : I<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2),
Evan Chengf0701842005-11-29 19:38:52 +00002206 "subsd {$src2, $dst|$dst, $src2}",
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002207 [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>, XD;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002208
2209def CMPSSrr : I<0xC2, MRMSrcReg,
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002210 (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc),
Evan Chengf0701842005-11-29 19:38:52 +00002211 "cmp${cc}ss {$src, $dst|$dst, $src}", []>, XS;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002212def CMPSSrm : I<0xC2, MRMSrcMem,
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002213 (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc),
Evan Chengf0701842005-11-29 19:38:52 +00002214 "cmp${cc}ss {$src, $dst|$dst, $src}", []>, XS;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002215def CMPSDrr : I<0xC2, MRMSrcReg,
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002216 (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc),
Evan Chengf0701842005-11-29 19:38:52 +00002217 "cmp${cc}sd {$src, $dst|$dst, $src}", []>, XD;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002218def CMPSDrm : I<0xC2, MRMSrcMem,
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002219 (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc),
Evan Chengf0701842005-11-29 19:38:52 +00002220 "cmp${cc}sd {$src, $dst|$dst, $src}", []>, XD;
Nate Begemanf1702ac2005-06-27 21:20:31 +00002221}
Chris Lattner1cca5e32003-08-03 21:54:21 +00002222
2223//===----------------------------------------------------------------------===//
Chris Lattner441b2232005-11-20 22:13:18 +00002224// Miscellaneous Instructions
2225//===----------------------------------------------------------------------===//
2226
Evan Chengf0701842005-11-29 19:38:52 +00002227def RDTSC : I<0x31, RawFrm, (ops), "rdtsc", []>, TB, Imp<[],[EAX,EDX]>;
Chris Lattner441b2232005-11-20 22:13:18 +00002228
2229
2230//===----------------------------------------------------------------------===//
Chris Lattnerc515ad12005-12-21 07:50:26 +00002231// Floating Point Stack Support
Chris Lattner1cca5e32003-08-03 21:54:21 +00002232//===----------------------------------------------------------------------===//
2233
Chris Lattner58fe4592005-12-21 07:47:04 +00002234// Floating point support. All FP Stack operations are represented with two
2235// instructions here. The first instruction, generated by the instruction
2236// selector, uses "RFP" registers: a traditional register file to reference
2237// floating point values. These instructions are all psuedo instructions and
2238// use the "Fp" prefix. The second instruction is defined with FPI, which is
2239// the actual instruction emitted by the assembler. The FP stackifier pass
2240// converts one to the other after register allocation occurs.
2241//
2242// Note that the FpI instruction should have instruction selection info (e.g.
2243// a pattern) and the FPI instruction should have emission info (e.g. opcode
2244// encoding and asm printing info).
Chris Lattner1cca5e32003-08-03 21:54:21 +00002245
Chris Lattner58fe4592005-12-21 07:47:04 +00002246// FPI - Floating Point Instruction template.
2247class FPI<bits<8> o, Format F, dag ops, string asm> : I<o, F, ops, asm, []> {}
2248
2249// FpI - Floating Point Psuedo Instruction template.
2250class FpI<dag ops, FPFormat fp, list<dag> pattern>
2251 : X86Inst<0, Pseudo, NoImm, ops, ""> {
Chris Lattner9795b3a2004-08-11 06:50:10 +00002252 let FPForm = fp; let FPFormBits = FPForm.Value;
Evan Chengbbc8ddb2005-12-20 22:59:51 +00002253 let Pattern = pattern;
Chris Lattner9795b3a2004-08-11 06:50:10 +00002254}
Chris Lattner1cca5e32003-08-03 21:54:21 +00002255
Chris Lattner58fe4592005-12-21 07:47:04 +00002256// Random Pseudo Instructions.
2257def FpGETRESULT : FpI<(ops RFP:$dst), SpecialFP, // FPR = ST(0)
2258 []>;
2259def FpSETRESULT : FpI<(ops RFP:$src), SpecialFP,
2260 [(X86fpset RFP:$src)]>, Imp<[], [ST0]>; // ST(0) = FPR
2261def FpMOV : FpI<(ops RFP:$dst, RFP:$src), SpecialFP,
2262 []>; // f1 = fmov f2
Chris Lattner1cca5e32003-08-03 21:54:21 +00002263
Chris Lattner58fe4592005-12-21 07:47:04 +00002264// Binary Ops with a memory source.
2265def FpADD32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2266 []>; // ST(0) = ST(0) + [mem32]
2267def FpADD64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2268 []>; // ST(0) = ST(0) + [mem32]
2269def FpMUL32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2270 []>; // ST(0) = ST(0) * [mem32]
2271def FpMUL64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2272 []>; // ST(0) = ST(0) * [mem32]
2273def FpSUB32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2274 []>; // ST(0) = ST(0) - [mem32]
2275def FpSUB64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2276 []>; // ST(0) = ST(0) - [mem32]
2277def FpSUBR32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2278 []>; // ST(0) = [mem32] - ST(0)
2279def FpSUBR64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2280 []>; // ST(0) = [mem32] - ST(0)
2281def FpDIV32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2282 []>; // ST(0) = ST(0) / [mem32]
2283def FpDIV64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2284 []>; // ST(0) = ST(0) / [mem32]
2285def FpDIVR32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2286 []>; // ST(0) = [mem32] / ST(0)
2287def FpDIVR64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW,
2288 []>; // ST(0) = [mem32] / ST(0)
2289
2290
2291def FADD32m : FPI<0xD8, MRM0m, (ops f32mem:$src), "fadd{s} $src">;
2292def FADD64m : FPI<0xDC, MRM0m, (ops f64mem:$src), "fadd{l} $src">;
2293def FMUL32m : FPI<0xD8, MRM1m, (ops f32mem:$src), "fmul{s} $src">;
2294def FMUL64m : FPI<0xDC, MRM1m, (ops f64mem:$src), "fmul{l} $src">;
2295def FSUB32m : FPI<0xD8, MRM4m, (ops f32mem:$src), "fsub{s} $src">;
2296def FSUB64m : FPI<0xDC, MRM4m, (ops f64mem:$src), "fsub{l} $src">;
2297def FSUBR32m : FPI<0xD8, MRM5m, (ops f32mem:$src), "fsubr{s} $src">;
2298def FSUBR64m : FPI<0xDC, MRM5m, (ops f64mem:$src), "fsubr{l} $src">;
2299def FDIV32m : FPI<0xD8, MRM6m, (ops f32mem:$src), "fdiv{s} $src">;
2300def FDIV64m : FPI<0xDC, MRM6m, (ops f64mem:$src), "fdiv{l} $src">;
2301def FDIVR32m : FPI<0xD8, MRM7m, (ops f32mem:$src), "fdivr{s} $src">;
2302def FDIVR64m : FPI<0xDC, MRM7m, (ops f64mem:$src), "fdivr{l} $src">;
2303
2304// FIXME: Implement these when we have a dag-dag isel!
2305//def FIADD16m : FPI<0xDE, MRM0m>; // ST(0) = ST(0) + [mem16int]
2306//def FIADD32m : FPI<0xDA, MRM0m>; // ST(0) = ST(0) + [mem32int]
2307//def FIMUL16m : FPI<0xDE, MRM1m>; // ST(0) = ST(0) * [mem16]
2308//def FIMUL32m : FPI<0xDA, MRM1m>; // ST(0) = ST(0) * [mem32]
2309//def FISUB16m : FPI<0xDE, MRM4m>; // ST(0) = ST(0) - [mem16int]
2310//def FISUB32m : FPI<0xDA, MRM4m>; // ST(0) = ST(0) - [mem32int]
2311//def FISUBR16m : FPI<0xDE, MRM5m>; // ST(0) = [mem16int] - ST(0)
2312//def FISUBR32m : FPI<0xDA, MRM5m>; // ST(0) = [mem32int] - ST(0)
2313//def FIDIV16m : FPI<0xDE, MRM6m>; // ST(0) = ST(0) / [mem16int]
2314//def FIDIV32m : FPI<0xDA, MRM6m>; // ST(0) = ST(0) / [mem32int]
2315//def FIDIVR16m : FPI<0xDE, MRM7m>; // ST(0) = [mem16int] / ST(0)
2316//def FIDIVR32m : FPI<0xDA, MRM7m>; // ST(0) = [mem32int] / ST(0)
2317
2318
2319// Floating point cmovs.
2320let isTwoAddress = 1 in {
2321 def FpCMOVB : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>;
2322 def FpCMOVBE : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>;
2323 def FpCMOVE : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>;
2324 def FpCMOVP : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>;
2325 def FpCMOVAE : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>;
2326 def FpCMOVA : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>;
2327 def FpCMOVNE : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>;
2328 def FpCMOVNP : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>;
2329}
2330
2331def FCMOVB : FPI<0xC0, AddRegFrm, (ops RST:$op),
2332 "fcmovb {$op, %ST(0)|%ST(0), $op}">, DA;
2333def FCMOVBE : FPI<0xD0, AddRegFrm, (ops RST:$op),
2334 "fcmovbe {$op, %ST(0)|%ST(0), $op}">, DA;
2335def FCMOVE : FPI<0xC8, AddRegFrm, (ops RST:$op),
2336 "fcmove {$op, %ST(0)|%ST(0), $op}">, DA;
2337def FCMOVP : FPI<0xD8, AddRegFrm, (ops RST:$op),
2338 "fcmovu {$op, %ST(0)|%ST(0), $op}">, DA;
2339def FCMOVAE : FPI<0xC0, AddRegFrm, (ops RST:$op),
2340 "fcmovae {$op, %ST(0)|%ST(0), $op}">, DB;
2341def FCMOVA : FPI<0xD0, AddRegFrm, (ops RST:$op),
2342 "fcmova {$op, %ST(0)|%ST(0), $op}">, DB;
2343def FCMOVNE : FPI<0xC8, AddRegFrm, (ops RST:$op),
2344 "fcmovne {$op, %ST(0)|%ST(0), $op}">, DB;
2345def FCMOVNP : FPI<0xD8, AddRegFrm, (ops RST:$op),
2346 "fcmovnu {$op, %ST(0)|%ST(0), $op}">, DB;
2347
2348// Floating point loads & stores.
2349def FpLD32m : FpI<(ops RFP:$dst, f32mem:$src), ZeroArgFP,
Evan Chengb077b842005-12-21 02:39:21 +00002350 [(set RFP:$dst, (X86fld addr:$src, f32))]>;
Chris Lattner58fe4592005-12-21 07:47:04 +00002351def FpLD64m : FpI<(ops RFP:$dst, f64mem:$src), ZeroArgFP,
Evan Chengb077b842005-12-21 02:39:21 +00002352 [(set RFP:$dst, (X86fld addr:$src, f64))]>;
Chris Lattner58fe4592005-12-21 07:47:04 +00002353def FpILD16m : FpI<(ops RFP:$dst, i16mem:$src), ZeroArgFP,
2354 []>;
2355def FpILD32m : FpI<(ops RFP:$dst, i32mem:$src), ZeroArgFP,
2356 []>;
2357def FpILD64m : FpI<(ops RFP:$dst, i64mem:$src), ZeroArgFP,
2358 []>;
Evan Chengb077b842005-12-21 02:39:21 +00002359
Chris Lattner58fe4592005-12-21 07:47:04 +00002360def FpST32m : FpI<(ops f32mem:$op, RFP:$src), OneArgFP, []>;
2361def FpST64m : FpI<(ops f64mem:$op, RFP:$src), OneArgFP, []>;
2362def FpSTP32m : FpI<(ops f32mem:$op, RFP:$src), OneArgFP, []>;
2363def FpSTP64m : FpI<(ops f64mem:$op, RFP:$src), OneArgFP, []>;
2364def FpIST16m : FpI<(ops i16mem:$op, RFP:$src), OneArgFP, []>;
2365def FpIST32m : FpI<(ops i32mem:$op, RFP:$src), OneArgFP, []>;
2366def FpIST64m : FpI<(ops i64mem:$op, RFP:$src), OneArgFP, []>;
Alkis Evlogimenos978f6292004-09-08 16:54:54 +00002367
Chris Lattner58fe4592005-12-21 07:47:04 +00002368def FLD32m : FPI<0xD9, MRM0m, (ops f32mem:$src), "fld{s} $src">;
2369def FLD64m : FPI<0xDD, MRM0m, (ops f64mem:$src), "fld{l} $src">;
2370def FILD16m : FPI<0xDF, MRM0m, (ops i16mem:$src), "fild{s} $src">;
2371def FILD32m : FPI<0xDB, MRM0m, (ops i32mem:$src), "fild{l} $src">;
2372def FILD64m : FPI<0xDF, MRM5m, (ops i64mem:$src), "fild{ll} $src">;
2373def FST32m : FPI<0xD9, MRM2m, (ops f32mem:$dst), "fst{s} $dst">;
2374def FST64m : FPI<0xDD, MRM2m, (ops f64mem:$dst), "fst{l} $dst">;
2375def FSTP32m : FPI<0xD9, MRM3m, (ops f32mem:$dst), "fstp{s} $dst">;
2376def FSTP64m : FPI<0xDD, MRM3m, (ops f64mem:$dst), "fstp{l} $dst">;
2377def FIST16m : FPI<0xDF, MRM2m, (ops i16mem:$dst), "fist{s} $dst">;
2378def FIST32m : FPI<0xDB, MRM2m, (ops i32mem:$dst), "fist{l} $dst">;
2379def FISTP16m : FPI<0xDF, MRM3m, (ops i16mem:$dst), "fistp{s} $dst">;
2380def FISTP32m : FPI<0xDB, MRM3m, (ops i32mem:$dst), "fistp{l} $dst">;
2381def FISTP64m : FPI<0xDF, MRM7m, (ops i64mem:$dst), "fistp{ll} $dst">;
Chris Lattner1cca5e32003-08-03 21:54:21 +00002382
Chris Lattner58fe4592005-12-21 07:47:04 +00002383// FP Stack manipulation instructions.
2384def FLDrr : FPI<0xC0, AddRegFrm, (ops RST:$op), "fld $op">, D9;
2385def FSTrr : FPI<0xD0, AddRegFrm, (ops RST:$op), "fst $op">, DD;
2386def FSTPrr : FPI<0xD8, AddRegFrm, (ops RST:$op), "fstp $op">, DD;
2387def FXCH : FPI<0xC8, AddRegFrm, (ops RST:$op), "fxch $op">, D9;
Chris Lattner490e86f2004-04-11 20:24:15 +00002388
Chris Lattner58fe4592005-12-21 07:47:04 +00002389// Floating point constant loads.
2390def FpLD0 : FpI<(ops RFP:$dst), ZeroArgFP, []>;
2391def FpLD1 : FpI<(ops RFP:$dst), ZeroArgFP, []>;
Chris Lattner490e86f2004-04-11 20:24:15 +00002392
Chris Lattner58fe4592005-12-21 07:47:04 +00002393def FLD0 : FPI<0xEE, RawFrm, (ops), "fldz">, D9;
2394def FLD1 : FPI<0xE8, RawFrm, (ops), "fld1">, D9;
Chris Lattner490e86f2004-04-11 20:24:15 +00002395
Chris Lattner1c54a852004-03-31 22:02:13 +00002396
Chris Lattner58fe4592005-12-21 07:47:04 +00002397// Unary operations.
2398def FpCHS : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW,
2399 [(set RFP:$dst, (fneg RFP:$src))]>;
2400def FpABS : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW,
2401 [(set RFP:$dst, (fabs RFP:$src))]>;
2402def FpSQRT : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW,
2403 [(set RFP:$dst, (fsqrt RFP:$src))]>;
2404def FpSIN : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW,
2405 [(set RFP:$dst, (fsin RFP:$src))]>;
2406def FpCOS : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW,
2407 [(set RFP:$dst, (fcos RFP:$src))]>;
2408def FpTST : FpI<(ops RFP:$src), OneArgFP,
2409 []>;
Chris Lattner1c54a852004-03-31 22:02:13 +00002410
Chris Lattner58fe4592005-12-21 07:47:04 +00002411def FCHS : FPI<0xE0, RawFrm, (ops), "fchs">, D9;
2412def FABS : FPI<0xE1, RawFrm, (ops), "fabs">, D9;
2413def FSQRT : FPI<0xFA, RawFrm, (ops), "fsqrt">, D9;
2414def FSIN : FPI<0xFE, RawFrm, (ops), "fsin">, D9;
2415def FCOS : FPI<0xFF, RawFrm, (ops), "fcos">, D9;
2416def FTST : FPI<0xE4, RawFrm, (ops), "ftst">, D9;
Chris Lattner1cca5e32003-08-03 21:54:21 +00002417
Chris Lattner9f8fd6d2004-02-02 19:31:38 +00002418
Chris Lattner3b904eb2004-02-03 07:27:50 +00002419
Chris Lattner58fe4592005-12-21 07:47:04 +00002420// Add, Sub, Mul, Div.
2421def FpADD : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), TwoArgFP,
2422 [(set RFP:$dst, (fadd RFP:$src1, RFP:$src2))]>;
2423def FpSUB : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), TwoArgFP,
2424 [(set RFP:$dst, (fsub RFP:$src1, RFP:$src2))]>;
2425def FpMUL : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), TwoArgFP,
2426 [(set RFP:$dst, (fmul RFP:$src1, RFP:$src2))]>;
2427def FpDIV : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), TwoArgFP,
2428 [(set RFP:$dst, (fdiv RFP:$src1, RFP:$src2))]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +00002429
Chris Lattner58fe4592005-12-21 07:47:04 +00002430class FPST0rInst<bits<8> o, string asm>
2431 : FPI<o, AddRegFrm, (ops RST:$op), asm>, D8;
2432class FPrST0Inst<bits<8> o, string asm>
2433 : FPI<o, AddRegFrm, (ops RST:$op), asm>, DC;
2434class FPrST0PInst<bits<8> o, string asm>
2435 : FPI<o, AddRegFrm, (ops RST:$op), asm>, DE;
Chris Lattner1cca5e32003-08-03 21:54:21 +00002436
Chris Lattner10f873b2004-10-04 07:08:46 +00002437// NOTE: GAS and apparently all other AT&T style assemblers have a broken notion
2438// of some of the 'reverse' forms of the fsub and fdiv instructions. As such,
Chris Lattnerda895d62005-02-27 06:18:25 +00002439// we have to put some 'r's in and take them out of weird places.
Chris Lattner58fe4592005-12-21 07:47:04 +00002440def FADDST0r : FPST0rInst <0xC0, "fadd $op">;
2441def FADDrST0 : FPrST0Inst <0xC0, "fadd {%ST(0), $op|$op, %ST(0)}">;
2442def FADDPrST0 : FPrST0PInst<0xC0, "faddp $op">;
2443def FSUBRST0r : FPST0rInst <0xE8, "fsubr $op">;
2444def FSUBrST0 : FPrST0Inst <0xE8, "fsub{r} {%ST(0), $op|$op, %ST(0)}">;
2445def FSUBPrST0 : FPrST0PInst<0xE8, "fsub{r}p $op">;
2446def FSUBST0r : FPST0rInst <0xE0, "fsub $op">;
2447def FSUBRrST0 : FPrST0Inst <0xE0, "fsub{|r} {%ST(0), $op|$op, %ST(0)}">;
2448def FSUBRPrST0 : FPrST0PInst<0xE0, "fsub{|r}p $op">;
2449def FMULST0r : FPST0rInst <0xC8, "fmul $op">;
2450def FMULrST0 : FPrST0Inst <0xC8, "fmul {%ST(0), $op|$op, %ST(0)}">;
2451def FMULPrST0 : FPrST0PInst<0xC8, "fmulp $op">;
2452def FDIVRST0r : FPST0rInst <0xF8, "fdivr $op">;
2453def FDIVrST0 : FPrST0Inst <0xF8, "fdiv{r} {%ST(0), $op|$op, %ST(0)}">;
2454def FDIVPrST0 : FPrST0PInst<0xF8, "fdiv{r}p $op">;
2455def FDIVST0r : FPST0rInst <0xF0, "fdiv $op">;
2456def FDIVRrST0 : FPrST0Inst <0xF0, "fdiv{|r} {%ST(0), $op|$op, %ST(0)}">;
2457def FDIVRPrST0 : FPrST0PInst<0xF0, "fdiv{|r}p $op">;
Chris Lattner1cca5e32003-08-03 21:54:21 +00002458
Chris Lattner58fe4592005-12-21 07:47:04 +00002459// Floating point compares.
2460def FpUCOMr : FpI<(ops RST:$lhs, RST:$rhs), CompareFP,
2461 []>; // FPSW = cmp ST(0) with ST(i)
2462def FpUCOMIr : FpI<(ops RST:$lhs, RST:$rhs), CompareFP,
2463 []>; // CC = cmp ST(0) with ST(i)
Chris Lattner1cca5e32003-08-03 21:54:21 +00002464
Chris Lattner58fe4592005-12-21 07:47:04 +00002465def FUCOMr : FPI<0xE0, AddRegFrm, // FPSW = cmp ST(0) with ST(i)
2466 (ops RST:$reg),
2467 "fucom $reg">, DD, Imp<[ST0],[]>;
2468def FUCOMPr : FPI<0xE8, AddRegFrm, // FPSW = cmp ST(0) with ST(i), pop
2469 (ops RST:$reg),
2470 "fucomp $reg">, DD, Imp<[ST0],[]>;
2471def FUCOMPPr : FPI<0xE9, RawFrm, // cmp ST(0) with ST(1), pop, pop
2472 (ops),
2473 "fucompp">, DA, Imp<[ST0],[]>;
Chris Lattner1cca5e32003-08-03 21:54:21 +00002474
Chris Lattner58fe4592005-12-21 07:47:04 +00002475def FUCOMIr : FPI<0xE8, AddRegFrm, // CC = cmp ST(0) with ST(i)
2476 (ops RST:$reg),
2477 "fucomi {$reg, %ST(0)|%ST(0), $reg}">, DB, Imp<[ST0],[]>;
2478def FUCOMIPr : FPI<0xE8, AddRegFrm, // CC = cmp ST(0) with ST(i), pop
2479 (ops RST:$reg),
2480 "fucomip {$reg, %ST(0)|%ST(0), $reg}">, DF, Imp<[ST0],[]>;
Chris Lattner0e967d42004-08-01 08:13:11 +00002481
Chris Lattnera1b5e162004-04-12 01:38:55 +00002482
Chris Lattner58fe4592005-12-21 07:47:04 +00002483// Floating point flag ops.
Chris Lattner3a173df2004-10-03 20:35:00 +00002484def FNSTSW8r : I<0xE0, RawFrm, // AX = fp flags
Evan Chengf0701842005-11-29 19:38:52 +00002485 (ops), "fnstsw", []>, DF, Imp<[],[AX]>;
Chris Lattner96563df2004-08-01 06:01:00 +00002486
Chris Lattner3a173df2004-10-03 20:35:00 +00002487def FNSTCW16m : I<0xD9, MRM7m, // [mem16] = X87 control world
Evan Chengf0701842005-11-29 19:38:52 +00002488 (ops i16mem:$dst), "fnstcw $dst", []>;
Chris Lattner3a173df2004-10-03 20:35:00 +00002489def FLDCW16m : I<0xD9, MRM5m, // X87 control world = [mem16]
Evan Chengf0701842005-11-29 19:38:52 +00002490 (ops i16mem:$dst), "fldcw $dst", []>;