blob: 0bd2f0ff23ee526dd203976eda8af4bafe5936f6 [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]>;
22
23def Alpha_itoft : SDNode<"AlphaISD::ITOFT_", SDTIntToFPOp, []>;
24def Alpha_ftoit : SDNode<"AlphaISD::FTOIT_", SDTFPToIntOp, []>;
25def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
26def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
Andrew Lenharthcd804962005-11-30 16:10:29 +000027def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_", SDTFPUnaryOp, []>;
Andrew Lenharth4e629512005-12-24 05:36:33 +000028def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
29def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
Andrew Lenharthc687b482005-12-24 08:29:32 +000030def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000031
Andrew Lenharth79620652005-12-05 20:50:53 +000032// These are target-independent nodes, but have target-specific formats.
33def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
34def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
35def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,[SDNPHasChain]>;
36
Andrew Lenharth7f0db912005-11-30 07:19:56 +000037//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000038//Paterns for matching
39//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000040def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000041 return getI64Imm(~N->getValue());
42}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000043def negX : SDNodeXForm<imm, [{ //negate
44 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000045}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000046def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000047 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
48}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000049def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
50 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000051}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000052def LL16 : SDNodeXForm<imm, [{ //lda part of constant
53 return getI64Imm(get_lda16(N->getValue()));
54}]>;
55def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
56 return getI64Imm(get_ldah16(N->getValue()));
57}]>;
58def iZAPX : SDNodeXForm<imm, [{ // get imm to ZAPi
59 return getI64Imm(get_zapImm((uint64_t)N->getValue()));
60}]>;
61
62def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
63 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
64}]>;
65def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
66 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
67}], invX>;
68def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
69 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
70}], negX>;
71def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
72 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
73}]>;
74def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
75 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
76}], SExt16>;
77def immZAP : PatLeaf<(imm), [{ //imm is good for zapi
78 uint64_t build = get_zapImm((uint64_t)N->getValue());
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000079 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +000080}], iZAPX>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000081def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
82 return true;
83}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000084
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000085def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
86def add4 : PatFrag<(ops node:$op1, node:$op2),
87 (add (shl node:$op1, 2), node:$op2)>;
88def sub4 : PatFrag<(ops node:$op1, node:$op2),
89 (sub (shl node:$op1, 2), node:$op2)>;
90def add8 : PatFrag<(ops node:$op1, node:$op2),
91 (add (shl node:$op1, 3), node:$op2)>;
92def sub8 : PatFrag<(ops node:$op1, node:$op2),
93 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +000094
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000095
96//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +000097
Andrew Lenharth50b37842005-11-22 04:20:06 +000098def PHI : PseudoInstAlpha<(ops variable_ops), "#phi", []>;
99
100def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
101 [(set GPRC:$RA, (undef))]>;
102def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
103 [(set F4RC:$RA, (undef))]>;
104def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
105 [(set F8RC:$RA, (undef))]>;
106
107def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", []>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000108
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000109let isLoad = 1, hasCtrlDep = 1 in {
110def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000111 [(callseq_start imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000112def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000113 [(callseq_end imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000114}
Andrew Lenharth424ba782005-12-27 03:53:58 +0000115def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", []>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000116def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[]>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000117def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000118 "LSMARKER$$$i$$$j$$$k$$$m:\n",[]>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000119
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000120
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000121
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000122//An even better improvement on the Int = SetCC(FP): SelectCC!
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000123//These are evil because they hide control flow in a MBB
124//really the ISel should emit multiple MBB
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000125let isTwoAddress = 1 in {
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000126//Conditional move of an int based on a FP CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000127 def CMOVEQ_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000128 "fbne $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000129 def CMOVEQi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000130 "fbne $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000131
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000132 def CMOVNE_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000133 "fbeq $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000134 def CMOVNEi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000135 "fbeq $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000136//Conditional move of an FP based on a Int CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000137 def FCMOVEQ_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000138 "bne $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000139 def FCMOVNE_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000140 "beq $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000141}
Andrew Lenharthca3d59b2005-03-14 19:23:45 +0000142
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000143//***********************
144//Real instructions
145//***********************
146
147//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000148
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000149//conditional moves, int
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000150def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$L,$RDEST">; //CMOVE if RCOND = zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000151def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$L,$RDEST">; //CMOVE if RCOND >= zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000152def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$L,$RDEST">; //CMOVE if RCOND > zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000153def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit clear
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000154def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit set
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000155def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$L,$RDEST">; //CMOVE if RCOND <= zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000156def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$L,$RDEST">; //CMOVE if RCOND < zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000157def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$L,$RDEST">; //CMOVE if RCOND != zero
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000158
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000159let OperandList = (ops GPRC:$RDEST, GPRC:$RFALSE, GPRC:$RTRUE, GPRC:$RCOND) in {
160def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000161 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000162def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000163 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000164def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000165 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000166def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000167 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000168def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000169 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000170def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000171 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000172def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000173 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000174def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000175 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
176}
177
178//FIXME: fold setcc with select for all cases. clearly I need patterns for inverted conditions
179// and constants (which require inverted conditions as legalize puts the constant in the
180// wrong field for the instruction definition
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000181def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000182 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000183
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000184
Andrew Lenharth4907d222005-10-20 00:28:31 +0000185def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000186 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000187def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000188 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000189def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
190 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))]>;
191def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
192 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000193def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
194 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))]>;
195def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
196 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))]>;
197def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
198 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000199def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
200 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000201def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
202 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))]>;
203def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
204 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000205def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000206 [(set GPRC:$RC, (ctlz GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000207def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000208 [(set GPRC:$RC, (ctpop GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000209def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000210 [(set GPRC:$RC, (cttz GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000211def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
212 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000213def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
214 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000215//def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC", []>; //Extract byte low
216//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
217//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
218//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
219//def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC", []>; //Extract longword low
220//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
221//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
222//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
223//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
224//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
225//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
226//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
227//def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC", []>; //Extract word low
228//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
229//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
230//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
231//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
232//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
233//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
234//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
235//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
236//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
237//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
238//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
239//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
240//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
241//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
242//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
243//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
244//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
245//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
246//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
247//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
248//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
249//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
250//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
251//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
252//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
253//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
254//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
255//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
256//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
257//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
258//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000259
Andrew Lenharth4907d222005-10-20 00:28:31 +0000260def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000261 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000262def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000263 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000264def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
265 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))]>;
266def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
267 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8:$L))]>;
268def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
269 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000270def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
271 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000272def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000273 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000274def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000275 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000276def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000277 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000278def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000279 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000280def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000281 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000282def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000283 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000284def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000285 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000286def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000287 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000288def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000289 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000290def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000291 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000292def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000293 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000294def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000295 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000296def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000297 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000298def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000299 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8neg:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000300def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000301 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000302def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000303 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8neg:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000304def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000305 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000306def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000307 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000308def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
309 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))]>;
310def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
311 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))]>;
312def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
313 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))]>;
314def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
315 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))]>;
316def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
317 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))]>;
318def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
319 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))]>;
320def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000321 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000322def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000323 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8neg:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000324def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
325 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))]>;
326def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000327 [(set GPRC:$RC, (add GPRC:$RA, immUExt8neg:$L))]>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000328def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
329 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))]>;
330def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
331 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000332def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
333 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))]>;
334def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
335 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000336//FIXME: what to do about zap? the cases it catches are very complex
Andrew Lenharth4907d222005-10-20 00:28:31 +0000337def ZAP : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000338//ZAPi is useless give ZAPNOTi
Andrew Lenharth4907d222005-10-20 00:28:31 +0000339def ZAPi : OFormL<0x12, 0x30, "zap $RA,$L,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000340//FIXME: what to do about zapnot? see ZAP :)
Andrew Lenharth4907d222005-10-20 00:28:31 +0000341def ZAPNOT : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", []>; //Zero bytes not
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000342def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
343 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000344
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000345//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000346//So this is a waste of what this instruction can do, but it still saves something
347def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
348 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>;
349def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
350 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>;
351def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
352 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>;
353def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
354 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>;
355def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
356 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>;
357def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
358 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))]>;
359def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
360 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
361def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
362 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
363def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
364 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))]>;
365def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
366 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))]>;
367def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000368 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000369def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000370 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000371
372//Patterns for unsupported int comparisons
373def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
374def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
375
376def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
377def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
378
379def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
380def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
381
382def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
383def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
384
385def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
386def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
387
388def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
389def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
390
391def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
392def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
393
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000394
Evan Cheng2b4ea792005-12-26 09:11:45 +0000395let isReturn = 1, isTerminator = 1, noResults = 1 in
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000396 def RET : MbrForm< 0x1A, 0x02, (ops GPRC:$RD, GPRC:$RS, s64imm:$DISP), "ret $RD,($RS),$DISP">; //Return from subroutine
Andrew Lenharth4907d222005-10-20 00:28:31 +0000397//DAG Version:
Evan Cheng2b4ea792005-12-26 09:11:45 +0000398let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
Andrew Lenharth4907d222005-10-20 00:28:31 +0000399 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1">; //Return from subroutine
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000400
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000401def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP">; //Jump
Evan Cheng2b4ea792005-12-26 09:11:45 +0000402let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000403 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000404 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000405 F0, F1,
406 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000407 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000408 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", []>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000409}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000410let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000411 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
412 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
413 F0, F1,
414 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
415 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000416 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0">; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000417}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000418
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000419let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
420 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenhartheececba2005-12-25 17:36:48 +0000421 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0">; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000422
Andrew Lenharth53d89702005-12-25 01:34:27 +0000423
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000424def 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 +0000425
Andrew Lenharthb6718602005-12-24 07:34:33 +0000426let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
427def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
428 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
429def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
430 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
431def LDL : MForm<0x29, 0, 1, "ldl $RA,$DISP($RB)",
432 [(set GPRC:$RA, (sextload (add GPRC:$RB, immSExt16:$DISP), i32))]>;
433def LDLr : MForm<0x29, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
434 [(set GPRC:$RA, (sextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32))]>;
435def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
436 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i8))]>;
437def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
438 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8))]>;
439def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
440 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i16))]>;
441def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
442 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16))]>;
443def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
444 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)]>;
445def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
446 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)]>;
447def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
448 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)]>;
449def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
450 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)]>;
451def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
452 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)]>;
453def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
454 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)]>;
455def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
456 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
457def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
458 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000459
460//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000461def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
462 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
463def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
464 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>; //Load address
465def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
466 []>; //Load address high
467def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
468 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))]>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000469}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000470
Andrew Lenharthb6718602005-12-24 07:34:33 +0000471let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
472def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
473 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
474def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
475 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
476def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
477 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
478def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
479 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
480}
481let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
482def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
483 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
484def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
485 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
486def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
487 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
488def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
489 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
490}
491
Andrew Lenharthc687b482005-12-24 08:29:32 +0000492
493//constpool rels
494def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
495 (LDQr tconstpool:$DISP, GPRC:$RB)>;
496def : Pat<(i64 (sextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i32)),
497 (LDLr tconstpool:$DISP, GPRC:$RB)>;
498def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i8)),
499 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
500def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i16)),
501 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
502def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
503 (LDAr tconstpool:$DISP, GPRC:$RB)>;
504def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
505 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
506def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
507 (LDSr tconstpool:$DISP, GPRC:$RB)>;
508def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
509 (LDTr tconstpool:$DISP, GPRC:$RB)>;
510
511
Andrew Lenharthb6718602005-12-24 07:34:33 +0000512//misc ext patterns
513def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i8)),
514 (LDBU immSExt16:$DISP, GPRC:$RB)>;
515def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i16)),
516 (LDWU immSExt16:$DISP, GPRC:$RB)>;
517def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i32)),
518 (LDL immSExt16:$DISP, GPRC:$RB)>;
519
520//0 disp patterns
521def : Pat<(i64 (load GPRC:$addr)),
522 (LDQ 0, GPRC:$addr)>;
523def : Pat<(f64 (load GPRC:$addr)),
524 (LDT 0, GPRC:$addr)>;
525def : Pat<(f32 (load GPRC:$addr)),
526 (LDS 0, GPRC:$addr)>;
527def : Pat<(i64 (sextload GPRC:$addr, i32)),
528 (LDL 0, GPRC:$addr)>;
529def : Pat<(i64 (zextload GPRC:$addr, i16)),
530 (LDWU 0, GPRC:$addr)>;
531def : Pat<(i64 (zextload GPRC:$addr, i8)),
532 (LDBU 0, GPRC:$addr)>;
533def : Pat<(i64 (extload GPRC:$addr, i8)),
534 (LDBU 0, GPRC:$addr)>;
535def : Pat<(i64 (extload GPRC:$addr, i16)),
536 (LDWU 0, GPRC:$addr)>;
537def : Pat<(i64 (extload GPRC:$addr, i32)),
538 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000539
Andrew Lenharthc687b482005-12-24 08:29:32 +0000540def : Pat<(store GPRC:$DATA, GPRC:$addr),
541 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
542def : Pat<(store F8RC:$DATA, GPRC:$addr),
543 (STT F8RC:$DATA, 0, GPRC:$addr)>;
544def : Pat<(store F4RC:$DATA, GPRC:$addr),
545 (STS F4RC:$DATA, 0, GPRC:$addr)>;
546def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i32),
547 (STL GPRC:$DATA, 0, GPRC:$addr)>;
548def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i16),
549 (STW GPRC:$DATA, 0, GPRC:$addr)>;
550def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i8),
551 (STB GPRC:$DATA, 0, GPRC:$addr)>;
552
Andrew Lenharth4e629512005-12-24 05:36:33 +0000553
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000554//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000555let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
556def LDAg : MFormAlt<0x08, "lda $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
557def LDAHg : MFormAlt<0x09, "ldah $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
558}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000559
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000560//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000561let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000562def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
563 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000564def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
565 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000566
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000567def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA">; //Read process cycle counter
568
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000569//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000570
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000571//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000572
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000573let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
574def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
575 [(set F4RC:$RC, (fsqrt F4RC:$RB))]>;
576
577let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
578def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
579 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))]>;
580def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
581 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))]>;
582def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
583 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))]>;
584def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
585 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))]>;
586
587def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
588def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
589def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
590}
591
592//Doubles
593
594let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
595def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
596 [(set F8RC:$RC, (fsqrt F8RC:$RB))]>;
597
598let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
599def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
600 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))]>;
601def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
602 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))]>;
603def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
604 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))]>;
605def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
606 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))]>;
607
608def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
609def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
610def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
611
612def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", []>;
613// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
614def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", []>;
615// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
616def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", []>;
617// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
618def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", []>;
619// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
620}
621//TODO: Add lots more FP patterns
622
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000623//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000624let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000625 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000626def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if = zero
627def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if >= zero
628def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if > zero
629def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if <= zero
630def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[]>; // FCMOVE if < zero
631def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000632}
633//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000634let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000635 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000636def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", []>;
637def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", []>;
638def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", []>;
639def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", []>;
640def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", []>;
641def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", []>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000642}
643
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000644//misc FP selects
645//Select double
646def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000647 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000648def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
649 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000650def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000651 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000652def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000653 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000654def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000655 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000656def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000657 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000658//Select single
659def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000660 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000661def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
662 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000663def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000664 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000665def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000666 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000667def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000668 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000669def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000670 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000671
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000672
673
674let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
675def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[]>; //Floating to integer move, S_floating
676let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000677def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
678 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))]>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000679let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
680def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[]>; //Integer to floating move, S_floating
681let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000682def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
683 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))]>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000684
685
686let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000687def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
688 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000689let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000690def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
691 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000692let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000693def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
694 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000695let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
696def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
697 [(set F8RC:$RC, (fextend F4RC:$RB))]>;
698let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
699def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
700 [(set F4RC:$RC, (fround F8RC:$RB))]>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000701
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000702
703/////////////////////////////////////////////////////////
704//Branching
705/////////////////////////////////////////////////////////
706let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, noResults = 1 in {
707let Ra = 31 in
708def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)]>;
709
710//Branches, int
711def BEQ : BFormDG<0x39, "beq $RA,$DISP",
712 [(brcond (seteq GPRC:$RA, 0), bb:$DISP)]>;
713def BGE : BFormDG<0x3E, "bge $RA,$DISP",
714 [(brcond (setge GPRC:$RA, 0), bb:$DISP)]>;
715def BGT : BFormDG<0x3F, "bgt $RA,$DISP",
716 [(brcond (setgt GPRC:$RA, 0), bb:$DISP)]>;
717def BLBC : BFormDG<0x38, "blbc $RA,$DISP", []>; //TODO: Low bit clear
718def BLBS : BFormDG<0x3C, "blbs $RA,$DISP",
719 [(brcond (seteq GPRC:$RA, 1), bb:$DISP)]>;
720def BLE : BFormDG<0x3B, "ble $RA,$DISP",
721 [(brcond (setle GPRC:$RA, 0), bb:$DISP)]>;
722def BLT : BFormDG<0x3A, "blt $RA,$DISP",
723 [(brcond (setlt GPRC:$RA, 0), bb:$DISP)]>;
724def BNE : BFormDG<0x3D, "bne $RA,$DISP",
725 [(brcond (setne GPRC:$RA, 0), bb:$DISP)]>;
726
727//Branches, float
728def FBEQ : FBForm<0x31, "fbeq $RA,$DISP",
729 [(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP)]>;
730def FBGE : FBForm<0x36, "fbge $RA,$DISP",
731 [(brcond (setge F8RC:$RA, immFPZ), bb:$DISP)]>;
732def FBGT : FBForm<0x37, "fbgt $RA,$DISP",
733 [(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP)]>;
734def FBLE : FBForm<0x33, "fble $RA,$DISP",
735 [(brcond (setle F8RC:$RA, immFPZ), bb:$DISP)]>;
736def FBLT : FBForm<0x32, "fblt $RA,$DISP",
737 [(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP)]>;
738def FBNE : FBForm<0x35, "fbne $RA,$DISP",
739 [(brcond (setne F8RC:$RA, immFPZ), bb:$DISP)]>;
740}
741
742def : Pat<(brcond (and GPRC:$RA, 1), bb:$DISP), (BLBS GPRC:$RA, bb:$DISP)>;
743def : Pat<(brcond GPRC:$RA, bb:$DISP), (BNE GPRC:$RA, bb:$DISP)>;
Andrew Lenharthf7c4bd62006-01-09 19:49:58 +0000744def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
745 (BEQ (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
746def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
747 (BEQ (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000748def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
749 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
750def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
751 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
752def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
753 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
754def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
755 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
756def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
757 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
758def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
759 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
760
761//End Branches
762
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000763//S_floating : IEEE Single
764//T_floating : IEEE Double
765
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000766//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000767//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000768//CALL_PAL Pcd 00 Trap to PALcode
769//ECB Mfc 18.E800 Evict cache block
770//EXCB Mfc 18.0400 Exception barrier
771//FETCH Mfc 18.8000 Prefetch data
772//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000773//LDL_L Mem 2A Load sign-extended longword locked
774//LDQ_L Mem 2B Load quadword locked
775//LDQ_U Mem 0B Load unaligned quadword
776//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000777//STL_C Mem 2E Store longword conditional
778//STQ_C Mem 2F Store quadword conditional
779//STQ_U Mem 0F Store unaligned quadword
780//TRAPB Mfc 18.0000 Trap barrier
781//WH64 Mfc 18.F800 Write hint  64 bytes
782//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000783//MF_FPCR F-P 17.025 Move from FPCR
784//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000785//There are in the Multimedia extentions, so let's not use them yet
786//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
787//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
788//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
789//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
790//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
791//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
792//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
793//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
794//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
795//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
796//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
797//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
798//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
799//CVTLQ F-P 17.010 Convert longword to quadword
800//CVTQL F-P 17.030 Convert quadword to longword
801//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
802//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
803
804
Andrew Lenharth50b37842005-11-22 04:20:06 +0000805//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000806
Andrew Lenharth50b37842005-11-22 04:20:06 +0000807def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000808 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +0000809 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000810 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +0000811}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000812def immConst2PartInt : PatLeaf<(imm), [{
813 //true if imm fits in a LDAH LDA pair with zeroext
814 uint64_t uval = N->getValue();
815 int32_t val32 = (int32_t)uval;
816 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000817 val32 <= IMM_FULLHIGH);
818// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
819}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000820
821def : Pat<(i64 immConst2Part:$imm),
822 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000823
824def : Pat<(i64 immSExt16:$imm),
825 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000826
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000827def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000828 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000829def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000830 (ZAPNOTi (LDA (LL16 (SExt16 immConst2PartInt:$imm)),
831 (LDAH (LH16 (SExt16 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000832
833
Andrew Lenharth50b37842005-11-22 04:20:06 +0000834//TODO: I want to just define these like this!
835//def : Pat<(i64 0),
836// (R31)>;
837//def : Pat<(f64 0.0),
838// (F31)>;
839//def : Pat<(f64 -0.0),
840// (CPYSNT F31, F31)>;
841//def : Pat<(f32 0.0),
842// (F31)>;
843//def : Pat<(f32 -0.0),
844// (CPYSNS F31, F31)>;
845
846//Misc Patterns:
847
848def : Pat<(sext_inreg GPRC:$RB, i32),
849 (ADDLi GPRC:$RB, 0)>;
850
851def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
852 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; //may be CMOVNE
853
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000854def : Pat<(fabs F8RC:$RB),
855 (CPYST F31, F8RC:$RB)>;
856def : Pat<(fabs F4RC:$RB),
857 (CPYSS F31, F4RC:$RB)>;
858def : Pat<(fneg F8RC:$RB),
859 (CPYSNT F8RC:$RB, F8RC:$RB)>;
860def : Pat<(fneg F4RC:$RB),
861 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthcd804962005-11-30 16:10:29 +0000862//Yes, signed multiply high is ugly
863def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
864 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
865 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;