blob: 2e54ef2ac0e3a81144b3d820fd54ba95a3aa53ef [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
838def : Pat<(f64 (vector_extract v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000839 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000840def : Pat<(f64 (vector_extract 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
849def : Pat<(f64 (vector_extract v2f64:$S, 0)),
850 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
851def : Pat<(f64 (vector_extract v2f64:$S, 1)),
852 (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
1219let Predicates = [HasDirectMove, HasVSX] 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))]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001238} // HasDirectMove, HasVSX
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001239
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001240/* Direct moves of various widths from GPR's into VSR's. Each move lines
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001241 the value up into element 0 (both BE and LE). Namely, entities smaller than
1242 a doubleword are shifted left and moved for BE. For LE, they're moved, then
1243 swapped to go into the least significant element of the VSR.
1244*/
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001245def MovesToVSR {
1246 dag BE_BYTE_0 =
1247 (MTVSRD
1248 (RLDICR
1249 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1250 dag BE_HALF_0 =
1251 (MTVSRD
1252 (RLDICR
1253 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1254 dag BE_WORD_0 =
1255 (MTVSRD
1256 (RLDICR
1257 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001258 dag BE_DWORD_0 = (MTVSRD $A);
1259
1260 dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001261 dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1262 LE_MTVSRW, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001263 dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001264 dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1265 BE_DWORD_0, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001266 dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1267}
1268
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001269/* Direct moves of various widths from VSR's to GPR's. Each moves the
1270 respective element out of the VSR and ensures that it is lined up
1271 to the right side of the GPR. In addition to the extraction from positions
1272 specified by a constant, a pattern for extracting from a variable position
1273 is provided. This is useful when the element number is not known at
1274 compile time.
1275 The numbering for the DAG's is for LE, but when used on BE, the correct
1276 LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1277*/
1278def MovesFromVSR {
1279 // Doubleword extraction
1280 dag LE_DWORD_0 =
1281 (MFVSRD
1282 (EXTRACT_SUBREG
1283 (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1284 (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1285 dag LE_DWORD_1 = (MFVSRD
1286 (EXTRACT_SUBREG
1287 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1288
1289 // Word extraction
1290 dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 2), sub_64));
1291 dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1292 dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1293 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1294 dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1295
1296 // Halfword extraction
1297 dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1298 dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1299 dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1300 dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1301 dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1302 dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1303 dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1304 dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1305
1306 // Byte extraction
1307 dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1308 dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1309 dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1310 dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1311 dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1312 dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1313 dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1314 dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1315 dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1316 dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1317 dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1318 dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1319 dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1320 dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1321 dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1322 dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1323
1324 /* Variable element number (BE and LE patterns must be specified separately)
1325 This is a rather involved process.
1326
1327 Conceptually, this is how the move is accomplished:
1328 1. Identify which doubleword contains the element
1329 2. Shift in the VMX register so that the correct doubleword is correctly
1330 lined up for the MFVSRD
1331 3. Perform the move so that the element (along with some extra stuff)
1332 is in the GPR
1333 4. Right shift within the GPR so that the element is right-justified
1334
1335 Of course, the index is an element number which has a different meaning
1336 on LE/BE so the patterns have to be specified separately.
1337
1338 Note: The final result will be the element right-justified with high
1339 order bits being arbitrarily defined (namely, whatever was in the
1340 vector register to the left of the value originally).
1341 */
1342
1343 /* LE variable byte
1344 Number 1. above:
1345 - For elements 0-7, we shift left by 8 bytes since they're on the right
1346 - For elements 8-15, we need not shift (shift left by zero bytes)
1347 This is accomplished by inverting the bits of the index and AND-ing
1348 with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1349 */
1350 dag LE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDC8 (LI8 8), $Idx));
1351
1352 // Number 2. above:
1353 // - Now that we set up the shift amount, we shift in the VMX register
1354 dag LE_VBYTE_PERMUTE = (VPERM $S, $S, LE_VBYTE_PERM_VEC);
1355
1356 // Number 3. above:
1357 // - The doubleword containing our element is moved to a GPR
1358 dag LE_MV_VBYTE = (MFVSRD
1359 (EXTRACT_SUBREG
1360 (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1361 sub_64));
1362
1363 /* Number 4. above:
1364 - Truncate the element number to the range 0-7 (8-15 are symmetrical
1365 and out of range values are truncated accordingly)
1366 - Multiply by 8 as we need to shift right by the number of bits, not bytes
1367 - Shift right in the GPR by the calculated value
1368 */
1369 dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1370 sub_32);
1371 dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1372 sub_32);
1373
1374 /* BE variable byte
1375 The algorithm here is the same as the LE variable byte except:
1376 - The shift in the VMX register is by 0/8 for opposite element numbers so
1377 we simply AND the element number with 0x8
1378 - The order of elements after the move to GPR is reversed, so we invert
1379 the bits of the index prior to truncating to the range 0-7
1380 */
1381 dag BE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDIo8 $Idx, 8));
1382 dag BE_VBYTE_PERMUTE = (VPERM $S, $S, BE_VBYTE_PERM_VEC);
1383 dag BE_MV_VBYTE = (MFVSRD
1384 (EXTRACT_SUBREG
1385 (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1386 sub_64));
1387 dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1388 sub_32);
1389 dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1390 sub_32);
1391
1392 /* LE variable halfword
1393 Number 1. above:
1394 - For elements 0-3, we shift left by 8 since they're on the right
1395 - For elements 4-7, we need not shift (shift left by zero bytes)
1396 Similarly to the byte pattern, we invert the bits of the index, but we
1397 AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1398 Of course, the shift is still by 8 bytes, so we must multiply by 2.
1399 */
1400 dag LE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62));
1401
1402 // Number 2. above:
1403 // - Now that we set up the shift amount, we shift in the VMX register
1404 dag LE_VHALF_PERMUTE = (VPERM $S, $S, LE_VHALF_PERM_VEC);
1405
1406 // Number 3. above:
1407 // - The doubleword containing our element is moved to a GPR
1408 dag LE_MV_VHALF = (MFVSRD
1409 (EXTRACT_SUBREG
1410 (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1411 sub_64));
1412
1413 /* Number 4. above:
1414 - Truncate the element number to the range 0-3 (4-7 are symmetrical
1415 and out of range values are truncated accordingly)
1416 - Multiply by 16 as we need to shift right by the number of bits
1417 - Shift right in the GPR by the calculated value
1418 */
1419 dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1420 sub_32);
1421 dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1422 sub_32);
1423
1424 /* BE variable halfword
1425 The algorithm here is the same as the LE variable halfword except:
1426 - The shift in the VMX register is by 0/8 for opposite element numbers so
1427 we simply AND the element number with 0x4 and multiply by 2
1428 - The order of elements after the move to GPR is reversed, so we invert
1429 the bits of the index prior to truncating to the range 0-3
1430 */
1431 dag BE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 4), 1, 62));
1432 dag BE_VHALF_PERMUTE = (VPERM $S, $S, BE_VHALF_PERM_VEC);
1433 dag BE_MV_VHALF = (MFVSRD
1434 (EXTRACT_SUBREG
1435 (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1436 sub_64));
1437 dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 60),
1438 sub_32);
1439 dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1440 sub_32);
1441}
1442
1443// v4f32 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001444let Predicates = [IsBigEndian, HasP8Vector] in {
1445 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1446 (v4f32 (XSCVDPSPN $A))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001447 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1448 (f32 (XSCVSPDPN $S))>;
1449 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1450 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1451 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1452 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
1453 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1454 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001455} // IsBigEndian, HasP8Vector
1456
1457let Predicates = [IsBigEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001458 // v16i8 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001459 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001460 (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001461 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001462 (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001463 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001464 (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001465 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001466 (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
1467 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
1468 (i32 MovesFromVSR.LE_BYTE_15)>;
1469 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
1470 (i32 MovesFromVSR.LE_BYTE_14)>;
1471 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
1472 (i32 MovesFromVSR.LE_BYTE_13)>;
1473 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
1474 (i32 MovesFromVSR.LE_BYTE_12)>;
1475 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
1476 (i32 MovesFromVSR.LE_BYTE_11)>;
1477 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
1478 (i32 MovesFromVSR.LE_BYTE_10)>;
1479 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
1480 (i32 MovesFromVSR.LE_BYTE_9)>;
1481 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
1482 (i32 MovesFromVSR.LE_BYTE_8)>;
1483 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
1484 (i32 MovesFromVSR.LE_BYTE_7)>;
1485 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
1486 (i32 MovesFromVSR.LE_BYTE_6)>;
1487 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
1488 (i32 MovesFromVSR.LE_BYTE_5)>;
1489 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
1490 (i32 MovesFromVSR.LE_BYTE_4)>;
1491 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
1492 (i32 MovesFromVSR.LE_BYTE_3)>;
1493 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
1494 (i32 MovesFromVSR.LE_BYTE_2)>;
1495 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
1496 (i32 MovesFromVSR.LE_BYTE_1)>;
1497 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
1498 (i32 MovesFromVSR.LE_BYTE_0)>;
1499 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
1500 (i32 MovesFromVSR.BE_VARIABLE_BYTE)>;
1501
1502 // v8i16 scalar <-> vector conversions (BE)
1503 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
1504 (i32 MovesFromVSR.LE_HALF_7)>;
1505 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
1506 (i32 MovesFromVSR.LE_HALF_6)>;
1507 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
1508 (i32 MovesFromVSR.LE_HALF_5)>;
1509 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
1510 (i32 MovesFromVSR.LE_HALF_4)>;
1511 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
1512 (i32 MovesFromVSR.LE_HALF_3)>;
1513 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
1514 (i32 MovesFromVSR.LE_HALF_2)>;
1515 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
1516 (i32 MovesFromVSR.LE_HALF_1)>;
1517 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
1518 (i32 MovesFromVSR.LE_HALF_0)>;
1519 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
1520 (i32 MovesFromVSR.BE_VARIABLE_HALF)>;
1521
1522 // v4i32 scalar <-> vector conversions (BE)
1523 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
1524 (i32 MovesFromVSR.LE_WORD_3)>;
1525 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
1526 (i32 MovesFromVSR.LE_WORD_2)>;
1527 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
1528 (i32 MovesFromVSR.LE_WORD_1)>;
1529 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
1530 (i32 MovesFromVSR.LE_WORD_0)>;
1531
1532 // v2i64 scalar <-> vector conversions (BE)
1533 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
1534 (i64 MovesFromVSR.LE_DWORD_1)>;
1535 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
1536 (i64 MovesFromVSR.LE_DWORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001537} // IsBigEndian, HasDirectMove
1538
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001539// v4f32 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001540let Predicates = [IsLittleEndian, HasP8Vector] in {
1541 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1542 (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001543 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1544 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1545 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1546 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
1547 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1548 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1549 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1550 (f32 (XSCVSPDPN $S))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001551} // IsLittleEndian, HasP8Vector
1552
1553let Predicates = [IsLittleEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001554 // v16i8 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001555 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001556 (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001557 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001558 (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001559 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001560 (v4i32 MovesToVSR.LE_WORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001561 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001562 (v2i64 MovesToVSR.LE_DWORD_0)>;
1563 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
1564 (i32 MovesFromVSR.LE_BYTE_0)>;
1565 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
1566 (i32 MovesFromVSR.LE_BYTE_1)>;
1567 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
1568 (i32 MovesFromVSR.LE_BYTE_2)>;
1569 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
1570 (i32 MovesFromVSR.LE_BYTE_3)>;
1571 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
1572 (i32 MovesFromVSR.LE_BYTE_4)>;
1573 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
1574 (i32 MovesFromVSR.LE_BYTE_5)>;
1575 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
1576 (i32 MovesFromVSR.LE_BYTE_6)>;
1577 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
1578 (i32 MovesFromVSR.LE_BYTE_7)>;
1579 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
1580 (i32 MovesFromVSR.LE_BYTE_8)>;
1581 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
1582 (i32 MovesFromVSR.LE_BYTE_9)>;
1583 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
1584 (i32 MovesFromVSR.LE_BYTE_10)>;
1585 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
1586 (i32 MovesFromVSR.LE_BYTE_11)>;
1587 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
1588 (i32 MovesFromVSR.LE_BYTE_12)>;
1589 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
1590 (i32 MovesFromVSR.LE_BYTE_13)>;
1591 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
1592 (i32 MovesFromVSR.LE_BYTE_14)>;
1593 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
1594 (i32 MovesFromVSR.LE_BYTE_15)>;
1595 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
1596 (i32 MovesFromVSR.LE_VARIABLE_BYTE)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001597
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001598 // v8i16 scalar <-> vector conversions (LE)
1599 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
1600 (i32 MovesFromVSR.LE_HALF_0)>;
1601 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
1602 (i32 MovesFromVSR.LE_HALF_1)>;
1603 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
1604 (i32 MovesFromVSR.LE_HALF_2)>;
1605 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
1606 (i32 MovesFromVSR.LE_HALF_3)>;
1607 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
1608 (i32 MovesFromVSR.LE_HALF_4)>;
1609 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
1610 (i32 MovesFromVSR.LE_HALF_5)>;
1611 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
1612 (i32 MovesFromVSR.LE_HALF_6)>;
1613 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
1614 (i32 MovesFromVSR.LE_HALF_7)>;
1615 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
1616 (i32 MovesFromVSR.LE_VARIABLE_HALF)>;
1617
1618 // v4i32 scalar <-> vector conversions (LE)
1619 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
1620 (i32 MovesFromVSR.LE_WORD_0)>;
1621 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
1622 (i32 MovesFromVSR.LE_WORD_1)>;
1623 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
1624 (i32 MovesFromVSR.LE_WORD_2)>;
1625 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
1626 (i32 MovesFromVSR.LE_WORD_3)>;
1627
1628 // v2i64 scalar <-> vector conversions (LE)
1629 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
1630 (i64 MovesFromVSR.LE_DWORD_0)>;
1631 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
1632 (i64 MovesFromVSR.LE_DWORD_1)>;
1633} // IsLittleEndian, HasDirectMove