blob: 40b7ae38530875b630cc2bfda83a47ae58b94e89 [file] [log] [blame]
Hal Finkel27774d92014-03-13 07:58:58 +00001//===- PPCInstrVSX.td - The PowerPC VSX Extension --*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the VSX extension to the PowerPC instruction set.
11//
12//===----------------------------------------------------------------------===//
13
Bill Schmidtfe723b92015-04-27 19:57:34 +000014// *********************************** NOTE ***********************************
15// ** For POWER8 Little Endian, the VSX swap optimization relies on knowing **
16// ** which VMX and VSX instructions are lane-sensitive and which are not. **
17// ** A lane-sensitive instruction relies, implicitly or explicitly, on **
18// ** whether lanes are numbered from left to right. An instruction like **
19// ** VADDFP is not lane-sensitive, because each lane of the result vector **
20// ** relies only on the corresponding lane of the source vectors. However, **
21// ** an instruction like VMULESB is lane-sensitive, because "even" and **
22// ** "odd" lanes are different for big-endian and little-endian numbering. **
23// ** **
24// ** When adding new VMX and VSX instructions, please consider whether they **
25// ** are lane-sensitive. If so, they must be added to a switch statement **
26// ** in PPCVSXSwapRemoval::gatherVectorInstructions(). **
27// ****************************************************************************
28
Hal Finkel27774d92014-03-13 07:58:58 +000029def PPCRegVSRCAsmOperand : AsmOperandClass {
30 let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
31}
32def vsrc : RegisterOperand<VSRC> {
33 let ParserMatchClass = PPCRegVSRCAsmOperand;
34}
35
Hal Finkel19be5062014-03-29 05:29:01 +000036def PPCRegVSFRCAsmOperand : AsmOperandClass {
37 let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber";
38}
39def vsfrc : RegisterOperand<VSFRC> {
40 let ParserMatchClass = PPCRegVSFRCAsmOperand;
41}
42
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +000043def PPCRegVSSRCAsmOperand : AsmOperandClass {
44 let Name = "RegVSSRC"; let PredicateMethod = "isVSRegNumber";
45}
46def vssrc : RegisterOperand<VSSRC> {
47 let ParserMatchClass = PPCRegVSSRCAsmOperand;
48}
49
Bill Schmidtfae5d712014-12-09 16:35:51 +000050// Little-endian-specific nodes.
51def SDT_PPClxvd2x : SDTypeProfile<1, 1, [
52 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
53]>;
54def SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
55 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
56]>;
57def SDT_PPCxxswapd : SDTypeProfile<1, 1, [
58 SDTCisSameAs<0, 1>
59]>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000060def SDTVecConv : SDTypeProfile<1, 2, [
61 SDTCisVec<0>, SDTCisVec<1>, SDTCisPtrTy<2>
62]>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000063
64def PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
65 [SDNPHasChain, SDNPMayLoad]>;
66def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
67 [SDNPHasChain, SDNPMayStore]>;
68def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +000069def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
70def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
71def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000072def PPCsvec2fp : SDNode<"PPCISD::SINT_VEC_TO_FP", SDTVecConv, []>;
73def PPCuvec2fp: SDNode<"PPCISD::UINT_VEC_TO_FP", SDTVecConv, []>;
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +000074def PPCswapNoChain : SDNode<"PPCISD::SWAP_NO_CHAIN", SDT_PPCxxswapd>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000075
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000076multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase,
77 string asmstr, InstrItinClass itin, Intrinsic Int,
78 ValueType OutTy, ValueType InTy> {
Hal Finkel27774d92014-03-13 07:58:58 +000079 let BaseName = asmbase in {
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000080 def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000081 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000082 [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000083 let Defs = [CR6] in
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000084 def o : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000085 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000086 [(set InTy:$XT,
87 (InTy (PPCvcmp_o InTy:$XA, InTy:$XB, xo)))]>,
88 isDOT;
Hal Finkel27774d92014-03-13 07:58:58 +000089 }
90}
91
Eric Christopher1b8e7632014-05-22 01:07:24 +000092def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +000093def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
94def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
95
Hal Finkel27774d92014-03-13 07:58:58 +000096let Predicates = [HasVSX] in {
97let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Craig Topperc50d64b2014-11-26 00:46:26 +000098let hasSideEffects = 0 in { // VSX instructions don't have side effects.
Hal Finkel27774d92014-03-13 07:58:58 +000099let Uses = [RM] in {
100
101 // Load indexed instructions
Hal Finkel6a778fb2015-03-11 23:28:38 +0000102 let mayLoad = 1 in {
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000103 def LXSDX : XX1Form<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +0000104 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +0000105 "lxsdx $XT, $src", IIC_LdStLFD,
106 [(set f64:$XT, (load xoaddr:$src))]>;
107
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000108 def LXVD2X : XX1Form<31, 844,
Hal Finkel27774d92014-03-13 07:58:58 +0000109 (outs vsrc:$XT), (ins memrr:$src),
110 "lxvd2x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000111 [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000112
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000113 def LXVDSX : XX1Form<31, 332,
Hal Finkel27774d92014-03-13 07:58:58 +0000114 (outs vsrc:$XT), (ins memrr:$src),
115 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000116
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000117 def LXVW4X : XX1Form<31, 780,
Hal Finkel27774d92014-03-13 07:58:58 +0000118 (outs vsrc:$XT), (ins memrr:$src),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000119 "lxvw4x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000120 [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000121 } // mayLoad
Hal Finkel27774d92014-03-13 07:58:58 +0000122
123 // Store indexed instructions
124 let mayStore = 1 in {
125 def STXSDX : XX1Form<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +0000126 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +0000127 "stxsdx $XT, $dst", IIC_LdStSTFD,
128 [(store f64:$XT, xoaddr:$dst)]>;
129
130 def STXVD2X : XX1Form<31, 972,
131 (outs), (ins vsrc:$XT, memrr:$dst),
132 "stxvd2x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000133 [(store v2f64:$XT, xoaddr:$dst)]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000134
135 def STXVW4X : XX1Form<31, 908,
136 (outs), (ins vsrc:$XT, memrr:$dst),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000137 "stxvw4x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000138 [(store v4i32:$XT, xoaddr:$dst)]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000139
140 } // mayStore
Hal Finkel27774d92014-03-13 07:58:58 +0000141
142 // Add/Mul Instructions
143 let isCommutable = 1 in {
144 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +0000145 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000146 "xsadddp $XT, $XA, $XB", IIC_VecFP,
147 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
148 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +0000149 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000150 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
151 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
152
153 def XVADDDP : XX3Form<60, 96,
154 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
155 "xvadddp $XT, $XA, $XB", IIC_VecFP,
156 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
157
158 def XVADDSP : XX3Form<60, 64,
159 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
160 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
161 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
162
163 def XVMULDP : XX3Form<60, 112,
164 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
165 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
166 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
167
168 def XVMULSP : XX3Form<60, 80,
169 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
170 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
171 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
172 }
173
174 // Subtract Instructions
175 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000176 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000177 "xssubdp $XT, $XA, $XB", IIC_VecFP,
178 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
179
180 def XVSUBDP : XX3Form<60, 104,
181 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
182 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
183 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
184 def XVSUBSP : XX3Form<60, 72,
185 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
186 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
187 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
188
189 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000190 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000191 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000192 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000193 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000194 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
195 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000196 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
197 AltVSXFMARel;
198 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000199 def XSMADDMDP : XX3Form<60, 41,
Hal Finkel19be5062014-03-29 05:29:01 +0000200 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000201 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000202 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
203 AltVSXFMARel;
204 }
Hal Finkel27774d92014-03-13 07:58:58 +0000205
Hal Finkel25e04542014-03-25 18:55:11 +0000206 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000207 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000208 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000209 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000210 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
211 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000212 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
213 AltVSXFMARel;
214 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000215 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000216 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000217 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000218 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
219 AltVSXFMARel;
220 }
Hal Finkel27774d92014-03-13 07:58:58 +0000221
Hal Finkel25e04542014-03-25 18:55:11 +0000222 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000223 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000224 def XSNMADDADP : XX3Form<60, 161,
Hal Finkel19be5062014-03-29 05:29:01 +0000225 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000226 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
227 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000228 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
229 AltVSXFMARel;
230 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000231 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000232 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000233 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000234 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
235 AltVSXFMARel;
236 }
Hal Finkel27774d92014-03-13 07:58:58 +0000237
Hal Finkel25e04542014-03-25 18:55:11 +0000238 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000239 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000240 def XSNMSUBADP : XX3Form<60, 177,
Hal Finkel19be5062014-03-29 05:29:01 +0000241 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000242 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
243 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000244 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
245 AltVSXFMARel;
246 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000247 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000248 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000249 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000250 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
251 AltVSXFMARel;
252 }
Hal Finkel27774d92014-03-13 07:58:58 +0000253
Hal Finkel25e04542014-03-25 18:55:11 +0000254 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000255 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000256 def XVMADDADP : XX3Form<60, 97,
257 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
258 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
259 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000260 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
261 AltVSXFMARel;
262 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000263 def XVMADDMDP : XX3Form<60, 105,
264 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
265 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000266 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
267 AltVSXFMARel;
268 }
Hal Finkel27774d92014-03-13 07:58:58 +0000269
Hal Finkel25e04542014-03-25 18:55:11 +0000270 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000271 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000272 def XVMADDASP : XX3Form<60, 65,
273 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
274 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
275 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000276 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
277 AltVSXFMARel;
278 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000279 def XVMADDMSP : XX3Form<60, 73,
280 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
281 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000282 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
283 AltVSXFMARel;
284 }
Hal Finkel27774d92014-03-13 07:58:58 +0000285
Hal Finkel25e04542014-03-25 18:55:11 +0000286 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000287 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000288 def XVMSUBADP : XX3Form<60, 113,
289 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
290 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
291 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000292 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
293 AltVSXFMARel;
294 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000295 def XVMSUBMDP : XX3Form<60, 121,
296 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
297 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000298 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
299 AltVSXFMARel;
300 }
Hal Finkel27774d92014-03-13 07:58:58 +0000301
Hal Finkel25e04542014-03-25 18:55:11 +0000302 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000303 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000304 def XVMSUBASP : XX3Form<60, 81,
305 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
306 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
307 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000308 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
309 AltVSXFMARel;
310 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000311 def XVMSUBMSP : XX3Form<60, 89,
312 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
313 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000314 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
315 AltVSXFMARel;
316 }
Hal Finkel27774d92014-03-13 07:58:58 +0000317
Hal Finkel25e04542014-03-25 18:55:11 +0000318 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000319 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000320 def XVNMADDADP : XX3Form<60, 225,
321 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
322 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
323 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000324 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
325 AltVSXFMARel;
326 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000327 def XVNMADDMDP : XX3Form<60, 233,
328 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
329 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000330 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
331 AltVSXFMARel;
332 }
Hal Finkel27774d92014-03-13 07:58:58 +0000333
Hal Finkel25e04542014-03-25 18:55:11 +0000334 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000335 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000336 def XVNMADDASP : XX3Form<60, 193,
337 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
338 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
339 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000340 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
341 AltVSXFMARel;
342 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000343 def XVNMADDMSP : XX3Form<60, 201,
344 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
345 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000346 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
347 AltVSXFMARel;
348 }
Hal Finkel27774d92014-03-13 07:58:58 +0000349
Hal Finkel25e04542014-03-25 18:55:11 +0000350 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000351 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000352 def XVNMSUBADP : XX3Form<60, 241,
353 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
354 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
355 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000356 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
357 AltVSXFMARel;
358 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000359 def XVNMSUBMDP : XX3Form<60, 249,
360 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
361 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000362 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
363 AltVSXFMARel;
364 }
Hal Finkel27774d92014-03-13 07:58:58 +0000365
Hal Finkel25e04542014-03-25 18:55:11 +0000366 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000367 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000368 def XVNMSUBASP : XX3Form<60, 209,
369 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
370 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
371 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000372 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
373 AltVSXFMARel;
374 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000375 def XVNMSUBMSP : XX3Form<60, 217,
376 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
377 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000378 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
379 AltVSXFMARel;
380 }
Hal Finkel27774d92014-03-13 07:58:58 +0000381
382 // Division Instructions
383 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000384 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000385 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000386 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
387 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000388 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000389 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000390 [(set f64:$XT, (fsqrt f64:$XB))]>;
391
392 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000393 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000394 "xsredp $XT, $XB", IIC_VecFP,
395 [(set f64:$XT, (PPCfre f64:$XB))]>;
396 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000397 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000398 "xsrsqrtedp $XT, $XB", IIC_VecFP,
399 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
400
401 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000402 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000403 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000404 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000405 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000406 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000407
408 def XVDIVDP : XX3Form<60, 120,
409 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000410 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000411 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
412 def XVDIVSP : XX3Form<60, 88,
413 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000414 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000415 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
416
417 def XVSQRTDP : XX2Form<60, 203,
418 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000419 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000420 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
421 def XVSQRTSP : XX2Form<60, 139,
422 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000423 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000424 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
425
426 def XVTDIVDP : XX3Form_1<60, 125,
427 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000428 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000429 def XVTDIVSP : XX3Form_1<60, 93,
430 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000431 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000432
433 def XVTSQRTDP : XX2Form_1<60, 234,
434 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000435 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000436 def XVTSQRTSP : XX2Form_1<60, 170,
437 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000438 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000439
440 def XVREDP : XX2Form<60, 218,
441 (outs vsrc:$XT), (ins vsrc:$XB),
442 "xvredp $XT, $XB", IIC_VecFP,
443 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
444 def XVRESP : XX2Form<60, 154,
445 (outs vsrc:$XT), (ins vsrc:$XB),
446 "xvresp $XT, $XB", IIC_VecFP,
447 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
448
449 def XVRSQRTEDP : XX2Form<60, 202,
450 (outs vsrc:$XT), (ins vsrc:$XB),
451 "xvrsqrtedp $XT, $XB", IIC_VecFP,
452 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
453 def XVRSQRTESP : XX2Form<60, 138,
454 (outs vsrc:$XT), (ins vsrc:$XB),
455 "xvrsqrtesp $XT, $XB", IIC_VecFP,
456 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
457
458 // Compare Instructions
459 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000460 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000461 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000462 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000463 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000464 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000465
466 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000467 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000468 int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000469 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000470 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000471 int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000472 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000473 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000474 int_ppc_vsx_xvcmpgedp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000475 defm XVCMPGESP : XX3Form_Rcr<60, 83,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000476 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000477 int_ppc_vsx_xvcmpgesp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000478 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000479 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000480 int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000481 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000482 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000483 int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000484
485 // Move Instructions
486 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000487 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000488 "xsabsdp $XT, $XB", IIC_VecFP,
489 [(set f64:$XT, (fabs f64:$XB))]>;
490 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000491 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000492 "xsnabsdp $XT, $XB", IIC_VecFP,
493 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
494 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000495 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000496 "xsnegdp $XT, $XB", IIC_VecFP,
497 [(set f64:$XT, (fneg f64:$XB))]>;
498 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000499 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000500 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
501 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
502
503 def XVABSDP : XX2Form<60, 473,
504 (outs vsrc:$XT), (ins vsrc:$XB),
505 "xvabsdp $XT, $XB", IIC_VecFP,
506 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
507
508 def XVABSSP : XX2Form<60, 409,
509 (outs vsrc:$XT), (ins vsrc:$XB),
510 "xvabssp $XT, $XB", IIC_VecFP,
511 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
512
513 def XVCPSGNDP : XX3Form<60, 240,
514 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
515 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
516 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
517 def XVCPSGNSP : XX3Form<60, 208,
518 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
519 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
520 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
521
522 def XVNABSDP : XX2Form<60, 489,
523 (outs vsrc:$XT), (ins vsrc:$XB),
524 "xvnabsdp $XT, $XB", IIC_VecFP,
525 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
526 def XVNABSSP : XX2Form<60, 425,
527 (outs vsrc:$XT), (ins vsrc:$XB),
528 "xvnabssp $XT, $XB", IIC_VecFP,
529 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
530
531 def XVNEGDP : XX2Form<60, 505,
532 (outs vsrc:$XT), (ins vsrc:$XB),
533 "xvnegdp $XT, $XB", IIC_VecFP,
534 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
535 def XVNEGSP : XX2Form<60, 441,
536 (outs vsrc:$XT), (ins vsrc:$XB),
537 "xvnegsp $XT, $XB", IIC_VecFP,
538 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
539
540 // Conversion Instructions
541 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000542 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000543 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
544 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000545 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000546 "xscvdpsxds $XT, $XB", IIC_VecFP,
547 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000548 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000549 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000550 "xscvdpsxws $XT, $XB", IIC_VecFP,
551 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000552 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000553 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000554 "xscvdpuxds $XT, $XB", IIC_VecFP,
555 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000556 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000557 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000558 "xscvdpuxws $XT, $XB", IIC_VecFP,
559 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000560 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000561 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000562 "xscvspdp $XT, $XB", IIC_VecFP, []>;
563 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000564 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000565 "xscvsxddp $XT, $XB", IIC_VecFP,
566 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000567 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000568 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000569 "xscvuxddp $XT, $XB", IIC_VecFP,
570 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000571
572 def XVCVDPSP : XX2Form<60, 393,
573 (outs vsrc:$XT), (ins vsrc:$XB),
574 "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
575 def XVCVDPSXDS : XX2Form<60, 472,
576 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000577 "xvcvdpsxds $XT, $XB", IIC_VecFP,
578 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000579 def XVCVDPSXWS : XX2Form<60, 216,
580 (outs vsrc:$XT), (ins vsrc:$XB),
581 "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
582 def XVCVDPUXDS : XX2Form<60, 456,
583 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000584 "xvcvdpuxds $XT, $XB", IIC_VecFP,
585 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000586 def XVCVDPUXWS : XX2Form<60, 200,
587 (outs vsrc:$XT), (ins vsrc:$XB),
588 "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
589
590 def XVCVSPDP : XX2Form<60, 457,
591 (outs vsrc:$XT), (ins vsrc:$XB),
592 "xvcvspdp $XT, $XB", IIC_VecFP, []>;
593 def XVCVSPSXDS : XX2Form<60, 408,
594 (outs vsrc:$XT), (ins vsrc:$XB),
595 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
596 def XVCVSPSXWS : XX2Form<60, 152,
597 (outs vsrc:$XT), (ins vsrc:$XB),
598 "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
599 def XVCVSPUXDS : XX2Form<60, 392,
600 (outs vsrc:$XT), (ins vsrc:$XB),
601 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
602 def XVCVSPUXWS : XX2Form<60, 136,
603 (outs vsrc:$XT), (ins vsrc:$XB),
604 "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
605 def XVCVSXDDP : XX2Form<60, 504,
606 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000607 "xvcvsxddp $XT, $XB", IIC_VecFP,
608 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000609 def XVCVSXDSP : XX2Form<60, 440,
610 (outs vsrc:$XT), (ins vsrc:$XB),
611 "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
612 def XVCVSXWDP : XX2Form<60, 248,
613 (outs vsrc:$XT), (ins vsrc:$XB),
614 "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
615 def XVCVSXWSP : XX2Form<60, 184,
616 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic44513e52016-07-05 09:22:29 +0000617 "xvcvsxwsp $XT, $XB", IIC_VecFP,
618 [(set v4f32:$XT, (sint_to_fp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000619 def XVCVUXDDP : XX2Form<60, 488,
620 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000621 "xvcvuxddp $XT, $XB", IIC_VecFP,
622 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000623 def XVCVUXDSP : XX2Form<60, 424,
624 (outs vsrc:$XT), (ins vsrc:$XB),
625 "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
626 def XVCVUXWDP : XX2Form<60, 232,
627 (outs vsrc:$XT), (ins vsrc:$XB),
628 "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
629 def XVCVUXWSP : XX2Form<60, 168,
630 (outs vsrc:$XT), (ins vsrc:$XB),
631 "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
632
633 // Rounding Instructions
634 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000635 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000636 "xsrdpi $XT, $XB", IIC_VecFP,
637 [(set f64:$XT, (frnd f64:$XB))]>;
638 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000639 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000640 "xsrdpic $XT, $XB", IIC_VecFP,
641 [(set f64:$XT, (fnearbyint f64:$XB))]>;
642 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000643 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000644 "xsrdpim $XT, $XB", IIC_VecFP,
645 [(set f64:$XT, (ffloor f64:$XB))]>;
646 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000647 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000648 "xsrdpip $XT, $XB", IIC_VecFP,
649 [(set f64:$XT, (fceil f64:$XB))]>;
650 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000651 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000652 "xsrdpiz $XT, $XB", IIC_VecFP,
653 [(set f64:$XT, (ftrunc f64:$XB))]>;
654
655 def XVRDPI : XX2Form<60, 201,
656 (outs vsrc:$XT), (ins vsrc:$XB),
657 "xvrdpi $XT, $XB", IIC_VecFP,
658 [(set v2f64:$XT, (frnd v2f64:$XB))]>;
659 def XVRDPIC : XX2Form<60, 235,
660 (outs vsrc:$XT), (ins vsrc:$XB),
661 "xvrdpic $XT, $XB", IIC_VecFP,
662 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
663 def XVRDPIM : XX2Form<60, 249,
664 (outs vsrc:$XT), (ins vsrc:$XB),
665 "xvrdpim $XT, $XB", IIC_VecFP,
666 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
667 def XVRDPIP : XX2Form<60, 233,
668 (outs vsrc:$XT), (ins vsrc:$XB),
669 "xvrdpip $XT, $XB", IIC_VecFP,
670 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
671 def XVRDPIZ : XX2Form<60, 217,
672 (outs vsrc:$XT), (ins vsrc:$XB),
673 "xvrdpiz $XT, $XB", IIC_VecFP,
674 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
675
676 def XVRSPI : XX2Form<60, 137,
677 (outs vsrc:$XT), (ins vsrc:$XB),
678 "xvrspi $XT, $XB", IIC_VecFP,
679 [(set v4f32:$XT, (frnd v4f32:$XB))]>;
680 def XVRSPIC : XX2Form<60, 171,
681 (outs vsrc:$XT), (ins vsrc:$XB),
682 "xvrspic $XT, $XB", IIC_VecFP,
683 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
684 def XVRSPIM : XX2Form<60, 185,
685 (outs vsrc:$XT), (ins vsrc:$XB),
686 "xvrspim $XT, $XB", IIC_VecFP,
687 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
688 def XVRSPIP : XX2Form<60, 169,
689 (outs vsrc:$XT), (ins vsrc:$XB),
690 "xvrspip $XT, $XB", IIC_VecFP,
691 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
692 def XVRSPIZ : XX2Form<60, 153,
693 (outs vsrc:$XT), (ins vsrc:$XB),
694 "xvrspiz $XT, $XB", IIC_VecFP,
695 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
696
697 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000698 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000699 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000700 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000701 "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
702 [(set vsfrc:$XT,
703 (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000704 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000705 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000706 "xsmindp $XT, $XA, $XB", IIC_VecFP,
707 [(set vsfrc:$XT,
708 (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000709
710 def XVMAXDP : XX3Form<60, 224,
711 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000712 "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
713 [(set vsrc:$XT,
714 (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000715 def XVMINDP : XX3Form<60, 232,
716 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000717 "xvmindp $XT, $XA, $XB", IIC_VecFP,
718 [(set vsrc:$XT,
719 (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000720
721 def XVMAXSP : XX3Form<60, 192,
722 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000723 "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
724 [(set vsrc:$XT,
725 (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000726 def XVMINSP : XX3Form<60, 200,
727 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000728 "xvminsp $XT, $XA, $XB", IIC_VecFP,
729 [(set vsrc:$XT,
730 (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000731 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000732} // Uses = [RM]
733
734 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000735 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000736 def XXLAND : XX3Form<60, 130,
737 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000738 "xxland $XT, $XA, $XB", IIC_VecGeneral,
739 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000740 def XXLANDC : XX3Form<60, 138,
741 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000742 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
743 [(set v4i32:$XT, (and v4i32:$XA,
744 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000745 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000746 def XXLNOR : XX3Form<60, 162,
747 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000748 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
749 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
750 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000751 def XXLOR : XX3Form<60, 146,
752 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000753 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
754 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000755 let isCodeGenOnly = 1 in
756 def XXLORf: XX3Form<60, 146,
757 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
758 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000759 def XXLXOR : XX3Form<60, 154,
760 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000761 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
762 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000763 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000764
765 // Permutation Instructions
766 def XXMRGHW : XX3Form<60, 18,
767 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
768 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
769 def XXMRGLW : XX3Form<60, 50,
770 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
771 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
772
773 def XXPERMDI : XX3Form_2<60, 10,
774 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
775 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
776 def XXSEL : XX4Form<60, 3,
777 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
778 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
779
780 def XXSLDWI : XX3Form_2<60, 2,
781 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +0000782 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm,
783 [(set v4i32:$XT, (PPCvecshl v4i32:$XA, v4i32:$XB,
784 imm32SExt16:$SHW))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000785 def XXSPLTW : XX2Form_2<60, 164,
786 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
Nemanja Ivanovic1a2b2f02016-05-04 16:04:02 +0000787 "xxspltw $XT, $XB, $UIM", IIC_VecPerm,
788 [(set v4i32:$XT,
789 (PPCxxsplt v4i32:$XB, imm32SExt16:$UIM))]>;
Craig Topperc50d64b2014-11-26 00:46:26 +0000790} // hasSideEffects
Hal Finkel27774d92014-03-13 07:58:58 +0000791
Bill Schmidt61e65232014-10-22 13:13:40 +0000792// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
793// instruction selection into a branch sequence.
794let usesCustomInserter = 1, // Expanded after instruction selection.
795 PPC970_Single = 1 in {
796
797 def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
798 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
799 "#SELECT_CC_VSRC",
800 []>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000801 def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
802 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
803 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000804 [(set v2f64:$dst,
805 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000806 def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
807 (ins crrc:$cond, f8rc:$T, f8rc:$F,
808 i32imm:$BROPC), "#SELECT_CC_VSFRC",
809 []>;
810 def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
811 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
812 "#SELECT_VSFRC",
813 [(set f64:$dst,
814 (select i1:$cond, f64:$T, f64:$F))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000815 def SELECT_CC_VSSRC: Pseudo<(outs f4rc:$dst),
816 (ins crrc:$cond, f4rc:$T, f4rc:$F,
817 i32imm:$BROPC), "#SELECT_CC_VSSRC",
818 []>;
819 def SELECT_VSSRC: Pseudo<(outs f4rc:$dst),
820 (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
821 "#SELECT_VSSRC",
822 [(set f32:$dst,
823 (select i1:$cond, f32:$T, f32:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000824} // usesCustomInserter
825} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000826
Hal Finkel27774d92014-03-13 07:58:58 +0000827def : InstAlias<"xvmovdp $XT, $XB",
828 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
829def : InstAlias<"xvmovsp $XT, $XB",
830 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
831
832def : InstAlias<"xxspltd $XT, $XB, 0",
833 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
834def : InstAlias<"xxspltd $XT, $XB, 1",
835 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
836def : InstAlias<"xxmrghd $XT, $XA, $XB",
837 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
838def : InstAlias<"xxmrgld $XT, $XA, $XB",
839 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
840def : InstAlias<"xxswapd $XT, $XB",
841 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
842
843let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000844
845let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000846def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000847 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000848
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000849def : Pat<(f64 (extractelt v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000850 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000851def : Pat<(f64 (extractelt v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000852 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000853}
854
855let Predicates = [IsLittleEndian] in {
856def : Pat<(v2f64 (scalar_to_vector f64:$A)),
857 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
858 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
859
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000860def : Pat<(f64 (extractelt v2f64:$S, 0)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000861 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000862def : Pat<(f64 (extractelt v2f64:$S, 1)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000863 (f64 (EXTRACT_SUBREG $S, sub_64))>;
864}
Hal Finkel27774d92014-03-13 07:58:58 +0000865
866// Additional fnmsub patterns: -a*c + b == -(a*c - b)
867def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
868 (XSNMSUBADP $B, $C, $A)>;
869def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
870 (XSNMSUBADP $B, $C, $A)>;
871
872def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
873 (XVNMSUBADP $B, $C, $A)>;
874def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
875 (XVNMSUBADP $B, $C, $A)>;
876
877def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
878 (XVNMSUBASP $B, $C, $A)>;
879def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
880 (XVNMSUBASP $B, $C, $A)>;
881
Hal Finkel9e0baa62014-04-01 19:24:27 +0000882def : Pat<(v2f64 (bitconvert v4f32:$A)),
883 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000884def : Pat<(v2f64 (bitconvert v4i32:$A)),
885 (COPY_TO_REGCLASS $A, VSRC)>;
886def : Pat<(v2f64 (bitconvert v8i16:$A)),
887 (COPY_TO_REGCLASS $A, VSRC)>;
888def : Pat<(v2f64 (bitconvert v16i8:$A)),
889 (COPY_TO_REGCLASS $A, VSRC)>;
890
Hal Finkel9e0baa62014-04-01 19:24:27 +0000891def : Pat<(v4f32 (bitconvert v2f64:$A)),
892 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000893def : Pat<(v4i32 (bitconvert v2f64:$A)),
894 (COPY_TO_REGCLASS $A, VRRC)>;
895def : Pat<(v8i16 (bitconvert v2f64:$A)),
896 (COPY_TO_REGCLASS $A, VRRC)>;
897def : Pat<(v16i8 (bitconvert v2f64:$A)),
898 (COPY_TO_REGCLASS $A, VRRC)>;
899
Hal Finkel9e0baa62014-04-01 19:24:27 +0000900def : Pat<(v2i64 (bitconvert v4f32:$A)),
901 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000902def : Pat<(v2i64 (bitconvert v4i32:$A)),
903 (COPY_TO_REGCLASS $A, VSRC)>;
904def : Pat<(v2i64 (bitconvert v8i16:$A)),
905 (COPY_TO_REGCLASS $A, VSRC)>;
906def : Pat<(v2i64 (bitconvert v16i8:$A)),
907 (COPY_TO_REGCLASS $A, VSRC)>;
908
Hal Finkel9e0baa62014-04-01 19:24:27 +0000909def : Pat<(v4f32 (bitconvert v2i64:$A)),
910 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000911def : Pat<(v4i32 (bitconvert v2i64:$A)),
912 (COPY_TO_REGCLASS $A, VRRC)>;
913def : Pat<(v8i16 (bitconvert v2i64:$A)),
914 (COPY_TO_REGCLASS $A, VRRC)>;
915def : Pat<(v16i8 (bitconvert v2i64:$A)),
916 (COPY_TO_REGCLASS $A, VRRC)>;
917
Hal Finkel9281c9a2014-03-26 18:26:30 +0000918def : Pat<(v2f64 (bitconvert v2i64:$A)),
919 (COPY_TO_REGCLASS $A, VRRC)>;
920def : Pat<(v2i64 (bitconvert v2f64:$A)),
921 (COPY_TO_REGCLASS $A, VRRC)>;
922
Kit Bartond4eb73c2015-05-05 16:10:44 +0000923def : Pat<(v2f64 (bitconvert v1i128:$A)),
924 (COPY_TO_REGCLASS $A, VRRC)>;
925def : Pat<(v1i128 (bitconvert v2f64:$A)),
926 (COPY_TO_REGCLASS $A, VRRC)>;
927
Hal Finkel5c0d1452014-03-30 13:22:59 +0000928// sign extension patterns
929// To extend "in place" from v2i32 to v2i64, we have input data like:
930// | undef | i32 | undef | i32 |
931// but xvcvsxwdp expects the input in big-Endian format:
932// | i32 | undef | i32 | undef |
933// so we need to shift everything to the left by one i32 (word) before
934// the conversion.
935def : Pat<(sext_inreg v2i64:$C, v2i32),
936 (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
937def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
938 (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
939
Nemanja Ivanovic44513e52016-07-05 09:22:29 +0000940def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 0)),
941 (v2f64 (XVCVSXWDP (v2i64 (XXMRGHW $C, $C))))>;
942def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 1)),
943 (v2f64 (XVCVSXWDP (v2i64 (XXMRGLW $C, $C))))>;
944
945def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 0)),
946 (v2f64 (XVCVUXWDP (v2i64 (XXMRGHW $C, $C))))>;
947def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 1)),
948 (v2f64 (XVCVUXWDP (v2i64 (XXMRGLW $C, $C))))>;
949
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000950// Loads.
Bill Schmidt72954782014-11-12 04:19:40 +0000951def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
952def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000953def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000954def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000955
956// Stores.
Hal Finkele3d2b202015-02-01 19:07:41 +0000957def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
958 (STXVD2X $rS, xoaddr:$dst)>;
Bill Schmidt72954782014-11-12 04:19:40 +0000959def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
Hal Finkele3d2b202015-02-01 19:07:41 +0000960def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
961 (STXVW4X $rS, xoaddr:$dst)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000962def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
963
964// Permutes.
965def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
966def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
967def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
968def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +0000969def : Pat<(v2f64 (PPCswapNoChain v2f64:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000970
Bill Schmidt61e65232014-10-22 13:13:40 +0000971// Selects.
972def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000973 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
974def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000975 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
976def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000977 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
978def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000979 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
980def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
981 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
982def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000983 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
984def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000985 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
986def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000987 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
988def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000989 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
990def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
991 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
992
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000993def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000994 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
995def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000996 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
997def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000998 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
999def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001000 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1001def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
1002 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
1003def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001004 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1005def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001006 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1007def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001008 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1009def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001010 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1011def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
1012 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1013
Bill Schmidt76746922014-11-14 12:10:40 +00001014// Divides.
1015def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
1016 (XVDIVSP $A, $B)>;
1017def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
1018 (XVDIVDP $A, $B)>;
1019
Nemanja Ivanovic984a3612015-07-14 17:25:20 +00001020// Reciprocal estimate
1021def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
1022 (XVRESP $A)>;
1023def : Pat<(int_ppc_vsx_xvredp v2f64:$A),
1024 (XVREDP $A)>;
1025
Nemanja Ivanovicd358b8f2015-07-05 06:03:51 +00001026// Recip. square root estimate
1027def : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
1028 (XVRSQRTESP $A)>;
1029def : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
1030 (XVRSQRTEDP $A)>;
1031
Hal Finkel27774d92014-03-13 07:58:58 +00001032} // AddedComplexity
1033} // HasVSX
1034
Kit Barton298beb52015-02-18 16:21:46 +00001035// The following VSX instructions were introduced in Power ISA 2.07
1036/* FIXME: if the operands are v2i64, these patterns will not match.
1037 we should define new patterns or otherwise match the same patterns
1038 when the elements are larger than i32.
1039*/
1040def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001041def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Kit Barton298beb52015-02-18 16:21:46 +00001042let Predicates = [HasP8Vector] in {
1043let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001044 let isCommutable = 1 in {
1045 def XXLEQV : XX3Form<60, 186,
1046 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1047 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
1048 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
1049 def XXLNAND : XX3Form<60, 178,
1050 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1051 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
1052 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
Kit Barton298beb52015-02-18 16:21:46 +00001053 v4i32:$XB)))]>;
1054 } // isCommutable
Nemanja Ivanovicd9e4b4f2015-07-10 14:25:17 +00001055
Nemanja Ivanovic5655fb32015-07-10 12:38:08 +00001056 def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
1057 (XXLEQV $A, $B)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001058
1059 def XXLORC : XX3Form<60, 170,
1060 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1061 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
1062 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
1063
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001064 // VSX scalar loads introduced in ISA 2.07
1065 let mayLoad = 1 in {
1066 def LXSSPX : XX1Form<31, 524, (outs vssrc:$XT), (ins memrr:$src),
1067 "lxsspx $XT, $src", IIC_LdStLFD,
1068 [(set f32:$XT, (load xoaddr:$src))]>;
1069 def LXSIWAX : XX1Form<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
1070 "lxsiwax $XT, $src", IIC_LdStLFD,
1071 [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
1072 def LXSIWZX : XX1Form<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
1073 "lxsiwzx $XT, $src", IIC_LdStLFD,
1074 [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
1075 } // mayLoad
1076
1077 // VSX scalar stores introduced in ISA 2.07
1078 let mayStore = 1 in {
1079 def STXSSPX : XX1Form<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
1080 "stxsspx $XT, $dst", IIC_LdStSTFD,
1081 [(store f32:$XT, xoaddr:$dst)]>;
1082 def STXSIWX : XX1Form<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
1083 "stxsiwx $XT, $dst", IIC_LdStSTFD,
1084 [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
1085 } // mayStore
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001086
1087 def : Pat<(f64 (extloadf32 xoaddr:$src)),
1088 (COPY_TO_REGCLASS (LXSSPX xoaddr:$src), VSFRC)>;
1089 def : Pat<(f64 (fextend f32:$src)),
1090 (COPY_TO_REGCLASS $src, VSFRC)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00001091
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001092 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001093 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1094 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001095 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1096 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001097 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1098 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001099 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1100 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
1101 (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1102 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001103 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1104 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001105 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1106 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001107 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1108 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001109 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1110 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001111 (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001112
1113 // VSX Elementary Scalar FP arithmetic (SP)
1114 let isCommutable = 1 in {
1115 def XSADDSP : XX3Form<60, 0,
1116 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1117 "xsaddsp $XT, $XA, $XB", IIC_VecFP,
1118 [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
1119 def XSMULSP : XX3Form<60, 16,
1120 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1121 "xsmulsp $XT, $XA, $XB", IIC_VecFP,
1122 [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
1123 } // isCommutable
1124
1125 def XSDIVSP : XX3Form<60, 24,
1126 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1127 "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
1128 [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
1129 def XSRESP : XX2Form<60, 26,
1130 (outs vssrc:$XT), (ins vssrc:$XB),
1131 "xsresp $XT, $XB", IIC_VecFP,
1132 [(set f32:$XT, (PPCfre f32:$XB))]>;
1133 def XSSQRTSP : XX2Form<60, 11,
1134 (outs vssrc:$XT), (ins vssrc:$XB),
1135 "xssqrtsp $XT, $XB", IIC_FPSqrtS,
1136 [(set f32:$XT, (fsqrt f32:$XB))]>;
1137 def XSRSQRTESP : XX2Form<60, 10,
1138 (outs vssrc:$XT), (ins vssrc:$XB),
1139 "xsrsqrtesp $XT, $XB", IIC_VecFP,
1140 [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
1141 def XSSUBSP : XX3Form<60, 8,
1142 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1143 "xssubsp $XT, $XA, $XB", IIC_VecFP,
1144 [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00001145
1146 // FMA Instructions
1147 let BaseName = "XSMADDASP" in {
1148 let isCommutable = 1 in
1149 def XSMADDASP : XX3Form<60, 1,
1150 (outs vssrc:$XT),
1151 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1152 "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
1153 [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
1154 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1155 AltVSXFMARel;
1156 let IsVSXFMAAlt = 1 in
1157 def XSMADDMSP : XX3Form<60, 9,
1158 (outs vssrc:$XT),
1159 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1160 "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1161 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1162 AltVSXFMARel;
1163 }
1164
1165 let BaseName = "XSMSUBASP" in {
1166 let isCommutable = 1 in
1167 def XSMSUBASP : XX3Form<60, 17,
1168 (outs vssrc:$XT),
1169 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1170 "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
1171 [(set f32:$XT, (fma f32:$XA, f32:$XB,
1172 (fneg f32:$XTi)))]>,
1173 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1174 AltVSXFMARel;
1175 let IsVSXFMAAlt = 1 in
1176 def XSMSUBMSP : XX3Form<60, 25,
1177 (outs vssrc:$XT),
1178 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1179 "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1180 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1181 AltVSXFMARel;
1182 }
1183
1184 let BaseName = "XSNMADDASP" in {
1185 let isCommutable = 1 in
1186 def XSNMADDASP : XX3Form<60, 129,
1187 (outs vssrc:$XT),
1188 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1189 "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
1190 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1191 f32:$XTi)))]>,
1192 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1193 AltVSXFMARel;
1194 let IsVSXFMAAlt = 1 in
1195 def XSNMADDMSP : XX3Form<60, 137,
1196 (outs vssrc:$XT),
1197 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1198 "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1199 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1200 AltVSXFMARel;
1201 }
1202
1203 let BaseName = "XSNMSUBASP" in {
1204 let isCommutable = 1 in
1205 def XSNMSUBASP : XX3Form<60, 145,
1206 (outs vssrc:$XT),
1207 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1208 "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
1209 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1210 (fneg f32:$XTi))))]>,
1211 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1212 AltVSXFMARel;
1213 let IsVSXFMAAlt = 1 in
1214 def XSNMSUBMSP : XX3Form<60, 153,
1215 (outs vssrc:$XT),
1216 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1217 "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1218 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1219 AltVSXFMARel;
1220 }
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001221
1222 // Single Precision Conversions (FP <-> INT)
1223 def XSCVSXDSP : XX2Form<60, 312,
1224 (outs vssrc:$XT), (ins vsfrc:$XB),
1225 "xscvsxdsp $XT, $XB", IIC_VecFP,
1226 [(set f32:$XT, (PPCfcfids f64:$XB))]>;
1227 def XSCVUXDSP : XX2Form<60, 296,
1228 (outs vssrc:$XT), (ins vsfrc:$XB),
1229 "xscvuxdsp $XT, $XB", IIC_VecFP,
1230 [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
1231
1232 // Conversions between vector and scalar single precision
1233 def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
1234 "xscvdpspn $XT, $XB", IIC_VecFP, []>;
1235 def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
1236 "xscvspdpn $XT, $XB", IIC_VecFP, []>;
1237
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001238} // AddedComplexity = 400
Kit Barton298beb52015-02-18 16:21:46 +00001239} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001240
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001241let Predicates = [HasDirectMove] in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001242 // VSX direct move instructions
1243 def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
1244 "mfvsrd $rA, $XT", IIC_VecGeneral,
1245 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
1246 Requires<[In64BitMode]>;
1247 def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
1248 "mfvsrwz $rA, $XT", IIC_VecGeneral,
1249 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
1250 def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
1251 "mtvsrd $XT, $rA", IIC_VecGeneral,
1252 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1253 Requires<[In64BitMode]>;
1254 def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1255 "mtvsrwa $XT, $rA", IIC_VecGeneral,
1256 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1257 def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1258 "mtvsrwz $XT, $rA", IIC_VecGeneral,
1259 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001260} // HasDirectMove
1261
1262let Predicates = [IsISA3_0, HasDirectMove] in {
1263 def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),
1264 "mtvsrws $XT, $rA", IIC_VecGeneral,
1265 []>;
1266
1267 def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
1268 "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,
1269 []>, Requires<[In64BitMode]>;
1270
1271 def MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT),
1272 "mfvsrld $rA, $XT", IIC_VecGeneral,
1273 []>, Requires<[In64BitMode]>;
1274
1275} // IsISA3_0, HasDirectMove
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001276
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001277/* Direct moves of various widths from GPR's into VSR's. Each move lines
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001278 the value up into element 0 (both BE and LE). Namely, entities smaller than
1279 a doubleword are shifted left and moved for BE. For LE, they're moved, then
1280 swapped to go into the least significant element of the VSR.
1281*/
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001282def MovesToVSR {
1283 dag BE_BYTE_0 =
1284 (MTVSRD
1285 (RLDICR
1286 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1287 dag BE_HALF_0 =
1288 (MTVSRD
1289 (RLDICR
1290 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1291 dag BE_WORD_0 =
1292 (MTVSRD
1293 (RLDICR
1294 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001295 dag BE_DWORD_0 = (MTVSRD $A);
1296
1297 dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001298 dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1299 LE_MTVSRW, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001300 dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001301 dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1302 BE_DWORD_0, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001303 dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1304}
1305
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001306/* Patterns for extracting elements out of vectors. Integer elements are
1307 extracted using direct move operations. Patterns for extracting elements
1308 whose indices are not available at compile time are also provided with
1309 various _VARIABLE_ patterns.
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001310 The numbering for the DAG's is for LE, but when used on BE, the correct
1311 LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1312*/
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001313def VectorExtractions {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001314 // Doubleword extraction
1315 dag LE_DWORD_0 =
1316 (MFVSRD
1317 (EXTRACT_SUBREG
1318 (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1319 (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1320 dag LE_DWORD_1 = (MFVSRD
1321 (EXTRACT_SUBREG
1322 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1323
1324 // Word extraction
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001325 dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001326 dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1327 dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1328 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1329 dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1330
1331 // Halfword extraction
1332 dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1333 dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1334 dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1335 dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1336 dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1337 dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1338 dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1339 dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1340
1341 // Byte extraction
1342 dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1343 dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1344 dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1345 dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1346 dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1347 dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1348 dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1349 dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1350 dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1351 dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1352 dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1353 dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1354 dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1355 dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1356 dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1357 dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1358
1359 /* Variable element number (BE and LE patterns must be specified separately)
1360 This is a rather involved process.
1361
1362 Conceptually, this is how the move is accomplished:
1363 1. Identify which doubleword contains the element
1364 2. Shift in the VMX register so that the correct doubleword is correctly
1365 lined up for the MFVSRD
1366 3. Perform the move so that the element (along with some extra stuff)
1367 is in the GPR
1368 4. Right shift within the GPR so that the element is right-justified
1369
1370 Of course, the index is an element number which has a different meaning
1371 on LE/BE so the patterns have to be specified separately.
1372
1373 Note: The final result will be the element right-justified with high
1374 order bits being arbitrarily defined (namely, whatever was in the
1375 vector register to the left of the value originally).
1376 */
1377
1378 /* LE variable byte
1379 Number 1. above:
1380 - For elements 0-7, we shift left by 8 bytes since they're on the right
1381 - For elements 8-15, we need not shift (shift left by zero bytes)
1382 This is accomplished by inverting the bits of the index and AND-ing
1383 with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1384 */
1385 dag LE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDC8 (LI8 8), $Idx));
1386
1387 // Number 2. above:
1388 // - Now that we set up the shift amount, we shift in the VMX register
1389 dag LE_VBYTE_PERMUTE = (VPERM $S, $S, LE_VBYTE_PERM_VEC);
1390
1391 // Number 3. above:
1392 // - The doubleword containing our element is moved to a GPR
1393 dag LE_MV_VBYTE = (MFVSRD
1394 (EXTRACT_SUBREG
1395 (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1396 sub_64));
1397
1398 /* Number 4. above:
1399 - Truncate the element number to the range 0-7 (8-15 are symmetrical
1400 and out of range values are truncated accordingly)
1401 - Multiply by 8 as we need to shift right by the number of bits, not bytes
1402 - Shift right in the GPR by the calculated value
1403 */
1404 dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1405 sub_32);
1406 dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1407 sub_32);
1408
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001409 /* LE variable halfword
1410 Number 1. above:
1411 - For elements 0-3, we shift left by 8 since they're on the right
1412 - For elements 4-7, we need not shift (shift left by zero bytes)
1413 Similarly to the byte pattern, we invert the bits of the index, but we
1414 AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1415 Of course, the shift is still by 8 bytes, so we must multiply by 2.
1416 */
1417 dag LE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62));
1418
1419 // Number 2. above:
1420 // - Now that we set up the shift amount, we shift in the VMX register
1421 dag LE_VHALF_PERMUTE = (VPERM $S, $S, LE_VHALF_PERM_VEC);
1422
1423 // Number 3. above:
1424 // - The doubleword containing our element is moved to a GPR
1425 dag LE_MV_VHALF = (MFVSRD
1426 (EXTRACT_SUBREG
1427 (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1428 sub_64));
1429
1430 /* Number 4. above:
1431 - Truncate the element number to the range 0-3 (4-7 are symmetrical
1432 and out of range values are truncated accordingly)
1433 - Multiply by 16 as we need to shift right by the number of bits
1434 - Shift right in the GPR by the calculated value
1435 */
1436 dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1437 sub_32);
1438 dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1439 sub_32);
1440
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001441 /* LE variable word
1442 Number 1. above:
1443 - For elements 0-1, we shift left by 8 since they're on the right
1444 - For elements 2-3, we need not shift
1445 */
1446 dag LE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61));
1447
1448 // Number 2. above:
1449 // - Now that we set up the shift amount, we shift in the VMX register
1450 dag LE_VWORD_PERMUTE = (VPERM $S, $S, LE_VWORD_PERM_VEC);
1451
1452 // Number 3. above:
1453 // - The doubleword containing our element is moved to a GPR
1454 dag LE_MV_VWORD = (MFVSRD
1455 (EXTRACT_SUBREG
1456 (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
1457 sub_64));
1458
1459 /* Number 4. above:
1460 - Truncate the element number to the range 0-1 (2-3 are symmetrical
1461 and out of range values are truncated accordingly)
1462 - Multiply by 32 as we need to shift right by the number of bits
1463 - Shift right in the GPR by the calculated value
1464 */
1465 dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
1466 sub_32);
1467 dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
1468 sub_32);
1469
1470 /* LE variable doubleword
1471 Number 1. above:
1472 - For element 0, we shift left by 8 since it's on the right
1473 - For element 1, we need not shift
1474 */
1475 dag LE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60));
1476
1477 // Number 2. above:
1478 // - Now that we set up the shift amount, we shift in the VMX register
1479 dag LE_VDWORD_PERMUTE = (VPERM $S, $S, LE_VDWORD_PERM_VEC);
1480
1481 // Number 3. above:
1482 // - The doubleword containing our element is moved to a GPR
1483 // - Number 4. is not needed for the doubleword as the value is 64-bits
1484 dag LE_VARIABLE_DWORD =
1485 (MFVSRD (EXTRACT_SUBREG
1486 (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
1487 sub_64));
1488
1489 /* LE variable float
1490 - Shift the vector to line up the desired element to BE Word 0
1491 - Convert 32-bit float to a 64-bit single precision float
1492 */
1493 dag LE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR (XOR8 (LI8 3), $Idx), 2, 61));
1494 dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
1495 dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
1496
1497 /* LE variable double
1498 Same as the LE doubleword except there is no move.
1499 */
1500 dag LE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1501 (COPY_TO_REGCLASS $S, VRRC),
1502 LE_VDWORD_PERM_VEC);
1503 dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
1504
1505 /* BE variable byte
1506 The algorithm here is the same as the LE variable byte except:
1507 - The shift in the VMX register is by 0/8 for opposite element numbers so
1508 we simply AND the element number with 0x8
1509 - The order of elements after the move to GPR is reversed, so we invert
1510 the bits of the index prior to truncating to the range 0-7
1511 */
1512 dag BE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDIo8 $Idx, 8));
1513 dag BE_VBYTE_PERMUTE = (VPERM $S, $S, BE_VBYTE_PERM_VEC);
1514 dag BE_MV_VBYTE = (MFVSRD
1515 (EXTRACT_SUBREG
1516 (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1517 sub_64));
1518 dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1519 sub_32);
1520 dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1521 sub_32);
1522
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001523 /* BE variable halfword
1524 The algorithm here is the same as the LE variable halfword except:
1525 - The shift in the VMX register is by 0/8 for opposite element numbers so
1526 we simply AND the element number with 0x4 and multiply by 2
1527 - The order of elements after the move to GPR is reversed, so we invert
1528 the bits of the index prior to truncating to the range 0-3
1529 */
1530 dag BE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 4), 1, 62));
1531 dag BE_VHALF_PERMUTE = (VPERM $S, $S, BE_VHALF_PERM_VEC);
1532 dag BE_MV_VHALF = (MFVSRD
1533 (EXTRACT_SUBREG
1534 (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1535 sub_64));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001536 dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001537 sub_32);
1538 dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1539 sub_32);
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001540
1541 /* BE variable word
1542 The algorithm is the same as the LE variable word except:
1543 - The shift in the VMX register happens for opposite element numbers
1544 - The order of elements after the move to GPR is reversed, so we invert
1545 the bits of the index prior to truncating to the range 0-1
1546 */
1547 dag BE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 2), 2, 61));
1548 dag BE_VWORD_PERMUTE = (VPERM $S, $S, BE_VWORD_PERM_VEC);
1549 dag BE_MV_VWORD = (MFVSRD
1550 (EXTRACT_SUBREG
1551 (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
1552 sub_64));
1553 dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
1554 sub_32);
1555 dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
1556 sub_32);
1557
1558 /* BE variable doubleword
1559 Same as the LE doubleword except we shift in the VMX register for opposite
1560 element indices.
1561 */
1562 dag BE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 1), 3, 60));
1563 dag BE_VDWORD_PERMUTE = (VPERM $S, $S, BE_VDWORD_PERM_VEC);
1564 dag BE_VARIABLE_DWORD =
1565 (MFVSRD (EXTRACT_SUBREG
1566 (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
1567 sub_64));
1568
1569 /* BE variable float
1570 - Shift the vector to line up the desired element to BE Word 0
1571 - Convert 32-bit float to a 64-bit single precision float
1572 */
1573 dag BE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR $Idx, 2, 61));
1574 dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
1575 dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
1576
1577 /* BE variable double
1578 Same as the BE doubleword except there is no move.
1579 */
1580 dag BE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1581 (COPY_TO_REGCLASS $S, VRRC),
1582 BE_VDWORD_PERM_VEC);
1583 dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001584}
1585
1586// v4f32 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001587let Predicates = [IsBigEndian, HasP8Vector] in {
1588 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1589 (v4f32 (XSCVDPSPN $A))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001590 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1591 (f32 (XSCVSPDPN $S))>;
1592 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1593 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1594 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001595 (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001596 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1597 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001598 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1599 (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001600} // IsBigEndian, HasP8Vector
1601
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001602// Variable index vector_extract for v2f64 does not require P8Vector
1603let Predicates = [IsBigEndian, HasVSX] in
1604 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1605 (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
1606
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001607let Predicates = [IsBigEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001608 // v16i8 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001609 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001610 (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001611 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001612 (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001613 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001614 (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001615 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001616 (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
1617 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001618 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001619 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001620 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001621 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001622 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001623 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001624 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001625 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001626 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001627 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001628 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001629 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001630 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001631 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001632 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001633 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001634 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001635 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001636 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001637 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001638 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001639 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001640 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001641 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001642 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001643 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001644 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001645 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001646 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001647 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001648 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001649 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001650 (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001651
1652 // v8i16 scalar <-> vector conversions (BE)
1653 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001654 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001655 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001656 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001657 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001658 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001659 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001660 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001661 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001662 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001663 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001664 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001665 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001666 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001667 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001668 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001669 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001670 (i32 VectorExtractions.BE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001671
1672 // v4i32 scalar <-> vector conversions (BE)
1673 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001674 (i32 VectorExtractions.LE_WORD_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001675 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001676 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001677 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001678 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001679 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001680 (i32 VectorExtractions.LE_WORD_0)>;
1681 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1682 (i32 VectorExtractions.BE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001683
1684 // v2i64 scalar <-> vector conversions (BE)
1685 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001686 (i64 VectorExtractions.LE_DWORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001687 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001688 (i64 VectorExtractions.LE_DWORD_0)>;
1689 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1690 (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001691} // IsBigEndian, HasDirectMove
1692
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001693// v4f32 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001694let Predicates = [IsLittleEndian, HasP8Vector] in {
1695 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1696 (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001697 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1698 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1699 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001700 (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001701 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1702 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1703 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1704 (f32 (XSCVSPDPN $S))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001705 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1706 (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001707} // IsLittleEndian, HasP8Vector
1708
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001709// Variable index vector_extract for v2f64 does not require P8Vector
1710let Predicates = [IsLittleEndian, HasVSX] in
1711 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1712 (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
1713
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001714let Predicates = [IsLittleEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001715 // v16i8 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001716 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001717 (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001718 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001719 (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001720 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001721 (v4i32 MovesToVSR.LE_WORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001722 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001723 (v2i64 MovesToVSR.LE_DWORD_0)>;
1724 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001725 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001726 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001727 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001728 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001729 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001730 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001731 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001732 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001733 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001734 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001735 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001736 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001737 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001738 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001739 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001740 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001741 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001742 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001743 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001744 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001745 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001746 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001747 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001748 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001749 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001750 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001751 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001752 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001753 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001754 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001755 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001756 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001757 (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001758
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001759 // v8i16 scalar <-> vector conversions (LE)
1760 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001761 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001762 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001763 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001764 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001765 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001766 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001767 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001768 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001769 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001770 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001771 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001772 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001773 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001774 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001775 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001776 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001777 (i32 VectorExtractions.LE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001778
1779 // v4i32 scalar <-> vector conversions (LE)
1780 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001781 (i32 VectorExtractions.LE_WORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001782 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001783 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001784 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001785 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001786 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001787 (i32 VectorExtractions.LE_WORD_3)>;
1788 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1789 (i32 VectorExtractions.LE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001790
1791 // v2i64 scalar <-> vector conversions (LE)
1792 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001793 (i64 VectorExtractions.LE_DWORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001794 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001795 (i64 VectorExtractions.LE_DWORD_1)>;
1796 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1797 (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001798} // IsLittleEndian, HasDirectMove
Nemanja Ivanovic89224762015-12-15 14:50:34 +00001799
1800let Predicates = [HasDirectMove, HasVSX] in {
1801// bitconvert f32 -> i32
1802// (convert to 32-bit fp single, shift right 1 word, move to GPR)
1803def : Pat<(i32 (bitconvert f32:$S)),
1804 (i32 (MFVSRWZ (EXTRACT_SUBREG
1805 (XXSLDWI (XSCVDPSPN $S),(XSCVDPSPN $S), 3),
1806 sub_64)))>;
1807// bitconvert i32 -> f32
1808// (move to FPR, shift left 1 word, convert to 64-bit fp single)
1809def : Pat<(f32 (bitconvert i32:$A)),
1810 (f32 (XSCVSPDPN
1811 (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
1812
1813// bitconvert f64 -> i64
1814// (move to GPR, nothing else needed)
1815def : Pat<(i64 (bitconvert f64:$S)),
1816 (i64 (MFVSRD $S))>;
1817
1818// bitconvert i64 -> f64
1819// (move to FPR, nothing else needed)
1820def : Pat<(f64 (bitconvert i64:$S)),
1821 (f64 (MTVSRD $S))>;
1822}
Kit Barton93612ec2016-02-26 21:11:55 +00001823
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00001824def AlignValues {
1825 dag F32_TO_BE_WORD1 = (v4f32 (XXSLDWI (XSCVDPSPN $B), (XSCVDPSPN $B), 3));
1826 dag I32_TO_BE_WORD1 = (COPY_TO_REGCLASS (MTVSRWZ $B), VSRC);
1827}
1828
Kit Barton93612ec2016-02-26 21:11:55 +00001829// The following VSX instructions were introduced in Power ISA 3.0
1830def HasP9Vector : Predicate<"PPCSubTarget->hasP9Vector()">;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00001831let AddedComplexity = 400, Predicates = [HasP9Vector] in {
Kit Barton93612ec2016-02-26 21:11:55 +00001832
1833 // [PO VRT XO VRB XO /]
1834 class X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1835 list<dag> pattern>
1836 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB),
1837 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1838
1839 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
1840 class X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1841 list<dag> pattern>
1842 : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isDOT;
1843
1844 // [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less),
1845 // So we use different operand class for VRB
1846 class X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1847 RegisterOperand vbtype, list<dag> pattern>
1848 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB),
1849 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1850
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00001851 // [PO T XO B XO BX /]
1852 class XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1853 list<dag> pattern>
1854 : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB),
1855 !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>;
1856
Kit Barton93612ec2016-02-26 21:11:55 +00001857 // [PO T XO B XO BX TX]
1858 class XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1859 RegisterOperand vtype, list<dag> pattern>
1860 : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB),
1861 !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>;
1862
1863 // [PO T A B XO AX BX TX], src and dest register use different operand class
1864 class XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc,
1865 RegisterOperand xty, RegisterOperand aty, RegisterOperand bty,
1866 InstrItinClass itin, list<dag> pattern>
1867 : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB),
1868 !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>;
1869
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00001870 // [PO VRT VRA VRB XO /]
1871 class X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1872 list<dag> pattern>
1873 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB),
1874 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>;
1875
1876 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
1877 class X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc,
1878 list<dag> pattern>
1879 : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isDOT;
1880
1881 //===--------------------------------------------------------------------===//
1882 // Quad-Precision Scalar Move Instructions:
1883
1884 // Copy Sign
1885 def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp", []>;
1886
1887 // Absolute/Negative-Absolute/Negate
1888 def XSABSQP : X_VT5_XO5_VB5<63, 0, 804, "xsabsqp" , []>;
1889 def XSNABSQP : X_VT5_XO5_VB5<63, 8, 804, "xsnabsqp", []>;
1890 def XSNEGQP : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp" , []>;
1891
1892 //===--------------------------------------------------------------------===//
1893 // Quad-Precision Scalar Floating-Point Arithmetic Instructions:
1894
1895 // Add/Divide/Multiply/Subtract
1896 def XSADDQP : X_VT5_VA5_VB5 <63, 4, "xsaddqp" , []>;
1897 def XSADDQPO : X_VT5_VA5_VB5_Ro<63, 4, "xsaddqpo", []>;
1898 def XSDIVQP : X_VT5_VA5_VB5 <63, 548, "xsdivqp" , []>;
1899 def XSDIVQPO : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo", []>;
1900 def XSMULQP : X_VT5_VA5_VB5 <63, 36, "xsmulqp" , []>;
1901 def XSMULQPO : X_VT5_VA5_VB5_Ro<63, 36, "xsmulqpo", []>;
1902 def XSSUBQP : X_VT5_VA5_VB5 <63, 516, "xssubqp" , []>;
1903 def XSSUBQPO : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo", []>;
1904
1905 // Square-Root
1906 def XSSQRTQP : X_VT5_XO5_VB5 <63, 27, 804, "xssqrtqp" , []>;
1907 def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo", []>;
1908
1909 // (Negative) Multiply-{Add/Subtract}
1910 def XSMADDQP : X_VT5_VA5_VB5 <63, 388, "xsmaddqp" , []>;
1911 def XSMADDQPO : X_VT5_VA5_VB5_Ro<63, 388, "xsmaddqpo" , []>;
1912 def XSMSUBQP : X_VT5_VA5_VB5 <63, 420, "xsmsubqp" , []>;
1913 def XSMSUBQPO : X_VT5_VA5_VB5_Ro<63, 420, "xsmsubqpo" , []>;
1914 def XSNMADDQP : X_VT5_VA5_VB5 <63, 452, "xsnmaddqp" , []>;
1915 def XSNMADDQPO: X_VT5_VA5_VB5_Ro<63, 452, "xsnmaddqpo", []>;
1916 def XSNMSUBQP : X_VT5_VA5_VB5 <63, 484, "xsnmsubqp" , []>;
1917 def XSNMSUBQPO: X_VT5_VA5_VB5_Ro<63, 484, "xsnmsubqpo", []>;
1918
Kit Barton93612ec2016-02-26 21:11:55 +00001919 //===--------------------------------------------------------------------===//
1920 // Quad/Double-Precision Compare Instructions:
1921
1922 // [PO BF // VRA VRB XO /]
1923 class X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1924 list<dag> pattern>
1925 : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB),
1926 !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> {
1927 let Pattern = pattern;
1928 }
1929
1930 // QP Compare Ordered/Unordered
1931 def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>;
1932 def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>;
1933
1934 // DP/QP Compare Exponents
1935 def XSCMPEXPDP : XX3Form_1<60, 59,
1936 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
1937 "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>;
1938 def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>;
1939
1940 // DP Compare ==, >=, >, !=
1941 // Use vsrc for XT, because the entire register of XT is set.
1942 // XT.dword[1] = 0x0000_0000_0000_0000
1943 def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc,
1944 IIC_FPCompare, []>;
1945 def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc,
1946 IIC_FPCompare, []>;
1947 def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc,
1948 IIC_FPCompare, []>;
1949 def XSCMPNEDP : XX3_XT5_XA5_XB5<60, 27, "xscmpnedp", vsrc, vsfrc, vsfrc,
1950 IIC_FPCompare, []>;
1951 // Vector Compare Not Equal
1952 def XVCMPNEDP : XX3Form_Rc<60, 123,
1953 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1954 "xvcmpnedp $XT, $XA, $XB", IIC_VecFPCompare, []>;
1955 let Defs = [CR6] in
1956 def XVCMPNEDPo : XX3Form_Rc<60, 123,
1957 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1958 "xvcmpnedp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1959 isDOT;
1960 def XVCMPNESP : XX3Form_Rc<60, 91,
1961 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1962 "xvcmpnesp $XT, $XA, $XB", IIC_VecFPCompare, []>;
1963 let Defs = [CR6] in
1964 def XVCMPNESPo : XX3Form_Rc<60, 91,
1965 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1966 "xvcmpnesp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1967 isDOT;
1968
1969 //===--------------------------------------------------------------------===//
1970 // Quad-Precision Floating-Point Conversion Instructions:
1971
1972 // Convert DP -> QP
1973 def XSCVDPQP : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vsfrc, []>;
1974
1975 // Round & Convert QP -> DP (dword[1] is set to zero)
1976 def XSCVQPDP : X_VT5_XO5_VB5 <63, 20, 836, "xscvqpdp" , []>;
1977 def XSCVQPDPO : X_VT5_XO5_VB5_Ro<63, 20, 836, "xscvqpdpo", []>;
1978
1979 // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero)
1980 def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>;
1981 def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>;
1982 def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>;
1983 def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>;
1984
1985 // Convert (Un)Signed DWord -> QP
1986 def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vsfrc, []>;
1987 def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vsfrc, []>;
1988
1989 //===--------------------------------------------------------------------===//
1990 // Round to Floating-Point Integer Instructions
1991
1992 // (Round &) Convert DP <-> HP
1993 // Note! xscvdphp's src and dest register both use the left 64 bits, so we use
1994 // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits,
1995 // but we still use vsfrc for it.
1996 def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>;
1997 def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>;
1998
1999 // Vector HP -> SP
2000 def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>;
2001 def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc, []>;
2002
2003 class Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc,
2004 list<dag> pattern>
2005 : Z23Form_1<opcode, xo,
2006 (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc),
2007 !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> {
2008 let RC = ex;
2009 }
2010
2011 // Round to Quad-Precision Integer [with Inexact]
2012 def XSRQPI : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 0, "xsrqpi" , []>;
2013 def XSRQPIX : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 1, "xsrqpix", []>;
2014
2015 // Round Quad-Precision to Double-Extended Precision (fp80)
2016 def XSRQPXP : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002017
2018 //===--------------------------------------------------------------------===//
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002019 // Insert/Extract Instructions
2020
2021 // Insert Exponent DP/QP
2022 // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU
2023 def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
2024 "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>;
2025 // vB NOTE: only vB.dword[0] is used, that's why we don't use
2026 // X_VT5_VA5_VB5 form
2027 def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB),
2028 "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>;
2029
2030 // Extract Exponent/Significand DP/QP
2031 def XSXEXPDP : XX2_RT5_XO5_XB6<60, 0, 347, "xsxexpdp", []>;
2032 def XSXSIGDP : XX2_RT5_XO5_XB6<60, 1, 347, "xsxsigdp", []>;
2033 def XSXEXPQP : X_VT5_XO5_VB5 <63, 2, 804, "xsxexpqp", []>;
2034 def XSXSIGQP : X_VT5_XO5_VB5 <63, 18, 804, "xsxsigqp", []>;
2035
2036 // Vector Insert Word
2037 // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB.
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002038 def XXINSERTW :
2039 XX2_RD6_UIM5_RS6<60, 181, (outs vsrc:$XT),
2040 (ins vsrc:$XTi, vsrc:$XB, u4imm:$UIM),
2041 "xxinsertw $XT, $XB, $UIM", IIC_VecFP,
2042 [(set v4i32:$XT, (PPCxxinsert v4i32:$XTi, v4i32:$XB,
2043 imm32SExt16:$UIM))]>,
2044 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002045
2046 // Vector Extract Unsigned Word
2047 def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165,
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002048 (outs vsfrc:$XT), (ins vsrc:$XB, u4imm:$UIMM),
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002049 "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>;
2050
2051 // Vector Insert Exponent DP/SP
2052 def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc,
2053 IIC_VecFP, []>;
2054 def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc,
2055 IIC_VecFP, []>;
2056
2057 // Vector Extract Exponent/Significand DP/SP
2058 def XVXEXPDP : XX2_XT6_XO5_XB6<60, 0, 475, "xvxexpdp", vsrc, []>;
2059 def XVXEXPSP : XX2_XT6_XO5_XB6<60, 8, 475, "xvxexpsp", vsrc, []>;
2060 def XVXSIGDP : XX2_XT6_XO5_XB6<60, 1, 475, "xvxsigdp", vsrc, []>;
2061 def XVXSIGSP : XX2_XT6_XO5_XB6<60, 9, 475, "xvxsigsp", vsrc, []>;
2062
2063 //===--------------------------------------------------------------------===//
2064
2065 // Test Data Class SP/DP/QP
2066 def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298,
2067 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2068 "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>;
2069 def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362,
2070 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2071 "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>;
2072 def XSTSTDCQP : X_BF3_DCMX7_RS5 <63, 708,
2073 (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB),
2074 "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>;
2075
2076 // Vector Test Data Class SP/DP
2077 def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5,
2078 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2079 "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP, []>;
2080 def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5,
2081 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2082 "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP, []>;
2083
2084 //===--------------------------------------------------------------------===//
2085
2086 // Maximum/Minimum Type-C/Type-J DP
2087 // XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU, so we use vsrc for XT
2088 def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsrc, vsfrc, vsfrc,
2089 IIC_VecFP, []>;
2090 def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc,
2091 IIC_VecFP, []>;
2092 def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsrc, vsfrc, vsfrc,
2093 IIC_VecFP, []>;
2094 def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc,
2095 IIC_VecFP, []>;
2096
2097 //===--------------------------------------------------------------------===//
2098
2099 // Vector Byte-Reverse H/W/D/Q Word
2100 def XXBRH : XX2_XT6_XO5_XB6<60, 7, 475, "xxbrh", vsrc, []>;
2101 def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, []>;
2102 def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, []>;
2103 def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>;
2104
2105 // Vector Permute
2106 def XXPERM : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc,
2107 IIC_VecPerm, []>;
2108 def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc,
2109 IIC_VecPerm, []>;
2110
2111 // Vector Splat Immediate Byte
2112 def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8),
2113 "xxspltib $XT, $IMM8", IIC_VecPerm, []>;
2114
2115 //===--------------------------------------------------------------------===//
Kit Bartonba532dc2016-03-08 03:49:13 +00002116 // Vector/Scalar Load/Store Instructions
2117
2118 let mayLoad = 1 in {
2119 // Load Vector
2120 def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src),
2121 "lxv $XT, $src", IIC_LdStLFD, []>;
2122 // Load DWord
2123 def LXSD : DSForm_1<57, 2, (outs vrrc:$vD), (ins memrix:$src),
2124 "lxsd $vD, $src", IIC_LdStLFD, []>;
2125 // Load SP from src, convert it to DP, and place in dword[0]
2126 def LXSSP : DSForm_1<57, 3, (outs vrrc:$vD), (ins memrix:$src),
2127 "lxssp $vD, $src", IIC_LdStLFD, []>;
2128
2129 // [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different
2130 // "out" and "in" dag
2131 class X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2132 RegisterOperand vtype, list<dag> pattern>
2133 : XX1Form<opcode, xo, (outs vtype:$XT), (ins memrr:$src),
2134 !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>;
2135
2136 // Load as Integer Byte/Halfword & Zero Indexed
2137 def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc, []>;
2138 def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc, []>;
2139
2140 // Load Vector Halfword*8/Byte*16 Indexed
2141 def LXVH8X : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>;
2142 def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>;
2143
2144 // Load Vector Indexed
2145 def LXVX : X_XT6_RA5_RB5<31, 268, "lxvx" , vsrc, []>;
2146
2147 // Load Vector (Left-justified) with Length
2148 def LXVL : X_XT6_RA5_RB5<31, 269, "lxvl" , vsrc, []>;
2149 def LXVLL : X_XT6_RA5_RB5<31, 301, "lxvll" , vsrc, []>;
2150
2151 // Load Vector Word & Splat Indexed
2152 def LXVWSX : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>;
2153 } // end mayLoad
2154
2155 let mayStore = 1 in {
2156 // Store Vector
2157 def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst),
2158 "stxv $XT, $dst", IIC_LdStSTFD, []>;
2159 // Store DWord
2160 def STXSD : DSForm_1<61, 2, (outs), (ins vrrc:$vS, memrix:$dst),
2161 "stxsd $vS, $dst", IIC_LdStSTFD, []>;
2162 // Convert DP of dword[0] to SP, and Store to dst
2163 def STXSSP : DSForm_1<61, 3, (outs), (ins vrrc:$vS, memrix:$dst),
2164 "stxssp $vS, $dst", IIC_LdStSTFD, []>;
2165
2166 // [PO S RA RB XO SX]
2167 class X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2168 RegisterOperand vtype, list<dag> pattern>
2169 : XX1Form<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst),
2170 !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>;
2171
2172 // Store as Integer Byte/Halfword Indexed
2173 def STXSIBX : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsfrc, []>;
2174 def STXSIHX : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsfrc, []>;
2175
2176 // Store Vector Halfword*8/Byte*16 Indexed
2177 def STXVH8X : X_XS6_RA5_RB5<31, 940, "stxvh8x" , vsrc, []>;
2178 def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>;
2179
2180 // Store Vector Indexed
2181 def STXVX : X_XS6_RA5_RB5<31, 396, "stxvx" , vsrc, []>;
2182
2183 // Store Vector (Left-justified) with Length
2184 def STXVL : X_XS6_RA5_RB5<31, 397, "stxvl" , vsrc, []>;
2185 def STXVLL : X_XS6_RA5_RB5<31, 429, "stxvll" , vsrc, []>;
2186 } // end mayStore
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002187
2188 // Patterns for which instructions from ISA 3.0 are a better match
2189 let Predicates = [IsLittleEndian, HasP9Vector] in {
2190 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 0))))),
2191 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
2192 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 1))))),
2193 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
2194 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 2))))),
2195 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
2196 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 3))))),
2197 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
2198 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
2199 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
2200 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
2201 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
2202 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
2203 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
2204 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
2205 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
2206 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
2207 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
2208 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
2209 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
2210 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
2211 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
2212 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
2213 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
2214 } // IsLittleEndian, HasP9Vector
2215
2216 let Predicates = [IsBigEndian, HasP9Vector] in {
2217 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 0))))),
2218 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
2219 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 1))))),
2220 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
2221 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 2))))),
2222 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
2223 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 3))))),
2224 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
2225 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
2226 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
2227 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
2228 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
2229 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
2230 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
2231 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
2232 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
2233 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
2234 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
2235 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
2236 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
2237 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
2238 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
2239 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
2240 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
2241 } // IsLittleEndian, HasP9Vector
2242} // end HasP9Vector, AddedComplexity