blob: 1d86462cd57709e0f40422840645f45e040b4be1 [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 SDTLoadA : SDTypeProfile<1, 6, [ // load
23 SDTCisInt<1>, SDTCisPtrTy<2>, SDTCisInt<3>, SDTCisInt<4>, SDTCisInt<5>, SDTCisInt<6>
24]>;
Andrew Lenharth66e49582006-01-23 21:51:33 +000025def SDTStoreA : SDTypeProfile<0, 7, [ // load
26 SDTCisInt<1>, SDTCisPtrTy<2>, SDTCisInt<3>, SDTCisInt<4>, SDTCisInt<5>, SDTCisInt<6>
27]>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000028
Andrew Lenharth167bc6e2006-01-23 20:59:50 +000029def Alpha_itoft : SDNode<"AlphaISD::ITOFT_", SDTIntToFPOp, []>;
30def Alpha_ftoit : SDNode<"AlphaISD::FTOIT_", SDTFPToIntOp, []>;
31def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
32def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
33def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_" , SDTFPUnaryOp, []>;
34def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
35def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
36def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth87076052006-01-23 21:23:26 +000037def Alpha_ldq : SDNode<"AlphaISD::LDQ_", SDTLoadA, [SDNPHasChain]>;
38def Alpha_ldt : SDNode<"AlphaISD::LDT_", SDTLoadA, [SDNPHasChain]>;
39def Alpha_lds : SDNode<"AlphaISD::LDS_", SDTLoadA, [SDNPHasChain]>;
40def Alpha_ldl : SDNode<"AlphaISD::LDL_", SDTLoadA, [SDNPHasChain]>;
41def Alpha_ldwu : SDNode<"AlphaISD::LDWU_", SDTLoadA, [SDNPHasChain]>;
42def Alpha_ldbu : SDNode<"AlphaISD::LDBU_", SDTLoadA, [SDNPHasChain]>;
Andrew Lenharth66e49582006-01-23 21:51:33 +000043def Alpha_stq : SDNode<"AlphaISD::STQ_", SDTStoreA, [SDNPHasChain]>;
44def Alpha_stl : SDNode<"AlphaISD::STL_", SDTStoreA, [SDNPHasChain]>;
45def Alpha_stw : SDNode<"AlphaISD::STW_", SDTStoreA, [SDNPHasChain]>;
46def Alpha_stb : SDNode<"AlphaISD::STB_", SDTStoreA, [SDNPHasChain]>;
47def Alpha_sts : SDNode<"AlphaISD::STS_", SDTStoreA, [SDNPHasChain]>;
48def Alpha_stt : SDNode<"AlphaISD::STT_", SDTStoreA, [SDNPHasChain]>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000049
Andrew Lenharth79620652005-12-05 20:50:53 +000050// These are target-independent nodes, but have target-specific formats.
51def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
52def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
53def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,[SDNPHasChain]>;
54
Andrew Lenharth7f0db912005-11-30 07:19:56 +000055//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000056//Paterns for matching
57//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000058def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000059 return getI64Imm(~N->getValue());
60}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000061def negX : SDNodeXForm<imm, [{ //negate
62 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000063}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000064def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000065 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
66}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000067def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
68 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000069}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000070def LL16 : SDNodeXForm<imm, [{ //lda part of constant
71 return getI64Imm(get_lda16(N->getValue()));
72}]>;
73def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
74 return getI64Imm(get_ldah16(N->getValue()));
75}]>;
76def iZAPX : SDNodeXForm<imm, [{ // get imm to ZAPi
77 return getI64Imm(get_zapImm((uint64_t)N->getValue()));
78}]>;
79
80def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
81 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
82}]>;
83def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
84 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
85}], invX>;
86def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
87 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
88}], negX>;
89def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
90 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
91}]>;
92def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
93 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
94}], SExt16>;
95def immZAP : PatLeaf<(imm), [{ //imm is good for zapi
96 uint64_t build = get_zapImm((uint64_t)N->getValue());
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000097 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +000098}], iZAPX>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000099def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
100 return true;
101}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000102
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000103def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
104def add4 : PatFrag<(ops node:$op1, node:$op2),
105 (add (shl node:$op1, 2), node:$op2)>;
106def sub4 : PatFrag<(ops node:$op1, node:$op2),
107 (sub (shl node:$op1, 2), node:$op2)>;
108def add8 : PatFrag<(ops node:$op1, node:$op2),
109 (add (shl node:$op1, 3), node:$op2)>;
110def sub8 : PatFrag<(ops node:$op1, node:$op2),
111 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000112
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000113
114//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000115
Andrew Lenharth50b37842005-11-22 04:20:06 +0000116def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
117 [(set GPRC:$RA, (undef))]>;
118def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
119 [(set F4RC:$RA, (undef))]>;
120def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
121 [(set F8RC:$RA, (undef))]>;
122
123def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", []>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000124
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000125let isLoad = 1, hasCtrlDep = 1 in {
126def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000127 [(callseq_start imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000128def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000129 [(callseq_end imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000130}
Andrew Lenharth424ba782005-12-27 03:53:58 +0000131def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", []>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000132def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[]>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000133def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000134 "LSMARKER$$$i$$$j$$$k$$$m:", []>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000135
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000136
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000137//***********************
138//Real instructions
139//***********************
140
141//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000142
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000143//conditional moves, int
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000144
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000145def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000146 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000147def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000148 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000149def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000150 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000151def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000152 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000153def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000154 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000155def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Chris Lattnerc7e18522006-01-29 03:47:30 +0000156 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000157def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000158 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000159def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000160 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000161
162def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
163 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
164def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
165 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
166def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
167 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
168def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
169 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
170def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
171 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
172def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
173 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
174def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
175 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
176def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
177 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))]>;
178
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000179
180//FIXME: fold setcc with select for all cases. clearly I need patterns for inverted conditions
181// and constants (which require inverted conditions as legalize puts the constant in the
182// wrong field for the instruction definition
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000183def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000184 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000185def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
186 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000187
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000188
Andrew Lenharth4907d222005-10-20 00:28:31 +0000189def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000190 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000191def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000192 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000193def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
194 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))]>;
195def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
196 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000197def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
198 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))]>;
199def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
200 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))]>;
201def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
202 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000203def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
204 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000205def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
206 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))]>;
207def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
208 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000209def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000210 [(set GPRC:$RC, (ctlz GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000211def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000212 [(set GPRC:$RC, (ctpop GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000213def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000214 [(set GPRC:$RC, (cttz GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000215def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
216 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000217def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
218 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000219def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000220 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000221def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000222 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000223def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000224 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000225
Andrew Lenharth4907d222005-10-20 00:28:31 +0000226//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
227//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
228//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000229//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
230//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
231//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
232//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
233//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
234//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
235//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000236//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000237
Andrew Lenharth4907d222005-10-20 00:28:31 +0000238//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
239//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
240//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
241//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
242//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
243//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
244//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
245//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
246//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
247//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
248//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
249//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
250//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
251//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
252//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
253//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
254//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
255//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
256//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
257//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
258//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
259//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
260//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
261//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
262//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
263//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
264//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
265//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
266//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
267//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000268
Andrew Lenharth4907d222005-10-20 00:28:31 +0000269def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000270 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000271def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000272 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000273def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
274 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))]>;
275def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
276 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8:$L))]>;
277def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
278 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000279def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
280 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000281def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000282 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000283def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000284 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000285def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000286 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000287def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000288 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000289def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000290 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000291def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000292 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000293def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000294 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000295def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000296 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000297def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000298 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000299def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000300 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000301def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000302 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000303def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000304 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000305def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000306 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000307def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000308 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8neg:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000309def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000310 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000311def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000312 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8neg:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000313def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000314 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000315def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000316 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000317def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
318 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))]>;
319def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
320 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))]>;
321def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
322 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))]>;
323def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
324 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))]>;
325def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
326 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))]>;
327def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
328 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))]>;
329def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000330 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000331def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000332 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8neg:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000333def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
334 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))]>;
335def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000336 [(set GPRC:$RC, (add GPRC:$RA, immUExt8neg:$L))]>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000337def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
338 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))]>;
339def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
340 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000341def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
342 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))]>;
343def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
344 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000345//FIXME: what to do about zap? the cases it catches are very complex
Andrew Lenharth4907d222005-10-20 00:28:31 +0000346def ZAP : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000347//ZAPi is useless give ZAPNOTi
Andrew Lenharth4907d222005-10-20 00:28:31 +0000348def ZAPi : OFormL<0x12, 0x30, "zap $RA,$L,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000349//FIXME: what to do about zapnot? see ZAP :)
Andrew Lenharth4907d222005-10-20 00:28:31 +0000350def ZAPNOT : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", []>; //Zero bytes not
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000351def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
352 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000353
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000354//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000355//So this is a waste of what this instruction can do, but it still saves something
356def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
357 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>;
358def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
359 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>;
360def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
361 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>;
362def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
363 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>;
364def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
365 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>;
366def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
367 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))]>;
368def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
369 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
370def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
371 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
372def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
373 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))]>;
374def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
375 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))]>;
376def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000377 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000378def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000379 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000380
381//Patterns for unsupported int comparisons
382def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
383def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
384
385def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
386def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
387
388def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
389def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
390
391def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
392def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
393
394def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
395def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
396
397def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
398def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
399
400def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
401def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
402
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000403
Evan Cheng2b4ea792005-12-26 09:11:45 +0000404let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
Andrew Lenharth4907d222005-10-20 00:28:31 +0000405 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1">; //Return from subroutine
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000406
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000407def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP">; //Jump
Evan Cheng2b4ea792005-12-26 09:11:45 +0000408let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000409 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000410 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000411 F0, F1,
412 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000413 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000414 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", []>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000415}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000416let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000417 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
418 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
419 F0, F1,
420 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
421 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000422 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0">; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000423}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000424
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000425let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
426 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenhartheececba2005-12-25 17:36:48 +0000427 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0">; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000428
Andrew Lenharth53d89702005-12-25 01:34:27 +0000429
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000430def 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 +0000431
Andrew Lenharthb6718602005-12-24 07:34:33 +0000432let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
433def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
434 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
435def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
436 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000437def LDL : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)",
Andrew Lenharthb6718602005-12-24 07:34:33 +0000438 [(set GPRC:$RA, (sextload (add GPRC:$RB, immSExt16:$DISP), i32))]>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000439def LDLr : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharthb6718602005-12-24 07:34:33 +0000440 [(set GPRC:$RA, (sextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32))]>;
441def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
442 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i8))]>;
443def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
444 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8))]>;
445def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
446 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i16))]>;
447def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
448 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16))]>;
449def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
450 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)]>;
451def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
452 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)]>;
453def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
454 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)]>;
455def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
456 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)]>;
457def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
458 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)]>;
459def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
460 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)]>;
461def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
462 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
463def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
464 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000465
466//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000467def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
468 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
469def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
470 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>; //Load address
471def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
472 []>; //Load address high
473def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
474 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))]>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000475}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000476
Andrew Lenharthb6718602005-12-24 07:34:33 +0000477let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
478def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
479 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
480def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
481 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
482def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
483 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
484def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
485 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
486}
487let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
488def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
489 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
490def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
491 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
492def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
493 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
494def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
495 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
496}
497
Andrew Lenharthc687b482005-12-24 08:29:32 +0000498
499//constpool rels
500def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
501 (LDQr tconstpool:$DISP, GPRC:$RB)>;
502def : Pat<(i64 (sextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i32)),
503 (LDLr tconstpool:$DISP, GPRC:$RB)>;
504def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i8)),
505 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
506def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i16)),
507 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
508def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
509 (LDAr tconstpool:$DISP, GPRC:$RB)>;
510def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
511 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
512def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
513 (LDSr tconstpool:$DISP, GPRC:$RB)>;
514def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
515 (LDTr tconstpool:$DISP, GPRC:$RB)>;
516
517
Andrew Lenharthb6718602005-12-24 07:34:33 +0000518//misc ext patterns
519def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i8)),
520 (LDBU immSExt16:$DISP, GPRC:$RB)>;
521def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i16)),
522 (LDWU immSExt16:$DISP, GPRC:$RB)>;
523def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i32)),
524 (LDL immSExt16:$DISP, GPRC:$RB)>;
525
526//0 disp patterns
527def : Pat<(i64 (load GPRC:$addr)),
528 (LDQ 0, GPRC:$addr)>;
529def : Pat<(f64 (load GPRC:$addr)),
530 (LDT 0, GPRC:$addr)>;
531def : Pat<(f32 (load GPRC:$addr)),
532 (LDS 0, GPRC:$addr)>;
533def : Pat<(i64 (sextload GPRC:$addr, i32)),
534 (LDL 0, GPRC:$addr)>;
535def : Pat<(i64 (zextload GPRC:$addr, i16)),
536 (LDWU 0, GPRC:$addr)>;
537def : Pat<(i64 (zextload GPRC:$addr, i8)),
538 (LDBU 0, GPRC:$addr)>;
539def : Pat<(i64 (extload GPRC:$addr, i8)),
540 (LDBU 0, GPRC:$addr)>;
541def : Pat<(i64 (extload GPRC:$addr, i16)),
542 (LDWU 0, GPRC:$addr)>;
543def : Pat<(i64 (extload GPRC:$addr, i32)),
544 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000545
Andrew Lenharthc687b482005-12-24 08:29:32 +0000546def : Pat<(store GPRC:$DATA, GPRC:$addr),
547 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
548def : Pat<(store F8RC:$DATA, GPRC:$addr),
549 (STT F8RC:$DATA, 0, GPRC:$addr)>;
550def : Pat<(store F4RC:$DATA, GPRC:$addr),
551 (STS F4RC:$DATA, 0, GPRC:$addr)>;
552def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i32),
553 (STL GPRC:$DATA, 0, GPRC:$addr)>;
554def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i16),
555 (STW GPRC:$DATA, 0, GPRC:$addr)>;
556def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i8),
557 (STB GPRC:$DATA, 0, GPRC:$addr)>;
558
Andrew Lenharth4e629512005-12-24 05:36:33 +0000559
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000560//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000561let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
Andrew Lenharthcd1544e2006-01-26 03:22:07 +0000562def LDAg : MForm<0x08, 0, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", []>; //Load address
563def LDAHg : MForm<0x09, 0, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", []>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000564}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000565
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000566//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000567let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000568def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
569 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000570def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
571 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000572
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000573
Andrew Lenharth66e49582006-01-23 21:51:33 +0000574//Various tracked versions
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000575let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB,
576 s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m) in {
577def LDQlbl : MForm<0x29, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldq $RA,$DISP($RB)",
578 [(set GPRC:$RA, (Alpha_ldq imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000579def LDLlbl : MForm<0x28, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldl $RA,$DISP($RB)",
Andrew Lenharth87076052006-01-23 21:23:26 +0000580 [(set GPRC:$RA, (Alpha_ldl imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
581def LDBUlbl : MForm<0x0A, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldbu $RA,$DISP($RB)",
582 [(set GPRC:$RA, (Alpha_ldwu imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
583def LDWUlbl : MForm<0x0C, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldwu $RA,$DISP($RB)",
584 [(set GPRC:$RA, (Alpha_ldbu imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000585
586def STBlbl : MForm<0x0E, 1, 0, "LSMARKER$$$i$$$j$$$k$$$m:\n\t stb $RA,$DISP($RB)",
587 [(Alpha_stb GPRC:$RA, imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m)]>;
588def STWlbl : MForm<0x0D, 1, 0, "LSMARKER$$$i$$$j$$$k$$$m:\n\t stw $RA,$DISP($RB)",
589 [(Alpha_stw GPRC:$RA, imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m)]>;
590def STLlbl : MForm<0x2C, 1, 0, "LSMARKER$$$i$$$j$$$k$$$m:\n\t stl $RA,$DISP($RB)",
591 [(Alpha_stl GPRC:$RA, imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m)]>;
592def STQlbl : MForm<0x2D, 1, 0, "LSMARKER$$$i$$$j$$$k$$$m:\n\t stq $RA,$DISP($RB)",
593 [(Alpha_stq GPRC:$RA, imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m)]>;
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000594}
595
596let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB,
597 s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m) in
598def LDTlbl : MForm<0x29, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldt $RA,$DISP($RB)",
599 [(set F8RC:$RA, (Alpha_ldt imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
600
601let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB,
602 s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m) in
603def LDSlbl : MForm<0x29, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t lds $RA,$DISP($RB)",
604 [(set F4RC:$RA, (Alpha_lds imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
605
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000606def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA">; //Read process cycle counter
607
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000608//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000609
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000610//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000611
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000612let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
613def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
614 [(set F4RC:$RC, (fsqrt F4RC:$RB))]>;
615
616let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
617def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
618 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))]>;
619def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
620 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))]>;
621def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
622 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))]>;
623def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
624 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))]>;
625
626def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
627def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
628def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
629}
630
631//Doubles
632
633let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
634def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
635 [(set F8RC:$RC, (fsqrt F8RC:$RB))]>;
636
637let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
638def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
639 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))]>;
640def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
641 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))]>;
642def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
643 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))]>;
644def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
645 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))]>;
646
647def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
648def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
649def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
650
651def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", []>;
652// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
653def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", []>;
654// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
655def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", []>;
656// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
657def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", []>;
658// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
659}
660//TODO: Add lots more FP patterns
661
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000662//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000663let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000664 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000665def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if = zero
666def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if >= zero
667def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if > zero
668def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if <= zero
669def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[]>; // FCMOVE if < zero
670def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000671}
672//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000673let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000674 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000675def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", []>;
676def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", []>;
677def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", []>;
678def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", []>;
679def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", []>;
680def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", []>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000681}
682
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000683//misc FP selects
684//Select double
685def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000686 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000687def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
688 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000689def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000690 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000691def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000692 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000693def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000694 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000695def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000696 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000697//Select single
698def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000699 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000700def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
701 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000702def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000703 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000704def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000705 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000706def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000707 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000708def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000709 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000710
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000711
712
713let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
714def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[]>; //Floating to integer move, S_floating
715let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000716def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
717 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))]>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000718let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
719def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[]>; //Integer to floating move, S_floating
720let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000721def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
722 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))]>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000723
724
725let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000726def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
727 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000728let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000729def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
730 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000731let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000732def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
733 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000734let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
735def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
736 [(set F8RC:$RC, (fextend F4RC:$RB))]>;
737let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
738def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
739 [(set F4RC:$RC, (fround F8RC:$RB))]>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000740
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000741
742/////////////////////////////////////////////////////////
743//Branching
744/////////////////////////////////////////////////////////
745let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, noResults = 1 in {
746let Ra = 31 in
747def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)]>;
748
749//Branches, int
Andrew Lenharth9e234852006-01-26 03:24:15 +0000750def BEQ : BForm<0x39, "beq $RA,$DISP",
751 [(brcond (seteq GPRC:$RA, 0), bb:$DISP)]>;
752def BGE : BForm<0x3E, "bge $RA,$DISP",
753 [(brcond (setge GPRC:$RA, 0), bb:$DISP)]>;
754def BGT : BForm<0x3F, "bgt $RA,$DISP",
755 [(brcond (setgt GPRC:$RA, 0), bb:$DISP)]>;
756def BLBC : BForm<0x38, "blbc $RA,$DISP", []>; //TODO: Low bit clear
757def BLBS : BForm<0x3C, "blbs $RA,$DISP",
758 [(brcond (and GPRC:$RA, 1), bb:$DISP)]>;
759def BLE : BForm<0x3B, "ble $RA,$DISP",
760 [(brcond (setle GPRC:$RA, 0), bb:$DISP)]>;
761def BLT : BForm<0x3A, "blt $RA,$DISP",
762 [(brcond (setlt GPRC:$RA, 0), bb:$DISP)]>;
763def BNE : BForm<0x3D, "bne $RA,$DISP",
764 [(brcond (setne GPRC:$RA, 0), bb:$DISP)]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000765
766//Branches, float
767def FBEQ : FBForm<0x31, "fbeq $RA,$DISP",
768 [(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP)]>;
769def FBGE : FBForm<0x36, "fbge $RA,$DISP",
770 [(brcond (setge F8RC:$RA, immFPZ), bb:$DISP)]>;
771def FBGT : FBForm<0x37, "fbgt $RA,$DISP",
772 [(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP)]>;
773def FBLE : FBForm<0x33, "fble $RA,$DISP",
774 [(brcond (setle F8RC:$RA, immFPZ), bb:$DISP)]>;
775def FBLT : FBForm<0x32, "fblt $RA,$DISP",
776 [(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP)]>;
777def FBNE : FBForm<0x35, "fbne $RA,$DISP",
778 [(brcond (setne F8RC:$RA, immFPZ), bb:$DISP)]>;
779}
780
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000781def : Pat<(brcond GPRC:$RA, bb:$DISP), (BNE GPRC:$RA, bb:$DISP)>;
Andrew Lenharthf7c4bd62006-01-09 19:49:58 +0000782def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
783 (BEQ (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
784def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
785 (BEQ (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000786def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
787 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
788def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
789 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
790def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
791 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
792def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
793 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
794def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
795 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
796def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
797 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
798
799//End Branches
800
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000801//S_floating : IEEE Single
802//T_floating : IEEE Double
803
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000804//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000805//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000806//CALL_PAL Pcd 00 Trap to PALcode
807//ECB Mfc 18.E800 Evict cache block
808//EXCB Mfc 18.0400 Exception barrier
809//FETCH Mfc 18.8000 Prefetch data
810//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000811//LDL_L Mem 2A Load sign-extended longword locked
812//LDQ_L Mem 2B Load quadword locked
813//LDQ_U Mem 0B Load unaligned quadword
814//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000815//STL_C Mem 2E Store longword conditional
816//STQ_C Mem 2F Store quadword conditional
817//STQ_U Mem 0F Store unaligned quadword
818//TRAPB Mfc 18.0000 Trap barrier
819//WH64 Mfc 18.F800 Write hint  64 bytes
820//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000821//MF_FPCR F-P 17.025 Move from FPCR
822//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000823//There are in the Multimedia extentions, so let's not use them yet
824//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
825//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
826//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
827//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
828//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
829//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
830//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
831//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
832//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
833//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
834//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
835//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
836//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
837//CVTLQ F-P 17.010 Convert longword to quadword
838//CVTQL F-P 17.030 Convert quadword to longword
839//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
840//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
841
842
Andrew Lenharth50b37842005-11-22 04:20:06 +0000843//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000844
Andrew Lenharth50b37842005-11-22 04:20:06 +0000845def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000846 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +0000847 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000848 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +0000849}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000850def immConst2PartInt : PatLeaf<(imm), [{
851 //true if imm fits in a LDAH LDA pair with zeroext
852 uint64_t uval = N->getValue();
853 int32_t val32 = (int32_t)uval;
854 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000855 val32 <= IMM_FULLHIGH);
856// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
857}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000858
859def : Pat<(i64 immConst2Part:$imm),
860 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000861
862def : Pat<(i64 immSExt16:$imm),
863 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000864
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000865def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000866 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000867def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharth6e707fb2006-01-16 21:41:39 +0000868 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
Andrew Lenharth29418a82006-01-10 19:12:47 +0000869 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000870
871
Andrew Lenharth50b37842005-11-22 04:20:06 +0000872//TODO: I want to just define these like this!
873//def : Pat<(i64 0),
874// (R31)>;
875//def : Pat<(f64 0.0),
876// (F31)>;
877//def : Pat<(f64 -0.0),
878// (CPYSNT F31, F31)>;
879//def : Pat<(f32 0.0),
880// (F31)>;
881//def : Pat<(f32 -0.0),
882// (CPYSNS F31, F31)>;
883
884//Misc Patterns:
885
886def : Pat<(sext_inreg GPRC:$RB, i32),
887 (ADDLi GPRC:$RB, 0)>;
888
889def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
890 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; //may be CMOVNE
891
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000892def : Pat<(fabs F8RC:$RB),
893 (CPYST F31, F8RC:$RB)>;
894def : Pat<(fabs F4RC:$RB),
895 (CPYSS F31, F4RC:$RB)>;
896def : Pat<(fneg F8RC:$RB),
897 (CPYSNT F8RC:$RB, F8RC:$RB)>;
898def : Pat<(fneg F4RC:$RB),
899 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthcd804962005-11-30 16:10:29 +0000900//Yes, signed multiply high is ugly
901def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
902 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
903 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;