blob: d7f64c97d6c77f3e3a68c2f36b6af57fa281e4e2 [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]>;
60
61def PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
62 [SDNPHasChain, SDNPMayLoad]>;
63def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
64 [SDNPHasChain, SDNPMayStore]>;
65def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +000066def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
67def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
68def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000069
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000070multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase,
71 string asmstr, InstrItinClass itin, Intrinsic Int,
72 ValueType OutTy, ValueType InTy> {
Hal Finkel27774d92014-03-13 07:58:58 +000073 let BaseName = asmbase in {
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000074 def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000075 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000076 [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000077 let Defs = [CR6] in
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000078 def o : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000079 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000080 [(set InTy:$XT,
81 (InTy (PPCvcmp_o InTy:$XA, InTy:$XB, xo)))]>,
82 isDOT;
Hal Finkel27774d92014-03-13 07:58:58 +000083 }
84}
85
Eric Christopher1b8e7632014-05-22 01:07:24 +000086def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +000087def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
88def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
89
Hal Finkel27774d92014-03-13 07:58:58 +000090let Predicates = [HasVSX] in {
91let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Craig Topperc50d64b2014-11-26 00:46:26 +000092let hasSideEffects = 0 in { // VSX instructions don't have side effects.
Hal Finkel27774d92014-03-13 07:58:58 +000093let Uses = [RM] in {
94
95 // Load indexed instructions
Hal Finkel6a778fb2015-03-11 23:28:38 +000096 let mayLoad = 1 in {
Bill Schmidtcb34fd02014-10-09 17:51:35 +000097 def LXSDX : XX1Form<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +000098 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +000099 "lxsdx $XT, $src", IIC_LdStLFD,
100 [(set f64:$XT, (load xoaddr:$src))]>;
101
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000102 def LXVD2X : XX1Form<31, 844,
Hal Finkel27774d92014-03-13 07:58:58 +0000103 (outs vsrc:$XT), (ins memrr:$src),
104 "lxvd2x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000105 [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000106
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000107 def LXVDSX : XX1Form<31, 332,
Hal Finkel27774d92014-03-13 07:58:58 +0000108 (outs vsrc:$XT), (ins memrr:$src),
109 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000110
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000111 def LXVW4X : XX1Form<31, 780,
Hal Finkel27774d92014-03-13 07:58:58 +0000112 (outs vsrc:$XT), (ins memrr:$src),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000113 "lxvw4x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000114 [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000115 } // mayLoad
Hal Finkel27774d92014-03-13 07:58:58 +0000116
117 // Store indexed instructions
118 let mayStore = 1 in {
119 def STXSDX : XX1Form<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +0000120 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +0000121 "stxsdx $XT, $dst", IIC_LdStSTFD,
122 [(store f64:$XT, xoaddr:$dst)]>;
123
124 def STXVD2X : XX1Form<31, 972,
125 (outs), (ins vsrc:$XT, memrr:$dst),
126 "stxvd2x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000127 [(store v2f64:$XT, xoaddr:$dst)]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000128
129 def STXVW4X : XX1Form<31, 908,
130 (outs), (ins vsrc:$XT, memrr:$dst),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000131 "stxvw4x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000132 [(store v4i32:$XT, xoaddr:$dst)]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000133
134 } // mayStore
Hal Finkel27774d92014-03-13 07:58:58 +0000135
136 // Add/Mul Instructions
137 let isCommutable = 1 in {
138 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +0000139 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000140 "xsadddp $XT, $XA, $XB", IIC_VecFP,
141 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
142 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +0000143 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000144 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
145 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
146
147 def XVADDDP : XX3Form<60, 96,
148 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
149 "xvadddp $XT, $XA, $XB", IIC_VecFP,
150 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
151
152 def XVADDSP : XX3Form<60, 64,
153 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
154 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
155 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
156
157 def XVMULDP : XX3Form<60, 112,
158 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
159 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
160 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
161
162 def XVMULSP : XX3Form<60, 80,
163 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
164 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
165 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
166 }
167
168 // Subtract Instructions
169 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000170 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000171 "xssubdp $XT, $XA, $XB", IIC_VecFP,
172 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
173
174 def XVSUBDP : XX3Form<60, 104,
175 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
176 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
177 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
178 def XVSUBSP : XX3Form<60, 72,
179 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
180 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
181 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
182
183 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000184 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000185 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000186 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000187 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000188 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
189 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000190 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
191 AltVSXFMARel;
192 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000193 def XSMADDMDP : XX3Form<60, 41,
Hal Finkel19be5062014-03-29 05:29:01 +0000194 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000195 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000196 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
197 AltVSXFMARel;
198 }
Hal Finkel27774d92014-03-13 07:58:58 +0000199
Hal Finkel25e04542014-03-25 18:55:11 +0000200 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000201 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000202 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000203 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000204 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
205 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000206 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
207 AltVSXFMARel;
208 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000209 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000210 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000211 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000212 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
213 AltVSXFMARel;
214 }
Hal Finkel27774d92014-03-13 07:58:58 +0000215
Hal Finkel25e04542014-03-25 18:55:11 +0000216 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000217 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000218 def XSNMADDADP : XX3Form<60, 161,
Hal Finkel19be5062014-03-29 05:29:01 +0000219 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000220 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
221 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000222 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
223 AltVSXFMARel;
224 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000225 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000226 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000227 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000228 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
229 AltVSXFMARel;
230 }
Hal Finkel27774d92014-03-13 07:58:58 +0000231
Hal Finkel25e04542014-03-25 18:55:11 +0000232 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000233 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000234 def XSNMSUBADP : XX3Form<60, 177,
Hal Finkel19be5062014-03-29 05:29:01 +0000235 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000236 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
237 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000238 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
239 AltVSXFMARel;
240 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000241 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000242 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000243 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000244 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
245 AltVSXFMARel;
246 }
Hal Finkel27774d92014-03-13 07:58:58 +0000247
Hal Finkel25e04542014-03-25 18:55:11 +0000248 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000249 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000250 def XVMADDADP : XX3Form<60, 97,
251 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
252 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
253 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000254 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
255 AltVSXFMARel;
256 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000257 def XVMADDMDP : XX3Form<60, 105,
258 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
259 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000260 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
261 AltVSXFMARel;
262 }
Hal Finkel27774d92014-03-13 07:58:58 +0000263
Hal Finkel25e04542014-03-25 18:55:11 +0000264 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000265 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000266 def XVMADDASP : XX3Form<60, 65,
267 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
268 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
269 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000270 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
271 AltVSXFMARel;
272 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000273 def XVMADDMSP : XX3Form<60, 73,
274 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
275 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000276 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
277 AltVSXFMARel;
278 }
Hal Finkel27774d92014-03-13 07:58:58 +0000279
Hal Finkel25e04542014-03-25 18:55:11 +0000280 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000281 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000282 def XVMSUBADP : XX3Form<60, 113,
283 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
284 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
285 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000286 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
287 AltVSXFMARel;
288 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000289 def XVMSUBMDP : XX3Form<60, 121,
290 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
291 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000292 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
293 AltVSXFMARel;
294 }
Hal Finkel27774d92014-03-13 07:58:58 +0000295
Hal Finkel25e04542014-03-25 18:55:11 +0000296 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000297 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000298 def XVMSUBASP : XX3Form<60, 81,
299 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
300 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
301 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000302 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
303 AltVSXFMARel;
304 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000305 def XVMSUBMSP : XX3Form<60, 89,
306 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
307 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000308 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
309 AltVSXFMARel;
310 }
Hal Finkel27774d92014-03-13 07:58:58 +0000311
Hal Finkel25e04542014-03-25 18:55:11 +0000312 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000313 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000314 def XVNMADDADP : XX3Form<60, 225,
315 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
316 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
317 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000318 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
319 AltVSXFMARel;
320 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000321 def XVNMADDMDP : XX3Form<60, 233,
322 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
323 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000324 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
325 AltVSXFMARel;
326 }
Hal Finkel27774d92014-03-13 07:58:58 +0000327
Hal Finkel25e04542014-03-25 18:55:11 +0000328 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000329 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000330 def XVNMADDASP : XX3Form<60, 193,
331 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
332 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
333 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000334 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
335 AltVSXFMARel;
336 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000337 def XVNMADDMSP : XX3Form<60, 201,
338 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
339 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000340 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
341 AltVSXFMARel;
342 }
Hal Finkel27774d92014-03-13 07:58:58 +0000343
Hal Finkel25e04542014-03-25 18:55:11 +0000344 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000345 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000346 def XVNMSUBADP : XX3Form<60, 241,
347 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
348 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
349 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000350 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
351 AltVSXFMARel;
352 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000353 def XVNMSUBMDP : XX3Form<60, 249,
354 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
355 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000356 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
357 AltVSXFMARel;
358 }
Hal Finkel27774d92014-03-13 07:58:58 +0000359
Hal Finkel25e04542014-03-25 18:55:11 +0000360 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000361 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000362 def XVNMSUBASP : XX3Form<60, 209,
363 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
364 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
365 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000366 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
367 AltVSXFMARel;
368 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000369 def XVNMSUBMSP : XX3Form<60, 217,
370 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
371 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000372 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
373 AltVSXFMARel;
374 }
Hal Finkel27774d92014-03-13 07:58:58 +0000375
376 // Division Instructions
377 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000378 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000379 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000380 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
381 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000382 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000383 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000384 [(set f64:$XT, (fsqrt f64:$XB))]>;
385
386 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000387 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000388 "xsredp $XT, $XB", IIC_VecFP,
389 [(set f64:$XT, (PPCfre f64:$XB))]>;
390 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000391 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000392 "xsrsqrtedp $XT, $XB", IIC_VecFP,
393 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
394
395 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000396 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000397 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000398 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000399 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000400 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000401
402 def XVDIVDP : XX3Form<60, 120,
403 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000404 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000405 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
406 def XVDIVSP : XX3Form<60, 88,
407 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000408 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000409 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
410
411 def XVSQRTDP : XX2Form<60, 203,
412 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000413 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000414 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
415 def XVSQRTSP : XX2Form<60, 139,
416 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000417 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000418 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
419
420 def XVTDIVDP : XX3Form_1<60, 125,
421 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000422 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000423 def XVTDIVSP : XX3Form_1<60, 93,
424 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000425 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000426
427 def XVTSQRTDP : XX2Form_1<60, 234,
428 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000429 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000430 def XVTSQRTSP : XX2Form_1<60, 170,
431 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000432 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000433
434 def XVREDP : XX2Form<60, 218,
435 (outs vsrc:$XT), (ins vsrc:$XB),
436 "xvredp $XT, $XB", IIC_VecFP,
437 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
438 def XVRESP : XX2Form<60, 154,
439 (outs vsrc:$XT), (ins vsrc:$XB),
440 "xvresp $XT, $XB", IIC_VecFP,
441 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
442
443 def XVRSQRTEDP : XX2Form<60, 202,
444 (outs vsrc:$XT), (ins vsrc:$XB),
445 "xvrsqrtedp $XT, $XB", IIC_VecFP,
446 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
447 def XVRSQRTESP : XX2Form<60, 138,
448 (outs vsrc:$XT), (ins vsrc:$XB),
449 "xvrsqrtesp $XT, $XB", IIC_VecFP,
450 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
451
452 // Compare Instructions
453 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000454 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000455 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000456 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000457 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000458 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000459
460 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000461 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000462 int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000463 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000464 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000465 int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000466 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000467 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000468 int_ppc_vsx_xvcmpgedp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000469 defm XVCMPGESP : XX3Form_Rcr<60, 83,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000470 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000471 int_ppc_vsx_xvcmpgesp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000472 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000473 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000474 int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000475 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000476 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000477 int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000478
479 // Move Instructions
480 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000481 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000482 "xsabsdp $XT, $XB", IIC_VecFP,
483 [(set f64:$XT, (fabs f64:$XB))]>;
484 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000485 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000486 "xsnabsdp $XT, $XB", IIC_VecFP,
487 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
488 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000489 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000490 "xsnegdp $XT, $XB", IIC_VecFP,
491 [(set f64:$XT, (fneg f64:$XB))]>;
492 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000493 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000494 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
495 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
496
497 def XVABSDP : XX2Form<60, 473,
498 (outs vsrc:$XT), (ins vsrc:$XB),
499 "xvabsdp $XT, $XB", IIC_VecFP,
500 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
501
502 def XVABSSP : XX2Form<60, 409,
503 (outs vsrc:$XT), (ins vsrc:$XB),
504 "xvabssp $XT, $XB", IIC_VecFP,
505 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
506
507 def XVCPSGNDP : XX3Form<60, 240,
508 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
509 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
510 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
511 def XVCPSGNSP : XX3Form<60, 208,
512 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
513 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
514 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
515
516 def XVNABSDP : XX2Form<60, 489,
517 (outs vsrc:$XT), (ins vsrc:$XB),
518 "xvnabsdp $XT, $XB", IIC_VecFP,
519 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
520 def XVNABSSP : XX2Form<60, 425,
521 (outs vsrc:$XT), (ins vsrc:$XB),
522 "xvnabssp $XT, $XB", IIC_VecFP,
523 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
524
525 def XVNEGDP : XX2Form<60, 505,
526 (outs vsrc:$XT), (ins vsrc:$XB),
527 "xvnegdp $XT, $XB", IIC_VecFP,
528 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
529 def XVNEGSP : XX2Form<60, 441,
530 (outs vsrc:$XT), (ins vsrc:$XB),
531 "xvnegsp $XT, $XB", IIC_VecFP,
532 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
533
534 // Conversion Instructions
535 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000536 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000537 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
538 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000539 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000540 "xscvdpsxds $XT, $XB", IIC_VecFP,
541 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000542 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000543 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000544 "xscvdpsxws $XT, $XB", IIC_VecFP,
545 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000546 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000547 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000548 "xscvdpuxds $XT, $XB", IIC_VecFP,
549 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000550 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000551 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000552 "xscvdpuxws $XT, $XB", IIC_VecFP,
553 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000554 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000555 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000556 "xscvspdp $XT, $XB", IIC_VecFP, []>;
557 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000558 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000559 "xscvsxddp $XT, $XB", IIC_VecFP,
560 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000561 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000562 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000563 "xscvuxddp $XT, $XB", IIC_VecFP,
564 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000565
566 def XVCVDPSP : XX2Form<60, 393,
567 (outs vsrc:$XT), (ins vsrc:$XB),
568 "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
569 def XVCVDPSXDS : XX2Form<60, 472,
570 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000571 "xvcvdpsxds $XT, $XB", IIC_VecFP,
572 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000573 def XVCVDPSXWS : XX2Form<60, 216,
574 (outs vsrc:$XT), (ins vsrc:$XB),
575 "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
576 def XVCVDPUXDS : XX2Form<60, 456,
577 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000578 "xvcvdpuxds $XT, $XB", IIC_VecFP,
579 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000580 def XVCVDPUXWS : XX2Form<60, 200,
581 (outs vsrc:$XT), (ins vsrc:$XB),
582 "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
583
584 def XVCVSPDP : XX2Form<60, 457,
585 (outs vsrc:$XT), (ins vsrc:$XB),
586 "xvcvspdp $XT, $XB", IIC_VecFP, []>;
587 def XVCVSPSXDS : XX2Form<60, 408,
588 (outs vsrc:$XT), (ins vsrc:$XB),
589 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
590 def XVCVSPSXWS : XX2Form<60, 152,
591 (outs vsrc:$XT), (ins vsrc:$XB),
592 "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
593 def XVCVSPUXDS : XX2Form<60, 392,
594 (outs vsrc:$XT), (ins vsrc:$XB),
595 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
596 def XVCVSPUXWS : XX2Form<60, 136,
597 (outs vsrc:$XT), (ins vsrc:$XB),
598 "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
599 def XVCVSXDDP : XX2Form<60, 504,
600 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000601 "xvcvsxddp $XT, $XB", IIC_VecFP,
602 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000603 def XVCVSXDSP : XX2Form<60, 440,
604 (outs vsrc:$XT), (ins vsrc:$XB),
605 "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
606 def XVCVSXWDP : XX2Form<60, 248,
607 (outs vsrc:$XT), (ins vsrc:$XB),
608 "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
609 def XVCVSXWSP : XX2Form<60, 184,
610 (outs vsrc:$XT), (ins vsrc:$XB),
611 "xvcvsxwsp $XT, $XB", IIC_VecFP, []>;
612 def XVCVUXDDP : XX2Form<60, 488,
613 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000614 "xvcvuxddp $XT, $XB", IIC_VecFP,
615 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000616 def XVCVUXDSP : XX2Form<60, 424,
617 (outs vsrc:$XT), (ins vsrc:$XB),
618 "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
619 def XVCVUXWDP : XX2Form<60, 232,
620 (outs vsrc:$XT), (ins vsrc:$XB),
621 "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
622 def XVCVUXWSP : XX2Form<60, 168,
623 (outs vsrc:$XT), (ins vsrc:$XB),
624 "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
625
626 // Rounding Instructions
627 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000628 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000629 "xsrdpi $XT, $XB", IIC_VecFP,
630 [(set f64:$XT, (frnd f64:$XB))]>;
631 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000632 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000633 "xsrdpic $XT, $XB", IIC_VecFP,
634 [(set f64:$XT, (fnearbyint f64:$XB))]>;
635 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000636 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000637 "xsrdpim $XT, $XB", IIC_VecFP,
638 [(set f64:$XT, (ffloor f64:$XB))]>;
639 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000640 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000641 "xsrdpip $XT, $XB", IIC_VecFP,
642 [(set f64:$XT, (fceil f64:$XB))]>;
643 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000644 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000645 "xsrdpiz $XT, $XB", IIC_VecFP,
646 [(set f64:$XT, (ftrunc f64:$XB))]>;
647
648 def XVRDPI : XX2Form<60, 201,
649 (outs vsrc:$XT), (ins vsrc:$XB),
650 "xvrdpi $XT, $XB", IIC_VecFP,
651 [(set v2f64:$XT, (frnd v2f64:$XB))]>;
652 def XVRDPIC : XX2Form<60, 235,
653 (outs vsrc:$XT), (ins vsrc:$XB),
654 "xvrdpic $XT, $XB", IIC_VecFP,
655 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
656 def XVRDPIM : XX2Form<60, 249,
657 (outs vsrc:$XT), (ins vsrc:$XB),
658 "xvrdpim $XT, $XB", IIC_VecFP,
659 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
660 def XVRDPIP : XX2Form<60, 233,
661 (outs vsrc:$XT), (ins vsrc:$XB),
662 "xvrdpip $XT, $XB", IIC_VecFP,
663 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
664 def XVRDPIZ : XX2Form<60, 217,
665 (outs vsrc:$XT), (ins vsrc:$XB),
666 "xvrdpiz $XT, $XB", IIC_VecFP,
667 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
668
669 def XVRSPI : XX2Form<60, 137,
670 (outs vsrc:$XT), (ins vsrc:$XB),
671 "xvrspi $XT, $XB", IIC_VecFP,
672 [(set v4f32:$XT, (frnd v4f32:$XB))]>;
673 def XVRSPIC : XX2Form<60, 171,
674 (outs vsrc:$XT), (ins vsrc:$XB),
675 "xvrspic $XT, $XB", IIC_VecFP,
676 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
677 def XVRSPIM : XX2Form<60, 185,
678 (outs vsrc:$XT), (ins vsrc:$XB),
679 "xvrspim $XT, $XB", IIC_VecFP,
680 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
681 def XVRSPIP : XX2Form<60, 169,
682 (outs vsrc:$XT), (ins vsrc:$XB),
683 "xvrspip $XT, $XB", IIC_VecFP,
684 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
685 def XVRSPIZ : XX2Form<60, 153,
686 (outs vsrc:$XT), (ins vsrc:$XB),
687 "xvrspiz $XT, $XB", IIC_VecFP,
688 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
689
690 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000691 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000692 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000693 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000694 "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
695 [(set vsfrc:$XT,
696 (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000697 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000698 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000699 "xsmindp $XT, $XA, $XB", IIC_VecFP,
700 [(set vsfrc:$XT,
701 (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000702
703 def XVMAXDP : XX3Form<60, 224,
704 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000705 "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
706 [(set vsrc:$XT,
707 (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000708 def XVMINDP : XX3Form<60, 232,
709 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000710 "xvmindp $XT, $XA, $XB", IIC_VecFP,
711 [(set vsrc:$XT,
712 (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000713
714 def XVMAXSP : XX3Form<60, 192,
715 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000716 "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
717 [(set vsrc:$XT,
718 (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000719 def XVMINSP : XX3Form<60, 200,
720 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000721 "xvminsp $XT, $XA, $XB", IIC_VecFP,
722 [(set vsrc:$XT,
723 (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000724 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000725} // Uses = [RM]
726
727 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000728 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000729 def XXLAND : XX3Form<60, 130,
730 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000731 "xxland $XT, $XA, $XB", IIC_VecGeneral,
732 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000733 def XXLANDC : XX3Form<60, 138,
734 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000735 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
736 [(set v4i32:$XT, (and v4i32:$XA,
737 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000738 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000739 def XXLNOR : XX3Form<60, 162,
740 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000741 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
742 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
743 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000744 def XXLOR : XX3Form<60, 146,
745 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000746 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
747 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000748 let isCodeGenOnly = 1 in
749 def XXLORf: XX3Form<60, 146,
750 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
751 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000752 def XXLXOR : XX3Form<60, 154,
753 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000754 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
755 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000756 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000757
758 // Permutation Instructions
759 def XXMRGHW : XX3Form<60, 18,
760 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
761 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
762 def XXMRGLW : XX3Form<60, 50,
763 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
764 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
765
766 def XXPERMDI : XX3Form_2<60, 10,
767 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
768 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
769 def XXSEL : XX4Form<60, 3,
770 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
771 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
772
773 def XXSLDWI : XX3Form_2<60, 2,
774 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
775 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, []>;
776 def XXSPLTW : XX2Form_2<60, 164,
777 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
778 "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
Craig Topperc50d64b2014-11-26 00:46:26 +0000779} // hasSideEffects
Hal Finkel27774d92014-03-13 07:58:58 +0000780
Bill Schmidt61e65232014-10-22 13:13:40 +0000781// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
782// instruction selection into a branch sequence.
783let usesCustomInserter = 1, // Expanded after instruction selection.
784 PPC970_Single = 1 in {
785
786 def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
787 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
788 "#SELECT_CC_VSRC",
789 []>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000790 def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
791 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
792 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000793 [(set v2f64:$dst,
794 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000795 def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
796 (ins crrc:$cond, f8rc:$T, f8rc:$F,
797 i32imm:$BROPC), "#SELECT_CC_VSFRC",
798 []>;
799 def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
800 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
801 "#SELECT_VSFRC",
802 [(set f64:$dst,
803 (select i1:$cond, f64:$T, f64:$F))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000804 def SELECT_CC_VSSRC: Pseudo<(outs f4rc:$dst),
805 (ins crrc:$cond, f4rc:$T, f4rc:$F,
806 i32imm:$BROPC), "#SELECT_CC_VSSRC",
807 []>;
808 def SELECT_VSSRC: Pseudo<(outs f4rc:$dst),
809 (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
810 "#SELECT_VSSRC",
811 [(set f32:$dst,
812 (select i1:$cond, f32:$T, f32:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000813} // usesCustomInserter
814} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000815
Hal Finkel27774d92014-03-13 07:58:58 +0000816def : InstAlias<"xvmovdp $XT, $XB",
817 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
818def : InstAlias<"xvmovsp $XT, $XB",
819 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
820
821def : InstAlias<"xxspltd $XT, $XB, 0",
822 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
823def : InstAlias<"xxspltd $XT, $XB, 1",
824 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
825def : InstAlias<"xxmrghd $XT, $XA, $XB",
826 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
827def : InstAlias<"xxmrgld $XT, $XA, $XB",
828 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
829def : InstAlias<"xxswapd $XT, $XB",
830 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
831
832let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000833
834let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000835def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000836 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000837
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000838def : Pat<(f64 (extractelt v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000839 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000840def : Pat<(f64 (extractelt v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000841 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000842}
843
844let Predicates = [IsLittleEndian] in {
845def : Pat<(v2f64 (scalar_to_vector f64:$A)),
846 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
847 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
848
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000849def : Pat<(f64 (extractelt v2f64:$S, 0)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000850 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000851def : Pat<(f64 (extractelt v2f64:$S, 1)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000852 (f64 (EXTRACT_SUBREG $S, sub_64))>;
853}
Hal Finkel27774d92014-03-13 07:58:58 +0000854
855// Additional fnmsub patterns: -a*c + b == -(a*c - b)
856def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
857 (XSNMSUBADP $B, $C, $A)>;
858def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
859 (XSNMSUBADP $B, $C, $A)>;
860
861def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
862 (XVNMSUBADP $B, $C, $A)>;
863def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
864 (XVNMSUBADP $B, $C, $A)>;
865
866def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
867 (XVNMSUBASP $B, $C, $A)>;
868def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
869 (XVNMSUBASP $B, $C, $A)>;
870
Hal Finkel9e0baa62014-04-01 19:24:27 +0000871def : Pat<(v2f64 (bitconvert v4f32:$A)),
872 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000873def : Pat<(v2f64 (bitconvert v4i32:$A)),
874 (COPY_TO_REGCLASS $A, VSRC)>;
875def : Pat<(v2f64 (bitconvert v8i16:$A)),
876 (COPY_TO_REGCLASS $A, VSRC)>;
877def : Pat<(v2f64 (bitconvert v16i8:$A)),
878 (COPY_TO_REGCLASS $A, VSRC)>;
879
Hal Finkel9e0baa62014-04-01 19:24:27 +0000880def : Pat<(v4f32 (bitconvert v2f64:$A)),
881 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000882def : Pat<(v4i32 (bitconvert v2f64:$A)),
883 (COPY_TO_REGCLASS $A, VRRC)>;
884def : Pat<(v8i16 (bitconvert v2f64:$A)),
885 (COPY_TO_REGCLASS $A, VRRC)>;
886def : Pat<(v16i8 (bitconvert v2f64:$A)),
887 (COPY_TO_REGCLASS $A, VRRC)>;
888
Hal Finkel9e0baa62014-04-01 19:24:27 +0000889def : Pat<(v2i64 (bitconvert v4f32:$A)),
890 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000891def : Pat<(v2i64 (bitconvert v4i32:$A)),
892 (COPY_TO_REGCLASS $A, VSRC)>;
893def : Pat<(v2i64 (bitconvert v8i16:$A)),
894 (COPY_TO_REGCLASS $A, VSRC)>;
895def : Pat<(v2i64 (bitconvert v16i8:$A)),
896 (COPY_TO_REGCLASS $A, VSRC)>;
897
Hal Finkel9e0baa62014-04-01 19:24:27 +0000898def : Pat<(v4f32 (bitconvert v2i64:$A)),
899 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000900def : Pat<(v4i32 (bitconvert v2i64:$A)),
901 (COPY_TO_REGCLASS $A, VRRC)>;
902def : Pat<(v8i16 (bitconvert v2i64:$A)),
903 (COPY_TO_REGCLASS $A, VRRC)>;
904def : Pat<(v16i8 (bitconvert v2i64:$A)),
905 (COPY_TO_REGCLASS $A, VRRC)>;
906
Hal Finkel9281c9a2014-03-26 18:26:30 +0000907def : Pat<(v2f64 (bitconvert v2i64:$A)),
908 (COPY_TO_REGCLASS $A, VRRC)>;
909def : Pat<(v2i64 (bitconvert v2f64:$A)),
910 (COPY_TO_REGCLASS $A, VRRC)>;
911
Kit Bartond4eb73c2015-05-05 16:10:44 +0000912def : Pat<(v2f64 (bitconvert v1i128:$A)),
913 (COPY_TO_REGCLASS $A, VRRC)>;
914def : Pat<(v1i128 (bitconvert v2f64:$A)),
915 (COPY_TO_REGCLASS $A, VRRC)>;
916
Hal Finkel5c0d1452014-03-30 13:22:59 +0000917// sign extension patterns
918// To extend "in place" from v2i32 to v2i64, we have input data like:
919// | undef | i32 | undef | i32 |
920// but xvcvsxwdp expects the input in big-Endian format:
921// | i32 | undef | i32 | undef |
922// so we need to shift everything to the left by one i32 (word) before
923// the conversion.
924def : Pat<(sext_inreg v2i64:$C, v2i32),
925 (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
926def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
927 (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
928
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000929// Loads.
Bill Schmidt72954782014-11-12 04:19:40 +0000930def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
931def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000932def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000933def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000934
935// Stores.
Hal Finkele3d2b202015-02-01 19:07:41 +0000936def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
937 (STXVD2X $rS, xoaddr:$dst)>;
Bill Schmidt72954782014-11-12 04:19:40 +0000938def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
Hal Finkele3d2b202015-02-01 19:07:41 +0000939def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
940 (STXVW4X $rS, xoaddr:$dst)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000941def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
942
943// Permutes.
944def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
945def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
946def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
947def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000948
Bill Schmidt61e65232014-10-22 13:13:40 +0000949// Selects.
950def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000951 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
952def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000953 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
954def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000955 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
956def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000957 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
958def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
959 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
960def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000961 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
962def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000963 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
964def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000965 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
966def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000967 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
968def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
969 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
970
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000971def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000972 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
973def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000974 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
975def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000976 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
977def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000978 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
979def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
980 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
981def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000982 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
983def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000984 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
985def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000986 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
987def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000988 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
989def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
990 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
991
Bill Schmidt76746922014-11-14 12:10:40 +0000992// Divides.
993def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
994 (XVDIVSP $A, $B)>;
995def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
996 (XVDIVDP $A, $B)>;
997
Nemanja Ivanovic984a3612015-07-14 17:25:20 +0000998// Reciprocal estimate
999def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
1000 (XVRESP $A)>;
1001def : Pat<(int_ppc_vsx_xvredp v2f64:$A),
1002 (XVREDP $A)>;
1003
Nemanja Ivanovicd358b8f2015-07-05 06:03:51 +00001004// Recip. square root estimate
1005def : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
1006 (XVRSQRTESP $A)>;
1007def : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
1008 (XVRSQRTEDP $A)>;
1009
Hal Finkel27774d92014-03-13 07:58:58 +00001010} // AddedComplexity
1011} // HasVSX
1012
Kit Barton298beb52015-02-18 16:21:46 +00001013// The following VSX instructions were introduced in Power ISA 2.07
1014/* FIXME: if the operands are v2i64, these patterns will not match.
1015 we should define new patterns or otherwise match the same patterns
1016 when the elements are larger than i32.
1017*/
1018def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001019def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Kit Barton298beb52015-02-18 16:21:46 +00001020let Predicates = [HasP8Vector] in {
1021let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001022 let isCommutable = 1 in {
1023 def XXLEQV : XX3Form<60, 186,
1024 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1025 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
1026 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
1027 def XXLNAND : XX3Form<60, 178,
1028 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1029 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
1030 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
Kit Barton298beb52015-02-18 16:21:46 +00001031 v4i32:$XB)))]>;
1032 } // isCommutable
Nemanja Ivanovicd9e4b4f2015-07-10 14:25:17 +00001033
Nemanja Ivanovic5655fb32015-07-10 12:38:08 +00001034 def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
1035 (XXLEQV $A, $B)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001036
1037 def XXLORC : XX3Form<60, 170,
1038 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1039 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
1040 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
1041
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001042 // VSX scalar loads introduced in ISA 2.07
1043 let mayLoad = 1 in {
1044 def LXSSPX : XX1Form<31, 524, (outs vssrc:$XT), (ins memrr:$src),
1045 "lxsspx $XT, $src", IIC_LdStLFD,
1046 [(set f32:$XT, (load xoaddr:$src))]>;
1047 def LXSIWAX : XX1Form<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
1048 "lxsiwax $XT, $src", IIC_LdStLFD,
1049 [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
1050 def LXSIWZX : XX1Form<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
1051 "lxsiwzx $XT, $src", IIC_LdStLFD,
1052 [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
1053 } // mayLoad
1054
1055 // VSX scalar stores introduced in ISA 2.07
1056 let mayStore = 1 in {
1057 def STXSSPX : XX1Form<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
1058 "stxsspx $XT, $dst", IIC_LdStSTFD,
1059 [(store f32:$XT, xoaddr:$dst)]>;
1060 def STXSIWX : XX1Form<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
1061 "stxsiwx $XT, $dst", IIC_LdStSTFD,
1062 [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
1063 } // mayStore
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001064
1065 def : Pat<(f64 (extloadf32 xoaddr:$src)),
1066 (COPY_TO_REGCLASS (LXSSPX xoaddr:$src), VSFRC)>;
1067 def : Pat<(f64 (fextend f32:$src)),
1068 (COPY_TO_REGCLASS $src, VSFRC)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00001069
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001070 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001071 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1072 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001073 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1074 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001075 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1076 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001077 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1078 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
1079 (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1080 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001081 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1082 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001083 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1084 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001085 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1086 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001087 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1088 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001089 (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001090
1091 // VSX Elementary Scalar FP arithmetic (SP)
1092 let isCommutable = 1 in {
1093 def XSADDSP : XX3Form<60, 0,
1094 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1095 "xsaddsp $XT, $XA, $XB", IIC_VecFP,
1096 [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
1097 def XSMULSP : XX3Form<60, 16,
1098 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1099 "xsmulsp $XT, $XA, $XB", IIC_VecFP,
1100 [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
1101 } // isCommutable
1102
1103 def XSDIVSP : XX3Form<60, 24,
1104 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1105 "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
1106 [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
1107 def XSRESP : XX2Form<60, 26,
1108 (outs vssrc:$XT), (ins vssrc:$XB),
1109 "xsresp $XT, $XB", IIC_VecFP,
1110 [(set f32:$XT, (PPCfre f32:$XB))]>;
1111 def XSSQRTSP : XX2Form<60, 11,
1112 (outs vssrc:$XT), (ins vssrc:$XB),
1113 "xssqrtsp $XT, $XB", IIC_FPSqrtS,
1114 [(set f32:$XT, (fsqrt f32:$XB))]>;
1115 def XSRSQRTESP : XX2Form<60, 10,
1116 (outs vssrc:$XT), (ins vssrc:$XB),
1117 "xsrsqrtesp $XT, $XB", IIC_VecFP,
1118 [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
1119 def XSSUBSP : XX3Form<60, 8,
1120 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1121 "xssubsp $XT, $XA, $XB", IIC_VecFP,
1122 [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00001123
1124 // FMA Instructions
1125 let BaseName = "XSMADDASP" in {
1126 let isCommutable = 1 in
1127 def XSMADDASP : XX3Form<60, 1,
1128 (outs vssrc:$XT),
1129 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1130 "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
1131 [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
1132 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1133 AltVSXFMARel;
1134 let IsVSXFMAAlt = 1 in
1135 def XSMADDMSP : XX3Form<60, 9,
1136 (outs vssrc:$XT),
1137 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1138 "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1139 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1140 AltVSXFMARel;
1141 }
1142
1143 let BaseName = "XSMSUBASP" in {
1144 let isCommutable = 1 in
1145 def XSMSUBASP : XX3Form<60, 17,
1146 (outs vssrc:$XT),
1147 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1148 "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
1149 [(set f32:$XT, (fma f32:$XA, f32:$XB,
1150 (fneg f32:$XTi)))]>,
1151 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1152 AltVSXFMARel;
1153 let IsVSXFMAAlt = 1 in
1154 def XSMSUBMSP : XX3Form<60, 25,
1155 (outs vssrc:$XT),
1156 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1157 "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1158 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1159 AltVSXFMARel;
1160 }
1161
1162 let BaseName = "XSNMADDASP" in {
1163 let isCommutable = 1 in
1164 def XSNMADDASP : XX3Form<60, 129,
1165 (outs vssrc:$XT),
1166 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1167 "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
1168 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1169 f32:$XTi)))]>,
1170 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1171 AltVSXFMARel;
1172 let IsVSXFMAAlt = 1 in
1173 def XSNMADDMSP : XX3Form<60, 137,
1174 (outs vssrc:$XT),
1175 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1176 "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1177 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1178 AltVSXFMARel;
1179 }
1180
1181 let BaseName = "XSNMSUBASP" in {
1182 let isCommutable = 1 in
1183 def XSNMSUBASP : XX3Form<60, 145,
1184 (outs vssrc:$XT),
1185 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1186 "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
1187 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1188 (fneg f32:$XTi))))]>,
1189 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1190 AltVSXFMARel;
1191 let IsVSXFMAAlt = 1 in
1192 def XSNMSUBMSP : XX3Form<60, 153,
1193 (outs vssrc:$XT),
1194 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1195 "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1196 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1197 AltVSXFMARel;
1198 }
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001199
1200 // Single Precision Conversions (FP <-> INT)
1201 def XSCVSXDSP : XX2Form<60, 312,
1202 (outs vssrc:$XT), (ins vsfrc:$XB),
1203 "xscvsxdsp $XT, $XB", IIC_VecFP,
1204 [(set f32:$XT, (PPCfcfids f64:$XB))]>;
1205 def XSCVUXDSP : XX2Form<60, 296,
1206 (outs vssrc:$XT), (ins vsfrc:$XB),
1207 "xscvuxdsp $XT, $XB", IIC_VecFP,
1208 [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
1209
1210 // Conversions between vector and scalar single precision
1211 def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
1212 "xscvdpspn $XT, $XB", IIC_VecFP, []>;
1213 def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
1214 "xscvspdpn $XT, $XB", IIC_VecFP, []>;
1215
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001216} // AddedComplexity = 400
Kit Barton298beb52015-02-18 16:21:46 +00001217} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001218
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001219let Predicates = [HasDirectMove] in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001220 // VSX direct move instructions
1221 def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
1222 "mfvsrd $rA, $XT", IIC_VecGeneral,
1223 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
1224 Requires<[In64BitMode]>;
1225 def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
1226 "mfvsrwz $rA, $XT", IIC_VecGeneral,
1227 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
1228 def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
1229 "mtvsrd $XT, $rA", IIC_VecGeneral,
1230 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1231 Requires<[In64BitMode]>;
1232 def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1233 "mtvsrwa $XT, $rA", IIC_VecGeneral,
1234 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1235 def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1236 "mtvsrwz $XT, $rA", IIC_VecGeneral,
1237 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001238} // HasDirectMove
1239
1240let Predicates = [IsISA3_0, HasDirectMove] in {
1241 def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),
1242 "mtvsrws $XT, $rA", IIC_VecGeneral,
1243 []>;
1244
1245 def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
1246 "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,
1247 []>, Requires<[In64BitMode]>;
1248
1249 def MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT),
1250 "mfvsrld $rA, $XT", IIC_VecGeneral,
1251 []>, Requires<[In64BitMode]>;
1252
1253} // IsISA3_0, HasDirectMove
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001254
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001255/* Direct moves of various widths from GPR's into VSR's. Each move lines
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001256 the value up into element 0 (both BE and LE). Namely, entities smaller than
1257 a doubleword are shifted left and moved for BE. For LE, they're moved, then
1258 swapped to go into the least significant element of the VSR.
1259*/
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001260def MovesToVSR {
1261 dag BE_BYTE_0 =
1262 (MTVSRD
1263 (RLDICR
1264 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1265 dag BE_HALF_0 =
1266 (MTVSRD
1267 (RLDICR
1268 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1269 dag BE_WORD_0 =
1270 (MTVSRD
1271 (RLDICR
1272 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001273 dag BE_DWORD_0 = (MTVSRD $A);
1274
1275 dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001276 dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1277 LE_MTVSRW, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001278 dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001279 dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1280 BE_DWORD_0, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001281 dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1282}
1283
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001284/* Patterns for extracting elements out of vectors. Integer elements are
1285 extracted using direct move operations. Patterns for extracting elements
1286 whose indices are not available at compile time are also provided with
1287 various _VARIABLE_ patterns.
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001288 The numbering for the DAG's is for LE, but when used on BE, the correct
1289 LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1290*/
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001291def VectorExtractions {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001292 // Doubleword extraction
1293 dag LE_DWORD_0 =
1294 (MFVSRD
1295 (EXTRACT_SUBREG
1296 (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1297 (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1298 dag LE_DWORD_1 = (MFVSRD
1299 (EXTRACT_SUBREG
1300 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1301
1302 // Word extraction
1303 dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 2), sub_64));
1304 dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1305 dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1306 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1307 dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1308
1309 // Halfword extraction
1310 dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1311 dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1312 dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1313 dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1314 dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1315 dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1316 dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1317 dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1318
1319 // Byte extraction
1320 dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1321 dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1322 dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1323 dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1324 dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1325 dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1326 dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1327 dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1328 dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1329 dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1330 dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1331 dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1332 dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1333 dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1334 dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1335 dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1336
1337 /* Variable element number (BE and LE patterns must be specified separately)
1338 This is a rather involved process.
1339
1340 Conceptually, this is how the move is accomplished:
1341 1. Identify which doubleword contains the element
1342 2. Shift in the VMX register so that the correct doubleword is correctly
1343 lined up for the MFVSRD
1344 3. Perform the move so that the element (along with some extra stuff)
1345 is in the GPR
1346 4. Right shift within the GPR so that the element is right-justified
1347
1348 Of course, the index is an element number which has a different meaning
1349 on LE/BE so the patterns have to be specified separately.
1350
1351 Note: The final result will be the element right-justified with high
1352 order bits being arbitrarily defined (namely, whatever was in the
1353 vector register to the left of the value originally).
1354 */
1355
1356 /* LE variable byte
1357 Number 1. above:
1358 - For elements 0-7, we shift left by 8 bytes since they're on the right
1359 - For elements 8-15, we need not shift (shift left by zero bytes)
1360 This is accomplished by inverting the bits of the index and AND-ing
1361 with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1362 */
1363 dag LE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDC8 (LI8 8), $Idx));
1364
1365 // Number 2. above:
1366 // - Now that we set up the shift amount, we shift in the VMX register
1367 dag LE_VBYTE_PERMUTE = (VPERM $S, $S, LE_VBYTE_PERM_VEC);
1368
1369 // Number 3. above:
1370 // - The doubleword containing our element is moved to a GPR
1371 dag LE_MV_VBYTE = (MFVSRD
1372 (EXTRACT_SUBREG
1373 (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1374 sub_64));
1375
1376 /* Number 4. above:
1377 - Truncate the element number to the range 0-7 (8-15 are symmetrical
1378 and out of range values are truncated accordingly)
1379 - Multiply by 8 as we need to shift right by the number of bits, not bytes
1380 - Shift right in the GPR by the calculated value
1381 */
1382 dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1383 sub_32);
1384 dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1385 sub_32);
1386
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001387 /* LE variable halfword
1388 Number 1. above:
1389 - For elements 0-3, we shift left by 8 since they're on the right
1390 - For elements 4-7, we need not shift (shift left by zero bytes)
1391 Similarly to the byte pattern, we invert the bits of the index, but we
1392 AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1393 Of course, the shift is still by 8 bytes, so we must multiply by 2.
1394 */
1395 dag LE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62));
1396
1397 // Number 2. above:
1398 // - Now that we set up the shift amount, we shift in the VMX register
1399 dag LE_VHALF_PERMUTE = (VPERM $S, $S, LE_VHALF_PERM_VEC);
1400
1401 // Number 3. above:
1402 // - The doubleword containing our element is moved to a GPR
1403 dag LE_MV_VHALF = (MFVSRD
1404 (EXTRACT_SUBREG
1405 (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1406 sub_64));
1407
1408 /* Number 4. above:
1409 - Truncate the element number to the range 0-3 (4-7 are symmetrical
1410 and out of range values are truncated accordingly)
1411 - Multiply by 16 as we need to shift right by the number of bits
1412 - Shift right in the GPR by the calculated value
1413 */
1414 dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1415 sub_32);
1416 dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1417 sub_32);
1418
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001419 /* LE variable word
1420 Number 1. above:
1421 - For elements 0-1, we shift left by 8 since they're on the right
1422 - For elements 2-3, we need not shift
1423 */
1424 dag LE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61));
1425
1426 // Number 2. above:
1427 // - Now that we set up the shift amount, we shift in the VMX register
1428 dag LE_VWORD_PERMUTE = (VPERM $S, $S, LE_VWORD_PERM_VEC);
1429
1430 // Number 3. above:
1431 // - The doubleword containing our element is moved to a GPR
1432 dag LE_MV_VWORD = (MFVSRD
1433 (EXTRACT_SUBREG
1434 (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
1435 sub_64));
1436
1437 /* Number 4. above:
1438 - Truncate the element number to the range 0-1 (2-3 are symmetrical
1439 and out of range values are truncated accordingly)
1440 - Multiply by 32 as we need to shift right by the number of bits
1441 - Shift right in the GPR by the calculated value
1442 */
1443 dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
1444 sub_32);
1445 dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
1446 sub_32);
1447
1448 /* LE variable doubleword
1449 Number 1. above:
1450 - For element 0, we shift left by 8 since it's on the right
1451 - For element 1, we need not shift
1452 */
1453 dag LE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60));
1454
1455 // Number 2. above:
1456 // - Now that we set up the shift amount, we shift in the VMX register
1457 dag LE_VDWORD_PERMUTE = (VPERM $S, $S, LE_VDWORD_PERM_VEC);
1458
1459 // Number 3. above:
1460 // - The doubleword containing our element is moved to a GPR
1461 // - Number 4. is not needed for the doubleword as the value is 64-bits
1462 dag LE_VARIABLE_DWORD =
1463 (MFVSRD (EXTRACT_SUBREG
1464 (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
1465 sub_64));
1466
1467 /* LE variable float
1468 - Shift the vector to line up the desired element to BE Word 0
1469 - Convert 32-bit float to a 64-bit single precision float
1470 */
1471 dag LE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR (XOR8 (LI8 3), $Idx), 2, 61));
1472 dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
1473 dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
1474
1475 /* LE variable double
1476 Same as the LE doubleword except there is no move.
1477 */
1478 dag LE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1479 (COPY_TO_REGCLASS $S, VRRC),
1480 LE_VDWORD_PERM_VEC);
1481 dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
1482
1483 /* BE variable byte
1484 The algorithm here is the same as the LE variable byte except:
1485 - The shift in the VMX register is by 0/8 for opposite element numbers so
1486 we simply AND the element number with 0x8
1487 - The order of elements after the move to GPR is reversed, so we invert
1488 the bits of the index prior to truncating to the range 0-7
1489 */
1490 dag BE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDIo8 $Idx, 8));
1491 dag BE_VBYTE_PERMUTE = (VPERM $S, $S, BE_VBYTE_PERM_VEC);
1492 dag BE_MV_VBYTE = (MFVSRD
1493 (EXTRACT_SUBREG
1494 (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1495 sub_64));
1496 dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1497 sub_32);
1498 dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1499 sub_32);
1500
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001501 /* BE variable halfword
1502 The algorithm here is the same as the LE variable halfword except:
1503 - The shift in the VMX register is by 0/8 for opposite element numbers so
1504 we simply AND the element number with 0x4 and multiply by 2
1505 - The order of elements after the move to GPR is reversed, so we invert
1506 the bits of the index prior to truncating to the range 0-3
1507 */
1508 dag BE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 4), 1, 62));
1509 dag BE_VHALF_PERMUTE = (VPERM $S, $S, BE_VHALF_PERM_VEC);
1510 dag BE_MV_VHALF = (MFVSRD
1511 (EXTRACT_SUBREG
1512 (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1513 sub_64));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001514 dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001515 sub_32);
1516 dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1517 sub_32);
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001518
1519 /* BE variable word
1520 The algorithm is the same as the LE variable word except:
1521 - The shift in the VMX register happens for opposite element numbers
1522 - The order of elements after the move to GPR is reversed, so we invert
1523 the bits of the index prior to truncating to the range 0-1
1524 */
1525 dag BE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 2), 2, 61));
1526 dag BE_VWORD_PERMUTE = (VPERM $S, $S, BE_VWORD_PERM_VEC);
1527 dag BE_MV_VWORD = (MFVSRD
1528 (EXTRACT_SUBREG
1529 (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
1530 sub_64));
1531 dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
1532 sub_32);
1533 dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
1534 sub_32);
1535
1536 /* BE variable doubleword
1537 Same as the LE doubleword except we shift in the VMX register for opposite
1538 element indices.
1539 */
1540 dag BE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 1), 3, 60));
1541 dag BE_VDWORD_PERMUTE = (VPERM $S, $S, BE_VDWORD_PERM_VEC);
1542 dag BE_VARIABLE_DWORD =
1543 (MFVSRD (EXTRACT_SUBREG
1544 (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
1545 sub_64));
1546
1547 /* BE variable float
1548 - Shift the vector to line up the desired element to BE Word 0
1549 - Convert 32-bit float to a 64-bit single precision float
1550 */
1551 dag BE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR $Idx, 2, 61));
1552 dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
1553 dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
1554
1555 /* BE variable double
1556 Same as the BE doubleword except there is no move.
1557 */
1558 dag BE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1559 (COPY_TO_REGCLASS $S, VRRC),
1560 BE_VDWORD_PERM_VEC);
1561 dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001562}
1563
1564// v4f32 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001565let Predicates = [IsBigEndian, HasP8Vector] in {
1566 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1567 (v4f32 (XSCVDPSPN $A))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001568 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1569 (f32 (XSCVSPDPN $S))>;
1570 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1571 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1572 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1573 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
1574 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1575 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001576 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1577 (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001578} // IsBigEndian, HasP8Vector
1579
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001580// Variable index vector_extract for v2f64 does not require P8Vector
1581let Predicates = [IsBigEndian, HasVSX] in
1582 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1583 (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
1584
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001585let Predicates = [IsBigEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001586 // v16i8 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001587 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001588 (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001589 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001590 (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001591 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001592 (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001593 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001594 (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
1595 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001596 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001597 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001598 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001599 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001600 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001601 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001602 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001603 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001604 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001605 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001606 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001607 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001608 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001609 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001610 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001611 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001612 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001613 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001614 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001615 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001616 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001617 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001618 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001619 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001620 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001621 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001622 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001623 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001624 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001625 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001626 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001627 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001628 (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001629
1630 // v8i16 scalar <-> vector conversions (BE)
1631 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001632 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001633 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001634 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001635 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001636 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001637 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001638 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001639 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001640 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001641 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001642 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001643 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001644 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001645 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001646 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001647 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001648 (i32 VectorExtractions.BE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001649
1650 // v4i32 scalar <-> vector conversions (BE)
1651 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001652 (i32 VectorExtractions.LE_WORD_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001653 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001654 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001655 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001656 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001657 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001658 (i32 VectorExtractions.LE_WORD_0)>;
1659 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1660 (i32 VectorExtractions.BE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001661
1662 // v2i64 scalar <-> vector conversions (BE)
1663 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001664 (i64 VectorExtractions.LE_DWORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001665 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001666 (i64 VectorExtractions.LE_DWORD_0)>;
1667 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1668 (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001669} // IsBigEndian, HasDirectMove
1670
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001671// v4f32 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001672let Predicates = [IsLittleEndian, HasP8Vector] in {
1673 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1674 (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001675 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1676 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1677 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1678 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
1679 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1680 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1681 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1682 (f32 (XSCVSPDPN $S))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001683 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1684 (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001685} // IsLittleEndian, HasP8Vector
1686
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001687// Variable index vector_extract for v2f64 does not require P8Vector
1688let Predicates = [IsLittleEndian, HasVSX] in
1689 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1690 (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
1691
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001692let Predicates = [IsLittleEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001693 // v16i8 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001694 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001695 (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001696 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001697 (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001698 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001699 (v4i32 MovesToVSR.LE_WORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001700 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001701 (v2i64 MovesToVSR.LE_DWORD_0)>;
1702 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001703 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001704 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001705 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001706 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001707 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001708 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001709 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001710 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001711 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001712 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001713 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001714 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001715 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001716 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001717 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001718 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001719 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001720 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001721 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001722 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001723 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001724 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001725 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001726 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001727 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001728 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001729 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001730 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001731 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001732 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001733 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001734 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001735 (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001736
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001737 // v8i16 scalar <-> vector conversions (LE)
1738 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001739 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001740 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001741 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001742 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001743 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001744 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001745 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001746 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001747 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001748 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001749 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001750 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001751 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001752 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001753 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001754 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001755 (i32 VectorExtractions.LE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001756
1757 // v4i32 scalar <-> vector conversions (LE)
1758 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001759 (i32 VectorExtractions.LE_WORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001760 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001761 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001762 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001763 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001764 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001765 (i32 VectorExtractions.LE_WORD_3)>;
1766 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1767 (i32 VectorExtractions.LE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001768
1769 // v2i64 scalar <-> vector conversions (LE)
1770 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001771 (i64 VectorExtractions.LE_DWORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001772 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001773 (i64 VectorExtractions.LE_DWORD_1)>;
1774 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1775 (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001776} // IsLittleEndian, HasDirectMove
Nemanja Ivanovic89224762015-12-15 14:50:34 +00001777
1778let Predicates = [HasDirectMove, HasVSX] in {
1779// bitconvert f32 -> i32
1780// (convert to 32-bit fp single, shift right 1 word, move to GPR)
1781def : Pat<(i32 (bitconvert f32:$S)),
1782 (i32 (MFVSRWZ (EXTRACT_SUBREG
1783 (XXSLDWI (XSCVDPSPN $S),(XSCVDPSPN $S), 3),
1784 sub_64)))>;
1785// bitconvert i32 -> f32
1786// (move to FPR, shift left 1 word, convert to 64-bit fp single)
1787def : Pat<(f32 (bitconvert i32:$A)),
1788 (f32 (XSCVSPDPN
1789 (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
1790
1791// bitconvert f64 -> i64
1792// (move to GPR, nothing else needed)
1793def : Pat<(i64 (bitconvert f64:$S)),
1794 (i64 (MFVSRD $S))>;
1795
1796// bitconvert i64 -> f64
1797// (move to FPR, nothing else needed)
1798def : Pat<(f64 (bitconvert i64:$S)),
1799 (f64 (MTVSRD $S))>;
1800}
Kit Barton93612ec2016-02-26 21:11:55 +00001801
1802// The following VSX instructions were introduced in Power ISA 3.0
1803def HasP9Vector : Predicate<"PPCSubTarget->hasP9Vector()">;
1804let Predicates = [HasP9Vector] in {
1805
1806 // [PO VRT XO VRB XO /]
1807 class X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1808 list<dag> pattern>
1809 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB),
1810 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1811
1812 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
1813 class X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1814 list<dag> pattern>
1815 : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isDOT;
1816
1817 // [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less),
1818 // So we use different operand class for VRB
1819 class X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1820 RegisterOperand vbtype, list<dag> pattern>
1821 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB),
1822 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1823
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00001824 // [PO T XO B XO BX /]
1825 class XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1826 list<dag> pattern>
1827 : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB),
1828 !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>;
1829
Kit Barton93612ec2016-02-26 21:11:55 +00001830 // [PO T XO B XO BX TX]
1831 class XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1832 RegisterOperand vtype, list<dag> pattern>
1833 : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB),
1834 !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>;
1835
1836 // [PO T A B XO AX BX TX], src and dest register use different operand class
1837 class XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc,
1838 RegisterOperand xty, RegisterOperand aty, RegisterOperand bty,
1839 InstrItinClass itin, list<dag> pattern>
1840 : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB),
1841 !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>;
1842
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00001843 // [PO VRT VRA VRB XO /]
1844 class X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1845 list<dag> pattern>
1846 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB),
1847 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>;
1848
1849 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
1850 class X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc,
1851 list<dag> pattern>
1852 : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isDOT;
1853
1854 //===--------------------------------------------------------------------===//
1855 // Quad-Precision Scalar Move Instructions:
1856
1857 // Copy Sign
1858 def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp", []>;
1859
1860 // Absolute/Negative-Absolute/Negate
1861 def XSABSQP : X_VT5_XO5_VB5<63, 0, 804, "xsabsqp" , []>;
1862 def XSNABSQP : X_VT5_XO5_VB5<63, 8, 804, "xsnabsqp", []>;
1863 def XSNEGQP : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp" , []>;
1864
1865 //===--------------------------------------------------------------------===//
1866 // Quad-Precision Scalar Floating-Point Arithmetic Instructions:
1867
1868 // Add/Divide/Multiply/Subtract
1869 def XSADDQP : X_VT5_VA5_VB5 <63, 4, "xsaddqp" , []>;
1870 def XSADDQPO : X_VT5_VA5_VB5_Ro<63, 4, "xsaddqpo", []>;
1871 def XSDIVQP : X_VT5_VA5_VB5 <63, 548, "xsdivqp" , []>;
1872 def XSDIVQPO : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo", []>;
1873 def XSMULQP : X_VT5_VA5_VB5 <63, 36, "xsmulqp" , []>;
1874 def XSMULQPO : X_VT5_VA5_VB5_Ro<63, 36, "xsmulqpo", []>;
1875 def XSSUBQP : X_VT5_VA5_VB5 <63, 516, "xssubqp" , []>;
1876 def XSSUBQPO : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo", []>;
1877
1878 // Square-Root
1879 def XSSQRTQP : X_VT5_XO5_VB5 <63, 27, 804, "xssqrtqp" , []>;
1880 def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo", []>;
1881
1882 // (Negative) Multiply-{Add/Subtract}
1883 def XSMADDQP : X_VT5_VA5_VB5 <63, 388, "xsmaddqp" , []>;
1884 def XSMADDQPO : X_VT5_VA5_VB5_Ro<63, 388, "xsmaddqpo" , []>;
1885 def XSMSUBQP : X_VT5_VA5_VB5 <63, 420, "xsmsubqp" , []>;
1886 def XSMSUBQPO : X_VT5_VA5_VB5_Ro<63, 420, "xsmsubqpo" , []>;
1887 def XSNMADDQP : X_VT5_VA5_VB5 <63, 452, "xsnmaddqp" , []>;
1888 def XSNMADDQPO: X_VT5_VA5_VB5_Ro<63, 452, "xsnmaddqpo", []>;
1889 def XSNMSUBQP : X_VT5_VA5_VB5 <63, 484, "xsnmsubqp" , []>;
1890 def XSNMSUBQPO: X_VT5_VA5_VB5_Ro<63, 484, "xsnmsubqpo", []>;
1891
Kit Barton93612ec2016-02-26 21:11:55 +00001892 //===--------------------------------------------------------------------===//
1893 // Quad/Double-Precision Compare Instructions:
1894
1895 // [PO BF // VRA VRB XO /]
1896 class X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1897 list<dag> pattern>
1898 : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB),
1899 !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> {
1900 let Pattern = pattern;
1901 }
1902
1903 // QP Compare Ordered/Unordered
1904 def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>;
1905 def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>;
1906
1907 // DP/QP Compare Exponents
1908 def XSCMPEXPDP : XX3Form_1<60, 59,
1909 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
1910 "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>;
1911 def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>;
1912
1913 // DP Compare ==, >=, >, !=
1914 // Use vsrc for XT, because the entire register of XT is set.
1915 // XT.dword[1] = 0x0000_0000_0000_0000
1916 def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc,
1917 IIC_FPCompare, []>;
1918 def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc,
1919 IIC_FPCompare, []>;
1920 def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc,
1921 IIC_FPCompare, []>;
1922 def XSCMPNEDP : XX3_XT5_XA5_XB5<60, 27, "xscmpnedp", vsrc, vsfrc, vsfrc,
1923 IIC_FPCompare, []>;
1924 // Vector Compare Not Equal
1925 def XVCMPNEDP : XX3Form_Rc<60, 123,
1926 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1927 "xvcmpnedp $XT, $XA, $XB", IIC_VecFPCompare, []>;
1928 let Defs = [CR6] in
1929 def XVCMPNEDPo : XX3Form_Rc<60, 123,
1930 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1931 "xvcmpnedp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1932 isDOT;
1933 def XVCMPNESP : XX3Form_Rc<60, 91,
1934 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1935 "xvcmpnesp $XT, $XA, $XB", IIC_VecFPCompare, []>;
1936 let Defs = [CR6] in
1937 def XVCMPNESPo : XX3Form_Rc<60, 91,
1938 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1939 "xvcmpnesp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1940 isDOT;
1941
1942 //===--------------------------------------------------------------------===//
1943 // Quad-Precision Floating-Point Conversion Instructions:
1944
1945 // Convert DP -> QP
1946 def XSCVDPQP : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vsfrc, []>;
1947
1948 // Round & Convert QP -> DP (dword[1] is set to zero)
1949 def XSCVQPDP : X_VT5_XO5_VB5 <63, 20, 836, "xscvqpdp" , []>;
1950 def XSCVQPDPO : X_VT5_XO5_VB5_Ro<63, 20, 836, "xscvqpdpo", []>;
1951
1952 // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero)
1953 def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>;
1954 def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>;
1955 def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>;
1956 def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>;
1957
1958 // Convert (Un)Signed DWord -> QP
1959 def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vsfrc, []>;
1960 def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vsfrc, []>;
1961
1962 //===--------------------------------------------------------------------===//
1963 // Round to Floating-Point Integer Instructions
1964
1965 // (Round &) Convert DP <-> HP
1966 // Note! xscvdphp's src and dest register both use the left 64 bits, so we use
1967 // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits,
1968 // but we still use vsfrc for it.
1969 def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>;
1970 def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>;
1971
1972 // Vector HP -> SP
1973 def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>;
1974 def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc, []>;
1975
1976 class Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc,
1977 list<dag> pattern>
1978 : Z23Form_1<opcode, xo,
1979 (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc),
1980 !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> {
1981 let RC = ex;
1982 }
1983
1984 // Round to Quad-Precision Integer [with Inexact]
1985 def XSRQPI : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 0, "xsrqpi" , []>;
1986 def XSRQPIX : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 1, "xsrqpix", []>;
1987
1988 // Round Quad-Precision to Double-Extended Precision (fp80)
1989 def XSRQPXP : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>;
Kit Bartonba532dc2016-03-08 03:49:13 +00001990
1991 //===--------------------------------------------------------------------===//
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00001992 // Insert/Extract Instructions
1993
1994 // Insert Exponent DP/QP
1995 // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU
1996 def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
1997 "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>;
1998 // vB NOTE: only vB.dword[0] is used, that's why we don't use
1999 // X_VT5_VA5_VB5 form
2000 def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB),
2001 "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>;
2002
2003 // Extract Exponent/Significand DP/QP
2004 def XSXEXPDP : XX2_RT5_XO5_XB6<60, 0, 347, "xsxexpdp", []>;
2005 def XSXSIGDP : XX2_RT5_XO5_XB6<60, 1, 347, "xsxsigdp", []>;
2006 def XSXEXPQP : X_VT5_XO5_VB5 <63, 2, 804, "xsxexpqp", []>;
2007 def XSXSIGQP : X_VT5_XO5_VB5 <63, 18, 804, "xsxsigqp", []>;
2008
2009 // Vector Insert Word
2010 // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB.
2011 def XXINSERTW : XX2_RD6_UIM5_RS6<60, 181,
2012 (outs vsrc:$XT), (ins u4imm:$UIMM, vsrc:$XB),
2013 "xxinsertw $XT, $XB, $UIMM", IIC_VecFP, []>;
2014
2015 // Vector Extract Unsigned Word
2016 def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165,
2017 (outs vsrc:$XT), (ins u4imm:$UIMM, vsrc:$XB),
2018 "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>;
2019
2020 // Vector Insert Exponent DP/SP
2021 def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc,
2022 IIC_VecFP, []>;
2023 def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc,
2024 IIC_VecFP, []>;
2025
2026 // Vector Extract Exponent/Significand DP/SP
2027 def XVXEXPDP : XX2_XT6_XO5_XB6<60, 0, 475, "xvxexpdp", vsrc, []>;
2028 def XVXEXPSP : XX2_XT6_XO5_XB6<60, 8, 475, "xvxexpsp", vsrc, []>;
2029 def XVXSIGDP : XX2_XT6_XO5_XB6<60, 1, 475, "xvxsigdp", vsrc, []>;
2030 def XVXSIGSP : XX2_XT6_XO5_XB6<60, 9, 475, "xvxsigsp", vsrc, []>;
2031
2032 //===--------------------------------------------------------------------===//
2033
2034 // Test Data Class SP/DP/QP
2035 def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298,
2036 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2037 "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>;
2038 def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362,
2039 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2040 "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>;
2041 def XSTSTDCQP : X_BF3_DCMX7_RS5 <63, 708,
2042 (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB),
2043 "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>;
2044
2045 // Vector Test Data Class SP/DP
2046 def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5,
2047 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2048 "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP, []>;
2049 def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5,
2050 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2051 "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP, []>;
2052
2053 //===--------------------------------------------------------------------===//
2054
2055 // Maximum/Minimum Type-C/Type-J DP
2056 // XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU, so we use vsrc for XT
2057 def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsrc, vsfrc, vsfrc,
2058 IIC_VecFP, []>;
2059 def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc,
2060 IIC_VecFP, []>;
2061 def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsrc, vsfrc, vsfrc,
2062 IIC_VecFP, []>;
2063 def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc,
2064 IIC_VecFP, []>;
2065
2066 //===--------------------------------------------------------------------===//
2067
2068 // Vector Byte-Reverse H/W/D/Q Word
2069 def XXBRH : XX2_XT6_XO5_XB6<60, 7, 475, "xxbrh", vsrc, []>;
2070 def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, []>;
2071 def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, []>;
2072 def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>;
2073
2074 // Vector Permute
2075 def XXPERM : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc,
2076 IIC_VecPerm, []>;
2077 def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc,
2078 IIC_VecPerm, []>;
2079
2080 // Vector Splat Immediate Byte
2081 def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8),
2082 "xxspltib $XT, $IMM8", IIC_VecPerm, []>;
2083
2084 //===--------------------------------------------------------------------===//
Kit Bartonba532dc2016-03-08 03:49:13 +00002085 // Vector/Scalar Load/Store Instructions
2086
2087 let mayLoad = 1 in {
2088 // Load Vector
2089 def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src),
2090 "lxv $XT, $src", IIC_LdStLFD, []>;
2091 // Load DWord
2092 def LXSD : DSForm_1<57, 2, (outs vrrc:$vD), (ins memrix:$src),
2093 "lxsd $vD, $src", IIC_LdStLFD, []>;
2094 // Load SP from src, convert it to DP, and place in dword[0]
2095 def LXSSP : DSForm_1<57, 3, (outs vrrc:$vD), (ins memrix:$src),
2096 "lxssp $vD, $src", IIC_LdStLFD, []>;
2097
2098 // [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different
2099 // "out" and "in" dag
2100 class X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2101 RegisterOperand vtype, list<dag> pattern>
2102 : XX1Form<opcode, xo, (outs vtype:$XT), (ins memrr:$src),
2103 !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>;
2104
2105 // Load as Integer Byte/Halfword & Zero Indexed
2106 def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc, []>;
2107 def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc, []>;
2108
2109 // Load Vector Halfword*8/Byte*16 Indexed
2110 def LXVH8X : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>;
2111 def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>;
2112
2113 // Load Vector Indexed
2114 def LXVX : X_XT6_RA5_RB5<31, 268, "lxvx" , vsrc, []>;
2115
2116 // Load Vector (Left-justified) with Length
2117 def LXVL : X_XT6_RA5_RB5<31, 269, "lxvl" , vsrc, []>;
2118 def LXVLL : X_XT6_RA5_RB5<31, 301, "lxvll" , vsrc, []>;
2119
2120 // Load Vector Word & Splat Indexed
2121 def LXVWSX : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>;
2122 } // end mayLoad
2123
2124 let mayStore = 1 in {
2125 // Store Vector
2126 def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst),
2127 "stxv $XT, $dst", IIC_LdStSTFD, []>;
2128 // Store DWord
2129 def STXSD : DSForm_1<61, 2, (outs), (ins vrrc:$vS, memrix:$dst),
2130 "stxsd $vS, $dst", IIC_LdStSTFD, []>;
2131 // Convert DP of dword[0] to SP, and Store to dst
2132 def STXSSP : DSForm_1<61, 3, (outs), (ins vrrc:$vS, memrix:$dst),
2133 "stxssp $vS, $dst", IIC_LdStSTFD, []>;
2134
2135 // [PO S RA RB XO SX]
2136 class X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2137 RegisterOperand vtype, list<dag> pattern>
2138 : XX1Form<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst),
2139 !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>;
2140
2141 // Store as Integer Byte/Halfword Indexed
2142 def STXSIBX : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsfrc, []>;
2143 def STXSIHX : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsfrc, []>;
2144
2145 // Store Vector Halfword*8/Byte*16 Indexed
2146 def STXVH8X : X_XS6_RA5_RB5<31, 940, "stxvh8x" , vsrc, []>;
2147 def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>;
2148
2149 // Store Vector Indexed
2150 def STXVX : X_XS6_RA5_RB5<31, 396, "stxvx" , vsrc, []>;
2151
2152 // Store Vector (Left-justified) with Length
2153 def STXVL : X_XS6_RA5_RB5<31, 397, "stxvl" , vsrc, []>;
2154 def STXVLL : X_XS6_RA5_RB5<31, 429, "stxvll" , vsrc, []>;
2155 } // end mayStore
Kit Barton93612ec2016-02-26 21:11:55 +00002156} // end HasP9Vector