blob: f461f2bfcf25a8c9eda0681645ac42aca85a8a72 [file] [log] [blame]
Hal Finkel27774d92014-03-13 07:58:58 +00001//===- PPCInstrVSX.td - The PowerPC VSX Extension --*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the VSX extension to the PowerPC instruction set.
11//
12//===----------------------------------------------------------------------===//
13
Bill Schmidtfe723b92015-04-27 19:57:34 +000014// *********************************** NOTE ***********************************
15// ** For POWER8 Little Endian, the VSX swap optimization relies on knowing **
16// ** which VMX and VSX instructions are lane-sensitive and which are not. **
17// ** A lane-sensitive instruction relies, implicitly or explicitly, on **
18// ** whether lanes are numbered from left to right. An instruction like **
19// ** VADDFP is not lane-sensitive, because each lane of the result vector **
20// ** relies only on the corresponding lane of the source vectors. However, **
21// ** an instruction like VMULESB is lane-sensitive, because "even" and **
22// ** "odd" lanes are different for big-endian and little-endian numbering. **
23// ** **
24// ** When adding new VMX and VSX instructions, please consider whether they **
25// ** are lane-sensitive. If so, they must be added to a switch statement **
26// ** in PPCVSXSwapRemoval::gatherVectorInstructions(). **
27// ****************************************************************************
28
Hal Finkel27774d92014-03-13 07:58:58 +000029def PPCRegVSRCAsmOperand : AsmOperandClass {
30 let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
31}
32def vsrc : RegisterOperand<VSRC> {
33 let ParserMatchClass = PPCRegVSRCAsmOperand;
34}
35
Hal Finkel19be5062014-03-29 05:29:01 +000036def PPCRegVSFRCAsmOperand : AsmOperandClass {
37 let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber";
38}
39def vsfrc : RegisterOperand<VSFRC> {
40 let ParserMatchClass = PPCRegVSFRCAsmOperand;
41}
42
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +000043def PPCRegVSSRCAsmOperand : AsmOperandClass {
44 let Name = "RegVSSRC"; let PredicateMethod = "isVSRegNumber";
45}
46def vssrc : RegisterOperand<VSSRC> {
47 let ParserMatchClass = PPCRegVSSRCAsmOperand;
48}
49
Bill Schmidtfae5d712014-12-09 16:35:51 +000050// Little-endian-specific nodes.
51def SDT_PPClxvd2x : SDTypeProfile<1, 1, [
52 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
53]>;
54def SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
55 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
56]>;
57def SDT_PPCxxswapd : SDTypeProfile<1, 1, [
58 SDTCisSameAs<0, 1>
59]>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000060def SDTVecConv : SDTypeProfile<1, 2, [
61 SDTCisVec<0>, SDTCisVec<1>, SDTCisPtrTy<2>
62]>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000063
64def PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
65 [SDNPHasChain, SDNPMayLoad]>;
66def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
67 [SDNPHasChain, SDNPMayStore]>;
68def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +000069def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
70def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
71def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000072def PPCsvec2fp : SDNode<"PPCISD::SINT_VEC_TO_FP", SDTVecConv, []>;
73def PPCuvec2fp: SDNode<"PPCISD::UINT_VEC_TO_FP", SDTVecConv, []>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000074
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000075multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase,
76 string asmstr, InstrItinClass itin, Intrinsic Int,
77 ValueType OutTy, ValueType InTy> {
Hal Finkel27774d92014-03-13 07:58:58 +000078 let BaseName = asmbase in {
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000079 def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000080 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000081 [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000082 let Defs = [CR6] in
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000083 def o : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000084 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000085 [(set InTy:$XT,
86 (InTy (PPCvcmp_o InTy:$XA, InTy:$XB, xo)))]>,
87 isDOT;
Hal Finkel27774d92014-03-13 07:58:58 +000088 }
89}
90
Eric Christopher1b8e7632014-05-22 01:07:24 +000091def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +000092def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
93def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
94
Hal Finkel27774d92014-03-13 07:58:58 +000095let Predicates = [HasVSX] in {
96let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Craig Topperc50d64b2014-11-26 00:46:26 +000097let hasSideEffects = 0 in { // VSX instructions don't have side effects.
Hal Finkel27774d92014-03-13 07:58:58 +000098let Uses = [RM] in {
99
100 // Load indexed instructions
Hal Finkel6a778fb2015-03-11 23:28:38 +0000101 let mayLoad = 1 in {
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000102 def LXSDX : XX1Form<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +0000103 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +0000104 "lxsdx $XT, $src", IIC_LdStLFD,
105 [(set f64:$XT, (load xoaddr:$src))]>;
106
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000107 def LXVD2X : XX1Form<31, 844,
Hal Finkel27774d92014-03-13 07:58:58 +0000108 (outs vsrc:$XT), (ins memrr:$src),
109 "lxvd2x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000110 [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000111
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000112 def LXVDSX : XX1Form<31, 332,
Hal Finkel27774d92014-03-13 07:58:58 +0000113 (outs vsrc:$XT), (ins memrr:$src),
114 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000115
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000116 def LXVW4X : XX1Form<31, 780,
Hal Finkel27774d92014-03-13 07:58:58 +0000117 (outs vsrc:$XT), (ins memrr:$src),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000118 "lxvw4x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000119 [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000120 } // mayLoad
Hal Finkel27774d92014-03-13 07:58:58 +0000121
122 // Store indexed instructions
123 let mayStore = 1 in {
124 def STXSDX : XX1Form<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +0000125 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +0000126 "stxsdx $XT, $dst", IIC_LdStSTFD,
127 [(store f64:$XT, xoaddr:$dst)]>;
128
129 def STXVD2X : XX1Form<31, 972,
130 (outs), (ins vsrc:$XT, memrr:$dst),
131 "stxvd2x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000132 [(store v2f64:$XT, xoaddr:$dst)]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000133
134 def STXVW4X : XX1Form<31, 908,
135 (outs), (ins vsrc:$XT, memrr:$dst),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000136 "stxvw4x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000137 [(store v4i32:$XT, xoaddr:$dst)]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000138
139 } // mayStore
Hal Finkel27774d92014-03-13 07:58:58 +0000140
141 // Add/Mul Instructions
142 let isCommutable = 1 in {
143 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +0000144 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000145 "xsadddp $XT, $XA, $XB", IIC_VecFP,
146 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
147 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +0000148 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000149 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
150 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
151
152 def XVADDDP : XX3Form<60, 96,
153 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
154 "xvadddp $XT, $XA, $XB", IIC_VecFP,
155 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
156
157 def XVADDSP : XX3Form<60, 64,
158 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
159 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
160 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
161
162 def XVMULDP : XX3Form<60, 112,
163 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
164 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
165 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
166
167 def XVMULSP : XX3Form<60, 80,
168 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
169 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
170 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
171 }
172
173 // Subtract Instructions
174 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000175 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000176 "xssubdp $XT, $XA, $XB", IIC_VecFP,
177 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
178
179 def XVSUBDP : XX3Form<60, 104,
180 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
181 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
182 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
183 def XVSUBSP : XX3Form<60, 72,
184 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
185 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
186 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
187
188 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000189 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000190 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000191 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000192 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000193 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
194 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000195 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
196 AltVSXFMARel;
197 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000198 def XSMADDMDP : XX3Form<60, 41,
Hal Finkel19be5062014-03-29 05:29:01 +0000199 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000200 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000201 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
202 AltVSXFMARel;
203 }
Hal Finkel27774d92014-03-13 07:58:58 +0000204
Hal Finkel25e04542014-03-25 18:55:11 +0000205 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000206 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000207 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000208 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000209 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
210 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000211 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
212 AltVSXFMARel;
213 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000214 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000215 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000216 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000217 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
218 AltVSXFMARel;
219 }
Hal Finkel27774d92014-03-13 07:58:58 +0000220
Hal Finkel25e04542014-03-25 18:55:11 +0000221 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000222 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000223 def XSNMADDADP : XX3Form<60, 161,
Hal Finkel19be5062014-03-29 05:29:01 +0000224 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000225 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
226 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000227 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
228 AltVSXFMARel;
229 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000230 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000231 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000232 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000233 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
234 AltVSXFMARel;
235 }
Hal Finkel27774d92014-03-13 07:58:58 +0000236
Hal Finkel25e04542014-03-25 18:55:11 +0000237 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000238 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000239 def XSNMSUBADP : XX3Form<60, 177,
Hal Finkel19be5062014-03-29 05:29:01 +0000240 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000241 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
242 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000243 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
244 AltVSXFMARel;
245 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000246 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000247 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000248 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000249 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
250 AltVSXFMARel;
251 }
Hal Finkel27774d92014-03-13 07:58:58 +0000252
Hal Finkel25e04542014-03-25 18:55:11 +0000253 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000254 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000255 def XVMADDADP : XX3Form<60, 97,
256 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
257 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
258 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000259 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
260 AltVSXFMARel;
261 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000262 def XVMADDMDP : XX3Form<60, 105,
263 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
264 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000265 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
266 AltVSXFMARel;
267 }
Hal Finkel27774d92014-03-13 07:58:58 +0000268
Hal Finkel25e04542014-03-25 18:55:11 +0000269 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000270 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000271 def XVMADDASP : XX3Form<60, 65,
272 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
273 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
274 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000275 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
276 AltVSXFMARel;
277 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000278 def XVMADDMSP : XX3Form<60, 73,
279 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
280 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000281 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
282 AltVSXFMARel;
283 }
Hal Finkel27774d92014-03-13 07:58:58 +0000284
Hal Finkel25e04542014-03-25 18:55:11 +0000285 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000286 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000287 def XVMSUBADP : XX3Form<60, 113,
288 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
289 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
290 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000291 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
292 AltVSXFMARel;
293 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000294 def XVMSUBMDP : XX3Form<60, 121,
295 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
296 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000297 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
298 AltVSXFMARel;
299 }
Hal Finkel27774d92014-03-13 07:58:58 +0000300
Hal Finkel25e04542014-03-25 18:55:11 +0000301 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000302 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000303 def XVMSUBASP : XX3Form<60, 81,
304 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
305 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
306 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000307 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
308 AltVSXFMARel;
309 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000310 def XVMSUBMSP : XX3Form<60, 89,
311 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
312 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000313 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
314 AltVSXFMARel;
315 }
Hal Finkel27774d92014-03-13 07:58:58 +0000316
Hal Finkel25e04542014-03-25 18:55:11 +0000317 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000318 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000319 def XVNMADDADP : XX3Form<60, 225,
320 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
321 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
322 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000323 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
324 AltVSXFMARel;
325 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000326 def XVNMADDMDP : XX3Form<60, 233,
327 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
328 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000329 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
330 AltVSXFMARel;
331 }
Hal Finkel27774d92014-03-13 07:58:58 +0000332
Hal Finkel25e04542014-03-25 18:55:11 +0000333 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000334 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000335 def XVNMADDASP : XX3Form<60, 193,
336 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
337 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
338 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000339 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
340 AltVSXFMARel;
341 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000342 def XVNMADDMSP : XX3Form<60, 201,
343 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
344 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000345 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
346 AltVSXFMARel;
347 }
Hal Finkel27774d92014-03-13 07:58:58 +0000348
Hal Finkel25e04542014-03-25 18:55:11 +0000349 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000350 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000351 def XVNMSUBADP : XX3Form<60, 241,
352 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
353 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
354 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000355 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
356 AltVSXFMARel;
357 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000358 def XVNMSUBMDP : XX3Form<60, 249,
359 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
360 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000361 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
362 AltVSXFMARel;
363 }
Hal Finkel27774d92014-03-13 07:58:58 +0000364
Hal Finkel25e04542014-03-25 18:55:11 +0000365 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000366 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000367 def XVNMSUBASP : XX3Form<60, 209,
368 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
369 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
370 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000371 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
372 AltVSXFMARel;
373 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000374 def XVNMSUBMSP : XX3Form<60, 217,
375 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
376 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000377 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
378 AltVSXFMARel;
379 }
Hal Finkel27774d92014-03-13 07:58:58 +0000380
381 // Division Instructions
382 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000383 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000384 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000385 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
386 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000387 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000388 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000389 [(set f64:$XT, (fsqrt f64:$XB))]>;
390
391 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000392 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000393 "xsredp $XT, $XB", IIC_VecFP,
394 [(set f64:$XT, (PPCfre f64:$XB))]>;
395 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000396 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000397 "xsrsqrtedp $XT, $XB", IIC_VecFP,
398 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
399
400 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000401 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000402 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000403 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000404 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000405 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000406
407 def XVDIVDP : XX3Form<60, 120,
408 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000409 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000410 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
411 def XVDIVSP : XX3Form<60, 88,
412 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000413 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000414 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
415
416 def XVSQRTDP : XX2Form<60, 203,
417 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000418 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000419 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
420 def XVSQRTSP : XX2Form<60, 139,
421 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000422 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000423 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
424
425 def XVTDIVDP : XX3Form_1<60, 125,
426 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000427 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000428 def XVTDIVSP : XX3Form_1<60, 93,
429 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000430 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000431
432 def XVTSQRTDP : XX2Form_1<60, 234,
433 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000434 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000435 def XVTSQRTSP : XX2Form_1<60, 170,
436 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000437 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000438
439 def XVREDP : XX2Form<60, 218,
440 (outs vsrc:$XT), (ins vsrc:$XB),
441 "xvredp $XT, $XB", IIC_VecFP,
442 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
443 def XVRESP : XX2Form<60, 154,
444 (outs vsrc:$XT), (ins vsrc:$XB),
445 "xvresp $XT, $XB", IIC_VecFP,
446 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
447
448 def XVRSQRTEDP : XX2Form<60, 202,
449 (outs vsrc:$XT), (ins vsrc:$XB),
450 "xvrsqrtedp $XT, $XB", IIC_VecFP,
451 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
452 def XVRSQRTESP : XX2Form<60, 138,
453 (outs vsrc:$XT), (ins vsrc:$XB),
454 "xvrsqrtesp $XT, $XB", IIC_VecFP,
455 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
456
457 // Compare Instructions
458 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000459 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000460 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000461 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000462 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000463 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000464
465 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000466 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000467 int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000468 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000469 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000470 int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000471 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000472 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000473 int_ppc_vsx_xvcmpgedp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000474 defm XVCMPGESP : XX3Form_Rcr<60, 83,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000475 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000476 int_ppc_vsx_xvcmpgesp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000477 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000478 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000479 int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000480 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000481 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000482 int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000483
484 // Move Instructions
485 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000486 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000487 "xsabsdp $XT, $XB", IIC_VecFP,
488 [(set f64:$XT, (fabs f64:$XB))]>;
489 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000490 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000491 "xsnabsdp $XT, $XB", IIC_VecFP,
492 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
493 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000494 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000495 "xsnegdp $XT, $XB", IIC_VecFP,
496 [(set f64:$XT, (fneg f64:$XB))]>;
497 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000498 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000499 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
500 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
501
502 def XVABSDP : XX2Form<60, 473,
503 (outs vsrc:$XT), (ins vsrc:$XB),
504 "xvabsdp $XT, $XB", IIC_VecFP,
505 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
506
507 def XVABSSP : XX2Form<60, 409,
508 (outs vsrc:$XT), (ins vsrc:$XB),
509 "xvabssp $XT, $XB", IIC_VecFP,
510 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
511
512 def XVCPSGNDP : XX3Form<60, 240,
513 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
514 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
515 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
516 def XVCPSGNSP : XX3Form<60, 208,
517 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
518 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
519 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
520
521 def XVNABSDP : XX2Form<60, 489,
522 (outs vsrc:$XT), (ins vsrc:$XB),
523 "xvnabsdp $XT, $XB", IIC_VecFP,
524 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
525 def XVNABSSP : XX2Form<60, 425,
526 (outs vsrc:$XT), (ins vsrc:$XB),
527 "xvnabssp $XT, $XB", IIC_VecFP,
528 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
529
530 def XVNEGDP : XX2Form<60, 505,
531 (outs vsrc:$XT), (ins vsrc:$XB),
532 "xvnegdp $XT, $XB", IIC_VecFP,
533 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
534 def XVNEGSP : XX2Form<60, 441,
535 (outs vsrc:$XT), (ins vsrc:$XB),
536 "xvnegsp $XT, $XB", IIC_VecFP,
537 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
538
539 // Conversion Instructions
540 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000541 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000542 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
543 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000544 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000545 "xscvdpsxds $XT, $XB", IIC_VecFP,
546 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000547 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000548 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000549 "xscvdpsxws $XT, $XB", IIC_VecFP,
550 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000551 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000552 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000553 "xscvdpuxds $XT, $XB", IIC_VecFP,
554 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000555 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000556 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000557 "xscvdpuxws $XT, $XB", IIC_VecFP,
558 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000559 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000560 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000561 "xscvspdp $XT, $XB", IIC_VecFP, []>;
562 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000563 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000564 "xscvsxddp $XT, $XB", IIC_VecFP,
565 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000566 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000567 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000568 "xscvuxddp $XT, $XB", IIC_VecFP,
569 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000570
571 def XVCVDPSP : XX2Form<60, 393,
572 (outs vsrc:$XT), (ins vsrc:$XB),
573 "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
574 def XVCVDPSXDS : XX2Form<60, 472,
575 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000576 "xvcvdpsxds $XT, $XB", IIC_VecFP,
577 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000578 def XVCVDPSXWS : XX2Form<60, 216,
579 (outs vsrc:$XT), (ins vsrc:$XB),
580 "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
581 def XVCVDPUXDS : XX2Form<60, 456,
582 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000583 "xvcvdpuxds $XT, $XB", IIC_VecFP,
584 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000585 def XVCVDPUXWS : XX2Form<60, 200,
586 (outs vsrc:$XT), (ins vsrc:$XB),
587 "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
588
589 def XVCVSPDP : XX2Form<60, 457,
590 (outs vsrc:$XT), (ins vsrc:$XB),
591 "xvcvspdp $XT, $XB", IIC_VecFP, []>;
592 def XVCVSPSXDS : XX2Form<60, 408,
593 (outs vsrc:$XT), (ins vsrc:$XB),
594 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
595 def XVCVSPSXWS : XX2Form<60, 152,
596 (outs vsrc:$XT), (ins vsrc:$XB),
597 "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
598 def XVCVSPUXDS : XX2Form<60, 392,
599 (outs vsrc:$XT), (ins vsrc:$XB),
600 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
601 def XVCVSPUXWS : XX2Form<60, 136,
602 (outs vsrc:$XT), (ins vsrc:$XB),
603 "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
604 def XVCVSXDDP : XX2Form<60, 504,
605 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000606 "xvcvsxddp $XT, $XB", IIC_VecFP,
607 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000608 def XVCVSXDSP : XX2Form<60, 440,
609 (outs vsrc:$XT), (ins vsrc:$XB),
610 "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
611 def XVCVSXWDP : XX2Form<60, 248,
612 (outs vsrc:$XT), (ins vsrc:$XB),
613 "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
614 def XVCVSXWSP : XX2Form<60, 184,
615 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic44513e52016-07-05 09:22:29 +0000616 "xvcvsxwsp $XT, $XB", IIC_VecFP,
617 [(set v4f32:$XT, (sint_to_fp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000618 def XVCVUXDDP : XX2Form<60, 488,
619 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000620 "xvcvuxddp $XT, $XB", IIC_VecFP,
621 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000622 def XVCVUXDSP : XX2Form<60, 424,
623 (outs vsrc:$XT), (ins vsrc:$XB),
624 "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
625 def XVCVUXWDP : XX2Form<60, 232,
626 (outs vsrc:$XT), (ins vsrc:$XB),
627 "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
628 def XVCVUXWSP : XX2Form<60, 168,
629 (outs vsrc:$XT), (ins vsrc:$XB),
630 "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
631
632 // Rounding Instructions
633 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000634 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000635 "xsrdpi $XT, $XB", IIC_VecFP,
636 [(set f64:$XT, (frnd f64:$XB))]>;
637 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000638 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000639 "xsrdpic $XT, $XB", IIC_VecFP,
640 [(set f64:$XT, (fnearbyint f64:$XB))]>;
641 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000642 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000643 "xsrdpim $XT, $XB", IIC_VecFP,
644 [(set f64:$XT, (ffloor f64:$XB))]>;
645 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000646 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000647 "xsrdpip $XT, $XB", IIC_VecFP,
648 [(set f64:$XT, (fceil f64:$XB))]>;
649 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000650 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000651 "xsrdpiz $XT, $XB", IIC_VecFP,
652 [(set f64:$XT, (ftrunc f64:$XB))]>;
653
654 def XVRDPI : XX2Form<60, 201,
655 (outs vsrc:$XT), (ins vsrc:$XB),
656 "xvrdpi $XT, $XB", IIC_VecFP,
657 [(set v2f64:$XT, (frnd v2f64:$XB))]>;
658 def XVRDPIC : XX2Form<60, 235,
659 (outs vsrc:$XT), (ins vsrc:$XB),
660 "xvrdpic $XT, $XB", IIC_VecFP,
661 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
662 def XVRDPIM : XX2Form<60, 249,
663 (outs vsrc:$XT), (ins vsrc:$XB),
664 "xvrdpim $XT, $XB", IIC_VecFP,
665 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
666 def XVRDPIP : XX2Form<60, 233,
667 (outs vsrc:$XT), (ins vsrc:$XB),
668 "xvrdpip $XT, $XB", IIC_VecFP,
669 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
670 def XVRDPIZ : XX2Form<60, 217,
671 (outs vsrc:$XT), (ins vsrc:$XB),
672 "xvrdpiz $XT, $XB", IIC_VecFP,
673 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
674
675 def XVRSPI : XX2Form<60, 137,
676 (outs vsrc:$XT), (ins vsrc:$XB),
677 "xvrspi $XT, $XB", IIC_VecFP,
678 [(set v4f32:$XT, (frnd v4f32:$XB))]>;
679 def XVRSPIC : XX2Form<60, 171,
680 (outs vsrc:$XT), (ins vsrc:$XB),
681 "xvrspic $XT, $XB", IIC_VecFP,
682 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
683 def XVRSPIM : XX2Form<60, 185,
684 (outs vsrc:$XT), (ins vsrc:$XB),
685 "xvrspim $XT, $XB", IIC_VecFP,
686 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
687 def XVRSPIP : XX2Form<60, 169,
688 (outs vsrc:$XT), (ins vsrc:$XB),
689 "xvrspip $XT, $XB", IIC_VecFP,
690 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
691 def XVRSPIZ : XX2Form<60, 153,
692 (outs vsrc:$XT), (ins vsrc:$XB),
693 "xvrspiz $XT, $XB", IIC_VecFP,
694 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
695
696 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000697 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000698 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000699 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000700 "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
701 [(set vsfrc:$XT,
702 (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000703 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000704 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000705 "xsmindp $XT, $XA, $XB", IIC_VecFP,
706 [(set vsfrc:$XT,
707 (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000708
709 def XVMAXDP : XX3Form<60, 224,
710 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000711 "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
712 [(set vsrc:$XT,
713 (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000714 def XVMINDP : XX3Form<60, 232,
715 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000716 "xvmindp $XT, $XA, $XB", IIC_VecFP,
717 [(set vsrc:$XT,
718 (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000719
720 def XVMAXSP : XX3Form<60, 192,
721 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000722 "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
723 [(set vsrc:$XT,
724 (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000725 def XVMINSP : XX3Form<60, 200,
726 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000727 "xvminsp $XT, $XA, $XB", IIC_VecFP,
728 [(set vsrc:$XT,
729 (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000730 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000731} // Uses = [RM]
732
733 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000734 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000735 def XXLAND : XX3Form<60, 130,
736 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000737 "xxland $XT, $XA, $XB", IIC_VecGeneral,
738 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000739 def XXLANDC : XX3Form<60, 138,
740 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000741 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
742 [(set v4i32:$XT, (and v4i32:$XA,
743 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000744 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000745 def XXLNOR : XX3Form<60, 162,
746 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000747 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
748 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
749 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000750 def XXLOR : XX3Form<60, 146,
751 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000752 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
753 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000754 let isCodeGenOnly = 1 in
755 def XXLORf: XX3Form<60, 146,
756 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
757 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000758 def XXLXOR : XX3Form<60, 154,
759 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000760 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
761 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000762 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000763
764 // Permutation Instructions
765 def XXMRGHW : XX3Form<60, 18,
766 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
767 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
768 def XXMRGLW : XX3Form<60, 50,
769 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
770 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
771
772 def XXPERMDI : XX3Form_2<60, 10,
773 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
774 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
775 def XXSEL : XX4Form<60, 3,
776 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
777 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
778
779 def XXSLDWI : XX3Form_2<60, 2,
780 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
781 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, []>;
782 def XXSPLTW : XX2Form_2<60, 164,
783 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
Nemanja Ivanovic1a2b2f02016-05-04 16:04:02 +0000784 "xxspltw $XT, $XB, $UIM", IIC_VecPerm,
785 [(set v4i32:$XT,
786 (PPCxxsplt v4i32:$XB, imm32SExt16:$UIM))]>;
Craig Topperc50d64b2014-11-26 00:46:26 +0000787} // hasSideEffects
Hal Finkel27774d92014-03-13 07:58:58 +0000788
Bill Schmidt61e65232014-10-22 13:13:40 +0000789// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
790// instruction selection into a branch sequence.
791let usesCustomInserter = 1, // Expanded after instruction selection.
792 PPC970_Single = 1 in {
793
794 def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
795 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
796 "#SELECT_CC_VSRC",
797 []>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000798 def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
799 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
800 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000801 [(set v2f64:$dst,
802 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000803 def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
804 (ins crrc:$cond, f8rc:$T, f8rc:$F,
805 i32imm:$BROPC), "#SELECT_CC_VSFRC",
806 []>;
807 def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
808 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
809 "#SELECT_VSFRC",
810 [(set f64:$dst,
811 (select i1:$cond, f64:$T, f64:$F))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000812 def SELECT_CC_VSSRC: Pseudo<(outs f4rc:$dst),
813 (ins crrc:$cond, f4rc:$T, f4rc:$F,
814 i32imm:$BROPC), "#SELECT_CC_VSSRC",
815 []>;
816 def SELECT_VSSRC: Pseudo<(outs f4rc:$dst),
817 (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
818 "#SELECT_VSSRC",
819 [(set f32:$dst,
820 (select i1:$cond, f32:$T, f32:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000821} // usesCustomInserter
822} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000823
Hal Finkel27774d92014-03-13 07:58:58 +0000824def : InstAlias<"xvmovdp $XT, $XB",
825 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
826def : InstAlias<"xvmovsp $XT, $XB",
827 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
828
829def : InstAlias<"xxspltd $XT, $XB, 0",
830 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
831def : InstAlias<"xxspltd $XT, $XB, 1",
832 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
833def : InstAlias<"xxmrghd $XT, $XA, $XB",
834 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
835def : InstAlias<"xxmrgld $XT, $XA, $XB",
836 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
837def : InstAlias<"xxswapd $XT, $XB",
838 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
839
840let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000841
842let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000843def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000844 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000845
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000846def : Pat<(f64 (extractelt v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000847 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000848def : Pat<(f64 (extractelt v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000849 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000850}
851
852let Predicates = [IsLittleEndian] in {
853def : Pat<(v2f64 (scalar_to_vector f64:$A)),
854 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
855 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
856
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000857def : Pat<(f64 (extractelt v2f64:$S, 0)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000858 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000859def : Pat<(f64 (extractelt v2f64:$S, 1)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000860 (f64 (EXTRACT_SUBREG $S, sub_64))>;
861}
Hal Finkel27774d92014-03-13 07:58:58 +0000862
863// Additional fnmsub patterns: -a*c + b == -(a*c - b)
864def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
865 (XSNMSUBADP $B, $C, $A)>;
866def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
867 (XSNMSUBADP $B, $C, $A)>;
868
869def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
870 (XVNMSUBADP $B, $C, $A)>;
871def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
872 (XVNMSUBADP $B, $C, $A)>;
873
874def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
875 (XVNMSUBASP $B, $C, $A)>;
876def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
877 (XVNMSUBASP $B, $C, $A)>;
878
Hal Finkel9e0baa62014-04-01 19:24:27 +0000879def : Pat<(v2f64 (bitconvert v4f32:$A)),
880 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000881def : Pat<(v2f64 (bitconvert v4i32:$A)),
882 (COPY_TO_REGCLASS $A, VSRC)>;
883def : Pat<(v2f64 (bitconvert v8i16:$A)),
884 (COPY_TO_REGCLASS $A, VSRC)>;
885def : Pat<(v2f64 (bitconvert v16i8:$A)),
886 (COPY_TO_REGCLASS $A, VSRC)>;
887
Hal Finkel9e0baa62014-04-01 19:24:27 +0000888def : Pat<(v4f32 (bitconvert v2f64:$A)),
889 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000890def : Pat<(v4i32 (bitconvert v2f64:$A)),
891 (COPY_TO_REGCLASS $A, VRRC)>;
892def : Pat<(v8i16 (bitconvert v2f64:$A)),
893 (COPY_TO_REGCLASS $A, VRRC)>;
894def : Pat<(v16i8 (bitconvert v2f64:$A)),
895 (COPY_TO_REGCLASS $A, VRRC)>;
896
Hal Finkel9e0baa62014-04-01 19:24:27 +0000897def : Pat<(v2i64 (bitconvert v4f32:$A)),
898 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000899def : Pat<(v2i64 (bitconvert v4i32:$A)),
900 (COPY_TO_REGCLASS $A, VSRC)>;
901def : Pat<(v2i64 (bitconvert v8i16:$A)),
902 (COPY_TO_REGCLASS $A, VSRC)>;
903def : Pat<(v2i64 (bitconvert v16i8:$A)),
904 (COPY_TO_REGCLASS $A, VSRC)>;
905
Hal Finkel9e0baa62014-04-01 19:24:27 +0000906def : Pat<(v4f32 (bitconvert v2i64:$A)),
907 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000908def : Pat<(v4i32 (bitconvert v2i64:$A)),
909 (COPY_TO_REGCLASS $A, VRRC)>;
910def : Pat<(v8i16 (bitconvert v2i64:$A)),
911 (COPY_TO_REGCLASS $A, VRRC)>;
912def : Pat<(v16i8 (bitconvert v2i64:$A)),
913 (COPY_TO_REGCLASS $A, VRRC)>;
914
Hal Finkel9281c9a2014-03-26 18:26:30 +0000915def : Pat<(v2f64 (bitconvert v2i64:$A)),
916 (COPY_TO_REGCLASS $A, VRRC)>;
917def : Pat<(v2i64 (bitconvert v2f64:$A)),
918 (COPY_TO_REGCLASS $A, VRRC)>;
919
Kit Bartond4eb73c2015-05-05 16:10:44 +0000920def : Pat<(v2f64 (bitconvert v1i128:$A)),
921 (COPY_TO_REGCLASS $A, VRRC)>;
922def : Pat<(v1i128 (bitconvert v2f64:$A)),
923 (COPY_TO_REGCLASS $A, VRRC)>;
924
Hal Finkel5c0d1452014-03-30 13:22:59 +0000925// sign extension patterns
926// To extend "in place" from v2i32 to v2i64, we have input data like:
927// | undef | i32 | undef | i32 |
928// but xvcvsxwdp expects the input in big-Endian format:
929// | i32 | undef | i32 | undef |
930// so we need to shift everything to the left by one i32 (word) before
931// the conversion.
932def : Pat<(sext_inreg v2i64:$C, v2i32),
933 (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
934def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
935 (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
936
Nemanja Ivanovic44513e52016-07-05 09:22:29 +0000937def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 0)),
938 (v2f64 (XVCVSXWDP (v2i64 (XXMRGHW $C, $C))))>;
939def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 1)),
940 (v2f64 (XVCVSXWDP (v2i64 (XXMRGLW $C, $C))))>;
941
942def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 0)),
943 (v2f64 (XVCVUXWDP (v2i64 (XXMRGHW $C, $C))))>;
944def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 1)),
945 (v2f64 (XVCVUXWDP (v2i64 (XXMRGLW $C, $C))))>;
946
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000947// Loads.
Bill Schmidt72954782014-11-12 04:19:40 +0000948def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
949def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000950def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000951def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000952
953// Stores.
Hal Finkele3d2b202015-02-01 19:07:41 +0000954def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
955 (STXVD2X $rS, xoaddr:$dst)>;
Bill Schmidt72954782014-11-12 04:19:40 +0000956def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
Hal Finkele3d2b202015-02-01 19:07:41 +0000957def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
958 (STXVW4X $rS, xoaddr:$dst)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000959def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
960
961// Permutes.
962def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
963def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
964def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
965def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000966
Bill Schmidt61e65232014-10-22 13:13:40 +0000967// Selects.
968def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000969 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
970def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000971 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
972def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000973 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
974def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000975 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
976def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
977 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
978def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000979 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
980def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000981 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
982def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000983 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
984def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
Bill Schmidt61e65232014-10-22 13:13:40 +0000985 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
986def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
987 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
988
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000989def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000990 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
991def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000992 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
993def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +0000994 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
995def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000996 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
997def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
998 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
999def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001000 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1001def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001002 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1003def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001004 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1005def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001006 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1007def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
1008 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1009
Bill Schmidt76746922014-11-14 12:10:40 +00001010// Divides.
1011def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
1012 (XVDIVSP $A, $B)>;
1013def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
1014 (XVDIVDP $A, $B)>;
1015
Nemanja Ivanovic984a3612015-07-14 17:25:20 +00001016// Reciprocal estimate
1017def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
1018 (XVRESP $A)>;
1019def : Pat<(int_ppc_vsx_xvredp v2f64:$A),
1020 (XVREDP $A)>;
1021
Nemanja Ivanovicd358b8f2015-07-05 06:03:51 +00001022// Recip. square root estimate
1023def : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
1024 (XVRSQRTESP $A)>;
1025def : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
1026 (XVRSQRTEDP $A)>;
1027
Hal Finkel27774d92014-03-13 07:58:58 +00001028} // AddedComplexity
1029} // HasVSX
1030
Kit Barton298beb52015-02-18 16:21:46 +00001031// The following VSX instructions were introduced in Power ISA 2.07
1032/* FIXME: if the operands are v2i64, these patterns will not match.
1033 we should define new patterns or otherwise match the same patterns
1034 when the elements are larger than i32.
1035*/
1036def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001037def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Kit Barton298beb52015-02-18 16:21:46 +00001038let Predicates = [HasP8Vector] in {
1039let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001040 let isCommutable = 1 in {
1041 def XXLEQV : XX3Form<60, 186,
1042 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1043 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
1044 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
1045 def XXLNAND : XX3Form<60, 178,
1046 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1047 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
1048 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
Kit Barton298beb52015-02-18 16:21:46 +00001049 v4i32:$XB)))]>;
1050 } // isCommutable
Nemanja Ivanovicd9e4b4f2015-07-10 14:25:17 +00001051
Nemanja Ivanovic5655fb32015-07-10 12:38:08 +00001052 def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
1053 (XXLEQV $A, $B)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001054
1055 def XXLORC : XX3Form<60, 170,
1056 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1057 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
1058 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
1059
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001060 // VSX scalar loads introduced in ISA 2.07
1061 let mayLoad = 1 in {
1062 def LXSSPX : XX1Form<31, 524, (outs vssrc:$XT), (ins memrr:$src),
1063 "lxsspx $XT, $src", IIC_LdStLFD,
1064 [(set f32:$XT, (load xoaddr:$src))]>;
1065 def LXSIWAX : XX1Form<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
1066 "lxsiwax $XT, $src", IIC_LdStLFD,
1067 [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
1068 def LXSIWZX : XX1Form<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
1069 "lxsiwzx $XT, $src", IIC_LdStLFD,
1070 [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
1071 } // mayLoad
1072
1073 // VSX scalar stores introduced in ISA 2.07
1074 let mayStore = 1 in {
1075 def STXSSPX : XX1Form<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
1076 "stxsspx $XT, $dst", IIC_LdStSTFD,
1077 [(store f32:$XT, xoaddr:$dst)]>;
1078 def STXSIWX : XX1Form<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
1079 "stxsiwx $XT, $dst", IIC_LdStSTFD,
1080 [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
1081 } // mayStore
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001082
1083 def : Pat<(f64 (extloadf32 xoaddr:$src)),
1084 (COPY_TO_REGCLASS (LXSSPX xoaddr:$src), VSFRC)>;
1085 def : Pat<(f64 (fextend f32:$src)),
1086 (COPY_TO_REGCLASS $src, VSFRC)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00001087
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001088 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001089 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1090 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001091 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1092 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001093 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1094 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001095 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1096 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
1097 (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1098 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001099 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1100 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001101 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1102 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001103 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1104 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001105 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1106 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001107 (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001108
1109 // VSX Elementary Scalar FP arithmetic (SP)
1110 let isCommutable = 1 in {
1111 def XSADDSP : XX3Form<60, 0,
1112 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1113 "xsaddsp $XT, $XA, $XB", IIC_VecFP,
1114 [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
1115 def XSMULSP : XX3Form<60, 16,
1116 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1117 "xsmulsp $XT, $XA, $XB", IIC_VecFP,
1118 [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
1119 } // isCommutable
1120
1121 def XSDIVSP : XX3Form<60, 24,
1122 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1123 "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
1124 [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
1125 def XSRESP : XX2Form<60, 26,
1126 (outs vssrc:$XT), (ins vssrc:$XB),
1127 "xsresp $XT, $XB", IIC_VecFP,
1128 [(set f32:$XT, (PPCfre f32:$XB))]>;
1129 def XSSQRTSP : XX2Form<60, 11,
1130 (outs vssrc:$XT), (ins vssrc:$XB),
1131 "xssqrtsp $XT, $XB", IIC_FPSqrtS,
1132 [(set f32:$XT, (fsqrt f32:$XB))]>;
1133 def XSRSQRTESP : XX2Form<60, 10,
1134 (outs vssrc:$XT), (ins vssrc:$XB),
1135 "xsrsqrtesp $XT, $XB", IIC_VecFP,
1136 [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
1137 def XSSUBSP : XX3Form<60, 8,
1138 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1139 "xssubsp $XT, $XA, $XB", IIC_VecFP,
1140 [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00001141
1142 // FMA Instructions
1143 let BaseName = "XSMADDASP" in {
1144 let isCommutable = 1 in
1145 def XSMADDASP : XX3Form<60, 1,
1146 (outs vssrc:$XT),
1147 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1148 "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
1149 [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
1150 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1151 AltVSXFMARel;
1152 let IsVSXFMAAlt = 1 in
1153 def XSMADDMSP : XX3Form<60, 9,
1154 (outs vssrc:$XT),
1155 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1156 "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1157 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1158 AltVSXFMARel;
1159 }
1160
1161 let BaseName = "XSMSUBASP" in {
1162 let isCommutable = 1 in
1163 def XSMSUBASP : XX3Form<60, 17,
1164 (outs vssrc:$XT),
1165 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1166 "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
1167 [(set f32:$XT, (fma f32:$XA, f32:$XB,
1168 (fneg f32:$XTi)))]>,
1169 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1170 AltVSXFMARel;
1171 let IsVSXFMAAlt = 1 in
1172 def XSMSUBMSP : XX3Form<60, 25,
1173 (outs vssrc:$XT),
1174 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1175 "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1176 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1177 AltVSXFMARel;
1178 }
1179
1180 let BaseName = "XSNMADDASP" in {
1181 let isCommutable = 1 in
1182 def XSNMADDASP : XX3Form<60, 129,
1183 (outs vssrc:$XT),
1184 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1185 "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
1186 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1187 f32:$XTi)))]>,
1188 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1189 AltVSXFMARel;
1190 let IsVSXFMAAlt = 1 in
1191 def XSNMADDMSP : XX3Form<60, 137,
1192 (outs vssrc:$XT),
1193 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1194 "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1195 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1196 AltVSXFMARel;
1197 }
1198
1199 let BaseName = "XSNMSUBASP" in {
1200 let isCommutable = 1 in
1201 def XSNMSUBASP : XX3Form<60, 145,
1202 (outs vssrc:$XT),
1203 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1204 "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
1205 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1206 (fneg f32:$XTi))))]>,
1207 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1208 AltVSXFMARel;
1209 let IsVSXFMAAlt = 1 in
1210 def XSNMSUBMSP : XX3Form<60, 153,
1211 (outs vssrc:$XT),
1212 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1213 "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1214 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1215 AltVSXFMARel;
1216 }
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001217
1218 // Single Precision Conversions (FP <-> INT)
1219 def XSCVSXDSP : XX2Form<60, 312,
1220 (outs vssrc:$XT), (ins vsfrc:$XB),
1221 "xscvsxdsp $XT, $XB", IIC_VecFP,
1222 [(set f32:$XT, (PPCfcfids f64:$XB))]>;
1223 def XSCVUXDSP : XX2Form<60, 296,
1224 (outs vssrc:$XT), (ins vsfrc:$XB),
1225 "xscvuxdsp $XT, $XB", IIC_VecFP,
1226 [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
1227
1228 // Conversions between vector and scalar single precision
1229 def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
1230 "xscvdpspn $XT, $XB", IIC_VecFP, []>;
1231 def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
1232 "xscvspdpn $XT, $XB", IIC_VecFP, []>;
1233
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001234} // AddedComplexity = 400
Kit Barton298beb52015-02-18 16:21:46 +00001235} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001236
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001237let Predicates = [HasDirectMove] in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001238 // VSX direct move instructions
1239 def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
1240 "mfvsrd $rA, $XT", IIC_VecGeneral,
1241 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
1242 Requires<[In64BitMode]>;
1243 def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
1244 "mfvsrwz $rA, $XT", IIC_VecGeneral,
1245 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
1246 def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
1247 "mtvsrd $XT, $rA", IIC_VecGeneral,
1248 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1249 Requires<[In64BitMode]>;
1250 def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1251 "mtvsrwa $XT, $rA", IIC_VecGeneral,
1252 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1253 def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1254 "mtvsrwz $XT, $rA", IIC_VecGeneral,
1255 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001256} // HasDirectMove
1257
1258let Predicates = [IsISA3_0, HasDirectMove] in {
1259 def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),
1260 "mtvsrws $XT, $rA", IIC_VecGeneral,
1261 []>;
1262
1263 def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
1264 "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,
1265 []>, Requires<[In64BitMode]>;
1266
1267 def MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT),
1268 "mfvsrld $rA, $XT", IIC_VecGeneral,
1269 []>, Requires<[In64BitMode]>;
1270
1271} // IsISA3_0, HasDirectMove
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001272
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001273/* Direct moves of various widths from GPR's into VSR's. Each move lines
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001274 the value up into element 0 (both BE and LE). Namely, entities smaller than
1275 a doubleword are shifted left and moved for BE. For LE, they're moved, then
1276 swapped to go into the least significant element of the VSR.
1277*/
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001278def MovesToVSR {
1279 dag BE_BYTE_0 =
1280 (MTVSRD
1281 (RLDICR
1282 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1283 dag BE_HALF_0 =
1284 (MTVSRD
1285 (RLDICR
1286 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1287 dag BE_WORD_0 =
1288 (MTVSRD
1289 (RLDICR
1290 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001291 dag BE_DWORD_0 = (MTVSRD $A);
1292
1293 dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001294 dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1295 LE_MTVSRW, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001296 dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001297 dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1298 BE_DWORD_0, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001299 dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1300}
1301
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001302/* Patterns for extracting elements out of vectors. Integer elements are
1303 extracted using direct move operations. Patterns for extracting elements
1304 whose indices are not available at compile time are also provided with
1305 various _VARIABLE_ patterns.
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001306 The numbering for the DAG's is for LE, but when used on BE, the correct
1307 LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1308*/
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001309def VectorExtractions {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001310 // Doubleword extraction
1311 dag LE_DWORD_0 =
1312 (MFVSRD
1313 (EXTRACT_SUBREG
1314 (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1315 (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1316 dag LE_DWORD_1 = (MFVSRD
1317 (EXTRACT_SUBREG
1318 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1319
1320 // Word extraction
1321 dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 2), sub_64));
1322 dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1323 dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1324 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1325 dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1326
1327 // Halfword extraction
1328 dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1329 dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1330 dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1331 dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1332 dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1333 dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1334 dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1335 dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1336
1337 // Byte extraction
1338 dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1339 dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1340 dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1341 dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1342 dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1343 dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1344 dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1345 dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1346 dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1347 dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1348 dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1349 dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1350 dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1351 dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1352 dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1353 dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1354
1355 /* Variable element number (BE and LE patterns must be specified separately)
1356 This is a rather involved process.
1357
1358 Conceptually, this is how the move is accomplished:
1359 1. Identify which doubleword contains the element
1360 2. Shift in the VMX register so that the correct doubleword is correctly
1361 lined up for the MFVSRD
1362 3. Perform the move so that the element (along with some extra stuff)
1363 is in the GPR
1364 4. Right shift within the GPR so that the element is right-justified
1365
1366 Of course, the index is an element number which has a different meaning
1367 on LE/BE so the patterns have to be specified separately.
1368
1369 Note: The final result will be the element right-justified with high
1370 order bits being arbitrarily defined (namely, whatever was in the
1371 vector register to the left of the value originally).
1372 */
1373
1374 /* LE variable byte
1375 Number 1. above:
1376 - For elements 0-7, we shift left by 8 bytes since they're on the right
1377 - For elements 8-15, we need not shift (shift left by zero bytes)
1378 This is accomplished by inverting the bits of the index and AND-ing
1379 with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1380 */
1381 dag LE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDC8 (LI8 8), $Idx));
1382
1383 // Number 2. above:
1384 // - Now that we set up the shift amount, we shift in the VMX register
1385 dag LE_VBYTE_PERMUTE = (VPERM $S, $S, LE_VBYTE_PERM_VEC);
1386
1387 // Number 3. above:
1388 // - The doubleword containing our element is moved to a GPR
1389 dag LE_MV_VBYTE = (MFVSRD
1390 (EXTRACT_SUBREG
1391 (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1392 sub_64));
1393
1394 /* Number 4. above:
1395 - Truncate the element number to the range 0-7 (8-15 are symmetrical
1396 and out of range values are truncated accordingly)
1397 - Multiply by 8 as we need to shift right by the number of bits, not bytes
1398 - Shift right in the GPR by the calculated value
1399 */
1400 dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1401 sub_32);
1402 dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1403 sub_32);
1404
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001405 /* LE variable halfword
1406 Number 1. above:
1407 - For elements 0-3, we shift left by 8 since they're on the right
1408 - For elements 4-7, we need not shift (shift left by zero bytes)
1409 Similarly to the byte pattern, we invert the bits of the index, but we
1410 AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1411 Of course, the shift is still by 8 bytes, so we must multiply by 2.
1412 */
1413 dag LE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62));
1414
1415 // Number 2. above:
1416 // - Now that we set up the shift amount, we shift in the VMX register
1417 dag LE_VHALF_PERMUTE = (VPERM $S, $S, LE_VHALF_PERM_VEC);
1418
1419 // Number 3. above:
1420 // - The doubleword containing our element is moved to a GPR
1421 dag LE_MV_VHALF = (MFVSRD
1422 (EXTRACT_SUBREG
1423 (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1424 sub_64));
1425
1426 /* Number 4. above:
1427 - Truncate the element number to the range 0-3 (4-7 are symmetrical
1428 and out of range values are truncated accordingly)
1429 - Multiply by 16 as we need to shift right by the number of bits
1430 - Shift right in the GPR by the calculated value
1431 */
1432 dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1433 sub_32);
1434 dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1435 sub_32);
1436
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001437 /* LE variable word
1438 Number 1. above:
1439 - For elements 0-1, we shift left by 8 since they're on the right
1440 - For elements 2-3, we need not shift
1441 */
1442 dag LE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61));
1443
1444 // Number 2. above:
1445 // - Now that we set up the shift amount, we shift in the VMX register
1446 dag LE_VWORD_PERMUTE = (VPERM $S, $S, LE_VWORD_PERM_VEC);
1447
1448 // Number 3. above:
1449 // - The doubleword containing our element is moved to a GPR
1450 dag LE_MV_VWORD = (MFVSRD
1451 (EXTRACT_SUBREG
1452 (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
1453 sub_64));
1454
1455 /* Number 4. above:
1456 - Truncate the element number to the range 0-1 (2-3 are symmetrical
1457 and out of range values are truncated accordingly)
1458 - Multiply by 32 as we need to shift right by the number of bits
1459 - Shift right in the GPR by the calculated value
1460 */
1461 dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
1462 sub_32);
1463 dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
1464 sub_32);
1465
1466 /* LE variable doubleword
1467 Number 1. above:
1468 - For element 0, we shift left by 8 since it's on the right
1469 - For element 1, we need not shift
1470 */
1471 dag LE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60));
1472
1473 // Number 2. above:
1474 // - Now that we set up the shift amount, we shift in the VMX register
1475 dag LE_VDWORD_PERMUTE = (VPERM $S, $S, LE_VDWORD_PERM_VEC);
1476
1477 // Number 3. above:
1478 // - The doubleword containing our element is moved to a GPR
1479 // - Number 4. is not needed for the doubleword as the value is 64-bits
1480 dag LE_VARIABLE_DWORD =
1481 (MFVSRD (EXTRACT_SUBREG
1482 (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
1483 sub_64));
1484
1485 /* LE variable float
1486 - Shift the vector to line up the desired element to BE Word 0
1487 - Convert 32-bit float to a 64-bit single precision float
1488 */
1489 dag LE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR (XOR8 (LI8 3), $Idx), 2, 61));
1490 dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
1491 dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
1492
1493 /* LE variable double
1494 Same as the LE doubleword except there is no move.
1495 */
1496 dag LE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1497 (COPY_TO_REGCLASS $S, VRRC),
1498 LE_VDWORD_PERM_VEC);
1499 dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
1500
1501 /* BE variable byte
1502 The algorithm here is the same as the LE variable byte except:
1503 - The shift in the VMX register is by 0/8 for opposite element numbers so
1504 we simply AND the element number with 0x8
1505 - The order of elements after the move to GPR is reversed, so we invert
1506 the bits of the index prior to truncating to the range 0-7
1507 */
1508 dag BE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDIo8 $Idx, 8));
1509 dag BE_VBYTE_PERMUTE = (VPERM $S, $S, BE_VBYTE_PERM_VEC);
1510 dag BE_MV_VBYTE = (MFVSRD
1511 (EXTRACT_SUBREG
1512 (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1513 sub_64));
1514 dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1515 sub_32);
1516 dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1517 sub_32);
1518
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001519 /* BE variable halfword
1520 The algorithm here is the same as the LE variable halfword except:
1521 - The shift in the VMX register is by 0/8 for opposite element numbers so
1522 we simply AND the element number with 0x4 and multiply by 2
1523 - The order of elements after the move to GPR is reversed, so we invert
1524 the bits of the index prior to truncating to the range 0-3
1525 */
1526 dag BE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 4), 1, 62));
1527 dag BE_VHALF_PERMUTE = (VPERM $S, $S, BE_VHALF_PERM_VEC);
1528 dag BE_MV_VHALF = (MFVSRD
1529 (EXTRACT_SUBREG
1530 (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1531 sub_64));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001532 dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001533 sub_32);
1534 dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1535 sub_32);
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001536
1537 /* BE variable word
1538 The algorithm is the same as the LE variable word except:
1539 - The shift in the VMX register happens for opposite element numbers
1540 - The order of elements after the move to GPR is reversed, so we invert
1541 the bits of the index prior to truncating to the range 0-1
1542 */
1543 dag BE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 2), 2, 61));
1544 dag BE_VWORD_PERMUTE = (VPERM $S, $S, BE_VWORD_PERM_VEC);
1545 dag BE_MV_VWORD = (MFVSRD
1546 (EXTRACT_SUBREG
1547 (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
1548 sub_64));
1549 dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
1550 sub_32);
1551 dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
1552 sub_32);
1553
1554 /* BE variable doubleword
1555 Same as the LE doubleword except we shift in the VMX register for opposite
1556 element indices.
1557 */
1558 dag BE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 1), 3, 60));
1559 dag BE_VDWORD_PERMUTE = (VPERM $S, $S, BE_VDWORD_PERM_VEC);
1560 dag BE_VARIABLE_DWORD =
1561 (MFVSRD (EXTRACT_SUBREG
1562 (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
1563 sub_64));
1564
1565 /* BE variable float
1566 - Shift the vector to line up the desired element to BE Word 0
1567 - Convert 32-bit float to a 64-bit single precision float
1568 */
1569 dag BE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR $Idx, 2, 61));
1570 dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
1571 dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
1572
1573 /* BE variable double
1574 Same as the BE doubleword except there is no move.
1575 */
1576 dag BE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1577 (COPY_TO_REGCLASS $S, VRRC),
1578 BE_VDWORD_PERM_VEC);
1579 dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001580}
1581
1582// v4f32 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001583let Predicates = [IsBigEndian, HasP8Vector] in {
1584 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1585 (v4f32 (XSCVDPSPN $A))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001586 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1587 (f32 (XSCVSPDPN $S))>;
1588 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1589 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1590 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1591 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
1592 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1593 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001594 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1595 (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001596} // IsBigEndian, HasP8Vector
1597
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001598// Variable index vector_extract for v2f64 does not require P8Vector
1599let Predicates = [IsBigEndian, HasVSX] in
1600 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1601 (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
1602
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001603let Predicates = [IsBigEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001604 // v16i8 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001605 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001606 (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001607 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001608 (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001609 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001610 (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001611 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001612 (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
1613 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001614 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001615 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001616 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001617 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001618 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001619 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001620 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001621 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001622 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001623 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001624 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001625 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001626 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001627 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001628 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001629 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001630 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001631 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001632 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001633 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001634 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001635 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001636 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001637 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001638 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001639 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001640 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001641 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001642 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001643 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001644 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001645 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001646 (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001647
1648 // v8i16 scalar <-> vector conversions (BE)
1649 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001650 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001651 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001652 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001653 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001654 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001655 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001656 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001657 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001658 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001659 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001660 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001661 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001662 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001663 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001664 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001665 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001666 (i32 VectorExtractions.BE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001667
1668 // v4i32 scalar <-> vector conversions (BE)
1669 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001670 (i32 VectorExtractions.LE_WORD_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001671 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001672 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001673 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001674 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001675 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001676 (i32 VectorExtractions.LE_WORD_0)>;
1677 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1678 (i32 VectorExtractions.BE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001679
1680 // v2i64 scalar <-> vector conversions (BE)
1681 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001682 (i64 VectorExtractions.LE_DWORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001683 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001684 (i64 VectorExtractions.LE_DWORD_0)>;
1685 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1686 (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001687} // IsBigEndian, HasDirectMove
1688
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001689// v4f32 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001690let Predicates = [IsLittleEndian, HasP8Vector] in {
1691 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1692 (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001693 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1694 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1695 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1696 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
1697 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1698 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1699 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1700 (f32 (XSCVSPDPN $S))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001701 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1702 (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001703} // IsLittleEndian, HasP8Vector
1704
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001705// Variable index vector_extract for v2f64 does not require P8Vector
1706let Predicates = [IsLittleEndian, HasVSX] in
1707 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1708 (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
1709
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001710let Predicates = [IsLittleEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001711 // v16i8 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001712 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001713 (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001714 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001715 (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001716 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001717 (v4i32 MovesToVSR.LE_WORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001718 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001719 (v2i64 MovesToVSR.LE_DWORD_0)>;
1720 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001721 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001722 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001723 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001724 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001725 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001726 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001727 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001728 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001729 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001730 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001731 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001732 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001733 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001734 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001735 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001736 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001737 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001738 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001739 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001740 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001741 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001742 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001743 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001744 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001745 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001746 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001747 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001748 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001749 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001750 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001751 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001752 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001753 (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001754
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001755 // v8i16 scalar <-> vector conversions (LE)
1756 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001757 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001758 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001759 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001760 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001761 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001762 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001763 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001764 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001765 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001766 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001767 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001768 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001769 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001770 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001771 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001772 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001773 (i32 VectorExtractions.LE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001774
1775 // v4i32 scalar <-> vector conversions (LE)
1776 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001777 (i32 VectorExtractions.LE_WORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001778 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001779 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001780 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001781 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001782 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001783 (i32 VectorExtractions.LE_WORD_3)>;
1784 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1785 (i32 VectorExtractions.LE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001786
1787 // v2i64 scalar <-> vector conversions (LE)
1788 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001789 (i64 VectorExtractions.LE_DWORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001790 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001791 (i64 VectorExtractions.LE_DWORD_1)>;
1792 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1793 (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001794} // IsLittleEndian, HasDirectMove
Nemanja Ivanovic89224762015-12-15 14:50:34 +00001795
1796let Predicates = [HasDirectMove, HasVSX] in {
1797// bitconvert f32 -> i32
1798// (convert to 32-bit fp single, shift right 1 word, move to GPR)
1799def : Pat<(i32 (bitconvert f32:$S)),
1800 (i32 (MFVSRWZ (EXTRACT_SUBREG
1801 (XXSLDWI (XSCVDPSPN $S),(XSCVDPSPN $S), 3),
1802 sub_64)))>;
1803// bitconvert i32 -> f32
1804// (move to FPR, shift left 1 word, convert to 64-bit fp single)
1805def : Pat<(f32 (bitconvert i32:$A)),
1806 (f32 (XSCVSPDPN
1807 (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
1808
1809// bitconvert f64 -> i64
1810// (move to GPR, nothing else needed)
1811def : Pat<(i64 (bitconvert f64:$S)),
1812 (i64 (MFVSRD $S))>;
1813
1814// bitconvert i64 -> f64
1815// (move to FPR, nothing else needed)
1816def : Pat<(f64 (bitconvert i64:$S)),
1817 (f64 (MTVSRD $S))>;
1818}
Kit Barton93612ec2016-02-26 21:11:55 +00001819
1820// The following VSX instructions were introduced in Power ISA 3.0
1821def HasP9Vector : Predicate<"PPCSubTarget->hasP9Vector()">;
1822let Predicates = [HasP9Vector] in {
1823
1824 // [PO VRT XO VRB XO /]
1825 class X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1826 list<dag> pattern>
1827 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB),
1828 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1829
1830 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
1831 class X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1832 list<dag> pattern>
1833 : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isDOT;
1834
1835 // [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less),
1836 // So we use different operand class for VRB
1837 class X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1838 RegisterOperand vbtype, list<dag> pattern>
1839 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB),
1840 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1841
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00001842 // [PO T XO B XO BX /]
1843 class XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1844 list<dag> pattern>
1845 : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB),
1846 !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>;
1847
Kit Barton93612ec2016-02-26 21:11:55 +00001848 // [PO T XO B XO BX TX]
1849 class XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1850 RegisterOperand vtype, list<dag> pattern>
1851 : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB),
1852 !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>;
1853
1854 // [PO T A B XO AX BX TX], src and dest register use different operand class
1855 class XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc,
1856 RegisterOperand xty, RegisterOperand aty, RegisterOperand bty,
1857 InstrItinClass itin, list<dag> pattern>
1858 : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB),
1859 !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>;
1860
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00001861 // [PO VRT VRA VRB XO /]
1862 class X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1863 list<dag> pattern>
1864 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB),
1865 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>;
1866
1867 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
1868 class X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc,
1869 list<dag> pattern>
1870 : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isDOT;
1871
1872 //===--------------------------------------------------------------------===//
1873 // Quad-Precision Scalar Move Instructions:
1874
1875 // Copy Sign
1876 def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp", []>;
1877
1878 // Absolute/Negative-Absolute/Negate
1879 def XSABSQP : X_VT5_XO5_VB5<63, 0, 804, "xsabsqp" , []>;
1880 def XSNABSQP : X_VT5_XO5_VB5<63, 8, 804, "xsnabsqp", []>;
1881 def XSNEGQP : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp" , []>;
1882
1883 //===--------------------------------------------------------------------===//
1884 // Quad-Precision Scalar Floating-Point Arithmetic Instructions:
1885
1886 // Add/Divide/Multiply/Subtract
1887 def XSADDQP : X_VT5_VA5_VB5 <63, 4, "xsaddqp" , []>;
1888 def XSADDQPO : X_VT5_VA5_VB5_Ro<63, 4, "xsaddqpo", []>;
1889 def XSDIVQP : X_VT5_VA5_VB5 <63, 548, "xsdivqp" , []>;
1890 def XSDIVQPO : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo", []>;
1891 def XSMULQP : X_VT5_VA5_VB5 <63, 36, "xsmulqp" , []>;
1892 def XSMULQPO : X_VT5_VA5_VB5_Ro<63, 36, "xsmulqpo", []>;
1893 def XSSUBQP : X_VT5_VA5_VB5 <63, 516, "xssubqp" , []>;
1894 def XSSUBQPO : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo", []>;
1895
1896 // Square-Root
1897 def XSSQRTQP : X_VT5_XO5_VB5 <63, 27, 804, "xssqrtqp" , []>;
1898 def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo", []>;
1899
1900 // (Negative) Multiply-{Add/Subtract}
1901 def XSMADDQP : X_VT5_VA5_VB5 <63, 388, "xsmaddqp" , []>;
1902 def XSMADDQPO : X_VT5_VA5_VB5_Ro<63, 388, "xsmaddqpo" , []>;
1903 def XSMSUBQP : X_VT5_VA5_VB5 <63, 420, "xsmsubqp" , []>;
1904 def XSMSUBQPO : X_VT5_VA5_VB5_Ro<63, 420, "xsmsubqpo" , []>;
1905 def XSNMADDQP : X_VT5_VA5_VB5 <63, 452, "xsnmaddqp" , []>;
1906 def XSNMADDQPO: X_VT5_VA5_VB5_Ro<63, 452, "xsnmaddqpo", []>;
1907 def XSNMSUBQP : X_VT5_VA5_VB5 <63, 484, "xsnmsubqp" , []>;
1908 def XSNMSUBQPO: X_VT5_VA5_VB5_Ro<63, 484, "xsnmsubqpo", []>;
1909
Kit Barton93612ec2016-02-26 21:11:55 +00001910 //===--------------------------------------------------------------------===//
1911 // Quad/Double-Precision Compare Instructions:
1912
1913 // [PO BF // VRA VRB XO /]
1914 class X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1915 list<dag> pattern>
1916 : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB),
1917 !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> {
1918 let Pattern = pattern;
1919 }
1920
1921 // QP Compare Ordered/Unordered
1922 def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>;
1923 def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>;
1924
1925 // DP/QP Compare Exponents
1926 def XSCMPEXPDP : XX3Form_1<60, 59,
1927 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
1928 "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>;
1929 def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>;
1930
1931 // DP Compare ==, >=, >, !=
1932 // Use vsrc for XT, because the entire register of XT is set.
1933 // XT.dword[1] = 0x0000_0000_0000_0000
1934 def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc,
1935 IIC_FPCompare, []>;
1936 def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc,
1937 IIC_FPCompare, []>;
1938 def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc,
1939 IIC_FPCompare, []>;
1940 def XSCMPNEDP : XX3_XT5_XA5_XB5<60, 27, "xscmpnedp", vsrc, vsfrc, vsfrc,
1941 IIC_FPCompare, []>;
1942 // Vector Compare Not Equal
1943 def XVCMPNEDP : XX3Form_Rc<60, 123,
1944 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1945 "xvcmpnedp $XT, $XA, $XB", IIC_VecFPCompare, []>;
1946 let Defs = [CR6] in
1947 def XVCMPNEDPo : XX3Form_Rc<60, 123,
1948 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1949 "xvcmpnedp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1950 isDOT;
1951 def XVCMPNESP : XX3Form_Rc<60, 91,
1952 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1953 "xvcmpnesp $XT, $XA, $XB", IIC_VecFPCompare, []>;
1954 let Defs = [CR6] in
1955 def XVCMPNESPo : XX3Form_Rc<60, 91,
1956 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1957 "xvcmpnesp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1958 isDOT;
1959
1960 //===--------------------------------------------------------------------===//
1961 // Quad-Precision Floating-Point Conversion Instructions:
1962
1963 // Convert DP -> QP
1964 def XSCVDPQP : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vsfrc, []>;
1965
1966 // Round & Convert QP -> DP (dword[1] is set to zero)
1967 def XSCVQPDP : X_VT5_XO5_VB5 <63, 20, 836, "xscvqpdp" , []>;
1968 def XSCVQPDPO : X_VT5_XO5_VB5_Ro<63, 20, 836, "xscvqpdpo", []>;
1969
1970 // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero)
1971 def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>;
1972 def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>;
1973 def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>;
1974 def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>;
1975
1976 // Convert (Un)Signed DWord -> QP
1977 def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vsfrc, []>;
1978 def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vsfrc, []>;
1979
1980 //===--------------------------------------------------------------------===//
1981 // Round to Floating-Point Integer Instructions
1982
1983 // (Round &) Convert DP <-> HP
1984 // Note! xscvdphp's src and dest register both use the left 64 bits, so we use
1985 // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits,
1986 // but we still use vsfrc for it.
1987 def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>;
1988 def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>;
1989
1990 // Vector HP -> SP
1991 def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>;
1992 def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc, []>;
1993
1994 class Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc,
1995 list<dag> pattern>
1996 : Z23Form_1<opcode, xo,
1997 (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc),
1998 !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> {
1999 let RC = ex;
2000 }
2001
2002 // Round to Quad-Precision Integer [with Inexact]
2003 def XSRQPI : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 0, "xsrqpi" , []>;
2004 def XSRQPIX : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 1, "xsrqpix", []>;
2005
2006 // Round Quad-Precision to Double-Extended Precision (fp80)
2007 def XSRQPXP : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002008
2009 //===--------------------------------------------------------------------===//
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002010 // Insert/Extract Instructions
2011
2012 // Insert Exponent DP/QP
2013 // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU
2014 def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
2015 "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>;
2016 // vB NOTE: only vB.dword[0] is used, that's why we don't use
2017 // X_VT5_VA5_VB5 form
2018 def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB),
2019 "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>;
2020
2021 // Extract Exponent/Significand DP/QP
2022 def XSXEXPDP : XX2_RT5_XO5_XB6<60, 0, 347, "xsxexpdp", []>;
2023 def XSXSIGDP : XX2_RT5_XO5_XB6<60, 1, 347, "xsxsigdp", []>;
2024 def XSXEXPQP : X_VT5_XO5_VB5 <63, 2, 804, "xsxexpqp", []>;
2025 def XSXSIGQP : X_VT5_XO5_VB5 <63, 18, 804, "xsxsigqp", []>;
2026
2027 // Vector Insert Word
2028 // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB.
2029 def XXINSERTW : XX2_RD6_UIM5_RS6<60, 181,
2030 (outs vsrc:$XT), (ins u4imm:$UIMM, vsrc:$XB),
2031 "xxinsertw $XT, $XB, $UIMM", IIC_VecFP, []>;
2032
2033 // Vector Extract Unsigned Word
2034 def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165,
2035 (outs vsrc:$XT), (ins u4imm:$UIMM, vsrc:$XB),
2036 "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>;
2037
2038 // Vector Insert Exponent DP/SP
2039 def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc,
2040 IIC_VecFP, []>;
2041 def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc,
2042 IIC_VecFP, []>;
2043
2044 // Vector Extract Exponent/Significand DP/SP
2045 def XVXEXPDP : XX2_XT6_XO5_XB6<60, 0, 475, "xvxexpdp", vsrc, []>;
2046 def XVXEXPSP : XX2_XT6_XO5_XB6<60, 8, 475, "xvxexpsp", vsrc, []>;
2047 def XVXSIGDP : XX2_XT6_XO5_XB6<60, 1, 475, "xvxsigdp", vsrc, []>;
2048 def XVXSIGSP : XX2_XT6_XO5_XB6<60, 9, 475, "xvxsigsp", vsrc, []>;
2049
2050 //===--------------------------------------------------------------------===//
2051
2052 // Test Data Class SP/DP/QP
2053 def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298,
2054 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2055 "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>;
2056 def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362,
2057 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2058 "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>;
2059 def XSTSTDCQP : X_BF3_DCMX7_RS5 <63, 708,
2060 (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB),
2061 "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>;
2062
2063 // Vector Test Data Class SP/DP
2064 def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5,
2065 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2066 "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP, []>;
2067 def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5,
2068 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2069 "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP, []>;
2070
2071 //===--------------------------------------------------------------------===//
2072
2073 // Maximum/Minimum Type-C/Type-J DP
2074 // XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU, so we use vsrc for XT
2075 def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsrc, vsfrc, vsfrc,
2076 IIC_VecFP, []>;
2077 def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc,
2078 IIC_VecFP, []>;
2079 def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsrc, vsfrc, vsfrc,
2080 IIC_VecFP, []>;
2081 def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc,
2082 IIC_VecFP, []>;
2083
2084 //===--------------------------------------------------------------------===//
2085
2086 // Vector Byte-Reverse H/W/D/Q Word
2087 def XXBRH : XX2_XT6_XO5_XB6<60, 7, 475, "xxbrh", vsrc, []>;
2088 def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, []>;
2089 def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, []>;
2090 def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>;
2091
2092 // Vector Permute
2093 def XXPERM : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc,
2094 IIC_VecPerm, []>;
2095 def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc,
2096 IIC_VecPerm, []>;
2097
2098 // Vector Splat Immediate Byte
2099 def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8),
2100 "xxspltib $XT, $IMM8", IIC_VecPerm, []>;
2101
2102 //===--------------------------------------------------------------------===//
Kit Bartonba532dc2016-03-08 03:49:13 +00002103 // Vector/Scalar Load/Store Instructions
2104
2105 let mayLoad = 1 in {
2106 // Load Vector
2107 def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src),
2108 "lxv $XT, $src", IIC_LdStLFD, []>;
2109 // Load DWord
2110 def LXSD : DSForm_1<57, 2, (outs vrrc:$vD), (ins memrix:$src),
2111 "lxsd $vD, $src", IIC_LdStLFD, []>;
2112 // Load SP from src, convert it to DP, and place in dword[0]
2113 def LXSSP : DSForm_1<57, 3, (outs vrrc:$vD), (ins memrix:$src),
2114 "lxssp $vD, $src", IIC_LdStLFD, []>;
2115
2116 // [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different
2117 // "out" and "in" dag
2118 class X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2119 RegisterOperand vtype, list<dag> pattern>
2120 : XX1Form<opcode, xo, (outs vtype:$XT), (ins memrr:$src),
2121 !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>;
2122
2123 // Load as Integer Byte/Halfword & Zero Indexed
2124 def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc, []>;
2125 def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc, []>;
2126
2127 // Load Vector Halfword*8/Byte*16 Indexed
2128 def LXVH8X : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>;
2129 def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>;
2130
2131 // Load Vector Indexed
2132 def LXVX : X_XT6_RA5_RB5<31, 268, "lxvx" , vsrc, []>;
2133
2134 // Load Vector (Left-justified) with Length
2135 def LXVL : X_XT6_RA5_RB5<31, 269, "lxvl" , vsrc, []>;
2136 def LXVLL : X_XT6_RA5_RB5<31, 301, "lxvll" , vsrc, []>;
2137
2138 // Load Vector Word & Splat Indexed
2139 def LXVWSX : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>;
2140 } // end mayLoad
2141
2142 let mayStore = 1 in {
2143 // Store Vector
2144 def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst),
2145 "stxv $XT, $dst", IIC_LdStSTFD, []>;
2146 // Store DWord
2147 def STXSD : DSForm_1<61, 2, (outs), (ins vrrc:$vS, memrix:$dst),
2148 "stxsd $vS, $dst", IIC_LdStSTFD, []>;
2149 // Convert DP of dword[0] to SP, and Store to dst
2150 def STXSSP : DSForm_1<61, 3, (outs), (ins vrrc:$vS, memrix:$dst),
2151 "stxssp $vS, $dst", IIC_LdStSTFD, []>;
2152
2153 // [PO S RA RB XO SX]
2154 class X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2155 RegisterOperand vtype, list<dag> pattern>
2156 : XX1Form<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst),
2157 !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>;
2158
2159 // Store as Integer Byte/Halfword Indexed
2160 def STXSIBX : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsfrc, []>;
2161 def STXSIHX : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsfrc, []>;
2162
2163 // Store Vector Halfword*8/Byte*16 Indexed
2164 def STXVH8X : X_XS6_RA5_RB5<31, 940, "stxvh8x" , vsrc, []>;
2165 def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>;
2166
2167 // Store Vector Indexed
2168 def STXVX : X_XS6_RA5_RB5<31, 396, "stxvx" , vsrc, []>;
2169
2170 // Store Vector (Left-justified) with Length
2171 def STXVL : X_XS6_RA5_RB5<31, 397, "stxvl" , vsrc, []>;
2172 def STXVLL : X_XS6_RA5_RB5<31, 429, "stxvll" , vsrc, []>;
2173 } // end mayStore
Kit Barton93612ec2016-02-26 21:11:55 +00002174} // end HasP9Vector