blob: 795459620a77d32da33eec05e33028123a53e1bb [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 Lenharth7f0db912005-11-30 07:19:56 +000025
Andrew Lenharth167bc6e2006-01-23 20:59:50 +000026def Alpha_itoft : SDNode<"AlphaISD::ITOFT_", SDTIntToFPOp, []>;
27def Alpha_ftoit : SDNode<"AlphaISD::FTOIT_", SDTFPToIntOp, []>;
28def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
29def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
30def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_" , SDTFPUnaryOp, []>;
31def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
32def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
33def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth87076052006-01-23 21:23:26 +000034def Alpha_ldq : SDNode<"AlphaISD::LDQ_", SDTLoadA, [SDNPHasChain]>;
35def Alpha_ldt : SDNode<"AlphaISD::LDT_", SDTLoadA, [SDNPHasChain]>;
36def Alpha_lds : SDNode<"AlphaISD::LDS_", SDTLoadA, [SDNPHasChain]>;
37def Alpha_ldl : SDNode<"AlphaISD::LDL_", SDTLoadA, [SDNPHasChain]>;
38def Alpha_ldwu : SDNode<"AlphaISD::LDWU_", SDTLoadA, [SDNPHasChain]>;
39def Alpha_ldbu : SDNode<"AlphaISD::LDBU_", SDTLoadA, [SDNPHasChain]>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000040
Andrew Lenharth79620652005-12-05 20:50:53 +000041// These are target-independent nodes, but have target-specific formats.
42def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
43def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
44def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,[SDNPHasChain]>;
45
Andrew Lenharth7f0db912005-11-30 07:19:56 +000046//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000047//Paterns for matching
48//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000049def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000050 return getI64Imm(~N->getValue());
51}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000052def negX : SDNodeXForm<imm, [{ //negate
53 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000054}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000055def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000056 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
57}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000058def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
59 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000060}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000061def LL16 : SDNodeXForm<imm, [{ //lda part of constant
62 return getI64Imm(get_lda16(N->getValue()));
63}]>;
64def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
65 return getI64Imm(get_ldah16(N->getValue()));
66}]>;
67def iZAPX : SDNodeXForm<imm, [{ // get imm to ZAPi
68 return getI64Imm(get_zapImm((uint64_t)N->getValue()));
69}]>;
70
71def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
72 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
73}]>;
74def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
75 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
76}], invX>;
77def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
78 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
79}], negX>;
80def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
81 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
82}]>;
83def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
84 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
85}], SExt16>;
86def immZAP : PatLeaf<(imm), [{ //imm is good for zapi
87 uint64_t build = get_zapImm((uint64_t)N->getValue());
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000088 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +000089}], iZAPX>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000090def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
91 return true;
92}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000093
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000094def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
95def add4 : PatFrag<(ops node:$op1, node:$op2),
96 (add (shl node:$op1, 2), node:$op2)>;
97def sub4 : PatFrag<(ops node:$op1, node:$op2),
98 (sub (shl node:$op1, 2), node:$op2)>;
99def add8 : PatFrag<(ops node:$op1, node:$op2),
100 (add (shl node:$op1, 3), node:$op2)>;
101def sub8 : PatFrag<(ops node:$op1, node:$op2),
102 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000103
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000104
105//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000106
Andrew Lenharth50b37842005-11-22 04:20:06 +0000107def PHI : PseudoInstAlpha<(ops variable_ops), "#phi", []>;
108
109def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
110 [(set GPRC:$RA, (undef))]>;
111def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
112 [(set F4RC:$RA, (undef))]>;
113def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
114 [(set F8RC:$RA, (undef))]>;
115
116def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", []>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000117
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000118let isLoad = 1, hasCtrlDep = 1 in {
119def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000120 [(callseq_start imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000121def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000122 [(callseq_end imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000123}
Andrew Lenharth424ba782005-12-27 03:53:58 +0000124def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", []>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000125def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[]>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000126def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000127 "LSMARKER$$$i$$$j$$$k$$$m:", []>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000128
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000129
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000130
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000131//An even better improvement on the Int = SetCC(FP): SelectCC!
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000132//These are evil because they hide control flow in a MBB
133//really the ISel should emit multiple MBB
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000134let isTwoAddress = 1 in {
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000135//Conditional move of an int based on a FP CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000136 def CMOVEQ_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000137 "fbne $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000138 def CMOVEQi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000139 "fbne $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000140
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000141 def CMOVNE_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000142 "fbeq $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000143 def CMOVNEi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000144 "fbeq $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000145//Conditional move of an FP based on a Int CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000146 def FCMOVEQ_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000147 "bne $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000148 def FCMOVNE_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000149 "beq $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000150}
Andrew Lenharthca3d59b2005-03-14 19:23:45 +0000151
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000152//***********************
153//Real instructions
154//***********************
155
156//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000157
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000158//conditional moves, int
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000159def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$L,$RDEST">; //CMOVE if RCOND = zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000160def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$L,$RDEST">; //CMOVE if RCOND >= zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000161def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$L,$RDEST">; //CMOVE if RCOND > zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000162def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit clear
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000163def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit set
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000164def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$L,$RDEST">; //CMOVE if RCOND <= zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000165def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$L,$RDEST">; //CMOVE if RCOND < zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000166def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$L,$RDEST">; //CMOVE if RCOND != zero
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000167
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000168let OperandList = (ops GPRC:$RDEST, GPRC:$RFALSE, GPRC:$RTRUE, GPRC:$RCOND) in {
169def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000170 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000171def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000172 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000173def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000174 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000175def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000176 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000177def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000178 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000179def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000180 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000181def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000182 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000183def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000184 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
185}
186
187//FIXME: fold setcc with select for all cases. clearly I need patterns for inverted conditions
188// and constants (which require inverted conditions as legalize puts the constant in the
189// wrong field for the instruction definition
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000190def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000191 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000192
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000193
Andrew Lenharth4907d222005-10-20 00:28:31 +0000194def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000195 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000196def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000197 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000198def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
199 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))]>;
200def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
201 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000202def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
203 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))]>;
204def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
205 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))]>;
206def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
207 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000208def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
209 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000210def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
211 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))]>;
212def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
213 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000214def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000215 [(set GPRC:$RC, (ctlz GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000216def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000217 [(set GPRC:$RC, (ctpop GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000218def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000219 [(set GPRC:$RC, (cttz GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000220def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
221 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000222def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
223 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000224def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000225 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000226def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000227 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000228def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth39424472006-01-19 21:10:38 +0000229 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))]>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000230
Andrew Lenharth4907d222005-10-20 00:28:31 +0000231//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
232//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
233//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000234//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
235//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
236//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
237//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
238//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
239//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
240//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000241//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000242
Andrew Lenharth4907d222005-10-20 00:28:31 +0000243//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
244//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
245//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
246//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
247//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
248//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
249//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
250//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
251//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
252//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
253//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
254//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
255//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
256//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
257//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
258//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
259//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
260//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
261//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
262//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
263//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
264//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
265//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
266//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
267//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
268//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
269//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
270//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
271//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
272//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000273
Andrew Lenharth4907d222005-10-20 00:28:31 +0000274def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000275 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000276def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000277 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000278def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
279 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))]>;
280def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
281 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8:$L))]>;
282def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
283 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000284def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
285 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000286def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000287 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000288def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000289 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000290def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000291 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000292def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000293 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000294def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000295 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000296def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000297 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000298def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000299 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000300def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000301 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000302def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000303 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000304def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000305 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000306def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000307 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000308def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000309 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000310def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000311 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000312def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000313 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8neg:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000314def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000315 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000316def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000317 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8neg:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000318def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000319 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000320def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000321 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000322def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
323 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))]>;
324def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
325 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))]>;
326def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
327 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))]>;
328def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
329 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))]>;
330def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
331 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))]>;
332def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
333 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))]>;
334def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000335 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000336def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000337 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8neg:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000338def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
339 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))]>;
340def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000341 [(set GPRC:$RC, (add GPRC:$RA, immUExt8neg:$L))]>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000342def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
343 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))]>;
344def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
345 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000346def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
347 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))]>;
348def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
349 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000350//FIXME: what to do about zap? the cases it catches are very complex
Andrew Lenharth4907d222005-10-20 00:28:31 +0000351def ZAP : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000352//ZAPi is useless give ZAPNOTi
Andrew Lenharth4907d222005-10-20 00:28:31 +0000353def ZAPi : OFormL<0x12, 0x30, "zap $RA,$L,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000354//FIXME: what to do about zapnot? see ZAP :)
Andrew Lenharth4907d222005-10-20 00:28:31 +0000355def ZAPNOT : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", []>; //Zero bytes not
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000356def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
357 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000358
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000359//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000360//So this is a waste of what this instruction can do, but it still saves something
361def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
362 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>;
363def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
364 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>;
365def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
366 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>;
367def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
368 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>;
369def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
370 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>;
371def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
372 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))]>;
373def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
374 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
375def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
376 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
377def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
378 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))]>;
379def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
380 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))]>;
381def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000382 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000383def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000384 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000385
386//Patterns for unsupported int comparisons
387def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
388def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
389
390def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
391def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
392
393def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
394def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
395
396def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
397def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
398
399def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
400def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
401
402def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
403def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
404
405def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
406def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
407
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000408
Evan Cheng2b4ea792005-12-26 09:11:45 +0000409let isReturn = 1, isTerminator = 1, noResults = 1 in
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000410 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 +0000411//DAG Version:
Evan Cheng2b4ea792005-12-26 09:11:45 +0000412let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
Andrew Lenharth4907d222005-10-20 00:28:31 +0000413 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1">; //Return from subroutine
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000414
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000415def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP">; //Jump
Evan Cheng2b4ea792005-12-26 09:11:45 +0000416let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000417 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000418 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000419 F0, F1,
420 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000421 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000422 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", []>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000423}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000424let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000425 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
426 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
427 F0, F1,
428 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
429 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000430 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0">; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000431}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000432
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000433let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
434 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenhartheececba2005-12-25 17:36:48 +0000435 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0">; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000436
Andrew Lenharth53d89702005-12-25 01:34:27 +0000437
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000438def 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 +0000439
Andrew Lenharthb6718602005-12-24 07:34:33 +0000440let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
441def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
442 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
443def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
444 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
445def LDL : MForm<0x29, 0, 1, "ldl $RA,$DISP($RB)",
446 [(set GPRC:$RA, (sextload (add GPRC:$RB, immSExt16:$DISP), i32))]>;
447def LDLr : MForm<0x29, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
448 [(set GPRC:$RA, (sextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32))]>;
449def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
450 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i8))]>;
451def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
452 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8))]>;
453def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
454 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i16))]>;
455def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
456 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16))]>;
457def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
458 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)]>;
459def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
460 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)]>;
461def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
462 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)]>;
463def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
464 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)]>;
465def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
466 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)]>;
467def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
468 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)]>;
469def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
470 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
471def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
472 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000473
474//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000475def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
476 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
477def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
478 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>; //Load address
479def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
480 []>; //Load address high
481def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
482 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))]>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000483}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000484
Andrew Lenharthb6718602005-12-24 07:34:33 +0000485let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
486def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
487 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
488def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
489 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
490def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
491 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
492def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
493 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
494}
495let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
496def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
497 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
498def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
499 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
500def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
501 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
502def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
503 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
504}
505
Andrew Lenharthc687b482005-12-24 08:29:32 +0000506
507//constpool rels
508def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
509 (LDQr tconstpool:$DISP, GPRC:$RB)>;
510def : Pat<(i64 (sextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i32)),
511 (LDLr tconstpool:$DISP, GPRC:$RB)>;
512def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i8)),
513 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
514def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i16)),
515 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
516def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
517 (LDAr tconstpool:$DISP, GPRC:$RB)>;
518def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
519 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
520def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
521 (LDSr tconstpool:$DISP, GPRC:$RB)>;
522def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
523 (LDTr tconstpool:$DISP, GPRC:$RB)>;
524
525
Andrew Lenharthb6718602005-12-24 07:34:33 +0000526//misc ext patterns
527def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i8)),
528 (LDBU immSExt16:$DISP, GPRC:$RB)>;
529def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i16)),
530 (LDWU immSExt16:$DISP, GPRC:$RB)>;
531def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i32)),
532 (LDL immSExt16:$DISP, GPRC:$RB)>;
533
534//0 disp patterns
535def : Pat<(i64 (load GPRC:$addr)),
536 (LDQ 0, GPRC:$addr)>;
537def : Pat<(f64 (load GPRC:$addr)),
538 (LDT 0, GPRC:$addr)>;
539def : Pat<(f32 (load GPRC:$addr)),
540 (LDS 0, GPRC:$addr)>;
541def : Pat<(i64 (sextload GPRC:$addr, i32)),
542 (LDL 0, GPRC:$addr)>;
543def : Pat<(i64 (zextload GPRC:$addr, i16)),
544 (LDWU 0, GPRC:$addr)>;
545def : Pat<(i64 (zextload GPRC:$addr, i8)),
546 (LDBU 0, GPRC:$addr)>;
547def : Pat<(i64 (extload GPRC:$addr, i8)),
548 (LDBU 0, GPRC:$addr)>;
549def : Pat<(i64 (extload GPRC:$addr, i16)),
550 (LDWU 0, GPRC:$addr)>;
551def : Pat<(i64 (extload GPRC:$addr, i32)),
552 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000553
Andrew Lenharthc687b482005-12-24 08:29:32 +0000554def : Pat<(store GPRC:$DATA, GPRC:$addr),
555 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
556def : Pat<(store F8RC:$DATA, GPRC:$addr),
557 (STT F8RC:$DATA, 0, GPRC:$addr)>;
558def : Pat<(store F4RC:$DATA, GPRC:$addr),
559 (STS F4RC:$DATA, 0, GPRC:$addr)>;
560def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i32),
561 (STL GPRC:$DATA, 0, GPRC:$addr)>;
562def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i16),
563 (STW GPRC:$DATA, 0, GPRC:$addr)>;
564def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i8),
565 (STB GPRC:$DATA, 0, GPRC:$addr)>;
566
Andrew Lenharth4e629512005-12-24 05:36:33 +0000567
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000568//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000569let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
570def LDAg : MFormAlt<0x08, "lda $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
571def LDAHg : MFormAlt<0x09, "ldah $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
572}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000573
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000574//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000575let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000576def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
577 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000578def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
579 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000580
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000581
582let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB,
583 s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m) in {
584def LDQlbl : MForm<0x29, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldq $RA,$DISP($RB)",
585 [(set GPRC:$RA, (Alpha_ldq imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
Andrew Lenharth87076052006-01-23 21:23:26 +0000586def LDLlbl : MForm<0x29, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldl $RA,$DISP($RB)",
587 [(set GPRC:$RA, (Alpha_ldl imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
588def LDBUlbl : MForm<0x0A, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldbu $RA,$DISP($RB)",
589 [(set GPRC:$RA, (Alpha_ldwu imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
590def LDWUlbl : MForm<0x0C, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldwu $RA,$DISP($RB)",
591 [(set GPRC:$RA, (Alpha_ldbu imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000592}
593
594let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB,
595 s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m) in
596def LDTlbl : MForm<0x29, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t ldt $RA,$DISP($RB)",
597 [(set F8RC:$RA, (Alpha_ldt imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
598
599let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB,
600 s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m) in
601def LDSlbl : MForm<0x29, 0, 1, "LSMARKER$$$i$$$j$$$k$$$m:\n\t lds $RA,$DISP($RB)",
602 [(set F4RC:$RA, (Alpha_lds imm:$DISP, GPRC:$RB, imm:$i, imm:$j, imm:$k, imm:$m))]>;
603
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000604def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA">; //Read process cycle counter
605
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000606//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000607
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000608//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000609
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000610let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
611def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
612 [(set F4RC:$RC, (fsqrt F4RC:$RB))]>;
613
614let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
615def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
616 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))]>;
617def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
618 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))]>;
619def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
620 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))]>;
621def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
622 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))]>;
623
624def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
625def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
626def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
627}
628
629//Doubles
630
631let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
632def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
633 [(set F8RC:$RC, (fsqrt F8RC:$RB))]>;
634
635let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
636def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
637 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))]>;
638def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
639 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))]>;
640def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
641 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))]>;
642def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
643 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))]>;
644
645def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
646def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
647def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
648
649def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", []>;
650// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
651def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", []>;
652// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
653def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", []>;
654// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
655def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", []>;
656// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
657}
658//TODO: Add lots more FP patterns
659
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000660//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000661let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000662 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000663def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if = zero
664def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if >= zero
665def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if > zero
666def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if <= zero
667def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[]>; // FCMOVE if < zero
668def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000669}
670//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000671let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000672 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000673def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", []>;
674def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", []>;
675def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", []>;
676def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", []>;
677def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", []>;
678def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", []>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000679}
680
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000681//misc FP selects
682//Select double
683def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000684 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000685def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
686 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000687def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000688 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000689def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000690 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000691def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000692 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000693def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000694 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000695//Select single
696def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000697 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000698def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
699 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000700def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000701 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000702def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000703 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000704def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000705 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000706def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000707 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000708
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000709
710
711let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
712def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[]>; //Floating to integer move, S_floating
713let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000714def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
715 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))]>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000716let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
717def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[]>; //Integer to floating move, S_floating
718let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000719def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
720 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))]>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000721
722
723let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000724def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
725 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000726let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000727def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
728 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000729let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000730def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
731 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000732let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
733def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
734 [(set F8RC:$RC, (fextend F4RC:$RB))]>;
735let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
736def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
737 [(set F4RC:$RC, (fround F8RC:$RB))]>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000738
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000739
740/////////////////////////////////////////////////////////
741//Branching
742/////////////////////////////////////////////////////////
743let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, noResults = 1 in {
744let Ra = 31 in
745def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)]>;
746
747//Branches, int
748def BEQ : BFormDG<0x39, "beq $RA,$DISP",
749 [(brcond (seteq GPRC:$RA, 0), bb:$DISP)]>;
750def BGE : BFormDG<0x3E, "bge $RA,$DISP",
751 [(brcond (setge GPRC:$RA, 0), bb:$DISP)]>;
752def BGT : BFormDG<0x3F, "bgt $RA,$DISP",
753 [(brcond (setgt GPRC:$RA, 0), bb:$DISP)]>;
754def BLBC : BFormDG<0x38, "blbc $RA,$DISP", []>; //TODO: Low bit clear
755def BLBS : BFormDG<0x3C, "blbs $RA,$DISP",
Andrew Lenharth3b628f82006-01-11 03:33:06 +0000756 [(brcond (and GPRC:$RA, 1), bb:$DISP)]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000757def BLE : BFormDG<0x3B, "ble $RA,$DISP",
758 [(brcond (setle GPRC:$RA, 0), bb:$DISP)]>;
759def BLT : BFormDG<0x3A, "blt $RA,$DISP",
760 [(brcond (setlt GPRC:$RA, 0), bb:$DISP)]>;
761def BNE : BFormDG<0x3D, "bne $RA,$DISP",
762 [(brcond (setne GPRC:$RA, 0), bb:$DISP)]>;
763
764//Branches, float
765def FBEQ : FBForm<0x31, "fbeq $RA,$DISP",
766 [(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP)]>;
767def FBGE : FBForm<0x36, "fbge $RA,$DISP",
768 [(brcond (setge F8RC:$RA, immFPZ), bb:$DISP)]>;
769def FBGT : FBForm<0x37, "fbgt $RA,$DISP",
770 [(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP)]>;
771def FBLE : FBForm<0x33, "fble $RA,$DISP",
772 [(brcond (setle F8RC:$RA, immFPZ), bb:$DISP)]>;
773def FBLT : FBForm<0x32, "fblt $RA,$DISP",
774 [(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP)]>;
775def FBNE : FBForm<0x35, "fbne $RA,$DISP",
776 [(brcond (setne F8RC:$RA, immFPZ), bb:$DISP)]>;
777}
778
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000779def : Pat<(brcond GPRC:$RA, bb:$DISP), (BNE GPRC:$RA, bb:$DISP)>;
Andrew Lenharthf7c4bd62006-01-09 19:49:58 +0000780def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
781 (BEQ (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
782def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
783 (BEQ (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000784def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
785 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
786def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
787 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
788def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
789 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
790def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
791 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
792def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
793 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
794def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
795 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
796
797//End Branches
798
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000799//S_floating : IEEE Single
800//T_floating : IEEE Double
801
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000802//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000803//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000804//CALL_PAL Pcd 00 Trap to PALcode
805//ECB Mfc 18.E800 Evict cache block
806//EXCB Mfc 18.0400 Exception barrier
807//FETCH Mfc 18.8000 Prefetch data
808//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000809//LDL_L Mem 2A Load sign-extended longword locked
810//LDQ_L Mem 2B Load quadword locked
811//LDQ_U Mem 0B Load unaligned quadword
812//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000813//STL_C Mem 2E Store longword conditional
814//STQ_C Mem 2F Store quadword conditional
815//STQ_U Mem 0F Store unaligned quadword
816//TRAPB Mfc 18.0000 Trap barrier
817//WH64 Mfc 18.F800 Write hint  64 bytes
818//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000819//MF_FPCR F-P 17.025 Move from FPCR
820//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000821//There are in the Multimedia extentions, so let's not use them yet
822//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
823//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
824//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
825//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
826//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
827//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
828//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
829//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
830//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
831//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
832//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
833//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
834//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
835//CVTLQ F-P 17.010 Convert longword to quadword
836//CVTQL F-P 17.030 Convert quadword to longword
837//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
838//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
839
840
Andrew Lenharth50b37842005-11-22 04:20:06 +0000841//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000842
Andrew Lenharth50b37842005-11-22 04:20:06 +0000843def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000844 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +0000845 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000846 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +0000847}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000848def immConst2PartInt : PatLeaf<(imm), [{
849 //true if imm fits in a LDAH LDA pair with zeroext
850 uint64_t uval = N->getValue();
851 int32_t val32 = (int32_t)uval;
852 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000853 val32 <= IMM_FULLHIGH);
854// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
855}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000856
857def : Pat<(i64 immConst2Part:$imm),
858 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000859
860def : Pat<(i64 immSExt16:$imm),
861 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000862
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000863def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000864 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000865def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharth6e707fb2006-01-16 21:41:39 +0000866 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
Andrew Lenharth29418a82006-01-10 19:12:47 +0000867 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000868
869
Andrew Lenharth50b37842005-11-22 04:20:06 +0000870//TODO: I want to just define these like this!
871//def : Pat<(i64 0),
872// (R31)>;
873//def : Pat<(f64 0.0),
874// (F31)>;
875//def : Pat<(f64 -0.0),
876// (CPYSNT F31, F31)>;
877//def : Pat<(f32 0.0),
878// (F31)>;
879//def : Pat<(f32 -0.0),
880// (CPYSNS F31, F31)>;
881
882//Misc Patterns:
883
884def : Pat<(sext_inreg GPRC:$RB, i32),
885 (ADDLi GPRC:$RB, 0)>;
886
887def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
888 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; //may be CMOVNE
889
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000890def : Pat<(fabs F8RC:$RB),
891 (CPYST F31, F8RC:$RB)>;
892def : Pat<(fabs F4RC:$RB),
893 (CPYSS F31, F4RC:$RB)>;
894def : Pat<(fneg F8RC:$RB),
895 (CPYSNT F8RC:$RB, F8RC:$RB)>;
896def : Pat<(fneg F4RC:$RB),
897 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthcd804962005-11-30 16:10:29 +0000898//Yes, signed multiply high is ugly
899def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
900 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
901 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;