blob: fd6bab9d8a1f485b83dc1cdfa5bfee28d092523d [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 Lenharth7f0db912005-11-30 07:19:56 +000030
Andrew Lenharth79620652005-12-05 20:50:53 +000031// These are target-independent nodes, but have target-specific formats.
32def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
33def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
34def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,[SDNPHasChain]>;
35
Andrew Lenharth7f0db912005-11-30 07:19:56 +000036
37//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000038//Paterns for matching
39//********************
Andrew Lenhartheda80a02005-12-06 00:33:53 +000040def invX : SDNodeXForm<imm, [{
41 return getI64Imm(~N->getValue());
42}]>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000043def immUExt8 : PatLeaf<(imm), [{
44 // immUExt8 predicate - True if the immediate fits in a 8-bit zero extended
45 // field. Used by instructions like 'addi'.
46 return (unsigned long)N->getValue() == (unsigned char)N->getValue();
47}]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +000048def immUExt8inv : PatLeaf<(imm), [{
49 // immUExt8inv predicate - True if the inverted immediate fits in a 8-bit zero extended
50 // field. Used by instructions like 'ornoti'.
51 return (unsigned long)~N->getValue() == (unsigned char)~N->getValue();
52}], invX>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000053def immSExt16 : PatLeaf<(imm), [{
54 // immSExt16 predicate - True if the immediate fits in a 16-bit sign extended
55 // field. Used by instructions like 'lda'.
56 return (int)N->getValue() == (short)N->getValue();
57}]>;
58
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000059def iZAPX : SDNodeXForm<imm, [{
60 // Transformation function: get the imm to ZAPi
61 uint64_t UImm = (uint64_t)N->getValue();
62 unsigned int build = 0;
63 for(int i = 0; i < 8; ++i)
64 {
65 if ((UImm & 0x00FF) == 0x00FF)
66 build |= 1 << i;
67 else if ((UImm & 0x00FF) != 0)
68 { build = 0; break; }
69 UImm >>= 8;
70 }
71 return getI64Imm(build);
72}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000073def immZAP : PatLeaf<(imm), [{
74 // immZAP predicate - True if the immediate fits is suitable for use in a
75 // ZAP instruction
76 uint64_t UImm = (uint64_t)N->getValue();
77 unsigned int build = 0;
78 for(int i = 0; i < 8; ++i)
79 {
80 if ((UImm & 0x00FF) == 0x00FF)
81 build |= 1 << i;
82 else if ((UImm & 0x00FF) != 0)
83 { build = 0; break; }
84 UImm >>= 8;
85 }
86 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +000087}], iZAPX>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000088
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000089def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
90def add4 : PatFrag<(ops node:$op1, node:$op2),
91 (add (shl node:$op1, 2), node:$op2)>;
92def sub4 : PatFrag<(ops node:$op1, node:$op2),
93 (sub (shl node:$op1, 2), node:$op2)>;
94def add8 : PatFrag<(ops node:$op1, node:$op2),
95 (add (shl node:$op1, 3), node:$op2)>;
96def sub8 : PatFrag<(ops node:$op1, node:$op2),
97 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +000098
Andrew Lenharth304d0f32005-01-22 23:41:55 +000099 // //#define FP $15
100 // //#define RA $26
101 // //#define PV $27
102 // //#define GP $29
103 // //#define SP $30
104
Andrew Lenharth50b37842005-11-22 04:20:06 +0000105def PHI : PseudoInstAlpha<(ops variable_ops), "#phi", []>;
106
107def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
108 [(set GPRC:$RA, (undef))]>;
109def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
110 [(set F4RC:$RA, (undef))]>;
111def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
112 [(set F8RC:$RA, (undef))]>;
113
114def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", []>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000115let isLoad = 1, hasCtrlDep = 1 in {
116def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000117 [(callseq_start imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000118def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000119 [(callseq_end imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000120}
Andrew Lenharth50b37842005-11-22 04:20:06 +0000121def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$TARGET:\n", []>;
122def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[]>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000123def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000124 "LSMARKER$$$i$$$j$$$k$$$m:\n",[]>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000125
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000126//*****************
127//These are shortcuts, the assembler expands them
128//*****************
129//AT = R28
130//T0-T7 = R1 - R8
131//T8-T11 = R22-R25
132
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000133//An even better improvement on the Int = SetCC(FP): SelectCC!
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000134//These are evil because they hide control flow in a MBB
135//really the ISel should emit multiple MBB
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000136let isTwoAddress = 1 in {
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000137//Conditional move of an int based on a FP CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000138 def CMOVEQ_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000139 "fbne $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000140 def CMOVEQi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000141 "fbne $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000142
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000143 def CMOVNE_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000144 "fbeq $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000145 def CMOVNEi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000146 "fbeq $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000147//Conditional move of an FP based on a Int CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000148 def FCMOVEQ_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000149 "bne $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000150 def FCMOVNE_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000151 "beq $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000152}
Andrew Lenharthca3d59b2005-03-14 19:23:45 +0000153
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000154//***********************
155//Real instructions
156//***********************
157
158//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000159
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000160//conditional moves, int
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000161def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$L,$RDEST">; //CMOVE if RCOND = zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000162def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$L,$RDEST">; //CMOVE if RCOND >= zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000163def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$L,$RDEST">; //CMOVE if RCOND > zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000164def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit clear
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000165def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit set
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000166def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$L,$RDEST">; //CMOVE if RCOND <= zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000167def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$L,$RDEST">; //CMOVE if RCOND < zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000168def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$L,$RDEST">; //CMOVE if RCOND != zero
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000169
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000170let OperandList = (ops GPRC:$RDEST, GPRC:$RFALSE, GPRC:$RTRUE, GPRC:$RCOND) in {
171def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000172 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000173def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000174 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000175def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000176 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000177def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000178 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000179def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000180 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000181def CMOVLE : OForm4< 0x11, 0x64, "cmovle $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 CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000184 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000185def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000186 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
187}
188
189//FIXME: fold setcc with select for all cases. clearly I need patterns for inverted conditions
190// and constants (which require inverted conditions as legalize puts the constant in the
191// wrong field for the instruction definition
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000192def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000193 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000194
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000195
Andrew Lenharth4907d222005-10-20 00:28:31 +0000196def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000197 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000198def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000199 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000200def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
201 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))]>;
202def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
203 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000204def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
205 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))]>;
206def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
207 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))]>;
208def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
209 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000210def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
211 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000212def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
213 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))]>;
214def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
215 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000216def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000217 [(set GPRC:$RC, (ctlz GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000218def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000219 [(set GPRC:$RC, (ctpop GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000220def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000221 [(set GPRC:$RC, (cttz GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000222def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
223 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000224def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
225 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000226//def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC", []>; //Extract byte low
227//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
228//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
229//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
230//def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC", []>; //Extract longword low
231//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
232//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
233//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
234//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
235//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
236//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
237//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
238//def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC", []>; //Extract word low
239//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
240//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
241//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
242//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
243//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
244//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
245//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
246//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
247//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
248//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
249//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
250//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
251//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
252//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
253//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
254//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
255//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
256//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
257//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
258//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
259//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
260//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
261//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
262//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
263//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
264//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
265//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
266//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
267//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
268//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
269//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000270
Andrew Lenharth4907d222005-10-20 00:28:31 +0000271def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000272 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000273def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000274 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000275def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
276 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))]>;
277def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
278 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8:$L))]>;
279def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
280 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000281def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
282 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000283def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000284 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000285def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000286 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000287def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000288 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000289def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000290 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000291def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000292 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000293def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000294 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000295def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000296 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000297def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000298 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000299def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000300 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000301def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000302 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000303def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000304 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000305def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000306 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000307def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000308 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000309def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000310 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000311def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000312 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000313def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000314 [(set GPRC:$RC, (sub8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000315def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000316 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000317def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000318 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000319def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
320 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))]>;
321def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
322 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))]>;
323def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
324 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))]>;
325def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
326 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))]>;
327def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
328 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))]>;
329def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
330 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))]>;
331def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000332 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000333def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000334 [(set GPRC:$RC, (intop (sub GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000335def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
336 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))]>;
337def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
338 [(set GPRC:$RC, (sub GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000339def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
340 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))]>;
341def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
342 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000343def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
344 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))]>;
345def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
346 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000347//FIXME: what to do about zap? the cases it catches are very complex
Andrew Lenharth4907d222005-10-20 00:28:31 +0000348def ZAP : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000349//ZAPi is useless give ZAPNOTi
Andrew Lenharth4907d222005-10-20 00:28:31 +0000350def ZAPi : OFormL<0x12, 0x30, "zap $RA,$L,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000351//FIXME: what to do about zapnot? see ZAP :)
Andrew Lenharth4907d222005-10-20 00:28:31 +0000352def ZAPNOT : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", []>; //Zero bytes not
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000353def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
354 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000355
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000356//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000357//So this is a waste of what this instruction can do, but it still saves something
358def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
359 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>;
360def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
361 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>;
362def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
363 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>;
364def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
365 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>;
366def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
367 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>;
368def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
369 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))]>;
370def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
371 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
372def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
373 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
374def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
375 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))]>;
376def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
377 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))]>;
378def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000379 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000380def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000381 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000382
383//Patterns for unsupported int comparisons
384def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
385def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
386
387def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
388def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
389
390def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
391def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
392
393def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
394def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
395
396def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
397def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
398
399def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
400def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
401
402def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
403def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
404
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000405
Andrew Lenharth4907d222005-10-20 00:28:31 +0000406let isReturn = 1, isTerminator = 1 in
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000407 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 +0000408//DAG Version:
409let isReturn = 1, isTerminator = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
410 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1">; //Return from subroutine
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000411
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000412def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP">; //Jump
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000413let isCall = 1,
414 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenharth63f2ab22005-02-10 06:25:22 +0000415 R20, R21, R22, R23, R24, R25, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000416 F0, F1,
417 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000418 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000419 def JSR : MbrForm< 0x1A, 0x01, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr $RD,($RS),$DISP">; //Jump to subroutine
420 def BSR : BForm<0x34, "bsr $RA,$DISP">; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000421}
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000422let isCall = 1,
423 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
424 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
425 F0, F1,
426 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
427 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
428 def JSRDAG : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0">; //Jump to subroutine
429}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000430let isCall = 1, Defs = [R24, R25, R27, R28], Uses = [R24, R25] in
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000431 def JSRs : MbrForm< 0x1A, 0x01, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr $RD,($RS),$DISP">; //Jump to div or rem
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000432
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000433let isCall = 1, Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
434 def JSRsDAG : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0">; //Jump to div or rem
435
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000436def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP">; //Jump to subroutine return
437def BR : BForm<0x30, "br $RA,$DISP">; //Branch
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000438
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000439def BR_DAG : BFormD<0x30, "br $$31,$DISP">; //Branch
440
Andrew Lenharth9fa4d4c2005-12-24 03:41:56 +0000441
Andrew Lenharthb6718602005-12-24 07:34:33 +0000442let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
443def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
444 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
445def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
446 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
447def LDL : MForm<0x29, 0, 1, "ldl $RA,$DISP($RB)",
448 [(set GPRC:$RA, (sextload (add GPRC:$RB, immSExt16:$DISP), i32))]>;
449def LDLr : MForm<0x29, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
450 [(set GPRC:$RA, (sextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32))]>;
451def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
452 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i8))]>;
453def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
454 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8))]>;
455def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
456 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i16))]>;
457def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
458 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16))]>;
459def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
460 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)]>;
461def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
462 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)]>;
463def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
464 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)]>;
465def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
466 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)]>;
467def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
468 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)]>;
469def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
470 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)]>;
471def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
472 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
473def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
474 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000475
476//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000477def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
478 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
479def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
480 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>; //Load address
481def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
482 []>; //Load address high
483def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
484 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))]>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000485}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000486
Andrew Lenharthb6718602005-12-24 07:34:33 +0000487let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
488def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
489 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
490def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
491 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
492def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
493 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
494def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
495 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
496}
497let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
498def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
499 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
500def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
501 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
502def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
503 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
504def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
505 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
506}
507
508//misc ext patterns
509def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i8)),
510 (LDBU immSExt16:$DISP, GPRC:$RB)>;
511def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i16)),
512 (LDWU immSExt16:$DISP, GPRC:$RB)>;
513def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i32)),
514 (LDL immSExt16:$DISP, GPRC:$RB)>;
515
516//0 disp patterns
517def : Pat<(i64 (load GPRC:$addr)),
518 (LDQ 0, GPRC:$addr)>;
519def : Pat<(f64 (load GPRC:$addr)),
520 (LDT 0, GPRC:$addr)>;
521def : Pat<(f32 (load GPRC:$addr)),
522 (LDS 0, GPRC:$addr)>;
523def : Pat<(i64 (sextload GPRC:$addr, i32)),
524 (LDL 0, GPRC:$addr)>;
525def : Pat<(i64 (zextload GPRC:$addr, i16)),
526 (LDWU 0, GPRC:$addr)>;
527def : Pat<(i64 (zextload GPRC:$addr, i8)),
528 (LDBU 0, GPRC:$addr)>;
529def : Pat<(i64 (extload GPRC:$addr, i8)),
530 (LDBU 0, GPRC:$addr)>;
531def : Pat<(i64 (extload GPRC:$addr, i16)),
532 (LDWU 0, GPRC:$addr)>;
533def : Pat<(i64 (extload GPRC:$addr, i32)),
534 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000535
Andrew Lenharth4e629512005-12-24 05:36:33 +0000536
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000537//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000538let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
539def LDAg : MFormAlt<0x08, "lda $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
540def LDAHg : MFormAlt<0x09, "ldah $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
541}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000542
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000543//Load quad, rellocated literal form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000544let isLoad = 1, OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
545def LDQl : MFormAlt<0x29, "ldq $RA,$DISP($RB)\t\t!literal">; //Load quadword
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000546
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000547//Branches, int
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000548def BEQ : BForm<0x39, "beq $RA,$DISP">; //Branch if = zero
549def BGE : BForm<0x3E, "bge $RA,$DISP">; //Branch if >= zero
550def BGT : BForm<0x3F, "bgt $RA,$DISP">; //Branch if > zero
551def BLBC : BForm<0x38, "blbc $RA,$DISP">; //Branch if low bit clear
552def BLBS : BForm<0x3C, "blbs $RA,$DISP">; //Branch if low bit set
553def BLE : BForm<0x3B, "ble $RA,$DISP">; //Branch if <= zero
554def BLT : BForm<0x3A, "blt $RA,$DISP">; //Branch if < zero
555def BNE : BForm<0x3D, "bne $RA,$DISP">; //Branch if != zero
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000556
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000557//Branches, float
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000558def FBEQ : FBForm<0x31, "fbeq $RA,$DISP">; //Floating branch if = zero
559def FBGE : FBForm<0x36, "fbge $RA,$DISP">; //Floating branch if >= zero
560def FBGT : FBForm<0x37, "fbgt $RA,$DISP">; //Floating branch if > zero
561def FBLE : FBForm<0x33, "fble $RA,$DISP">; //Floating branch if <= zero
562def FBLT : FBForm<0x32, "fblt $RA,$DISP">; //Floating branch if < zero
563def FBNE : FBForm<0x35, "fbne $RA,$DISP">; //Floating branch if != zero
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000564
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000565def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA">; //Read process cycle counter
566
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000567//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000568
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000569//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000570
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000571let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
572def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
573 [(set F4RC:$RC, (fsqrt F4RC:$RB))]>;
574
575let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
576def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
577 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))]>;
578def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
579 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))]>;
580def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
581 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))]>;
582def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
583 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))]>;
584
585def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
586def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
587def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
588}
589
590//Doubles
591
592let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
593def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
594 [(set F8RC:$RC, (fsqrt F8RC:$RB))]>;
595
596let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
597def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
598 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))]>;
599def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
600 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))]>;
601def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
602 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))]>;
603def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
604 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))]>;
605
606def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
607def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
608def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
609
610def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", []>;
611// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
612def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", []>;
613// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
614def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", []>;
615// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
616def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", []>;
617// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
618}
619//TODO: Add lots more FP patterns
620
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000621//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000622let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000623 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000624def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if = zero
625def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if >= zero
626def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if > zero
627def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if <= zero
628def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[]>; // FCMOVE if < zero
629def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000630}
631//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000632let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000633 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000634def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", []>;
635def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", []>;
636def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", []>;
637def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", []>;
638def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", []>;
639def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", []>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000640}
641
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000642//misc FP selects
643//Select double
644def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000645 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000646def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
647 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000648def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000649 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000650def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000651 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000652def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000653 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000654def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000655 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000656//Select single
657def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000658 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000659def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
660 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000661def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000662 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000663def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000664 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000665def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000666 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000667def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000668 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000669
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000670
671
672let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
673def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[]>; //Floating to integer move, S_floating
674let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000675def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
676 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))]>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000677let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
678def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[]>; //Integer to floating move, S_floating
679let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000680def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
681 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))]>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000682
683
684let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000685def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
686 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000687let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000688def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
689 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000690let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000691def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
692 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000693let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
694def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
695 [(set F8RC:$RC, (fextend F4RC:$RB))]>;
696let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
697def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
698 [(set F4RC:$RC, (fround F8RC:$RB))]>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000699
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000700//S_floating : IEEE Single
701//T_floating : IEEE Double
702
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000703//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000704//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000705//CALL_PAL Pcd 00 Trap to PALcode
706//ECB Mfc 18.E800 Evict cache block
707//EXCB Mfc 18.0400 Exception barrier
708//FETCH Mfc 18.8000 Prefetch data
709//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000710//LDL_L Mem 2A Load sign-extended longword locked
711//LDQ_L Mem 2B Load quadword locked
712//LDQ_U Mem 0B Load unaligned quadword
713//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000714//STL_C Mem 2E Store longword conditional
715//STQ_C Mem 2F Store quadword conditional
716//STQ_U Mem 0F Store unaligned quadword
717//TRAPB Mfc 18.0000 Trap barrier
718//WH64 Mfc 18.F800 Write hint  64 bytes
719//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000720//MF_FPCR F-P 17.025 Move from FPCR
721//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000722//There are in the Multimedia extentions, so let's not use them yet
723//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
724//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
725//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
726//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
727//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
728//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
729//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
730//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
731//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
732//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
733//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
734//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
735//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
736//CVTLQ F-P 17.010 Convert longword to quadword
737//CVTQL F-P 17.030 Convert quadword to longword
738//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
739//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
740
741
Andrew Lenharth50b37842005-11-22 04:20:06 +0000742//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000743
Andrew Lenharth50b37842005-11-22 04:20:06 +0000744def immConst2Part : PatLeaf<(imm), [{
745 // immZAP predicate - True if the immediate fits is suitable for use in a
746 // ZAP instruction
747 int64_t val = (int64_t)N->getValue();
748 return (val <= (int64_t)IMM_HIGH +(int64_t)IMM_HIGH* (int64_t)IMM_MULT &
749 val >= (int64_t)IMM_LOW + (int64_t)IMM_LOW * (int64_t)IMM_MULT);
750}]>;
751
752//TODO: factor this out
753def LL16 : SDNodeXForm<imm, [{
754int64_t l = N->getValue();
755 int64_t y = l / IMM_MULT;
756 if (l % IMM_MULT > IMM_HIGH)
757 ++y;
758 return getI64Imm(l - y * IMM_MULT);
759}]>;
760//TODO: factor this out
761def LH16 : SDNodeXForm<imm, [{
762int64_t l = N->getValue();
763 int64_t y = l / IMM_MULT;
764 if (l % IMM_MULT > IMM_HIGH)
765 ++y;
766 return getI64Imm(y);
767}]>;
768
769def : Pat<(i64 immConst2Part:$imm),
770 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000771
772def : Pat<(i64 immSExt16:$imm),
773 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000774
775//TODO: I want to just define these like this!
776//def : Pat<(i64 0),
777// (R31)>;
778//def : Pat<(f64 0.0),
779// (F31)>;
780//def : Pat<(f64 -0.0),
781// (CPYSNT F31, F31)>;
782//def : Pat<(f32 0.0),
783// (F31)>;
784//def : Pat<(f32 -0.0),
785// (CPYSNS F31, F31)>;
786
787//Misc Patterns:
788
789def : Pat<(sext_inreg GPRC:$RB, i32),
790 (ADDLi GPRC:$RB, 0)>;
791
792def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
793 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; //may be CMOVNE
794
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000795def : Pat<(fabs F8RC:$RB),
796 (CPYST F31, F8RC:$RB)>;
797def : Pat<(fabs F4RC:$RB),
798 (CPYSS F31, F4RC:$RB)>;
799def : Pat<(fneg F8RC:$RB),
800 (CPYSNT F8RC:$RB, F8RC:$RB)>;
801def : Pat<(fneg F4RC:$RB),
802 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthcd804962005-11-30 16:10:29 +0000803//Yes, signed multiply high is ugly
804def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
805 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
806 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;