blob: 807dd250310928c9e73d8da81cbac653d8707ed3 [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_itoft : SDNode<"AlphaISD::ITOFT_", SDTIntToFPOp, []>;
23def Alpha_ftoit : SDNode<"AlphaISD::FTOIT_", SDTFPToIntOp, []>;
24def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
25def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
26def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_" , SDTFPUnaryOp, []>;
27def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
28def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
29def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000030
Andrew Lenharthf2b806a2006-06-12 18:09:24 +000031def retflag : SDNode<"AlphaISD::RET_FLAG", SDTRet,
32 [SDNPHasChain, SDNPOptInFlag]>;
33
Andrew Lenharth79620652005-12-05 20:50:53 +000034// These are target-independent nodes, but have target-specific formats.
35def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
Evan Chengbb7b8442006-08-11 09:03:33 +000036def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,
37 [SDNPHasChain, SDNPOutFlag]>;
38def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,
39 [SDNPHasChain, SDNPOutFlag]>;
Andrew Lenharth79620652005-12-05 20:50:53 +000040
Andrew Lenharth7f0db912005-11-30 07:19:56 +000041//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000042//Paterns for matching
43//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000044def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000045 return getI64Imm(~N->getValue());
46}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000047def negX : SDNodeXForm<imm, [{ //negate
48 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000049}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000050def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000051 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
52}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000053def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
54 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000055}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000056def LL16 : SDNodeXForm<imm, [{ //lda part of constant
57 return getI64Imm(get_lda16(N->getValue()));
58}]>;
59def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
60 return getI64Imm(get_ldah16(N->getValue()));
61}]>;
Chris Lattnerd615ded2006-10-11 05:13:56 +000062def iZAPX : SDNodeXForm<and, [{ // get imm to ZAPi
63 ConstantSDNode *RHS = cast<ConstantSDNode>(N->getOperand(1));
64 return getI64Imm(get_zapImm(SDOperand(), RHS->getValue()));
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000065}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000066def nearP2X : SDNodeXForm<imm, [{
67 return getI64Imm(Log2_64(getNearPower2((uint64_t)N->getValue())));
68}]>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +000069def nearP2RemX : SDNodeXForm<imm, [{
70 uint64_t x = abs(N->getValue() - getNearPower2((uint64_t)N->getValue()));
71 return getI64Imm(Log2_64(x));
72}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000073
74def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
75 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
76}]>;
77def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
78 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
79}], invX>;
80def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
81 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
82}], negX>;
83def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
84 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
85}]>;
86def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
87 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
88}], SExt16>;
Chris Lattnerd615ded2006-10-11 05:13:56 +000089
90def zappat : PatFrag<(ops node:$LHS), (and node:$LHS, imm:$L), [{
91 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
92 uint64_t build = get_zapImm(N->getOperand(0), (uint64_t)RHS->getValue());
93 return build != 0;
94 }
95 return false;
96}]>;
97
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000098def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
99 return true;
100}]>;
Andrew Lenharth956a4312006-10-31 19:52:12 +0000101
102def immRem1 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),1, 0);}]>;
103def immRem2 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),2, 0);}]>;
104def immRem3 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),3, 0);}]>;
105def immRem4 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),4, 0);}]>;
106def immRem5 : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),5, 0);}]>;
107def immRem1n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),1, 1);}]>;
108def immRem2n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),2, 1);}]>;
109def immRem3n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),3, 1);}]>;
110def immRem4n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),4, 1);}]>;
111def immRem5n : PatLeaf<(imm), [{return chkRemNearPower2(N->getValue(),5, 1);}]>;
112
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000113def immRemP2n : PatLeaf<(imm), [{
114 return isPowerOf2_64(getNearPower2((uint64_t)N->getValue()) - N->getValue());
115}]>;
116def immRemP2 : PatLeaf<(imm), [{
117 return isPowerOf2_64(N->getValue() - getNearPower2((uint64_t)N->getValue()));
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000118}]>;
119def immUExt8ME : PatLeaf<(imm), [{ //use this imm for mulqi
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000120 int64_t d = abs((int64_t)N->getValue() - (int64_t)getNearPower2((uint64_t)N->getValue()));
121 if (isPowerOf2_64(d)) return false;
122 switch (d) {
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000123 case 1: case 3: case 5: return false;
124 default: return (uint64_t)N->getValue() == (uint8_t)N->getValue();
125 };
126}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000127
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000128def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
129def add4 : PatFrag<(ops node:$op1, node:$op2),
130 (add (shl node:$op1, 2), node:$op2)>;
131def sub4 : PatFrag<(ops node:$op1, node:$op2),
132 (sub (shl node:$op1, 2), node:$op2)>;
133def add8 : PatFrag<(ops node:$op1, node:$op2),
134 (add (shl node:$op1, 3), node:$op2)>;
135def sub8 : PatFrag<(ops node:$op1, node:$op2),
136 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth956a4312006-10-31 19:52:12 +0000137class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000138class CmpOpFrag<dag res> : PatFrag<(ops node:$R), res>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000139
140//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000141
Andrew Lenharth50b37842005-11-22 04:20:06 +0000142def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000143 [(set GPRC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000144def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000145 [(set F4RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000146def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000147 [(set F8RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000148
Andrew Lenharth017c5562006-03-09 17:16:45 +0000149def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", [], s_pseudo>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000150
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000151let isLoad = 1, hasCtrlDep = 1 in {
152def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Chris Lattner93b8e492006-10-12 18:00:14 +0000153 [(callseq_start imm:$amt)], s_pseudo>, Imp<[R30],[R30]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000154def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Chris Lattner93b8e492006-10-12 18:00:14 +0000155 [(callseq_end imm:$amt)], s_pseudo>, Imp<[R30],[R30]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000156}
Andrew Lenharth017c5562006-03-09 17:16:45 +0000157def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", [], s_pseudo>;
158def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[], s_pseudo>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000159def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth017c5562006-03-09 17:16:45 +0000160 "LSMARKER$$$i$$$j$$$k$$$m:", [], s_pseudo>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000161
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000162
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000163//***********************
164//Real instructions
165//***********************
166
167//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000168
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000169//conditional moves, int
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000170
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000171multiclass cmov_inst<bits<7> fun, string asmstr, PatFrag OpNode> {
172def r : OForm4<0x11, fun, !strconcat(asmstr, " $RCOND,$RTRUE,$RDEST"),
173 [(set GPRC:$RDEST, (select (OpNode GPRC:$RCOND), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
174def i : OForm4L<0x11, fun, !strconcat(asmstr, " $RCOND,$RTRUE,$RDEST"),
175 [(set GPRC:$RDEST, (select (OpNode GPRC:$RCOND), immUExt8:$RTRUE, GPRC:$RFALSE))], s_cmov>;
176}
Andrew Lenharth77f08852006-02-01 19:37:33 +0000177
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000178defm CMOVEQ : cmov_inst<0x24, "cmoveq", CmpOpFrag<(seteq node:$R, 0)>>;
179defm CMOVNE : cmov_inst<0x26, "cmovne", CmpOpFrag<(setne node:$R, 0)>>;
180defm CMOVLT : cmov_inst<0x44, "cmovlt", CmpOpFrag<(setlt node:$R, 0)>>;
181defm CMOVLE : cmov_inst<0x64, "cmovle", CmpOpFrag<(setle node:$R, 0)>>;
182defm CMOVGT : cmov_inst<0x66, "cmovgt", CmpOpFrag<(setgt node:$R, 0)>>;
183defm CMOVGE : cmov_inst<0x46, "cmovge", CmpOpFrag<(setge node:$R, 0)>>;
184defm CMOVLBC : cmov_inst<0x16, "cmovlbc", CmpOpFrag<(xor node:$R, 1)>>;
185defm CMOVLBS : cmov_inst<0x14, "cmovlbs", CmpOpFrag<(and node:$R, 1)>>;
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000186
Andrew Lenharth133d3102006-02-03 03:07:37 +0000187//General pattern for cmov
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000188def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000189 (CMOVNEr GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000190def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
191 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000192
Andrew Lenharth6b634032006-09-20 15:05:49 +0000193//Invert sense when we can for constants:
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000194//def : Pat<(select (setne GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
195// (CMOVNEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
196//def : Pat<(select (setgt GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
197// (CMOVGTi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
198//def : Pat<(select (setge GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
199// (CMOVGEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
200//def : Pat<(select (setlt GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
201// (CMOVLTi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
202//def : Pat<(select (setle GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
203// (CMOVLEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
Andrew Lenharth6b634032006-09-20 15:05:49 +0000204
Andrew Lenharth956a4312006-10-31 19:52:12 +0000205multiclass all_inst<bits<6> opc, bits<7> funl, bits<7> funq,
206 string asmstr, PatFrag OpNode, InstrItinClass itin> {
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000207 def Lr : OForm< opc, funl, !strconcat(asmstr, "l $RA,$RB,$RC"),
Andrew Lenharth956a4312006-10-31 19:52:12 +0000208 [(set GPRC:$RC, (intop (OpNode GPRC:$RA, GPRC:$RB)))], itin>;
209 def Li : OFormL<opc, funl, !strconcat(asmstr, "l $RA,$L,$RC"),
210 [(set GPRC:$RC, (intop (OpNode GPRC:$RA, immUExt8:$L)))], itin>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000211 def Qr : OForm< opc, funq, !strconcat(asmstr, "q $RA,$RB,$RC"),
Andrew Lenharth956a4312006-10-31 19:52:12 +0000212 [(set GPRC:$RC, (OpNode GPRC:$RA, GPRC:$RB))], itin>;
213 def Qi : OFormL<opc, funq, !strconcat(asmstr, "q $RA,$L,$RC"),
214 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8:$L))], itin>;
215}
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000216
Andrew Lenharth956a4312006-10-31 19:52:12 +0000217defm MUL : all_inst<0x13, 0x00, 0x20, "mul", BinOpFrag<(mul node:$LHS, node:$RHS)>, s_imul>;
218defm ADD : all_inst<0x10, 0x00, 0x20, "add", BinOpFrag<(add node:$LHS, node:$RHS)>, s_iadd>;
219defm S4ADD : all_inst<0x10, 0x02, 0x22, "s4add", add4, s_iadd>;
220defm S8ADD : all_inst<0x10, 0x12, 0x32, "s8add", add8, s_iadd>;
221defm S4SUB : all_inst<0x10, 0x0B, 0x2B, "s4sub", sub4, s_iadd>;
222defm S8SUB : all_inst<0x10, 0x1B, 0x3B, "s8sub", sub8, s_iadd>;
223defm SUB : all_inst<0x10, 0x09, 0x29, "sub", BinOpFrag<(sub node:$LHS, node:$RHS)>, s_iadd>;
224//Const cases since legalize does sub x, int -> add x, inv(int) + 1
225def : Pat<(intop (add GPRC:$RA, immUExt8neg:$L)), (SUBLi GPRC:$RA, immUExt8neg:$L)>;
226def : Pat<(add GPRC:$RA, immUExt8neg:$L), (SUBQi GPRC:$RA, immUExt8neg:$L)>;
227def : Pat<(intop (add4 GPRC:$RA, immUExt8neg:$L)), (S4SUBLi GPRC:$RA, immUExt8neg:$L)>;
228def : Pat<(add4 GPRC:$RA, immUExt8neg:$L), (S4SUBQi GPRC:$RA, immUExt8neg:$L)>;
229def : Pat<(intop (add8 GPRC:$RA, immUExt8neg:$L)), (S8SUBLi GPRC:$RA, immUExt8neg:$L)>;
230def : Pat<(add8 GPRC:$RA, immUExt8neg:$L), (S8SUBQi GPRC:$RA, immUExt8neg:$L)>;
231
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000232multiclass log_inst<bits<6> opc, bits<7> fun, string asmstr, SDNode OpNode, InstrItinClass itin> {
233def r : OForm<opc, fun, !strconcat(asmstr, " $RA,$RB,$RC"),
234 [(set GPRC:$RC, (OpNode GPRC:$RA, GPRC:$RB))], itin>;
235def i : OFormL<opc, fun, !strconcat(asmstr, " $RA,$L,$RC"),
236 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8:$L))], itin>;
237}
238multiclass inv_inst<bits<6> opc, bits<7> fun, string asmstr, SDNode OpNode, InstrItinClass itin> {
239def r : OForm<opc, fun, !strconcat(asmstr, " $RA,$RB,$RC"),
240 [(set GPRC:$RC, (OpNode GPRC:$RA, (not GPRC:$RB)))], itin>;
241def i : OFormL<opc, fun, !strconcat(asmstr, " $RA,$L,$RC"),
242 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8inv:$L))], itin>;
243}
Andrew Lenharth956a4312006-10-31 19:52:12 +0000244
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000245defm AND : log_inst<0x11, 0x00, "and", and, s_ilog>;
246defm BIC : inv_inst<0x11, 0x08, "bic", and, s_ilog>;
247defm BIS : log_inst<0x11, 0x20, "bis", or, s_ilog>;
248defm ORNOT : inv_inst<0x11, 0x28, "ornot", or, s_ilog>;
249defm XOR : log_inst<0x11, 0x40, "xor", xor, s_ilog>;
250defm EQV : inv_inst<0x11, 0x48, "eqv", xor, s_ilog>;
251
252defm SL : log_inst<0x12, 0x39, "sll", shl, s_ishf>;
253defm SRA : log_inst<0x12, 0x3c, "sra", sra, s_ishf>;
254defm SRL : log_inst<0x12, 0x34, "srl", srl, s_ishf>;
255defm UMULH : log_inst<0x13, 0x30, "umulh", mulhu, s_imul>;
256
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000257def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000258 [(set GPRC:$RC, (ctlz GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000259def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000260 [(set GPRC:$RC, (ctpop GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000261def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000262 [(set GPRC:$RC, (cttz GPRC:$RB))], s_imisc>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000263def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000264 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000265def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000266 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000267def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000268 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))], s_ishf>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000269def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
270 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))], s_ishf>;
271def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
272 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000273
Andrew Lenharth4907d222005-10-20 00:28:31 +0000274//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
275//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
276//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000277//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
278//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
279//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
280//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
281//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
282//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
283//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000284//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000285
Andrew Lenharth4907d222005-10-20 00:28:31 +0000286//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
287//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
288//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
289//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
290//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
291//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
292//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
293//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
294//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
295//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
296//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
297//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
298//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
299//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000300
Andrew Lenharth4907d222005-10-20 00:28:31 +0000301//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
302//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
303//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
304//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
305//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
306//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
307//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
308//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
309//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
310//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
311//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
312//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
313//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
314//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattner78feeb02006-10-11 04:12:39 +0000315
Chris Lattnerd615ded2006-10-11 05:13:56 +0000316def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC", [], s_ishf>;
317
318// Define the pattern that produces ZAPNOTi.
319def : Pat<(i64 (zappat GPRC:$RA):$imm),
320 (ZAPNOTi GPRC:$RA, (iZAPX GPRC:$imm))>;
321
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000322
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000323//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000324//So this is a waste of what this instruction can do, but it still saves something
325def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000326 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000327def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000328 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000329def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000330 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000331def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000332 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000333def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000334 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000335def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000336 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000337def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000338 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000339def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000340 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000341def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000342 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000343def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000344 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000345def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000346 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000347def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000348 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000349
350//Patterns for unsupported int comparisons
351def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
352def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
353
354def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
355def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
356
357def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
358def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
359
360def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
361def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
362
363def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
364def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
365
366def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
367def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
368
369def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
370def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
371
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000372
Andrew Lenharthf2b806a2006-06-12 18:09:24 +0000373let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000374 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", s_jsr>; //Return from subroutine
Andrew Lenharthf2b806a2006-06-12 18:09:24 +0000375 def RETDAGp : MbrpForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", [(retflag)], s_jsr>; //Return from subroutine
376}
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000377
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000378let isBranch = 1, isTerminator = 1, noResults = 1, isBarrier = 1,
379Ra = 31, disp = 0 in
380def JMP : MbrpForm< 0x1A, 0x00, (ops GPRC:$RS), "jmp $$31,($RS),0",
381 [(brind GPRC:$RS)], s_jsr>; //Jump
382
Evan Cheng2b4ea792005-12-26 09:11:45 +0000383let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000384 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000385 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000386 F0, F1,
387 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000388 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000389 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", [], s_jsr>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000390}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000391let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000392 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
393 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
394 F0, F1,
395 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
396 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000397 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0", s_jsr>; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000398}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000399
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000400let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
401 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000402 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0", s_jsr>; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000403
Andrew Lenharth53d89702005-12-25 01:34:27 +0000404
Andrew Lenharth017c5562006-03-09 17:16:45 +0000405def 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 +0000406
Andrew Lenharthd079cdb2006-11-02 03:05:26 +0000407
Andrew Lenharthb6718602005-12-24 07:34:33 +0000408let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
409def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000410 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000411def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000412 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000413def LDL : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000414 [(set GPRC:$RA, (sextloadi32 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000415def LDLr : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000416 [(set GPRC:$RA, (sextloadi32 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000417def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000418 [(set GPRC:$RA, (zextloadi8 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000419def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000420 [(set GPRC:$RA, (zextloadi8 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000421def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000422 [(set GPRC:$RA, (zextloadi16 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000423def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000424 [(set GPRC:$RA, (zextloadi16 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthd079cdb2006-11-02 03:05:26 +0000425
426
Andrew Lenharthb6718602005-12-24 07:34:33 +0000427def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000428 [(truncstorei8 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000429def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000430 [(truncstorei8 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000431def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000432 [(truncstorei16 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000433def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000434 [(truncstorei16 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000435def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000436 [(truncstorei32 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000437def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng8b2794a2006-10-13 21:14:26 +0000438 [(truncstorei32 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000439def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000440 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000441def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000442 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000443
444//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000445def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000446 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_lda>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000447def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000448 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000449def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000450 [], s_lda>; //Load address high
Andrew Lenharthb6718602005-12-24 07:34:33 +0000451def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000452 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000453}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000454
Andrew Lenharthb6718602005-12-24 07:34:33 +0000455let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
456def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000457 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000458def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000459 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000460def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000461 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000462def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000463 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000464}
465let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
466def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000467 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000468def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000469 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000470def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000471 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000472def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000473 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000474}
475
Andrew Lenharthc687b482005-12-24 08:29:32 +0000476
477//constpool rels
478def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
479 (LDQr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000480def : Pat<(i64 (sextloadi32 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000481 (LDLr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000482def : Pat<(i64 (zextloadi8 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000483 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000484def : Pat<(i64 (zextloadi16 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000485 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
486def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
487 (LDAr tconstpool:$DISP, GPRC:$RB)>;
488def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
489 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
490def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
491 (LDSr tconstpool:$DISP, GPRC:$RB)>;
492def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
493 (LDTr tconstpool:$DISP, GPRC:$RB)>;
494
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000495//jumptable rels
496def : Pat<(i64 (Alpha_gprelhi tjumptable:$DISP, GPRC:$RB)),
497 (LDAHr tjumptable:$DISP, GPRC:$RB)>;
498def : Pat<(i64 (Alpha_gprello tjumptable:$DISP, GPRC:$RB)),
499 (LDAr tjumptable:$DISP, GPRC:$RB)>;
500
Andrew Lenharthc687b482005-12-24 08:29:32 +0000501
Andrew Lenharthb6718602005-12-24 07:34:33 +0000502//misc ext patterns
Evan Cheng466685d2006-10-09 20:57:25 +0000503def : Pat<(i64 (extloadi8 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000504 (LDBU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000505def : Pat<(i64 (extloadi16 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000506 (LDWU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000507def : Pat<(i64 (extloadi32 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000508 (LDL immSExt16:$DISP, GPRC:$RB)>;
509
510//0 disp patterns
511def : Pat<(i64 (load GPRC:$addr)),
512 (LDQ 0, GPRC:$addr)>;
513def : Pat<(f64 (load GPRC:$addr)),
514 (LDT 0, GPRC:$addr)>;
515def : Pat<(f32 (load GPRC:$addr)),
516 (LDS 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000517def : Pat<(i64 (sextloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000518 (LDL 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000519def : Pat<(i64 (zextloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000520 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000521def : Pat<(i64 (zextloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000522 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000523def : Pat<(i64 (extloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000524 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000525def : Pat<(i64 (extloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000526 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000527def : Pat<(i64 (extloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000528 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000529
Andrew Lenharthc687b482005-12-24 08:29:32 +0000530def : Pat<(store GPRC:$DATA, GPRC:$addr),
531 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
532def : Pat<(store F8RC:$DATA, GPRC:$addr),
533 (STT F8RC:$DATA, 0, GPRC:$addr)>;
534def : Pat<(store F4RC:$DATA, GPRC:$addr),
535 (STS F4RC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000536def : Pat<(truncstorei32 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000537 (STL GPRC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000538def : Pat<(truncstorei16 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000539 (STW GPRC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000540def : Pat<(truncstorei8 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000541 (STB GPRC:$DATA, 0, GPRC:$addr)>;
542
Andrew Lenharth4e629512005-12-24 05:36:33 +0000543
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000544//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000545let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000546def LDAg : MForm<0x08, 0, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
547def LDAHg : MForm<0x09, 0, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000548}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000549
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000550//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000551let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000552def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000553 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))], s_ild>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000554def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
555 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000556
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000557
Andrew Lenharth017c5562006-03-09 17:16:45 +0000558def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA", s_rpcc>; //Read process cycle counter
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000559
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000560//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000561
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000562//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000563
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000564let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
565def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000566 [(set F4RC:$RC, (fsqrt F4RC:$RB))], s_fsqrts>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000567
568let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
569def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000570 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000571def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000572 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000573def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000574 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))], s_fdivs>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000575def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000576 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000577
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000578def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000579 [(set F4RC:$RC, (fcopysign F4RC:$RB, F4RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000580def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000581def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000582 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F4RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000583}
584
585//Doubles
586
587let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
588def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000589 [(set F8RC:$RC, (fsqrt F8RC:$RB))], s_fsqrtt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000590
591let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
592def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000593 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000594def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000595 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000596def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000597 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))], s_fdivt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000598def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000599 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000600
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000601def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000602 [(set F8RC:$RC, (fcopysign F8RC:$RB, F8RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000603def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000604def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000605 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F8RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000606
Andrew Lenharth017c5562006-03-09 17:16:45 +0000607def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000608// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000609def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000610// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000611def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000612// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000613def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000614// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
615}
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000616
617//More CPYS forms:
618let OperandList = (ops F8RC:$RC, F4RC:$RA, F8RC:$RB) in {
619def CPYSTs : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
620 [(set F8RC:$RC, (fcopysign F8RC:$RB, F4RC:$RA))], s_fadd>;
621def CPYSNTs : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
622 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F4RC:$RA)))], s_fadd>;
623}
624let OperandList = (ops F4RC:$RC, F8RC:$RA, F4RC:$RB) in {
625def CPYSSt : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
626 [(set F4RC:$RC, (fcopysign F4RC:$RB, F8RC:$RA))], s_fadd>;
627def CPYSESt : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
628def CPYSNSt : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
629 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F8RC:$RA)))], s_fadd>;
630}
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000631
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000632//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000633let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000634 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000635def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if = zero
636def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if >= zero
637def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if > zero
638def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if <= zero
639def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; // FCMOVE if < zero
640def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000641}
642//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000643let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000644 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000645def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
646def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
647def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
648def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
649def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
650def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000651}
652
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000653//misc FP selects
654//Select double
Andrew Lenharthd079cdb2006-11-02 03:05:26 +0000655
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000656def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000657 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000658def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
659 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
660def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
661 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
662
Andrew Lenharth110f2242005-12-12 20:30:09 +0000663def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
664 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000665def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
666 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
667def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
668 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
669
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000670def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000671 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000672def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
673 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
674def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
675 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
676
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000677def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000678 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000679def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
680 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
681def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
682 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
683
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000684def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000685 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000686def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
687 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
688def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
689 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
690
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000691def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000692 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000693def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
694 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
695def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
696 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
697
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000698//Select single
699def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000700 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000701def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
702 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
703def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
704 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
705
Andrew Lenharth110f2242005-12-12 20:30:09 +0000706def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
707 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000708def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
709 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
710def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
711 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
712
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000713def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000714 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000715def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
716 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
717def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
718 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
719
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000720def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000721 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000722def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
723 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
724def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
725 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
726
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000727def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000728 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000729def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
730 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
731def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
732 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
733
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000734def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000735 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000736def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
737 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
738def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
739 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000740
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000741
742
743let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000744def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[], s_ftoi>; //Floating to integer move, S_floating
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000745let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000746def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000747 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))], s_ftoi>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000748let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000749def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[], s_itof>; //Integer to floating move, S_floating
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000750let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000751def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000752 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))], s_itof>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000753
754
755let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000756def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000757 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000758let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000759def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000760 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000761let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000762def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000763 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000764let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
765def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000766 [(set F8RC:$RC, (fextend F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000767let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
768def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000769 [(set F4RC:$RC, (fround F8RC:$RB))], s_fadd>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000770
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000771
772/////////////////////////////////////////////////////////
773//Branching
774/////////////////////////////////////////////////////////
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000775class br_icc<bits<6> opc, string asmstr>
776 : BFormN<opc, (ops u64imm:$opc, GPRC:$R, target:$dst),
777 !strconcat(asmstr, " $R,$dst"), s_icbr>;
778class br_fcc<bits<6> opc, string asmstr>
779 : BFormN<opc, (ops u64imm:$opc, F8RC:$R, target:$dst),
780 !strconcat(asmstr, " $R,$dst"), s_fbr>;
781
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000782let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, noResults = 1 in {
783let Ra = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000784def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)], s_ubr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000785
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000786def COND_BRANCH_I : BFormN<0, (ops u64imm:$opc, GPRC:$R, target:$dst),
787 "{:comment} COND_BRANCH imm:$opc, GPRC:$R, bb:$dst",
788 s_icbr>;
789def COND_BRANCH_F : BFormN<0, (ops u64imm:$opc, F8RC:$R, target:$dst),
790 "{:comment} COND_BRANCH imm:$opc, F8RC:$R, bb:$dst",
791 s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000792//Branches, int
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000793def BEQ : br_icc<0x39, "beq">;
794def BGE : br_icc<0x3E, "bge">;
795def BGT : br_icc<0x3F, "bgt">;
796def BLBC : br_icc<0x38, "blbc">;
797def BLBS : br_icc<0x3C, "blbs">;
798def BLE : br_icc<0x3B, "ble">;
799def BLT : br_icc<0x3A, "blt">;
800def BNE : br_icc<0x3D, "bne">;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000801
802//Branches, float
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000803def FBEQ : br_fcc<0x31, "fbeq">;
804def FBGE : br_fcc<0x36, "fbge">;
805def FBGT : br_fcc<0x37, "fbgt">;
806def FBLE : br_fcc<0x33, "fble">;
807def FBLT : br_fcc<0x32, "fblt">;
808def FBNE : br_fcc<0x36, "fbne">;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000809}
810
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000811//An ugly trick to get the opcode as an imm I can use
812def immBRCond : SDNodeXForm<imm, [{
813 switch((uint64_t)N->getValue()) {
814 case 0: return getI64Imm(Alpha::BEQ);
815 case 1: return getI64Imm(Alpha::BNE);
816 case 2: return getI64Imm(Alpha::BGE);
817 case 3: return getI64Imm(Alpha::BGT);
818 case 4: return getI64Imm(Alpha::BLE);
819 case 5: return getI64Imm(Alpha::BLT);
820 case 6: return getI64Imm(Alpha::BLBS);
821 case 7: return getI64Imm(Alpha::BLBC);
822 case 20: return getI64Imm(Alpha::FBEQ);
823 case 21: return getI64Imm(Alpha::FBNE);
824 case 22: return getI64Imm(Alpha::FBGE);
825 case 23: return getI64Imm(Alpha::FBGT);
826 case 24: return getI64Imm(Alpha::FBLE);
827 case 25: return getI64Imm(Alpha::FBLT);
828 default: assert(0 && "Unknown branch type");
829 }
830}]>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000831
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000832//Int cond patterns
833def : Pat<(brcond (seteq GPRC:$RA, 0), bb:$DISP),
834 (COND_BRANCH_I (immBRCond 0), GPRC:$RA, bb:$DISP)>;
835def : Pat<(brcond (setge GPRC:$RA, 0), bb:$DISP),
836 (COND_BRANCH_I (immBRCond 2), GPRC:$RA, bb:$DISP)>;
837def : Pat<(brcond (setgt GPRC:$RA, 0), bb:$DISP),
838 (COND_BRANCH_I (immBRCond 3), GPRC:$RA, bb:$DISP)>;
839def : Pat<(brcond (and GPRC:$RA, 1), bb:$DISP),
840 (COND_BRANCH_I (immBRCond 6), GPRC:$RA, bb:$DISP)>;
841def : Pat<(brcond (setle GPRC:$RA, 0), bb:$DISP),
842 (COND_BRANCH_I (immBRCond 4), GPRC:$RA, bb:$DISP)>;
843def : Pat<(brcond (setlt GPRC:$RA, 0), bb:$DISP),
844 (COND_BRANCH_I (immBRCond 5), GPRC:$RA, bb:$DISP)>;
845def : Pat<(brcond (setne GPRC:$RA, 0), bb:$DISP),
846 (COND_BRANCH_I (immBRCond 1), GPRC:$RA, bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000847
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000848def : Pat<(brcond GPRC:$RA, bb:$DISP),
849 (COND_BRANCH_I (immBRCond 1), GPRC:$RA, bb:$DISP)>;
850def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
851 (COND_BRANCH_I (immBRCond 0), (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
852def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
853 (COND_BRANCH_I (immBRCond 0), (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000854
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000855//FP cond patterns
856def : Pat<(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP),
857 (COND_BRANCH_F (immBRCond 20), F8RC:$RA, bb:$DISP)>;
858def : Pat<(brcond (setne F8RC:$RA, immFPZ), bb:$DISP),
859 (COND_BRANCH_F (immBRCond 21), F8RC:$RA, bb:$DISP)>;
860def : Pat<(brcond (setge F8RC:$RA, immFPZ), bb:$DISP),
861 (COND_BRANCH_F (immBRCond 22), F8RC:$RA, bb:$DISP)>;
862def : Pat<(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP),
863 (COND_BRANCH_F (immBRCond 23), F8RC:$RA, bb:$DISP)>;
864def : Pat<(brcond (setle F8RC:$RA, immFPZ), bb:$DISP),
865 (COND_BRANCH_F (immBRCond 24), F8RC:$RA, bb:$DISP)>;
866def : Pat<(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP),
867 (COND_BRANCH_F (immBRCond 25), F8RC:$RA, bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000868
869
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000870def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
871 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
872def : Pat<(brcond (setoeq F8RC:$RA, F8RC:$RB), bb:$DISP),
873 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
874def : Pat<(brcond (setueq F8RC:$RA, F8RC:$RB), bb:$DISP),
875 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000876
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000877def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
878 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
879def : Pat<(brcond (setolt F8RC:$RA, F8RC:$RB), bb:$DISP),
880 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
881def : Pat<(brcond (setult F8RC:$RA, F8RC:$RB), bb:$DISP),
882 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000883
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000884def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
885 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
886def : Pat<(brcond (setole F8RC:$RA, F8RC:$RB), bb:$DISP),
887 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
888def : Pat<(brcond (setule F8RC:$RA, F8RC:$RB), bb:$DISP),
889 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000890
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000891def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
892 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
893def : Pat<(brcond (setogt F8RC:$RA, F8RC:$RB), bb:$DISP),
894 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
895def : Pat<(brcond (setugt F8RC:$RA, F8RC:$RB), bb:$DISP),
896 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000897
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000898def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
899 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
900def : Pat<(brcond (setoge F8RC:$RA, F8RC:$RB), bb:$DISP),
901 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
902def : Pat<(brcond (setuge F8RC:$RA, F8RC:$RB), bb:$DISP),
903 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000904
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000905def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
906 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
907def : Pat<(brcond (setone F8RC:$RA, F8RC:$RB), bb:$DISP),
908 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
909def : Pat<(brcond (setune F8RC:$RA, F8RC:$RB), bb:$DISP),
910 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
911
912
913def : Pat<(brcond (setoeq F8RC:$RA, immFPZ), bb:$DISP),
914 (COND_BRANCH_F (immBRCond 20), F8RC:$RA,bb:$DISP)>;
915def : Pat<(brcond (setueq F8RC:$RA, immFPZ), bb:$DISP),
916 (COND_BRANCH_F (immBRCond 20), F8RC:$RA,bb:$DISP)>;
917
918def : Pat<(brcond (setoge F8RC:$RA, immFPZ), bb:$DISP),
919 (COND_BRANCH_F (immBRCond 22), F8RC:$RA,bb:$DISP)>;
920def : Pat<(brcond (setuge F8RC:$RA, immFPZ), bb:$DISP),
921 (COND_BRANCH_F (immBRCond 22), F8RC:$RA,bb:$DISP)>;
922
923def : Pat<(brcond (setogt F8RC:$RA, immFPZ), bb:$DISP),
924 (COND_BRANCH_F (immBRCond 23), F8RC:$RA,bb:$DISP)>;
925def : Pat<(brcond (setugt F8RC:$RA, immFPZ), bb:$DISP),
926 (COND_BRANCH_F (immBRCond 23), F8RC:$RA,bb:$DISP)>;
927
928def : Pat<(brcond (setole F8RC:$RA, immFPZ), bb:$DISP),
929 (COND_BRANCH_F (immBRCond 24), F8RC:$RA,bb:$DISP)>;
930def : Pat<(brcond (setule F8RC:$RA, immFPZ), bb:$DISP),
931 (COND_BRANCH_F (immBRCond 24), F8RC:$RA,bb:$DISP)>;
932
933def : Pat<(brcond (setolt F8RC:$RA, immFPZ), bb:$DISP),
934 (COND_BRANCH_F (immBRCond 25), F8RC:$RA,bb:$DISP)>;
935def : Pat<(brcond (setult F8RC:$RA, immFPZ), bb:$DISP),
936 (COND_BRANCH_F (immBRCond 25), F8RC:$RA,bb:$DISP)>;
937
938def : Pat<(brcond (setone F8RC:$RA, immFPZ), bb:$DISP),
939 (COND_BRANCH_F (immBRCond 21), F8RC:$RA,bb:$DISP)>;
940def : Pat<(brcond (setune F8RC:$RA, immFPZ), bb:$DISP),
941 (COND_BRANCH_F (immBRCond 21), F8RC:$RA,bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000942
943//End Branches
944
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000945//S_floating : IEEE Single
946//T_floating : IEEE Double
947
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000948//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000949//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000950//CALL_PAL Pcd 00 Trap to PALcode
951//ECB Mfc 18.E800 Evict cache block
952//EXCB Mfc 18.0400 Exception barrier
953//FETCH Mfc 18.8000 Prefetch data
954//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000955//LDL_L Mem 2A Load sign-extended longword locked
956//LDQ_L Mem 2B Load quadword locked
957//LDQ_U Mem 0B Load unaligned quadword
958//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000959//STL_C Mem 2E Store longword conditional
960//STQ_C Mem 2F Store quadword conditional
961//STQ_U Mem 0F Store unaligned quadword
962//TRAPB Mfc 18.0000 Trap barrier
963//WH64 Mfc 18.F800 Write hint  64 bytes
964//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000965//MF_FPCR F-P 17.025 Move from FPCR
966//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000967//There are in the Multimedia extentions, so let's not use them yet
968//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
969//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
970//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
971//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
972//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
973//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
974//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
975//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
976//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
977//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
978//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
979//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
980//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
981//CVTLQ F-P 17.010 Convert longword to quadword
982//CVTQL F-P 17.030 Convert quadword to longword
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000983
984
Andrew Lenharth50b37842005-11-22 04:20:06 +0000985//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000986
Andrew Lenharth50b37842005-11-22 04:20:06 +0000987def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000988 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +0000989 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000990 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +0000991}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000992def immConst2PartInt : PatLeaf<(imm), [{
993 //true if imm fits in a LDAH LDA pair with zeroext
994 uint64_t uval = N->getValue();
995 int32_t val32 = (int32_t)uval;
996 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000997 val32 <= IMM_FULLHIGH);
998// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
999}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001000
1001def : Pat<(i64 immConst2Part:$imm),
1002 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +00001003
1004def : Pat<(i64 immSExt16:$imm),
1005 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001006
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001007def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001008 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001009def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharth6e707fb2006-01-16 21:41:39 +00001010 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
Andrew Lenharth29418a82006-01-10 19:12:47 +00001011 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001012
1013
Andrew Lenharth50b37842005-11-22 04:20:06 +00001014//TODO: I want to just define these like this!
1015//def : Pat<(i64 0),
1016// (R31)>;
1017//def : Pat<(f64 0.0),
1018// (F31)>;
1019//def : Pat<(f64 -0.0),
1020// (CPYSNT F31, F31)>;
1021//def : Pat<(f32 0.0),
1022// (F31)>;
1023//def : Pat<(f32 -0.0),
1024// (CPYSNS F31, F31)>;
1025
1026//Misc Patterns:
1027
1028def : Pat<(sext_inreg GPRC:$RB, i32),
1029 (ADDLi GPRC:$RB, 0)>;
1030
Andrew Lenharth7f0db912005-11-30 07:19:56 +00001031def : Pat<(fabs F8RC:$RB),
1032 (CPYST F31, F8RC:$RB)>;
1033def : Pat<(fabs F4RC:$RB),
1034 (CPYSS F31, F4RC:$RB)>;
1035def : Pat<(fneg F8RC:$RB),
1036 (CPYSNT F8RC:$RB, F8RC:$RB)>;
1037def : Pat<(fneg F4RC:$RB),
1038 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001039
Andrew Lenharth283f2222006-03-09 17:41:50 +00001040def : Pat<(fcopysign F4RC:$A, (fneg F4RC:$B)),
1041 (CPYSNS F4RC:$B, F4RC:$A)>;
1042def : Pat<(fcopysign F8RC:$A, (fneg F8RC:$B)),
1043 (CPYSNT F8RC:$B, F8RC:$A)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001044def : Pat<(fcopysign F4RC:$A, (fneg F8RC:$B)),
1045 (CPYSNSt F8RC:$B, F4RC:$A)>;
1046def : Pat<(fcopysign F8RC:$A, (fneg F4RC:$B)),
1047 (CPYSNTs F4RC:$B, F8RC:$A)>;
Andrew Lenharth13beebb2006-03-09 14:58:25 +00001048
Andrew Lenharthcd804962005-11-30 16:10:29 +00001049//Yes, signed multiply high is ugly
1050def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001051 (SUBQr (UMULHr GPRC:$RA, GPRC:$RB), (ADDQr (CMOVGEr GPRC:$RB, R31, GPRC:$RA),
1052 (CMOVGEr GPRC:$RA, R31, GPRC:$RB)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001053
1054//Stupid crazy arithmetic stuff:
Andrew Lenharth956a4312006-10-31 19:52:12 +00001055let AddedComplexity = 1 in {
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001056def : Pat<(mul GPRC:$RA, 5), (S4ADDQr GPRC:$RA, GPRC:$RA)>;
1057def : Pat<(mul GPRC:$RA, 9), (S8ADDQr GPRC:$RA, GPRC:$RA)>;
1058def : Pat<(mul GPRC:$RA, 3), (S4SUBQr GPRC:$RA, GPRC:$RA)>;
1059def : Pat<(mul GPRC:$RA, 7), (S8SUBQr GPRC:$RA, GPRC:$RA)>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001060
Andrew Lenharth956a4312006-10-31 19:52:12 +00001061//slight tree expansion if we are multiplying near to a power of 2
1062//n is above a power of 2
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001063def : Pat<(mul GPRC:$RA, immRem1:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001064 (ADDQr (SLr GPRC:$RA, (nearP2X immRem1:$imm)), GPRC:$RA)>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001065def : Pat<(mul GPRC:$RA, immRem2:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001066 (ADDQr (SLr GPRC:$RA, (nearP2X immRem2:$imm)), (ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001067def : Pat<(mul GPRC:$RA, immRem3:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001068 (ADDQr (SLr GPRC:$RA, (nearP2X immRem3:$imm)), (S4SUBQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001069def : Pat<(mul GPRC:$RA, immRem4:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001070 (S4ADDQr GPRC:$RA, (SLr GPRC:$RA, (nearP2X immRem4:$imm)))>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001071def : Pat<(mul GPRC:$RA, immRem5:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001072 (ADDQr (SLr GPRC:$RA, (nearP2X immRem5:$imm)), (S4ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001073def : Pat<(mul GPRC:$RA, immRemP2:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001074 (ADDQr (SLr GPRC:$RA, (nearP2X immRemP2:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2:$imm)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001075
Andrew Lenharth956a4312006-10-31 19:52:12 +00001076//n is below a power of 2
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001077def : Pat<(mul GPRC:$RA, immRem1n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001078 (SUBQr (SLr GPRC:$RA, (nearP2X immRem1n:$imm)), GPRC:$RA)>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001079def : Pat<(mul GPRC:$RA, immRem2n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001080 (SUBQr (SLr GPRC:$RA, (nearP2X immRem2n:$imm)), (ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001081def : Pat<(mul GPRC:$RA, immRem3n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001082 (SUBQr (SLr GPRC:$RA, (nearP2X immRem3n:$imm)), (S4SUBQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001083def : Pat<(mul GPRC:$RA, immRem4n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001084 (SUBQr (SLr GPRC:$RA, (nearP2X immRem4n:$imm)), (SLi GPRC:$RA, 2))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001085def : Pat<(mul GPRC:$RA, immRem5n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001086 (SUBQr (SLr GPRC:$RA, (nearP2X immRem5n:$imm)), (S4ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001087def : Pat<(mul GPRC:$RA, immRemP2n:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001088 (SUBQr (SLr GPRC:$RA, (nearP2X immRemP2n:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2n:$imm)))>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001089} //Added complexity