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