blob: 6274a3ef72239ebe1fb5506c51c57a2e9ba4dea7 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===- AlphaInstrInfo.td - The Alpha Instruction Set -------*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Dan Gohmanf17a25c2007-07-18 16:29:46 +00007//
8//===----------------------------------------------------------------------===//
9//
10//
11//===----------------------------------------------------------------------===//
12
13include "AlphaInstrFormats.td"
14
15//********************
16//Custom DAG Nodes
17//********************
18
19def SDTFPUnaryOpUnC : SDTypeProfile<1, 1, [
20 SDTCisFP<1>, SDTCisFP<0>
21]>;
22def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
23def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
24def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_" , SDTFPUnaryOp, []>;
25def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
26def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
Chris Lattnerca4e0fe2008-01-10 05:12:37 +000027def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, [SDNPMayLoad]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000028
Chris Lattner3d254552008-01-15 22:02:54 +000029def retflag : SDNode<"AlphaISD::RET_FLAG", SDTNone,
Dan Gohmanf17a25c2007-07-18 16:29:46 +000030 [SDNPHasChain, SDNPOptInFlag]>;
31
32// These are target-independent nodes, but have target-specific formats.
Bill Wendling7173da52007-11-13 09:19:02 +000033def SDT_AlphaCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i64> ]>;
34def SDT_AlphaCallSeqEnd : SDCallSeqEnd<[ SDTCisVT<0, i64>,
35 SDTCisVT<1, i64> ]>;
Bill Wendling22f8deb2007-11-13 00:44:25 +000036
Bill Wendling7173da52007-11-13 09:19:02 +000037def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeqStart,
Dan Gohmanf17a25c2007-07-18 16:29:46 +000038 [SDNPHasChain, SDNPOutFlag]>;
Bill Wendling7173da52007-11-13 09:19:02 +000039def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeqEnd,
Bill Wendling22f8deb2007-11-13 00:44:25 +000040 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000041
42//********************
43//Paterns for matching
44//********************
45def invX : SDNodeXForm<imm, [{ //invert
46 return getI64Imm(~N->getValue());
47}]>;
48def negX : SDNodeXForm<imm, [{ //negate
49 return getI64Imm(~N->getValue() + 1);
50}]>;
51def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
52 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
53}]>;
54def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
55 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
56}]>;
57def LL16 : SDNodeXForm<imm, [{ //lda part of constant
58 return getI64Imm(get_lda16(N->getValue()));
59}]>;
60def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
61 return getI64Imm(get_ldah16(N->getValue()));
62}]>;
63def iZAPX : SDNodeXForm<and, [{ // get imm to ZAPi
64 ConstantSDNode *RHS = cast<ConstantSDNode>(N->getOperand(1));
65 return getI64Imm(get_zapImm(SDOperand(), RHS->getValue()));
66}]>;
67def nearP2X : SDNodeXForm<imm, [{
68 return getI64Imm(Log2_64(getNearPower2((uint64_t)N->getValue())));
69}]>;
70def nearP2RemX : SDNodeXForm<imm, [{
71 uint64_t x = abs(N->getValue() - getNearPower2((uint64_t)N->getValue()));
72 return getI64Imm(Log2_64(x));
73}]>;
74
75def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
76 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
77}]>;
78def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
79 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
80}], invX>;
81def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
82 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
83}], negX>;
84def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
85 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
86}]>;
87def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
88 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
89}], SExt16>;
90
91def zappat : PatFrag<(ops node:$LHS), (and node:$LHS, imm:$L), [{
92 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
93 uint64_t build = get_zapImm(N->getOperand(0), (uint64_t)RHS->getValue());
94 return build != 0;
95 }
96 return false;
97}]>;
98
99def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
100 (void)N; // silence warning.
101 return true;
102}]>;
103
104def immRem1 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),1, 0);}]>;
105def immRem2 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),2, 0);}]>;
106def immRem3 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),3, 0);}]>;
107def immRem4 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),4, 0);}]>;
108def immRem5 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),5, 0);}]>;
109def immRem1n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),1, 1);}]>;
110def immRem2n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),2, 1);}]>;
111def immRem3n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),3, 1);}]>;
112def immRem4n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),4, 1);}]>;
113def immRem5n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),5, 1);}]>;
114
115def immRemP2n : PatLeaf<(imm), [{
116 return isPowerOf2_64(getNearPower2((uint64_t)N->getValue()) - N->getValue());
117}]>;
118def immRemP2 : PatLeaf<(imm), [{
119 return isPowerOf2_64(N->getValue() - getNearPower2((uint64_t)N->getValue()));
120}]>;
121def immUExt8ME : PatLeaf<(imm), [{ //use this imm for mulqi
122 int64_t d = abs((int64_t)N->getValue() - (int64_t)getNearPower2((uint64_t)N->getValue()));
123 if (isPowerOf2_64(d)) return false;
124 switch (d) {
125 case 1: case 3: case 5: return false;
126 default: return (uint64_t)N->getValue() == (uint8_t)N->getValue();
127 };
128}]>;
129
130def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
131def add4 : PatFrag<(ops node:$op1, node:$op2),
132 (add (shl node:$op1, 2), node:$op2)>;
133def sub4 : PatFrag<(ops node:$op1, node:$op2),
134 (sub (shl node:$op1, 2), node:$op2)>;
135def add8 : PatFrag<(ops node:$op1, node:$op2),
136 (add (shl node:$op1, 3), node:$op2)>;
137def sub8 : PatFrag<(ops node:$op1, node:$op2),
138 (sub (shl node:$op1, 3), node:$op2)>;
139class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
140class CmpOpFrag<dag res> : PatFrag<(ops node:$R), res>;
141
142//Pseudo ops for selection
143
Evan Chenge399fbb2007-12-12 23:12:09 +0000144let isImplicitDef = 1 in {
Evan Chengb783fa32007-07-19 01:14:50 +0000145def IDEF_I : PseudoInstAlpha<(outs GPRC:$RA), (ins), ";#idef $RA",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000146 [(set GPRC:$RA, (undef))], s_pseudo>;
Evan Chengb783fa32007-07-19 01:14:50 +0000147def IDEF_F32 : PseudoInstAlpha<(outs F4RC:$RA), (ins), ";#idef $RA",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000148 [(set F4RC:$RA, (undef))], s_pseudo>;
Evan Chengb783fa32007-07-19 01:14:50 +0000149def IDEF_F64 : PseudoInstAlpha<(outs F8RC:$RA), (ins), ";#idef $RA",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000150 [(set F8RC:$RA, (undef))], s_pseudo>;
Evan Chenge399fbb2007-12-12 23:12:09 +0000151}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000152
Evan Chengb783fa32007-07-19 01:14:50 +0000153def WTF : PseudoInstAlpha<(outs), (ins variable_ops), "#wtf", [], s_pseudo>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000154
Chris Lattner1a1932c2008-01-06 23:38:27 +0000155let hasCtrlDep = 1, Defs = [R30], Uses = [R30] in {
Bill Wendling22f8deb2007-11-13 00:44:25 +0000156def ADJUSTSTACKUP : PseudoInstAlpha<(outs), (ins s64imm:$amt),
157 "; ADJUP $amt",
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000158 [(callseq_start imm:$amt)], s_pseudo>;
Bill Wendling22f8deb2007-11-13 00:44:25 +0000159def ADJUSTSTACKDOWN : PseudoInstAlpha<(outs), (ins s64imm:$amt1, s64imm:$amt2),
160 "; ADJDOWN $amt1",
161 [(callseq_end imm:$amt1, imm:$amt2)], s_pseudo>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000162}
Bill Wendling22f8deb2007-11-13 00:44:25 +0000163
Evan Chengb783fa32007-07-19 01:14:50 +0000164def ALTENT : PseudoInstAlpha<(outs), (ins s64imm:$TARGET), "$$$TARGET..ng:\n", [], s_pseudo>;
165def PCLABEL : PseudoInstAlpha<(outs), (ins s64imm:$num), "PCMARKER_$num:\n",[], s_pseudo>;
166def MEMLABEL : PseudoInstAlpha<(outs), (ins s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000167 "LSMARKER$$$i$$$j$$$k$$$m:", [], s_pseudo>;
168
169
170//***********************
171//Real instructions
172//***********************
173
174//Operation Form:
175
176//conditional moves, int
177
178multiclass cmov_inst<bits<7> fun, string asmstr, PatFrag OpNode> {
179def r : OForm4<0x11, fun, !strconcat(asmstr, " $RCOND,$RTRUE,$RDEST"),
180 [(set GPRC:$RDEST, (select (OpNode GPRC:$RCOND), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
181def i : OForm4L<0x11, fun, !strconcat(asmstr, " $RCOND,$RTRUE,$RDEST"),
182 [(set GPRC:$RDEST, (select (OpNode GPRC:$RCOND), immUExt8:$RTRUE, GPRC:$RFALSE))], s_cmov>;
183}
184
185defm CMOVEQ : cmov_inst<0x24, "cmoveq", CmpOpFrag<(seteq node:$R, 0)>>;
186defm CMOVNE : cmov_inst<0x26, "cmovne", CmpOpFrag<(setne node:$R, 0)>>;
187defm CMOVLT : cmov_inst<0x44, "cmovlt", CmpOpFrag<(setlt node:$R, 0)>>;
188defm CMOVLE : cmov_inst<0x64, "cmovle", CmpOpFrag<(setle node:$R, 0)>>;
189defm CMOVGT : cmov_inst<0x66, "cmovgt", CmpOpFrag<(setgt node:$R, 0)>>;
190defm CMOVGE : cmov_inst<0x46, "cmovge", CmpOpFrag<(setge node:$R, 0)>>;
191defm CMOVLBC : cmov_inst<0x16, "cmovlbc", CmpOpFrag<(xor node:$R, 1)>>;
192defm CMOVLBS : cmov_inst<0x14, "cmovlbs", CmpOpFrag<(and node:$R, 1)>>;
193
194//General pattern for cmov
195def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
196 (CMOVNEr GPRC:$src2, GPRC:$src1, GPRC:$which)>;
197def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
198 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
199
200//Invert sense when we can for constants:
201def : Pat<(select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
202 (CMOVEQi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
203def : Pat<(select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
204 (CMOVLEi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
205def : Pat<(select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
206 (CMOVLTi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
207def : Pat<(select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
208 (CMOVGEi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
209def : Pat<(select (setle GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
210 (CMOVGTi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
211
212multiclass all_inst<bits<6> opc, bits<7> funl, bits<7> funq,
213 string asmstr, PatFrag OpNode, InstrItinClass itin> {
214 def Lr : OForm< opc, funl, !strconcat(asmstr, "l $RA,$RB,$RC"),
215 [(set GPRC:$RC, (intop (OpNode GPRC:$RA, GPRC:$RB)))], itin>;
216 def Li : OFormL<opc, funl, !strconcat(asmstr, "l $RA,$L,$RC"),
217 [(set GPRC:$RC, (intop (OpNode GPRC:$RA, immUExt8:$L)))], itin>;
218 def Qr : OForm< opc, funq, !strconcat(asmstr, "q $RA,$RB,$RC"),
219 [(set GPRC:$RC, (OpNode GPRC:$RA, GPRC:$RB))], itin>;
220 def Qi : OFormL<opc, funq, !strconcat(asmstr, "q $RA,$L,$RC"),
221 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8:$L))], itin>;
222}
223
224defm MUL : all_inst<0x13, 0x00, 0x20, "mul", BinOpFrag<(mul node:$LHS, node:$RHS)>, s_imul>;
225defm ADD : all_inst<0x10, 0x00, 0x20, "add", BinOpFrag<(add node:$LHS, node:$RHS)>, s_iadd>;
226defm S4ADD : all_inst<0x10, 0x02, 0x22, "s4add", add4, s_iadd>;
227defm S8ADD : all_inst<0x10, 0x12, 0x32, "s8add", add8, s_iadd>;
228defm S4SUB : all_inst<0x10, 0x0B, 0x2B, "s4sub", sub4, s_iadd>;
229defm S8SUB : all_inst<0x10, 0x1B, 0x3B, "s8sub", sub8, s_iadd>;
230defm SUB : all_inst<0x10, 0x09, 0x29, "sub", BinOpFrag<(sub node:$LHS, node:$RHS)>, s_iadd>;
231//Const cases since legalize does sub x, int -> add x, inv(int) + 1
232def : Pat<(intop (add GPRC:$RA, immUExt8neg:$L)), (SUBLi GPRC:$RA, immUExt8neg:$L)>;
233def : Pat<(add GPRC:$RA, immUExt8neg:$L), (SUBQi GPRC:$RA, immUExt8neg:$L)>;
234def : Pat<(intop (add4 GPRC:$RA, immUExt8neg:$L)), (S4SUBLi GPRC:$RA, immUExt8neg:$L)>;
235def : Pat<(add4 GPRC:$RA, immUExt8neg:$L), (S4SUBQi GPRC:$RA, immUExt8neg:$L)>;
236def : Pat<(intop (add8 GPRC:$RA, immUExt8neg:$L)), (S8SUBLi GPRC:$RA, immUExt8neg:$L)>;
237def : Pat<(add8 GPRC:$RA, immUExt8neg:$L), (S8SUBQi GPRC:$RA, immUExt8neg:$L)>;
238
239multiclass log_inst<bits<6> opc, bits<7> fun, string asmstr, SDNode OpNode, InstrItinClass itin> {
240def r : OForm<opc, fun, !strconcat(asmstr, " $RA,$RB,$RC"),
241 [(set GPRC:$RC, (OpNode GPRC:$RA, GPRC:$RB))], itin>;
242def i : OFormL<opc, fun, !strconcat(asmstr, " $RA,$L,$RC"),
243 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8:$L))], itin>;
244}
245multiclass inv_inst<bits<6> opc, bits<7> fun, string asmstr, SDNode OpNode, InstrItinClass itin> {
246def r : OForm<opc, fun, !strconcat(asmstr, " $RA,$RB,$RC"),
247 [(set GPRC:$RC, (OpNode GPRC:$RA, (not GPRC:$RB)))], itin>;
248def i : OFormL<opc, fun, !strconcat(asmstr, " $RA,$L,$RC"),
249 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8inv:$L))], itin>;
250}
251
252defm AND : log_inst<0x11, 0x00, "and", and, s_ilog>;
253defm BIC : inv_inst<0x11, 0x08, "bic", and, s_ilog>;
254defm BIS : log_inst<0x11, 0x20, "bis", or, s_ilog>;
255defm ORNOT : inv_inst<0x11, 0x28, "ornot", or, s_ilog>;
256defm XOR : log_inst<0x11, 0x40, "xor", xor, s_ilog>;
257defm EQV : inv_inst<0x11, 0x48, "eqv", xor, s_ilog>;
258
259defm SL : log_inst<0x12, 0x39, "sll", shl, s_ishf>;
260defm SRA : log_inst<0x12, 0x3c, "sra", sra, s_ishf>;
261defm SRL : log_inst<0x12, 0x34, "srl", srl, s_ishf>;
262defm UMULH : log_inst<0x13, 0x30, "umulh", mulhu, s_imul>;
263
264def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
265 [(set GPRC:$RC, (ctlz GPRC:$RB))], s_imisc>;
266def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
267 [(set GPRC:$RC, (ctpop GPRC:$RB))], s_imisc>;
268def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
269 [(set GPRC:$RC, (cttz GPRC:$RB))], s_imisc>;
270def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
271 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))], s_ishf>;
272def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
273 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))], s_ishf>;
274def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
275 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))], s_ishf>;
276def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
277 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))], s_ishf>;
278def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
279 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))], s_ishf>;
280
281//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
282//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
283//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
284//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
285//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
286//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
287//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
288//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
289//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
290//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
291//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
292
293//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
294//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
295//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
296//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
297//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
298//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
299//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
300//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
301//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
302//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
303//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
304//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
305//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
306//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
307
308//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
309//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
310//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
311//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
312//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
313//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
314//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
315//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
316//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
317//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
318//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
319//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
320//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
321//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
322
323def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC", [], s_ishf>;
324
325// Define the pattern that produces ZAPNOTi.
326def : Pat<(i64 (zappat GPRC:$RA):$imm),
327 (ZAPNOTi GPRC:$RA, (iZAPX GPRC:$imm))>;
328
329
330//Comparison, int
331//So this is a waste of what this instruction can do, but it still saves something
332def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
333 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))], s_ilog>;
334def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
335 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))], s_ilog>;
336def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
337 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))], s_iadd>;
338def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
339 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))], s_iadd>;
340def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
341 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))], s_iadd>;
342def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
343 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))], s_iadd>;
344def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
345 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))], s_iadd>;
346def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
347 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))], s_iadd>;
348def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
349 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))], s_iadd>;
350def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
351 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))], s_iadd>;
352def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
353 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))], s_iadd>;
354def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
355 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))], s_iadd>;
356
357//Patterns for unsupported int comparisons
358def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
359def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
360
361def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
362def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
363
364def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
365def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
366
367def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
368def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
369
370def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
371def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
372
373def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
374def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
375
376def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
377def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
378
379
Evan Cheng37e7c752007-07-21 00:34:19 +0000380let isReturn = 1, isTerminator = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000381 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", s_jsr>; //Return from subroutine
382 def RETDAGp : MbrpForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", [(retflag)], s_jsr>; //Return from subroutine
383}
384
Owen Andersonf8053082007-11-12 07:39:39 +0000385let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1, Ra = 31, disp = 0 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000386def JMP : MbrpForm< 0x1A, 0x00, (ops GPRC:$RS), "jmp $$31,($RS),0",
387 [(brind GPRC:$RS)], s_jsr>; //Jump
388
Evan Cheng37e7c752007-07-21 00:34:19 +0000389let isCall = 1, Ra = 26,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000390 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
391 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
392 F0, F1,
393 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
394 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
395 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", [], s_jsr>; //Branch to subroutine
396}
Evan Cheng37e7c752007-07-21 00:34:19 +0000397let isCall = 1, Ra = 26, Rb = 27, disp = 0,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000398 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
399 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
400 F0, F1,
401 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
402 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
403 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0", s_jsr>; //Jump to subroutine
404}
405
Evan Cheng37e7c752007-07-21 00:34:19 +0000406let isCall = 1, Ra = 23, Rb = 27, disp = 0,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000407 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
408 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0", s_jsr>; //Jump to div or rem
409
410
411def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP", s_jsr>; //Jump to subroutine return
412
413
Evan Chengb783fa32007-07-19 01:14:50 +0000414let OutOperandList = (ops GPRC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in {
Chris Lattneref8d6082008-01-06 06:44:58 +0000415def LDQ : MForm<0x29, 1, "ldq $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000416 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000417def LDQr : MForm<0x29, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000418 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000419def LDL : MForm<0x28, 1, "ldl $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000420 [(set GPRC:$RA, (sextloadi32 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000421def LDLr : MForm<0x28, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000422 [(set GPRC:$RA, (sextloadi32 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000423def LDBU : MForm<0x0A, 1, "ldbu $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000424 [(set GPRC:$RA, (zextloadi8 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000425def LDBUr : MForm<0x0A, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000426 [(set GPRC:$RA, (zextloadi8 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000427def LDWU : MForm<0x0C, 1, "ldwu $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000428 [(set GPRC:$RA, (zextloadi16 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000429def LDWUr : MForm<0x0C, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000430 [(set GPRC:$RA, (zextloadi16 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Evan Chengb783fa32007-07-19 01:14:50 +0000431}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000432
433
Evan Chengb783fa32007-07-19 01:14:50 +0000434let OutOperandList = (ops), InOperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
Chris Lattneref8d6082008-01-06 06:44:58 +0000435def STB : MForm<0x0E, 0, "stb $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000436 [(truncstorei8 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000437def STBr : MForm<0x0E, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000438 [(truncstorei8 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000439def STW : MForm<0x0D, 0, "stw $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000440 [(truncstorei16 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000441def STWr : MForm<0x0D, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000442 [(truncstorei16 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000443def STL : MForm<0x2C, 0, "stl $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000444 [(truncstorei32 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000445def STLr : MForm<0x2C, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000446 [(truncstorei32 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000447def STQ : MForm<0x2D, 0, "stq $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000448 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000449def STQr : MForm<0x2D, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000450 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Evan Chengb783fa32007-07-19 01:14:50 +0000451}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000452
453//Load address
Evan Chengb783fa32007-07-19 01:14:50 +0000454let OutOperandList = (ops GPRC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in {
Chris Lattneref8d6082008-01-06 06:44:58 +0000455def LDA : MForm<0x08, 0, "lda $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000456 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_lda>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000457def LDAr : MForm<0x08, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000458 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address
Chris Lattneref8d6082008-01-06 06:44:58 +0000459def LDAH : MForm<0x09, 0, "ldah $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000460 [], s_lda>; //Load address high
Chris Lattneref8d6082008-01-06 06:44:58 +0000461def LDAHr : MForm<0x09, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000462 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address high
463}
464
Evan Chengb783fa32007-07-19 01:14:50 +0000465let OutOperandList = (ops), InOperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
Chris Lattneref8d6082008-01-06 06:44:58 +0000466def STS : MForm<0x26, 0, "sts $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000467 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000468def STSr : MForm<0x26, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000469 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Evan Chengb783fa32007-07-19 01:14:50 +0000470}
471let OutOperandList = (ops F4RC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in {
Chris Lattneref8d6082008-01-06 06:44:58 +0000472def LDS : MForm<0x22, 1, "lds $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000473 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000474def LDSr : MForm<0x22, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000475 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
476}
Evan Chengb783fa32007-07-19 01:14:50 +0000477let OutOperandList = (ops), InOperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
Chris Lattneref8d6082008-01-06 06:44:58 +0000478def STT : MForm<0x27, 0, "stt $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000479 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000480def STTr : MForm<0x27, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000481 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Evan Chengb783fa32007-07-19 01:14:50 +0000482}
483let OutOperandList = (ops F8RC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in {
Chris Lattneref8d6082008-01-06 06:44:58 +0000484def LDT : MForm<0x23, 1, "ldt $RA,$DISP($RB)",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000485 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Chris Lattneref8d6082008-01-06 06:44:58 +0000486def LDTr : MForm<0x23, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000487 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
488}
489
490
491//constpool rels
492def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
493 (LDQr tconstpool:$DISP, GPRC:$RB)>;
494def : Pat<(i64 (sextloadi32 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
495 (LDLr tconstpool:$DISP, GPRC:$RB)>;
496def : Pat<(i64 (zextloadi8 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
497 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
498def : Pat<(i64 (zextloadi16 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
499 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
500def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
501 (LDAr tconstpool:$DISP, GPRC:$RB)>;
502def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
503 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
504def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
505 (LDSr tconstpool:$DISP, GPRC:$RB)>;
506def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
507 (LDTr tconstpool:$DISP, GPRC:$RB)>;
508
509//jumptable rels
510def : Pat<(i64 (Alpha_gprelhi tjumptable:$DISP, GPRC:$RB)),
511 (LDAHr tjumptable:$DISP, GPRC:$RB)>;
512def : Pat<(i64 (Alpha_gprello tjumptable:$DISP, GPRC:$RB)),
513 (LDAr tjumptable:$DISP, GPRC:$RB)>;
514
515
516//misc ext patterns
517def : Pat<(i64 (extloadi8 (add GPRC:$RB, immSExt16:$DISP))),
518 (LDBU immSExt16:$DISP, GPRC:$RB)>;
519def : Pat<(i64 (extloadi16 (add GPRC:$RB, immSExt16:$DISP))),
520 (LDWU immSExt16:$DISP, GPRC:$RB)>;
521def : Pat<(i64 (extloadi32 (add GPRC:$RB, immSExt16:$DISP))),
522 (LDL immSExt16:$DISP, GPRC:$RB)>;
523
524//0 disp patterns
525def : Pat<(i64 (load GPRC:$addr)),
526 (LDQ 0, GPRC:$addr)>;
527def : Pat<(f64 (load GPRC:$addr)),
528 (LDT 0, GPRC:$addr)>;
529def : Pat<(f32 (load GPRC:$addr)),
530 (LDS 0, GPRC:$addr)>;
531def : Pat<(i64 (sextloadi32 GPRC:$addr)),
532 (LDL 0, GPRC:$addr)>;
533def : Pat<(i64 (zextloadi16 GPRC:$addr)),
534 (LDWU 0, GPRC:$addr)>;
535def : Pat<(i64 (zextloadi8 GPRC:$addr)),
536 (LDBU 0, GPRC:$addr)>;
537def : Pat<(i64 (extloadi8 GPRC:$addr)),
538 (LDBU 0, GPRC:$addr)>;
539def : Pat<(i64 (extloadi16 GPRC:$addr)),
540 (LDWU 0, GPRC:$addr)>;
541def : Pat<(i64 (extloadi32 GPRC:$addr)),
542 (LDL 0, GPRC:$addr)>;
543
544def : Pat<(store GPRC:$DATA, GPRC:$addr),
545 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
546def : Pat<(store F8RC:$DATA, GPRC:$addr),
547 (STT F8RC:$DATA, 0, GPRC:$addr)>;
548def : Pat<(store F4RC:$DATA, GPRC:$addr),
549 (STS F4RC:$DATA, 0, GPRC:$addr)>;
550def : Pat<(truncstorei32 GPRC:$DATA, GPRC:$addr),
551 (STL GPRC:$DATA, 0, GPRC:$addr)>;
552def : Pat<(truncstorei16 GPRC:$DATA, GPRC:$addr),
553 (STW GPRC:$DATA, 0, GPRC:$addr)>;
554def : Pat<(truncstorei8 GPRC:$DATA, GPRC:$addr),
555 (STB GPRC:$DATA, 0, GPRC:$addr)>;
556
557
558//load address, rellocated gpdist form
Evan Chengb783fa32007-07-19 01:14:50 +0000559let OutOperandList = (ops GPRC:$RA), InOperandList = (ops s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
Chris Lattneref8d6082008-01-06 06:44:58 +0000560def LDAg : MForm<0x08, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
561def LDAHg : MForm<0x09, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000562}
563
564//Load quad, rellocated literal form
Evan Chengb783fa32007-07-19 01:14:50 +0000565let OutOperandList = (ops GPRC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in
Chris Lattneref8d6082008-01-06 06:44:58 +0000566def LDQl : MForm<0x29, 1, "ldq $RA,$DISP($RB)\t\t!literal",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000567 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))], s_ild>;
568def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
569 (LDQl texternalsym:$ext, GPRC:$RB)>;
570
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000571def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA", s_rpcc>; //Read process cycle counter
Andrew Lenharth785610d2008-02-16 01:24:58 +0000572def MB : MfcPForm<0x18, 0x4000, "mb", s_imisc>; //memory barrier
573def WMB : MfcPForm<0x18, 0x4400, "wmb", s_imisc>; //write memory barrier
574
575def : Pat<(membarrier (i64 imm:$ll), (i64 imm:$ls), (i64 imm:$sl), (i64 1), (i64 imm:$dev)),
576 (WMB)>;
577def : Pat<(membarrier (i64 imm:$ll), (i64 imm:$ls), (i64 imm:$sl), (i64 imm:$ss), (i64 imm:$dev)),
578 (MB)>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000579
580//Basic Floating point ops
581
582//Floats
583
Evan Chengb783fa32007-07-19 01:14:50 +0000584let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F4RC:$RB), Fa = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000585def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
586 [(set F4RC:$RC, (fsqrt F4RC:$RB))], s_fsqrts>;
587
Evan Chengb783fa32007-07-19 01:14:50 +0000588let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F4RC:$RA, F4RC:$RB) in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000589def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
590 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))], s_fadd>;
591def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
592 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))], s_fadd>;
593def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
594 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))], s_fdivs>;
595def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
596 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))], s_fmul>;
597
598def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
599 [(set F4RC:$RC, (fcopysign F4RC:$RB, F4RC:$RA))], s_fadd>;
600def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
601def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
602 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F4RC:$RA)))], s_fadd>;
603}
604
605//Doubles
606
Evan Chengb783fa32007-07-19 01:14:50 +0000607let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000608def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
609 [(set F8RC:$RC, (fsqrt F8RC:$RB))], s_fsqrtt>;
610
Evan Chengb783fa32007-07-19 01:14:50 +0000611let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F8RC:$RA, F8RC:$RB) in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000612def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
613 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))], s_fadd>;
614def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
615 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))], s_fadd>;
616def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
617 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))], s_fdivt>;
618def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
619 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))], s_fmul>;
620
621def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
622 [(set F8RC:$RC, (fcopysign F8RC:$RB, F8RC:$RA))], s_fadd>;
623def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
624def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
625 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F8RC:$RA)))], s_fadd>;
626
627def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", [], s_fadd>;
628// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
629def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", [], s_fadd>;
630// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
631def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", [], s_fadd>;
632// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
633def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", [], s_fadd>;
634// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
635}
636
637//More CPYS forms:
Evan Chengb783fa32007-07-19 01:14:50 +0000638let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F4RC:$RA, F8RC:$RB) in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000639def CPYSTs : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
640 [(set F8RC:$RC, (fcopysign F8RC:$RB, F4RC:$RA))], s_fadd>;
641def CPYSNTs : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
642 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F4RC:$RA)))], s_fadd>;
643}
Evan Chengb783fa32007-07-19 01:14:50 +0000644let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F8RC:$RA, F4RC:$RB) in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000645def CPYSSt : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
646 [(set F4RC:$RC, (fcopysign F4RC:$RB, F8RC:$RA))], s_fadd>;
647def CPYSESt : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
648def CPYSNSt : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
649 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F8RC:$RA)))], s_fadd>;
650}
651
652//conditional moves, floats
Evan Chengb783fa32007-07-19 01:14:50 +0000653let OutOperandList = (ops F4RC:$RDEST), InOperandList = (ops F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000654 isTwoAddress = 1 in {
655def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if = zero
656def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if >= zero
657def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if > zero
658def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if <= zero
659def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; // FCMOVE if < zero
660def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if != zero
661}
662//conditional moves, doubles
Evan Chengb783fa32007-07-19 01:14:50 +0000663let OutOperandList = (ops F8RC:$RDEST), InOperandList = (ops F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000664 isTwoAddress = 1 in {
665def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
666def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
667def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
668def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
669def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
670def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
671}
672
673//misc FP selects
674//Select double
675
676def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
677 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
678def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
679 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
680def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
681 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
682
683def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
684 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
685def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
686 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
687def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
688 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
689
690def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
691 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
692def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
693 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
694def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
695 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
696
697def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
698 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
699def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
700 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
701def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
702 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
703
704def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
705 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
706def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
707 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
708def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
709 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
710
711def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
712 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
713def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
714 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
715def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
716 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
717
718//Select single
719def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
720 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
721def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
722 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
723def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
724 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
725
726def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
727 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
728def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
729 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
730def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
731 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
732
733def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
734 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
735def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
736 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
737def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
738 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
739
740def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
741 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
742def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
743 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
744def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
745 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
746
747def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
748 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
749def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
750 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
751def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
752 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
753
754def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
755 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
756def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
757 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
758def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
759 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
760
761
762
Evan Chengb783fa32007-07-19 01:14:50 +0000763let OutOperandList = (ops GPRC:$RC), InOperandList = (ops F4RC:$RA), Fb = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000764def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[], s_ftoi>; //Floating to integer move, S_floating
Evan Chengb783fa32007-07-19 01:14:50 +0000765let OutOperandList = (ops GPRC:$RC), InOperandList = (ops F8RC:$RA), Fb = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000766def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
767 [(set GPRC:$RC, (bitconvert F8RC:$RA))], s_ftoi>; //Floating to integer move
Evan Chengb783fa32007-07-19 01:14:50 +0000768let OutOperandList = (ops F4RC:$RC), InOperandList = (ops GPRC:$RA), Fb = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000769def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[], s_itof>; //Integer to floating move, S_floating
Evan Chengb783fa32007-07-19 01:14:50 +0000770let OutOperandList = (ops F8RC:$RC), InOperandList = (ops GPRC:$RA), Fb = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000771def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
772 [(set F8RC:$RC, (bitconvert GPRC:$RA))], s_itof>; //Integer to floating move
773
774
Evan Chengb783fa32007-07-19 01:14:50 +0000775let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000776def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
777 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))], s_fadd>;
Evan Chengb783fa32007-07-19 01:14:50 +0000778let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000779def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
780 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))], s_fadd>;
Evan Chengb783fa32007-07-19 01:14:50 +0000781let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000782def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
783 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))], s_fadd>;
Evan Chengb783fa32007-07-19 01:14:50 +0000784let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F4RC:$RB), Fa = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000785def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
786 [(set F8RC:$RC, (fextend F4RC:$RB))], s_fadd>;
Evan Chengb783fa32007-07-19 01:14:50 +0000787let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000788def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
789 [(set F4RC:$RC, (fround F8RC:$RB))], s_fadd>;
790
791
792/////////////////////////////////////////////////////////
793//Branching
794/////////////////////////////////////////////////////////
795class br_icc<bits<6> opc, string asmstr>
796 : BFormN<opc, (ops u64imm:$opc, GPRC:$R, target:$dst),
797 !strconcat(asmstr, " $R,$dst"), s_icbr>;
798class br_fcc<bits<6> opc, string asmstr>
799 : BFormN<opc, (ops u64imm:$opc, F8RC:$R, target:$dst),
800 !strconcat(asmstr, " $R,$dst"), s_fbr>;
801
Evan Cheng37e7c752007-07-21 00:34:19 +0000802let isBranch = 1, isTerminator = 1, hasCtrlDep = 1 in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000803let Ra = 31 in
804def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)], s_ubr>;
805
806def COND_BRANCH_I : BFormN<0, (ops u64imm:$opc, GPRC:$R, target:$dst),
807 "{:comment} COND_BRANCH imm:$opc, GPRC:$R, bb:$dst",
808 s_icbr>;
809def COND_BRANCH_F : BFormN<0, (ops u64imm:$opc, F8RC:$R, target:$dst),
810 "{:comment} COND_BRANCH imm:$opc, F8RC:$R, bb:$dst",
811 s_fbr>;
812//Branches, int
813def BEQ : br_icc<0x39, "beq">;
814def BGE : br_icc<0x3E, "bge">;
815def BGT : br_icc<0x3F, "bgt">;
816def BLBC : br_icc<0x38, "blbc">;
817def BLBS : br_icc<0x3C, "blbs">;
818def BLE : br_icc<0x3B, "ble">;
819def BLT : br_icc<0x3A, "blt">;
820def BNE : br_icc<0x3D, "bne">;
821
822//Branches, float
823def FBEQ : br_fcc<0x31, "fbeq">;
824def FBGE : br_fcc<0x36, "fbge">;
825def FBGT : br_fcc<0x37, "fbgt">;
826def FBLE : br_fcc<0x33, "fble">;
827def FBLT : br_fcc<0x32, "fblt">;
828def FBNE : br_fcc<0x36, "fbne">;
829}
830
831//An ugly trick to get the opcode as an imm I can use
832def immBRCond : SDNodeXForm<imm, [{
833 switch((uint64_t)N->getValue()) {
834 case 0: return getI64Imm(Alpha::BEQ);
835 case 1: return getI64Imm(Alpha::BNE);
836 case 2: return getI64Imm(Alpha::BGE);
837 case 3: return getI64Imm(Alpha::BGT);
838 case 4: return getI64Imm(Alpha::BLE);
839 case 5: return getI64Imm(Alpha::BLT);
840 case 6: return getI64Imm(Alpha::BLBS);
841 case 7: return getI64Imm(Alpha::BLBC);
842 case 20: return getI64Imm(Alpha::FBEQ);
843 case 21: return getI64Imm(Alpha::FBNE);
844 case 22: return getI64Imm(Alpha::FBGE);
845 case 23: return getI64Imm(Alpha::FBGT);
846 case 24: return getI64Imm(Alpha::FBLE);
847 case 25: return getI64Imm(Alpha::FBLT);
848 default: assert(0 && "Unknown branch type");
849 }
850}]>;
851
852//Int cond patterns
853def : Pat<(brcond (seteq GPRC:$RA, 0), bb:$DISP),
854 (COND_BRANCH_I (immBRCond 0), GPRC:$RA, bb:$DISP)>;
855def : Pat<(brcond (setge GPRC:$RA, 0), bb:$DISP),
856 (COND_BRANCH_I (immBRCond 2), GPRC:$RA, bb:$DISP)>;
857def : Pat<(brcond (setgt GPRC:$RA, 0), bb:$DISP),
858 (COND_BRANCH_I (immBRCond 3), GPRC:$RA, bb:$DISP)>;
859def : Pat<(brcond (and GPRC:$RA, 1), bb:$DISP),
860 (COND_BRANCH_I (immBRCond 6), GPRC:$RA, bb:$DISP)>;
861def : Pat<(brcond (setle GPRC:$RA, 0), bb:$DISP),
862 (COND_BRANCH_I (immBRCond 4), GPRC:$RA, bb:$DISP)>;
863def : Pat<(brcond (setlt GPRC:$RA, 0), bb:$DISP),
864 (COND_BRANCH_I (immBRCond 5), GPRC:$RA, bb:$DISP)>;
865def : Pat<(brcond (setne GPRC:$RA, 0), bb:$DISP),
866 (COND_BRANCH_I (immBRCond 1), GPRC:$RA, bb:$DISP)>;
867
868def : Pat<(brcond GPRC:$RA, bb:$DISP),
869 (COND_BRANCH_I (immBRCond 1), GPRC:$RA, bb:$DISP)>;
870def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
871 (COND_BRANCH_I (immBRCond 0), (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
872def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
873 (COND_BRANCH_I (immBRCond 0), (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
874
875//FP cond patterns
876def : Pat<(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP),
877 (COND_BRANCH_F (immBRCond 20), F8RC:$RA, bb:$DISP)>;
878def : Pat<(brcond (setne F8RC:$RA, immFPZ), bb:$DISP),
879 (COND_BRANCH_F (immBRCond 21), F8RC:$RA, bb:$DISP)>;
880def : Pat<(brcond (setge F8RC:$RA, immFPZ), bb:$DISP),
881 (COND_BRANCH_F (immBRCond 22), F8RC:$RA, bb:$DISP)>;
882def : Pat<(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP),
883 (COND_BRANCH_F (immBRCond 23), F8RC:$RA, bb:$DISP)>;
884def : Pat<(brcond (setle F8RC:$RA, immFPZ), bb:$DISP),
885 (COND_BRANCH_F (immBRCond 24), F8RC:$RA, bb:$DISP)>;
886def : Pat<(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP),
887 (COND_BRANCH_F (immBRCond 25), F8RC:$RA, bb:$DISP)>;
888
889
890def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
891 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
892def : Pat<(brcond (setoeq F8RC:$RA, F8RC:$RB), bb:$DISP),
893 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
894def : Pat<(brcond (setueq F8RC:$RA, F8RC:$RB), bb:$DISP),
895 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
896
897def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
898 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
899def : Pat<(brcond (setolt F8RC:$RA, F8RC:$RB), bb:$DISP),
900 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
901def : Pat<(brcond (setult F8RC:$RA, F8RC:$RB), bb:$DISP),
902 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
903
904def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
905 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
906def : Pat<(brcond (setole F8RC:$RA, F8RC:$RB), bb:$DISP),
907 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
908def : Pat<(brcond (setule F8RC:$RA, F8RC:$RB), bb:$DISP),
909 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
910
911def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
912 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
913def : Pat<(brcond (setogt F8RC:$RA, F8RC:$RB), bb:$DISP),
914 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
915def : Pat<(brcond (setugt F8RC:$RA, F8RC:$RB), bb:$DISP),
916 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
917
918def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
919 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
920def : Pat<(brcond (setoge F8RC:$RA, F8RC:$RB), bb:$DISP),
921 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
922def : Pat<(brcond (setuge F8RC:$RA, F8RC:$RB), bb:$DISP),
923 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
924
925def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
926 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
927def : Pat<(brcond (setone F8RC:$RA, F8RC:$RB), bb:$DISP),
928 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
929def : Pat<(brcond (setune F8RC:$RA, F8RC:$RB), bb:$DISP),
930 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
931
932
933def : Pat<(brcond (setoeq F8RC:$RA, immFPZ), bb:$DISP),
934 (COND_BRANCH_F (immBRCond 20), F8RC:$RA,bb:$DISP)>;
935def : Pat<(brcond (setueq F8RC:$RA, immFPZ), bb:$DISP),
936 (COND_BRANCH_F (immBRCond 20), F8RC:$RA,bb:$DISP)>;
937
938def : Pat<(brcond (setoge F8RC:$RA, immFPZ), bb:$DISP),
939 (COND_BRANCH_F (immBRCond 22), F8RC:$RA,bb:$DISP)>;
940def : Pat<(brcond (setuge F8RC:$RA, immFPZ), bb:$DISP),
941 (COND_BRANCH_F (immBRCond 22), F8RC:$RA,bb:$DISP)>;
942
943def : Pat<(brcond (setogt F8RC:$RA, immFPZ), bb:$DISP),
944 (COND_BRANCH_F (immBRCond 23), F8RC:$RA,bb:$DISP)>;
945def : Pat<(brcond (setugt F8RC:$RA, immFPZ), bb:$DISP),
946 (COND_BRANCH_F (immBRCond 23), F8RC:$RA,bb:$DISP)>;
947
948def : Pat<(brcond (setole F8RC:$RA, immFPZ), bb:$DISP),
949 (COND_BRANCH_F (immBRCond 24), F8RC:$RA,bb:$DISP)>;
950def : Pat<(brcond (setule F8RC:$RA, immFPZ), bb:$DISP),
951 (COND_BRANCH_F (immBRCond 24), F8RC:$RA,bb:$DISP)>;
952
953def : Pat<(brcond (setolt F8RC:$RA, immFPZ), bb:$DISP),
954 (COND_BRANCH_F (immBRCond 25), F8RC:$RA,bb:$DISP)>;
955def : Pat<(brcond (setult F8RC:$RA, immFPZ), bb:$DISP),
956 (COND_BRANCH_F (immBRCond 25), F8RC:$RA,bb:$DISP)>;
957
958def : Pat<(brcond (setone F8RC:$RA, immFPZ), bb:$DISP),
959 (COND_BRANCH_F (immBRCond 21), F8RC:$RA,bb:$DISP)>;
960def : Pat<(brcond (setune F8RC:$RA, immFPZ), bb:$DISP),
961 (COND_BRANCH_F (immBRCond 21), F8RC:$RA,bb:$DISP)>;
962
963//End Branches
964
965//S_floating : IEEE Single
966//T_floating : IEEE Double
967
Andrew Lenharth785610d2008-02-16 01:24:58 +0000968
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000969//Unused instructions
970//Mnemonic Format Opcode Description
971//CALL_PAL Pcd 00 Trap to PALcode
972//ECB Mfc 18.E800 Evict cache block
973//EXCB Mfc 18.0400 Exception barrier
974//FETCH Mfc 18.8000 Prefetch data
975//FETCH_M Mfc 18.A000 Prefetch data, modify intent
976//LDL_L Mem 2A Load sign-extended longword locked
977//LDQ_L Mem 2B Load quadword locked
978//LDQ_U Mem 0B Load unaligned quadword
979//MB Mfc 18.4000 Memory barrier
980//STL_C Mem 2E Store longword conditional
981//STQ_C Mem 2F Store quadword conditional
982//STQ_U Mem 0F Store unaligned quadword
983//TRAPB Mfc 18.0000 Trap barrier
984//WH64 Mfc 18.F800 Write hint  64 bytes
985//WMB Mfc 18.4400 Write memory barrier
986//MF_FPCR F-P 17.025 Move from FPCR
987//MT_FPCR F-P 17.024 Move to FPCR
988//There are in the Multimedia extentions, so let's not use them yet
989//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
990//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
991//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
992//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
993//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
994//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
995//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
996//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
997//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
998//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
999//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
1000//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
1001//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
1002//CVTLQ F-P 17.010 Convert longword to quadword
1003//CVTQL F-P 17.030 Convert quadword to longword
1004
1005
1006//Constant handling
1007
1008def immConst2Part : PatLeaf<(imm), [{
1009 //true if imm fits in a LDAH LDA pair
1010 int64_t val = (int64_t)N->getValue();
1011 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
1012}]>;
1013def immConst2PartInt : PatLeaf<(imm), [{
1014 //true if imm fits in a LDAH LDA pair with zeroext
1015 uint64_t uval = N->getValue();
1016 int32_t val32 = (int32_t)uval;
1017 return ((uval >> 32) == 0 && //empty upper bits
1018 val32 <= IMM_FULLHIGH);
1019// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
1020}], SExt32>;
1021
1022def : Pat<(i64 immConst2Part:$imm),
1023 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
1024
1025def : Pat<(i64 immSExt16:$imm),
1026 (LDA immSExt16:$imm, R31)>;
1027
1028def : Pat<(i64 immSExt16int:$imm),
1029 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
1030def : Pat<(i64 immConst2PartInt:$imm),
1031 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
1032 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
1033
1034
1035//TODO: I want to just define these like this!
1036//def : Pat<(i64 0),
1037// (R31)>;
1038//def : Pat<(f64 0.0),
1039// (F31)>;
1040//def : Pat<(f64 -0.0),
1041// (CPYSNT F31, F31)>;
1042//def : Pat<(f32 0.0),
1043// (F31)>;
1044//def : Pat<(f32 -0.0),
1045// (CPYSNS F31, F31)>;
1046
1047//Misc Patterns:
1048
1049def : Pat<(sext_inreg GPRC:$RB, i32),
1050 (ADDLi GPRC:$RB, 0)>;
1051
1052def : Pat<(fabs F8RC:$RB),
1053 (CPYST F31, F8RC:$RB)>;
1054def : Pat<(fabs F4RC:$RB),
1055 (CPYSS F31, F4RC:$RB)>;
1056def : Pat<(fneg F8RC:$RB),
1057 (CPYSNT F8RC:$RB, F8RC:$RB)>;
1058def : Pat<(fneg F4RC:$RB),
1059 (CPYSNS F4RC:$RB, F4RC:$RB)>;
1060
1061def : Pat<(fcopysign F4RC:$A, (fneg F4RC:$B)),
1062 (CPYSNS F4RC:$B, F4RC:$A)>;
1063def : Pat<(fcopysign F8RC:$A, (fneg F8RC:$B)),
1064 (CPYSNT F8RC:$B, F8RC:$A)>;
1065def : Pat<(fcopysign F4RC:$A, (fneg F8RC:$B)),
1066 (CPYSNSt F8RC:$B, F4RC:$A)>;
1067def : Pat<(fcopysign F8RC:$A, (fneg F4RC:$B)),
1068 (CPYSNTs F4RC:$B, F8RC:$A)>;
1069
1070//Yes, signed multiply high is ugly
1071def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
1072 (SUBQr (UMULHr GPRC:$RA, GPRC:$RB), (ADDQr (CMOVGEr GPRC:$RB, R31, GPRC:$RA),
1073 (CMOVGEr GPRC:$RA, R31, GPRC:$RB)))>;
1074
1075//Stupid crazy arithmetic stuff:
1076let AddedComplexity = 1 in {
1077def : Pat<(mul GPRC:$RA, 5), (S4ADDQr GPRC:$RA, GPRC:$RA)>;
1078def : Pat<(mul GPRC:$RA, 9), (S8ADDQr GPRC:$RA, GPRC:$RA)>;
1079def : Pat<(mul GPRC:$RA, 3), (S4SUBQr GPRC:$RA, GPRC:$RA)>;
1080def : Pat<(mul GPRC:$RA, 7), (S8SUBQr GPRC:$RA, GPRC:$RA)>;
1081
1082//slight tree expansion if we are multiplying near to a power of 2
1083//n is above a power of 2
1084def : Pat<(mul GPRC:$RA, immRem1:$imm),
1085 (ADDQr (SLr GPRC:$RA, (nearP2X immRem1:$imm)), GPRC:$RA)>;
1086def : Pat<(mul GPRC:$RA, immRem2:$imm),
1087 (ADDQr (SLr GPRC:$RA, (nearP2X immRem2:$imm)), (ADDQr GPRC:$RA, GPRC:$RA))>;
1088def : Pat<(mul GPRC:$RA, immRem3:$imm),
1089 (ADDQr (SLr GPRC:$RA, (nearP2X immRem3:$imm)), (S4SUBQr GPRC:$RA, GPRC:$RA))>;
1090def : Pat<(mul GPRC:$RA, immRem4:$imm),
1091 (S4ADDQr GPRC:$RA, (SLr GPRC:$RA, (nearP2X immRem4:$imm)))>;
1092def : Pat<(mul GPRC:$RA, immRem5:$imm),
1093 (ADDQr (SLr GPRC:$RA, (nearP2X immRem5:$imm)), (S4ADDQr GPRC:$RA, GPRC:$RA))>;
1094def : Pat<(mul GPRC:$RA, immRemP2:$imm),
1095 (ADDQr (SLr GPRC:$RA, (nearP2X immRemP2:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2:$imm)))>;
1096
1097//n is below a power of 2
Andrew Lenharthd0ac96e2007-11-27 18:31:30 +00001098//FIXME: figure out why something is truncating the imm to 32bits
1099// this will fix 2007-11-27-mulneg3
1100//def : Pat<(mul GPRC:$RA, immRem1n:$imm),
1101// (SUBQr (SLr GPRC:$RA, (nearP2X immRem1n:$imm)), GPRC:$RA)>;
1102//def : Pat<(mul GPRC:$RA, immRem2n:$imm),
1103// (SUBQr (SLr GPRC:$RA, (nearP2X immRem2n:$imm)), (ADDQr GPRC:$RA, GPRC:$RA))>;
1104//def : Pat<(mul GPRC:$RA, immRem3n:$imm),
1105// (SUBQr (SLr GPRC:$RA, (nearP2X immRem3n:$imm)), (S4SUBQr GPRC:$RA, GPRC:$RA))>;
1106//def : Pat<(mul GPRC:$RA, immRem4n:$imm),
1107// (SUBQr (SLr GPRC:$RA, (nearP2X immRem4n:$imm)), (SLi GPRC:$RA, 2))>;
1108//def : Pat<(mul GPRC:$RA, immRem5n:$imm),
1109// (SUBQr (SLr GPRC:$RA, (nearP2X immRem5n:$imm)), (S4ADDQr GPRC:$RA, GPRC:$RA))>;
1110//def : Pat<(mul GPRC:$RA, immRemP2n:$imm),
1111// (SUBQr (SLr GPRC:$RA, (nearP2X immRemP2n:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2n:$imm)))>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001112} //Added complexity