blob: dce3c0beb72a607bd886b9c9b7c2831a4258080b [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 Lenharth79620652005-12-05 20:50:53 +000031// These are target-independent nodes, but have target-specific formats.
32def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
33def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
34def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,[SDNPHasChain]>;
35
Andrew Lenharth7f0db912005-11-30 07:19:56 +000036//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000037//Paterns for matching
38//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000039def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000040 return getI64Imm(~N->getValue());
41}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000042def negX : SDNodeXForm<imm, [{ //negate
43 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000044}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000045def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000046 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
47}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000048def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
49 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000050}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000051def LL16 : SDNodeXForm<imm, [{ //lda part of constant
52 return getI64Imm(get_lda16(N->getValue()));
53}]>;
54def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
55 return getI64Imm(get_ldah16(N->getValue()));
56}]>;
57def iZAPX : SDNodeXForm<imm, [{ // get imm to ZAPi
58 return getI64Imm(get_zapImm((uint64_t)N->getValue()));
59}]>;
60
61def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
62 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
63}]>;
64def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
65 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
66}], invX>;
67def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
68 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
69}], negX>;
70def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
71 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
72}]>;
73def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
74 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
75}], SExt16>;
76def immZAP : PatLeaf<(imm), [{ //imm is good for zapi
77 uint64_t build = get_zapImm((uint64_t)N->getValue());
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000078 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +000079}], iZAPX>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000080def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
81 return true;
82}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000083
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000084def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
85def add4 : PatFrag<(ops node:$op1, node:$op2),
86 (add (shl node:$op1, 2), node:$op2)>;
87def sub4 : PatFrag<(ops node:$op1, node:$op2),
88 (sub (shl node:$op1, 2), node:$op2)>;
89def add8 : PatFrag<(ops node:$op1, node:$op2),
90 (add (shl node:$op1, 3), node:$op2)>;
91def sub8 : PatFrag<(ops node:$op1, node:$op2),
92 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +000093
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000094
95//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +000096
Andrew Lenharth50b37842005-11-22 04:20:06 +000097def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
98 [(set GPRC:$RA, (undef))]>;
99def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
100 [(set F4RC:$RA, (undef))]>;
101def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
102 [(set F8RC:$RA, (undef))]>;
103
104def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", []>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000105
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000106let isLoad = 1, hasCtrlDep = 1 in {
107def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000108 [(callseq_start imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000109def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000110 [(callseq_end imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000111}
Andrew Lenharth424ba782005-12-27 03:53:58 +0000112def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", []>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000113def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[]>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000114def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000115 "LSMARKER$$$i$$$j$$$k$$$m:", []>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000116
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000117
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000118//***********************
119//Real instructions
120//***********************
121
122//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000123
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000124//conditional moves, int
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000125
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000126def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000127 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000128def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000129 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000130def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000131 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000132def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000133 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000134def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000135 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000136def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Chris Lattnerc7e18522006-01-29 03:47:30 +0000137 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000138def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000139 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000140def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000141 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000142
143def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
144 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
145def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
146 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
147def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
148 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
149def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
150 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
151def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
152 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
153def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
154 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
155def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
156 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
157def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
158 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
159
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000160
Andrew Lenharth133d3102006-02-03 03:07:37 +0000161//General pattern for cmov
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000162def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000163 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000164def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
165 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000166
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000167
Andrew Lenharth4907d222005-10-20 00:28:31 +0000168def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000169 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000170def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000171 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000172def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
173 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))]>;
174def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
175 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000176def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
177 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))]>;
178def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
179 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))]>;
180def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
181 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000182def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
183 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000184def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
185 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))]>;
186def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
187 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000188def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000189 [(set GPRC:$RC, (ctlz GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000190def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000191 [(set GPRC:$RC, (ctpop GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000192def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000193 [(set GPRC:$RC, (cttz GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000194def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
195 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000196def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
197 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000198def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000199 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000200def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000201 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000202def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000203 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000204
Andrew Lenharth4907d222005-10-20 00:28:31 +0000205//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
206//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
207//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000208//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
209//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
210//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
211//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
212//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
213//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
214//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000215//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000216
Andrew Lenharth4907d222005-10-20 00:28:31 +0000217//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
218//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
219//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
220//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
221//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
222//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
223//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
224//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
225//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
226//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
227//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
228//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
229//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
230//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
231//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
232//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
233//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
234//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
235//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
236//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
237//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
238//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
239//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
240//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
241//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
242//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
243//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
244//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
245//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
246//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000247
Andrew Lenharth4907d222005-10-20 00:28:31 +0000248def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000249 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000250def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000251 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000252def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
253 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))]>;
254def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
255 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8:$L))]>;
256def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
257 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000258def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
259 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000260def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000261 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000262def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000263 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000264def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000265 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000266def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000267 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000268def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000269 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000270def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000271 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000272def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000273 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000274def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000275 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000276def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000277 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000278def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000279 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000280def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000281 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000282def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000283 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000284def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000285 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000286def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000287 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8neg:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000288def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000289 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000290def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000291 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8neg:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000292def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000293 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000294def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000295 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000296def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
297 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))]>;
298def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
299 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))]>;
300def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
301 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))]>;
302def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
303 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))]>;
304def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
305 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))]>;
306def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
307 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))]>;
308def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000309 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000310def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000311 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8neg:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000312def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
313 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))]>;
314def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000315 [(set GPRC:$RC, (add GPRC:$RA, immUExt8neg:$L))]>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000316def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
317 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))]>;
318def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
319 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000320def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
321 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))]>;
322def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
323 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000324//FIXME: what to do about zap? the cases it catches are very complex
Andrew Lenharth4907d222005-10-20 00:28:31 +0000325def ZAP : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000326//ZAPi is useless give ZAPNOTi
Andrew Lenharth4907d222005-10-20 00:28:31 +0000327def ZAPi : OFormL<0x12, 0x30, "zap $RA,$L,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000328//FIXME: what to do about zapnot? see ZAP :)
Andrew Lenharth4907d222005-10-20 00:28:31 +0000329def ZAPNOT : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", []>; //Zero bytes not
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000330def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
331 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000332
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000333//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000334//So this is a waste of what this instruction can do, but it still saves something
335def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
336 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>;
337def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
338 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>;
339def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
340 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>;
341def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
342 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>;
343def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
344 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>;
345def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
346 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))]>;
347def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
348 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
349def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
350 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
351def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
352 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))]>;
353def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
354 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))]>;
355def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000356 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000357def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000358 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000359
360//Patterns for unsupported int comparisons
361def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
362def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
363
364def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
365def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
366
367def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
368def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
369
370def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
371def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
372
373def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
374def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
375
376def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
377def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
378
379def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
380def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
381
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000382
Evan Cheng2b4ea792005-12-26 09:11:45 +0000383let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
Andrew Lenharth4907d222005-10-20 00:28:31 +0000384 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1">; //Return from subroutine
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000385
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000386def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP">; //Jump
Evan Cheng2b4ea792005-12-26 09:11:45 +0000387let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000388 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000389 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000390 F0, F1,
391 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000392 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000393 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", []>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000394}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000395let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000396 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
397 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
398 F0, F1,
399 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
400 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000401 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0">; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000402}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000403
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000404let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
405 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenhartheececba2005-12-25 17:36:48 +0000406 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0">; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000407
Andrew Lenharth53d89702005-12-25 01:34:27 +0000408
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000409def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP">; //Jump to subroutine return
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000410
Andrew Lenharthb6718602005-12-24 07:34:33 +0000411let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
412def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
413 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
414def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
415 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000416def LDL : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)",
Andrew Lenharthb6718602005-12-24 07:34:33 +0000417 [(set GPRC:$RA, (sextload (add GPRC:$RB, immSExt16:$DISP), i32))]>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000418def LDLr : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharthb6718602005-12-24 07:34:33 +0000419 [(set GPRC:$RA, (sextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32))]>;
420def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
421 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i8))]>;
422def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
423 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8))]>;
424def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
425 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i16))]>;
426def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
427 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16))]>;
428def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
429 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)]>;
430def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
431 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)]>;
432def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
433 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)]>;
434def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
435 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)]>;
436def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
437 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)]>;
438def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
439 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)]>;
440def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
441 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
442def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
443 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000444
445//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000446def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
447 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
448def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
449 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>; //Load address
450def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
451 []>; //Load address high
452def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
453 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))]>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000454}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000455
Andrew Lenharthb6718602005-12-24 07:34:33 +0000456let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
457def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
458 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
459def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
460 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
461def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
462 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
463def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
464 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
465}
466let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
467def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
468 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
469def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
470 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
471def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
472 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
473def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
474 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
475}
476
Andrew Lenharthc687b482005-12-24 08:29:32 +0000477
478//constpool rels
479def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
480 (LDQr tconstpool:$DISP, GPRC:$RB)>;
481def : Pat<(i64 (sextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i32)),
482 (LDLr tconstpool:$DISP, GPRC:$RB)>;
483def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i8)),
484 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
485def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i16)),
486 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
487def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
488 (LDAr tconstpool:$DISP, GPRC:$RB)>;
489def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
490 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
491def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
492 (LDSr tconstpool:$DISP, GPRC:$RB)>;
493def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
494 (LDTr tconstpool:$DISP, GPRC:$RB)>;
495
496
Andrew Lenharthb6718602005-12-24 07:34:33 +0000497//misc ext patterns
498def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i8)),
499 (LDBU immSExt16:$DISP, GPRC:$RB)>;
500def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i16)),
501 (LDWU immSExt16:$DISP, GPRC:$RB)>;
502def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i32)),
503 (LDL immSExt16:$DISP, GPRC:$RB)>;
504
505//0 disp patterns
506def : Pat<(i64 (load GPRC:$addr)),
507 (LDQ 0, GPRC:$addr)>;
508def : Pat<(f64 (load GPRC:$addr)),
509 (LDT 0, GPRC:$addr)>;
510def : Pat<(f32 (load GPRC:$addr)),
511 (LDS 0, GPRC:$addr)>;
512def : Pat<(i64 (sextload GPRC:$addr, i32)),
513 (LDL 0, GPRC:$addr)>;
514def : Pat<(i64 (zextload GPRC:$addr, i16)),
515 (LDWU 0, GPRC:$addr)>;
516def : Pat<(i64 (zextload GPRC:$addr, i8)),
517 (LDBU 0, GPRC:$addr)>;
518def : Pat<(i64 (extload GPRC:$addr, i8)),
519 (LDBU 0, GPRC:$addr)>;
520def : Pat<(i64 (extload GPRC:$addr, i16)),
521 (LDWU 0, GPRC:$addr)>;
522def : Pat<(i64 (extload GPRC:$addr, i32)),
523 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000524
Andrew Lenharthc687b482005-12-24 08:29:32 +0000525def : Pat<(store GPRC:$DATA, GPRC:$addr),
526 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
527def : Pat<(store F8RC:$DATA, GPRC:$addr),
528 (STT F8RC:$DATA, 0, GPRC:$addr)>;
529def : Pat<(store F4RC:$DATA, GPRC:$addr),
530 (STS F4RC:$DATA, 0, GPRC:$addr)>;
531def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i32),
532 (STL GPRC:$DATA, 0, GPRC:$addr)>;
533def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i16),
534 (STW GPRC:$DATA, 0, GPRC:$addr)>;
535def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i8),
536 (STB GPRC:$DATA, 0, GPRC:$addr)>;
537
Andrew Lenharth4e629512005-12-24 05:36:33 +0000538
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000539//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000540let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
Andrew Lenharthcd1544e2006-01-26 03:22:07 +0000541def LDAg : MForm<0x08, 0, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", []>; //Load address
542def LDAHg : MForm<0x09, 0, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", []>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000543}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000544
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000545//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000546let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000547def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
548 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000549def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
550 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000551
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000552
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000553def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA">; //Read process cycle counter
554
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000555//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000556
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000557//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000558
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000559let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
560def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
561 [(set F4RC:$RC, (fsqrt F4RC:$RB))]>;
562
563let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
564def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
565 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))]>;
566def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
567 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))]>;
568def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
569 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))]>;
570def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
571 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))]>;
572
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000573def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
574 [(set F4RC:$RC, (fcopysign F4RC:$RA, F4RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000575def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000576//FIXME: This might be legalized in the oposite manner
577def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
578 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RA, F4RC:$RB)))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000579}
580
581//Doubles
582
583let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
584def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
585 [(set F8RC:$RC, (fsqrt F8RC:$RB))]>;
586
587let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
588def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
589 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))]>;
590def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
591 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))]>;
592def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
593 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))]>;
594def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
595 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))]>;
596
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000597def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
598 [(set F8RC:$RC, (fcopysign F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000599def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000600//FIXME: This might be legalized in the oposite manner
601def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
602 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RA, F8RC:$RB)))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000603
604def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", []>;
605// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
606def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", []>;
607// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
608def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", []>;
609// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
610def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", []>;
611// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
612}
613//TODO: Add lots more FP patterns
614
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000615//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000616let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000617 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000618def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if = zero
619def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if >= zero
620def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if > zero
621def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if <= zero
622def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[]>; // FCMOVE if < zero
623def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000624}
625//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000626let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000627 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000628def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", []>;
629def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", []>;
630def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", []>;
631def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", []>;
632def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", []>;
633def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", []>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000634}
635
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000636//misc FP selects
637//Select double
638def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000639 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000640def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
641 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000642def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000643 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000644def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000645 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000646def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000647 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000648def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000649 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000650//Select single
651def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000652 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000653def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
654 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000655def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000656 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000657def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000658 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000659def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000660 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000661def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000662 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000663
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000664
665
666let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
667def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[]>; //Floating to integer move, S_floating
668let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000669def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
670 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))]>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000671let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
672def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[]>; //Integer to floating move, S_floating
673let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000674def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
675 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))]>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000676
677
678let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000679def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
680 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000681let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000682def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
683 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000684let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000685def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
686 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000687let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
688def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
689 [(set F8RC:$RC, (fextend F4RC:$RB))]>;
690let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
691def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
692 [(set F4RC:$RC, (fround F8RC:$RB))]>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000693
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000694
695/////////////////////////////////////////////////////////
696//Branching
697/////////////////////////////////////////////////////////
698let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, noResults = 1 in {
699let Ra = 31 in
700def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)]>;
701
702//Branches, int
Andrew Lenharth9e234852006-01-26 03:24:15 +0000703def BEQ : BForm<0x39, "beq $RA,$DISP",
704 [(brcond (seteq GPRC:$RA, 0), bb:$DISP)]>;
705def BGE : BForm<0x3E, "bge $RA,$DISP",
706 [(brcond (setge GPRC:$RA, 0), bb:$DISP)]>;
707def BGT : BForm<0x3F, "bgt $RA,$DISP",
708 [(brcond (setgt GPRC:$RA, 0), bb:$DISP)]>;
709def BLBC : BForm<0x38, "blbc $RA,$DISP", []>; //TODO: Low bit clear
710def BLBS : BForm<0x3C, "blbs $RA,$DISP",
711 [(brcond (and GPRC:$RA, 1), bb:$DISP)]>;
712def BLE : BForm<0x3B, "ble $RA,$DISP",
713 [(brcond (setle GPRC:$RA, 0), bb:$DISP)]>;
714def BLT : BForm<0x3A, "blt $RA,$DISP",
715 [(brcond (setlt GPRC:$RA, 0), bb:$DISP)]>;
716def BNE : BForm<0x3D, "bne $RA,$DISP",
717 [(brcond (setne GPRC:$RA, 0), bb:$DISP)]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000718
719//Branches, float
720def FBEQ : FBForm<0x31, "fbeq $RA,$DISP",
721 [(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP)]>;
722def FBGE : FBForm<0x36, "fbge $RA,$DISP",
723 [(brcond (setge F8RC:$RA, immFPZ), bb:$DISP)]>;
724def FBGT : FBForm<0x37, "fbgt $RA,$DISP",
725 [(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP)]>;
726def FBLE : FBForm<0x33, "fble $RA,$DISP",
727 [(brcond (setle F8RC:$RA, immFPZ), bb:$DISP)]>;
728def FBLT : FBForm<0x32, "fblt $RA,$DISP",
729 [(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP)]>;
730def FBNE : FBForm<0x35, "fbne $RA,$DISP",
731 [(brcond (setne F8RC:$RA, immFPZ), bb:$DISP)]>;
732}
733
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000734def : Pat<(brcond GPRC:$RA, bb:$DISP), (BNE GPRC:$RA, bb:$DISP)>;
Andrew Lenharthf7c4bd62006-01-09 19:49:58 +0000735def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
736 (BEQ (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
737def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
738 (BEQ (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000739def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
740 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
741def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
742 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
743def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
744 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
745def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
746 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
747def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
748 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
749def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
750 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
751
752//End Branches
753
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000754//S_floating : IEEE Single
755//T_floating : IEEE Double
756
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000757//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000758//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000759//CALL_PAL Pcd 00 Trap to PALcode
760//ECB Mfc 18.E800 Evict cache block
761//EXCB Mfc 18.0400 Exception barrier
762//FETCH Mfc 18.8000 Prefetch data
763//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000764//LDL_L Mem 2A Load sign-extended longword locked
765//LDQ_L Mem 2B Load quadword locked
766//LDQ_U Mem 0B Load unaligned quadword
767//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000768//STL_C Mem 2E Store longword conditional
769//STQ_C Mem 2F Store quadword conditional
770//STQ_U Mem 0F Store unaligned quadword
771//TRAPB Mfc 18.0000 Trap barrier
772//WH64 Mfc 18.F800 Write hint  64 bytes
773//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000774//MF_FPCR F-P 17.025 Move from FPCR
775//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000776//There are in the Multimedia extentions, so let's not use them yet
777//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
778//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
779//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
780//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
781//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
782//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
783//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
784//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
785//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
786//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
787//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
788//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
789//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
790//CVTLQ F-P 17.010 Convert longword to quadword
791//CVTQL F-P 17.030 Convert quadword to longword
792//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
793//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
794
795
Andrew Lenharth50b37842005-11-22 04:20:06 +0000796//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000797
Andrew Lenharth50b37842005-11-22 04:20:06 +0000798def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000799 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +0000800 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000801 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +0000802}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000803def immConst2PartInt : PatLeaf<(imm), [{
804 //true if imm fits in a LDAH LDA pair with zeroext
805 uint64_t uval = N->getValue();
806 int32_t val32 = (int32_t)uval;
807 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000808 val32 <= IMM_FULLHIGH);
809// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
810}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000811
812def : Pat<(i64 immConst2Part:$imm),
813 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000814
815def : Pat<(i64 immSExt16:$imm),
816 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000817
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000818def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000819 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000820def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharth6e707fb2006-01-16 21:41:39 +0000821 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
Andrew Lenharth29418a82006-01-10 19:12:47 +0000822 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000823
824
Andrew Lenharth50b37842005-11-22 04:20:06 +0000825//TODO: I want to just define these like this!
826//def : Pat<(i64 0),
827// (R31)>;
828//def : Pat<(f64 0.0),
829// (F31)>;
830//def : Pat<(f64 -0.0),
831// (CPYSNT F31, F31)>;
832//def : Pat<(f32 0.0),
833// (F31)>;
834//def : Pat<(f32 -0.0),
835// (CPYSNS F31, F31)>;
836
837//Misc Patterns:
838
839def : Pat<(sext_inreg GPRC:$RB, i32),
840 (ADDLi GPRC:$RB, 0)>;
841
842def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
843 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; //may be CMOVNE
844
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000845def : Pat<(fabs F8RC:$RB),
846 (CPYST F31, F8RC:$RB)>;
847def : Pat<(fabs F4RC:$RB),
848 (CPYSS F31, F4RC:$RB)>;
849def : Pat<(fneg F8RC:$RB),
850 (CPYSNT F8RC:$RB, F8RC:$RB)>;
851def : Pat<(fneg F4RC:$RB),
852 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000853def : Pat<(fcopysign (fneg F4RC:$A), F4RC:$B),
854 (CPYSNS F4RC:$A, F4RC:$B)>;
855def : Pat<(fcopysign (fneg F8RC:$A), F8RC:$B),
856 (CPYSNT F8RC:$A, F8RC:$B)>;
857
Andrew Lenharthcd804962005-11-30 16:10:29 +0000858//Yes, signed multiply high is ugly
859def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
860 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
861 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;