blob: d63d0badff5c8242f87bfc7d9c7142bb9dfec56f [file] [log] [blame]
Misha Brukmanbc9ccf62005-02-04 20:25:52 +00001//===- AlphaInstrInfo.td - The Alpha Instruction Set -------*- tablegen -*-===//
Andrew Lenharth304d0f32005-01-22 23:41:55 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//
11//===----------------------------------------------------------------------===//
12
13include "AlphaInstrFormats.td"
14
Andrew Lenharth4907d222005-10-20 00:28:31 +000015//********************
Andrew Lenharth7f0db912005-11-30 07:19:56 +000016//Custom DAG Nodes
17//********************
18
19def SDTFPUnaryOpUnC : SDTypeProfile<1, 1, [
20 SDTCisFP<1>, SDTCisFP<0>
21]>;
Andrew Lenharth167bc6e2006-01-23 20:59:50 +000022def Alpha_itoft : SDNode<"AlphaISD::ITOFT_", SDTIntToFPOp, []>;
23def Alpha_ftoit : SDNode<"AlphaISD::FTOIT_", SDTFPToIntOp, []>;
24def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
25def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
26def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_" , SDTFPUnaryOp, []>;
27def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
28def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
29def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000030
Andrew Lenharthf2b806a2006-06-12 18:09:24 +000031def retflag : SDNode<"AlphaISD::RET_FLAG", SDTRet,
32 [SDNPHasChain, SDNPOptInFlag]>;
33
Andrew Lenharth79620652005-12-05 20:50:53 +000034// These are target-independent nodes, but have target-specific formats.
35def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
Evan Chengbb7b8442006-08-11 09:03:33 +000036def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,
37 [SDNPHasChain, SDNPOutFlag]>;
38def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,
39 [SDNPHasChain, SDNPOutFlag]>;
Andrew Lenharth79620652005-12-05 20:50:53 +000040
Andrew Lenharth7f0db912005-11-30 07:19:56 +000041//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000042//Paterns for matching
43//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000044def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000045 return getI64Imm(~N->getValue());
46}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000047def negX : SDNodeXForm<imm, [{ //negate
48 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000049}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000050def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000051 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
52}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000053def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
54 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000055}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000056def LL16 : SDNodeXForm<imm, [{ //lda part of constant
57 return getI64Imm(get_lda16(N->getValue()));
58}]>;
59def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
60 return getI64Imm(get_ldah16(N->getValue()));
61}]>;
62def iZAPX : SDNodeXForm<imm, [{ // get imm to ZAPi
63 return getI64Imm(get_zapImm((uint64_t)N->getValue()));
64}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000065def nearP2X : SDNodeXForm<imm, [{
66 return getI64Imm(Log2_64(getNearPower2((uint64_t)N->getValue())));
67}]>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +000068def nearP2RemX : SDNodeXForm<imm, [{
69 uint64_t x = abs(N->getValue() - getNearPower2((uint64_t)N->getValue()));
70 return getI64Imm(Log2_64(x));
71}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000072
73def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
74 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
75}]>;
76def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
77 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
78}], invX>;
79def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
80 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
81}], negX>;
82def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
83 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
84}]>;
85def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
86 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
87}], SExt16>;
88def immZAP : PatLeaf<(imm), [{ //imm is good for zapi
89 uint64_t build = get_zapImm((uint64_t)N->getValue());
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000090 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +000091}], iZAPX>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000092def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
93 return true;
94}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000095def immRem1 : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +000096 return N->getValue() - getNearPower2((uint64_t)N->getValue()) == 1;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000097}]>;
98def immRem3 : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +000099 return N->getValue() - getNearPower2((uint64_t)N->getValue()) == 3;
100}]>;
101def immRem4 : PatLeaf<(imm), [{
102 return N->getValue() - getNearPower2((uint64_t)N->getValue()) == 4;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000103}]>;
104def immRem5 : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000105 return N->getValue() - getNearPower2((uint64_t)N->getValue()) == 5;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000106}]>;
107def immRem1n : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000108 return getNearPower2((uint64_t)N->getValue()) - N->getValue() == 1;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000109}]>;
110def immRem3n : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000111 return getNearPower2((uint64_t)N->getValue()) - N->getValue() == 3;
112}]>;
113def immRem4n : PatLeaf<(imm), [{
114 return getNearPower2((uint64_t)N->getValue()) - N->getValue() == 4;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000115}]>;
116def immRem5n : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000117 return getNearPower2((uint64_t)N->getValue()) - N->getValue() == 5;
118}]>;
119def immRemP2n : PatLeaf<(imm), [{
120 return isPowerOf2_64(getNearPower2((uint64_t)N->getValue()) - N->getValue());
121}]>;
122def immRemP2 : PatLeaf<(imm), [{
123 return isPowerOf2_64(N->getValue() - getNearPower2((uint64_t)N->getValue()));
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000124}]>;
125def immUExt8ME : PatLeaf<(imm), [{ //use this imm for mulqi
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000126 int64_t d = abs((int64_t)N->getValue() - (int64_t)getNearPower2((uint64_t)N->getValue()));
127 if (isPowerOf2_64(d)) return false;
128 switch (d) {
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000129 case 1: case 3: case 5: return false;
130 default: return (uint64_t)N->getValue() == (uint8_t)N->getValue();
131 };
132}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000133
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000134def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
135def add4 : PatFrag<(ops node:$op1, node:$op2),
136 (add (shl node:$op1, 2), node:$op2)>;
137def sub4 : PatFrag<(ops node:$op1, node:$op2),
138 (sub (shl node:$op1, 2), node:$op2)>;
139def add8 : PatFrag<(ops node:$op1, node:$op2),
140 (add (shl node:$op1, 3), node:$op2)>;
141def sub8 : PatFrag<(ops node:$op1, node:$op2),
142 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000143
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000144
145//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000146
Andrew Lenharth50b37842005-11-22 04:20:06 +0000147def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000148 [(set GPRC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000149def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000150 [(set F4RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000151def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000152 [(set F8RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000153
Andrew Lenharth017c5562006-03-09 17:16:45 +0000154def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", [], s_pseudo>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000155
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000156let isLoad = 1, hasCtrlDep = 1 in {
157def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000158 [(callseq_start imm:$amt)], s_pseudo>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000159def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000160 [(callseq_end imm:$amt)], s_pseudo>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000161}
Andrew Lenharth017c5562006-03-09 17:16:45 +0000162def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", [], s_pseudo>;
163def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[], s_pseudo>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000164def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth017c5562006-03-09 17:16:45 +0000165 "LSMARKER$$$i$$$j$$$k$$$m:", [], s_pseudo>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000166
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000167
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000168//***********************
169//Real instructions
170//***********************
171
172//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000173
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000174//conditional moves, int
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000175
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000176def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000177 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000178def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000179 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000180def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000181 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000182def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000183 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000184def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000185 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000186def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000187 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000188def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000189 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000190def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000191 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000192
193def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000194 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000195def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000196 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000197def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000198 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000199def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000200 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000201def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000202 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000203def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000204 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000205def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000206 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000207def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000208 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000209
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000210
Andrew Lenharth133d3102006-02-03 03:07:37 +0000211//General pattern for cmov
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000212def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000213 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000214def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
215 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000216
Andrew Lenharth6b634032006-09-20 15:05:49 +0000217//Invert sense when we can for constants:
218def : Pat<(select (seteq GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
219 (CMOVEQi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
220def : Pat<(select (setne GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
221 (CMOVNEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
222def : Pat<(select (setgt GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
223 (CMOVGTi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
224def : Pat<(select (setge GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
225 (CMOVGEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
226def : Pat<(select (setlt GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
227 (CMOVLTi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
228def : Pat<(select (setle GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
229 (CMOVLEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
230
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000231
Andrew Lenharth4907d222005-10-20 00:28:31 +0000232def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000233 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000234def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000235 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000236def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000237 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000238def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000239 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000240def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000241 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000242def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000243 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000244def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000245 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000246def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000247 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000248def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000249 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000250def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000251 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))], s_ilog>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000252def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000253 [(set GPRC:$RC, (ctlz GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000254def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000255 [(set GPRC:$RC, (ctpop GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000256def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000257 [(set GPRC:$RC, (cttz GPRC:$RB))], s_imisc>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000258def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000259 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000260def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000261 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000262def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000263 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000264def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000265 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000266def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000267 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000268
Andrew Lenharth4907d222005-10-20 00:28:31 +0000269//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
270//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
271//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000272//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
273//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
274//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
275//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
276//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
277//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
278//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000279//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000280
Andrew Lenharth4907d222005-10-20 00:28:31 +0000281//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
282//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
283//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
284//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
285//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
286//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
287//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
288//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
289//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
290//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
291//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
292//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
293//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
294//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
295//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
296//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
297//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
298//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
299//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
300//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
301//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
302//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
303//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
304//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
305//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
306//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
307//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
308//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
309//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
310//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000311
Andrew Lenharth4907d222005-10-20 00:28:31 +0000312def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000313 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000314def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000315 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000316def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000317 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000318def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000319 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8ME:$L))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000320def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000321 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000322def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000323 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000324def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000325 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000326def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000327 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000328def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000329 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000330def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000331 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000332def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000333 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000334def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000335 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000336def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000337 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000338def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000339 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000340def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000341 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000342def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000343 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000344def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000345 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000346def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000347 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000348def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000349 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000350def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000351 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8neg:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000352def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000353 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000354def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000355 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8neg:$L))], s_iadd>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000356def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000357 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))], s_ishf>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000358def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000359 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000360def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000361 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000362def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000363 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000364def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000365 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000366def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000367 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000368def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000369 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000370def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000371 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000372def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000373 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000374def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000375 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8neg:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000376def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000377 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000378def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000379 [(set GPRC:$RC, (add GPRC:$RA, immUExt8neg:$L))], s_iadd>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000380def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000381 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))], s_imul>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000382def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000383 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000384def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000385 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000386def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000387 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))], s_ilog>;
Chris Lattner78feeb02006-10-11 04:12:39 +0000388
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000389def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000390 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))], s_ishf>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000391
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000392//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000393//So this is a waste of what this instruction can do, but it still saves something
394def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000395 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000396def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000397 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000398def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000399 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000400def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000401 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000402def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000403 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000404def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000405 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000406def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000407 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000408def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000409 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000410def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000411 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000412def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000413 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000414def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000415 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000416def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000417 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000418
419//Patterns for unsupported int comparisons
420def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
421def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
422
423def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
424def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
425
426def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
427def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
428
429def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
430def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
431
432def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
433def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
434
435def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
436def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
437
438def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
439def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
440
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000441
Andrew Lenharthf2b806a2006-06-12 18:09:24 +0000442let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000443 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", s_jsr>; //Return from subroutine
Andrew Lenharthf2b806a2006-06-12 18:09:24 +0000444 def RETDAGp : MbrpForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", [(retflag)], s_jsr>; //Return from subroutine
445}
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000446
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000447let isBranch = 1, isTerminator = 1, noResults = 1, isBarrier = 1,
448Ra = 31, disp = 0 in
449def JMP : MbrpForm< 0x1A, 0x00, (ops GPRC:$RS), "jmp $$31,($RS),0",
450 [(brind GPRC:$RS)], s_jsr>; //Jump
451
Evan Cheng2b4ea792005-12-26 09:11:45 +0000452let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000453 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000454 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000455 F0, F1,
456 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000457 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000458 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", [], s_jsr>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000459}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000460let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000461 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
462 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
463 F0, F1,
464 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
465 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000466 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0", s_jsr>; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000467}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000468
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000469let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
470 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000471 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0", s_jsr>; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000472
Andrew Lenharth53d89702005-12-25 01:34:27 +0000473
Andrew Lenharth017c5562006-03-09 17:16:45 +0000474def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP", s_jsr>; //Jump to subroutine return
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000475
Andrew Lenharthb6718602005-12-24 07:34:33 +0000476let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
477def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000478 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000479def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000480 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000481def LDL : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000482 [(set GPRC:$RA, (sextloadi32 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000483def LDLr : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000484 [(set GPRC:$RA, (sextloadi32 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000485def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000486 [(set GPRC:$RA, (zextloadi8 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000487def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000488 [(set GPRC:$RA, (zextloadi8 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000489def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000490 [(set GPRC:$RA, (zextloadi16 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000491def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000492 [(set GPRC:$RA, (zextloadi16 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000493def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000494 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000495def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000496 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000497def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000498 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000499def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000500 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000501def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000502 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000503def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000504 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000505def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000506 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000507def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000508 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000509
510//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000511def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000512 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_lda>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000513def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000514 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000515def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000516 [], s_lda>; //Load address high
Andrew Lenharthb6718602005-12-24 07:34:33 +0000517def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000518 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000519}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000520
Andrew Lenharthb6718602005-12-24 07:34:33 +0000521let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
522def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000523 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000524def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000525 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000526def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000527 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000528def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000529 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000530}
531let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
532def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000533 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000534def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000535 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000536def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000537 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000538def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000539 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000540}
541
Andrew Lenharthc687b482005-12-24 08:29:32 +0000542
543//constpool rels
544def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
545 (LDQr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000546def : Pat<(i64 (sextloadi32 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000547 (LDLr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000548def : Pat<(i64 (zextloadi8 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000549 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000550def : Pat<(i64 (zextloadi16 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000551 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
552def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
553 (LDAr tconstpool:$DISP, GPRC:$RB)>;
554def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
555 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
556def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
557 (LDSr tconstpool:$DISP, GPRC:$RB)>;
558def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
559 (LDTr tconstpool:$DISP, GPRC:$RB)>;
560
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000561//jumptable rels
562def : Pat<(i64 (Alpha_gprelhi tjumptable:$DISP, GPRC:$RB)),
563 (LDAHr tjumptable:$DISP, GPRC:$RB)>;
564def : Pat<(i64 (Alpha_gprello tjumptable:$DISP, GPRC:$RB)),
565 (LDAr tjumptable:$DISP, GPRC:$RB)>;
566
Andrew Lenharthc687b482005-12-24 08:29:32 +0000567
Andrew Lenharthb6718602005-12-24 07:34:33 +0000568//misc ext patterns
Evan Cheng466685d2006-10-09 20:57:25 +0000569def : Pat<(i64 (extloadi8 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000570 (LDBU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000571def : Pat<(i64 (extloadi16 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000572 (LDWU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000573def : Pat<(i64 (extloadi32 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000574 (LDL immSExt16:$DISP, GPRC:$RB)>;
575
576//0 disp patterns
577def : Pat<(i64 (load GPRC:$addr)),
578 (LDQ 0, GPRC:$addr)>;
579def : Pat<(f64 (load GPRC:$addr)),
580 (LDT 0, GPRC:$addr)>;
581def : Pat<(f32 (load GPRC:$addr)),
582 (LDS 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000583def : Pat<(i64 (sextloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000584 (LDL 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000585def : Pat<(i64 (zextloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000586 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000587def : Pat<(i64 (zextloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000588 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000589def : Pat<(i64 (extloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000590 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000591def : Pat<(i64 (extloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000592 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000593def : Pat<(i64 (extloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000594 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000595
Andrew Lenharthc687b482005-12-24 08:29:32 +0000596def : Pat<(store GPRC:$DATA, GPRC:$addr),
597 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
598def : Pat<(store F8RC:$DATA, GPRC:$addr),
599 (STT F8RC:$DATA, 0, GPRC:$addr)>;
600def : Pat<(store F4RC:$DATA, GPRC:$addr),
601 (STS F4RC:$DATA, 0, GPRC:$addr)>;
602def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i32),
603 (STL GPRC:$DATA, 0, GPRC:$addr)>;
604def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i16),
605 (STW GPRC:$DATA, 0, GPRC:$addr)>;
606def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i8),
607 (STB GPRC:$DATA, 0, GPRC:$addr)>;
608
Andrew Lenharth4e629512005-12-24 05:36:33 +0000609
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000610//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000611let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000612def LDAg : MForm<0x08, 0, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
613def LDAHg : MForm<0x09, 0, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000614}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000615
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000616//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000617let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000618def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000619 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))], s_ild>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000620def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
621 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000622
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000623
Andrew Lenharth017c5562006-03-09 17:16:45 +0000624def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA", s_rpcc>; //Read process cycle counter
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000625
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000626//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000627
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000628//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000629
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000630let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
631def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000632 [(set F4RC:$RC, (fsqrt F4RC:$RB))], s_fsqrts>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000633
634let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
635def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000636 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000637def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000638 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000639def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000640 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))], s_fdivs>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000641def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000642 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000643
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000644def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000645 [(set F4RC:$RC, (fcopysign F4RC:$RB, F4RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000646def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000647def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000648 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F4RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000649}
650
651//Doubles
652
653let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
654def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000655 [(set F8RC:$RC, (fsqrt F8RC:$RB))], s_fsqrtt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000656
657let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
658def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000659 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000660def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000661 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000662def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000663 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))], s_fdivt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000664def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000665 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000666
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000667def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000668 [(set F8RC:$RC, (fcopysign F8RC:$RB, F8RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000669def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000670def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000671 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F8RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000672
Andrew Lenharth017c5562006-03-09 17:16:45 +0000673def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000674// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000675def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000676// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000677def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000678// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000679def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000680// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
681}
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000682
683//More CPYS forms:
684let OperandList = (ops F8RC:$RC, F4RC:$RA, F8RC:$RB) in {
685def CPYSTs : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
686 [(set F8RC:$RC, (fcopysign F8RC:$RB, F4RC:$RA))], s_fadd>;
687def CPYSNTs : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
688 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F4RC:$RA)))], s_fadd>;
689}
690let OperandList = (ops F4RC:$RC, F8RC:$RA, F4RC:$RB) in {
691def CPYSSt : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
692 [(set F4RC:$RC, (fcopysign F4RC:$RB, F8RC:$RA))], s_fadd>;
693def CPYSESt : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
694def CPYSNSt : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
695 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F8RC:$RA)))], s_fadd>;
696}
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000697
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000698//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000699let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000700 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000701def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if = zero
702def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if >= zero
703def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if > zero
704def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if <= zero
705def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; // FCMOVE if < zero
706def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000707}
708//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000709let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000710 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000711def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
712def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
713def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
714def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
715def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
716def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000717}
718
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000719//misc FP selects
720//Select double
721def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000722 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000723def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
724 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
725def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
726 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
727
Andrew Lenharth110f2242005-12-12 20:30:09 +0000728def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
729 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000730def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
731 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
732def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
733 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
734
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000735def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000736 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000737def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
738 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
739def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
740 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
741
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000742def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000743 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000744def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
745 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
746def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
747 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
748
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000749def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000750 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000751def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
752 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
753def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
754 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
755
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000756def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000757 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000758def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
759 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
760def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
761 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
762
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000763//Select single
764def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000765 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000766def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
767 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
768def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
769 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
770
Andrew Lenharth110f2242005-12-12 20:30:09 +0000771def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
772 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000773def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
774 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
775def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
776 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
777
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000778def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000779 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000780def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
781 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
782def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
783 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
784
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000785def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000786 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000787def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
788 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
789def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
790 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
791
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000792def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000793 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000794def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
795 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
796def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
797 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
798
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000799def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000800 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000801def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
802 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
803def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
804 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000805
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000806
807
808let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000809def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[], s_ftoi>; //Floating to integer move, S_floating
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000810let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000811def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000812 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))], s_ftoi>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000813let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000814def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[], s_itof>; //Integer to floating move, S_floating
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000815let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000816def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000817 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))], s_itof>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000818
819
820let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000821def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000822 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000823let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000824def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000825 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000826let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000827def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000828 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000829let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
830def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000831 [(set F8RC:$RC, (fextend F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000832let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
833def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000834 [(set F4RC:$RC, (fround F8RC:$RB))], s_fadd>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000835
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000836
837/////////////////////////////////////////////////////////
838//Branching
839/////////////////////////////////////////////////////////
840let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, noResults = 1 in {
841let Ra = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000842def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)], s_ubr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000843
844//Branches, int
Andrew Lenharth9e234852006-01-26 03:24:15 +0000845def BEQ : BForm<0x39, "beq $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000846 [(brcond (seteq GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000847def BGE : BForm<0x3E, "bge $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000848 [(brcond (setge GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000849def BGT : BForm<0x3F, "bgt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000850 [(brcond (setgt GPRC:$RA, 0), bb:$DISP)], s_icbr>;
851def BLBC : BForm<0x38, "blbc $RA,$DISP", [], s_icbr>; //TODO: Low bit clear
Andrew Lenharth9e234852006-01-26 03:24:15 +0000852def BLBS : BForm<0x3C, "blbs $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000853 [(brcond (and GPRC:$RA, 1), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000854def BLE : BForm<0x3B, "ble $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000855 [(brcond (setle GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000856def BLT : BForm<0x3A, "blt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000857 [(brcond (setlt GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000858def BNE : BForm<0x3D, "bne $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000859 [(brcond (setne GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000860
861//Branches, float
862def FBEQ : FBForm<0x31, "fbeq $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000863 [(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000864def FBGE : FBForm<0x36, "fbge $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000865 [(brcond (setge F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000866def FBGT : FBForm<0x37, "fbgt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000867 [(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000868def FBLE : FBForm<0x33, "fble $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000869 [(brcond (setle F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000870def FBLT : FBForm<0x32, "fblt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000871 [(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000872def FBNE : FBForm<0x35, "fbne $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000873 [(brcond (setne F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000874}
875
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000876def : Pat<(brcond GPRC:$RA, bb:$DISP), (BNE GPRC:$RA, bb:$DISP)>;
Andrew Lenharthf7c4bd62006-01-09 19:49:58 +0000877def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
878 (BEQ (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
879def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
880 (BEQ (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000881
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000882def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
883 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000884def : Pat<(brcond (setoeq F8RC:$RA, F8RC:$RB), bb:$DISP),
885 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
886def : Pat<(brcond (setueq F8RC:$RA, F8RC:$RB), bb:$DISP),
887 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
888
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000889def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
890 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000891def : Pat<(brcond (setolt F8RC:$RA, F8RC:$RB), bb:$DISP),
892 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
893def : Pat<(brcond (setult F8RC:$RA, F8RC:$RB), bb:$DISP),
894 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
895
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000896def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
897 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000898def : Pat<(brcond (setole F8RC:$RA, F8RC:$RB), bb:$DISP),
899 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
900def : Pat<(brcond (setule F8RC:$RA, F8RC:$RB), bb:$DISP),
901 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
902
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000903def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
904 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000905def : Pat<(brcond (setogt F8RC:$RA, F8RC:$RB), bb:$DISP),
906 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
907def : Pat<(brcond (setugt F8RC:$RA, F8RC:$RB), bb:$DISP),
908 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
909
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000910def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
911 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000912def : Pat<(brcond (setoge F8RC:$RA, F8RC:$RB), bb:$DISP),
913 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
914def : Pat<(brcond (setuge F8RC:$RA, F8RC:$RB), bb:$DISP),
915 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
916
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000917def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
918 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000919def : Pat<(brcond (setone F8RC:$RA, F8RC:$RB), bb:$DISP),
920 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
921def : Pat<(brcond (setune F8RC:$RA, F8RC:$RB), bb:$DISP),
922 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
923
924
925def : Pat<(brcond (setoeq F8RC:$RA, immFPZ), bb:$DISP),
926 (FBEQ F8RC:$RA,bb:$DISP)>;
927def : Pat<(brcond (setueq F8RC:$RA, immFPZ), bb:$DISP),
928 (FBEQ F8RC:$RA,bb:$DISP)>;
929
930def : Pat<(brcond (setoge F8RC:$RA, immFPZ), bb:$DISP),
931 (FBGE F8RC:$RA,bb:$DISP)>;
932def : Pat<(brcond (setuge F8RC:$RA, immFPZ), bb:$DISP),
933 (FBGE F8RC:$RA,bb:$DISP)>;
934
935def : Pat<(brcond (setogt F8RC:$RA, immFPZ), bb:$DISP),
936 (FBGT F8RC:$RA,bb:$DISP)>;
937def : Pat<(brcond (setugt F8RC:$RA, immFPZ), bb:$DISP),
938 (FBGT F8RC:$RA,bb:$DISP)>;
939
940def : Pat<(brcond (setole F8RC:$RA, immFPZ), bb:$DISP),
941 (FBLE F8RC:$RA,bb:$DISP)>;
942def : Pat<(brcond (setule F8RC:$RA, immFPZ), bb:$DISP),
943 (FBLE F8RC:$RA,bb:$DISP)>;
944
945def : Pat<(brcond (setolt F8RC:$RA, immFPZ), bb:$DISP),
946 (FBLT F8RC:$RA,bb:$DISP)>;
947def : Pat<(brcond (setult F8RC:$RA, immFPZ), bb:$DISP),
948 (FBLT F8RC:$RA,bb:$DISP)>;
949
950def : Pat<(brcond (setone F8RC:$RA, immFPZ), bb:$DISP),
951 (FBNE F8RC:$RA,bb:$DISP)>;
952def : Pat<(brcond (setune F8RC:$RA, immFPZ), bb:$DISP),
953 (FBNE F8RC:$RA,bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000954
955//End Branches
956
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000957//S_floating : IEEE Single
958//T_floating : IEEE Double
959
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000960//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000961//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000962//CALL_PAL Pcd 00 Trap to PALcode
963//ECB Mfc 18.E800 Evict cache block
964//EXCB Mfc 18.0400 Exception barrier
965//FETCH Mfc 18.8000 Prefetch data
966//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000967//LDL_L Mem 2A Load sign-extended longword locked
968//LDQ_L Mem 2B Load quadword locked
969//LDQ_U Mem 0B Load unaligned quadword
970//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000971//STL_C Mem 2E Store longword conditional
972//STQ_C Mem 2F Store quadword conditional
973//STQ_U Mem 0F Store unaligned quadword
974//TRAPB Mfc 18.0000 Trap barrier
975//WH64 Mfc 18.F800 Write hint  64 bytes
976//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000977//MF_FPCR F-P 17.025 Move from FPCR
978//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000979//There are in the Multimedia extentions, so let's not use them yet
980//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
981//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
982//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
983//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
984//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
985//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
986//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
987//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
988//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
989//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
990//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
991//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
992//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
993//CVTLQ F-P 17.010 Convert longword to quadword
994//CVTQL F-P 17.030 Convert quadword to longword
995//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
996//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
997
998
Andrew Lenharth50b37842005-11-22 04:20:06 +0000999//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +00001000
Andrew Lenharth50b37842005-11-22 04:20:06 +00001001def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001002 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +00001003 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001004 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +00001005}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001006def immConst2PartInt : PatLeaf<(imm), [{
1007 //true if imm fits in a LDAH LDA pair with zeroext
1008 uint64_t uval = N->getValue();
1009 int32_t val32 = (int32_t)uval;
1010 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001011 val32 <= IMM_FULLHIGH);
1012// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
1013}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001014
1015def : Pat<(i64 immConst2Part:$imm),
1016 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +00001017
1018def : Pat<(i64 immSExt16:$imm),
1019 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001020
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001021def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001022 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001023def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharth6e707fb2006-01-16 21:41:39 +00001024 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
Andrew Lenharth29418a82006-01-10 19:12:47 +00001025 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001026
1027
Andrew Lenharth50b37842005-11-22 04:20:06 +00001028//TODO: I want to just define these like this!
1029//def : Pat<(i64 0),
1030// (R31)>;
1031//def : Pat<(f64 0.0),
1032// (F31)>;
1033//def : Pat<(f64 -0.0),
1034// (CPYSNT F31, F31)>;
1035//def : Pat<(f32 0.0),
1036// (F31)>;
1037//def : Pat<(f32 -0.0),
1038// (CPYSNS F31, F31)>;
1039
1040//Misc Patterns:
1041
1042def : Pat<(sext_inreg GPRC:$RB, i32),
1043 (ADDLi GPRC:$RB, 0)>;
1044
Andrew Lenharth7f0db912005-11-30 07:19:56 +00001045def : Pat<(fabs F8RC:$RB),
1046 (CPYST F31, F8RC:$RB)>;
1047def : Pat<(fabs F4RC:$RB),
1048 (CPYSS F31, F4RC:$RB)>;
1049def : Pat<(fneg F8RC:$RB),
1050 (CPYSNT F8RC:$RB, F8RC:$RB)>;
1051def : Pat<(fneg F4RC:$RB),
1052 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001053
Andrew Lenharth283f2222006-03-09 17:41:50 +00001054def : Pat<(fcopysign F4RC:$A, (fneg F4RC:$B)),
1055 (CPYSNS F4RC:$B, F4RC:$A)>;
1056def : Pat<(fcopysign F8RC:$A, (fneg F8RC:$B)),
1057 (CPYSNT F8RC:$B, F8RC:$A)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001058def : Pat<(fcopysign F4RC:$A, (fneg F8RC:$B)),
1059 (CPYSNSt F8RC:$B, F4RC:$A)>;
1060def : Pat<(fcopysign F8RC:$A, (fneg F4RC:$B)),
1061 (CPYSNTs F4RC:$B, F8RC:$A)>;
Andrew Lenharth13beebb2006-03-09 14:58:25 +00001062
Andrew Lenharthcd804962005-11-30 16:10:29 +00001063//Yes, signed multiply high is ugly
1064def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
1065 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
1066 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001067
1068//Stupid crazy arithmetic stuff:
1069def : Pat<(mul GPRC:$RA, 5), (S4ADDQ GPRC:$RA, GPRC:$RA)>;
1070def : Pat<(mul GPRC:$RA, 3), (S4SUBQ GPRC:$RA, GPRC:$RA)>;
1071
1072def : Pat<(mul GPRC:$RA, immRem1:$imm),
1073 (ADDQ (SL GPRC:$RA, (nearP2X immRem1:$imm)), GPRC:$RA)>;
1074def : Pat<(mul GPRC:$RA, immRem3:$imm),
1075 (ADDQ (SL GPRC:$RA, (nearP2X immRem3:$imm)), (S4SUBQ GPRC:$RA, GPRC:$RA))>;
1076def : Pat<(mul GPRC:$RA, immRem5:$imm),
1077 (ADDQ (SL GPRC:$RA, (nearP2X immRem5:$imm)), (S4ADDQ GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001078def : Pat<(mul GPRC:$RA, immRem4:$imm),
1079 (S4ADDQ GPRC:$RA, (SL GPRC:$RA, (nearP2X immRem4:$imm)))>;
1080def : Pat<(mul GPRC:$RA, immRemP2:$imm),
1081 (ADDQ (SL GPRC:$RA, (nearP2X immRemP2:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2:$imm)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001082
1083def : Pat<(mul GPRC:$RA, immRem1n:$imm),
1084 (SUBQ (SL GPRC:$RA, (nearP2X immRem1n:$imm)), GPRC:$RA)>;
1085def : Pat<(mul GPRC:$RA, immRem3n:$imm),
1086 (SUBQ (SL GPRC:$RA, (nearP2X immRem3n:$imm)), (S4SUBQ GPRC:$RA, GPRC:$RA))>;
1087def : Pat<(mul GPRC:$RA, immRem5n:$imm),
1088 (SUBQ (SL GPRC:$RA, (nearP2X immRem5n:$imm)), (S4ADDQ GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001089def : Pat<(mul GPRC:$RA, immRemP2n:$imm),
1090 (SUBQ (SL GPRC:$RA, (nearP2X immRemP2n:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2n:$imm)))>;