blob: bc91fb6874bbcb20e9d8e48cf0461c993325e2e8 [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),
Nemanja Ivanovic1a2b2f02016-05-04 16:04:02 +0000778 "xxspltw $XT, $XB, $UIM", IIC_VecPerm,
779 [(set v4i32:$XT,
780 (PPCxxsplt v4i32:$XB, imm32SExt16:$UIM))]>;
Craig Topperc50d64b2014-11-26 00:46:26 +0000781} // hasSideEffects
Hal Finkel27774d92014-03-13 07:58:58 +0000782
Bill Schmidt61e65232014-10-22 13:13:40 +0000783// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
784// instruction selection into a branch sequence.
785let usesCustomInserter = 1, // Expanded after instruction selection.
786 PPC970_Single = 1 in {
787
788 def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
789 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
790 "#SELECT_CC_VSRC",
791 []>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000792 def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
793 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
794 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000795 [(set v2f64:$dst,
796 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000797 def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
798 (ins crrc:$cond, f8rc:$T, f8rc:$F,
799 i32imm:$BROPC), "#SELECT_CC_VSFRC",
800 []>;
801 def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
802 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
803 "#SELECT_VSFRC",
804 [(set f64:$dst,
805 (select i1:$cond, f64:$T, f64:$F))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000806 def SELECT_CC_VSSRC: Pseudo<(outs f4rc:$dst),
807 (ins crrc:$cond, f4rc:$T, f4rc:$F,
808 i32imm:$BROPC), "#SELECT_CC_VSSRC",
809 []>;
810 def SELECT_VSSRC: Pseudo<(outs f4rc:$dst),
811 (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
812 "#SELECT_VSSRC",
813 [(set f32:$dst,
814 (select i1:$cond, f32:$T, f32:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000815} // usesCustomInserter
816} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000817
Hal Finkel27774d92014-03-13 07:58:58 +0000818def : InstAlias<"xvmovdp $XT, $XB",
819 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
820def : InstAlias<"xvmovsp $XT, $XB",
821 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
822
823def : InstAlias<"xxspltd $XT, $XB, 0",
824 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
825def : InstAlias<"xxspltd $XT, $XB, 1",
826 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
827def : InstAlias<"xxmrghd $XT, $XA, $XB",
828 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
829def : InstAlias<"xxmrgld $XT, $XA, $XB",
830 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
831def : InstAlias<"xxswapd $XT, $XB",
832 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
833
834let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000835
836let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000837def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000838 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000839
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000840def : Pat<(f64 (extractelt v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000841 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000842def : Pat<(f64 (extractelt v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000843 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000844}
845
846let Predicates = [IsLittleEndian] in {
847def : Pat<(v2f64 (scalar_to_vector f64:$A)),
848 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
849 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
850
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000851def : Pat<(f64 (extractelt v2f64:$S, 0)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000852 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000853def : Pat<(f64 (extractelt v2f64:$S, 1)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000854 (f64 (EXTRACT_SUBREG $S, sub_64))>;
855}
Hal Finkel27774d92014-03-13 07:58:58 +0000856
857// Additional fnmsub patterns: -a*c + b == -(a*c - b)
858def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
859 (XSNMSUBADP $B, $C, $A)>;
860def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
861 (XSNMSUBADP $B, $C, $A)>;
862
863def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
864 (XVNMSUBADP $B, $C, $A)>;
865def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
866 (XVNMSUBADP $B, $C, $A)>;
867
868def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
869 (XVNMSUBASP $B, $C, $A)>;
870def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
871 (XVNMSUBASP $B, $C, $A)>;
872
Hal Finkel9e0baa62014-04-01 19:24:27 +0000873def : Pat<(v2f64 (bitconvert v4f32:$A)),
874 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000875def : Pat<(v2f64 (bitconvert v4i32:$A)),
876 (COPY_TO_REGCLASS $A, VSRC)>;
877def : Pat<(v2f64 (bitconvert v8i16:$A)),
878 (COPY_TO_REGCLASS $A, VSRC)>;
879def : Pat<(v2f64 (bitconvert v16i8:$A)),
880 (COPY_TO_REGCLASS $A, VSRC)>;
881
Hal Finkel9e0baa62014-04-01 19:24:27 +0000882def : Pat<(v4f32 (bitconvert v2f64:$A)),
883 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000884def : Pat<(v4i32 (bitconvert v2f64:$A)),
885 (COPY_TO_REGCLASS $A, VRRC)>;
886def : Pat<(v8i16 (bitconvert v2f64:$A)),
887 (COPY_TO_REGCLASS $A, VRRC)>;
888def : Pat<(v16i8 (bitconvert v2f64:$A)),
889 (COPY_TO_REGCLASS $A, VRRC)>;
890
Hal Finkel9e0baa62014-04-01 19:24:27 +0000891def : Pat<(v2i64 (bitconvert v4f32:$A)),
892 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000893def : Pat<(v2i64 (bitconvert v4i32:$A)),
894 (COPY_TO_REGCLASS $A, VSRC)>;
895def : Pat<(v2i64 (bitconvert v8i16:$A)),
896 (COPY_TO_REGCLASS $A, VSRC)>;
897def : Pat<(v2i64 (bitconvert v16i8:$A)),
898 (COPY_TO_REGCLASS $A, VSRC)>;
899
Hal Finkel9e0baa62014-04-01 19:24:27 +0000900def : Pat<(v4f32 (bitconvert v2i64:$A)),
901 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000902def : Pat<(v4i32 (bitconvert v2i64:$A)),
903 (COPY_TO_REGCLASS $A, VRRC)>;
904def : Pat<(v8i16 (bitconvert v2i64:$A)),
905 (COPY_TO_REGCLASS $A, VRRC)>;
906def : Pat<(v16i8 (bitconvert v2i64:$A)),
907 (COPY_TO_REGCLASS $A, VRRC)>;
908
Hal Finkel9281c9a2014-03-26 18:26:30 +0000909def : Pat<(v2f64 (bitconvert v2i64:$A)),
910 (COPY_TO_REGCLASS $A, VRRC)>;
911def : Pat<(v2i64 (bitconvert v2f64:$A)),
912 (COPY_TO_REGCLASS $A, VRRC)>;
913
Kit Bartond4eb73c2015-05-05 16:10:44 +0000914def : Pat<(v2f64 (bitconvert v1i128:$A)),
915 (COPY_TO_REGCLASS $A, VRRC)>;
916def : Pat<(v1i128 (bitconvert v2f64:$A)),
917 (COPY_TO_REGCLASS $A, VRRC)>;
918
Hal Finkel5c0d1452014-03-30 13:22:59 +0000919// sign extension patterns
920// To extend "in place" from v2i32 to v2i64, we have input data like:
921// | undef | i32 | undef | i32 |
922// but xvcvsxwdp expects the input in big-Endian format:
923// | i32 | undef | i32 | undef |
924// so we need to shift everything to the left by one i32 (word) before
925// the conversion.
926def : Pat<(sext_inreg v2i64:$C, v2i32),
927 (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
928def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
929 (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
930
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000931// Loads.
Bill Schmidt72954782014-11-12 04:19:40 +0000932def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
933def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000934def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000935def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000936
937// Stores.
Hal Finkele3d2b202015-02-01 19:07:41 +0000938def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
939 (STXVD2X $rS, xoaddr:$dst)>;
Bill Schmidt72954782014-11-12 04:19:40 +0000940def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
Hal Finkele3d2b202015-02-01 19:07:41 +0000941def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
942 (STXVW4X $rS, xoaddr:$dst)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000943def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
944
945// Permutes.
946def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
947def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
948def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
949def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000950
Bill Schmidt61e65232014-10-22 13:13:40 +0000951// Selects.
952def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000953 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
954def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000955 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
956def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000957 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
958def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000959 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
960def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
961 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
962def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000963 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
964def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000965 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
966def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000967 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
968def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000969 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
970def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
971 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
972
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000973def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000974 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
975def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000976 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
977def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000978 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
979def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000980 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
981def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
982 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
983def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000984 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
985def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000986 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
987def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000988 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
989def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000990 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
991def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
992 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
993
Bill Schmidt76746922014-11-14 12:10:40 +0000994// Divides.
995def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
996 (XVDIVSP $A, $B)>;
997def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
998 (XVDIVDP $A, $B)>;
999
Nemanja Ivanovic984a3612015-07-14 17:25:20 +00001000// Reciprocal estimate
1001def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
1002 (XVRESP $A)>;
1003def : Pat<(int_ppc_vsx_xvredp v2f64:$A),
1004 (XVREDP $A)>;
1005
Nemanja Ivanovicd358b8f2015-07-05 06:03:51 +00001006// Recip. square root estimate
1007def : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
1008 (XVRSQRTESP $A)>;
1009def : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
1010 (XVRSQRTEDP $A)>;
1011
Hal Finkel27774d92014-03-13 07:58:58 +00001012} // AddedComplexity
1013} // HasVSX
1014
Kit Barton298beb52015-02-18 16:21:46 +00001015// The following VSX instructions were introduced in Power ISA 2.07
1016/* FIXME: if the operands are v2i64, these patterns will not match.
1017 we should define new patterns or otherwise match the same patterns
1018 when the elements are larger than i32.
1019*/
1020def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001021def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Kit Barton298beb52015-02-18 16:21:46 +00001022let Predicates = [HasP8Vector] in {
1023let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001024 let isCommutable = 1 in {
1025 def XXLEQV : XX3Form<60, 186,
1026 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1027 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
1028 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
1029 def XXLNAND : XX3Form<60, 178,
1030 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1031 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
1032 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
Kit Barton298beb52015-02-18 16:21:46 +00001033 v4i32:$XB)))]>;
1034 } // isCommutable
Nemanja Ivanovicd9e4b4f2015-07-10 14:25:17 +00001035
Nemanja Ivanovic5655fb32015-07-10 12:38:08 +00001036 def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
1037 (XXLEQV $A, $B)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001038
1039 def XXLORC : XX3Form<60, 170,
1040 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1041 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
1042 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
1043
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001044 // VSX scalar loads introduced in ISA 2.07
1045 let mayLoad = 1 in {
1046 def LXSSPX : XX1Form<31, 524, (outs vssrc:$XT), (ins memrr:$src),
1047 "lxsspx $XT, $src", IIC_LdStLFD,
1048 [(set f32:$XT, (load xoaddr:$src))]>;
1049 def LXSIWAX : XX1Form<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
1050 "lxsiwax $XT, $src", IIC_LdStLFD,
1051 [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
1052 def LXSIWZX : XX1Form<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
1053 "lxsiwzx $XT, $src", IIC_LdStLFD,
1054 [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
1055 } // mayLoad
1056
1057 // VSX scalar stores introduced in ISA 2.07
1058 let mayStore = 1 in {
1059 def STXSSPX : XX1Form<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
1060 "stxsspx $XT, $dst", IIC_LdStSTFD,
1061 [(store f32:$XT, xoaddr:$dst)]>;
1062 def STXSIWX : XX1Form<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
1063 "stxsiwx $XT, $dst", IIC_LdStSTFD,
1064 [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
1065 } // mayStore
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001066
1067 def : Pat<(f64 (extloadf32 xoaddr:$src)),
1068 (COPY_TO_REGCLASS (LXSSPX xoaddr:$src), VSFRC)>;
1069 def : Pat<(f64 (fextend f32:$src)),
1070 (COPY_TO_REGCLASS $src, VSFRC)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00001071
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001072 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001073 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1074 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001075 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1076 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001077 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1078 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001079 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1080 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
1081 (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1082 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001083 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1084 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001085 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1086 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001087 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1088 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001089 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1090 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001091 (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001092
1093 // VSX Elementary Scalar FP arithmetic (SP)
1094 let isCommutable = 1 in {
1095 def XSADDSP : XX3Form<60, 0,
1096 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1097 "xsaddsp $XT, $XA, $XB", IIC_VecFP,
1098 [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
1099 def XSMULSP : XX3Form<60, 16,
1100 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1101 "xsmulsp $XT, $XA, $XB", IIC_VecFP,
1102 [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
1103 } // isCommutable
1104
1105 def XSDIVSP : XX3Form<60, 24,
1106 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1107 "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
1108 [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
1109 def XSRESP : XX2Form<60, 26,
1110 (outs vssrc:$XT), (ins vssrc:$XB),
1111 "xsresp $XT, $XB", IIC_VecFP,
1112 [(set f32:$XT, (PPCfre f32:$XB))]>;
1113 def XSSQRTSP : XX2Form<60, 11,
1114 (outs vssrc:$XT), (ins vssrc:$XB),
1115 "xssqrtsp $XT, $XB", IIC_FPSqrtS,
1116 [(set f32:$XT, (fsqrt f32:$XB))]>;
1117 def XSRSQRTESP : XX2Form<60, 10,
1118 (outs vssrc:$XT), (ins vssrc:$XB),
1119 "xsrsqrtesp $XT, $XB", IIC_VecFP,
1120 [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
1121 def XSSUBSP : XX3Form<60, 8,
1122 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1123 "xssubsp $XT, $XA, $XB", IIC_VecFP,
1124 [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00001125
1126 // FMA Instructions
1127 let BaseName = "XSMADDASP" in {
1128 let isCommutable = 1 in
1129 def XSMADDASP : XX3Form<60, 1,
1130 (outs vssrc:$XT),
1131 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1132 "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
1133 [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
1134 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1135 AltVSXFMARel;
1136 let IsVSXFMAAlt = 1 in
1137 def XSMADDMSP : XX3Form<60, 9,
1138 (outs vssrc:$XT),
1139 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1140 "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1141 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1142 AltVSXFMARel;
1143 }
1144
1145 let BaseName = "XSMSUBASP" in {
1146 let isCommutable = 1 in
1147 def XSMSUBASP : XX3Form<60, 17,
1148 (outs vssrc:$XT),
1149 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1150 "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
1151 [(set f32:$XT, (fma f32:$XA, f32:$XB,
1152 (fneg f32:$XTi)))]>,
1153 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1154 AltVSXFMARel;
1155 let IsVSXFMAAlt = 1 in
1156 def XSMSUBMSP : XX3Form<60, 25,
1157 (outs vssrc:$XT),
1158 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1159 "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1160 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1161 AltVSXFMARel;
1162 }
1163
1164 let BaseName = "XSNMADDASP" in {
1165 let isCommutable = 1 in
1166 def XSNMADDASP : XX3Form<60, 129,
1167 (outs vssrc:$XT),
1168 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1169 "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
1170 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1171 f32:$XTi)))]>,
1172 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1173 AltVSXFMARel;
1174 let IsVSXFMAAlt = 1 in
1175 def XSNMADDMSP : XX3Form<60, 137,
1176 (outs vssrc:$XT),
1177 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1178 "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1179 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1180 AltVSXFMARel;
1181 }
1182
1183 let BaseName = "XSNMSUBASP" in {
1184 let isCommutable = 1 in
1185 def XSNMSUBASP : XX3Form<60, 145,
1186 (outs vssrc:$XT),
1187 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1188 "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
1189 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1190 (fneg f32:$XTi))))]>,
1191 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1192 AltVSXFMARel;
1193 let IsVSXFMAAlt = 1 in
1194 def XSNMSUBMSP : XX3Form<60, 153,
1195 (outs vssrc:$XT),
1196 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1197 "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1198 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1199 AltVSXFMARel;
1200 }
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001201
1202 // Single Precision Conversions (FP <-> INT)
1203 def XSCVSXDSP : XX2Form<60, 312,
1204 (outs vssrc:$XT), (ins vsfrc:$XB),
1205 "xscvsxdsp $XT, $XB", IIC_VecFP,
1206 [(set f32:$XT, (PPCfcfids f64:$XB))]>;
1207 def XSCVUXDSP : XX2Form<60, 296,
1208 (outs vssrc:$XT), (ins vsfrc:$XB),
1209 "xscvuxdsp $XT, $XB", IIC_VecFP,
1210 [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
1211
1212 // Conversions between vector and scalar single precision
1213 def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
1214 "xscvdpspn $XT, $XB", IIC_VecFP, []>;
1215 def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
1216 "xscvspdpn $XT, $XB", IIC_VecFP, []>;
1217
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001218} // AddedComplexity = 400
Kit Barton298beb52015-02-18 16:21:46 +00001219} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001220
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001221let Predicates = [HasDirectMove] in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001222 // VSX direct move instructions
1223 def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
1224 "mfvsrd $rA, $XT", IIC_VecGeneral,
1225 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
1226 Requires<[In64BitMode]>;
1227 def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
1228 "mfvsrwz $rA, $XT", IIC_VecGeneral,
1229 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
1230 def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
1231 "mtvsrd $XT, $rA", IIC_VecGeneral,
1232 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1233 Requires<[In64BitMode]>;
1234 def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1235 "mtvsrwa $XT, $rA", IIC_VecGeneral,
1236 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1237 def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1238 "mtvsrwz $XT, $rA", IIC_VecGeneral,
1239 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001240} // HasDirectMove
1241
1242let Predicates = [IsISA3_0, HasDirectMove] in {
1243 def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),
1244 "mtvsrws $XT, $rA", IIC_VecGeneral,
1245 []>;
1246
1247 def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
1248 "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,
1249 []>, Requires<[In64BitMode]>;
1250
1251 def MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT),
1252 "mfvsrld $rA, $XT", IIC_VecGeneral,
1253 []>, Requires<[In64BitMode]>;
1254
1255} // IsISA3_0, HasDirectMove
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001256
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001257/* Direct moves of various widths from GPR's into VSR's. Each move lines
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001258 the value up into element 0 (both BE and LE). Namely, entities smaller than
1259 a doubleword are shifted left and moved for BE. For LE, they're moved, then
1260 swapped to go into the least significant element of the VSR.
1261*/
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001262def MovesToVSR {
1263 dag BE_BYTE_0 =
1264 (MTVSRD
1265 (RLDICR
1266 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1267 dag BE_HALF_0 =
1268 (MTVSRD
1269 (RLDICR
1270 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1271 dag BE_WORD_0 =
1272 (MTVSRD
1273 (RLDICR
1274 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001275 dag BE_DWORD_0 = (MTVSRD $A);
1276
1277 dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001278 dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1279 LE_MTVSRW, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001280 dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001281 dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1282 BE_DWORD_0, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001283 dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1284}
1285
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001286/* Patterns for extracting elements out of vectors. Integer elements are
1287 extracted using direct move operations. Patterns for extracting elements
1288 whose indices are not available at compile time are also provided with
1289 various _VARIABLE_ patterns.
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001290 The numbering for the DAG's is for LE, but when used on BE, the correct
1291 LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1292*/
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001293def VectorExtractions {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001294 // Doubleword extraction
1295 dag LE_DWORD_0 =
1296 (MFVSRD
1297 (EXTRACT_SUBREG
1298 (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1299 (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1300 dag LE_DWORD_1 = (MFVSRD
1301 (EXTRACT_SUBREG
1302 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1303
1304 // Word extraction
1305 dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 2), sub_64));
1306 dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1307 dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1308 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1309 dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1310
1311 // Halfword extraction
1312 dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1313 dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1314 dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1315 dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1316 dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1317 dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1318 dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1319 dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1320
1321 // Byte extraction
1322 dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1323 dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1324 dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1325 dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1326 dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1327 dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1328 dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1329 dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1330 dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1331 dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1332 dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1333 dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1334 dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1335 dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1336 dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1337 dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1338
1339 /* Variable element number (BE and LE patterns must be specified separately)
1340 This is a rather involved process.
1341
1342 Conceptually, this is how the move is accomplished:
1343 1. Identify which doubleword contains the element
1344 2. Shift in the VMX register so that the correct doubleword is correctly
1345 lined up for the MFVSRD
1346 3. Perform the move so that the element (along with some extra stuff)
1347 is in the GPR
1348 4. Right shift within the GPR so that the element is right-justified
1349
1350 Of course, the index is an element number which has a different meaning
1351 on LE/BE so the patterns have to be specified separately.
1352
1353 Note: The final result will be the element right-justified with high
1354 order bits being arbitrarily defined (namely, whatever was in the
1355 vector register to the left of the value originally).
1356 */
1357
1358 /* LE variable byte
1359 Number 1. above:
1360 - For elements 0-7, we shift left by 8 bytes since they're on the right
1361 - For elements 8-15, we need not shift (shift left by zero bytes)
1362 This is accomplished by inverting the bits of the index and AND-ing
1363 with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1364 */
1365 dag LE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDC8 (LI8 8), $Idx));
1366
1367 // Number 2. above:
1368 // - Now that we set up the shift amount, we shift in the VMX register
1369 dag LE_VBYTE_PERMUTE = (VPERM $S, $S, LE_VBYTE_PERM_VEC);
1370
1371 // Number 3. above:
1372 // - The doubleword containing our element is moved to a GPR
1373 dag LE_MV_VBYTE = (MFVSRD
1374 (EXTRACT_SUBREG
1375 (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1376 sub_64));
1377
1378 /* Number 4. above:
1379 - Truncate the element number to the range 0-7 (8-15 are symmetrical
1380 and out of range values are truncated accordingly)
1381 - Multiply by 8 as we need to shift right by the number of bits, not bytes
1382 - Shift right in the GPR by the calculated value
1383 */
1384 dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1385 sub_32);
1386 dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1387 sub_32);
1388
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001389 /* LE variable halfword
1390 Number 1. above:
1391 - For elements 0-3, we shift left by 8 since they're on the right
1392 - For elements 4-7, we need not shift (shift left by zero bytes)
1393 Similarly to the byte pattern, we invert the bits of the index, but we
1394 AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1395 Of course, the shift is still by 8 bytes, so we must multiply by 2.
1396 */
1397 dag LE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62));
1398
1399 // Number 2. above:
1400 // - Now that we set up the shift amount, we shift in the VMX register
1401 dag LE_VHALF_PERMUTE = (VPERM $S, $S, LE_VHALF_PERM_VEC);
1402
1403 // Number 3. above:
1404 // - The doubleword containing our element is moved to a GPR
1405 dag LE_MV_VHALF = (MFVSRD
1406 (EXTRACT_SUBREG
1407 (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1408 sub_64));
1409
1410 /* Number 4. above:
1411 - Truncate the element number to the range 0-3 (4-7 are symmetrical
1412 and out of range values are truncated accordingly)
1413 - Multiply by 16 as we need to shift right by the number of bits
1414 - Shift right in the GPR by the calculated value
1415 */
1416 dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1417 sub_32);
1418 dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1419 sub_32);
1420
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001421 /* LE variable word
1422 Number 1. above:
1423 - For elements 0-1, we shift left by 8 since they're on the right
1424 - For elements 2-3, we need not shift
1425 */
1426 dag LE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61));
1427
1428 // Number 2. above:
1429 // - Now that we set up the shift amount, we shift in the VMX register
1430 dag LE_VWORD_PERMUTE = (VPERM $S, $S, LE_VWORD_PERM_VEC);
1431
1432 // Number 3. above:
1433 // - The doubleword containing our element is moved to a GPR
1434 dag LE_MV_VWORD = (MFVSRD
1435 (EXTRACT_SUBREG
1436 (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
1437 sub_64));
1438
1439 /* Number 4. above:
1440 - Truncate the element number to the range 0-1 (2-3 are symmetrical
1441 and out of range values are truncated accordingly)
1442 - Multiply by 32 as we need to shift right by the number of bits
1443 - Shift right in the GPR by the calculated value
1444 */
1445 dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
1446 sub_32);
1447 dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
1448 sub_32);
1449
1450 /* LE variable doubleword
1451 Number 1. above:
1452 - For element 0, we shift left by 8 since it's on the right
1453 - For element 1, we need not shift
1454 */
1455 dag LE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60));
1456
1457 // Number 2. above:
1458 // - Now that we set up the shift amount, we shift in the VMX register
1459 dag LE_VDWORD_PERMUTE = (VPERM $S, $S, LE_VDWORD_PERM_VEC);
1460
1461 // Number 3. above:
1462 // - The doubleword containing our element is moved to a GPR
1463 // - Number 4. is not needed for the doubleword as the value is 64-bits
1464 dag LE_VARIABLE_DWORD =
1465 (MFVSRD (EXTRACT_SUBREG
1466 (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
1467 sub_64));
1468
1469 /* LE variable float
1470 - Shift the vector to line up the desired element to BE Word 0
1471 - Convert 32-bit float to a 64-bit single precision float
1472 */
1473 dag LE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR (XOR8 (LI8 3), $Idx), 2, 61));
1474 dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
1475 dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
1476
1477 /* LE variable double
1478 Same as the LE doubleword except there is no move.
1479 */
1480 dag LE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1481 (COPY_TO_REGCLASS $S, VRRC),
1482 LE_VDWORD_PERM_VEC);
1483 dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
1484
1485 /* BE variable byte
1486 The algorithm here is the same as the LE variable byte except:
1487 - The shift in the VMX register is by 0/8 for opposite element numbers so
1488 we simply AND the element number with 0x8
1489 - The order of elements after the move to GPR is reversed, so we invert
1490 the bits of the index prior to truncating to the range 0-7
1491 */
1492 dag BE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDIo8 $Idx, 8));
1493 dag BE_VBYTE_PERMUTE = (VPERM $S, $S, BE_VBYTE_PERM_VEC);
1494 dag BE_MV_VBYTE = (MFVSRD
1495 (EXTRACT_SUBREG
1496 (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1497 sub_64));
1498 dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1499 sub_32);
1500 dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1501 sub_32);
1502
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001503 /* BE variable halfword
1504 The algorithm here is the same as the LE variable halfword except:
1505 - The shift in the VMX register is by 0/8 for opposite element numbers so
1506 we simply AND the element number with 0x4 and multiply by 2
1507 - The order of elements after the move to GPR is reversed, so we invert
1508 the bits of the index prior to truncating to the range 0-3
1509 */
1510 dag BE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 4), 1, 62));
1511 dag BE_VHALF_PERMUTE = (VPERM $S, $S, BE_VHALF_PERM_VEC);
1512 dag BE_MV_VHALF = (MFVSRD
1513 (EXTRACT_SUBREG
1514 (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1515 sub_64));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001516 dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001517 sub_32);
1518 dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1519 sub_32);
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001520
1521 /* BE variable word
1522 The algorithm is the same as the LE variable word except:
1523 - The shift in the VMX register happens for opposite element numbers
1524 - The order of elements after the move to GPR is reversed, so we invert
1525 the bits of the index prior to truncating to the range 0-1
1526 */
1527 dag BE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 2), 2, 61));
1528 dag BE_VWORD_PERMUTE = (VPERM $S, $S, BE_VWORD_PERM_VEC);
1529 dag BE_MV_VWORD = (MFVSRD
1530 (EXTRACT_SUBREG
1531 (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
1532 sub_64));
1533 dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
1534 sub_32);
1535 dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
1536 sub_32);
1537
1538 /* BE variable doubleword
1539 Same as the LE doubleword except we shift in the VMX register for opposite
1540 element indices.
1541 */
1542 dag BE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 1), 3, 60));
1543 dag BE_VDWORD_PERMUTE = (VPERM $S, $S, BE_VDWORD_PERM_VEC);
1544 dag BE_VARIABLE_DWORD =
1545 (MFVSRD (EXTRACT_SUBREG
1546 (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
1547 sub_64));
1548
1549 /* BE variable float
1550 - Shift the vector to line up the desired element to BE Word 0
1551 - Convert 32-bit float to a 64-bit single precision float
1552 */
1553 dag BE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR $Idx, 2, 61));
1554 dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
1555 dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
1556
1557 /* BE variable double
1558 Same as the BE doubleword except there is no move.
1559 */
1560 dag BE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1561 (COPY_TO_REGCLASS $S, VRRC),
1562 BE_VDWORD_PERM_VEC);
1563 dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001564}
1565
1566// v4f32 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001567let Predicates = [IsBigEndian, HasP8Vector] in {
1568 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1569 (v4f32 (XSCVDPSPN $A))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001570 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1571 (f32 (XSCVSPDPN $S))>;
1572 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1573 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1574 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1575 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
1576 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1577 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001578 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1579 (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001580} // IsBigEndian, HasP8Vector
1581
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001582// Variable index vector_extract for v2f64 does not require P8Vector
1583let Predicates = [IsBigEndian, HasVSX] in
1584 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1585 (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
1586
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001587let Predicates = [IsBigEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001588 // v16i8 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001589 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001590 (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001591 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001592 (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001593 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001594 (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001595 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001596 (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
1597 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001598 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001599 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001600 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001601 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001602 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001603 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001604 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001605 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001606 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001607 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001608 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001609 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001610 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001611 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001612 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001613 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001614 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001615 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001616 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001617 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001618 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001619 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001620 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001621 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001622 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001623 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001624 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001625 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001626 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001627 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001628 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001629 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001630 (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001631
1632 // v8i16 scalar <-> vector conversions (BE)
1633 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001634 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001635 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001636 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001637 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001638 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001639 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001640 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001641 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001642 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001643 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001644 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001645 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001646 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001647 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001648 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001649 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001650 (i32 VectorExtractions.BE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001651
1652 // v4i32 scalar <-> vector conversions (BE)
1653 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001654 (i32 VectorExtractions.LE_WORD_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001655 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001656 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001657 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001658 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001659 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001660 (i32 VectorExtractions.LE_WORD_0)>;
1661 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1662 (i32 VectorExtractions.BE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001663
1664 // v2i64 scalar <-> vector conversions (BE)
1665 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001666 (i64 VectorExtractions.LE_DWORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001667 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001668 (i64 VectorExtractions.LE_DWORD_0)>;
1669 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1670 (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001671} // IsBigEndian, HasDirectMove
1672
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001673// v4f32 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001674let Predicates = [IsLittleEndian, HasP8Vector] in {
1675 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1676 (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001677 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1678 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1679 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1680 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
1681 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1682 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1683 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1684 (f32 (XSCVSPDPN $S))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001685 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1686 (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001687} // IsLittleEndian, HasP8Vector
1688
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001689// Variable index vector_extract for v2f64 does not require P8Vector
1690let Predicates = [IsLittleEndian, HasVSX] in
1691 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1692 (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
1693
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001694let Predicates = [IsLittleEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001695 // v16i8 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001696 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001697 (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001698 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001699 (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001700 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001701 (v4i32 MovesToVSR.LE_WORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001702 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001703 (v2i64 MovesToVSR.LE_DWORD_0)>;
1704 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001705 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001706 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001707 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001708 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001709 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001710 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001711 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001712 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001713 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001714 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001715 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001716 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001717 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001718 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001719 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001720 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001721 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001722 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001723 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001724 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001725 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001726 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001727 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001728 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001729 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001730 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001731 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001732 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001733 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001734 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001735 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001736 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001737 (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001738
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001739 // v8i16 scalar <-> vector conversions (LE)
1740 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001741 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001742 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001743 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001744 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001745 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001746 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001747 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001748 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001749 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001750 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001751 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001752 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001753 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001754 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001755 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001756 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001757 (i32 VectorExtractions.LE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001758
1759 // v4i32 scalar <-> vector conversions (LE)
1760 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001761 (i32 VectorExtractions.LE_WORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001762 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001763 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001764 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001765 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001766 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001767 (i32 VectorExtractions.LE_WORD_3)>;
1768 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1769 (i32 VectorExtractions.LE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001770
1771 // v2i64 scalar <-> vector conversions (LE)
1772 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001773 (i64 VectorExtractions.LE_DWORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001774 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001775 (i64 VectorExtractions.LE_DWORD_1)>;
1776 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1777 (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001778} // IsLittleEndian, HasDirectMove
Nemanja Ivanovic89224762015-12-15 14:50:34 +00001779
1780let Predicates = [HasDirectMove, HasVSX] in {
1781// bitconvert f32 -> i32
1782// (convert to 32-bit fp single, shift right 1 word, move to GPR)
1783def : Pat<(i32 (bitconvert f32:$S)),
1784 (i32 (MFVSRWZ (EXTRACT_SUBREG
1785 (XXSLDWI (XSCVDPSPN $S),(XSCVDPSPN $S), 3),
1786 sub_64)))>;
1787// bitconvert i32 -> f32
1788// (move to FPR, shift left 1 word, convert to 64-bit fp single)
1789def : Pat<(f32 (bitconvert i32:$A)),
1790 (f32 (XSCVSPDPN
1791 (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
1792
1793// bitconvert f64 -> i64
1794// (move to GPR, nothing else needed)
1795def : Pat<(i64 (bitconvert f64:$S)),
1796 (i64 (MFVSRD $S))>;
1797
1798// bitconvert i64 -> f64
1799// (move to FPR, nothing else needed)
1800def : Pat<(f64 (bitconvert i64:$S)),
1801 (f64 (MTVSRD $S))>;
1802}
Kit Barton93612ec2016-02-26 21:11:55 +00001803
1804// The following VSX instructions were introduced in Power ISA 3.0
1805def HasP9Vector : Predicate<"PPCSubTarget->hasP9Vector()">;
1806let Predicates = [HasP9Vector] in {
1807
1808 // [PO VRT XO VRB XO /]
1809 class X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1810 list<dag> pattern>
1811 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB),
1812 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1813
1814 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
1815 class X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1816 list<dag> pattern>
1817 : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isDOT;
1818
1819 // [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less),
1820 // So we use different operand class for VRB
1821 class X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1822 RegisterOperand vbtype, list<dag> pattern>
1823 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB),
1824 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1825
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00001826 // [PO T XO B XO BX /]
1827 class XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1828 list<dag> pattern>
1829 : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB),
1830 !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>;
1831
Kit Barton93612ec2016-02-26 21:11:55 +00001832 // [PO T XO B XO BX TX]
1833 class XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1834 RegisterOperand vtype, list<dag> pattern>
1835 : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB),
1836 !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>;
1837
1838 // [PO T A B XO AX BX TX], src and dest register use different operand class
1839 class XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc,
1840 RegisterOperand xty, RegisterOperand aty, RegisterOperand bty,
1841 InstrItinClass itin, list<dag> pattern>
1842 : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB),
1843 !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>;
1844
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00001845 // [PO VRT VRA VRB XO /]
1846 class X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1847 list<dag> pattern>
1848 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB),
1849 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>;
1850
1851 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
1852 class X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc,
1853 list<dag> pattern>
1854 : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isDOT;
1855
1856 //===--------------------------------------------------------------------===//
1857 // Quad-Precision Scalar Move Instructions:
1858
1859 // Copy Sign
1860 def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp", []>;
1861
1862 // Absolute/Negative-Absolute/Negate
1863 def XSABSQP : X_VT5_XO5_VB5<63, 0, 804, "xsabsqp" , []>;
1864 def XSNABSQP : X_VT5_XO5_VB5<63, 8, 804, "xsnabsqp", []>;
1865 def XSNEGQP : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp" , []>;
1866
1867 //===--------------------------------------------------------------------===//
1868 // Quad-Precision Scalar Floating-Point Arithmetic Instructions:
1869
1870 // Add/Divide/Multiply/Subtract
1871 def XSADDQP : X_VT5_VA5_VB5 <63, 4, "xsaddqp" , []>;
1872 def XSADDQPO : X_VT5_VA5_VB5_Ro<63, 4, "xsaddqpo", []>;
1873 def XSDIVQP : X_VT5_VA5_VB5 <63, 548, "xsdivqp" , []>;
1874 def XSDIVQPO : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo", []>;
1875 def XSMULQP : X_VT5_VA5_VB5 <63, 36, "xsmulqp" , []>;
1876 def XSMULQPO : X_VT5_VA5_VB5_Ro<63, 36, "xsmulqpo", []>;
1877 def XSSUBQP : X_VT5_VA5_VB5 <63, 516, "xssubqp" , []>;
1878 def XSSUBQPO : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo", []>;
1879
1880 // Square-Root
1881 def XSSQRTQP : X_VT5_XO5_VB5 <63, 27, 804, "xssqrtqp" , []>;
1882 def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo", []>;
1883
1884 // (Negative) Multiply-{Add/Subtract}
1885 def XSMADDQP : X_VT5_VA5_VB5 <63, 388, "xsmaddqp" , []>;
1886 def XSMADDQPO : X_VT5_VA5_VB5_Ro<63, 388, "xsmaddqpo" , []>;
1887 def XSMSUBQP : X_VT5_VA5_VB5 <63, 420, "xsmsubqp" , []>;
1888 def XSMSUBQPO : X_VT5_VA5_VB5_Ro<63, 420, "xsmsubqpo" , []>;
1889 def XSNMADDQP : X_VT5_VA5_VB5 <63, 452, "xsnmaddqp" , []>;
1890 def XSNMADDQPO: X_VT5_VA5_VB5_Ro<63, 452, "xsnmaddqpo", []>;
1891 def XSNMSUBQP : X_VT5_VA5_VB5 <63, 484, "xsnmsubqp" , []>;
1892 def XSNMSUBQPO: X_VT5_VA5_VB5_Ro<63, 484, "xsnmsubqpo", []>;
1893
Kit Barton93612ec2016-02-26 21:11:55 +00001894 //===--------------------------------------------------------------------===//
1895 // Quad/Double-Precision Compare Instructions:
1896
1897 // [PO BF // VRA VRB XO /]
1898 class X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1899 list<dag> pattern>
1900 : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB),
1901 !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> {
1902 let Pattern = pattern;
1903 }
1904
1905 // QP Compare Ordered/Unordered
1906 def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>;
1907 def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>;
1908
1909 // DP/QP Compare Exponents
1910 def XSCMPEXPDP : XX3Form_1<60, 59,
1911 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
1912 "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>;
1913 def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>;
1914
1915 // DP Compare ==, >=, >, !=
1916 // Use vsrc for XT, because the entire register of XT is set.
1917 // XT.dword[1] = 0x0000_0000_0000_0000
1918 def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc,
1919 IIC_FPCompare, []>;
1920 def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc,
1921 IIC_FPCompare, []>;
1922 def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc,
1923 IIC_FPCompare, []>;
1924 def XSCMPNEDP : XX3_XT5_XA5_XB5<60, 27, "xscmpnedp", vsrc, vsfrc, vsfrc,
1925 IIC_FPCompare, []>;
1926 // Vector Compare Not Equal
1927 def XVCMPNEDP : XX3Form_Rc<60, 123,
1928 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1929 "xvcmpnedp $XT, $XA, $XB", IIC_VecFPCompare, []>;
1930 let Defs = [CR6] in
1931 def XVCMPNEDPo : XX3Form_Rc<60, 123,
1932 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1933 "xvcmpnedp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1934 isDOT;
1935 def XVCMPNESP : XX3Form_Rc<60, 91,
1936 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1937 "xvcmpnesp $XT, $XA, $XB", IIC_VecFPCompare, []>;
1938 let Defs = [CR6] in
1939 def XVCMPNESPo : XX3Form_Rc<60, 91,
1940 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1941 "xvcmpnesp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1942 isDOT;
1943
1944 //===--------------------------------------------------------------------===//
1945 // Quad-Precision Floating-Point Conversion Instructions:
1946
1947 // Convert DP -> QP
1948 def XSCVDPQP : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vsfrc, []>;
1949
1950 // Round & Convert QP -> DP (dword[1] is set to zero)
1951 def XSCVQPDP : X_VT5_XO5_VB5 <63, 20, 836, "xscvqpdp" , []>;
1952 def XSCVQPDPO : X_VT5_XO5_VB5_Ro<63, 20, 836, "xscvqpdpo", []>;
1953
1954 // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero)
1955 def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>;
1956 def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>;
1957 def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>;
1958 def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>;
1959
1960 // Convert (Un)Signed DWord -> QP
1961 def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vsfrc, []>;
1962 def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vsfrc, []>;
1963
1964 //===--------------------------------------------------------------------===//
1965 // Round to Floating-Point Integer Instructions
1966
1967 // (Round &) Convert DP <-> HP
1968 // Note! xscvdphp's src and dest register both use the left 64 bits, so we use
1969 // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits,
1970 // but we still use vsfrc for it.
1971 def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>;
1972 def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>;
1973
1974 // Vector HP -> SP
1975 def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>;
1976 def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc, []>;
1977
1978 class Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc,
1979 list<dag> pattern>
1980 : Z23Form_1<opcode, xo,
1981 (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc),
1982 !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> {
1983 let RC = ex;
1984 }
1985
1986 // Round to Quad-Precision Integer [with Inexact]
1987 def XSRQPI : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 0, "xsrqpi" , []>;
1988 def XSRQPIX : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 1, "xsrqpix", []>;
1989
1990 // Round Quad-Precision to Double-Extended Precision (fp80)
1991 def XSRQPXP : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>;
Kit Bartonba532dc2016-03-08 03:49:13 +00001992
1993 //===--------------------------------------------------------------------===//
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00001994 // Insert/Extract Instructions
1995
1996 // Insert Exponent DP/QP
1997 // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU
1998 def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
1999 "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>;
2000 // vB NOTE: only vB.dword[0] is used, that's why we don't use
2001 // X_VT5_VA5_VB5 form
2002 def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB),
2003 "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>;
2004
2005 // Extract Exponent/Significand DP/QP
2006 def XSXEXPDP : XX2_RT5_XO5_XB6<60, 0, 347, "xsxexpdp", []>;
2007 def XSXSIGDP : XX2_RT5_XO5_XB6<60, 1, 347, "xsxsigdp", []>;
2008 def XSXEXPQP : X_VT5_XO5_VB5 <63, 2, 804, "xsxexpqp", []>;
2009 def XSXSIGQP : X_VT5_XO5_VB5 <63, 18, 804, "xsxsigqp", []>;
2010
2011 // Vector Insert Word
2012 // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB.
2013 def XXINSERTW : XX2_RD6_UIM5_RS6<60, 181,
2014 (outs vsrc:$XT), (ins u4imm:$UIMM, vsrc:$XB),
2015 "xxinsertw $XT, $XB, $UIMM", IIC_VecFP, []>;
2016
2017 // Vector Extract Unsigned Word
2018 def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165,
2019 (outs vsrc:$XT), (ins u4imm:$UIMM, vsrc:$XB),
2020 "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>;
2021
2022 // Vector Insert Exponent DP/SP
2023 def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc,
2024 IIC_VecFP, []>;
2025 def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc,
2026 IIC_VecFP, []>;
2027
2028 // Vector Extract Exponent/Significand DP/SP
2029 def XVXEXPDP : XX2_XT6_XO5_XB6<60, 0, 475, "xvxexpdp", vsrc, []>;
2030 def XVXEXPSP : XX2_XT6_XO5_XB6<60, 8, 475, "xvxexpsp", vsrc, []>;
2031 def XVXSIGDP : XX2_XT6_XO5_XB6<60, 1, 475, "xvxsigdp", vsrc, []>;
2032 def XVXSIGSP : XX2_XT6_XO5_XB6<60, 9, 475, "xvxsigsp", vsrc, []>;
2033
2034 //===--------------------------------------------------------------------===//
2035
2036 // Test Data Class SP/DP/QP
2037 def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298,
2038 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2039 "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>;
2040 def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362,
2041 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2042 "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>;
2043 def XSTSTDCQP : X_BF3_DCMX7_RS5 <63, 708,
2044 (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB),
2045 "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>;
2046
2047 // Vector Test Data Class SP/DP
2048 def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5,
2049 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2050 "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP, []>;
2051 def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5,
2052 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2053 "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP, []>;
2054
2055 //===--------------------------------------------------------------------===//
2056
2057 // Maximum/Minimum Type-C/Type-J DP
2058 // XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU, so we use vsrc for XT
2059 def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsrc, vsfrc, vsfrc,
2060 IIC_VecFP, []>;
2061 def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc,
2062 IIC_VecFP, []>;
2063 def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsrc, vsfrc, vsfrc,
2064 IIC_VecFP, []>;
2065 def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc,
2066 IIC_VecFP, []>;
2067
2068 //===--------------------------------------------------------------------===//
2069
2070 // Vector Byte-Reverse H/W/D/Q Word
2071 def XXBRH : XX2_XT6_XO5_XB6<60, 7, 475, "xxbrh", vsrc, []>;
2072 def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, []>;
2073 def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, []>;
2074 def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>;
2075
2076 // Vector Permute
2077 def XXPERM : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc,
2078 IIC_VecPerm, []>;
2079 def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc,
2080 IIC_VecPerm, []>;
2081
2082 // Vector Splat Immediate Byte
2083 def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8),
2084 "xxspltib $XT, $IMM8", IIC_VecPerm, []>;
2085
2086 //===--------------------------------------------------------------------===//
Kit Bartonba532dc2016-03-08 03:49:13 +00002087 // Vector/Scalar Load/Store Instructions
2088
2089 let mayLoad = 1 in {
2090 // Load Vector
2091 def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src),
2092 "lxv $XT, $src", IIC_LdStLFD, []>;
2093 // Load DWord
2094 def LXSD : DSForm_1<57, 2, (outs vrrc:$vD), (ins memrix:$src),
2095 "lxsd $vD, $src", IIC_LdStLFD, []>;
2096 // Load SP from src, convert it to DP, and place in dword[0]
2097 def LXSSP : DSForm_1<57, 3, (outs vrrc:$vD), (ins memrix:$src),
2098 "lxssp $vD, $src", IIC_LdStLFD, []>;
2099
2100 // [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different
2101 // "out" and "in" dag
2102 class X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2103 RegisterOperand vtype, list<dag> pattern>
2104 : XX1Form<opcode, xo, (outs vtype:$XT), (ins memrr:$src),
2105 !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>;
2106
2107 // Load as Integer Byte/Halfword & Zero Indexed
2108 def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc, []>;
2109 def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc, []>;
2110
2111 // Load Vector Halfword*8/Byte*16 Indexed
2112 def LXVH8X : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>;
2113 def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>;
2114
2115 // Load Vector Indexed
2116 def LXVX : X_XT6_RA5_RB5<31, 268, "lxvx" , vsrc, []>;
2117
2118 // Load Vector (Left-justified) with Length
2119 def LXVL : X_XT6_RA5_RB5<31, 269, "lxvl" , vsrc, []>;
2120 def LXVLL : X_XT6_RA5_RB5<31, 301, "lxvll" , vsrc, []>;
2121
2122 // Load Vector Word & Splat Indexed
2123 def LXVWSX : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>;
2124 } // end mayLoad
2125
2126 let mayStore = 1 in {
2127 // Store Vector
2128 def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst),
2129 "stxv $XT, $dst", IIC_LdStSTFD, []>;
2130 // Store DWord
2131 def STXSD : DSForm_1<61, 2, (outs), (ins vrrc:$vS, memrix:$dst),
2132 "stxsd $vS, $dst", IIC_LdStSTFD, []>;
2133 // Convert DP of dword[0] to SP, and Store to dst
2134 def STXSSP : DSForm_1<61, 3, (outs), (ins vrrc:$vS, memrix:$dst),
2135 "stxssp $vS, $dst", IIC_LdStSTFD, []>;
2136
2137 // [PO S RA RB XO SX]
2138 class X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2139 RegisterOperand vtype, list<dag> pattern>
2140 : XX1Form<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst),
2141 !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>;
2142
2143 // Store as Integer Byte/Halfword Indexed
2144 def STXSIBX : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsfrc, []>;
2145 def STXSIHX : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsfrc, []>;
2146
2147 // Store Vector Halfword*8/Byte*16 Indexed
2148 def STXVH8X : X_XS6_RA5_RB5<31, 940, "stxvh8x" , vsrc, []>;
2149 def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>;
2150
2151 // Store Vector Indexed
2152 def STXVX : X_XS6_RA5_RB5<31, 396, "stxvx" , vsrc, []>;
2153
2154 // Store Vector (Left-justified) with Length
2155 def STXVL : X_XS6_RA5_RB5<31, 397, "stxvl" , vsrc, []>;
2156 def STXVLL : X_XS6_RA5_RB5<31, 429, "stxvll" , vsrc, []>;
2157 } // end mayStore
Kit Barton93612ec2016-02-26 21:11:55 +00002158} // end HasP9Vector