blob: 20a0350d3a90c8180a36ac6cbebc9eeaebcf8507 [file] [log] [blame]
Misha Brukmanbc9ccf62005-02-04 20:25:52 +00001//===- AlphaInstrInfo.td - The Alpha Instruction Set -------*- tablegen -*-===//
Andrew Lenharth304d0f32005-01-22 23:41:55 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//
11//===----------------------------------------------------------------------===//
12
13include "AlphaInstrFormats.td"
14
Andrew Lenharth4907d222005-10-20 00:28:31 +000015//********************
Andrew Lenharth7f0db912005-11-30 07:19:56 +000016//Custom DAG Nodes
17//********************
18
19def SDTFPUnaryOpUnC : SDTypeProfile<1, 1, [
20 SDTCisFP<1>, SDTCisFP<0>
21]>;
22
23def Alpha_itoft : SDNode<"AlphaISD::ITOFT_", SDTIntToFPOp, []>;
24def Alpha_ftoit : SDNode<"AlphaISD::FTOIT_", SDTFPToIntOp, []>;
25def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
26def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
Andrew Lenharthcd804962005-11-30 16:10:29 +000027def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_", SDTFPUnaryOp, []>;
Andrew Lenharth4e629512005-12-24 05:36:33 +000028def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
29def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
Andrew Lenharthc687b482005-12-24 08:29:32 +000030def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000031
Andrew Lenharth79620652005-12-05 20:50:53 +000032// These are target-independent nodes, but have target-specific formats.
33def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
34def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
35def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,[SDNPHasChain]>;
36
Andrew Lenharth7f0db912005-11-30 07:19:56 +000037
38//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000039//Paterns for matching
40//********************
Andrew Lenhartheda80a02005-12-06 00:33:53 +000041def invX : SDNodeXForm<imm, [{
42 return getI64Imm(~N->getValue());
43}]>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000044def immUExt8 : PatLeaf<(imm), [{
45 // immUExt8 predicate - True if the immediate fits in a 8-bit zero extended
46 // field. Used by instructions like 'addi'.
Andrew Lenhartha117b182005-12-29 01:06:12 +000047 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000048}]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +000049def immUExt8inv : PatLeaf<(imm), [{
50 // immUExt8inv predicate - True if the inverted immediate fits in a 8-bit zero extended
51 // field. Used by instructions like 'ornoti'.
Andrew Lenhartha117b182005-12-29 01:06:12 +000052 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
Andrew Lenhartheda80a02005-12-06 00:33:53 +000053}], invX>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000054def immSExt16 : PatLeaf<(imm), [{
55 // immSExt16 predicate - True if the immediate fits in a 16-bit sign extended
56 // field. Used by instructions like 'lda'.
Andrew Lenharthaa6ed8c2005-12-29 00:50:08 +000057 return (int64_t)N->getValue() == (int16_t)N->getValue();
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000058}]>;
59
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000060def SExtInt : SDNodeXForm<imm, [{
61 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
62}]>;
63
64def immSExt16int : PatLeaf<(imm), [{
65 // immSExt16 predicate - True if the immediate fits in a 16-bit sign extended
66 // field. Used by instructions like 'lda'.
67 int64_t val = (int64_t)N->getValue();
68 uint32_t uval32 = (uint32_t)val;
69 int32_t val32 = (int32_t)val;
70 return (int64_t)uval32 == val && val32 == (int16_t)val32;
71}], SExtInt>;
72
73
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000074def iZAPX : SDNodeXForm<imm, [{
75 // Transformation function: get the imm to ZAPi
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 getI64Imm(build);
87}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000088def immZAP : PatLeaf<(imm), [{
89 // immZAP predicate - True if the immediate fits is suitable for use in a
90 // ZAP instruction
91 uint64_t UImm = (uint64_t)N->getValue();
92 unsigned int build = 0;
93 for(int i = 0; i < 8; ++i)
94 {
95 if ((UImm & 0x00FF) == 0x00FF)
96 build |= 1 << i;
97 else if ((UImm & 0x00FF) != 0)
98 { build = 0; break; }
99 UImm >>= 8;
100 }
101 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000102}], iZAPX>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000103
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000104def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
105def add4 : PatFrag<(ops node:$op1, node:$op2),
106 (add (shl node:$op1, 2), node:$op2)>;
107def sub4 : PatFrag<(ops node:$op1, node:$op2),
108 (sub (shl node:$op1, 2), node:$op2)>;
109def add8 : PatFrag<(ops node:$op1, node:$op2),
110 (add (shl node:$op1, 3), node:$op2)>;
111def sub8 : PatFrag<(ops node:$op1, node:$op2),
112 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000113
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000114 // //#define FP $15
115 // //#define RA $26
116 // //#define PV $27
117 // //#define GP $29
118 // //#define SP $30
119
Andrew Lenharth50b37842005-11-22 04:20:06 +0000120def PHI : PseudoInstAlpha<(ops variable_ops), "#phi", []>;
121
122def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
123 [(set GPRC:$RA, (undef))]>;
124def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
125 [(set F4RC:$RA, (undef))]>;
126def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
127 [(set F8RC:$RA, (undef))]>;
128
129def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", []>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000130let isLoad = 1, hasCtrlDep = 1 in {
131def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000132 [(callseq_start imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000133def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth79620652005-12-05 20:50:53 +0000134 [(callseq_end imm:$amt)]>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000135}
Andrew Lenharth424ba782005-12-27 03:53:58 +0000136def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", []>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000137def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[]>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000138def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000139 "LSMARKER$$$i$$$j$$$k$$$m:\n",[]>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000140
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000141//*****************
142//These are shortcuts, the assembler expands them
143//*****************
144//AT = R28
145//T0-T7 = R1 - R8
146//T8-T11 = R22-R25
147
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000148//An even better improvement on the Int = SetCC(FP): SelectCC!
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000149//These are evil because they hide control flow in a MBB
150//really the ISel should emit multiple MBB
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000151let isTwoAddress = 1 in {
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000152//Conditional move of an int based on a FP CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000153 def CMOVEQ_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000154 "fbne $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000155 def CMOVEQi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000156 "fbne $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000157
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000158 def CMOVNE_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000159 "fbeq $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000160 def CMOVNEi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000161 "fbeq $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000162//Conditional move of an FP based on a Int CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000163 def FCMOVEQ_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000164 "bne $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000165 def FCMOVNE_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000166 "beq $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000167}
Andrew Lenharthca3d59b2005-03-14 19:23:45 +0000168
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000169//***********************
170//Real instructions
171//***********************
172
173//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000174
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000175//conditional moves, int
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000176def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$L,$RDEST">; //CMOVE if RCOND = zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000177def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$L,$RDEST">; //CMOVE if RCOND >= zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000178def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$L,$RDEST">; //CMOVE if RCOND > zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000179def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit clear
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000180def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit set
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000181def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$L,$RDEST">; //CMOVE if RCOND <= zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000182def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$L,$RDEST">; //CMOVE if RCOND < zero
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000183def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$L,$RDEST">; //CMOVE if RCOND != zero
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000184
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000185let OperandList = (ops GPRC:$RDEST, GPRC:$RFALSE, GPRC:$RTRUE, GPRC:$RCOND) in {
186def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000187 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000188def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000189 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000190def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000191 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000192def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000193 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000194def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000195 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000196def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000197 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000198def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000199 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000200def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000201 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))]>;
202}
203
204//FIXME: fold setcc with select for all cases. clearly I need patterns for inverted conditions
205// and constants (which require inverted conditions as legalize puts the constant in the
206// wrong field for the instruction definition
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000207def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000208 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000209
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000210
Andrew Lenharth4907d222005-10-20 00:28:31 +0000211def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000212 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000213def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000214 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000215def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
216 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))]>;
217def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
218 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000219def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
220 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))]>;
221def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
222 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))]>;
223def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
224 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000225def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
226 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000227def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
228 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))]>;
229def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
230 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000231def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000232 [(set GPRC:$RC, (ctlz GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000233def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000234 [(set GPRC:$RC, (ctpop GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000235def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000236 [(set GPRC:$RC, (cttz GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000237def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
238 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000239def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
240 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000241//def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC", []>; //Extract byte low
242//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
243//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
244//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
245//def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC", []>; //Extract longword low
246//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
247//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
248//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
249//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
250//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
251//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
252//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
253//def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC", []>; //Extract word low
254//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
255//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
256//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
257//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
258//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
259//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
260//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
261//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
262//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
263//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
264//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
265//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
266//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
267//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
268//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
269//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
270//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
271//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
272//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
273//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
274//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
275//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
276//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
277//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
278//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
279//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
280//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
281//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
282//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
283//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
284//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000285
Andrew Lenharth4907d222005-10-20 00:28:31 +0000286def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000287 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000288def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000289 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000290def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
291 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))]>;
292def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
293 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8:$L))]>;
294def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
295 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))]>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000296def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
297 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000298def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000299 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000300def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000301 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000302def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000303 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000304def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000305 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000306def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000307 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000308def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000309 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000310def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000311 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000312def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000313 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000314def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000315 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000316def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000317 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000318def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000319 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000320def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000321 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000322def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000323 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000324def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000325 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000326def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000327 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000328def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000329 [(set GPRC:$RC, (sub8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000330def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000331 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000332def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000333 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000334def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
335 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))]>;
336def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
337 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))]>;
338def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
339 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))]>;
340def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
341 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))]>;
342def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
343 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))]>;
344def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
345 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))]>;
346def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000347 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000348def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000349 [(set GPRC:$RC, (intop (sub GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000350def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
351 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))]>;
352def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
353 [(set GPRC:$RC, (sub GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000354def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
355 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))]>;
356def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
357 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000358def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
359 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))]>;
360def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
361 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000362//FIXME: what to do about zap? the cases it catches are very complex
Andrew Lenharth4907d222005-10-20 00:28:31 +0000363def ZAP : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000364//ZAPi is useless give ZAPNOTi
Andrew Lenharth4907d222005-10-20 00:28:31 +0000365def ZAPi : OFormL<0x12, 0x30, "zap $RA,$L,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000366//FIXME: what to do about zapnot? see ZAP :)
Andrew Lenharth4907d222005-10-20 00:28:31 +0000367def ZAPNOT : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", []>; //Zero bytes not
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000368def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
369 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000370
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000371//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000372//So this is a waste of what this instruction can do, but it still saves something
373def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
374 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>;
375def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
376 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>;
377def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
378 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>;
379def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
380 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>;
381def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
382 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>;
383def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
384 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))]>;
385def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
386 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
387def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
388 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
389def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
390 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))]>;
391def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
392 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))]>;
393def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000394 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000395def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000396 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000397
398//Patterns for unsupported int comparisons
399def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
400def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
401
402def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
403def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
404
405def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
406def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
407
408def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
409def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
410
411def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
412def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
413
414def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
415def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
416
417def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
418def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
419
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000420
Evan Cheng2b4ea792005-12-26 09:11:45 +0000421let isReturn = 1, isTerminator = 1, noResults = 1 in
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000422 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 +0000423//DAG Version:
Evan Cheng2b4ea792005-12-26 09:11:45 +0000424let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
Andrew Lenharth4907d222005-10-20 00:28:31 +0000425 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1">; //Return from subroutine
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000426
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000427def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP">; //Jump
Evan Cheng2b4ea792005-12-26 09:11:45 +0000428let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000429 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000430 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000431 F0, F1,
432 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000433 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000434 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", []>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000435}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000436let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000437 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
438 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
439 F0, F1,
440 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
441 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenhartheececba2005-12-25 17:36:48 +0000442 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0">; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000443}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000444
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000445let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
446 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenhartheececba2005-12-25 17:36:48 +0000447 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0">; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000448
Andrew Lenharth53d89702005-12-25 01:34:27 +0000449
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000450def 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 +0000451
Andrew Lenhartheececba2005-12-25 17:36:48 +0000452let Ra = 31 in
453def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)]>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000454
Andrew Lenharth9fa4d4c2005-12-24 03:41:56 +0000455
Andrew Lenharthb6718602005-12-24 07:34:33 +0000456let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
457def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
458 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
459def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
460 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
461def LDL : MForm<0x29, 0, 1, "ldl $RA,$DISP($RB)",
462 [(set GPRC:$RA, (sextload (add GPRC:$RB, immSExt16:$DISP), i32))]>;
463def LDLr : MForm<0x29, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
464 [(set GPRC:$RA, (sextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32))]>;
465def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
466 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i8))]>;
467def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
468 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8))]>;
469def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
470 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i16))]>;
471def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
472 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16))]>;
473def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
474 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)]>;
475def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
476 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)]>;
477def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
478 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)]>;
479def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
480 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)]>;
481def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
482 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)]>;
483def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
484 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)]>;
485def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
486 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
487def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
488 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000489
490//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000491def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
492 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
493def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
494 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>; //Load address
495def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
496 []>; //Load address high
497def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
498 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))]>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000499}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000500
Andrew Lenharthb6718602005-12-24 07:34:33 +0000501let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
502def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
503 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
504def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
505 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
506def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
507 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
508def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
509 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
510}
511let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
512def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
513 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))]>;
514def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
515 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))]>;
516def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
517 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))]>;
518def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
519 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))]>;
520}
521
Andrew Lenharthc687b482005-12-24 08:29:32 +0000522
523//constpool rels
524def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
525 (LDQr tconstpool:$DISP, GPRC:$RB)>;
526def : Pat<(i64 (sextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i32)),
527 (LDLr tconstpool:$DISP, GPRC:$RB)>;
528def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i8)),
529 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
530def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i16)),
531 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
532def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
533 (LDAr tconstpool:$DISP, GPRC:$RB)>;
534def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
535 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
536def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
537 (LDSr tconstpool:$DISP, GPRC:$RB)>;
538def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
539 (LDTr tconstpool:$DISP, GPRC:$RB)>;
540
541
Andrew Lenharthb6718602005-12-24 07:34:33 +0000542//misc ext patterns
543def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i8)),
544 (LDBU immSExt16:$DISP, GPRC:$RB)>;
545def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i16)),
546 (LDWU immSExt16:$DISP, GPRC:$RB)>;
547def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i32)),
548 (LDL immSExt16:$DISP, GPRC:$RB)>;
549
550//0 disp patterns
551def : Pat<(i64 (load GPRC:$addr)),
552 (LDQ 0, GPRC:$addr)>;
553def : Pat<(f64 (load GPRC:$addr)),
554 (LDT 0, GPRC:$addr)>;
555def : Pat<(f32 (load GPRC:$addr)),
556 (LDS 0, GPRC:$addr)>;
557def : Pat<(i64 (sextload GPRC:$addr, i32)),
558 (LDL 0, GPRC:$addr)>;
559def : Pat<(i64 (zextload GPRC:$addr, i16)),
560 (LDWU 0, GPRC:$addr)>;
561def : Pat<(i64 (zextload GPRC:$addr, i8)),
562 (LDBU 0, GPRC:$addr)>;
563def : Pat<(i64 (extload GPRC:$addr, i8)),
564 (LDBU 0, GPRC:$addr)>;
565def : Pat<(i64 (extload GPRC:$addr, i16)),
566 (LDWU 0, GPRC:$addr)>;
567def : Pat<(i64 (extload GPRC:$addr, i32)),
568 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000569
Andrew Lenharthc687b482005-12-24 08:29:32 +0000570def : Pat<(store GPRC:$DATA, GPRC:$addr),
571 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
572def : Pat<(store F8RC:$DATA, GPRC:$addr),
573 (STT F8RC:$DATA, 0, GPRC:$addr)>;
574def : Pat<(store F4RC:$DATA, GPRC:$addr),
575 (STS F4RC:$DATA, 0, GPRC:$addr)>;
576def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i32),
577 (STL GPRC:$DATA, 0, GPRC:$addr)>;
578def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i16),
579 (STW GPRC:$DATA, 0, GPRC:$addr)>;
580def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i8),
581 (STB GPRC:$DATA, 0, GPRC:$addr)>;
582
Andrew Lenharth4e629512005-12-24 05:36:33 +0000583
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000584//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000585let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
586def LDAg : MFormAlt<0x08, "lda $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
587def LDAHg : MFormAlt<0x09, "ldah $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
588}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000589
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000590//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000591let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000592def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
593 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))]>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000594def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
595 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000596
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000597//Branches, int
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000598def BEQ : BForm<0x39, "beq $RA,$DISP">; //Branch if = zero
599def BGE : BForm<0x3E, "bge $RA,$DISP">; //Branch if >= zero
600def BGT : BForm<0x3F, "bgt $RA,$DISP">; //Branch if > zero
601def BLBC : BForm<0x38, "blbc $RA,$DISP">; //Branch if low bit clear
602def BLBS : BForm<0x3C, "blbs $RA,$DISP">; //Branch if low bit set
603def BLE : BForm<0x3B, "ble $RA,$DISP">; //Branch if <= zero
604def BLT : BForm<0x3A, "blt $RA,$DISP">; //Branch if < zero
605def BNE : BForm<0x3D, "bne $RA,$DISP">; //Branch if != zero
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000606
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000607//Branches, float
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000608def FBEQ : FBForm<0x31, "fbeq $RA,$DISP">; //Floating branch if = zero
609def FBGE : FBForm<0x36, "fbge $RA,$DISP">; //Floating branch if >= zero
610def FBGT : FBForm<0x37, "fbgt $RA,$DISP">; //Floating branch if > zero
611def FBLE : FBForm<0x33, "fble $RA,$DISP">; //Floating branch if <= zero
612def FBLT : FBForm<0x32, "fblt $RA,$DISP">; //Floating branch if < zero
613def FBNE : FBForm<0x35, "fbne $RA,$DISP">; //Floating branch if != zero
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000614
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000615def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA">; //Read process cycle counter
616
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000617//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000618
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000619//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000620
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000621let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
622def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
623 [(set F4RC:$RC, (fsqrt F4RC:$RB))]>;
624
625let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
626def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
627 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))]>;
628def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
629 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))]>;
630def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
631 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))]>;
632def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
633 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))]>;
634
635def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
636def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
637def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
638}
639
640//Doubles
641
642let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
643def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
644 [(set F8RC:$RC, (fsqrt F8RC:$RB))]>;
645
646let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
647def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
648 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))]>;
649def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
650 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))]>;
651def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
652 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))]>;
653def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
654 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))]>;
655
656def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
657def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
658def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
659
660def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", []>;
661// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
662def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", []>;
663// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
664def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", []>;
665// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
666def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", []>;
667// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
668}
669//TODO: Add lots more FP patterns
670
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000671//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000672let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000673 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000674def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if = zero
675def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if >= zero
676def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if > zero
677def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if <= zero
678def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[]>; // FCMOVE if < zero
679def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[]>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000680}
681//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000682let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000683 isTwoAddress = 1 in {
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000684def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", []>;
685def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", []>;
686def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", []>;
687def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", []>;
688def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", []>;
689def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", []>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000690}
691
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000692//misc FP selects
693//Select double
694def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000695 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000696def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
697 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000698def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000699 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000700def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000701 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000702def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000703 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000704def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000705 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000706//Select single
707def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000708 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000709def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
710 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000711def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000712 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000713def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000714 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000715def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000716 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000717def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000718 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000719
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000720
721
722let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
723def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[]>; //Floating to integer move, S_floating
724let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000725def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
726 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))]>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000727let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
728def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[]>; //Integer to floating move, S_floating
729let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000730def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
731 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))]>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000732
733
734let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000735def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
736 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000737let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000738def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
739 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000740let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000741def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
742 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000743let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
744def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
745 [(set F8RC:$RC, (fextend F4RC:$RB))]>;
746let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
747def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
748 [(set F4RC:$RC, (fround F8RC:$RB))]>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000749
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000750//S_floating : IEEE Single
751//T_floating : IEEE Double
752
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000753//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000754//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000755//CALL_PAL Pcd 00 Trap to PALcode
756//ECB Mfc 18.E800 Evict cache block
757//EXCB Mfc 18.0400 Exception barrier
758//FETCH Mfc 18.8000 Prefetch data
759//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000760//LDL_L Mem 2A Load sign-extended longword locked
761//LDQ_L Mem 2B Load quadword locked
762//LDQ_U Mem 0B Load unaligned quadword
763//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000764//STL_C Mem 2E Store longword conditional
765//STQ_C Mem 2F Store quadword conditional
766//STQ_U Mem 0F Store unaligned quadword
767//TRAPB Mfc 18.0000 Trap barrier
768//WH64 Mfc 18.F800 Write hint  64 bytes
769//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000770//MF_FPCR F-P 17.025 Move from FPCR
771//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000772//There are in the Multimedia extentions, so let's not use them yet
773//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
774//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
775//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
776//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
777//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
778//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
779//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
780//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
781//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
782//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
783//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
784//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
785//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
786//CVTLQ F-P 17.010 Convert longword to quadword
787//CVTQL F-P 17.030 Convert quadword to longword
788//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
789//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
790
791
Andrew Lenharth50b37842005-11-22 04:20:06 +0000792//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000793
Andrew Lenharth50b37842005-11-22 04:20:06 +0000794def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000795 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +0000796 int64_t val = (int64_t)N->getValue();
797 return (val <= (int64_t)IMM_HIGH +(int64_t)IMM_HIGH* (int64_t)IMM_MULT &
798 val >= (int64_t)IMM_LOW + (int64_t)IMM_LOW * (int64_t)IMM_MULT);
799}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000800def immConst2PartInt : PatLeaf<(imm), [{
801 //true if imm fits in a LDAH LDA pair with zeroext
802 uint64_t uval = N->getValue();
803 int32_t val32 = (int32_t)uval;
804 return ((uval >> 32) == 0 && //empty upper bits
805 val32 <= IMM_HIGH + IMM_HIGH * IMM_MULT &&
806 val32 >= IMM_LOW + IMM_LOW * IMM_MULT);
807}], SExtInt>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000808
809//TODO: factor this out
810def LL16 : SDNodeXForm<imm, [{
811int64_t l = N->getValue();
812 int64_t y = l / IMM_MULT;
813 if (l % IMM_MULT > IMM_HIGH)
814 ++y;
815 return getI64Imm(l - y * IMM_MULT);
816}]>;
817//TODO: factor this out
818def LH16 : SDNodeXForm<imm, [{
819int64_t l = N->getValue();
820 int64_t y = l / IMM_MULT;
821 if (l % IMM_MULT > IMM_HIGH)
822 ++y;
823 return getI64Imm(y);
824}]>;
825
826def : Pat<(i64 immConst2Part:$imm),
827 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000828
829def : Pat<(i64 immSExt16:$imm),
830 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000831
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000832def : Pat<(i64 immSExt16int:$imm),
833 (ZAPNOTi (LDA (SExtInt immSExt16int:$imm), R31), 15)>;
834def : Pat<(i64 immConst2PartInt:$imm),
835 (ZAPNOTi (LDA (LL16 (SExtInt immConst2PartInt:$imm)),
836 (LDAH (LH16 (SExtInt immConst2PartInt:$imm)), R31)), 15)>;
837
838
Andrew Lenharth50b37842005-11-22 04:20:06 +0000839//TODO: I want to just define these like this!
840//def : Pat<(i64 0),
841// (R31)>;
842//def : Pat<(f64 0.0),
843// (F31)>;
844//def : Pat<(f64 -0.0),
845// (CPYSNT F31, F31)>;
846//def : Pat<(f32 0.0),
847// (F31)>;
848//def : Pat<(f32 -0.0),
849// (CPYSNS F31, F31)>;
850
851//Misc Patterns:
852
853def : Pat<(sext_inreg GPRC:$RB, i32),
854 (ADDLi GPRC:$RB, 0)>;
855
856def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
857 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; //may be CMOVNE
858
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000859def : Pat<(fabs F8RC:$RB),
860 (CPYST F31, F8RC:$RB)>;
861def : Pat<(fabs F4RC:$RB),
862 (CPYSS F31, F4RC:$RB)>;
863def : Pat<(fneg F8RC:$RB),
864 (CPYSNT F8RC:$RB, F8RC:$RB)>;
865def : Pat<(fneg F4RC:$RB),
866 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthcd804962005-11-30 16:10:29 +0000867//Yes, signed multiply high is ugly
868def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
869 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
870 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;