blob: 82618f925d47e5dae4ee110ccd876f1bb93f8947 [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 Lenharth7f0db912005-11-30 07:19:56 +000028
Andrew Lenharth79620652005-12-05 20:50:53 +000029// These are target-independent nodes, but have target-specific formats.
30def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
31def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
32def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,[SDNPHasChain]>;
33
Andrew Lenharth7f0db912005-11-30 07:19:56 +000034
35//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000036//Paterns for matching
37//********************
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000038
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000039def immUExt8 : PatLeaf<(imm), [{
40 // immUExt8 predicate - True if the immediate fits in a 8-bit zero extended
41 // field. Used by instructions like 'addi'.
42 return (unsigned long)N->getValue() == (unsigned char)N->getValue();
43}]>;
44def immSExt16 : PatLeaf<(imm), [{
45 // immSExt16 predicate - True if the immediate fits in a 16-bit sign extended
46 // field. Used by instructions like 'lda'.
47 return (int)N->getValue() == (short)N->getValue();
48}]>;
49
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000050def iZAPX : SDNodeXForm<imm, [{
51 // Transformation function: get the imm to ZAPi
52 uint64_t UImm = (uint64_t)N->getValue();
53 unsigned int build = 0;
54 for(int i = 0; i < 8; ++i)
55 {
56 if ((UImm & 0x00FF) == 0x00FF)
57 build |= 1 << i;
58 else if ((UImm & 0x00FF) != 0)
59 { build = 0; break; }
60 UImm >>= 8;
61 }
62 return getI64Imm(build);
63}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000064def immZAP : PatLeaf<(imm), [{
65 // immZAP predicate - True if the immediate fits is suitable for use in a
66 // ZAP instruction
67 uint64_t UImm = (uint64_t)N->getValue();
68 unsigned int build = 0;
69 for(int i = 0; i < 8; ++i)
70 {
71 if ((UImm & 0x00FF) == 0x00FF)
72 build |= 1 << i;
73 else if ((UImm & 0x00FF) != 0)
74 { build = 0; break; }
75 UImm >>= 8;
76 }
77 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +000078}], iZAPX>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000079
80
81def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
82def add4 : PatFrag<(ops node:$op1, node:$op2),
83 (add (shl node:$op1, 2), node:$op2)>;
84def sub4 : PatFrag<(ops node:$op1, node:$op2),
85 (sub (shl node:$op1, 2), node:$op2)>;
86def add8 : PatFrag<(ops node:$op1, node:$op2),
87 (add (shl node:$op1, 3), node:$op2)>;
88def sub8 : PatFrag<(ops node:$op1, node:$op2),
89 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +000090
Andrew Lenharth304d0f32005-01-22 23:41:55 +000091 // //#define FP $15
92 // //#define RA $26
93 // //#define PV $27
94 // //#define GP $29
95 // //#define SP $30
96
Andrew Lenharth50b37842005-11-22 04:20:06 +000097def PHI : PseudoInstAlpha<(ops variable_ops), "#phi", []>;
98
99def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
100 [(set GPRC:$RA, (undef))]>;
101def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
102 [(set F4RC:$RA, (undef))]>;
103def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
104 [(set F8RC:$RA, (undef))]>;
105
106def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", []>;
Andrew Lenharth79620652005-12-05 20:50:53 +0000107def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "ADJUP",
108 [(callseq_start imm:$amt)]>;
109def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "ADJDOWN",
110 [(callseq_end imm:$amt)]>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000111def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$TARGET:\n", []>;
112def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[]>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000113def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000114 "LSMARKER$$$i$$$j$$$k$$$m:\n",[]>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000115
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000116//*****************
117//These are shortcuts, the assembler expands them
118//*****************
119//AT = R28
120//T0-T7 = R1 - R8
121//T8-T11 = R22-R25
122
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000123//An even better improvement on the Int = SetCC(FP): SelectCC!
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000124//These are evil because they hide control flow in a MBB
125//really the ISel should emit multiple MBB
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000126let isTwoAddress = 1 in {
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000127//Conditional move of an int based on a FP CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000128 def CMOVEQ_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000129 "fbne $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000130 def CMOVEQi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000131 "fbne $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000132
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000133 def CMOVNE_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000134 "fbeq $RCOND, 42f\n\tbis $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000135 def CMOVNEi_FP : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, u8imm:$L, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000136 "fbeq $RCOND, 42f\n\taddq $$31,$L,$RDEST\n42:\n", []>;
Andrew Lenharth0eaf6ce2005-04-02 21:06:51 +0000137//Conditional move of an FP based on a Int CC
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000138 def FCMOVEQ_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000139 "bne $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000140 def FCMOVNE_INT : PseudoInstAlpha<(ops GPRC:$RDEST, GPRC:$RSRC_F, GPRC:$RSRC_T, F8RC:$RCOND),
Andrew Lenharth50b37842005-11-22 04:20:06 +0000141 "beq $RCOND, 42f\n\tcpys $RSRC_T,$RSRC_T,$RDEST\n42:\n", []>;
Andrew Lenharthdc0b71b2005-03-22 00:24:07 +0000142}
Andrew Lenharthca3d59b2005-03-14 19:23:45 +0000143
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000144//***********************
145//Real instructions
146//***********************
147
148//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000149
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000150//conditional moves, int
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000151def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RSRC,$RDEST">; //CMOVE if RCOND = zero
152def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$L,$RDEST">; //CMOVE if RCOND = zero
153def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RSRC,$RDEST">; //CMOVE if RCOND >= zero
154def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$L,$RDEST">; //CMOVE if RCOND >= zero
155def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RSRC,$RDEST">; //CMOVE if RCOND > zero
156def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$L,$RDEST">; //CMOVE if RCOND > zero
157def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RSRC,$RDEST">; //CMOVE if RCOND low bit clear
158def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit clear
159def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RSRC,$RDEST">; //CMOVE if RCOND low bit set
160def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$L,$RDEST">; //CMOVE if RCOND low bit set
161def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RSRC,$RDEST">; //CMOVE if RCOND <= zero
162def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$L,$RDEST">; //CMOVE if RCOND <= zero
163def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RSRC,$RDEST">; //CMOVE if RCOND < zero
164def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$L,$RDEST">; //CMOVE if RCOND < zero
165def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RSRC,$RDEST">; //CMOVE if RCOND != zero
166def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$L,$RDEST">; //CMOVE if RCOND != zero
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000167
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000168//FIXME: fold setcc with select
169def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
170 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>;
171
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000172
Andrew Lenharth4907d222005-10-20 00:28:31 +0000173def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000174 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000175def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000176 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000177def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
178 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))]>;
179def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
180 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000181def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
182 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))]>;
183def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
184 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))]>;
185def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
186 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))]>;
187def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC", []>;
188// [(set GPRC:$RC, (and GPRC:$RA, (not immUExt8:$L)))]>; //FIXME?
189def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
190 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))]>;
191def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
192 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000193def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000194 [(set GPRC:$RC, (ctlz GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000195def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000196 [(set GPRC:$RC, (ctpop GPRC:$RB))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000197def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000198 [(set GPRC:$RC, (cttz GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000199def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
200 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))]>;
201def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC", []>;
202// [(set GPRC:$RC, (xor GPRC:$RA, (not immUExt8:$L)))]>;
203//def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC", []>; //Extract byte low
204//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
205//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
206//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
207//def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC", []>; //Extract longword low
208//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
209//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
210//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
211//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
212//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
213//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
214//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
215//def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC", []>; //Extract word low
216//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
217//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
218//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
219//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
220//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
221//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
222//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
223//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
224//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
225//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
226//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
227//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
228//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
229//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
230//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
231//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
232//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
233//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
234//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
235//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
236//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
237//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
238//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
239//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
240//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
241//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
242//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
243//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
244//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
245//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
246//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000247
Andrew Lenharth4907d222005-10-20 00:28:31 +0000248def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000249 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000250def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000251 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000252def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
253 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))]>;
254def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
255 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8:$L))]>;
256def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
257 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))]>;
258def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC", []>;
259// [(set GPRC:$RC, (or GPRC:$RA, (not immUExt8:$L)))]>;
260def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000261 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000262def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000263 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000264def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000265 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000266def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000267 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000268def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000269 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000270def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000271 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000272def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000273 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000274def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000275 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000276def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000277 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000278def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000279 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000280def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000281 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000282def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000283 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000284def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Chris Lattnerae4be982005-10-20 04:21:06 +0000285 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000286def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000287 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000288def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000289 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000290def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000291 [(set GPRC:$RC, (sub8 GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000292def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000293 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))]>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000294def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000295 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000296def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
297 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))]>;
298def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
299 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))]>;
300def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
301 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))]>;
302def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
303 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))]>;
304def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
305 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))]>;
306def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
307 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))]>;
308def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000309 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000310def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharth892ade72005-10-20 14:42:48 +0000311 [(set GPRC:$RC, (intop (sub GPRC:$RA, immUExt8:$L)))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000312def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
313 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))]>;
314def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
315 [(set GPRC:$RC, (sub GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000316def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
317 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))]>;
318def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
319 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000320def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
321 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))]>;
322def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
323 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000324//FIXME: what to do about zap? the cases it catches are very complex
Andrew Lenharth4907d222005-10-20 00:28:31 +0000325def ZAP : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000326//ZAPi is useless give ZAPNOTi
Andrew Lenharth4907d222005-10-20 00:28:31 +0000327def ZAPi : OFormL<0x12, 0x30, "zap $RA,$L,$RC", []>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000328//FIXME: what to do about zapnot? see ZAP :)
Andrew Lenharth4907d222005-10-20 00:28:31 +0000329def ZAPNOT : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", []>; //Zero bytes not
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000330def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
331 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))]>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000332
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000333//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000334//So this is a waste of what this instruction can do, but it still saves something
335def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
336 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))]>;
337def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
338 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))]>;
339def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
340 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))]>;
341def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
342 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))]>;
343def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
344 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))]>;
345def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
346 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))]>;
347def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
348 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))]>;
349def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
350 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))]>;
351def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
352 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))]>;
353def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
354 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))]>;
355def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000356 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000357def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth50b37842005-11-22 04:20:06 +0000358 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))]>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000359
360//Patterns for unsupported int comparisons
361def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
362def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
363
364def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
365def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
366
367def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
368def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
369
370def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
371def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
372
373def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
374def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
375
376def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
377def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
378
379def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
380def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
381
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000382
Andrew Lenharth4907d222005-10-20 00:28:31 +0000383let isReturn = 1, isTerminator = 1 in
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000384 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 +0000385//DAG Version:
386let isReturn = 1, isTerminator = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
387 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1">; //Return from subroutine
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000388
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000389def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP">; //Jump
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000390let isCall = 1,
391 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenharth63f2ab22005-02-10 06:25:22 +0000392 R20, R21, R22, R23, R24, R25, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000393 F0, F1,
394 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000395 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000396 def JSR : MbrForm< 0x1A, 0x01, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr $RD,($RS),$DISP">; //Jump to subroutine
397 def BSR : BForm<0x34, "bsr $RA,$DISP">; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000398}
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000399let isCall = 1,
400 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
401 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
402 F0, F1,
403 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
404 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
405 def JSRDAG : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0">; //Jump to subroutine
406}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000407let isCall = 1, Defs = [R24, R25, R27, R28], Uses = [R24, R25] in
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000408 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 +0000409
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000410def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP">; //Jump to subroutine return
411def BR : BForm<0x30, "br $RA,$DISP">; //Branch
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000412
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000413def BR_DAG : BFormD<0x30, "br $$31,$DISP">; //Branch
414
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000415//Stores, int
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000416def STB : MForm<0x0E, "stb $RA,$DISP($RB)">; // Store byte
417def STW : MForm<0x0D, "stw $RA,$DISP($RB)">; // Store word
418def STL : MForm<0x2C, "stl $RA,$DISP($RB)">; // Store longword
419def STQ : MForm<0x2D, "stq $RA,$DISP($RB)">; //Store quadword
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000420
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000421//Loads, int
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000422def LDL : MForm<0x28, "ldl $RA,$DISP($RB)">; // Load sign-extended longword
423def LDQ : MForm<0x29, "ldq $RA,$DISP($RB)">; //Load quadword
424def LDBU : MForm<0x0A, "ldbu $RA,$DISP($RB)">; //Load zero-extended byte
425def LDWU : MForm<0x0C, "ldwu $RA,$DISP($RB)">; //Load zero-extended word
Andrew Lenharth2f8fb772005-01-25 00:35:34 +0000426
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000427//Stores, float
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000428let OperandList = (ops F4RC:$RA, s16imm:$DISP, GPRC:$RB) in
429def STS : MFormAlt<0x26, "sts $RA,$DISP($RB)">; //Store S_floating
430let OperandList = (ops F8RC:$RA, s16imm:$DISP, GPRC:$RB) in
431def STT : MFormAlt<0x27, "stt $RA,$DISP($RB)">; //Store T_floating
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000432
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000433//Loads, float
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000434let OperandList = (ops F4RC:$RA, s16imm:$DISP, GPRC:$RB) in
435def LDS : MFormAlt<0x22, "lds $RA,$DISP($RB)">; //Load S_floating
436let OperandList = (ops F8RC:$RA, s16imm:$DISP, GPRC:$RB) in
437def LDT : MFormAlt<0x23, "ldt $RA,$DISP($RB)">; //Load T_floating
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000438
439//Load address
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000440def LDA : MForm<0x08, "lda $RA,$DISP($RB)">; //Load address
441def LDAH : MForm<0x09, "ldah $RA,$DISP($RB)">; //Load address high
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000442
443
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000444//Loads, int, Rellocated Low form
Andrew Lenharth1f3e8082005-08-12 16:14:08 +0000445def LDLr : MForm<0x28, "ldl $RA,$DISP($RB)\t\t!gprellow">; // Load sign-extended longword
446def LDQr : MForm<0x29, "ldq $RA,$DISP($RB)\t\t!gprellow">; //Load quadword
447def LDBUr : MForm<0x0A, "ldbu $RA,$DISP($RB)\t\t!gprellow">; //Load zero-extended byte
448def LDWUr : MForm<0x0C, "ldwu $RA,$DISP($RB)\t\t!gprellow">; //Load zero-extended word
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000449
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000450//Loads, float, Rellocated Low form
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000451let OperandList = (ops F4RC:$RA, s16imm:$DISP, GPRC:$RB) in
452def LDSr : MFormAlt<0x22, "lds $RA,$DISP($RB)\t\t!gprellow">; //Load S_floating
453let OperandList = (ops F8RC:$RA, s16imm:$DISP, GPRC:$RB) in
454def LDTr : MFormAlt<0x23, "ldt $RA,$DISP($RB)\t\t!gprellow">; //Load T_floating
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000455
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000456//Load address, rellocated low and high form
Andrew Lenharth1f3e8082005-08-12 16:14:08 +0000457def LDAr : MForm<0x08, "lda $RA,$DISP($RB)\t\t!gprellow">; //Load address
458def LDAHr : MForm<0x09, "ldah $RA,$DISP($RB)\t\t!gprelhigh">; //Load address high
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000459
460//load address, rellocated gpdist form
Andrew Lenharth1f3e8082005-08-12 16:14:08 +0000461def LDAg : MgForm<0x08, "lda $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
462def LDAHg : MgForm<0x09, "ldah $RA,0($RB)\t\t!gpdisp!$NUM">; //Load address
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000463
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000464
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000465//Load quad, rellocated literal form
Andrew Lenharth1f3e8082005-08-12 16:14:08 +0000466def LDQl : MForm<0x29, "ldq $RA,$DISP($RB)\t\t!literal">; //Load quadword
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000467
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000468//Stores, int
Andrew Lenharth1f3e8082005-08-12 16:14:08 +0000469def STBr : MForm<0x0E, "stb $RA,$DISP($RB)\t\t!gprellow">; // Store byte
470def STWr : MForm<0x0D, "stw $RA,$DISP($RB)\t\t!gprellow">; // Store word
471def STLr : MForm<0x2C, "stl $RA,$DISP($RB)\t\t!gprellow">; // Store longword
472def STQr : MForm<0x2D, "stq $RA,$DISP($RB)\t\t!gprellow">; //Store quadword
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000473
474//Stores, float
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000475let OperandList = (ops F4RC:$RA, s16imm:$DISP, GPRC:$RB) in
476def STSr : MFormAlt<0x26, "sts $RA,$DISP($RB)\t\t!gprellow">; //Store S_floating
477let OperandList = (ops F8RC:$RA, s16imm:$DISP, GPRC:$RB) in
478def STTr : MFormAlt<0x27, "stt $RA,$DISP($RB)\t\t!gprellow">; //Store T_floating
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000479
480
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000481//Branches, int
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000482def BEQ : BForm<0x39, "beq $RA,$DISP">; //Branch if = zero
483def BGE : BForm<0x3E, "bge $RA,$DISP">; //Branch if >= zero
484def BGT : BForm<0x3F, "bgt $RA,$DISP">; //Branch if > zero
485def BLBC : BForm<0x38, "blbc $RA,$DISP">; //Branch if low bit clear
486def BLBS : BForm<0x3C, "blbs $RA,$DISP">; //Branch if low bit set
487def BLE : BForm<0x3B, "ble $RA,$DISP">; //Branch if <= zero
488def BLT : BForm<0x3A, "blt $RA,$DISP">; //Branch if < zero
489def BNE : BForm<0x3D, "bne $RA,$DISP">; //Branch if != zero
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000490
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000491//Branches, float
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000492def FBEQ : FBForm<0x31, "fbeq $RA,$DISP">; //Floating branch if = zero
493def FBGE : FBForm<0x36, "fbge $RA,$DISP">; //Floating branch if >= zero
494def FBGT : FBForm<0x37, "fbgt $RA,$DISP">; //Floating branch if > zero
495def FBLE : FBForm<0x33, "fble $RA,$DISP">; //Floating branch if <= zero
496def FBLT : FBForm<0x32, "fblt $RA,$DISP">; //Floating branch if < zero
497def FBNE : FBForm<0x35, "fbne $RA,$DISP">; //Floating branch if != zero
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000498
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000499def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA">; //Read process cycle counter
500
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000501//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000502
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000503//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000504
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000505let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
506def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
507 [(set F4RC:$RC, (fsqrt F4RC:$RB))]>;
508
509let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
510def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
511 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))]>;
512def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
513 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))]>;
514def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
515 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))]>;
516def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
517 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))]>;
518
519def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
520def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
521def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
522}
523
524//Doubles
525
526let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
527def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
528 [(set F8RC:$RC, (fsqrt F8RC:$RB))]>;
529
530let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
531def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
532 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))]>;
533def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
534 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))]>;
535def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
536 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))]>;
537def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
538 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))]>;
539
540def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",[]>; //Copy sign
541def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[]>; //Copy sign and exponent
542def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",[]>; //Copy sign negate
543
544def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", []>;
545// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
546def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", []>;
547// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
548def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", []>;
549// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
550def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", []>;
551// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
552}
553//TODO: Add lots more FP patterns
554
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000555//conditional moves, floats
556let OperandList = (ops F4RC:$RDEST, F4RC:$RSRC2, F4RC:$RSRC, F8RC:$RCOND),
557 isTwoAddress = 1 in {
558def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if = zero
559def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if >= zero
560def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if > zero
561def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if <= zero
562def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RSRC,$RDEST",[]>; // FCMOVE if < zero
563def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if != zero
564}
565//conditional moves, doubles
566let OperandList = (ops F8RC:$RDEST, F8RC:$RSRC2, F8RC:$RSRC, F8RC:$RCOND),
567 isTwoAddress = 1 in {
568def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if = zero
569def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if >= zero
570def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if > zero
571def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if <= zero
572def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RSRC,$RDEST",[]>; // FCMOVE if < zero
573def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RSRC,$RDEST",[]>; //FCMOVE if != zero
574}
575
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000576
577
578let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
579def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[]>; //Floating to integer move, S_floating
580let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000581def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
582 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))]>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000583let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
584def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[]>; //Integer to floating move, S_floating
585let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000586def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
587 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))]>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000588
589
590let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000591def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
592 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000593let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000594def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
595 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000596let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000597def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
598 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))]>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000599let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
600def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
601 [(set F8RC:$RC, (fextend F4RC:$RB))]>;
602let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
603def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
604 [(set F4RC:$RC, (fround F8RC:$RB))]>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000605
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000606//S_floating : IEEE Single
607//T_floating : IEEE Double
608
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000609//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000610//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000611//CALL_PAL Pcd 00 Trap to PALcode
612//ECB Mfc 18.E800 Evict cache block
613//EXCB Mfc 18.0400 Exception barrier
614//FETCH Mfc 18.8000 Prefetch data
615//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000616//LDL_L Mem 2A Load sign-extended longword locked
617//LDQ_L Mem 2B Load quadword locked
618//LDQ_U Mem 0B Load unaligned quadword
619//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000620//STL_C Mem 2E Store longword conditional
621//STQ_C Mem 2F Store quadword conditional
622//STQ_U Mem 0F Store unaligned quadword
623//TRAPB Mfc 18.0000 Trap barrier
624//WH64 Mfc 18.F800 Write hint  64 bytes
625//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000626//MF_FPCR F-P 17.025 Move from FPCR
627//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000628//There are in the Multimedia extentions, so let's not use them yet
629//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
630//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
631//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
632//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
633//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
634//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
635//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
636//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
637//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
638//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
639//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
640//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
641//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
642//CVTLQ F-P 17.010 Convert longword to quadword
643//CVTQL F-P 17.030 Convert quadword to longword
644//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
645//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
646
647
Andrew Lenharth50b37842005-11-22 04:20:06 +0000648//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000649
Andrew Lenharth50b37842005-11-22 04:20:06 +0000650def immConst2Part : PatLeaf<(imm), [{
651 // immZAP predicate - True if the immediate fits is suitable for use in a
652 // ZAP instruction
653 int64_t val = (int64_t)N->getValue();
654 return (val <= (int64_t)IMM_HIGH +(int64_t)IMM_HIGH* (int64_t)IMM_MULT &
655 val >= (int64_t)IMM_LOW + (int64_t)IMM_LOW * (int64_t)IMM_MULT);
656}]>;
657
658//TODO: factor this out
659def LL16 : SDNodeXForm<imm, [{
660int64_t l = N->getValue();
661 int64_t y = l / IMM_MULT;
662 if (l % IMM_MULT > IMM_HIGH)
663 ++y;
664 return getI64Imm(l - y * IMM_MULT);
665}]>;
666//TODO: factor this out
667def LH16 : SDNodeXForm<imm, [{
668int64_t l = N->getValue();
669 int64_t y = l / IMM_MULT;
670 if (l % IMM_MULT > IMM_HIGH)
671 ++y;
672 return getI64Imm(y);
673}]>;
674
675def : Pat<(i64 immConst2Part:$imm),
676 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000677
678def : Pat<(i64 immSExt16:$imm),
679 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000680
681//TODO: I want to just define these like this!
682//def : Pat<(i64 0),
683// (R31)>;
684//def : Pat<(f64 0.0),
685// (F31)>;
686//def : Pat<(f64 -0.0),
687// (CPYSNT F31, F31)>;
688//def : Pat<(f32 0.0),
689// (F31)>;
690//def : Pat<(f32 -0.0),
691// (CPYSNS F31, F31)>;
692
693//Misc Patterns:
694
695def : Pat<(sext_inreg GPRC:$RB, i32),
696 (ADDLi GPRC:$RB, 0)>;
697
698def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
699 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; //may be CMOVNE
700
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000701def : Pat<(fabs F8RC:$RB),
702 (CPYST F31, F8RC:$RB)>;
703def : Pat<(fabs F4RC:$RB),
704 (CPYSS F31, F4RC:$RB)>;
705def : Pat<(fneg F8RC:$RB),
706 (CPYSNT F8RC:$RB, F8RC:$RB)>;
707def : Pat<(fneg F4RC:$RB),
708 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthcd804962005-11-30 16:10:29 +0000709//Yes, signed multiply high is ugly
710def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
711 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
712 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;