blob: 1422466e3f373511ee0cbd064099d32e3157a400 [file] [log] [blame]
Misha Brukmanbc9ccf62005-02-04 20:25:52 +00001//===- AlphaInstrInfo.td - The Alpha Instruction Set -------*- tablegen -*-===//
Andrew Lenharth304d0f32005-01-22 23:41:55 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//
11//===----------------------------------------------------------------------===//
12
13include "AlphaInstrFormats.td"
14
Andrew Lenharth4907d222005-10-20 00:28:31 +000015//********************
Andrew Lenharth7f0db912005-11-30 07:19:56 +000016//Custom DAG Nodes
17//********************
18
19def SDTFPUnaryOpUnC : SDTypeProfile<1, 1, [
20 SDTCisFP<1>, SDTCisFP<0>
21]>;
Andrew Lenharth167bc6e2006-01-23 20:59:50 +000022def Alpha_itoft : SDNode<"AlphaISD::ITOFT_", SDTIntToFPOp, []>;
23def Alpha_ftoit : SDNode<"AlphaISD::FTOIT_", SDTFPToIntOp, []>;
24def Alpha_cvtqt : SDNode<"AlphaISD::CVTQT_", SDTFPUnaryOpUnC, []>;
25def Alpha_cvtqs : SDNode<"AlphaISD::CVTQS_", SDTFPUnaryOpUnC, []>;
26def Alpha_cvttq : SDNode<"AlphaISD::CVTTQ_" , SDTFPUnaryOp, []>;
27def Alpha_gprello : SDNode<"AlphaISD::GPRelLo", SDTIntBinOp, []>;
28def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
29def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +000030
Andrew Lenharth79620652005-12-05 20:50:53 +000031// These are target-independent nodes, but have target-specific formats.
32def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
33def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
34def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_AlphaCallSeq,[SDNPHasChain]>;
35
Andrew Lenharth7f0db912005-11-30 07:19:56 +000036//********************
Andrew Lenharth4907d222005-10-20 00:28:31 +000037//Paterns for matching
38//********************
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000039def invX : SDNodeXForm<imm, [{ //invert
Andrew Lenhartheda80a02005-12-06 00:33:53 +000040 return getI64Imm(~N->getValue());
41}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000042def negX : SDNodeXForm<imm, [{ //negate
43 return getI64Imm(~N->getValue() + 1);
Andrew Lenharth756fbeb2005-10-22 22:06:58 +000044}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000045def SExt32 : SDNodeXForm<imm, [{ //signed extend int to long
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +000046 return getI64Imm(((int64_t)N->getValue() << 32) >> 32);
47}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000048def SExt16 : SDNodeXForm<imm, [{ //signed extend int to long
49 return getI64Imm(((int64_t)N->getValue() << 48) >> 48);
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000050}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000051def LL16 : SDNodeXForm<imm, [{ //lda part of constant
52 return getI64Imm(get_lda16(N->getValue()));
53}]>;
54def LH16 : SDNodeXForm<imm, [{ //ldah part of constant (or more if too big)
55 return getI64Imm(get_ldah16(N->getValue()));
56}]>;
57def iZAPX : SDNodeXForm<imm, [{ // get imm to ZAPi
58 return getI64Imm(get_zapImm((uint64_t)N->getValue()));
59}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000060def nearP2X : SDNodeXForm<imm, [{
61 return getI64Imm(Log2_64(getNearPower2((uint64_t)N->getValue())));
62}]>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000063
64def immUExt8 : PatLeaf<(imm), [{ //imm fits in 8 bit zero extended field
65 return (uint64_t)N->getValue() == (uint8_t)N->getValue();
66}]>;
67def immUExt8inv : PatLeaf<(imm), [{ //inverted imm fits in 8 bit zero extended field
68 return (uint64_t)~N->getValue() == (uint8_t)~N->getValue();
69}], invX>;
70def immUExt8neg : PatLeaf<(imm), [{ //negated imm fits in 8 bit zero extended field
71 return ((uint64_t)~N->getValue() + 1) == (uint8_t)((uint64_t)~N->getValue() + 1);
72}], negX>;
73def immSExt16 : PatLeaf<(imm), [{ //imm fits in 16 bit sign extended field
74 return ((int64_t)N->getValue() << 48) >> 48 == (int64_t)N->getValue();
75}]>;
76def immSExt16int : PatLeaf<(imm), [{ //(int)imm fits in a 16 bit sign extended field
77 return ((int64_t)N->getValue() << 48) >> 48 == ((int64_t)N->getValue() << 32) >> 32;
78}], SExt16>;
79def immZAP : PatLeaf<(imm), [{ //imm is good for zapi
80 uint64_t build = get_zapImm((uint64_t)N->getValue());
Andrew Lenharthfe9234d2005-10-21 01:24:05 +000081 return build != 0;
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +000082}], iZAPX>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +000083def immFPZ : PatLeaf<(fpimm), [{ //the only fpconstant nodes are +/- 0.0
84 return true;
85}]>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +000086def immRem1 : PatLeaf<(imm), [{
87 return (int64_t)getNearPower2((uint64_t)N->getValue()) - (int64_t)N->getValue() == -1;
88}]>;
89def immRem3 : PatLeaf<(imm), [{
90 return (int64_t)getNearPower2((uint64_t)N->getValue()) - (int64_t)N->getValue() == -3;
91}]>;
92def immRem5 : PatLeaf<(imm), [{
93 return (int64_t)getNearPower2((uint64_t)N->getValue()) - (int64_t)N->getValue() == -5;
94}]>;
95def immRem1n : PatLeaf<(imm), [{
96 return (int64_t)getNearPower2((uint64_t)N->getValue()) - N->getValue() == 1;
97}]>;
98def immRem3n : PatLeaf<(imm), [{
99 return (int64_t)getNearPower2((uint64_t)N->getValue()) - N->getValue() == 3;
100}]>;
101def immRem5n : PatLeaf<(imm), [{
102 return (int64_t)getNearPower2((uint64_t)N->getValue()) - N->getValue() == 5;
103}]>;
104def immUExt8ME : PatLeaf<(imm), [{ //use this imm for mulqi
105 int64_t d = (int64_t)getNearPower2((uint64_t)N->getValue()) - N->getValue();
106 switch (abs(d)) {
107 case 1: case 3: case 5: return false;
108 default: return (uint64_t)N->getValue() == (uint8_t)N->getValue();
109 };
110}]>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000111
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000112def intop : PatFrag<(ops node:$op), (sext_inreg node:$op, i32)>;
113def add4 : PatFrag<(ops node:$op1, node:$op2),
114 (add (shl node:$op1, 2), node:$op2)>;
115def sub4 : PatFrag<(ops node:$op1, node:$op2),
116 (sub (shl node:$op1, 2), node:$op2)>;
117def add8 : PatFrag<(ops node:$op1, node:$op2),
118 (add (shl node:$op1, 3), node:$op2)>;
119def sub8 : PatFrag<(ops node:$op1, node:$op2),
120 (sub (shl node:$op1, 3), node:$op2)>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000121
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000122
123//Pseudo ops for selection
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000124
Andrew Lenharth50b37842005-11-22 04:20:06 +0000125def IDEF_I : PseudoInstAlpha<(ops GPRC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000126 [(set GPRC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000127def IDEF_F32 : PseudoInstAlpha<(ops F4RC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000128 [(set F4RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000129def IDEF_F64 : PseudoInstAlpha<(ops F8RC:$RA), "#idef $RA",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000130 [(set F8RC:$RA, (undef))], s_pseudo>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000131
Andrew Lenharth017c5562006-03-09 17:16:45 +0000132def WTF : PseudoInstAlpha<(ops variable_ops), "#wtf", [], s_pseudo>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000133
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000134let isLoad = 1, hasCtrlDep = 1 in {
135def ADJUSTSTACKUP : PseudoInstAlpha<(ops s64imm:$amt), "; ADJUP $amt",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000136 [(callseq_start imm:$amt)], s_pseudo>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000137def ADJUSTSTACKDOWN : PseudoInstAlpha<(ops s64imm:$amt), "; ADJDOWN $amt",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000138 [(callseq_end imm:$amt)], s_pseudo>;
Andrew Lenharth8a3a5fc2005-12-05 23:41:45 +0000139}
Andrew Lenharth017c5562006-03-09 17:16:45 +0000140def ALTENT : PseudoInstAlpha<(ops s64imm:$TARGET), "$$$TARGET..ng:\n", [], s_pseudo>;
141def PCLABEL : PseudoInstAlpha<(ops s64imm:$num), "PCMARKER_$num:\n",[], s_pseudo>;
Andrew Lenharth06ef8842005-06-29 18:54:02 +0000142def MEMLABEL : PseudoInstAlpha<(ops s64imm:$i, s64imm:$j, s64imm:$k, s64imm:$m),
Andrew Lenharth017c5562006-03-09 17:16:45 +0000143 "LSMARKER$$$i$$$j$$$k$$$m:", [], s_pseudo>;
Andrew Lenharth95762122005-03-31 21:24:06 +0000144
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000145
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000146//***********************
147//Real instructions
148//***********************
149
150//Operation Form:
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000151
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000152//conditional moves, int
Andrew Lenharthd4bdd542005-02-05 16:41:03 +0000153
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000154def CMOVLBC : OForm4< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000155 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000156def CMOVLBS : OForm4< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000157 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000158def CMOVEQ : OForm4< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000159 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000160def CMOVGE : OForm4< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000161 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000162def CMOVGT : OForm4< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000163 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000164def CMOVLE : OForm4< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000165 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000166def CMOVLT : OForm4< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000167 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharthdd3ccde2005-12-09 00:45:42 +0000168def CMOVNE : OForm4< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000169 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RTRUE, GPRC:$RFALSE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000170
171def CMOVEQi : OForm4L< 0x11, 0x24, "cmoveq $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000172 [(set GPRC:$RDEST, (select (setne GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000173def CMOVGEi : OForm4L< 0x11, 0x46, "cmovge $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000174 [(set GPRC:$RDEST, (select (setlt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000175def CMOVGTi : OForm4L< 0x11, 0x66, "cmovgt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000176 [(set GPRC:$RDEST, (select (setle GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000177def CMOVLEi : OForm4L< 0x11, 0x64, "cmovle $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000178 [(set GPRC:$RDEST, (select (setgt GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000179def CMOVLTi : OForm4L< 0x11, 0x44, "cmovlt $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000180 [(set GPRC:$RDEST, (select (setge GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000181def CMOVNEi : OForm4L< 0x11, 0x26, "cmovne $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000182 [(set GPRC:$RDEST, (select (seteq GPRC:$RCOND, 0), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000183def CMOVLBCi : OForm4L< 0x11, 0x16, "cmovlbc $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000184 [(set GPRC:$RDEST, (select (and GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000185def CMOVLBSi : OForm4L< 0x11, 0x14, "cmovlbs $RCOND,$RTRUE,$RDEST",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000186 [(set GPRC:$RDEST, (select (xor GPRC:$RCOND, 1), GPRC:$RFALSE, immUExt8:$RTRUE))], s_cmov>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000187
Andrew Lenharth5de36f92005-12-05 23:19:44 +0000188
Andrew Lenharth133d3102006-02-03 03:07:37 +0000189//General pattern for cmov
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000190def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000191 (CMOVNE GPRC:$src2, GPRC:$src1, GPRC:$which)>;
Andrew Lenharth77f08852006-02-01 19:37:33 +0000192def : Pat<(select GPRC:$which, GPRC:$src1, immUExt8:$src2),
193 (CMOVEQi GPRC:$src1, immUExt8:$src2, GPRC:$which)>;
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000194
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000195
Andrew Lenharth4907d222005-10-20 00:28:31 +0000196def ADDL : OForm< 0x10, 0x00, "addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000197 [(set GPRC:$RC, (intop (add GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000198def ADDLi : OFormL<0x10, 0x00, "addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000199 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000200def ADDQ : OForm< 0x10, 0x20, "addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000201 [(set GPRC:$RC, (add GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000202def ADDQi : OFormL<0x10, 0x20, "addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000203 [(set GPRC:$RC, (add GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000204def AND : OForm< 0x11, 0x00, "and $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000205 [(set GPRC:$RC, (and GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000206def ANDi : OFormL<0x11, 0x00, "and $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000207 [(set GPRC:$RC, (and GPRC:$RA, immUExt8:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000208def BIC : OForm< 0x11, 0x08, "bic $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000209 [(set GPRC:$RC, (and GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000210def BICi : OFormL<0x11, 0x08, "bic $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000211 [(set GPRC:$RC, (and GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000212def BIS : OForm< 0x11, 0x20, "bis $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000213 [(set GPRC:$RC, (or GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000214def BISi : OFormL<0x11, 0x20, "bis $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000215 [(set GPRC:$RC, (or GPRC:$RA, immUExt8:$L))], s_ilog>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000216def CTLZ : OForm2<0x1C, 0x32, "CTLZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000217 [(set GPRC:$RC, (ctlz GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000218def CTPOP : OForm2<0x1C, 0x30, "CTPOP $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000219 [(set GPRC:$RC, (ctpop GPRC:$RB))], s_imisc>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000220def CTTZ : OForm2<0x1C, 0x33, "CTTZ $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000221 [(set GPRC:$RC, (cttz GPRC:$RB))], s_imisc>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000222def EQV : OForm< 0x11, 0x48, "eqv $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000223 [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000224def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000225 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000226def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000227 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000228def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000229 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000230def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000231 [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))], s_ishf>;
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000232
Andrew Lenharth4907d222005-10-20 00:28:31 +0000233//def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low
234//def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high
235//def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000236//def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low
237//def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high
238//def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high
239//def EXTQ : OForm< 0x12, 0x36, "EXTQ $RA,$RB,$RC", []>; //Extract quadword low
240//def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low
241//def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high
242//def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high
Andrew Lenharth4907d222005-10-20 00:28:31 +0000243//def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low
Andrew Lenharthc6a335b2006-01-19 20:49:37 +0000244
Andrew Lenharth4907d222005-10-20 00:28:31 +0000245//def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version
246//def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version
247//def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low
248//def INSBLi : OFormL<0x12, 0x0B, "INSBL $RA,$L,$RC", []>; //Insert byte low
249//def INSLH : OForm< 0x12, 0x67, "INSLH $RA,$RB,$RC", []>; //Insert longword high
250//def INSLHi : OFormL<0x12, 0x67, "INSLH $RA,$L,$RC", []>; //Insert longword high
251//def INSLL : OForm< 0x12, 0x2B, "INSLL $RA,$RB,$RC", []>; //Insert longword low
252//def INSLLi : OFormL<0x12, 0x2B, "INSLL $RA,$L,$RC", []>; //Insert longword low
253//def INSQH : OForm< 0x12, 0x77, "INSQH $RA,$RB,$RC", []>; //Insert quadword high
254//def INSQHi : OFormL<0x12, 0x77, "INSQH $RA,$L,$RC", []>; //Insert quadword high
255//def INSQL : OForm< 0x12, 0x3B, "INSQL $RA,$RB,$RC", []>; //Insert quadword low
256//def INSQLi : OFormL<0x12, 0x3B, "INSQL $RA,$L,$RC", []>; //Insert quadword low
257//def INSWH : OForm< 0x12, 0x57, "INSWH $RA,$RB,$RC", []>; //Insert word high
258//def INSWHi : OFormL<0x12, 0x57, "INSWH $RA,$L,$RC", []>; //Insert word high
259//def INSWL : OForm< 0x12, 0x1B, "INSWL $RA,$RB,$RC", []>; //Insert word low
260//def INSWLi : OFormL<0x12, 0x1B, "INSWL $RA,$L,$RC", []>; //Insert word low
261//def MSKBL : OForm< 0x12, 0x02, "MSKBL $RA,$RB,$RC", []>; //Mask byte low
262//def MSKBLi : OFormL<0x12, 0x02, "MSKBL $RA,$L,$RC", []>; //Mask byte low
263//def MSKLH : OForm< 0x12, 0x62, "MSKLH $RA,$RB,$RC", []>; //Mask longword high
264//def MSKLHi : OFormL<0x12, 0x62, "MSKLH $RA,$L,$RC", []>; //Mask longword high
265//def MSKLL : OForm< 0x12, 0x22, "MSKLL $RA,$RB,$RC", []>; //Mask longword low
266//def MSKLLi : OFormL<0x12, 0x22, "MSKLL $RA,$L,$RC", []>; //Mask longword low
267//def MSKQH : OForm< 0x12, 0x72, "MSKQH $RA,$RB,$RC", []>; //Mask quadword high
268//def MSKQHi : OFormL<0x12, 0x72, "MSKQH $RA,$L,$RC", []>; //Mask quadword high
269//def MSKQL : OForm< 0x12, 0x32, "MSKQL $RA,$RB,$RC", []>; //Mask quadword low
270//def MSKQLi : OFormL<0x12, 0x32, "MSKQL $RA,$L,$RC", []>; //Mask quadword low
271//def MSKWH : OForm< 0x12, 0x52, "MSKWH $RA,$RB,$RC", []>; //Mask word high
272//def MSKWHi : OFormL<0x12, 0x52, "MSKWH $RA,$L,$RC", []>; //Mask word high
273//def MSKWL : OForm< 0x12, 0x12, "MSKWL $RA,$RB,$RC", []>; //Mask word low
274//def MSKWLi : OFormL<0x12, 0x12, "MSKWL $RA,$L,$RC", []>; //Mask word low
Chris Lattnerae4be982005-10-20 04:21:06 +0000275
Andrew Lenharth4907d222005-10-20 00:28:31 +0000276def MULL : OForm< 0x13, 0x00, "mull $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000277 [(set GPRC:$RC, (intop (mul GPRC:$RA, GPRC:$RB)))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000278def MULLi : OFormL<0x13, 0x00, "mull $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000279 [(set GPRC:$RC, (intop (mul GPRC:$RA, immUExt8:$L)))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000280def MULQ : OForm< 0x13, 0x20, "mulq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000281 [(set GPRC:$RC, (mul GPRC:$RA, GPRC:$RB))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000282def MULQi : OFormL<0x13, 0x20, "mulq $RA,$L,$RC",
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000283 [(set GPRC:$RC, (mul GPRC:$RA, immUExt8ME:$L))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000284def ORNOT : OForm< 0x11, 0x28, "ornot $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000285 [(set GPRC:$RC, (or GPRC:$RA, (not GPRC:$RB)))], s_ilog>;
Andrew Lenhartheda80a02005-12-06 00:33:53 +0000286def ORNOTi : OFormL<0x11, 0x28, "ornot $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000287 [(set GPRC:$RC, (or GPRC:$RA, immUExt8inv:$L))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000288def S4ADDL : OForm< 0x10, 0x02, "s4addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000289 [(set GPRC:$RC, (intop (add4 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000290def S4ADDLi : OFormL<0x10, 0x02, "s4addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000291 [(set GPRC:$RC, (intop (add4 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000292def S4ADDQ : OForm< 0x10, 0x22, "s4addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000293 [(set GPRC:$RC, (add4 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000294def S4ADDQi : OFormL<0x10, 0x22, "s4addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000295 [(set GPRC:$RC, (add4 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000296def S4SUBL : OForm< 0x10, 0x0B, "s4subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000297 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000298def S4SUBLi : OFormL<0x10, 0x0B, "s4subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000299 [(set GPRC:$RC, (intop (sub4 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000300def S4SUBQ : OForm< 0x10, 0x2B, "s4subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000301 [(set GPRC:$RC, (sub4 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000302def S4SUBQi : OFormL<0x10, 0x2B, "s4subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000303 [(set GPRC:$RC, (sub4 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000304def S8ADDL : OForm< 0x10, 0x12, "s8addl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000305 [(set GPRC:$RC, (intop (add8 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000306def S8ADDLi : OFormL<0x10, 0x12, "s8addl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000307 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000308def S8ADDQ : OForm< 0x10, 0x32, "s8addq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000309 [(set GPRC:$RC, (add8 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000310def S8ADDQi : OFormL<0x10, 0x32, "s8addq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000311 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000312def S8SUBL : OForm< 0x10, 0x1B, "s8subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000313 [(set GPRC:$RC, (intop (sub8 GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000314def S8SUBLi : OFormL<0x10, 0x1B, "s8subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000315 [(set GPRC:$RC, (intop (add8 GPRC:$RA, immUExt8neg:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000316def S8SUBQ : OForm< 0x10, 0x3B, "s8subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000317 [(set GPRC:$RC, (sub8 GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000318def S8SUBQi : OFormL<0x10, 0x3B, "s8subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000319 [(set GPRC:$RC, (add8 GPRC:$RA, immUExt8neg:$L))], s_iadd>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000320def SEXTB : OForm2<0x1C, 0x00, "sextb $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000321 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i8))], s_ishf>;
Andrew Lenharth1f347a32005-10-20 23:58:36 +0000322def SEXTW : OForm2<0x1C, 0x01, "sextw $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000323 [(set GPRC:$RC, (sext_inreg GPRC:$RB, i16))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000324def SL : OForm< 0x12, 0x39, "sll $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000325 [(set GPRC:$RC, (shl GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000326def SLi : OFormL<0x12, 0x39, "sll $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000327 [(set GPRC:$RC, (shl GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000328def SRA : OForm< 0x12, 0x3C, "sra $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000329 [(set GPRC:$RC, (sra GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000330def SRAi : OFormL<0x12, 0x3C, "sra $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000331 [(set GPRC:$RC, (sra GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000332def SRL : OForm< 0x12, 0x34, "srl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000333 [(set GPRC:$RC, (srl GPRC:$RA, GPRC:$RB))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000334def SRLi : OFormL<0x12, 0x34, "srl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000335 [(set GPRC:$RC, (srl GPRC:$RA, immUExt8:$L))], s_ishf>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000336def SUBL : OForm< 0x10, 0x09, "subl $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000337 [(set GPRC:$RC, (intop (sub GPRC:$RA, GPRC:$RB)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000338def SUBLi : OFormL<0x10, 0x09, "subl $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000339 [(set GPRC:$RC, (intop (add GPRC:$RA, immUExt8neg:$L)))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000340def SUBQ : OForm< 0x10, 0x29, "subq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000341 [(set GPRC:$RC, (sub GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000342def SUBQi : OFormL<0x10, 0x29, "subq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000343 [(set GPRC:$RC, (add GPRC:$RA, immUExt8neg:$L))], s_iadd>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000344def UMULH : OForm< 0x13, 0x30, "umulh $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000345 [(set GPRC:$RC, (mulhu GPRC:$RA, GPRC:$RB))], s_imul>;
Andrew Lenharth964b6aa2005-10-20 19:39:24 +0000346def UMULHi : OFormL<0x13, 0x30, "umulh $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000347 [(set GPRC:$RC, (mulhu GPRC:$RA, immUExt8:$L))], s_imul>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000348def XOR : OForm< 0x11, 0x40, "xor $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000349 [(set GPRC:$RC, (xor GPRC:$RA, GPRC:$RB))], s_ilog>;
Andrew Lenharth4907d222005-10-20 00:28:31 +0000350def XORi : OFormL<0x11, 0x40, "xor $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000351 [(set GPRC:$RC, (xor GPRC:$RA, immUExt8:$L))], s_ilog>;
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000352//FIXME: what to do about zap? the cases it catches are very complex
Andrew Lenharth017c5562006-03-09 17:16:45 +0000353def ZAP : OForm< 0x12, 0x30, "zap $RA,$RB,$RC", [], s_ishf>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000354//ZAPi is useless give ZAPNOTi
Andrew Lenharth017c5562006-03-09 17:16:45 +0000355def ZAPi : OFormL<0x12, 0x30, "zap $RA,$L,$RC", [], s_ishf>; //Zero bytes
Andrew Lenharthfe9234d2005-10-21 01:24:05 +0000356//FIXME: what to do about zapnot? see ZAP :)
Andrew Lenharth017c5562006-03-09 17:16:45 +0000357def ZAPNOT : OForm< 0x12, 0x31, "zapnot $RA,$RB,$RC", [], s_ishf>; //Zero bytes not
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000358def ZAPNOTi : OFormL<0x12, 0x31, "zapnot $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000359 [(set GPRC:$RC, (and GPRC:$RA, immZAP:$L))], s_ishf>;
Andrew Lenharth2d6f0222005-01-24 19:44:07 +0000360
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000361//Comparison, int
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000362//So this is a waste of what this instruction can do, but it still saves something
363def CMPBGE : OForm< 0x10, 0x0F, "cmpbge $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000364 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), (and GPRC:$RB, 255)))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000365def CMPBGEi : OFormL<0x10, 0x0F, "cmpbge $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000366 [(set GPRC:$RC, (setuge (and GPRC:$RA, 255), immUExt8:$L))], s_ilog>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000367def CMPEQ : OForm< 0x10, 0x2D, "cmpeq $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000368 [(set GPRC:$RC, (seteq GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000369def CMPEQi : OFormL<0x10, 0x2D, "cmpeq $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000370 [(set GPRC:$RC, (seteq GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000371def CMPLE : OForm< 0x10, 0x6D, "cmple $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000372 [(set GPRC:$RC, (setle GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000373def CMPLEi : OFormL<0x10, 0x6D, "cmple $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000374 [(set GPRC:$RC, (setle GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000375def CMPLT : OForm< 0x10, 0x4D, "cmplt $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000376 [(set GPRC:$RC, (setlt GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000377def CMPLTi : OFormL<0x10, 0x4D, "cmplt $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000378 [(set GPRC:$RC, (setlt GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000379def CMPULE : OForm< 0x10, 0x3D, "cmpule $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000380 [(set GPRC:$RC, (setule GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000381def CMPULEi : OFormL<0x10, 0x3D, "cmpule $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000382 [(set GPRC:$RC, (setule GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000383def CMPULT : OForm< 0x10, 0x1D, "cmpult $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000384 [(set GPRC:$RC, (setult GPRC:$RA, GPRC:$RB))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000385def CMPULTi : OFormL<0x10, 0x1D, "cmpult $RA,$L,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000386 [(set GPRC:$RC, (setult GPRC:$RA, immUExt8:$L))], s_iadd>;
Andrew Lenharth2012cc02005-10-26 18:44:45 +0000387
388//Patterns for unsupported int comparisons
389def : Pat<(setueq GPRC:$X, GPRC:$Y), (CMPEQ GPRC:$X, GPRC:$Y)>;
390def : Pat<(setueq GPRC:$X, immUExt8:$Y), (CMPEQi GPRC:$X, immUExt8:$Y)>;
391
392def : Pat<(setugt GPRC:$X, GPRC:$Y), (CMPULT GPRC:$Y, GPRC:$X)>;
393def : Pat<(setugt immUExt8:$X, GPRC:$Y), (CMPULTi GPRC:$Y, immUExt8:$X)>;
394
395def : Pat<(setuge GPRC:$X, GPRC:$Y), (CMPULE GPRC:$Y, GPRC:$X)>;
396def : Pat<(setuge immUExt8:$X, GPRC:$Y), (CMPULEi GPRC:$Y, immUExt8:$X)>;
397
398def : Pat<(setgt GPRC:$X, GPRC:$Y), (CMPLT GPRC:$Y, GPRC:$X)>;
399def : Pat<(setgt immUExt8:$X, GPRC:$Y), (CMPLTi GPRC:$Y, immUExt8:$X)>;
400
401def : Pat<(setge GPRC:$X, GPRC:$Y), (CMPLE GPRC:$Y, GPRC:$X)>;
402def : Pat<(setge immUExt8:$X, GPRC:$Y), (CMPLEi GPRC:$Y, immUExt8:$X)>;
403
404def : Pat<(setne GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
405def : Pat<(setne GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQi GPRC:$X, immUExt8:$Y), 0)>;
406
407def : Pat<(setune GPRC:$X, GPRC:$Y), (CMPEQi (CMPEQ GPRC:$X, GPRC:$Y), 0)>;
408def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
409
Andrew Lenharth3d65d312005-01-27 03:49:45 +0000410
Evan Cheng2b4ea792005-12-26 09:11:45 +0000411let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000412 def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", s_jsr>; //Return from subroutine
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000413
Andrew Lenharth017c5562006-03-09 17:16:45 +0000414def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP", s_jsr>; //Jump
Evan Cheng2b4ea792005-12-26 09:11:45 +0000415let isCall = 1, noResults = 1, Ra = 26,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000416 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
Andrew Lenhartheececba2005-12-25 17:36:48 +0000417 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000418 F0, F1,
419 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
Andrew Lenharth1e0d9bd2005-04-14 17:34:20 +0000420 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000421 def BSR : BFormD<0x34, "bsr $$26,$$$DISP..ng", [], s_jsr>; //Branch to subroutine
Andrew Lenharth7b2a5272005-01-30 20:42:36 +0000422}
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000423let isCall = 1, noResults = 1, Ra = 26, Rb = 27, disp = 0,
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000424 Defs = [R0, R1, R2, R3, R4, R5, R6, R7, R8, R16, R17, R18, R19,
425 R20, R21, R22, R23, R24, R25, R26, R27, R28, R29,
426 F0, F1,
427 F10, F11, F12, F13, F14, F15, F16, F17, F18, F19,
428 F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30], Uses = [R27, R29] in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000429 def JSR : MbrForm< 0x1A, 0x01, (ops ), "jsr $$26,($$27),0", s_jsr>; //Jump to subroutine
Andrew Lenharth8b7f14e2005-10-23 03:43:48 +0000430}
Andrew Lenharthcf8bf382005-07-01 19:12:13 +0000431
Andrew Lenharth713b0b52005-12-27 06:25:50 +0000432let isCall = 1, noResults = 1, Ra = 23, Rb = 27, disp = 0,
433 Defs = [R23, R24, R25, R27, R28], Uses = [R24, R25, R27] in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000434 def JSRs : MbrForm< 0x1A, 0x01, (ops ), "jsr $$23,($$27),0", s_jsr>; //Jump to div or rem
Andrew Lenharthbbe12252005-12-06 23:27:39 +0000435
Andrew Lenharth53d89702005-12-25 01:34:27 +0000436
Andrew Lenharth017c5562006-03-09 17:16:45 +0000437def JSR_COROUTINE : MbrForm< 0x1A, 0x03, (ops GPRC:$RD, GPRC:$RS, s14imm:$DISP), "jsr_coroutine $RD,($RS),$DISP", s_jsr>; //Jump to subroutine return
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000438
Andrew Lenharthb6718602005-12-24 07:34:33 +0000439let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in {
440def LDQ : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000441 [(set GPRC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000442def LDQr : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000443 [(set GPRC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000444def LDL : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000445 [(set GPRC:$RA, (sextload (add GPRC:$RB, immSExt16:$DISP), i32))], s_ild>;
Andrew Lenharth66e49582006-01-23 21:51:33 +0000446def LDLr : MForm<0x28, 0, 1, "ldl $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000447 [(set GPRC:$RA, (sextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000448def LDBU : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000449 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i8))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000450def LDBUr : MForm<0x0A, 0, 1, "ldbu $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000451 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000452def LDWU : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000453 [(set GPRC:$RA, (zextload (add GPRC:$RB, immSExt16:$DISP), i16))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000454def LDWUr : MForm<0x0C, 0, 1, "ldwu $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000455 [(set GPRC:$RA, (zextload (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16))], s_ild>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000456def STB : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000457 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i8)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000458def STBr : MForm<0x0E, 1, 0, "stb $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000459 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i8)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000460def STW : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000461 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i16)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000462def STWr : MForm<0x0D, 1, 0, "stw $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000463 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i16)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000464def STL : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000465 [(truncstore GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP), i32)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000466def STLr : MForm<0x2C, 1, 0, "stl $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000467 [(truncstore GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB), i32)], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000468def STQ : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000469 [(store GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_ist>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000470def STQr : MForm<0x2D, 1, 0, "stq $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000471 [(store GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_ist>;
Andrew Lenharthc1faced2005-02-01 01:37:24 +0000472
473//Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000474def LDA : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000475 [(set GPRC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_lda>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000476def LDAr : MForm<0x08, 0, 0, "lda $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000477 [(set GPRC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000478def LDAH : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000479 [], s_lda>; //Load address high
Andrew Lenharthb6718602005-12-24 07:34:33 +0000480def LDAHr : MForm<0x09, 0, 0, "ldah $RA,$DISP($RB)\t\t!gprelhigh",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000481 [(set GPRC:$RA, (Alpha_gprelhi tglobaladdr:$DISP, GPRC:$RB))], s_lda>; //Load address high
Andrew Lenharth4e629512005-12-24 05:36:33 +0000482}
Andrew Lenharthfe895e32005-06-27 17:15:36 +0000483
Andrew Lenharthb6718602005-12-24 07:34:33 +0000484let OperandList = (ops F4RC:$RA, s64imm:$DISP, GPRC:$RB) in {
485def STS : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000486 [(store F4RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000487def STSr : MForm<0x26, 1, 0, "sts $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000488 [(store F4RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000489def LDS : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000490 [(set F4RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000491def LDSr : MForm<0x22, 0, 1, "lds $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000492 [(set F4RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000493}
494let OperandList = (ops F8RC:$RA, s64imm:$DISP, GPRC:$RB) in {
495def STT : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000496 [(store F8RC:$RA, (add GPRC:$RB, immSExt16:$DISP))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000497def STTr : MForm<0x27, 1, 0, "stt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000498 [(store F8RC:$RA, (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB))], s_fst>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000499def LDT : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000500 [(set F8RC:$RA, (load (add GPRC:$RB, immSExt16:$DISP)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000501def LDTr : MForm<0x23, 0, 1, "ldt $RA,$DISP($RB)\t\t!gprellow",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000502 [(set F8RC:$RA, (load (Alpha_gprello tglobaladdr:$DISP, GPRC:$RB)))], s_fld>;
Andrew Lenharthb6718602005-12-24 07:34:33 +0000503}
504
Andrew Lenharthc687b482005-12-24 08:29:32 +0000505
506//constpool rels
507def : Pat<(i64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
508 (LDQr tconstpool:$DISP, GPRC:$RB)>;
509def : Pat<(i64 (sextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i32)),
510 (LDLr tconstpool:$DISP, GPRC:$RB)>;
511def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i8)),
512 (LDBUr tconstpool:$DISP, GPRC:$RB)>;
513def : Pat<(i64 (zextload (Alpha_gprello tconstpool:$DISP, GPRC:$RB), i16)),
514 (LDWUr tconstpool:$DISP, GPRC:$RB)>;
515def : Pat<(i64 (Alpha_gprello tconstpool:$DISP, GPRC:$RB)),
516 (LDAr tconstpool:$DISP, GPRC:$RB)>;
517def : Pat<(i64 (Alpha_gprelhi tconstpool:$DISP, GPRC:$RB)),
518 (LDAHr tconstpool:$DISP, GPRC:$RB)>;
519def : Pat<(f32 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
520 (LDSr tconstpool:$DISP, GPRC:$RB)>;
521def : Pat<(f64 (load (Alpha_gprello tconstpool:$DISP, GPRC:$RB))),
522 (LDTr tconstpool:$DISP, GPRC:$RB)>;
523
524
Andrew Lenharthb6718602005-12-24 07:34:33 +0000525//misc ext patterns
526def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i8)),
527 (LDBU immSExt16:$DISP, GPRC:$RB)>;
528def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i16)),
529 (LDWU immSExt16:$DISP, GPRC:$RB)>;
530def : Pat<(i64 (extload (add GPRC:$RB, immSExt16:$DISP), i32)),
531 (LDL immSExt16:$DISP, GPRC:$RB)>;
532
533//0 disp patterns
534def : Pat<(i64 (load GPRC:$addr)),
535 (LDQ 0, GPRC:$addr)>;
536def : Pat<(f64 (load GPRC:$addr)),
537 (LDT 0, GPRC:$addr)>;
538def : Pat<(f32 (load GPRC:$addr)),
539 (LDS 0, GPRC:$addr)>;
540def : Pat<(i64 (sextload GPRC:$addr, i32)),
541 (LDL 0, GPRC:$addr)>;
542def : Pat<(i64 (zextload GPRC:$addr, i16)),
543 (LDWU 0, GPRC:$addr)>;
544def : Pat<(i64 (zextload GPRC:$addr, i8)),
545 (LDBU 0, GPRC:$addr)>;
546def : Pat<(i64 (extload GPRC:$addr, i8)),
547 (LDBU 0, GPRC:$addr)>;
548def : Pat<(i64 (extload GPRC:$addr, i16)),
549 (LDWU 0, GPRC:$addr)>;
550def : Pat<(i64 (extload GPRC:$addr, i32)),
551 (LDL 0, GPRC:$addr)>;
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000552
Andrew Lenharthc687b482005-12-24 08:29:32 +0000553def : Pat<(store GPRC:$DATA, GPRC:$addr),
554 (STQ GPRC:$DATA, 0, GPRC:$addr)>;
555def : Pat<(store F8RC:$DATA, GPRC:$addr),
556 (STT F8RC:$DATA, 0, GPRC:$addr)>;
557def : Pat<(store F4RC:$DATA, GPRC:$addr),
558 (STS F4RC:$DATA, 0, GPRC:$addr)>;
559def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i32),
560 (STL GPRC:$DATA, 0, GPRC:$addr)>;
561def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i16),
562 (STW GPRC:$DATA, 0, GPRC:$addr)>;
563def : Pat<(truncstore GPRC:$DATA, GPRC:$addr, i8),
564 (STB GPRC:$DATA, 0, GPRC:$addr)>;
565
Andrew Lenharth4e629512005-12-24 05:36:33 +0000566
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000567//load address, rellocated gpdist form
Andrew Lenharthb6718602005-12-24 07:34:33 +0000568let OperandList = (ops GPRC:$RA, s16imm:$DISP, GPRC:$RB, s16imm:$NUM) in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000569def LDAg : MForm<0x08, 0, 1, "lda $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
570def LDAHg : MForm<0x09, 0, 1, "ldah $RA,0($RB)\t\t!gpdisp!$NUM", [], s_lda>; //Load address
Andrew Lenharthb6718602005-12-24 07:34:33 +0000571}
Andrew Lenharthf3f951a2005-07-22 20:50:29 +0000572
Andrew Lenharthc7989ce2005-06-29 00:31:08 +0000573//Load quad, rellocated literal form
Andrew Lenharth53d89702005-12-25 01:34:27 +0000574let OperandList = (ops GPRC:$RA, s64imm:$DISP, GPRC:$RB) in
Andrew Lenharthc687b482005-12-24 08:29:32 +0000575def LDQl : MForm<0x29, 0, 1, "ldq $RA,$DISP($RB)\t\t!literal",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000576 [(set GPRC:$RA, (Alpha_rellit tglobaladdr:$DISP, GPRC:$RB))], s_ild>;
Andrew Lenharth53d89702005-12-25 01:34:27 +0000577def : Pat<(Alpha_rellit texternalsym:$ext, GPRC:$RB),
578 (LDQl texternalsym:$ext, GPRC:$RB)>;
Andrew Lenharthfce587e2005-06-29 00:39:17 +0000579
Andrew Lenharth167bc6e2006-01-23 20:59:50 +0000580
Andrew Lenharth017c5562006-03-09 17:16:45 +0000581def RPCC : MfcForm<0x18, 0xC000, "rpcc $RA", s_rpcc>; //Read process cycle counter
Andrew Lenharth51b8d542005-11-11 16:47:30 +0000582
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000583//Basic Floating point ops
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000584
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000585//Floats
Andrew Lenharth98a32d02005-01-26 23:56:48 +0000586
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000587let OperandList = (ops F4RC:$RC, F4RC:$RB), Fa = 31 in
588def SQRTS : FPForm<0x14, 0x58B, "sqrts/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000589 [(set F4RC:$RC, (fsqrt F4RC:$RB))], s_fsqrts>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000590
591let OperandList = (ops F4RC:$RC, F4RC:$RA, F4RC:$RB) in {
592def ADDS : FPForm<0x16, 0x580, "adds/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000593 [(set F4RC:$RC, (fadd F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000594def SUBS : FPForm<0x16, 0x581, "subs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000595 [(set F4RC:$RC, (fsub F4RC:$RA, F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000596def DIVS : FPForm<0x16, 0x583, "divs/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000597 [(set F4RC:$RC, (fdiv F4RC:$RA, F4RC:$RB))], s_fdivs>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000598def MULS : FPForm<0x16, 0x582, "muls/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000599 [(set F4RC:$RC, (fmul F4RC:$RA, F4RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000600
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000601def CPYSS : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000602 [(set F4RC:$RC, (fcopysign F4RC:$RB, F4RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000603def CPYSES : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000604def CPYSNS : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000605 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F4RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000606}
607
608//Doubles
609
610let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
611def SQRTT : FPForm<0x14, 0x5AB, "sqrtt/su $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000612 [(set F8RC:$RC, (fsqrt F8RC:$RB))], s_fsqrtt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000613
614let OperandList = (ops F8RC:$RC, F8RC:$RA, F8RC:$RB) in {
615def ADDT : FPForm<0x16, 0x5A0, "addt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000616 [(set F8RC:$RC, (fadd F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000617def SUBT : FPForm<0x16, 0x5A1, "subt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000618 [(set F8RC:$RC, (fsub F8RC:$RA, F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000619def DIVT : FPForm<0x16, 0x5A3, "divt/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000620 [(set F8RC:$RC, (fdiv F8RC:$RA, F8RC:$RB))], s_fdivt>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000621def MULT : FPForm<0x16, 0x5A2, "mult/su $RA,$RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000622 [(set F8RC:$RC, (fmul F8RC:$RA, F8RC:$RB))], s_fmul>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000623
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000624def CPYST : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000625 [(set F8RC:$RC, (fcopysign F8RC:$RB, F8RC:$RA))], s_fadd>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000626def CPYSET : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000627def CPYSNT : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
Andrew Lenharth283f2222006-03-09 17:41:50 +0000628 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F8RC:$RA)))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000629
Andrew Lenharth017c5562006-03-09 17:16:45 +0000630def CMPTEQ : FPForm<0x16, 0x5A5, "cmpteq/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000631// [(set F8RC:$RC, (seteq F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000632def CMPTLE : FPForm<0x16, 0x5A7, "cmptle/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000633// [(set F8RC:$RC, (setle F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000634def CMPTLT : FPForm<0x16, 0x5A6, "cmptlt/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000635// [(set F8RC:$RC, (setlt F8RC:$RA, F8RC:$RB))]>;
Andrew Lenharth017c5562006-03-09 17:16:45 +0000636def CMPTUN : FPForm<0x16, 0x5A4, "cmptun/su $RA,$RB,$RC", [], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000637// [(set F8RC:$RC, (setuo F8RC:$RA, F8RC:$RB))]>;
638}
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000639
640//More CPYS forms:
641let OperandList = (ops F8RC:$RC, F4RC:$RA, F8RC:$RB) in {
642def CPYSTs : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
643 [(set F8RC:$RC, (fcopysign F8RC:$RB, F4RC:$RA))], s_fadd>;
644def CPYSNTs : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
645 [(set F8RC:$RC, (fneg (fcopysign F8RC:$RB, F4RC:$RA)))], s_fadd>;
646}
647let OperandList = (ops F4RC:$RC, F8RC:$RA, F4RC:$RB) in {
648def CPYSSt : FPForm<0x17, 0x020, "cpys $RA,$RB,$RC",
649 [(set F4RC:$RC, (fcopysign F4RC:$RB, F8RC:$RA))], s_fadd>;
650def CPYSESt : FPForm<0x17, 0x022, "cpyse $RA,$RB,$RC",[], s_fadd>; //Copy sign and exponent
651def CPYSNSt : FPForm<0x17, 0x021, "cpysn $RA,$RB,$RC",
652 [(set F4RC:$RC, (fneg (fcopysign F4RC:$RB, F8RC:$RA)))], s_fadd>;
653}
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000654
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000655//conditional moves, floats
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000656let OperandList = (ops F4RC:$RDEST, F4RC:$RFALSE, F4RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000657 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000658def FCMOVEQS : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if = zero
659def FCMOVGES : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if >= zero
660def FCMOVGTS : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if > zero
661def FCMOVLES : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if <= zero
662def FCMOVLTS : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST",[], s_fcmov>; // FCMOVE if < zero
663def FCMOVNES : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST",[], s_fcmov>; //FCMOVE if != zero
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000664}
665//conditional moves, doubles
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000666let OperandList = (ops F8RC:$RDEST, F8RC:$RFALSE, F8RC:$RTRUE, F8RC:$RCOND),
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000667 isTwoAddress = 1 in {
Andrew Lenharth017c5562006-03-09 17:16:45 +0000668def FCMOVEQT : FPForm<0x17, 0x02A, "fcmoveq $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
669def FCMOVGET : FPForm<0x17, 0x02D, "fcmovge $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
670def FCMOVGTT : FPForm<0x17, 0x02F, "fcmovgt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
671def FCMOVLET : FPForm<0x17, 0x02E, "fcmovle $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
672def FCMOVLTT : FPForm<0x17, 0x02C, "fcmovlt $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
673def FCMOVNET : FPForm<0x17, 0x02B, "fcmovne $RCOND,$RTRUE,$RDEST", [], s_fcmov>;
Andrew Lenharthb2156f92005-11-30 17:11:20 +0000674}
675
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000676//misc FP selects
677//Select double
678def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000679 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000680def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
681 (FCMOVEQT F8RC:$sf, F8RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000682def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000683 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000684def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000685 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000686def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000687 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000688def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F8RC:$st, F8RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000689 (FCMOVNET F8RC:$sf, F8RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000690//Select single
691def : Pat<(select (seteq F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000692 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharth110f2242005-12-12 20:30:09 +0000693def : Pat<(select (setne F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
694 (FCMOVEQS F4RC:$sf, F4RC:$st, (CMPTEQ F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000695def : Pat<(select (setgt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000696 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000697def : Pat<(select (setge F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000698 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RB, F8RC:$RA))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000699def : Pat<(select (setlt F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000700 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLT F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000701def : Pat<(select (setle F8RC:$RA, F8RC:$RB), F4RC:$st, F4RC:$sf),
Andrew Lenharth110f2242005-12-12 20:30:09 +0000702 (FCMOVNES F4RC:$sf, F4RC:$st, (CMPTLE F8RC:$RA, F8RC:$RB))>;
Andrew Lenharthe41419f2005-12-11 03:54:31 +0000703
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000704
705
706let OperandList = (ops GPRC:$RC, F4RC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000707def FTOIS : FPForm<0x1C, 0x078, "ftois $RA,$RC",[], s_ftoi>; //Floating to integer move, S_floating
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000708let OperandList = (ops GPRC:$RC, F8RC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000709def FTOIT : FPForm<0x1C, 0x070, "ftoit $RA,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000710 [(set GPRC:$RC, (Alpha_ftoit F8RC:$RA))], s_ftoi>; //Floating to integer move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000711let OperandList = (ops F4RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000712def ITOFS : FPForm<0x14, 0x004, "itofs $RA,$RC",[], s_itof>; //Integer to floating move, S_floating
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000713let OperandList = (ops F8RC:$RC, GPRC:$RA), Fb = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000714def ITOFT : FPForm<0x14, 0x024, "itoft $RA,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000715 [(set F8RC:$RC, (Alpha_itoft GPRC:$RA))], s_itof>; //Integer to floating move
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000716
717
718let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000719def CVTQS : FPForm<0x16, 0x7BC, "cvtqs/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000720 [(set F4RC:$RC, (Alpha_cvtqs F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000721let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000722def CVTQT : FPForm<0x16, 0x7BE, "cvtqt/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000723 [(set F8RC:$RC, (Alpha_cvtqt F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000724let OperandList = (ops F8RC:$RC, F8RC:$RB), Fa = 31 in
Andrew Lenharthcd804962005-11-30 16:10:29 +0000725def CVTTQ : FPForm<0x16, 0x52F, "cvttq/svc $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000726 [(set F8RC:$RC, (Alpha_cvttq F8RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000727let OperandList = (ops F8RC:$RC, F4RC:$RB), Fa = 31 in
728def CVTST : FPForm<0x16, 0x6AC, "cvtst/s $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000729 [(set F8RC:$RC, (fextend F4RC:$RB))], s_fadd>;
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000730let OperandList = (ops F4RC:$RC, F8RC:$RB), Fa = 31 in
731def CVTTS : FPForm<0x16, 0x7AC, "cvtts/sui $RB,$RC",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000732 [(set F4RC:$RC, (fround F8RC:$RB))], s_fadd>;
Andrew Lenharthd2bb9602005-01-27 07:50:35 +0000733
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000734
735/////////////////////////////////////////////////////////
736//Branching
737/////////////////////////////////////////////////////////
738let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, noResults = 1 in {
739let Ra = 31 in
Andrew Lenharth017c5562006-03-09 17:16:45 +0000740def BR : BFormD<0x30, "br $$31,$DISP", [(br bb:$DISP)], s_ubr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000741
742//Branches, int
Andrew Lenharth9e234852006-01-26 03:24:15 +0000743def BEQ : BForm<0x39, "beq $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000744 [(brcond (seteq GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000745def BGE : BForm<0x3E, "bge $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000746 [(brcond (setge GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000747def BGT : BForm<0x3F, "bgt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000748 [(brcond (setgt GPRC:$RA, 0), bb:$DISP)], s_icbr>;
749def BLBC : BForm<0x38, "blbc $RA,$DISP", [], s_icbr>; //TODO: Low bit clear
Andrew Lenharth9e234852006-01-26 03:24:15 +0000750def BLBS : BForm<0x3C, "blbs $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000751 [(brcond (and GPRC:$RA, 1), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000752def BLE : BForm<0x3B, "ble $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000753 [(brcond (setle GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000754def BLT : BForm<0x3A, "blt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000755 [(brcond (setlt GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharth9e234852006-01-26 03:24:15 +0000756def BNE : BForm<0x3D, "bne $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000757 [(brcond (setne GPRC:$RA, 0), bb:$DISP)], s_icbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000758
759//Branches, float
760def FBEQ : FBForm<0x31, "fbeq $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000761 [(brcond (seteq F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000762def FBGE : FBForm<0x36, "fbge $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000763 [(brcond (setge F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000764def FBGT : FBForm<0x37, "fbgt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000765 [(brcond (setgt F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000766def FBLE : FBForm<0x33, "fble $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000767 [(brcond (setle F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000768def FBLT : FBForm<0x32, "fblt $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000769 [(brcond (setlt F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000770def FBNE : FBForm<0x35, "fbne $RA,$DISP",
Andrew Lenharth017c5562006-03-09 17:16:45 +0000771 [(brcond (setne F8RC:$RA, immFPZ), bb:$DISP)], s_fbr>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000772}
773
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000774def : Pat<(brcond GPRC:$RA, bb:$DISP), (BNE GPRC:$RA, bb:$DISP)>;
Andrew Lenharthf7c4bd62006-01-09 19:49:58 +0000775def : Pat<(brcond (setne GPRC:$RA, GPRC:$RB), bb:$DISP),
776 (BEQ (CMPEQ GPRC:$RA, GPRC:$RB), bb:$DISP)>;
777def : Pat<(brcond (setne GPRC:$RA, immUExt8:$L), bb:$DISP),
778 (BEQ (CMPEQi GPRC:$RA, immUExt8:$L), bb:$DISP)>;
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000779def : Pat<(brcond (seteq F8RC:$RA, F8RC:$RB), bb:$DISP),
780 (FBNE (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
781def : Pat<(brcond (setlt F8RC:$RA, F8RC:$RB), bb:$DISP),
782 (FBNE (CMPTLT F8RC:$RA, F8RC:$RB), bb:$DISP)>;
783def : Pat<(brcond (setle F8RC:$RA, F8RC:$RB), bb:$DISP),
784 (FBNE (CMPTLE F8RC:$RA, F8RC:$RB), bb:$DISP)>;
785def : Pat<(brcond (setgt F8RC:$RA, F8RC:$RB), bb:$DISP),
786 (FBNE (CMPTLT F8RC:$RB, F8RC:$RA), bb:$DISP)>;
787def : Pat<(brcond (setge F8RC:$RA, F8RC:$RB), bb:$DISP),
788 (FBNE (CMPTLE F8RC:$RB, F8RC:$RA), bb:$DISP)>;
789def : Pat<(brcond (setne F8RC:$RA, F8RC:$RB), bb:$DISP),
790 (FBEQ (CMPTEQ F8RC:$RA, F8RC:$RB), bb:$DISP)>;
791
792//End Branches
793
Andrew Lenharth3e98fde2005-01-26 21:54:09 +0000794//S_floating : IEEE Single
795//T_floating : IEEE Double
796
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000797//Unused instructions
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000798//Mnemonic Format Opcode Description
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000799//CALL_PAL Pcd 00 Trap to PALcode
800//ECB Mfc 18.E800 Evict cache block
801//EXCB Mfc 18.0400 Exception barrier
802//FETCH Mfc 18.8000 Prefetch data
803//FETCH_M Mfc 18.A000 Prefetch data, modify intent
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000804//LDL_L Mem 2A Load sign-extended longword locked
805//LDQ_L Mem 2B Load quadword locked
806//LDQ_U Mem 0B Load unaligned quadword
807//MB Mfc 18.4000 Memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000808//STL_C Mem 2E Store longword conditional
809//STQ_C Mem 2F Store quadword conditional
810//STQ_U Mem 0F Store unaligned quadword
811//TRAPB Mfc 18.0000 Trap barrier
812//WH64 Mfc 18.F800 Write hint  64 bytes
813//WMB Mfc 18.4400 Write memory barrier
Andrew Lenharth304d0f32005-01-22 23:41:55 +0000814//MF_FPCR F-P 17.025 Move from FPCR
815//MT_FPCR F-P 17.024 Move to FPCR
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000816//There are in the Multimedia extentions, so let's not use them yet
817//def MAXSB8 : OForm<0x1C, 0x3E, "MAXSB8 $RA,$RB,$RC">; //Vector signed byte maximum
818//def MAXSW4 : OForm< 0x1C, 0x3F, "MAXSW4 $RA,$RB,$RC">; //Vector signed word maximum
819//def MAXUB8 : OForm<0x1C, 0x3C, "MAXUB8 $RA,$RB,$RC">; //Vector unsigned byte maximum
820//def MAXUW4 : OForm< 0x1C, 0x3D, "MAXUW4 $RA,$RB,$RC">; //Vector unsigned word maximum
821//def MINSB8 : OForm< 0x1C, 0x38, "MINSB8 $RA,$RB,$RC">; //Vector signed byte minimum
822//def MINSW4 : OForm< 0x1C, 0x39, "MINSW4 $RA,$RB,$RC">; //Vector signed word minimum
823//def MINUB8 : OForm< 0x1C, 0x3A, "MINUB8 $RA,$RB,$RC">; //Vector unsigned byte minimum
824//def MINUW4 : OForm< 0x1C, 0x3B, "MINUW4 $RA,$RB,$RC">; //Vector unsigned word minimum
825//def PERR : OForm< 0x1C, 0x31, "PERR $RA,$RB,$RC">; //Pixel error
826//def PKLB : OForm< 0x1C, 0x37, "PKLB $RA,$RB,$RC">; //Pack longwords to bytes
827//def PKWB : OForm<0x1C, 0x36, "PKWB $RA,$RB,$RC">; //Pack words to bytes
828//def UNPKBL : OForm< 0x1C, 0x35, "UNPKBL $RA,$RB,$RC">; //Unpack bytes to longwords
829//def UNPKBW : OForm< 0x1C, 0x34, "UNPKBW $RA,$RB,$RC">; //Unpack bytes to words
830//CVTLQ F-P 17.010 Convert longword to quadword
831//CVTQL F-P 17.030 Convert quadword to longword
832//def AMASK : OForm< 0x11, 0x61, "AMASK $RA,$RB,$RC", []>; //Architecture mask
833//def AMASKi : OFormL<0x11, 0x61, "AMASK $RA,$L,$RC", []>; //Architecture mask
834
835
Andrew Lenharth50b37842005-11-22 04:20:06 +0000836//Constant handling
Andrew Lenharth5cefc5e2005-11-09 19:17:08 +0000837
Andrew Lenharth50b37842005-11-22 04:20:06 +0000838def immConst2Part : PatLeaf<(imm), [{
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000839 //true if imm fits in a LDAH LDA pair
Andrew Lenharth50b37842005-11-22 04:20:06 +0000840 int64_t val = (int64_t)N->getValue();
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000841 return (val <= IMM_FULLHIGH && val >= IMM_FULLLOW);
Andrew Lenharth50b37842005-11-22 04:20:06 +0000842}]>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000843def immConst2PartInt : PatLeaf<(imm), [{
844 //true if imm fits in a LDAH LDA pair with zeroext
845 uint64_t uval = N->getValue();
846 int32_t val32 = (int32_t)uval;
847 return ((uval >> 32) == 0 && //empty upper bits
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000848 val32 <= IMM_FULLHIGH);
849// val32 >= IMM_FULLLOW + IMM_LOW * IMM_MULT); //Always True
850}], SExt32>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000851
852def : Pat<(i64 immConst2Part:$imm),
853 (LDA (LL16 immConst2Part:$imm), (LDAH (LH16 immConst2Part:$imm), R31))>;
Andrew Lenharth756fbeb2005-10-22 22:06:58 +0000854
855def : Pat<(i64 immSExt16:$imm),
856 (LDA immSExt16:$imm, R31)>;
Andrew Lenharth50b37842005-11-22 04:20:06 +0000857
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000858def : Pat<(i64 immSExt16int:$imm),
Andrew Lenharthfeab2f82006-01-01 22:16:14 +0000859 (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000860def : Pat<(i64 immConst2PartInt:$imm),
Andrew Lenharth6e707fb2006-01-16 21:41:39 +0000861 (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)),
Andrew Lenharth29418a82006-01-10 19:12:47 +0000862 (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>;
Andrew Lenharthdcbaf8a2005-12-30 02:30:02 +0000863
864
Andrew Lenharth50b37842005-11-22 04:20:06 +0000865//TODO: I want to just define these like this!
866//def : Pat<(i64 0),
867// (R31)>;
868//def : Pat<(f64 0.0),
869// (F31)>;
870//def : Pat<(f64 -0.0),
871// (CPYSNT F31, F31)>;
872//def : Pat<(f32 0.0),
873// (F31)>;
874//def : Pat<(f32 -0.0),
875// (CPYSNS F31, F31)>;
876
877//Misc Patterns:
878
879def : Pat<(sext_inreg GPRC:$RB, i32),
880 (ADDLi GPRC:$RB, 0)>;
881
882def : Pat<(select GPRC:$which, GPRC:$src1, GPRC:$src2),
883 (CMOVEQ GPRC:$src1, GPRC:$src2, GPRC:$which)>; //may be CMOVNE
884
Andrew Lenharth7f0db912005-11-30 07:19:56 +0000885def : Pat<(fabs F8RC:$RB),
886 (CPYST F31, F8RC:$RB)>;
887def : Pat<(fabs F4RC:$RB),
888 (CPYSS F31, F4RC:$RB)>;
889def : Pat<(fneg F8RC:$RB),
890 (CPYSNT F8RC:$RB, F8RC:$RB)>;
891def : Pat<(fneg F4RC:$RB),
892 (CPYSNS F4RC:$RB, F4RC:$RB)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000893
Andrew Lenharth283f2222006-03-09 17:41:50 +0000894def : Pat<(fcopysign F4RC:$A, (fneg F4RC:$B)),
895 (CPYSNS F4RC:$B, F4RC:$A)>;
896def : Pat<(fcopysign F8RC:$A, (fneg F8RC:$B)),
897 (CPYSNT F8RC:$B, F8RC:$A)>;
Andrew Lenharthe5b71d02006-03-09 17:56:33 +0000898def : Pat<(fcopysign F4RC:$A, (fneg F8RC:$B)),
899 (CPYSNSt F8RC:$B, F4RC:$A)>;
900def : Pat<(fcopysign F8RC:$A, (fneg F4RC:$B)),
901 (CPYSNTs F4RC:$B, F8RC:$A)>;
Andrew Lenharth13beebb2006-03-09 14:58:25 +0000902
Andrew Lenharthcd804962005-11-30 16:10:29 +0000903//Yes, signed multiply high is ugly
904def : Pat<(mulhs GPRC:$RA, GPRC:$RB),
905 (SUBQ (UMULH GPRC:$RA, GPRC:$RB), (ADDQ (CMOVGE GPRC:$RB, R31, GPRC:$RA),
906 (CMOVGE GPRC:$RA, R31, GPRC:$RB)))>;
Andrew Lenharthafe3f492006-04-03 03:18:59 +0000907
908//Stupid crazy arithmetic stuff:
909def : Pat<(mul GPRC:$RA, 5), (S4ADDQ GPRC:$RA, GPRC:$RA)>;
910def : Pat<(mul GPRC:$RA, 3), (S4SUBQ GPRC:$RA, GPRC:$RA)>;
911
912def : Pat<(mul GPRC:$RA, immRem1:$imm),
913 (ADDQ (SL GPRC:$RA, (nearP2X immRem1:$imm)), GPRC:$RA)>;
914def : Pat<(mul GPRC:$RA, immRem3:$imm),
915 (ADDQ (SL GPRC:$RA, (nearP2X immRem3:$imm)), (S4SUBQ GPRC:$RA, GPRC:$RA))>;
916def : Pat<(mul GPRC:$RA, immRem5:$imm),
917 (ADDQ (SL GPRC:$RA, (nearP2X immRem5:$imm)), (S4ADDQ GPRC:$RA, GPRC:$RA))>;
918
919def : Pat<(mul GPRC:$RA, immRem1n:$imm),
920 (SUBQ (SL GPRC:$RA, (nearP2X immRem1n:$imm)), GPRC:$RA)>;
921def : Pat<(mul GPRC:$RA, immRem3n:$imm),
922 (SUBQ (SL GPRC:$RA, (nearP2X immRem3n:$imm)), (S4SUBQ GPRC:$RA, GPRC:$RA))>;
923def : Pat<(mul GPRC:$RA, immRem5n:$imm),
924 (SUBQ (SL GPRC:$RA, (nearP2X immRem5n:$imm)), (S4ADDQ GPRC:$RA, GPRC:$RA))>;
925