blob: 3f897a76c825a977ca91de71ab8c6ed0d6681566 [file] [log] [blame]
Misha Brukmanbc9ccf62005-02-04 20:25:52 +00001//===- AlphaInstrInfo.td - The Alpha Instruction Set -------*- tablegen -*-===//
Andrew Lenharth304d0f32005-01-22 23:41:55 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//
11//===----------------------------------------------------------------------===//
12
13include "AlphaInstrFormats.td"
14
Andrew Lenharth4907d222005-10-20 00:28:31 +000015//********************
Andrew Lenharth7f0db912005-11-30 07:19:56 +000016//Custom DAG Nodes
17//********************
18
19def SDTFPUnaryOpUnC : SDTypeProfile<1, 1, [
20 SDTCisFP<1>, SDTCisFP<0>
21]>;
Andrew Lenharth167bc6e2006-01-23 20:59:50 +000022def Alpha_itoft : SDNode<"AlphaISD::ITOFT_", SDTIntToFPOp, []>;
23def Alpha_ftoit : SDNode<"AlphaISD::FTOIT_", SDTFPToIntOp, []>;
24def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
25def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
26def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_" , SDTFPUnaryOp, []>;
27def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
28def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
29def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000030
Andrew Lenharthf2b806a2006-06-12 18:09:24 +000031def retflag : SDNode<"AlphaISD::RET_FLAG", SDTRet,
32 [SDNPHasChain, SDNPOptInFlag]>;
33
Andrew Lenharth79620652005-12-05 20:50:53 +000034// These are target-independent nodes, but have target-specific formats.
35def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
Evan Chengbb7b8442006-08-11 09:03:33 +000036def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,
37 [SDNPHasChain, SDNPOutFlag]>;
38def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,
39 [SDNPHasChain, SDNPOutFlag]>;
Andrew Lenharth79620652005-12-05 20:50:53 +000040
Andrew Lenharth7f0db912005-11-30 07:19:56 +000041//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000042//Paterns for matching
43//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000044def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000045 return getI64Imm(~N->getValue());
46}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000047def negX : SDNodeXForm<imm, [{ //negate
48 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000049}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000050def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000051 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
52}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000053def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
54 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000055}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000056def LL16 : SDNodeXForm<imm, [{ //lda part of constant
57 return getI64Imm(get_lda16(N->getValue()));
58}]>;
59def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
60 return getI64Imm(get_ldah16(N->getValue()));
61}]>;
Chris Lattnerd615ded2006-10-11 05:13:56 +000062def iZAPX : SDNodeXForm<and, [{ // get imm to ZAPi
63 ConstantSDNode *RHS = cast<ConstantSDNode>(N->getOperand(1));
64 return getI64Imm(get_zapImm(SDOperand(), RHS->getValue()));
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000065}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000066def nearP2X : SDNodeXForm<imm, [{
67 return getI64Imm(Log2_64(getNearPower2((uint64_t)N->getValue())));
68}]>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +000069def nearP2RemX : SDNodeXForm<imm, [{
70 uint64_t x = abs(N->getValue() - getNearPower2((uint64_t)N->getValue()));
71 return getI64Imm(Log2_64(x));
72}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000073
74def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
75 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
76}]>;
77def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
78 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
79}], invX>;
80def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
81 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
82}], negX>;
83def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
84 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
85}]>;
86def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
87 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
88}], SExt16>;
Chris Lattnerd615ded2006-10-11 05:13:56 +000089
90def zappat : PatFrag<(ops node:$LHS), (and node:$LHS, imm:$L), [{
91 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
92 uint64_t build = get_zapImm(N->getOperand(0), (uint64_t)RHS->getValue());
93 return build != 0;
94 }
95 return false;
96}]>;
97
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000098def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
99 return true;
100}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000101def immRem1 : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000102 return N->getValue() - getNearPower2((uint64_t)N->getValue()) == 1;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000103}]>;
104def immRem3 : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000105 return N->getValue() - getNearPower2((uint64_t)N->getValue()) == 3;
106}]>;
107def immRem4 : PatLeaf<(imm), [{
108 return N->getValue() - getNearPower2((uint64_t)N->getValue()) == 4;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000109}]>;
110def immRem5 : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000111 return N->getValue() - getNearPower2((uint64_t)N->getValue()) == 5;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000112}]>;
113def immRem1n : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000114 return getNearPower2((uint64_t)N->getValue()) - N->getValue() == 1;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000115}]>;
116def immRem3n : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000117 return getNearPower2((uint64_t)N->getValue()) - N->getValue() == 3;
118}]>;
119def immRem4n : PatLeaf<(imm), [{
120 return getNearPower2((uint64_t)N->getValue()) - N->getValue() == 4;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000121}]>;
122def immRem5n : PatLeaf<(imm), [{
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000123 return getNearPower2((uint64_t)N->getValue()) - N->getValue() == 5;
124}]>;
125def immRemP2n : PatLeaf<(imm), [{
126 return isPowerOf2_64(getNearPower2((uint64_t)N->getValue()) - N->getValue());
127}]>;
128def immRemP2 : PatLeaf<(imm), [{
129 return isPowerOf2_64(N->getValue() - getNearPower2((uint64_t)N->getValue()));
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000130}]>;
131def immUExt8ME : PatLeaf<(imm), [{ //use this imm for mulqi
Andrew Lenharthf87e7932006-04-03 04:19:17 +0000132 int64_t d = abs((int64_t)N->getValue() - (int64_t)getNearPower2((uint64_t)N->getValue()));
133 if (isPowerOf2_64(d)) return false;
134 switch (d) {
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000135 case 1: case 3: case 5: return false;
136 default: return (uint64_t)N->getValue() == (uint8_t)N->getValue();
137 };
138}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000139
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000140def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
141def add4 : PatFrag<(ops node:$op1, node:$op2),
142 (add (shl node:$op1, 2), node:$op2)>;
143def sub4 : PatFrag<(ops node:$op1, node:$op2),
144 (sub (shl node:$op1, 2), node:$op2)>;
145def add8 : PatFrag<(ops node:$op1, node:$op2),
146 (add (shl node:$op1, 3), node:$op2)>;
147def sub8 : PatFrag<(ops node:$op1, node:$op2),
148 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000149
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000150
151//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000152
Andrew Lenharth50b37842005-11-22 04:20:06 +0000153def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000154 [(set GPRC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000155def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000156 [(set F4RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000157def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000158 [(set F8RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000159
Andrew Lenharth017c5562006-03-09 17:16:45 +0000160def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", [], s_pseudo>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000161
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000162let isLoad = 1, hasCtrlDep = 1 in {
163def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000164 [(callseq_start imm:$amt)], s_pseudo>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000165def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000166 [(callseq_end imm:$amt)], s_pseudo>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000167}
Andrew Lenharth017c5562006-03-09 17:16:45 +0000168def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", [], s_pseudo>;
169def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[], s_pseudo>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000170def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth017c5562006-03-09 17:16:45 +0000171 "LSMARKER$$$i$$$j$$$k$$$m:", [], s_pseudo>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000172
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000173
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000174//***********************
175//Real instructions
176//***********************
177
178//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000179
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000180//conditional moves, int
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000181
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000182def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000183 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000184def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000185 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000186def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000187 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000188def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000189 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000190def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000191 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000192def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000193 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000194def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000195 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000196def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000197 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000198
199def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000200 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000201def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000202 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000203def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000204 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000205def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000206 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000207def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000208 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000209def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000210 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000211def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000212 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000213def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000214 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000215
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000216
Andrew Lenharth133d3102006-02-03 03:07:37 +0000217//General pattern for cmov
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000218def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000219 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000220def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
221 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000222
Andrew Lenharth6b634032006-09-20 15:05:49 +0000223//Invert sense when we can for constants:
224def : Pat<(select (seteq GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
225 (CMOVEQi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
226def : Pat<(select (setne GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
227 (CMOVNEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
228def : Pat<(select (setgt GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
229 (CMOVGTi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
230def : Pat<(select (setge GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
231 (CMOVGEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
232def : Pat<(select (setlt GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
233 (CMOVLTi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
234def : Pat<(select (setle GPRC:$RCOND, 0), immUExt8:$RFALSE, GPRC:$RTRUE),
235 (CMOVLEi GPRC:$RTRUE, immUExt8:$RFALSE, GPRC:$RCOND)>;
236
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000237
Andrew Lenharth4907d222005-10-20 00:28:31 +0000238def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000239 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000240def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000241 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000242def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000243 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000244def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000245 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000246def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000247 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000248def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000249 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000250def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000251 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000252def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000253 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000254def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000255 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000256def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000257 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))], s_ilog>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000258def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000259 [(set GPRC:$RC, (ctlz GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000260def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000261 [(set GPRC:$RC, (ctpop GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000262def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000263 [(set GPRC:$RC, (cttz GPRC:$RB))], s_imisc>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000264def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000265 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000266def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000267 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000268def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000269 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000270def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000271 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000272def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000273 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000274
Andrew Lenharth4907d222005-10-20 00:28:31 +0000275//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
276//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
277//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000278//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
279//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
280//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
281//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
282//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
283//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
284//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000285//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000286
Andrew Lenharth4907d222005-10-20 00:28:31 +0000287//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
288//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
289//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
290//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
291//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
292//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
293//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
294//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
295//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
296//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
297//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
298//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
299//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
300//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
301//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
302//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
303//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
304//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
305//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
306//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
307//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
308//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
309//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
310//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
311//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
312//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
313//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
314//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
315//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
316//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000317
Andrew Lenharth4907d222005-10-20 00:28:31 +0000318def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000319 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000320def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000321 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000322def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000323 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000324def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000325 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8ME:$L))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000326def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000327 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000328def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000329 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000330def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000331 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000332def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000333 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000334def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000335 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000336def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000337 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000338def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000339 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000340def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000341 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000342def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000343 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000344def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000345 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000346def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000347 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000348def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000349 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000350def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000351 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000352def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000353 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000354def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000355 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000356def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000357 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8neg:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000358def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000359 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000360def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000361 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8neg:$L))], s_iadd>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000362def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000363 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))], s_ishf>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000364def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000365 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000366def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000367 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000368def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000369 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000370def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000371 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000372def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000373 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000374def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000375 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000376def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000377 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000378def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000379 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000380def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000381 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8neg:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000382def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000383 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000384def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000385 [(set GPRC:$RC, (add GPRC:$RA, immUExt8neg:$L))], s_iadd>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000386def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000387 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))], s_imul>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000388def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000389 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000390def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000391 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000392def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000393 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))], s_ilog>;
Chris Lattner78feeb02006-10-11 04:12:39 +0000394
Chris Lattnerd615ded2006-10-11 05:13:56 +0000395def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC", [], s_ishf>;
396
397// Define the pattern that produces ZAPNOTi.
398def : Pat<(i64 (zappat GPRC:$RA):$imm),
399 (ZAPNOTi GPRC:$RA, (iZAPX GPRC:$imm))>;
400
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000401
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000402//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000403//So this is a waste of what this instruction can do, but it still saves something
404def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000405 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000406def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000407 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000408def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000409 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000410def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000411 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000412def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000413 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000414def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000415 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000416def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000417 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000418def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000419 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000420def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000421 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000422def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000423 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000424def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000425 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000426def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000427 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000428
429//Patterns for unsupported int comparisons
430def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
431def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
432
433def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
434def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
435
436def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
437def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
438
439def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
440def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
441
442def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
443def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
444
445def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
446def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
447
448def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
449def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
450
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000451
Andrew Lenharthf2b806a2006-06-12 18:09:24 +0000452let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000453 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", s_jsr>; //Return from subroutine
Andrew Lenharthf2b806a2006-06-12 18:09:24 +0000454 def RETDAGp : MbrpForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", [(retflag)], s_jsr>; //Return from subroutine
455}
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000456
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000457let isBranch = 1, isTerminator = 1, noResults = 1, isBarrier = 1,
458Ra = 31, disp = 0 in
459def JMP : MbrpForm< 0x1A, 0x00, (ops GPRC:$RS), "jmp $$31,($RS),0",
460 [(brind GPRC:$RS)], s_jsr>; //Jump
461
Evan Cheng2b4ea792005-12-26 09:11:45 +0000462let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000463 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000464 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000465 F0, F1,
466 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000467 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000468 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", [], s_jsr>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000469}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000470let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000471 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
472 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
473 F0, F1,
474 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
475 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000476 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0", s_jsr>; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000477}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000478
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000479let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
480 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000481 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0", s_jsr>; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000482
Andrew Lenharth53d89702005-12-25 01:34:27 +0000483
Andrew Lenharth017c5562006-03-09 17:16:45 +0000484def 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 +0000485
Andrew Lenharthb6718602005-12-24 07:34:33 +0000486let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
487def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000488 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000489def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000490 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000491def LDL : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000492 [(set GPRC:$RA, (sextloadi32 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000493def LDLr : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000494 [(set GPRC:$RA, (sextloadi32 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000495def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000496 [(set GPRC:$RA, (zextloadi8 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000497def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000498 [(set GPRC:$RA, (zextloadi8 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000499def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
Evan Cheng466685d2006-10-09 20:57:25 +0000500 [(set GPRC:$RA, (zextloadi16 (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000501def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
Evan Cheng466685d2006-10-09 20:57:25 +0000502 [(set GPRC:$RA, (zextloadi16 (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000503def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000504 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000505def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000506 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000507def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000508 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000509def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000510 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000511def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000512 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000513def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000514 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000515def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000516 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000517def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000518 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000519
520//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000521def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000522 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_lda>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000523def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000524 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000525def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000526 [], s_lda>; //Load address high
Andrew Lenharthb6718602005-12-24 07:34:33 +0000527def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000528 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000529}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000530
Andrew Lenharthb6718602005-12-24 07:34:33 +0000531let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
532def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000533 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000534def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000535 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000536def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000537 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000538def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000539 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000540}
541let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
542def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000543 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000544def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000545 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000546def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000547 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000548def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000549 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000550}
551
Andrew Lenharthc687b482005-12-24 08:29:32 +0000552
553//constpool rels
554def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
555 (LDQr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000556def : Pat<(i64 (sextloadi32 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000557 (LDLr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000558def : Pat<(i64 (zextloadi8 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000559 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000560def : Pat<(i64 (zextloadi16 (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
Andrew Lenharthc687b482005-12-24 08:29:32 +0000561 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
562def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
563 (LDAr tconstpool:$DISP, GPRC:$RB)>;
564def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
565 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
566def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
567 (LDSr tconstpool:$DISP, GPRC:$RB)>;
568def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
569 (LDTr tconstpool:$DISP, GPRC:$RB)>;
570
Andrew Lenharthea4f9d52006-09-18 18:01:03 +0000571//jumptable rels
572def : Pat<(i64 (Alpha_gprelhi tjumptable:$DISP, GPRC:$RB)),
573 (LDAHr tjumptable:$DISP, GPRC:$RB)>;
574def : Pat<(i64 (Alpha_gprello tjumptable:$DISP, GPRC:$RB)),
575 (LDAr tjumptable:$DISP, GPRC:$RB)>;
576
Andrew Lenharthc687b482005-12-24 08:29:32 +0000577
Andrew Lenharthb6718602005-12-24 07:34:33 +0000578//misc ext patterns
Evan Cheng466685d2006-10-09 20:57:25 +0000579def : Pat<(i64 (extloadi8 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000580 (LDBU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000581def : Pat<(i64 (extloadi16 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000582 (LDWU immSExt16:$DISP, GPRC:$RB)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000583def : Pat<(i64 (extloadi32 (add GPRC:$RB, immSExt16:$DISP))),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000584 (LDL immSExt16:$DISP, GPRC:$RB)>;
585
586//0 disp patterns
587def : Pat<(i64 (load GPRC:$addr)),
588 (LDQ 0, GPRC:$addr)>;
589def : Pat<(f64 (load GPRC:$addr)),
590 (LDT 0, GPRC:$addr)>;
591def : Pat<(f32 (load GPRC:$addr)),
592 (LDS 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000593def : Pat<(i64 (sextloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000594 (LDL 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000595def : Pat<(i64 (zextloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000596 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000597def : Pat<(i64 (zextloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000598 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000599def : Pat<(i64 (extloadi8 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000600 (LDBU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000601def : Pat<(i64 (extloadi16 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000602 (LDWU 0, GPRC:$addr)>;
Evan Cheng466685d2006-10-09 20:57:25 +0000603def : Pat<(i64 (extloadi32 GPRC:$addr)),
Andrew Lenharthb6718602005-12-24 07:34:33 +0000604 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000605
Andrew Lenharthc687b482005-12-24 08:29:32 +0000606def : Pat<(store GPRC:$DATA, GPRC:$addr),
607 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
608def : Pat<(store F8RC:$DATA, GPRC:$addr),
609 (STT F8RC:$DATA, 0, GPRC:$addr)>;
610def : Pat<(store F4RC:$DATA, GPRC:$addr),
611 (STS F4RC:$DATA, 0, GPRC:$addr)>;
612def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i32),
613 (STL GPRC:$DATA, 0, GPRC:$addr)>;
614def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i16),
615 (STW GPRC:$DATA, 0, GPRC:$addr)>;
616def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i8),
617 (STB GPRC:$DATA, 0, GPRC:$addr)>;
618
Andrew Lenharth4e629512005-12-24 05:36:33 +0000619
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000620//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000621let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000622def LDAg : MForm<0x08, 0, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
623def LDAHg : MForm<0x09, 0, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000624}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000625
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000626//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000627let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000628def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000629 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))], s_ild>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000630def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
631 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000632
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000633
Andrew Lenharth017c5562006-03-09 17:16:45 +0000634def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA", s_rpcc>; //Read process cycle counter
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000635
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000636//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000637
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000638//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000639
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000640let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
641def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000642 [(set F4RC:$RC, (fsqrt F4RC:$RB))], s_fsqrts>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000643
644let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
645def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000646 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000647def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000648 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000649def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000650 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))], s_fdivs>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000651def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000652 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000653
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000654def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000655 [(set F4RC:$RC, (fcopysign F4RC:$RB, F4RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000656def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000657def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000658 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F4RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000659}
660
661//Doubles
662
663let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
664def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000665 [(set F8RC:$RC, (fsqrt F8RC:$RB))], s_fsqrtt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000666
667let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
668def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000669 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000670def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000671 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000672def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000673 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))], s_fdivt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000674def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000675 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000676
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000677def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000678 [(set F8RC:$RC, (fcopysign F8RC:$RB, F8RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000679def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000680def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000681 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F8RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000682
Andrew Lenharth017c5562006-03-09 17:16:45 +0000683def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000684// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000685def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000686// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000687def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000688// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000689def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000690// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
691}
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000692
693//More CPYS forms:
694let OperandList = (ops F8RC:$RC, F4RC:$RA, F8RC:$RB) in {
695def CPYSTs : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
696 [(set F8RC:$RC, (fcopysign F8RC:$RB, F4RC:$RA))], s_fadd>;
697def CPYSNTs : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
698 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F4RC:$RA)))], s_fadd>;
699}
700let OperandList = (ops F4RC:$RC, F8RC:$RA, F4RC:$RB) in {
701def CPYSSt : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
702 [(set F4RC:$RC, (fcopysign F4RC:$RB, F8RC:$RA))], s_fadd>;
703def CPYSESt : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
704def CPYSNSt : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
705 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F8RC:$RA)))], s_fadd>;
706}
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000707
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000708//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000709let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000710 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000711def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if = zero
712def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if >= zero
713def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if > zero
714def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if <= zero
715def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; // FCMOVE if < zero
716def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000717}
718//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000719let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000720 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000721def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
722def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
723def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
724def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
725def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
726def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000727}
728
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000729//misc FP selects
730//Select double
731def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000732 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000733def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
734 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
735def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
736 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
737
Andrew Lenharth110f2242005-12-12 20:30:09 +0000738def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
739 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000740def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
741 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
742def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
743 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
744
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000745def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000746 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000747def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
748 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
749def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
750 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
751
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000752def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000753 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000754def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
755 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
756def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
757 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
758
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000759def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000760 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000761def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
762 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
763def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
764 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
765
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000766def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000767 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000768def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
769 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
770def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
771 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
772
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000773//Select single
774def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000775 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000776def : Pat<(select (setoeq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
777 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
778def : Pat<(select (setueq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
779 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
780
Andrew Lenharth110f2242005-12-12 20:30:09 +0000781def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
782 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000783def : Pat<(select (setone F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
784 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
785def : Pat<(select (setune F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
786 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
787
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000788def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000789 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000790def : Pat<(select (setogt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
791 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
792def : Pat<(select (setugt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
793 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
794
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000795def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000796 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000797def : Pat<(select (setoge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
798 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
799def : Pat<(select (setuge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
800 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
801
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000802def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000803 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000804def : Pat<(select (setolt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
805 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
806def : Pat<(select (setult F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
807 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
808
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000809def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000810 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000811def : Pat<(select (setole F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
812 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
813def : Pat<(select (setule F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
814 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000815
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000816
817
818let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000819def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[], s_ftoi>; //Floating to integer move, S_floating
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000820let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000821def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000822 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))], s_ftoi>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000823let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000824def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[], s_itof>; //Integer to floating move, S_floating
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000825let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000826def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000827 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))], s_itof>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000828
829
830let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000831def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000832 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000833let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000834def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000835 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000836let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000837def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000838 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000839let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
840def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000841 [(set F8RC:$RC, (fextend F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000842let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
843def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000844 [(set F4RC:$RC, (fround F8RC:$RB))], s_fadd>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000845
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000846
847/////////////////////////////////////////////////////////
848//Branching
849/////////////////////////////////////////////////////////
850let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, noResults = 1 in {
851let Ra = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000852def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)], s_ubr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000853
854//Branches, int
Andrew Lenharth9e234852006-01-26 03:24:15 +0000855def BEQ : BForm<0x39, "beq $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000856 [(brcond (seteq GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000857def BGE : BForm<0x3E, "bge $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000858 [(brcond (setge GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000859def BGT : BForm<0x3F, "bgt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000860 [(brcond (setgt GPRC:$RA, 0), bb:$DISP)], s_icbr>;
861def BLBC : BForm<0x38, "blbc $RA,$DISP", [], s_icbr>; //TODO: Low bit clear
Andrew Lenharth9e234852006-01-26 03:24:15 +0000862def BLBS : BForm<0x3C, "blbs $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000863 [(brcond (and GPRC:$RA, 1), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000864def BLE : BForm<0x3B, "ble $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000865 [(brcond (setle GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000866def BLT : BForm<0x3A, "blt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000867 [(brcond (setlt GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000868def BNE : BForm<0x3D, "bne $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000869 [(brcond (setne GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000870
871//Branches, float
872def FBEQ : FBForm<0x31, "fbeq $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000873 [(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000874def FBGE : FBForm<0x36, "fbge $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000875 [(brcond (setge F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000876def FBGT : FBForm<0x37, "fbgt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000877 [(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000878def FBLE : FBForm<0x33, "fble $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000879 [(brcond (setle F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000880def FBLT : FBForm<0x32, "fblt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000881 [(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000882def FBNE : FBForm<0x35, "fbne $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000883 [(brcond (setne F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000884}
885
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000886def : Pat<(brcond GPRC:$RA, bb:$DISP), (BNE GPRC:$RA, bb:$DISP)>;
Andrew Lenharthf7c4bd62006-01-09 19:49:58 +0000887def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
888 (BEQ (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
889def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
890 (BEQ (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000891
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000892def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
893 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000894def : Pat<(brcond (setoeq F8RC:$RA, F8RC:$RB), bb:$DISP),
895 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
896def : Pat<(brcond (setueq F8RC:$RA, F8RC:$RB), bb:$DISP),
897 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
898
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000899def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
900 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000901def : Pat<(brcond (setolt F8RC:$RA, F8RC:$RB), bb:$DISP),
902 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
903def : Pat<(brcond (setult F8RC:$RA, F8RC:$RB), bb:$DISP),
904 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
905
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000906def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
907 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000908def : Pat<(brcond (setole F8RC:$RA, F8RC:$RB), bb:$DISP),
909 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
910def : Pat<(brcond (setule F8RC:$RA, F8RC:$RB), bb:$DISP),
911 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
912
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000913def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
914 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000915def : Pat<(brcond (setogt F8RC:$RA, F8RC:$RB), bb:$DISP),
916 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
917def : Pat<(brcond (setugt F8RC:$RA, F8RC:$RB), bb:$DISP),
918 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
919
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000920def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
921 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000922def : Pat<(brcond (setoge F8RC:$RA, F8RC:$RB), bb:$DISP),
923 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
924def : Pat<(brcond (setuge F8RC:$RA, F8RC:$RB), bb:$DISP),
925 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
926
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000927def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
928 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
Andrew Lenhartha5cc38b2006-06-04 00:25:51 +0000929def : Pat<(brcond (setone F8RC:$RA, F8RC:$RB), bb:$DISP),
930 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
931def : Pat<(brcond (setune F8RC:$RA, F8RC:$RB), bb:$DISP),
932 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
933
934
935def : Pat<(brcond (setoeq F8RC:$RA, immFPZ), bb:$DISP),
936 (FBEQ F8RC:$RA,bb:$DISP)>;
937def : Pat<(brcond (setueq F8RC:$RA, immFPZ), bb:$DISP),
938 (FBEQ F8RC:$RA,bb:$DISP)>;
939
940def : Pat<(brcond (setoge F8RC:$RA, immFPZ), bb:$DISP),
941 (FBGE F8RC:$RA,bb:$DISP)>;
942def : Pat<(brcond (setuge F8RC:$RA, immFPZ), bb:$DISP),
943 (FBGE F8RC:$RA,bb:$DISP)>;
944
945def : Pat<(brcond (setogt F8RC:$RA, immFPZ), bb:$DISP),
946 (FBGT F8RC:$RA,bb:$DISP)>;
947def : Pat<(brcond (setugt F8RC:$RA, immFPZ), bb:$DISP),
948 (FBGT F8RC:$RA,bb:$DISP)>;
949
950def : Pat<(brcond (setole F8RC:$RA, immFPZ), bb:$DISP),
951 (FBLE F8RC:$RA,bb:$DISP)>;
952def : Pat<(brcond (setule F8RC:$RA, immFPZ), bb:$DISP),
953 (FBLE F8RC:$RA,bb:$DISP)>;
954
955def : Pat<(brcond (setolt F8RC:$RA, immFPZ), bb:$DISP),
956 (FBLT F8RC:$RA,bb:$DISP)>;
957def : Pat<(brcond (setult F8RC:$RA, immFPZ), bb:$DISP),
958 (FBLT F8RC:$RA,bb:$DISP)>;
959
960def : Pat<(brcond (setone F8RC:$RA, immFPZ), bb:$DISP),
961 (FBNE F8RC:$RA,bb:$DISP)>;
962def : Pat<(brcond (setune F8RC:$RA, immFPZ), bb:$DISP),
963 (FBNE F8RC:$RA,bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000964
965//End Branches
966
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000967//S_floating : IEEE Single
968//T_floating : IEEE Double
969
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000970//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000971//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000972//CALL_PAL Pcd 00 Trap to PALcode
973//ECB Mfc 18.E800 Evict cache block
974//EXCB Mfc 18.0400 Exception barrier
975//FETCH Mfc 18.8000 Prefetch data
976//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000977//LDL_L Mem 2A Load sign-extended longword locked
978//LDQ_L Mem 2B Load quadword locked
979//LDQ_U Mem 0B Load unaligned quadword
980//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000981//STL_C Mem 2E Store longword conditional
982//STQ_C Mem 2F Store quadword conditional
983//STQ_U Mem 0F Store unaligned quadword
984//TRAPB Mfc 18.0000 Trap barrier
985//WH64 Mfc 18.F800 Write hint  64 bytes
986//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000987//MF_FPCR F-P 17.025 Move from FPCR
988//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000989//There are in the Multimedia extentions, so let's not use them yet
990//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
991//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
992//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
993//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
994//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
995//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
996//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
997//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
998//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
999//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
1000//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
1001//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
1002//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
1003//CVTLQ F-P 17.010 Convert longword to quadword
1004//CVTQL F-P 17.030 Convert quadword to longword
1005//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
1006//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
1007
1008
Andrew Lenharth50b37842005-11-22 04:20:06 +00001009//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +00001010
Andrew Lenharth50b37842005-11-22 04:20:06 +00001011def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001012 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +00001013 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001014 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +00001015}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001016def immConst2PartInt : PatLeaf<(imm), [{
1017 //true if imm fits in a LDAH LDA pair with zeroext
1018 uint64_t uval = N->getValue();
1019 int32_t val32 = (int32_t)uval;
1020 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001021 val32 <= IMM_FULLHIGH);
1022// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
1023}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001024
1025def : Pat<(i64 immConst2Part:$imm),
1026 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +00001027
1028def : Pat<(i64 immSExt16:$imm),
1029 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +00001030
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001031def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +00001032 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001033def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharth6e707fb2006-01-16 21:41:39 +00001034 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
Andrew Lenharth29418a82006-01-10 19:12:47 +00001035 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +00001036
1037
Andrew Lenharth50b37842005-11-22 04:20:06 +00001038//TODO: I want to just define these like this!
1039//def : Pat<(i64 0),
1040// (R31)>;
1041//def : Pat<(f64 0.0),
1042// (F31)>;
1043//def : Pat<(f64 -0.0),
1044// (CPYSNT F31, F31)>;
1045//def : Pat<(f32 0.0),
1046// (F31)>;
1047//def : Pat<(f32 -0.0),
1048// (CPYSNS F31, F31)>;
1049
1050//Misc Patterns:
1051
1052def : Pat<(sext_inreg GPRC:$RB, i32),
1053 (ADDLi GPRC:$RB, 0)>;
1054
Andrew Lenharth7f0db912005-11-30 07:19:56 +00001055def : Pat<(fabs F8RC:$RB),
1056 (CPYST F31, F8RC:$RB)>;
1057def : Pat<(fabs F4RC:$RB),
1058 (CPYSS F31, F4RC:$RB)>;
1059def : Pat<(fneg F8RC:$RB),
1060 (CPYSNT F8RC:$RB, F8RC:$RB)>;
1061def : Pat<(fneg F4RC:$RB),
1062 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001063
Andrew Lenharth283f2222006-03-09 17:41:50 +00001064def : Pat<(fcopysign F4RC:$A, (fneg F4RC:$B)),
1065 (CPYSNS F4RC:$B, F4RC:$A)>;
1066def : Pat<(fcopysign F8RC:$A, (fneg F8RC:$B)),
1067 (CPYSNT F8RC:$B, F8RC:$A)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +00001068def : Pat<(fcopysign F4RC:$A, (fneg F8RC:$B)),
1069 (CPYSNSt F8RC:$B, F4RC:$A)>;
1070def : Pat<(fcopysign F8RC:$A, (fneg F4RC:$B)),
1071 (CPYSNTs F4RC:$B, F8RC:$A)>;
Andrew Lenharth13beebb2006-03-09 14:58:25 +00001072
Andrew Lenharthcd804962005-11-30 16:10:29 +00001073//Yes, signed multiply high is ugly
1074def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
1075 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
1076 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001077
1078//Stupid crazy arithmetic stuff:
1079def : Pat<(mul GPRC:$RA, 5), (S4ADDQ GPRC:$RA, GPRC:$RA)>;
1080def : Pat<(mul GPRC:$RA, 3), (S4SUBQ GPRC:$RA, GPRC:$RA)>;
1081
1082def : Pat<(mul GPRC:$RA, immRem1:$imm),
1083 (ADDQ (SL GPRC:$RA, (nearP2X immRem1:$imm)), GPRC:$RA)>;
1084def : Pat<(mul GPRC:$RA, immRem3:$imm),
1085 (ADDQ (SL GPRC:$RA, (nearP2X immRem3:$imm)), (S4SUBQ GPRC:$RA, GPRC:$RA))>;
1086def : Pat<(mul GPRC:$RA, immRem5:$imm),
1087 (ADDQ (SL GPRC:$RA, (nearP2X immRem5:$imm)), (S4ADDQ GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001088def : Pat<(mul GPRC:$RA, immRem4:$imm),
1089 (S4ADDQ GPRC:$RA, (SL GPRC:$RA, (nearP2X immRem4:$imm)))>;
1090def : Pat<(mul GPRC:$RA, immRemP2:$imm),
1091 (ADDQ (SL GPRC:$RA, (nearP2X immRemP2:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2:$imm)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +00001092
1093def : Pat<(mul GPRC:$RA, immRem1n:$imm),
1094 (SUBQ (SL GPRC:$RA, (nearP2X immRem1n:$imm)), GPRC:$RA)>;
1095def : Pat<(mul GPRC:$RA, immRem3n:$imm),
1096 (SUBQ (SL GPRC:$RA, (nearP2X immRem3n:$imm)), (S4SUBQ GPRC:$RA, GPRC:$RA))>;
1097def : Pat<(mul GPRC:$RA, immRem5n:$imm),
1098 (SUBQ (SL GPRC:$RA, (nearP2X immRem5n:$imm)), (S4ADDQ GPRC:$RA, GPRC:$RA))>;
Andrew Lenharthf87e7932006-04-03 04:19:17 +00001099def : Pat<(mul GPRC:$RA, immRemP2n:$imm),
1100 (SUBQ (SL GPRC:$RA, (nearP2X immRemP2n:$imm)), (SLi GPRC:$RA, (nearP2RemX immRemP2n:$imm)))>;