blob: 92de78a364baff034b0c88d8dde7d2beb49ad00c [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//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Andrew Lenharth304d0f32005-01-22 23:41:55 +00007//
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, []>;
Chris Lattner9b37aaf2008-01-10 05:12:37 +000027def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, [SDNPMayLoad]>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000028
Chris Lattner48be23c2008-01-15 22:02:54 +000029def retflag : SDNode<"AlphaISD::RET_FLAG", SDTNone,
Bill Wendling6ef781f2008-02-27 06:33:05 +000030 [SDNPHasChain, SDNPOptInFlag]>;
Andrew Lenharthf2b806a2006-06-12 18:09:24 +000031
Andrew Lenharth79620652005-12-05 20:50:53 +000032// These are target-independent nodes, but have target-specific formats.
Bill Wendlingc69107c2007-11-13 09:19:02 +000033def SDT_AlphaCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i64> ]>;
34def SDT_AlphaCallSeqEnd : SDCallSeqEnd<[ SDTCisVT<0, i64>,
35 SDTCisVT<1, i64> ]>;
Bill Wendling0f8d9c02007-11-13 00:44:25 +000036
Bill Wendlingc69107c2007-11-13 09:19:02 +000037def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeqStart,
Bill Wendling6ef781f2008-02-27 06:33:05 +000038 [SDNPHasChain, SDNPOutFlag]>;
Bill Wendlingc69107c2007-11-13 09:19:02 +000039def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeqEnd,
Bill Wendling0f8d9c02007-11-13 00:44:25 +000040 [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
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000046 return getI64Imm(~N->getZExtValue());
Andrew Lenhartheda80a02005-12-06 00:33:53 +000047}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000048def negX : SDNodeXForm<imm, [{ //negate
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000049 return getI64Imm(~N->getZExtValue() + 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
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000052 return getI64Imm(((int64_t)N->getZExtValue() << 32) >> 32);
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000053}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000054def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000055 return getI64Imm(((int64_t)N->getZExtValue() << 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
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000058 return getI64Imm(get_lda16(N->getZExtValue()));
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000059}]>;
60def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000061 return getI64Imm(get_ldah16(N->getZExtValue()));
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000062}]>;
Chris Lattnerd615ded2006-10-11 05:13:56 +000063def iZAPX : SDNodeXForm<and, [{ // get imm to ZAPi
64 ConstantSDNode *RHS = cast<ConstantSDNode>(N->getOperand(1));
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000065 return getI64Imm(get_zapImm(SDValue(), RHS->getZExtValue()));
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000066}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000067def nearP2X : SDNodeXForm<imm, [{
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000068 return getI64Imm(Log2_64(getNearPower2((uint64_t)N->getZExtValue())));
Andrew Lenharthafe3f492006-04-03 03:18:59 +000069}]>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +000070def nearP2RemX : SDNodeXForm<imm, [{
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000071 uint64_t x =
Dale Johannesen7b9486a2009-05-13 00:24:22 +000072 abs64(N->getZExtValue() - getNearPower2((uint64_t)N->getZExtValue()));
Andrew Lenharthf87e7932006-04-03 04:19:17 +000073 return getI64Imm(Log2_64(x));
74}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000075
76def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000077 return (uint64_t)N->getZExtValue() == (uint8_t)N->getZExtValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000078}]>;
79def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000080 return (uint64_t)~N->getZExtValue() == (uint8_t)~N->getZExtValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000081}], invX>;
82def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000083 return ((uint64_t)~N->getZExtValue() + 1) ==
84 (uint8_t)((uint64_t)~N->getZExtValue() + 1);
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000085}], negX>;
86def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000087 return ((int64_t)N->getZExtValue() << 48) >> 48 ==
88 (int64_t)N->getZExtValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000089}]>;
90def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000091 return ((int64_t)N->getZExtValue() << 48) >> 48 ==
92 ((int64_t)N->getZExtValue() << 32) >> 32;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000093}], SExt16>;
Chris Lattnerd615ded2006-10-11 05:13:56 +000094
Chris Lattner6d9f86b2010-02-23 06:54:29 +000095def zappat : PatFrag<(ops node:$LHS), (and node:$LHS, imm), [{
Andrew Lenharth068d1c52008-11-11 23:19:51 +000096 ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N->getOperand(1));
97 if (!RHS) return 0;
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +000098 uint64_t build = get_zapImm(N->getOperand(0), (uint64_t)RHS->getZExtValue());
Dan Gohman67ca6be2008-08-20 15:24:22 +000099 return build != 0;
Chris Lattnerd615ded2006-10-11 05:13:56 +0000100}]>;
101
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000102def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
Chris Lattner1331dec2006-11-03 01:18:29 +0000103 (void)N; // silence warning.
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000104 return true;
105}]>;
Andrew Lenharth956a4312006-10-31 19:52:12 +0000106
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +0000107def immRem1 :PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),1,0);}]>;
108def immRem2 :PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),2,0);}]>;
109def immRem3 :PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),3,0);}]>;
110def immRem4 :PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),4,0);}]>;
111def immRem5 :PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),5,0);}]>;
112def immRem1n:PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),1,1);}]>;
113def immRem2n:PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),2,1);}]>;
114def immRem3n:PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),3,1);}]>;
115def immRem4n:PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),4,1);}]>;
116def immRem5n:PatLeaf<(imm),[{return chkRemNearPower2(N->getZExtValue(),5,1);}]>;
Andrew Lenharth956a4312006-10-31 19:52:12 +0000117
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000118def immRemP2n : PatLeaf<(imm), [{
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +0000119 return isPowerOf2_64(getNearPower2((uint64_t)N->getZExtValue()) -
120 N->getZExtValue());
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000121}]>;
122def immRemP2 : PatLeaf<(imm), [{
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +0000123 return isPowerOf2_64(N->getZExtValue() -
124 getNearPower2((uint64_t)N->getZExtValue()));
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000125}]>;
126def immUExt8ME : PatLeaf<(imm), [{ //use this imm for mulqi
Dale Johannesen7b9486a2009-05-13 00:24:22 +0000127 int64_t d = abs64((int64_t)N->getZExtValue() -
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +0000128 (int64_t)getNearPower2((uint64_t)N->getZExtValue()));
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000129 if (isPowerOf2_64(d)) return false;
130 switch (d) {
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000131 case 1: case 3: case 5: return false;
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +0000132 default: return (uint64_t)N->getZExtValue() == (uint8_t)N->getZExtValue();
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000133 };
134}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000135
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000136def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
137def add4 : PatFrag<(ops node:$op1, node:$op2),
138 (add (shl node:$op1, 2), node:$op2)>;
139def sub4 : PatFrag<(ops node:$op1, node:$op2),
140 (sub (shl node:$op1, 2), node:$op2)>;
141def add8 : PatFrag<(ops node:$op1, node:$op2),
142 (add (shl node:$op1, 3), node:$op2)>;
143def sub8 : PatFrag<(ops node:$op1, node:$op2),
144 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth956a4312006-10-31 19:52:12 +0000145class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000146class CmpOpFrag<dag res> : PatFrag<(ops node:$R), res>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000147
148//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000149
Evan Cheng64d80e32007-07-19 01:14:50 +0000150def WTF : PseudoInstAlpha<(outs), (ins variable_ops), "#wtf", [], s_pseudo>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000151
Chris Lattner834f1ce2008-01-06 23:38:27 +0000152let hasCtrlDep = 1, Defs = [R30], Uses = [R30] in {
Bill Wendling0f8d9c02007-11-13 00:44:25 +0000153def ADJUSTSTACKUP : PseudoInstAlpha<(outs), (ins s64imm:$amt),
154 "; ADJUP $amt",
Chris Lattnere563bbc2008-10-11 22:08:30 +0000155 [(callseq_start timm:$amt)], s_pseudo>;
Bill Wendling0f8d9c02007-11-13 00:44:25 +0000156def ADJUSTSTACKDOWN : PseudoInstAlpha<(outs), (ins s64imm:$amt1, s64imm:$amt2),
157 "; ADJDOWN $amt1",
Chris Lattnere563bbc2008-10-11 22:08:30 +0000158 [(callseq_end timm:$amt1, timm:$amt2)], s_pseudo>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000159}
Bill Wendling0f8d9c02007-11-13 00:44:25 +0000160
Evan Cheng64d80e32007-07-19 01:14:50 +0000161def ALTENT : PseudoInstAlpha<(outs), (ins s64imm:$TARGET), "$$$TARGET..ng:\n", [], s_pseudo>;
162def PCLABEL : PseudoInstAlpha<(outs), (ins s64imm:$num), "PCMARKER_$num:\n",[], s_pseudo>;
163def MEMLABEL : PseudoInstAlpha<(outs), (ins s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth017c5562006-03-09 17:16:45 +0000164 "LSMARKER$$$i$$$j$$$k$$$m:", [], s_pseudo>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000165
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000166
Dan Gohman533297b2009-10-29 18:10:34 +0000167let usesCustomInserter = 1 in { // Expanded after instruction selection.
Andrew Lenharthab0b9492008-02-21 06:45:13 +0000168def CAS32 : PseudoInstAlpha<(outs GPRC:$dst), (ins GPRC:$ptr, GPRC:$cmp, GPRC:$swp), "",
Mon P Wang28873102008-06-25 08:15:39 +0000169 [(set GPRC:$dst, (atomic_cmp_swap_32 GPRC:$ptr, GPRC:$cmp, GPRC:$swp))], s_pseudo>;
Andrew Lenharthab0b9492008-02-21 06:45:13 +0000170def CAS64 : PseudoInstAlpha<(outs GPRC:$dst), (ins GPRC:$ptr, GPRC:$cmp, GPRC:$swp), "",
Mon P Wang28873102008-06-25 08:15:39 +0000171 [(set GPRC:$dst, (atomic_cmp_swap_64 GPRC:$ptr, GPRC:$cmp, GPRC:$swp))], s_pseudo>;
Andrew Lenharthab0b9492008-02-21 06:45:13 +0000172
173def LAS32 : PseudoInstAlpha<(outs GPRC:$dst), (ins GPRC:$ptr, GPRC:$swp), "",
Mon P Wang28873102008-06-25 08:15:39 +0000174 [(set GPRC:$dst, (atomic_load_add_32 GPRC:$ptr, GPRC:$swp))], s_pseudo>;
Andrew Lenharthab0b9492008-02-21 06:45:13 +0000175def LAS64 :PseudoInstAlpha<(outs GPRC:$dst), (ins GPRC:$ptr, GPRC:$swp), "",
Mon P Wang28873102008-06-25 08:15:39 +0000176 [(set GPRC:$dst, (atomic_load_add_64 GPRC:$ptr, GPRC:$swp))], s_pseudo>;
Andrew Lenharthab0b9492008-02-21 06:45:13 +0000177
178def SWAP32 : PseudoInstAlpha<(outs GPRC:$dst), (ins GPRC:$ptr, GPRC:$swp), "",
179 [(set GPRC:$dst, (atomic_swap_32 GPRC:$ptr, GPRC:$swp))], s_pseudo>;
180def SWAP64 :PseudoInstAlpha<(outs GPRC:$dst), (ins GPRC:$ptr, GPRC:$swp), "",
181 [(set GPRC:$dst, (atomic_swap_64 GPRC:$ptr, GPRC:$swp))], s_pseudo>;
182}
183
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000184//***********************
185//Real instructions
186//***********************
187
188//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000189
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000190//conditional moves, int
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000191
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000192multiclass cmov_inst<bits<7> fun, string asmstr, PatFrag OpNode> {
193def r : OForm4<0x11, fun, !strconcat(asmstr, " $RCOND,$RTRUE,$RDEST"),
194 [(set GPRC:$RDEST, (select (OpNode GPRC:$RCOND), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
195def i : OForm4L<0x11, fun, !strconcat(asmstr, " $RCOND,$RTRUE,$RDEST"),
196 [(set GPRC:$RDEST, (select (OpNode GPRC:$RCOND), immUExt8:$RTRUE, GPRC:$RFALSE))], s_cmov>;
197}
Andrew Lenharth77f08852006-02-01 19:37:33 +0000198
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000199defm CMOVEQ : cmov_inst<0x24, "cmoveq", CmpOpFrag<(seteq node:$R, 0)>>;
200defm CMOVNE : cmov_inst<0x26, "cmovne", CmpOpFrag<(setne node:$R, 0)>>;
201defm CMOVLT : cmov_inst<0x44, "cmovlt", CmpOpFrag<(setlt node:$R, 0)>>;
202defm CMOVLE : cmov_inst<0x64, "cmovle", CmpOpFrag<(setle node:$R, 0)>>;
203defm CMOVGT : cmov_inst<0x66, "cmovgt", CmpOpFrag<(setgt node:$R, 0)>>;
204defm CMOVGE : cmov_inst<0x46, "cmovge", CmpOpFrag<(setge node:$R, 0)>>;
205defm CMOVLBC : cmov_inst<0x16, "cmovlbc", CmpOpFrag<(xor node:$R, 1)>>;
206defm CMOVLBS : cmov_inst<0x14, "cmovlbs", CmpOpFrag<(and node:$R, 1)>>;
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000207
Andrew Lenharth133d3102006-02-03 03:07:37 +0000208//General pattern for cmov
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000209def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000210 (CMOVNEr GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000211def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
212 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000213
Andrew Lenharth6b634032006-09-20 15:05:49 +0000214//Invert sense when we can for constants:
Andrew Lenharth15b78232007-04-17 04:07:59 +0000215def : Pat<(select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
216 (CMOVEQi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
217def : Pat<(select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
218 (CMOVLEi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
219def : Pat<(select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
220 (CMOVLTi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
221def : Pat<(select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
222 (CMOVGEi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
223def : Pat<(select (setle GPRC:$RCOND, 0), GPRC:$RTRUE, immUExt8:$RFALSE),
224 (CMOVGTi GPRC:$RCOND, immUExt8:$RFALSE, GPRC:$RTRUE)>;
Andrew Lenharth6b634032006-09-20 15:05:49 +0000225
Andrew Lenharth956a4312006-10-31 19:52:12 +0000226multiclass all_inst<bits<6> opc, bits<7> funl, bits<7> funq,
227 string asmstr, PatFrag OpNode, InstrItinClass itin> {
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000228 def Lr : OForm< opc, funl, !strconcat(asmstr, "l $RA,$RB,$RC"),
Andrew Lenharth956a4312006-10-31 19:52:12 +0000229 [(set GPRC:$RC, (intop (OpNode GPRC:$RA, GPRC:$RB)))], itin>;
230 def Li : OFormL<opc, funl, !strconcat(asmstr, "l $RA,$L,$RC"),
231 [(set GPRC:$RC, (intop (OpNode GPRC:$RA, immUExt8:$L)))], itin>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000232 def Qr : OForm< opc, funq, !strconcat(asmstr, "q $RA,$RB,$RC"),
Andrew Lenharth956a4312006-10-31 19:52:12 +0000233 [(set GPRC:$RC, (OpNode GPRC:$RA, GPRC:$RB))], itin>;
234 def Qi : OFormL<opc, funq, !strconcat(asmstr, "q $RA,$L,$RC"),
235 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8:$L))], itin>;
236}
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000237
Andrew Lenharth956a4312006-10-31 19:52:12 +0000238defm MUL : all_inst<0x13, 0x00, 0x20, "mul", BinOpFrag<(mul node:$LHS, node:$RHS)>, s_imul>;
239defm ADD : all_inst<0x10, 0x00, 0x20, "add", BinOpFrag<(add node:$LHS, node:$RHS)>, s_iadd>;
240defm S4ADD : all_inst<0x10, 0x02, 0x22, "s4add", add4, s_iadd>;
241defm S8ADD : all_inst<0x10, 0x12, 0x32, "s8add", add8, s_iadd>;
242defm S4SUB : all_inst<0x10, 0x0B, 0x2B, "s4sub", sub4, s_iadd>;
243defm S8SUB : all_inst<0x10, 0x1B, 0x3B, "s8sub", sub8, s_iadd>;
244defm SUB : all_inst<0x10, 0x09, 0x29, "sub", BinOpFrag<(sub node:$LHS, node:$RHS)>, s_iadd>;
245//Const cases since legalize does sub x, int -> add x, inv(int) + 1
246def : Pat<(intop (add GPRC:$RA, immUExt8neg:$L)), (SUBLi GPRC:$RA, immUExt8neg:$L)>;
247def : Pat<(add GPRC:$RA, immUExt8neg:$L), (SUBQi GPRC:$RA, immUExt8neg:$L)>;
248def : Pat<(intop (add4 GPRC:$RA, immUExt8neg:$L)), (S4SUBLi GPRC:$RA, immUExt8neg:$L)>;
249def : Pat<(add4 GPRC:$RA, immUExt8neg:$L), (S4SUBQi GPRC:$RA, immUExt8neg:$L)>;
250def : Pat<(intop (add8 GPRC:$RA, immUExt8neg:$L)), (S8SUBLi GPRC:$RA, immUExt8neg:$L)>;
251def : Pat<(add8 GPRC:$RA, immUExt8neg:$L), (S8SUBQi GPRC:$RA, immUExt8neg:$L)>;
252
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000253multiclass log_inst<bits<6> opc, bits<7> fun, string asmstr, SDNode OpNode, InstrItinClass itin> {
254def r : OForm<opc, fun, !strconcat(asmstr, " $RA,$RB,$RC"),
255 [(set GPRC:$RC, (OpNode GPRC:$RA, GPRC:$RB))], itin>;
256def i : OFormL<opc, fun, !strconcat(asmstr, " $RA,$L,$RC"),
257 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8:$L))], itin>;
258}
259multiclass inv_inst<bits<6> opc, bits<7> fun, string asmstr, SDNode OpNode, InstrItinClass itin> {
260def r : OForm<opc, fun, !strconcat(asmstr, " $RA,$RB,$RC"),
261 [(set GPRC:$RC, (OpNode GPRC:$RA, (not GPRC:$RB)))], itin>;
262def i : OFormL<opc, fun, !strconcat(asmstr, " $RA,$L,$RC"),
263 [(set GPRC:$RC, (OpNode GPRC:$RA, immUExt8inv:$L))], itin>;
264}
Andrew Lenharth956a4312006-10-31 19:52:12 +0000265
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000266defm AND : log_inst<0x11, 0x00, "and", and, s_ilog>;
267defm BIC : inv_inst<0x11, 0x08, "bic", and, s_ilog>;
268defm BIS : log_inst<0x11, 0x20, "bis", or, s_ilog>;
269defm ORNOT : inv_inst<0x11, 0x28, "ornot", or, s_ilog>;
270defm XOR : log_inst<0x11, 0x40, "xor", xor, s_ilog>;
271defm EQV : inv_inst<0x11, 0x48, "eqv", xor, s_ilog>;
272
273defm SL : log_inst<0x12, 0x39, "sll", shl, s_ishf>;
274defm SRA : log_inst<0x12, 0x3c, "sra", sra, s_ishf>;
275defm SRL : log_inst<0x12, 0x34, "srl", srl, s_ishf>;
276defm UMULH : log_inst<0x13, 0x30, "umulh", mulhu, s_imul>;
277
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000278def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000279 [(set GPRC:$RC, (ctlz GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000280def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000281 [(set GPRC:$RC, (ctpop GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000282def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000283 [(set GPRC:$RC, (cttz GPRC:$RB))], s_imisc>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000284def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000285 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000286def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000287 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000288def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000289 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))], s_ishf>;
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000290def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
291 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))], s_ishf>;
292def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
293 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000294
Andrew Lenharth4907d222005-10-20 00:28:31 +0000295//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
296//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
297//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000298//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
299//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
300//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
301//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
302//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
303//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
304//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000305//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000306
Andrew Lenharth4907d222005-10-20 00:28:31 +0000307//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
308//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
309//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
310//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
311//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
312//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
313//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
314//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
315//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
316//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
317//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
318//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
319//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
320//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +0000321
Andrew Lenharth4907d222005-10-20 00:28:31 +0000322//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
323//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
324//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
325//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
326//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
327//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
328//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
329//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
330//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
331//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
332//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
333//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
334//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
335//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattner78feeb02006-10-11 04:12:39 +0000336
Chris Lattnerd615ded2006-10-11 05:13:56 +0000337def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC", [], s_ishf>;
338
339// Define the pattern that produces ZAPNOTi.
Nate Begeman7cee8172009-03-19 05:21:56 +0000340def : Pat<(zappat:$imm GPRC:$RA),
Chris Lattnerd615ded2006-10-11 05:13:56 +0000341 (ZAPNOTi GPRC:$RA, (iZAPX GPRC:$imm))>;
342
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000343
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000344//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000345//So this is a waste of what this instruction can do, but it still saves something
346def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000347 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000348def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000349 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000350def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000351 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000352def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000353 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000354def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000355 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000356def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000357 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000358def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000359 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000360def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000361 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000362def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000363 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000364def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000365 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000366def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000367 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000368def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000369 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000370
371//Patterns for unsupported int comparisons
372def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
373def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
374
375def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
376def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
377
378def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
379def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
380
381def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
382def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
383
384def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
385def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
386
387def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
388def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
389
390def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
391def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
392
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000393
Dan Gohmanadaace82009-11-11 18:11:07 +0000394let isReturn = 1, isTerminator = 1, isBarrier = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in {
Chris Lattner6784bdf2010-03-18 20:55:18 +0000395 def RETDAG : MbrForm< 0x1A, 0x02, (ins), "ret $$31,($$26),1", s_jsr>; //Return from subroutine
396 def RETDAGp : MbrpForm< 0x1A, 0x02, (ins), "ret $$31,($$26),1", [(retflag)], s_jsr>; //Return from subroutine
Andrew Lenharthf2b806a2006-06-12 18:09:24 +0000397}
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000398
Owen Anderson20ab2902007-11-12 07:39:39 +0000399let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1, Ra = 31, disp = 0 in
Chris Lattner6784bdf2010-03-18 20:55:18 +0000400def JMP : MbrpForm< 0x1A, 0x00, (ins GPRC:$RS), "jmp $$31,($RS),0",
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000401 [(brind GPRC:$RS)], s_jsr>; //Jump
402
Evan Chengffbacca2007-07-21 00:34:19 +0000403let isCall = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000404 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000405 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000406 F0, F1,
407 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000408 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000409 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", [], s_jsr>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000410}
Evan Chengffbacca2007-07-21 00:34:19 +0000411let isCall = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000412 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
413 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
414 F0, F1,
415 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
416 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Chris Lattner6784bdf2010-03-18 20:55:18 +0000417 def JSR : MbrForm< 0x1A, 0x01, (ins), "jsr $$26,($$27),0", s_jsr>; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000418}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000419
Evan Chengffbacca2007-07-21 00:34:19 +0000420let isCall = 1, Ra = 23, Rb = 27, disp = 0,
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000421 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Chris Lattner6784bdf2010-03-18 20:55:18 +0000422 def JSRs : MbrForm< 0x1A, 0x01, (ins), "jsr $$23,($$27),0", s_jsr>; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000423
Andrew Lenharth53d89702005-12-25 01:34:27 +0000424
Chris Lattner6784bdf2010-03-18 20:55:18 +0000425def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ins GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP", s_jsr>; //Jump to subroutine return
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000426
Andrew Lenharthd079cdb2006-11-02 03:05:26 +0000427
Chris Lattner6784bdf2010-03-18 20:55:18 +0000428let OutOperandList = (outs GPRC:$RA), InOperandList = (ins s64imm:$DISP, GPRC:$RB) in {
Chris Lattnerc8478d82008-01-06 06:44:58 +0000429def LDQ : MForm<0x29, 1, "ldq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000430 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000431def LDQr : MForm<0x29, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000432 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000433def LDL : MForm<0x28, 1, "ldl $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000434 [(set GPRC:$RA, (sextloadi32 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000435def LDLr : MForm<0x28, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000436 [(set GPRC:$RA, (sextloadi32 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000437def LDBU : MForm<0x0A, 1, "ldbu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000438 [(set GPRC:$RA, (zextloadi8 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000439def LDBUr : MForm<0x0A, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000440 [(set GPRC:$RA, (zextloadi8 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000441def LDWU : MForm<0x0C, 1, "ldwu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000442 [(set GPRC:$RA, (zextloadi16 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000443def LDWUr : MForm<0x0C, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000444 [(set GPRC:$RA, (zextloadi16 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000445}
Andrew Lenharthd079cdb2006-11-02 03:05:26 +0000446
447
Chris Lattner6784bdf2010-03-18 20:55:18 +0000448let OutOperandList = (outs), InOperandList = (ins GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
Chris Lattnerc8478d82008-01-06 06:44:58 +0000449def STB : MForm<0x0E, 0, "stb $RA,$DISP($RB)",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000450 [(truncstorei8 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000451def STBr : MForm<0x0E, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000452 [(truncstorei8 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000453def STW : MForm<0x0D, 0, "stw $RA,$DISP($RB)",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000454 [(truncstorei16 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000455def STWr : MForm<0x0D, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000456 [(truncstorei16 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000457def STL : MForm<0x2C, 0, "stl $RA,$DISP($RB)",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000458 [(truncstorei32 GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000459def STLr : MForm<0x2C, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000460 [(truncstorei32 GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000461def STQ : MForm<0x2D, 0, "stq $RA,$DISP($RB)",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000462 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000463def STQr : MForm<0x2D, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000464 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000465}
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000466
467//Load address
Chris Lattner6784bdf2010-03-18 20:55:18 +0000468let OutOperandList = (outs GPRC:$RA), InOperandList = (ins s64imm:$DISP, GPRC:$RB) in {
Chris Lattnerc8478d82008-01-06 06:44:58 +0000469def LDA : MForm<0x08, 0, "lda $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000470 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_lda>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000471def LDAr : MForm<0x08, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000472 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address
Chris Lattnerc8478d82008-01-06 06:44:58 +0000473def LDAH : MForm<0x09, 0, "ldah $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000474 [], s_lda>; //Load address high
Chris Lattnerc8478d82008-01-06 06:44:58 +0000475def LDAHr : MForm<0x09, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000476 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000477}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000478
Chris Lattner6784bdf2010-03-18 20:55:18 +0000479let OutOperandList = (outs), InOperandList = (ins F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
Chris Lattnerc8478d82008-01-06 06:44:58 +0000480def STS : MForm<0x26, 0, "sts $RA,$DISP($RB)",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000481 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000482def STSr : MForm<0x26, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000483 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000484}
Chris Lattner6784bdf2010-03-18 20:55:18 +0000485let OutOperandList = (outs F4RC:$RA), InOperandList = (ins s64imm:$DISP, GPRC:$RB) in {
Chris Lattnerc8478d82008-01-06 06:44:58 +0000486def LDS : MForm<0x22, 1, "lds $RA,$DISP($RB)",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000487 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000488def LDSr : MForm<0x22, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000489 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000490}
Chris Lattner6784bdf2010-03-18 20:55:18 +0000491let OutOperandList = (outs), InOperandList = (ins F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
Chris Lattnerc8478d82008-01-06 06:44:58 +0000492def STT : MForm<0x27, 0, "stt $RA,$DISP($RB)",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000493 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000494def STTr : MForm<0x27, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000495 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Evan Cheng64d80e32007-07-19 01:14:50 +0000496}
Chris Lattner6784bdf2010-03-18 20:55:18 +0000497let OutOperandList = (outs F8RC:$RA), InOperandList = (ins s64imm:$DISP, GPRC:$RB) in {
Chris Lattnerc8478d82008-01-06 06:44:58 +0000498def LDT : MForm<0x23, 1, "ldt $RA,$DISP($RB)",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000499 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Chris Lattnerc8478d82008-01-06 06:44:58 +0000500def LDTr : MForm<0x23, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
Bill Wendling6ef781f2008-02-27 06:33:05 +0000501 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000502}
503
Andrew Lenharthc687b482005-12-24 08:29:32 +0000504
505//constpool rels
506def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
507 (LDQr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000508def : Pat<(i64 (sextloadi32 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000509 (LDLr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000510def : Pat<(i64 (zextloadi8 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000511 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000512def : Pat<(i64 (zextloadi16 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000513 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
514def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
515 (LDAr tconstpool:$DISP, GPRC:$RB)>;
516def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
517 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
518def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
519 (LDSr tconstpool:$DISP, GPRC:$RB)>;
520def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
521 (LDTr tconstpool:$DISP, GPRC:$RB)>;
522
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000523//jumptable rels
524def : Pat<(i64 (Alpha_gprelhi tjumptable:$DISP, GPRC:$RB)),
525 (LDAHr tjumptable:$DISP, GPRC:$RB)>;
526def : Pat<(i64 (Alpha_gprello tjumptable:$DISP, GPRC:$RB)),
527 (LDAr tjumptable:$DISP, GPRC:$RB)>;
528
Andrew Lenharthc687b482005-12-24 08:29:32 +0000529
Andrew Lenharthb6718602005-12-24 07:34:33 +0000530//misc ext patterns
Evan Cheng466685d2006-10-09 20:57:25 +0000531def : Pat<(i64 (extloadi8 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000532 (LDBU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000533def : Pat<(i64 (extloadi16 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000534 (LDWU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000535def : Pat<(i64 (extloadi32 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000536 (LDL immSExt16:$DISP, GPRC:$RB)>;
537
538//0 disp patterns
539def : Pat<(i64 (load GPRC:$addr)),
540 (LDQ 0, GPRC:$addr)>;
541def : Pat<(f64 (load GPRC:$addr)),
542 (LDT 0, GPRC:$addr)>;
543def : Pat<(f32 (load GPRC:$addr)),
544 (LDS 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000545def : Pat<(i64 (sextloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000546 (LDL 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000547def : Pat<(i64 (zextloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000548 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000549def : Pat<(i64 (zextloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000550 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000551def : Pat<(i64 (extloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000552 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000553def : Pat<(i64 (extloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000554 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000555def : Pat<(i64 (extloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000556 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000557
Andrew Lenharthc687b482005-12-24 08:29:32 +0000558def : Pat<(store GPRC:$DATA, GPRC:$addr),
559 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
560def : Pat<(store F8RC:$DATA, GPRC:$addr),
561 (STT F8RC:$DATA, 0, GPRC:$addr)>;
562def : Pat<(store F4RC:$DATA, GPRC:$addr),
563 (STS F4RC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000564def : Pat<(truncstorei32 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000565 (STL GPRC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000566def : Pat<(truncstorei16 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000567 (STW GPRC:$DATA, 0, GPRC:$addr)>;
Evan Cheng8b2794a2006-10-13 21:14:26 +0000568def : Pat<(truncstorei8 GPRC:$DATA, GPRC:$addr),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000569 (STB GPRC:$DATA, 0, GPRC:$addr)>;
570
Andrew Lenharth4e629512005-12-24 05:36:33 +0000571
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000572//load address, rellocated gpdist form
Chris Lattner6784bdf2010-03-18 20:55:18 +0000573let OutOperandList = (outs GPRC:$RA),
574 InOperandList = (ins s16imm:$DISP, GPRC:$RB, s16imm:$NUM),
Dan Gohman41474ba2008-12-03 02:30:17 +0000575 mayLoad = 1 in {
Chris Lattnerc8478d82008-01-06 06:44:58 +0000576def LDAg : MForm<0x08, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
577def LDAHg : MForm<0x09, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000578}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000579
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000580//Load quad, rellocated literal form
Chris Lattner6784bdf2010-03-18 20:55:18 +0000581let OutOperandList = (outs GPRC:$RA), InOperandList = (ins s64imm:$DISP, GPRC:$RB) in
Chris Lattnerc8478d82008-01-06 06:44:58 +0000582def LDQl : MForm<0x29, 1, "ldq $RA,$DISP($RB)\t\t!literal",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000583 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))], s_ild>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000584def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
585 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000586
Andrew Lenharthab0b9492008-02-21 06:45:13 +0000587let OutOperandList = (outs GPRC:$RR),
588 InOperandList = (ins GPRC:$RA, s64imm:$DISP, GPRC:$RB),
589 Constraints = "$RA = $RR",
590 DisableEncoding = "$RR" in {
591def STQ_C : MForm<0x2F, 0, "stq_l $RA,$DISP($RB)", [], s_ist>;
592def STL_C : MForm<0x2E, 0, "stl_l $RA,$DISP($RB)", [], s_ist>;
593}
Chris Lattner6784bdf2010-03-18 20:55:18 +0000594let OutOperandList = (outs GPRC:$RA),
595 InOperandList = (ins s64imm:$DISP, GPRC:$RB),
Dan Gohman41474ba2008-12-03 02:30:17 +0000596 mayLoad = 1 in {
Andrew Lenharthab0b9492008-02-21 06:45:13 +0000597def LDQ_L : MForm<0x2B, 1, "ldq_l $RA,$DISP($RB)", [], s_ild>;
598def LDL_L : MForm<0x2A, 1, "ldl_l $RA,$DISP($RB)", [], s_ild>;
599}
600
Andrew Lenharth017c5562006-03-09 17:16:45 +0000601def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA", s_rpcc>; //Read process cycle counter
Andrew Lenharth22c5c1b2008-02-16 01:24:58 +0000602def MB : MfcPForm<0x18, 0x4000, "mb", s_imisc>; //memory barrier
603def WMB : MfcPForm<0x18, 0x4400, "wmb", s_imisc>; //write memory barrier
604
Chris Lattner6d9f86b2010-02-23 06:54:29 +0000605def : Pat<(membarrier (i64 imm), (i64 imm), (i64 imm), (i64 1), (i64 imm)),
Andrew Lenharth22c5c1b2008-02-16 01:24:58 +0000606 (WMB)>;
Chris Lattner6d9f86b2010-02-23 06:54:29 +0000607def : Pat<(membarrier (i64 imm), (i64 imm), (i64 imm), (i64 imm), (i64 imm)),
Andrew Lenharth22c5c1b2008-02-16 01:24:58 +0000608 (MB)>;
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000609
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000610//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000611
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000612//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000613
Chris Lattner6784bdf2010-03-18 20:55:18 +0000614let OutOperandList = (outs F4RC:$RC), InOperandList = (ins F4RC:$RB), Fa = 31 in
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000615def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000616 [(set F4RC:$RC, (fsqrt F4RC:$RB))], s_fsqrts>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000617
Chris Lattner6784bdf2010-03-18 20:55:18 +0000618let OutOperandList = (outs F4RC:$RC), InOperandList = (ins F4RC:$RA, F4RC:$RB) in {
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000619def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000620 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000621def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000622 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000623def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000624 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))], s_fdivs>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000625def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000626 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000627
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000628def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000629 [(set F4RC:$RC, (fcopysign F4RC:$RB, F4RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000630def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000631def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000632 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F4RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000633}
634
635//Doubles
636
Chris Lattner6784bdf2010-03-18 20:55:18 +0000637let OutOperandList = (outs F8RC:$RC), InOperandList = (ins F8RC:$RB), Fa = 31 in
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000638def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000639 [(set F8RC:$RC, (fsqrt F8RC:$RB))], s_fsqrtt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000640
Chris Lattner6784bdf2010-03-18 20:55:18 +0000641let OutOperandList = (outs F8RC:$RC), InOperandList = (ins F8RC:$RA, F8RC:$RB) in {
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000642def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000643 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000644def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000645 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000646def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000647 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))], s_fdivt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000648def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000649 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000650
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000651def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000652 [(set F8RC:$RC, (fcopysign F8RC:$RB, F8RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000653def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000654def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000655 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F8RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000656
Andrew Lenharth017c5562006-03-09 17:16:45 +0000657def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000658// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000659def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000660// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000661def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000662// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000663def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000664// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
665}
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000666
667//More CPYS forms:
Chris Lattner6784bdf2010-03-18 20:55:18 +0000668let OutOperandList = (outs F8RC:$RC), InOperandList = (ins F4RC:$RA, F8RC:$RB) in {
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000669def CPYSTs : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
670 [(set F8RC:$RC, (fcopysign F8RC:$RB, F4RC:$RA))], s_fadd>;
671def CPYSNTs : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
672 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F4RC:$RA)))], s_fadd>;
673}
Chris Lattner6784bdf2010-03-18 20:55:18 +0000674let OutOperandList = (outs F4RC:$RC), InOperandList = (ins F8RC:$RA, F4RC:$RB) in {
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000675def CPYSSt : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
676 [(set F4RC:$RC, (fcopysign F4RC:$RB, F8RC:$RA))], s_fadd>;
677def CPYSESt : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
678def CPYSNSt : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
679 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F8RC:$RA)))], s_fadd>;
680}
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000681
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000682//conditional moves, floats
Eric Christopher23265d02010-06-21 18:48:55 +0000683let OutOperandList = (outs F4RC:$RDEST),
684 InOperandList = (ins F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
685 Constraints = "$RTRUE = $RDEST" in {
686def FCMOVEQS : FPForm<0x17, 0x02A,
687 "fcmoveq $RCOND,$RTRUE,$RDEST",
688 [], s_fcmov>; //FCMOVE if = zero
689def FCMOVGES : FPForm<0x17, 0x02D,
690 "fcmovge $RCOND,$RTRUE,$RDEST",
691 [], s_fcmov>; //FCMOVE if >= zero
692def FCMOVGTS : FPForm<0x17, 0x02F,
693 "fcmovgt $RCOND,$RTRUE,$RDEST",
694 [], s_fcmov>; //FCMOVE if > zero
695def FCMOVLES : FPForm<0x17, 0x02E,
696 "fcmovle $RCOND,$RTRUE,$RDEST",
697 [], s_fcmov>; //FCMOVE if <= zero
698def FCMOVLTS : FPForm<0x17, 0x02C,
699 "fcmovlt $RCOND,$RTRUE,$RDEST",
700 [], s_fcmov>; // FCMOVE if < zero
701def FCMOVNES : FPForm<0x17, 0x02B,
702 "fcmovne $RCOND,$RTRUE,$RDEST",
703 [], s_fcmov>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000704}
705//conditional moves, doubles
Eric Christopher23265d02010-06-21 18:48:55 +0000706let OutOperandList = (outs F8RC:$RDEST),
707 InOperandList = (ins F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
708 Constraints = "$RTRUE = $RDEST" in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000709def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
710def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
711def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
712def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
713def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
714def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000715}
716
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000717//misc FP selects
718//Select double
Andrew Lenharth20c08e52009-08-08 12:49:07 +0000719
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000720def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000721 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000722def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
723 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
724def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
725 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
726
Andrew Lenharth110f2242005-12-12 20:30:09 +0000727def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
728 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000729def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
730 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
731def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
732 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
733
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000734def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000735 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000736def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
737 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
738def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
739 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
740
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000741def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000742 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000743def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
744 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
745def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
746 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
747
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000748def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000749 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000750def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
751 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
752def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
753 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
754
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000755def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000756 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000757def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
758 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
759def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
760 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
761
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000762//Select single
763def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000764 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000765def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
766 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
767def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
768 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
769
Andrew Lenharth110f2242005-12-12 20:30:09 +0000770def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
771 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000772def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
773 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
774def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
775 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
776
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000777def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000778 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000779def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
780 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
781def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
782 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
783
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000784def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000785 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000786def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
787 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
788def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
789 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
790
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000791def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000792 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000793def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
794 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
795def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
796 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
797
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000798def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000799 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000800def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
801 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
802def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
803 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000804
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000805
806
Chris Lattner6784bdf2010-03-18 20:55:18 +0000807let OutOperandList = (outs GPRC:$RC), InOperandList = (ins F4RC:$RA), Fb = 31 in
Andrew Lenharth20c08e52009-08-08 12:49:07 +0000808def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",
809 [(set GPRC:$RC, (bitconvert F4RC:$RA))], s_ftoi>; //Floating to integer move, S_floating
Chris Lattner6784bdf2010-03-18 20:55:18 +0000810let OutOperandList = (outs GPRC:$RC), InOperandList = (ins F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000811def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
Andrew Lenharth3553d862007-01-24 21:09:16 +0000812 [(set GPRC:$RC, (bitconvert F8RC:$RA))], s_ftoi>; //Floating to integer move
Chris Lattner6784bdf2010-03-18 20:55:18 +0000813let OutOperandList = (outs F4RC:$RC), InOperandList = (ins GPRC:$RA), Fb = 31 in
Andrew Lenharth20c08e52009-08-08 12:49:07 +0000814def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",
815 [(set F4RC:$RC, (bitconvert GPRC:$RA))], s_itof>; //Integer to floating move, S_floating
Chris Lattner6784bdf2010-03-18 20:55:18 +0000816let OutOperandList = (outs F8RC:$RC), InOperandList = (ins GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000817def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
Andrew Lenharth3553d862007-01-24 21:09:16 +0000818 [(set F8RC:$RC, (bitconvert GPRC:$RA))], s_itof>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000819
820
Chris Lattner6784bdf2010-03-18 20:55:18 +0000821let OutOperandList = (outs F4RC:$RC), InOperandList = (ins F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000822def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000823 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))], s_fadd>;
Chris Lattner6784bdf2010-03-18 20:55:18 +0000824let OutOperandList = (outs F8RC:$RC), InOperandList = (ins F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000825def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000826 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))], s_fadd>;
Chris Lattner6784bdf2010-03-18 20:55:18 +0000827let OutOperandList = (outs F8RC:$RC), InOperandList = (ins F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000828def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000829 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))], s_fadd>;
Chris Lattner6784bdf2010-03-18 20:55:18 +0000830let OutOperandList = (outs F8RC:$RC), InOperandList = (ins F4RC:$RB), Fa = 31 in
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000831def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000832 [(set F8RC:$RC, (fextend F4RC:$RB))], s_fadd>;
Chris Lattner6784bdf2010-03-18 20:55:18 +0000833let OutOperandList = (outs F4RC:$RC), InOperandList = (ins F8RC:$RB), Fa = 31 in
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000834def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000835 [(set F4RC:$RC, (fround F8RC:$RB))], s_fadd>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000836
Andrew Lenharth20c08e52009-08-08 12:49:07 +0000837def : Pat<(select GPRC:$RC, F8RC:$st, F8RC:$sf),
838 (f64 (FCMOVEQT F8RC:$st, F8RC:$sf, (ITOFT GPRC:$RC)))>;
839def : Pat<(select GPRC:$RC, F4RC:$st, F4RC:$sf),
840 (f32 (FCMOVEQS F4RC:$st, F4RC:$sf, (ITOFT GPRC:$RC)))>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000841
842/////////////////////////////////////////////////////////
843//Branching
844/////////////////////////////////////////////////////////
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000845class br_icc<bits<6> opc, string asmstr>
Chris Lattner6784bdf2010-03-18 20:55:18 +0000846 : BFormN<opc, (ins u64imm:$opc, GPRC:$R, target:$dst),
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000847 !strconcat(asmstr, " $R,$dst"), s_icbr>;
848class br_fcc<bits<6> opc, string asmstr>
Chris Lattner6784bdf2010-03-18 20:55:18 +0000849 : BFormN<opc, (ins u64imm:$opc, F8RC:$R, target:$dst),
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000850 !strconcat(asmstr, " $R,$dst"), s_fbr>;
851
Evan Chengffbacca2007-07-21 00:34:19 +0000852let isBranch = 1, isTerminator = 1, hasCtrlDep = 1 in {
Dan Gohman4ee637c2010-05-14 22:00:27 +0000853let Ra = 31, isBarrier = 1 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000854def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)], s_ubr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000855
Chris Lattner6784bdf2010-03-18 20:55:18 +0000856def COND_BRANCH_I : BFormN<0, (ins u64imm:$opc, GPRC:$R, target:$dst),
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000857 "{:comment} COND_BRANCH imm:$opc, GPRC:$R, bb:$dst",
858 s_icbr>;
Chris Lattner6784bdf2010-03-18 20:55:18 +0000859def COND_BRANCH_F : BFormN<0, (ins u64imm:$opc, F8RC:$R, target:$dst),
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000860 "{:comment} COND_BRANCH imm:$opc, F8RC:$R, bb:$dst",
861 s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000862//Branches, int
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000863def BEQ : br_icc<0x39, "beq">;
864def BGE : br_icc<0x3E, "bge">;
865def BGT : br_icc<0x3F, "bgt">;
866def BLBC : br_icc<0x38, "blbc">;
867def BLBS : br_icc<0x3C, "blbs">;
868def BLE : br_icc<0x3B, "ble">;
869def BLT : br_icc<0x3A, "blt">;
870def BNE : br_icc<0x3D, "bne">;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000871
872//Branches, float
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000873def FBEQ : br_fcc<0x31, "fbeq">;
874def FBGE : br_fcc<0x36, "fbge">;
875def FBGT : br_fcc<0x37, "fbgt">;
876def FBLE : br_fcc<0x33, "fble">;
877def FBLT : br_fcc<0x32, "fblt">;
878def FBNE : br_fcc<0x36, "fbne">;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000879}
880
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000881//An ugly trick to get the opcode as an imm I can use
882def immBRCond : SDNodeXForm<imm, [{
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +0000883 switch((uint64_t)N->getZExtValue()) {
Chris Lattner03a46982008-12-14 21:37:33 +0000884 default: assert(0 && "Unknown branch type");
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000885 case 0: return getI64Imm(Alpha::BEQ);
886 case 1: return getI64Imm(Alpha::BNE);
887 case 2: return getI64Imm(Alpha::BGE);
888 case 3: return getI64Imm(Alpha::BGT);
889 case 4: return getI64Imm(Alpha::BLE);
890 case 5: return getI64Imm(Alpha::BLT);
891 case 6: return getI64Imm(Alpha::BLBS);
892 case 7: return getI64Imm(Alpha::BLBC);
893 case 20: return getI64Imm(Alpha::FBEQ);
894 case 21: return getI64Imm(Alpha::FBNE);
895 case 22: return getI64Imm(Alpha::FBGE);
896 case 23: return getI64Imm(Alpha::FBGT);
897 case 24: return getI64Imm(Alpha::FBLE);
898 case 25: return getI64Imm(Alpha::FBLT);
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000899 }
900}]>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000901
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000902//Int cond patterns
903def : Pat<(brcond (seteq GPRC:$RA, 0), bb:$DISP),
904 (COND_BRANCH_I (immBRCond 0), GPRC:$RA, bb:$DISP)>;
905def : Pat<(brcond (setge GPRC:$RA, 0), bb:$DISP),
906 (COND_BRANCH_I (immBRCond 2), GPRC:$RA, bb:$DISP)>;
907def : Pat<(brcond (setgt GPRC:$RA, 0), bb:$DISP),
908 (COND_BRANCH_I (immBRCond 3), GPRC:$RA, bb:$DISP)>;
Chris Lattnere00ed572010-03-08 18:29:38 +0000909def : Pat<(brcond (and GPRC:$RA, 1), bb:$DISP),
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000910 (COND_BRANCH_I (immBRCond 6), GPRC:$RA, bb:$DISP)>;
911def : Pat<(brcond (setle GPRC:$RA, 0), bb:$DISP),
912 (COND_BRANCH_I (immBRCond 4), GPRC:$RA, bb:$DISP)>;
913def : Pat<(brcond (setlt GPRC:$RA, 0), bb:$DISP),
914 (COND_BRANCH_I (immBRCond 5), GPRC:$RA, bb:$DISP)>;
915def : Pat<(brcond (setne GPRC:$RA, 0), bb:$DISP),
916 (COND_BRANCH_I (immBRCond 1), GPRC:$RA, bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000917
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000918def : Pat<(brcond GPRC:$RA, bb:$DISP),
919 (COND_BRANCH_I (immBRCond 1), GPRC:$RA, bb:$DISP)>;
920def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
921 (COND_BRANCH_I (immBRCond 0), (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
922def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
923 (COND_BRANCH_I (immBRCond 0), (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000924
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000925//FP cond patterns
926def : Pat<(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP),
927 (COND_BRANCH_F (immBRCond 20), F8RC:$RA, bb:$DISP)>;
928def : Pat<(brcond (setne F8RC:$RA, immFPZ), bb:$DISP),
929 (COND_BRANCH_F (immBRCond 21), F8RC:$RA, bb:$DISP)>;
930def : Pat<(brcond (setge F8RC:$RA, immFPZ), bb:$DISP),
931 (COND_BRANCH_F (immBRCond 22), F8RC:$RA, bb:$DISP)>;
932def : Pat<(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP),
933 (COND_BRANCH_F (immBRCond 23), F8RC:$RA, bb:$DISP)>;
934def : Pat<(brcond (setle F8RC:$RA, immFPZ), bb:$DISP),
935 (COND_BRANCH_F (immBRCond 24), F8RC:$RA, bb:$DISP)>;
936def : Pat<(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP),
937 (COND_BRANCH_F (immBRCond 25), F8RC:$RA, bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000938
939
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000940def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
941 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
942def : Pat<(brcond (setoeq F8RC:$RA, F8RC:$RB), bb:$DISP),
943 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
944def : Pat<(brcond (setueq F8RC:$RA, F8RC:$RB), bb:$DISP),
945 (COND_BRANCH_F (immBRCond 21), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000946
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000947def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
948 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
949def : Pat<(brcond (setolt F8RC:$RA, F8RC:$RB), bb:$DISP),
950 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
951def : Pat<(brcond (setult F8RC:$RA, F8RC:$RB), bb:$DISP),
952 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000953
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000954def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
955 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
956def : Pat<(brcond (setole F8RC:$RA, F8RC:$RB), bb:$DISP),
957 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
958def : Pat<(brcond (setule F8RC:$RA, F8RC:$RB), bb:$DISP),
959 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000960
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000961def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
962 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
963def : Pat<(brcond (setogt F8RC:$RA, F8RC:$RB), bb:$DISP),
964 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
965def : Pat<(brcond (setugt F8RC:$RA, F8RC:$RB), bb:$DISP),
966 (COND_BRANCH_F (immBRCond 21), (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000967
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000968def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
969 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
970def : Pat<(brcond (setoge F8RC:$RA, F8RC:$RB), bb:$DISP),
971 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
972def : Pat<(brcond (setuge F8RC:$RA, F8RC:$RB), bb:$DISP),
973 (COND_BRANCH_F (immBRCond 21), (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000974
Andrew Lenharthf81173f2006-10-31 16:49:55 +0000975def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
976 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
977def : Pat<(brcond (setone F8RC:$RA, F8RC:$RB), bb:$DISP),
978 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
979def : Pat<(brcond (setune F8RC:$RA, F8RC:$RB), bb:$DISP),
980 (COND_BRANCH_F (immBRCond 20), (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
981
982
983def : Pat<(brcond (setoeq F8RC:$RA, immFPZ), bb:$DISP),
984 (COND_BRANCH_F (immBRCond 20), F8RC:$RA,bb:$DISP)>;
985def : Pat<(brcond (setueq F8RC:$RA, immFPZ), bb:$DISP),
986 (COND_BRANCH_F (immBRCond 20), F8RC:$RA,bb:$DISP)>;
987
988def : Pat<(brcond (setoge F8RC:$RA, immFPZ), bb:$DISP),
989 (COND_BRANCH_F (immBRCond 22), F8RC:$RA,bb:$DISP)>;
990def : Pat<(brcond (setuge F8RC:$RA, immFPZ), bb:$DISP),
991 (COND_BRANCH_F (immBRCond 22), F8RC:$RA,bb:$DISP)>;
992
993def : Pat<(brcond (setogt F8RC:$RA, immFPZ), bb:$DISP),
994 (COND_BRANCH_F (immBRCond 23), F8RC:$RA,bb:$DISP)>;
995def : Pat<(brcond (setugt F8RC:$RA, immFPZ), bb:$DISP),
996 (COND_BRANCH_F (immBRCond 23), F8RC:$RA,bb:$DISP)>;
997
998def : Pat<(brcond (setole F8RC:$RA, immFPZ), bb:$DISP),
999 (COND_BRANCH_F (immBRCond 24), F8RC:$RA,bb:$DISP)>;
1000def : Pat<(brcond (setule F8RC:$RA, immFPZ), bb:$DISP),
1001 (COND_BRANCH_F (immBRCond 24), F8RC:$RA,bb:$DISP)>;
1002
1003def : Pat<(brcond (setolt F8RC:$RA, immFPZ), bb:$DISP),
1004 (COND_BRANCH_F (immBRCond 25), F8RC:$RA,bb:$DISP)>;
1005def : Pat<(brcond (setult F8RC:$RA, immFPZ), bb:$DISP),
1006 (COND_BRANCH_F (immBRCond 25), F8RC:$RA,bb:$DISP)>;
1007
1008def : Pat<(brcond (setone F8RC:$RA, immFPZ), bb:$DISP),
1009 (COND_BRANCH_F (immBRCond 21), F8RC:$RA,bb:$DISP)>;
1010def : Pat<(brcond (setune F8RC:$RA, immFPZ), bb:$DISP),
1011 (COND_BRANCH_F (immBRCond 21), F8RC:$RA,bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001012
1013//End Branches
1014
Andrew Lenharth3e98fde2005-01-26 21:54:09 +00001015//S_floating : IEEE Single
1016//T_floating : IEEE Double
1017
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +00001018//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +00001019//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +00001020//CALL_PAL Pcd 00 Trap to PALcode
1021//ECB Mfc 18.E800 Evict cache block
1022//EXCB Mfc 18.0400 Exception barrier
1023//FETCH Mfc 18.8000 Prefetch data
1024//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +00001025//LDQ_U Mem 0B Load unaligned quadword
1026//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +00001027//STQ_U Mem 0F Store unaligned quadword
1028//TRAPB Mfc 18.0000 Trap barrier
1029//WH64 Mfc 18.F800 Write hint  64 bytes
1030//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +00001031//MF_FPCR F-P 17.025 Move from FPCR
1032//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +00001033//There are in the Multimedia extentions, so let's not use them yet
1034//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
1035//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
1036//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
1037//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
1038//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
1039//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
1040//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
1041//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
1042//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
1043//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
1044//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
1045//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
1046//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
1047//CVTLQ F-P 17.010 Convert longword to quadword
1048//CVTQL F-P 17.030 Convert quadword to longword
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +00001049
1050
Andrew Lenharth50b37842005-11-22 04:20:06 +00001051//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +00001052
Andrew Lenharth50b37842005-11-22 04:20:06 +00001053def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001054 //true if imm fits in a LDAH LDA pair
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +00001055 int64_t val = (int64_t)N->getZExtValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001056 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +00001057}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001058def immConst2PartInt : PatLeaf<(imm), [{
1059 //true if imm fits in a LDAH LDA pair with zeroext
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +00001060 uint64_t uval = N->getZExtValue();
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001061 int32_t val32 = (int32_t)uval;
1062 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001063 val32 <= IMM_FULLHIGH);
1064// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
1065}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001066
1067def : Pat<(i64 immConst2Part:$imm),
1068 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +00001069
1070def : Pat<(i64 immSExt16:$imm),
1071 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001072
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001073def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001074 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001075def : Pat<(i64 immConst2PartInt:$imm),
Chris Lattner4de35022010-03-15 05:35:37 +00001076 (ZAPNOTi (LDA (LL16 (i64 (SExt32 immConst2PartInt:$imm))),
1077 (LDAH (LH16 (i64 (SExt32 immConst2PartInt:$imm))), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001078
1079
Andrew Lenharth50b37842005-11-22 04:20:06 +00001080//TODO: I want to just define these like this!
1081//def : Pat<(i64 0),
1082// (R31)>;
1083//def : Pat<(f64 0.0),
1084// (F31)>;
1085//def : Pat<(f64 -0.0),
1086// (CPYSNT F31, F31)>;
1087//def : Pat<(f32 0.0),
1088// (F31)>;
1089//def : Pat<(f32 -0.0),
1090// (CPYSNS F31, F31)>;
1091
1092//Misc Patterns:
1093
1094def : Pat<(sext_inreg GPRC:$RB, i32),
1095 (ADDLi GPRC:$RB, 0)>;
1096
Andrew Lenharth7f0db912005-11-30 07:19:56 +00001097def : Pat<(fabs F8RC:$RB),
1098 (CPYST F31, F8RC:$RB)>;
1099def : Pat<(fabs F4RC:$RB),
1100 (CPYSS F31, F4RC:$RB)>;
1101def : Pat<(fneg F8RC:$RB),
1102 (CPYSNT F8RC:$RB, F8RC:$RB)>;
1103def : Pat<(fneg F4RC:$RB),
1104 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001105
Andrew Lenharth283f2222006-03-09 17:41:50 +00001106def : Pat<(fcopysign F4RC:$A, (fneg F4RC:$B)),
1107 (CPYSNS F4RC:$B, F4RC:$A)>;
1108def : Pat<(fcopysign F8RC:$A, (fneg F8RC:$B)),
1109 (CPYSNT F8RC:$B, F8RC:$A)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001110def : Pat<(fcopysign F4RC:$A, (fneg F8RC:$B)),
1111 (CPYSNSt F8RC:$B, F4RC:$A)>;
1112def : Pat<(fcopysign F8RC:$A, (fneg F4RC:$B)),
1113 (CPYSNTs F4RC:$B, F8RC:$A)>;
Andrew Lenharth13beebb2006-03-09 14:58:25 +00001114
Andrew Lenharthcd804962005-11-30 16:10:29 +00001115//Yes, signed multiply high is ugly
1116def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001117 (SUBQr (UMULHr GPRC:$RA, GPRC:$RB), (ADDQr (CMOVGEr GPRC:$RB, R31, GPRC:$RA),
1118 (CMOVGEr GPRC:$RA, R31, GPRC:$RB)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001119
1120//Stupid crazy arithmetic stuff:
Andrew Lenharth956a4312006-10-31 19:52:12 +00001121let AddedComplexity = 1 in {
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001122def : Pat<(mul GPRC:$RA, 5), (S4ADDQr GPRC:$RA, GPRC:$RA)>;
1123def : Pat<(mul GPRC:$RA, 9), (S8ADDQr GPRC:$RA, GPRC:$RA)>;
1124def : Pat<(mul GPRC:$RA, 3), (S4SUBQr GPRC:$RA, GPRC:$RA)>;
1125def : Pat<(mul GPRC:$RA, 7), (S8SUBQr GPRC:$RA, GPRC:$RA)>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001126
Andrew Lenharth956a4312006-10-31 19:52:12 +00001127//slight tree expansion if we are multiplying near to a power of 2
1128//n is above a power of 2
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001129def : Pat<(mul GPRC:$RA, immRem1:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001130 (ADDQr (SLr GPRC:$RA, (nearP2X immRem1:$imm)), GPRC:$RA)>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001131def : Pat<(mul GPRC:$RA, immRem2:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001132 (ADDQr (SLr GPRC:$RA, (nearP2X immRem2:$imm)), (ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001133def : Pat<(mul GPRC:$RA, immRem3:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001134 (ADDQr (SLr GPRC:$RA, (nearP2X immRem3:$imm)), (S4SUBQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001135def : Pat<(mul GPRC:$RA, immRem4:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001136 (S4ADDQr GPRC:$RA, (SLr GPRC:$RA, (nearP2X immRem4:$imm)))>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001137def : Pat<(mul GPRC:$RA, immRem5:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001138 (ADDQr (SLr GPRC:$RA, (nearP2X immRem5:$imm)), (S4ADDQr GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001139def : Pat<(mul GPRC:$RA, immRemP2:$imm),
Andrew Lenharth6bbf6b02006-10-31 23:46:56 +00001140 (ADDQr (SLr GPRC:$RA, (nearP2X immRemP2:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2:$imm)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001141
Andrew Lenharth956a4312006-10-31 19:52:12 +00001142//n is below a power of 2
Andrew Lenharth19914ed2007-11-27 18:31:30 +00001143//FIXME: figure out why something is truncating the imm to 32bits
1144// this will fix 2007-11-27-mulneg3
1145//def : Pat<(mul GPRC:$RA, immRem1n:$imm),
1146// (SUBQr (SLr GPRC:$RA, (nearP2X immRem1n:$imm)), GPRC:$RA)>;
1147//def : Pat<(mul GPRC:$RA, immRem2n:$imm),
1148// (SUBQr (SLr GPRC:$RA, (nearP2X immRem2n:$imm)), (ADDQr GPRC:$RA, GPRC:$RA))>;
1149//def : Pat<(mul GPRC:$RA, immRem3n:$imm),
1150// (SUBQr (SLr GPRC:$RA, (nearP2X immRem3n:$imm)), (S4SUBQr GPRC:$RA, GPRC:$RA))>;
1151//def : Pat<(mul GPRC:$RA, immRem4n:$imm),
1152// (SUBQr (SLr GPRC:$RA, (nearP2X immRem4n:$imm)), (SLi GPRC:$RA, 2))>;
1153//def : Pat<(mul GPRC:$RA, immRem5n:$imm),
1154// (SUBQr (SLr GPRC:$RA, (nearP2X immRem5n:$imm)), (S4ADDQr GPRC:$RA, GPRC:$RA))>;
1155//def : Pat<(mul GPRC:$RA, immRemP2n:$imm),
1156// (SUBQr (SLr GPRC:$RA, (nearP2X immRemP2n:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2n:$imm)))>;
Andrew Lenharth956a4312006-10-31 19:52:12 +00001157} //Added complexity