blob: 1ab6d4c669705f73b5fbd2d9821efa0fbaa9eb69 [file] [log] [blame]
Misha Brukmanbc9ccf62005-02-04 20:25:52 +00001//===- AlphaInstrInfo.td - The Alpha Instruction Set -------*- tablegen -*-===//
Andrew Lenharth304d0f32005-01-22 23:41:55 +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//===----------------------------------------------------------------------===//
9//
10//
11//===----------------------------------------------------------------------===//
12
13include "AlphaInstrFormats.td"
14
Andrew Lenharth4907d222005-10-20 00:28:31 +000015//********************
Andrew Lenharth7f0db912005-11-30 07:19:56 +000016//Custom DAG Nodes
17//********************
18
19def SDTFPUnaryOpUnC : SDTypeProfile<1, 1, [
20 SDTCisFP<1>, SDTCisFP<0>
21]>;
Andrew Lenharth167bc6e2006-01-23 20:59:50 +000022def 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, []>;
27def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000028
Andrew Lenharthf2b806a2006-06-12 18:09:24 +000029def retflag : SDNode<"AlphaISD::RET_FLAG", SDTRet,
30 [SDNPHasChain, SDNPOptInFlag]>;
31
Andrew Lenharth79620652005-12-05 20:50:53 +000032// These are target-independent nodes, but have target-specific formats.
Bill Wendling0f8d9c02007-11-13 00:44:25 +000033def SDT_AlphaCallSeq_start : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
34def SDT_AlphaCallSeq_end : SDTypeProfile<0, 2, [ SDTCisVT<0, i64>,
35 SDTCisVT<1, i64> ]>;
36
37def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq_start,
Evan Chengbb7b8442006-08-11 09:03:33 +000038 [SDNPHasChain, SDNPOutFlag]>;
Bill Wendling0f8d9c02007-11-13 00:44:25 +000039def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq_end,
40 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
Andrew Lenharth79620652005-12-05 20:50:53 +000041
Andrew Lenharth7f0db912005-11-30 07:19:56 +000042//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000043//Paterns for matching
44//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000045def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000046 return getI64Imm(~N->getValue());
47}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000048def negX : SDNodeXForm<imm, [{ //negate
49 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000050}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000051def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000052 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
53}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000054def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
55 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000056}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000057def 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}]>;
Chris Lattnerd615ded2006-10-11 05:13:56 +000063def iZAPX : SDNodeXForm<and, [{ // get imm to ZAPi
64 ConstantSDNode *RHS = cast<ConstantSDNode>(N->getOperand(1));
65 return getI64Imm(get_zapImm(SDOperand(), RHS->getValue()));
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000066}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000067def nearP2X : SDNodeXForm<imm, [{
68 return getI64Imm(Log2_64(getNearPower2((uint64_t)N->getValue())));
69}]>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +000070def nearP2RemX : SDNodeXForm<imm, [{
71 uint64_t x = abs(N->getValue() - getNearPower2((uint64_t)N->getValue()));
72 return getI64Imm(Log2_64(x));
73}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000074
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>;
Chris Lattnerd615ded2006-10-11 05:13:56 +000090
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
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000099def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
Chris Lattner1331dec2006-11-03 01:18:29 +0000100 (void)N; // silence warning.
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000101 return true;
102}]>;
Andrew Lenharth956a4312006-10-31 19:52:12 +0000103
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
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000115def 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()));
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000120}]>;
121def immUExt8ME : PatLeaf<(imm), [{ //use this imm for mulqi
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000122 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) {
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000125 case 1: case 3: case 5: return false;
126 default: return (uint64_t)N->getValue() == (uint8_t)N->getValue();
127 };
128}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000129
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000130def 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)>;
Andrew Lenharth956a4312006-10-31 19:52:12 +0000139class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000140class CmpOpFrag<dag res> : PatFrag<(ops node:$R), res>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000141
142//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000143
Evan Cheng64d80e32007-07-19 01:14:50 +0000144def IDEF_I : PseudoInstAlpha<(outs GPRC:$RA), (ins), ";#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000145 [(set GPRC:$RA, (undef))], s_pseudo>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000146def IDEF_F32 : PseudoInstAlpha<(outs F4RC:$RA), (ins), ";#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000147 [(set F4RC:$RA, (undef))], s_pseudo>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000148def IDEF_F64 : PseudoInstAlpha<(outs F8RC:$RA), (ins), ";#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000149 [(set F8RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000150
Evan Cheng64d80e32007-07-19 01:14:50 +0000151def WTF : PseudoInstAlpha<(outs), (ins variable_ops), "#wtf", [], s_pseudo>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000152
Evan Cheng071a2792007-09-11 19:55:27 +0000153let isLoad = 1, hasCtrlDep = 1, Defs = [R30], Uses = [R30] in {
Bill Wendling0f8d9c02007-11-13 00:44:25 +0000154def ADJUSTSTACKUP : PseudoInstAlpha<(outs), (ins s64imm:$amt),
155 "; ADJUP $amt",
Evan Cheng071a2792007-09-11 19:55:27 +0000156 [(callseq_start imm:$amt)], s_pseudo>;
Bill Wendling0f8d9c02007-11-13 00:44:25 +0000157def ADJUSTSTACKDOWN : PseudoInstAlpha<(outs), (ins s64imm:$amt1, s64imm:$amt2),
158 "; ADJDOWN $amt1",
159 [(callseq_end imm:$amt1, imm:$amt2)], s_pseudo>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000160}
Bill Wendling0f8d9c02007-11-13 00:44:25 +0000161
Evan Cheng64d80e32007-07-19 01:14:50 +0000162def ALTENT : PseudoInstAlpha<(outs), (ins s64imm:$TARGET), "$$$TARGET..ng:\n", [], s_pseudo>;
163def PCLABEL : PseudoInstAlpha<(outs), (ins s64imm:$num), "PCMARKER_$num:\n",[], s_pseudo>;
164def MEMLABEL : PseudoInstAlpha<(outs), (ins s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth017c5562006-03-09 17:16:45 +0000165 "LSMARKER$$$i$$$j$$$k$$$m:", [], s_pseudo>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000166
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000167
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000168//***********************
169//Real instructions
170//***********************
171
172//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000173
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000174//conditional moves, int
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000175
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000176multiclass cmov_inst<bits<7> fun, string asmstr, PatFrag OpNode> {
177def r : OForm4<0x11, fun, !strconcat(asmstr, " $RCOND,$RTRUE,$RDEST"),
178 [(set GPRC:$RDEST, (select (OpNode GPRC:$RCOND), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
179def i : OForm4L<0x11, fun, !strconcat(asmstr, " $RCOND,$RTRUE,$RDEST"),
180 [(set GPRC:$RDEST, (select (OpNode GPRC:$RCOND), immUExt8:$RTRUE, GPRC:$RFALSE))], s_cmov>;
181}
Andrew Lenharth77f08852006-02-01 19:37:33 +0000182
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000183defm CMOVEQ : cmov_inst<0x24, "cmoveq", CmpOpFrag<(seteq node:$R, 0)>>;
184defm CMOVNE : cmov_inst<0x26, "cmovne", CmpOpFrag<(setne node:$R, 0)>>;
185defm CMOVLT : cmov_inst<0x44, "cmovlt", CmpOpFrag<(setlt node:$R, 0)>>;
186defm CMOVLE : cmov_inst<0x64, "cmovle", CmpOpFrag<(setle node:$R, 0)>>;
187defm CMOVGT : cmov_inst<0x66, "cmovgt", CmpOpFrag<(setgt node:$R, 0)>>;
188defm CMOVGE : cmov_inst<0x46, "cmovge", CmpOpFrag<(setge node:$R, 0)>>;
189defm CMOVLBC : cmov_inst<0x16, "cmovlbc", CmpOpFrag<(xor node:$R, 1)>>;
190defm CMOVLBS : cmov_inst<0x14, "cmovlbs", CmpOpFrag<(and node:$R, 1)>>;
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000191
Andrew Lenharth133d3102006-02-03 03:07:37 +0000192//General pattern for cmov
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000193def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000194 (CMOVNEr GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000195def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
196 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000197
Andrew Lenharth6b634032006-09-20 15:05:49 +0000198//Invert sense when we can for constants:
Andrew Lenharth15b78232007-04-17 04:07:59 +0000199def : Pat<(select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
200 (CMOVEQi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
201def : Pat<(select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
202 (CMOVLEi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
203def : Pat<(select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
204 (CMOVLTi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
205def : Pat<(select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
206 (CMOVGEi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
207def : Pat<(select (setle GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
208 (CMOVGTi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
Andrew Lenharth6b634032006-09-20 15:05:49 +0000209
Andrew Lenharth956a4312006-10-31 19:52:12 +0000210multiclass all_inst<bits<6> opc, bits<7> funl, bits<7> funq,
211 string asmstr, PatFrag OpNode, InstrItinClass itin> {
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000212 def Lr : OForm< opc, funl, !strconcat(asmstr, "l $RA,$RB,$RC"),
Andrew Lenharth956a4312006-10-31 19:52:12 +0000213 [(set GPRC:$RC, (intop (OpNode GPRC:$RA, GPRC:$RB)))], itin>;
214 def Li : OFormL<opc, funl, !strconcat(asmstr, "l $RA,$L,$RC"),
215 [(set GPRC:$RC, (intop (OpNode GPRC:$RA, immUExt8:$L)))], itin>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000216 def Qr : OForm< opc, funq, !strconcat(asmstr, "q $RA,$RB,$RC"),
Andrew Lenharth956a4312006-10-31 19:52:12 +0000217 [(set GPRC:$RC, (OpNode GPRC:$RA, GPRC:$RB))], itin>;
218 def Qi : OFormL<opc, funq, !strconcat(asmstr, "q $RA,$L,$RC"),
219 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8:$L))], itin>;
220}
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000221
Andrew Lenharth956a4312006-10-31 19:52:12 +0000222defm MUL : all_inst<0x13, 0x00, 0x20, "mul", BinOpFrag<(mul node:$LHS, node:$RHS)>, s_imul>;
223defm ADD : all_inst<0x10, 0x00, 0x20, "add", BinOpFrag<(add node:$LHS, node:$RHS)>, s_iadd>;
224defm S4ADD : all_inst<0x10, 0x02, 0x22, "s4add", add4, s_iadd>;
225defm S8ADD : all_inst<0x10, 0x12, 0x32, "s8add", add8, s_iadd>;
226defm S4SUB : all_inst<0x10, 0x0B, 0x2B, "s4sub", sub4, s_iadd>;
227defm S8SUB : all_inst<0x10, 0x1B, 0x3B, "s8sub", sub8, s_iadd>;
228defm SUB : all_inst<0x10, 0x09, 0x29, "sub", BinOpFrag<(sub node:$LHS, node:$RHS)>, s_iadd>;
229//Const cases since legalize does sub x, int -> add x, inv(int) + 1
230def : Pat<(intop (add GPRC:$RA, immUExt8neg:$L)), (SUBLi GPRC:$RA, immUExt8neg:$L)>;
231def : Pat<(add GPRC:$RA, immUExt8neg:$L), (SUBQi GPRC:$RA, immUExt8neg:$L)>;
232def : Pat<(intop (add4 GPRC:$RA, immUExt8neg:$L)), (S4SUBLi GPRC:$RA, immUExt8neg:$L)>;
233def : Pat<(add4 GPRC:$RA, immUExt8neg:$L), (S4SUBQi GPRC:$RA, immUExt8neg:$L)>;
234def : Pat<(intop (add8 GPRC:$RA, immUExt8neg:$L)), (S8SUBLi GPRC:$RA, immUExt8neg:$L)>;
235def : Pat<(add8 GPRC:$RA, immUExt8neg:$L), (S8SUBQi GPRC:$RA, immUExt8neg:$L)>;
236
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000237multiclass log_inst<bits<6> opc, bits<7> fun, string asmstr, SDNode OpNode, InstrItinClass itin> {
238def r : OForm<opc, fun, !strconcat(asmstr, " $RA,$RB,$RC"),
239 [(set GPRC:$RC, (OpNode GPRC:$RA, GPRC:$RB))], itin>;
240def i : OFormL<opc, fun, !strconcat(asmstr, " $RA,$L,$RC"),
241 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8:$L))], itin>;
242}
243multiclass inv_inst<bits<6> opc, bits<7> fun, string asmstr, SDNode OpNode, InstrItinClass itin> {
244def r : OForm<opc, fun, !strconcat(asmstr, " $RA,$RB,$RC"),
245 [(set GPRC:$RC, (OpNode GPRC:$RA, (not GPRC:$RB)))], itin>;
246def i : OFormL<opc, fun, !strconcat(asmstr, " $RA,$L,$RC"),
247 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8inv:$L))], itin>;
248}
Andrew Lenharth956a4312006-10-31 19:52:12 +0000249
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000250defm AND : log_inst<0x11, 0x00, "and", and, s_ilog>;
251defm BIC : inv_inst<0x11, 0x08, "bic", and, s_ilog>;
252defm BIS : log_inst<0x11, 0x20, "bis", or, s_ilog>;
253defm ORNOT : inv_inst<0x11, 0x28, "ornot", or, s_ilog>;
254defm XOR : log_inst<0x11, 0x40, "xor", xor, s_ilog>;
255defm EQV : inv_inst<0x11, 0x48, "eqv", xor, s_ilog>;
256
257defm SL : log_inst<0x12, 0x39, "sll", shl, s_ishf>;
258defm SRA : log_inst<0x12, 0x3c, "sra", sra, s_ishf>;
259defm SRL : log_inst<0x12, 0x34, "srl", srl, s_ishf>;
260defm UMULH : log_inst<0x13, 0x30, "umulh", mulhu, s_imul>;
261
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000262def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000263 [(set GPRC:$RC, (ctlz GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000264def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000265 [(set GPRC:$RC, (ctpop GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000266def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000267 [(set GPRC:$RC, (cttz GPRC:$RB))], s_imisc>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000268def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000269 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000270def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000271 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000272def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000273 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))], s_ishf>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000274def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
275 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))], s_ishf>;
276def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
277 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000278
Andrew Lenharth4907d222005-10-20 00:28:31 +0000279//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
280//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
281//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000282//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
283//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
284//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
285//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
286//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
287//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
288//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000289//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000290
Andrew Lenharth4907d222005-10-20 00:28:31 +0000291//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
292//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
293//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
294//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
295//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
296//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
297//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
298//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
299//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
300//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
301//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
302//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
303//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
304//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000305
Andrew Lenharth4907d222005-10-20 00:28:31 +0000306//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
307//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
308//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
309//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
310//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
311//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
312//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
313//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
314//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
315//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
316//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
317//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
318//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
319//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattner78feeb02006-10-11 04:12:39 +0000320
Chris Lattnerd615ded2006-10-11 05:13:56 +0000321def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC", [], s_ishf>;
322
323// Define the pattern that produces ZAPNOTi.
324def : Pat<(i64 (zappat GPRC:$RA):$imm),
325 (ZAPNOTi GPRC:$RA, (iZAPX GPRC:$imm))>;
326
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000327
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000328//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000329//So this is a waste of what this instruction can do, but it still saves something
330def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000331 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000332def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000333 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000334def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000335 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000336def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000337 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000338def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000339 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000340def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000341 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000342def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000343 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000344def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000345 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000346def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000347 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000348def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000349 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000350def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000351 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000352def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000353 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000354
355//Patterns for unsupported int comparisons
356def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
357def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
358
359def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
360def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
361
362def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
363def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
364
365def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
366def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
367
368def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
369def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
370
371def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
372def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
373
374def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
375def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
376
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000377
Evan Chengffbacca2007-07-21 00:34:19 +0000378let isReturn = 1, isTerminator = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000379 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", s_jsr>; //Return from subroutine
Andrew Lenharthf2b806a2006-06-12 18:09:24 +0000380 def RETDAGp : MbrpForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", [(retflag)], s_jsr>; //Return from subroutine
381}
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000382
Owen Anderson20ab2902007-11-12 07:39:39 +0000383let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1, Ra = 31, disp = 0 in
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000384def JMP : MbrpForm< 0x1A, 0x00, (ops GPRC:$RS), "jmp $$31,($RS),0",
385 [(brind GPRC:$RS)], s_jsr>; //Jump
386
Evan Chengffbacca2007-07-21 00:34:19 +0000387let isCall = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000388 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000389 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000390 F0, F1,
391 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000392 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000393 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", [], s_jsr>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000394}
Evan Chengffbacca2007-07-21 00:34:19 +0000395let isCall = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000396 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
397 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
398 F0, F1,
399 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
400 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000401 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0", s_jsr>; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000402}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000403
Evan Chengffbacca2007-07-21 00:34:19 +0000404let isCall = 1, Ra = 23, Rb = 27, disp = 0,
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000405 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000406 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0", s_jsr>; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000407
Andrew Lenharth53d89702005-12-25 01:34:27 +0000408
Andrew Lenharth017c5562006-03-09 17:16:45 +0000409def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP", s_jsr>; //Jump to subroutine return
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000410
Andrew Lenharthd079cdb2006-11-02 03:05:26 +0000411
Evan Cheng64d80e32007-07-19 01:14:50 +0000412let OutOperandList = (ops GPRC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in {
Andrew Lenharthb6718602005-12-24 07:34:33 +0000413def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000414 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000415def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000416 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000417def LDL : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000418 [(set GPRC:$RA, (sextloadi32 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000419def LDLr : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000420 [(set GPRC:$RA, (sextloadi32 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000421def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000422 [(set GPRC:$RA, (zextloadi8 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000423def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000424 [(set GPRC:$RA, (zextloadi8 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000425def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000426 [(set GPRC:$RA, (zextloadi16 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000427def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000428 [(set GPRC:$RA, (zextloadi16 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000429}
Andrew Lenharthd079cdb2006-11-02 03:05:26 +0000430
431
Evan Cheng64d80e32007-07-19 01:14:50 +0000432let OutOperandList = (ops), InOperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
Andrew Lenharthb6718602005-12-24 07:34:33 +0000433def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000434 [(truncstorei8 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000435def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000436 [(truncstorei8 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000437def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000438 [(truncstorei16 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000439def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000440 [(truncstorei16 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000441def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000442 [(truncstorei32 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000443def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000444 [(truncstorei32 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000445def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000446 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000447def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000448 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000449}
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000450
451//Load address
Evan Cheng64d80e32007-07-19 01:14:50 +0000452let OutOperandList = (ops GPRC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in {
Andrew Lenharthb6718602005-12-24 07:34:33 +0000453def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000454 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_lda>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000455def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000456 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000457def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000458 [], s_lda>; //Load address high
Andrew Lenharthb6718602005-12-24 07:34:33 +0000459def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000460 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000461}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000462
Evan Cheng64d80e32007-07-19 01:14:50 +0000463let OutOperandList = (ops), InOperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
Andrew Lenharthb6718602005-12-24 07:34:33 +0000464def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000465 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000466def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000467 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000468}
469let OutOperandList = (ops F4RC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in {
Andrew Lenharthb6718602005-12-24 07:34:33 +0000470def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000471 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000472def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000473 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000474}
Evan Cheng64d80e32007-07-19 01:14:50 +0000475let OutOperandList = (ops), InOperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
Andrew Lenharthb6718602005-12-24 07:34:33 +0000476def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000477 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000478def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000479 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000480}
481let OutOperandList = (ops F8RC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in {
Andrew Lenharthb6718602005-12-24 07:34:33 +0000482def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000483 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000484def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000485 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000486}
487
Andrew Lenharthc687b482005-12-24 08:29:32 +0000488
489//constpool rels
490def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
491 (LDQr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000492def : Pat<(i64 (sextloadi32 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000493 (LDLr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000494def : Pat<(i64 (zextloadi8 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000495 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000496def : Pat<(i64 (zextloadi16 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000497 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
498def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
499 (LDAr tconstpool:$DISP, GPRC:$RB)>;
500def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
501 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
502def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
503 (LDSr tconstpool:$DISP, GPRC:$RB)>;
504def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
505 (LDTr tconstpool:$DISP, GPRC:$RB)>;
506
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000507//jumptable rels
508def : Pat<(i64 (Alpha_gprelhi tjumptable:$DISP, GPRC:$RB)),
509 (LDAHr tjumptable:$DISP, GPRC:$RB)>;
510def : Pat<(i64 (Alpha_gprello tjumptable:$DISP, GPRC:$RB)),
511 (LDAr tjumptable:$DISP, GPRC:$RB)>;
512
Andrew Lenharthc687b482005-12-24 08:29:32 +0000513
Andrew Lenharthb6718602005-12-24 07:34:33 +0000514//misc ext patterns
Evan Cheng466685d2006-10-09 20:57:25 +0000515def : Pat<(i64 (extloadi8 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000516 (LDBU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000517def : Pat<(i64 (extloadi16 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000518 (LDWU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000519def : Pat<(i64 (extloadi32 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000520 (LDL immSExt16:$DISP, GPRC:$RB)>;
521
522//0 disp patterns
523def : Pat<(i64 (load GPRC:$addr)),
524 (LDQ 0, GPRC:$addr)>;
525def : Pat<(f64 (load GPRC:$addr)),
526 (LDT 0, GPRC:$addr)>;
527def : Pat<(f32 (load GPRC:$addr)),
528 (LDS 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000529def : Pat<(i64 (sextloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000530 (LDL 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000531def : Pat<(i64 (zextloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000532 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000533def : Pat<(i64 (zextloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000534 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000535def : Pat<(i64 (extloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000536 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000537def : Pat<(i64 (extloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000538 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000539def : Pat<(i64 (extloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000540 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000541
Andrew Lenharthc687b482005-12-24 08:29:32 +0000542def : Pat<(store GPRC:$DATA, GPRC:$addr),
543 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
544def : Pat<(store F8RC:$DATA, GPRC:$addr),
545 (STT F8RC:$DATA, 0, GPRC:$addr)>;
546def : Pat<(store F4RC:$DATA, GPRC:$addr),
547 (STS F4RC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000548def : Pat<(truncstorei32 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000549 (STL GPRC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000550def : Pat<(truncstorei16 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000551 (STW GPRC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000552def : Pat<(truncstorei8 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000553 (STB GPRC:$DATA, 0, GPRC:$addr)>;
554
Andrew Lenharth4e629512005-12-24 05:36:33 +0000555
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000556//load address, rellocated gpdist form
Evan Cheng64d80e32007-07-19 01:14:50 +0000557let OutOperandList = (ops GPRC:$RA), InOperandList = (ops s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000558def LDAg : MForm<0x08, 0, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
559def LDAHg : MForm<0x09, 0, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000560}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000561
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000562//Load quad, rellocated literal form
Evan Cheng64d80e32007-07-19 01:14:50 +0000563let OutOperandList = (ops GPRC:$RA), InOperandList = (ops s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000564def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000565 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))], s_ild>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000566def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
567 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000568
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000569
Andrew Lenharth017c5562006-03-09 17:16:45 +0000570def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA", s_rpcc>; //Read process cycle counter
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000571
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000572//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000573
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000574//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000575
Evan Cheng64d80e32007-07-19 01:14:50 +0000576let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F4RC:$RB), Fa = 31 in
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000577def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000578 [(set F4RC:$RC, (fsqrt F4RC:$RB))], s_fsqrts>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000579
Evan Cheng64d80e32007-07-19 01:14:50 +0000580let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F4RC:$RA, F4RC:$RB) in {
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000581def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000582 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000583def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000584 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000585def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000586 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))], s_fdivs>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000587def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000588 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000589
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000590def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000591 [(set F4RC:$RC, (fcopysign F4RC:$RB, F4RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000592def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000593def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000594 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F4RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000595}
596
597//Doubles
598
Evan Cheng64d80e32007-07-19 01:14:50 +0000599let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000600def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000601 [(set F8RC:$RC, (fsqrt F8RC:$RB))], s_fsqrtt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000602
Evan Cheng64d80e32007-07-19 01:14:50 +0000603let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F8RC:$RA, F8RC:$RB) in {
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000604def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000605 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000606def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000607 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000608def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000609 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))], s_fdivt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000610def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000611 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000612
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000613def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000614 [(set F8RC:$RC, (fcopysign F8RC:$RB, F8RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000615def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000616def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000617 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F8RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000618
Andrew Lenharth017c5562006-03-09 17:16:45 +0000619def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000620// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000621def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000622// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000623def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000624// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000625def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000626// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
627}
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000628
629//More CPYS forms:
Evan Cheng64d80e32007-07-19 01:14:50 +0000630let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F4RC:$RA, F8RC:$RB) in {
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000631def CPYSTs : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
632 [(set F8RC:$RC, (fcopysign F8RC:$RB, F4RC:$RA))], s_fadd>;
633def CPYSNTs : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
634 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F4RC:$RA)))], s_fadd>;
635}
Evan Cheng64d80e32007-07-19 01:14:50 +0000636let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F8RC:$RA, F4RC:$RB) in {
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000637def CPYSSt : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
638 [(set F4RC:$RC, (fcopysign F4RC:$RB, F8RC:$RA))], s_fadd>;
639def CPYSESt : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
640def CPYSNSt : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
641 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F8RC:$RA)))], s_fadd>;
642}
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000643
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000644//conditional moves, floats
Evan Cheng64d80e32007-07-19 01:14:50 +0000645let OutOperandList = (ops F4RC:$RDEST), InOperandList = (ops F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000646 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000647def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if = zero
648def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if >= zero
649def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if > zero
650def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if <= zero
651def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; // FCMOVE if < zero
652def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000653}
654//conditional moves, doubles
Evan Cheng64d80e32007-07-19 01:14:50 +0000655let OutOperandList = (ops F8RC:$RDEST), InOperandList = (ops F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000656 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000657def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
658def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
659def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
660def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
661def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
662def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000663}
664
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000665//misc FP selects
666//Select double
Andrew Lenharthd079cdb2006-11-02 03:05:26 +0000667
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000668def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000669 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000670def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
671 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
672def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
673 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
674
Andrew Lenharth110f2242005-12-12 20:30:09 +0000675def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
676 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000677def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
678 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
679def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
680 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
681
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000682def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000683 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000684def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
685 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
686def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
687 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
688
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000689def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000690 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000691def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
692 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
693def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
694 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
695
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000696def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000697 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000698def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
699 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
700def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
701 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
702
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000703def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000704 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000705def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
706 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
707def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
708 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
709
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000710//Select single
711def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000712 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000713def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
714 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
715def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
716 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
717
Andrew Lenharth110f2242005-12-12 20:30:09 +0000718def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
719 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000720def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
721 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
722def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
723 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
724
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000725def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000726 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000727def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
728 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
729def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
730 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
731
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000732def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000733 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000734def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
735 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
736def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
737 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
738
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000739def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000740 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000741def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
742 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
743def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
744 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
745
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000746def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000747 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000748def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
749 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
750def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
751 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000752
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000753
754
Evan Cheng64d80e32007-07-19 01:14:50 +0000755let OutOperandList = (ops GPRC:$RC), InOperandList = (ops F4RC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000756def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[], s_ftoi>; //Floating to integer move, S_floating
Evan Cheng64d80e32007-07-19 01:14:50 +0000757let OutOperandList = (ops GPRC:$RC), InOperandList = (ops F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000758def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
Andrew Lenharth3553d862007-01-24 21:09:16 +0000759 [(set GPRC:$RC, (bitconvert F8RC:$RA))], s_ftoi>; //Floating to integer move
Evan Cheng64d80e32007-07-19 01:14:50 +0000760let OutOperandList = (ops F4RC:$RC), InOperandList = (ops GPRC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000761def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[], s_itof>; //Integer to floating move, S_floating
Evan Cheng64d80e32007-07-19 01:14:50 +0000762let OutOperandList = (ops F8RC:$RC), InOperandList = (ops GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000763def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
Andrew Lenharth3553d862007-01-24 21:09:16 +0000764 [(set F8RC:$RC, (bitconvert GPRC:$RA))], s_itof>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000765
766
Evan Cheng64d80e32007-07-19 01:14:50 +0000767let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000768def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000769 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))], s_fadd>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000770let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000771def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000772 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))], s_fadd>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000773let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000774def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000775 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))], s_fadd>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000776let OutOperandList = (ops F8RC:$RC), InOperandList = (ops F4RC:$RB), Fa = 31 in
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000777def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000778 [(set F8RC:$RC, (fextend F4RC:$RB))], s_fadd>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000779let OutOperandList = (ops F4RC:$RC), InOperandList = (ops F8RC:$RB), Fa = 31 in
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000780def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000781 [(set F4RC:$RC, (fround F8RC:$RB))], s_fadd>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000782
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000783
784/////////////////////////////////////////////////////////
785//Branching
786/////////////////////////////////////////////////////////
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000787class br_icc<bits<6> opc, string asmstr>
788 : BFormN<opc, (ops u64imm:$opc, GPRC:$R, target:$dst),
789 !strconcat(asmstr, " $R,$dst"), s_icbr>;
790class br_fcc<bits<6> opc, string asmstr>
791 : BFormN<opc, (ops u64imm:$opc, F8RC:$R, target:$dst),
792 !strconcat(asmstr, " $R,$dst"), s_fbr>;
793
Evan Chengffbacca2007-07-21 00:34:19 +0000794let isBranch = 1, isTerminator = 1, hasCtrlDep = 1 in {
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000795let Ra = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000796def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)], s_ubr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000797
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000798def COND_BRANCH_I : BFormN<0, (ops u64imm:$opc, GPRC:$R, target:$dst),
799 "{:comment} COND_BRANCH imm:$opc, GPRC:$R, bb:$dst",
800 s_icbr>;
801def COND_BRANCH_F : BFormN<0, (ops u64imm:$opc, F8RC:$R, target:$dst),
802 "{:comment} COND_BRANCH imm:$opc, F8RC:$R, bb:$dst",
803 s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000804//Branches, int
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000805def BEQ : br_icc<0x39, "beq">;
806def BGE : br_icc<0x3E, "bge">;
807def BGT : br_icc<0x3F, "bgt">;
808def BLBC : br_icc<0x38, "blbc">;
809def BLBS : br_icc<0x3C, "blbs">;
810def BLE : br_icc<0x3B, "ble">;
811def BLT : br_icc<0x3A, "blt">;
812def BNE : br_icc<0x3D, "bne">;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000813
814//Branches, float
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000815def FBEQ : br_fcc<0x31, "fbeq">;
816def FBGE : br_fcc<0x36, "fbge">;
817def FBGT : br_fcc<0x37, "fbgt">;
818def FBLE : br_fcc<0x33, "fble">;
819def FBLT : br_fcc<0x32, "fblt">;
820def FBNE : br_fcc<0x36, "fbne">;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000821}
822
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000823//An ugly trick to get the opcode as an imm I can use
824def immBRCond : SDNodeXForm<imm, [{
825 switch((uint64_t)N->getValue()) {
826 case 0: return getI64Imm(Alpha::BEQ);
827 case 1: return getI64Imm(Alpha::BNE);
828 case 2: return getI64Imm(Alpha::BGE);
829 case 3: return getI64Imm(Alpha::BGT);
830 case 4: return getI64Imm(Alpha::BLE);
831 case 5: return getI64Imm(Alpha::BLT);
832 case 6: return getI64Imm(Alpha::BLBS);
833 case 7: return getI64Imm(Alpha::BLBC);
834 case 20: return getI64Imm(Alpha::FBEQ);
835 case 21: return getI64Imm(Alpha::FBNE);
836 case 22: return getI64Imm(Alpha::FBGE);
837 case 23: return getI64Imm(Alpha::FBGT);
838 case 24: return getI64Imm(Alpha::FBLE);
839 case 25: return getI64Imm(Alpha::FBLT);
840 default: assert(0 && "Unknown branch type");
841 }
842}]>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000843
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000844//Int cond patterns
845def : Pat<(brcond (seteq GPRC:$RA, 0), bb:$DISP),
846 (COND_BRANCH_I (immBRCond 0), GPRC:$RA, bb:$DISP)>;
847def : Pat<(brcond (setge GPRC:$RA, 0), bb:$DISP),
848 (COND_BRANCH_I (immBRCond 2), GPRC:$RA, bb:$DISP)>;
849def : Pat<(brcond (setgt GPRC:$RA, 0), bb:$DISP),
850 (COND_BRANCH_I (immBRCond 3), GPRC:$RA, bb:$DISP)>;
851def : Pat<(brcond (and GPRC:$RA, 1), bb:$DISP),
852 (COND_BRANCH_I (immBRCond 6), GPRC:$RA, bb:$DISP)>;
853def : Pat<(brcond (setle GPRC:$RA, 0), bb:$DISP),
854 (COND_BRANCH_I (immBRCond 4), GPRC:$RA, bb:$DISP)>;
855def : Pat<(brcond (setlt GPRC:$RA, 0), bb:$DISP),
856 (COND_BRANCH_I (immBRCond 5), GPRC:$RA, bb:$DISP)>;
857def : Pat<(brcond (setne GPRC:$RA, 0), bb:$DISP),
858 (COND_BRANCH_I (immBRCond 1), GPRC:$RA, bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000859
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000860def : Pat<(brcond GPRC:$RA, bb:$DISP),
861 (COND_BRANCH_I (immBRCond 1), GPRC:$RA, bb:$DISP)>;
862def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
863 (COND_BRANCH_I (immBRCond 0), (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
864def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
865 (COND_BRANCH_I (immBRCond 0), (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000866
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000867//FP cond patterns
868def : Pat<(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP),
869 (COND_BRANCH_F (immBRCond 20), F8RC:$RA, bb:$DISP)>;
870def : Pat<(brcond (setne F8RC:$RA, immFPZ), bb:$DISP),
871 (COND_BRANCH_F (immBRCond 21), F8RC:$RA, bb:$DISP)>;
872def : Pat<(brcond (setge F8RC:$RA, immFPZ), bb:$DISP),
873 (COND_BRANCH_F (immBRCond 22), F8RC:$RA, bb:$DISP)>;
874def : Pat<(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP),
875 (COND_BRANCH_F (immBRCond 23), F8RC:$RA, bb:$DISP)>;
876def : Pat<(brcond (setle F8RC:$RA, immFPZ), bb:$DISP),
877 (COND_BRANCH_F (immBRCond 24), F8RC:$RA, bb:$DISP)>;
878def : Pat<(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP),
879 (COND_BRANCH_F (immBRCond 25), F8RC:$RA, bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000880
881
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000882def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
883 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
884def : Pat<(brcond (setoeq F8RC:$RA, F8RC:$RB), bb:$DISP),
885 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
886def : Pat<(brcond (setueq F8RC:$RA, F8RC:$RB), bb:$DISP),
887 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000888
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000889def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
890 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
891def : Pat<(brcond (setolt F8RC:$RA, F8RC:$RB), bb:$DISP),
892 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
893def : Pat<(brcond (setult F8RC:$RA, F8RC:$RB), bb:$DISP),
894 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000895
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000896def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
897 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
898def : Pat<(brcond (setole F8RC:$RA, F8RC:$RB), bb:$DISP),
899 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
900def : Pat<(brcond (setule F8RC:$RA, F8RC:$RB), bb:$DISP),
901 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000902
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000903def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
904 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
905def : Pat<(brcond (setogt F8RC:$RA, F8RC:$RB), bb:$DISP),
906 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
907def : Pat<(brcond (setugt F8RC:$RA, F8RC:$RB), bb:$DISP),
908 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000909
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000910def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
911 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
912def : Pat<(brcond (setoge F8RC:$RA, F8RC:$RB), bb:$DISP),
913 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
914def : Pat<(brcond (setuge F8RC:$RA, F8RC:$RB), bb:$DISP),
915 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000916
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000917def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
918 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
919def : Pat<(brcond (setone F8RC:$RA, F8RC:$RB), bb:$DISP),
920 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
921def : Pat<(brcond (setune F8RC:$RA, F8RC:$RB), bb:$DISP),
922 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
923
924
925def : Pat<(brcond (setoeq F8RC:$RA, immFPZ), bb:$DISP),
926 (COND_BRANCH_F (immBRCond 20), F8RC:$RA,bb:$DISP)>;
927def : Pat<(brcond (setueq F8RC:$RA, immFPZ), bb:$DISP),
928 (COND_BRANCH_F (immBRCond 20), F8RC:$RA,bb:$DISP)>;
929
930def : Pat<(brcond (setoge F8RC:$RA, immFPZ), bb:$DISP),
931 (COND_BRANCH_F (immBRCond 22), F8RC:$RA,bb:$DISP)>;
932def : Pat<(brcond (setuge F8RC:$RA, immFPZ), bb:$DISP),
933 (COND_BRANCH_F (immBRCond 22), F8RC:$RA,bb:$DISP)>;
934
935def : Pat<(brcond (setogt F8RC:$RA, immFPZ), bb:$DISP),
936 (COND_BRANCH_F (immBRCond 23), F8RC:$RA,bb:$DISP)>;
937def : Pat<(brcond (setugt F8RC:$RA, immFPZ), bb:$DISP),
938 (COND_BRANCH_F (immBRCond 23), F8RC:$RA,bb:$DISP)>;
939
940def : Pat<(brcond (setole F8RC:$RA, immFPZ), bb:$DISP),
941 (COND_BRANCH_F (immBRCond 24), F8RC:$RA,bb:$DISP)>;
942def : Pat<(brcond (setule F8RC:$RA, immFPZ), bb:$DISP),
943 (COND_BRANCH_F (immBRCond 24), F8RC:$RA,bb:$DISP)>;
944
945def : Pat<(brcond (setolt F8RC:$RA, immFPZ), bb:$DISP),
946 (COND_BRANCH_F (immBRCond 25), F8RC:$RA,bb:$DISP)>;
947def : Pat<(brcond (setult F8RC:$RA, immFPZ), bb:$DISP),
948 (COND_BRANCH_F (immBRCond 25), F8RC:$RA,bb:$DISP)>;
949
950def : Pat<(brcond (setone F8RC:$RA, immFPZ), bb:$DISP),
951 (COND_BRANCH_F (immBRCond 21), F8RC:$RA,bb:$DISP)>;
952def : Pat<(brcond (setune F8RC:$RA, immFPZ), bb:$DISP),
953 (COND_BRANCH_F (immBRCond 21), F8RC:$RA,bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000954
955//End Branches
956
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000957//S_floating : IEEE Single
958//T_floating : IEEE Double
959
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000960//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000961//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000962//CALL_PAL Pcd 00 Trap to PALcode
963//ECB Mfc 18.E800 Evict cache block
964//EXCB Mfc 18.0400 Exception barrier
965//FETCH Mfc 18.8000 Prefetch data
966//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000967//LDL_L Mem 2A Load sign-extended longword locked
968//LDQ_L Mem 2B Load quadword locked
969//LDQ_U Mem 0B Load unaligned quadword
970//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000971//STL_C Mem 2E Store longword conditional
972//STQ_C Mem 2F Store quadword conditional
973//STQ_U Mem 0F Store unaligned quadword
974//TRAPB Mfc 18.0000 Trap barrier
975//WH64 Mfc 18.F800 Write hint  64 bytes
976//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000977//MF_FPCR F-P 17.025 Move from FPCR
978//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000979//There are in the Multimedia extentions, so let's not use them yet
980//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
981//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
982//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
983//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
984//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
985//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
986//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
987//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
988//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
989//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
990//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
991//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
992//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
993//CVTLQ F-P 17.010 Convert longword to quadword
994//CVTQL F-P 17.030 Convert quadword to longword
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000995
996
Andrew Lenharth50b37842005-11-22 04:20:06 +0000997//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000998
Andrew Lenharth50b37842005-11-22 04:20:06 +0000999def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001000 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +00001001 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001002 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +00001003}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001004def immConst2PartInt : PatLeaf<(imm), [{
1005 //true if imm fits in a LDAH LDA pair with zeroext
1006 uint64_t uval = N->getValue();
1007 int32_t val32 = (int32_t)uval;
1008 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001009 val32 <= IMM_FULLHIGH);
1010// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
1011}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001012
1013def : Pat<(i64 immConst2Part:$imm),
1014 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +00001015
1016def : Pat<(i64 immSExt16:$imm),
1017 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001018
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001019def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001020 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001021def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharth6e707fb2006-01-16 21:41:39 +00001022 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
Andrew Lenharth29418a82006-01-10 19:12:47 +00001023 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001024
1025
Andrew Lenharth50b37842005-11-22 04:20:06 +00001026//TODO: I want to just define these like this!
1027//def : Pat<(i64 0),
1028// (R31)>;
1029//def : Pat<(f64 0.0),
1030// (F31)>;
1031//def : Pat<(f64 -0.0),
1032// (CPYSNT F31, F31)>;
1033//def : Pat<(f32 0.0),
1034// (F31)>;
1035//def : Pat<(f32 -0.0),
1036// (CPYSNS F31, F31)>;
1037
1038//Misc Patterns:
1039
1040def : Pat<(sext_inreg GPRC:$RB, i32),
1041 (ADDLi GPRC:$RB, 0)>;
1042
Andrew Lenharth7f0db912005-11-30 07:19:56 +00001043def : Pat<(fabs F8RC:$RB),
1044 (CPYST F31, F8RC:$RB)>;
1045def : Pat<(fabs F4RC:$RB),
1046 (CPYSS F31, F4RC:$RB)>;
1047def : Pat<(fneg F8RC:$RB),
1048 (CPYSNT F8RC:$RB, F8RC:$RB)>;
1049def : Pat<(fneg F4RC:$RB),
1050 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001051
Andrew Lenharth283f2222006-03-09 17:41:50 +00001052def : Pat<(fcopysign F4RC:$A, (fneg F4RC:$B)),
1053 (CPYSNS F4RC:$B, F4RC:$A)>;
1054def : Pat<(fcopysign F8RC:$A, (fneg F8RC:$B)),
1055 (CPYSNT F8RC:$B, F8RC:$A)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001056def : Pat<(fcopysign F4RC:$A, (fneg F8RC:$B)),
1057 (CPYSNSt F8RC:$B, F4RC:$A)>;
1058def : Pat<(fcopysign F8RC:$A, (fneg F4RC:$B)),
1059 (CPYSNTs F4RC:$B, F8RC:$A)>;
Andrew Lenharth13beebb2006-03-09 14:58:25 +00001060
Andrew Lenharthcd804962005-11-30 16:10:29 +00001061//Yes, signed multiply high is ugly
1062def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001063 (SUBQr (UMULHr GPRC:$RA, GPRC:$RB), (ADDQr (CMOVGEr GPRC:$RB, R31, GPRC:$RA),
1064 (CMOVGEr GPRC:$RA, R31, GPRC:$RB)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001065
1066//Stupid crazy arithmetic stuff:
Andrew Lenharth956a4312006-10-31 19:52:12 +00001067let AddedComplexity = 1 in {
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001068def : Pat<(mul GPRC:$RA, 5), (S4ADDQr GPRC:$RA, GPRC:$RA)>;
1069def : Pat<(mul GPRC:$RA, 9), (S8ADDQr GPRC:$RA, GPRC:$RA)>;
1070def : Pat<(mul GPRC:$RA, 3), (S4SUBQr GPRC:$RA, GPRC:$RA)>;
1071def : Pat<(mul GPRC:$RA, 7), (S8SUBQr GPRC:$RA, GPRC:$RA)>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001072
Andrew Lenharth956a4312006-10-31 19:52:12 +00001073//slight tree expansion if we are multiplying near to a power of 2
1074//n is above a power of 2
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001075def : Pat<(mul GPRC:$RA, immRem1:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001076 (ADDQr (SLr GPRC:$RA, (nearP2X immRem1:$imm)), GPRC:$RA)>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001077def : Pat<(mul GPRC:$RA, immRem2:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001078 (ADDQr (SLr GPRC:$RA, (nearP2X immRem2:$imm)), (ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001079def : Pat<(mul GPRC:$RA, immRem3:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001080 (ADDQr (SLr GPRC:$RA, (nearP2X immRem3:$imm)), (S4SUBQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001081def : Pat<(mul GPRC:$RA, immRem4:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001082 (S4ADDQr GPRC:$RA, (SLr GPRC:$RA, (nearP2X immRem4:$imm)))>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001083def : Pat<(mul GPRC:$RA, immRem5:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001084 (ADDQr (SLr GPRC:$RA, (nearP2X immRem5:$imm)), (S4ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001085def : Pat<(mul GPRC:$RA, immRemP2:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001086 (ADDQr (SLr GPRC:$RA, (nearP2X immRemP2:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2:$imm)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001087
Andrew Lenharth956a4312006-10-31 19:52:12 +00001088//n is below a power of 2
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001089def : Pat<(mul GPRC:$RA, immRem1n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001090 (SUBQr (SLr GPRC:$RA, (nearP2X immRem1n:$imm)), GPRC:$RA)>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001091def : Pat<(mul GPRC:$RA, immRem2n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001092 (SUBQr (SLr GPRC:$RA, (nearP2X immRem2n:$imm)), (ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001093def : Pat<(mul GPRC:$RA, immRem3n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001094 (SUBQr (SLr GPRC:$RA, (nearP2X immRem3n:$imm)), (S4SUBQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001095def : Pat<(mul GPRC:$RA, immRem4n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001096 (SUBQr (SLr GPRC:$RA, (nearP2X immRem4n:$imm)), (SLi GPRC:$RA, 2))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001097def : Pat<(mul GPRC:$RA, immRem5n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001098 (SUBQr (SLr GPRC:$RA, (nearP2X immRem5n:$imm)), (S4ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001099def : Pat<(mul GPRC:$RA, immRemP2n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001100 (SUBQr (SLr GPRC:$RA, (nearP2X immRemP2n:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2n:$imm)))>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001101} //Added complexity