1//===- 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
14def PPCRegVSRCAsmOperand : AsmOperandClass {
15  let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
16}
17def vsrc : RegisterOperand<VSRC> {
18  let ParserMatchClass = PPCRegVSRCAsmOperand;
19}
20
21def PPCRegVSFRCAsmOperand : AsmOperandClass {
22  let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber";
23}
24def vsfrc : RegisterOperand<VSFRC> {
25  let ParserMatchClass = PPCRegVSFRCAsmOperand;
26}
27
28// Little-endian-specific nodes.
29def SDT_PPClxvd2x : SDTypeProfile<1, 1, [
30  SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
31]>;
32def SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
33  SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
34]>;
35def SDT_PPCxxswapd : SDTypeProfile<1, 1, [
36  SDTCisSameAs<0, 1>
37]>;
38
39def PPClxvd2x  : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
40                        [SDNPHasChain, SDNPMayLoad]>;
41def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
42                        [SDNPHasChain, SDNPMayStore]>;
43def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
44
45multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, dag OOL, dag IOL,
46                    string asmbase, string asmstr, InstrItinClass itin,
47                    list<dag> pattern> {
48  let BaseName = asmbase in {
49    def NAME : XX3Form_Rc<opcode, xo, OOL, IOL,
50                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
51                       pattern>;
52    let Defs = [CR6] in
53    def o    : XX3Form_Rc<opcode, xo, OOL, IOL,
54                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
55                       []>, isDOT;
56  }
57}
58
59def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
60def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
61def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
62
63let Predicates = [HasVSX] in {
64let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
65let hasSideEffects = 0 in { // VSX instructions don't have side effects.
66let Uses = [RM] in {
67
68  // Load indexed instructions
69  let mayLoad = 1, canFoldAsLoad = 1 in {
70    def LXSDX : XX1Form<31, 588,
71                        (outs vsfrc:$XT), (ins memrr:$src),
72                        "lxsdx $XT, $src", IIC_LdStLFD,
73                        [(set f64:$XT, (load xoaddr:$src))]>;
74
75    def LXVD2X : XX1Form<31, 844,
76                         (outs vsrc:$XT), (ins memrr:$src),
77                         "lxvd2x $XT, $src", IIC_LdStLFD,
78                         [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
79
80    def LXVDSX : XX1Form<31, 332,
81                         (outs vsrc:$XT), (ins memrr:$src),
82                         "lxvdsx $XT, $src", IIC_LdStLFD, []>;
83
84    def LXVW4X : XX1Form<31, 780,
85                         (outs vsrc:$XT), (ins memrr:$src),
86                         "lxvw4x $XT, $src", IIC_LdStLFD,
87                         [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
88  }
89
90  // Store indexed instructions
91  let mayStore = 1 in {
92    def STXSDX : XX1Form<31, 716,
93                        (outs), (ins vsfrc:$XT, memrr:$dst),
94                        "stxsdx $XT, $dst", IIC_LdStSTFD,
95                        [(store f64:$XT, xoaddr:$dst)]>;
96
97    def STXVD2X : XX1Form<31, 972,
98                         (outs), (ins vsrc:$XT, memrr:$dst),
99                         "stxvd2x $XT, $dst", IIC_LdStSTFD,
100                         [(int_ppc_vsx_stxvd2x v2f64:$XT, xoaddr:$dst)]>;
101
102    def STXVW4X : XX1Form<31, 908,
103                         (outs), (ins vsrc:$XT, memrr:$dst),
104                         "stxvw4x $XT, $dst", IIC_LdStSTFD,
105                         [(int_ppc_vsx_stxvw4x v4i32:$XT, xoaddr:$dst)]>;
106  }
107
108  // Add/Mul Instructions
109  let isCommutable = 1 in {
110    def XSADDDP : XX3Form<60, 32,
111                          (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
112                          "xsadddp $XT, $XA, $XB", IIC_VecFP,
113                          [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
114    def XSMULDP : XX3Form<60, 48,
115                          (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
116                          "xsmuldp $XT, $XA, $XB", IIC_VecFP,
117                          [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
118
119    def XVADDDP : XX3Form<60, 96,
120                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
121                          "xvadddp $XT, $XA, $XB", IIC_VecFP,
122                          [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
123
124    def XVADDSP : XX3Form<60, 64,
125                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
126                          "xvaddsp $XT, $XA, $XB", IIC_VecFP,
127                          [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
128
129    def XVMULDP : XX3Form<60, 112,
130                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
131                          "xvmuldp $XT, $XA, $XB", IIC_VecFP,
132                          [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
133
134    def XVMULSP : XX3Form<60, 80,
135                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
136                          "xvmulsp $XT, $XA, $XB", IIC_VecFP,
137                          [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
138  }
139
140  // Subtract Instructions
141  def XSSUBDP : XX3Form<60, 40,
142                        (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
143                        "xssubdp $XT, $XA, $XB", IIC_VecFP,
144                        [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
145
146  def XVSUBDP : XX3Form<60, 104,
147                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
148                        "xvsubdp $XT, $XA, $XB", IIC_VecFP,
149                        [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
150  def XVSUBSP : XX3Form<60, 72,
151                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
152                        "xvsubsp $XT, $XA, $XB", IIC_VecFP,
153                        [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
154
155  // FMA Instructions
156  let BaseName = "XSMADDADP" in {
157  let isCommutable = 1 in
158  def XSMADDADP : XX3Form<60, 33,
159                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
160                          "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
161                          [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
162                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
163                          AltVSXFMARel;
164  let IsVSXFMAAlt = 1 in
165  def XSMADDMDP : XX3Form<60, 41,
166                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
167                          "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
168                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
169                          AltVSXFMARel;
170  }
171
172  let BaseName = "XSMSUBADP" in {
173  let isCommutable = 1 in
174  def XSMSUBADP : XX3Form<60, 49,
175                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
176                          "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
177                          [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
178                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
179                          AltVSXFMARel;
180  let IsVSXFMAAlt = 1 in
181  def XSMSUBMDP : XX3Form<60, 57,
182                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
183                          "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
184                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
185                          AltVSXFMARel;
186  }
187
188  let BaseName = "XSNMADDADP" in {
189  let isCommutable = 1 in
190  def XSNMADDADP : XX3Form<60, 161,
191                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
192                          "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
193                          [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
194                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
195                          AltVSXFMARel;
196  let IsVSXFMAAlt = 1 in
197  def XSNMADDMDP : XX3Form<60, 169,
198                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
199                          "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
200                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
201                          AltVSXFMARel;
202  }
203
204  let BaseName = "XSNMSUBADP" in {
205  let isCommutable = 1 in
206  def XSNMSUBADP : XX3Form<60, 177,
207                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
208                          "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
209                          [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
210                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
211                          AltVSXFMARel;
212  let IsVSXFMAAlt = 1 in
213  def XSNMSUBMDP : XX3Form<60, 185,
214                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
215                          "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
216                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
217                          AltVSXFMARel;
218  }
219
220  let BaseName = "XVMADDADP" in {
221  let isCommutable = 1 in
222  def XVMADDADP : XX3Form<60, 97,
223                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
224                          "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
225                          [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
226                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
227                          AltVSXFMARel;
228  let IsVSXFMAAlt = 1 in
229  def XVMADDMDP : XX3Form<60, 105,
230                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
231                          "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
232                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
233                          AltVSXFMARel;
234  }
235
236  let BaseName = "XVMADDASP" in {
237  let isCommutable = 1 in
238  def XVMADDASP : XX3Form<60, 65,
239                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
240                          "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
241                          [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
242                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
243                          AltVSXFMARel;
244  let IsVSXFMAAlt = 1 in
245  def XVMADDMSP : XX3Form<60, 73,
246                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
247                          "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
248                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
249                          AltVSXFMARel;
250  }
251
252  let BaseName = "XVMSUBADP" in {
253  let isCommutable = 1 in
254  def XVMSUBADP : XX3Form<60, 113,
255                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
256                          "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
257                          [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
258                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
259                          AltVSXFMARel;
260  let IsVSXFMAAlt = 1 in
261  def XVMSUBMDP : XX3Form<60, 121,
262                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
263                          "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
264                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
265                          AltVSXFMARel;
266  }
267
268  let BaseName = "XVMSUBASP" in {
269  let isCommutable = 1 in
270  def XVMSUBASP : XX3Form<60, 81,
271                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
272                          "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
273                          [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
274                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
275                          AltVSXFMARel;
276  let IsVSXFMAAlt = 1 in
277  def XVMSUBMSP : XX3Form<60, 89,
278                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
279                          "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
280                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
281                          AltVSXFMARel;
282  }
283
284  let BaseName = "XVNMADDADP" in {
285  let isCommutable = 1 in
286  def XVNMADDADP : XX3Form<60, 225,
287                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
288                          "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
289                          [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
290                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
291                          AltVSXFMARel;
292  let IsVSXFMAAlt = 1 in
293  def XVNMADDMDP : XX3Form<60, 233,
294                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
295                          "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
296                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
297                          AltVSXFMARel;
298  }
299
300  let BaseName = "XVNMADDASP" in {
301  let isCommutable = 1 in
302  def XVNMADDASP : XX3Form<60, 193,
303                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
304                          "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
305                          [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
306                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
307                          AltVSXFMARel;
308  let IsVSXFMAAlt = 1 in
309  def XVNMADDMSP : XX3Form<60, 201,
310                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
311                          "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
312                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
313                          AltVSXFMARel;
314  }
315
316  let BaseName = "XVNMSUBADP" in {
317  let isCommutable = 1 in
318  def XVNMSUBADP : XX3Form<60, 241,
319                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
320                          "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
321                          [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
322                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
323                          AltVSXFMARel;
324  let IsVSXFMAAlt = 1 in
325  def XVNMSUBMDP : XX3Form<60, 249,
326                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
327                          "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
328                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
329                          AltVSXFMARel;
330  }
331
332  let BaseName = "XVNMSUBASP" in {
333  let isCommutable = 1 in
334  def XVNMSUBASP : XX3Form<60, 209,
335                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
336                          "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
337                          [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
338                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
339                          AltVSXFMARel;
340  let IsVSXFMAAlt = 1 in
341  def XVNMSUBMSP : XX3Form<60, 217,
342                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
343                          "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
344                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
345                          AltVSXFMARel;
346  }
347
348  // Division Instructions
349  def XSDIVDP : XX3Form<60, 56,
350                        (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
351                        "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
352                        [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
353  def XSSQRTDP : XX2Form<60, 75,
354                        (outs vsfrc:$XT), (ins vsfrc:$XB),
355                        "xssqrtdp $XT, $XB", IIC_FPSqrtD,
356                        [(set f64:$XT, (fsqrt f64:$XB))]>;
357
358  def XSREDP : XX2Form<60, 90,
359                        (outs vsfrc:$XT), (ins vsfrc:$XB),
360                        "xsredp $XT, $XB", IIC_VecFP,
361                        [(set f64:$XT, (PPCfre f64:$XB))]>;
362  def XSRSQRTEDP : XX2Form<60, 74,
363                           (outs vsfrc:$XT), (ins vsfrc:$XB),
364                           "xsrsqrtedp $XT, $XB", IIC_VecFP,
365                           [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
366
367  def XSTDIVDP : XX3Form_1<60, 61,
368                         (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
369                         "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
370  def XSTSQRTDP : XX2Form_1<60, 106,
371                          (outs crrc:$crD), (ins vsfrc:$XB),
372                          "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
373
374  def XVDIVDP : XX3Form<60, 120,
375                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
376                        "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
377                        [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
378  def XVDIVSP : XX3Form<60, 88,
379                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
380                        "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
381                        [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
382
383  def XVSQRTDP : XX2Form<60, 203,
384                        (outs vsrc:$XT), (ins vsrc:$XB),
385                        "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
386                        [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
387  def XVSQRTSP : XX2Form<60, 139,
388                        (outs vsrc:$XT), (ins vsrc:$XB),
389                        "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
390                        [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
391
392  def XVTDIVDP : XX3Form_1<60, 125,
393                         (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
394                         "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
395  def XVTDIVSP : XX3Form_1<60, 93,
396                         (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
397                         "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
398
399  def XVTSQRTDP : XX2Form_1<60, 234,
400                          (outs crrc:$crD), (ins vsrc:$XB),
401                          "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
402  def XVTSQRTSP : XX2Form_1<60, 170,
403                          (outs crrc:$crD), (ins vsrc:$XB),
404                          "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
405
406  def XVREDP : XX2Form<60, 218,
407                        (outs vsrc:$XT), (ins vsrc:$XB),
408                        "xvredp $XT, $XB", IIC_VecFP,
409                        [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
410  def XVRESP : XX2Form<60, 154,
411                        (outs vsrc:$XT), (ins vsrc:$XB),
412                        "xvresp $XT, $XB", IIC_VecFP,
413                        [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
414
415  def XVRSQRTEDP : XX2Form<60, 202,
416                           (outs vsrc:$XT), (ins vsrc:$XB),
417                           "xvrsqrtedp $XT, $XB", IIC_VecFP,
418                           [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
419  def XVRSQRTESP : XX2Form<60, 138,
420                           (outs vsrc:$XT), (ins vsrc:$XB),
421                           "xvrsqrtesp $XT, $XB", IIC_VecFP,
422                           [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
423
424  // Compare Instructions
425  def XSCMPODP : XX3Form_1<60, 43,
426                           (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
427                           "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
428  def XSCMPUDP : XX3Form_1<60, 35,
429                           (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
430                           "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
431
432  defm XVCMPEQDP : XX3Form_Rcr<60, 99,
433                             (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
434                             "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
435  defm XVCMPEQSP : XX3Form_Rcr<60, 67,
436                             (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
437                             "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
438  defm XVCMPGEDP : XX3Form_Rcr<60, 115,
439                             (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
440                             "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
441  defm XVCMPGESP : XX3Form_Rcr<60, 83,
442                             (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
443                             "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
444  defm XVCMPGTDP : XX3Form_Rcr<60, 107,
445                             (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
446                             "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
447  defm XVCMPGTSP : XX3Form_Rcr<60, 75,
448                             (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
449                             "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
450
451  // Move Instructions
452  def XSABSDP : XX2Form<60, 345,
453                      (outs vsfrc:$XT), (ins vsfrc:$XB),
454                      "xsabsdp $XT, $XB", IIC_VecFP,
455                      [(set f64:$XT, (fabs f64:$XB))]>;
456  def XSNABSDP : XX2Form<60, 361,
457                      (outs vsfrc:$XT), (ins vsfrc:$XB),
458                      "xsnabsdp $XT, $XB", IIC_VecFP,
459                      [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
460  def XSNEGDP : XX2Form<60, 377,
461                      (outs vsfrc:$XT), (ins vsfrc:$XB),
462                      "xsnegdp $XT, $XB", IIC_VecFP,
463                      [(set f64:$XT, (fneg f64:$XB))]>;
464  def XSCPSGNDP : XX3Form<60, 176,
465                      (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
466                      "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
467                      [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
468
469  def XVABSDP : XX2Form<60, 473,
470                      (outs vsrc:$XT), (ins vsrc:$XB),
471                      "xvabsdp $XT, $XB", IIC_VecFP,
472                      [(set v2f64:$XT, (fabs v2f64:$XB))]>;
473
474  def XVABSSP : XX2Form<60, 409,
475                      (outs vsrc:$XT), (ins vsrc:$XB),
476                      "xvabssp $XT, $XB", IIC_VecFP,
477                      [(set v4f32:$XT, (fabs v4f32:$XB))]>;
478
479  def XVCPSGNDP : XX3Form<60, 240,
480                      (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
481                      "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
482                      [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
483  def XVCPSGNSP : XX3Form<60, 208,
484                      (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
485                      "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
486                      [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
487
488  def XVNABSDP : XX2Form<60, 489,
489                      (outs vsrc:$XT), (ins vsrc:$XB),
490                      "xvnabsdp $XT, $XB", IIC_VecFP,
491                      [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
492  def XVNABSSP : XX2Form<60, 425,
493                      (outs vsrc:$XT), (ins vsrc:$XB),
494                      "xvnabssp $XT, $XB", IIC_VecFP,
495                      [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
496
497  def XVNEGDP : XX2Form<60, 505,
498                      (outs vsrc:$XT), (ins vsrc:$XB),
499                      "xvnegdp $XT, $XB", IIC_VecFP,
500                      [(set v2f64:$XT, (fneg v2f64:$XB))]>;
501  def XVNEGSP : XX2Form<60, 441,
502                      (outs vsrc:$XT), (ins vsrc:$XB),
503                      "xvnegsp $XT, $XB", IIC_VecFP,
504                      [(set v4f32:$XT, (fneg v4f32:$XB))]>;
505
506  // Conversion Instructions
507  def XSCVDPSP : XX2Form<60, 265,
508                      (outs vsfrc:$XT), (ins vsfrc:$XB),
509                      "xscvdpsp $XT, $XB", IIC_VecFP, []>;
510  def XSCVDPSXDS : XX2Form<60, 344,
511                      (outs vsfrc:$XT), (ins vsfrc:$XB),
512                      "xscvdpsxds $XT, $XB", IIC_VecFP,
513                      [(set f64:$XT, (PPCfctidz f64:$XB))]>;
514  def XSCVDPSXWS : XX2Form<60, 88,
515                      (outs vsfrc:$XT), (ins vsfrc:$XB),
516                      "xscvdpsxws $XT, $XB", IIC_VecFP,
517                      [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
518  def XSCVDPUXDS : XX2Form<60, 328,
519                      (outs vsfrc:$XT), (ins vsfrc:$XB),
520                      "xscvdpuxds $XT, $XB", IIC_VecFP,
521                      [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
522  def XSCVDPUXWS : XX2Form<60, 72,
523                      (outs vsfrc:$XT), (ins vsfrc:$XB),
524                      "xscvdpuxws $XT, $XB", IIC_VecFP,
525                      [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
526  def XSCVSPDP : XX2Form<60, 329,
527                      (outs vsfrc:$XT), (ins vsfrc:$XB),
528                      "xscvspdp $XT, $XB", IIC_VecFP, []>;
529  def XSCVSXDDP : XX2Form<60, 376,
530                      (outs vsfrc:$XT), (ins vsfrc:$XB),
531                      "xscvsxddp $XT, $XB", IIC_VecFP,
532                      [(set f64:$XT, (PPCfcfid f64:$XB))]>;
533  def XSCVUXDDP : XX2Form<60, 360,
534                      (outs vsfrc:$XT), (ins vsfrc:$XB),
535                      "xscvuxddp $XT, $XB", IIC_VecFP,
536                      [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
537
538  def XVCVDPSP : XX2Form<60, 393,
539                      (outs vsrc:$XT), (ins vsrc:$XB),
540                      "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
541  def XVCVDPSXDS : XX2Form<60, 472,
542                      (outs vsrc:$XT), (ins vsrc:$XB),
543                      "xvcvdpsxds $XT, $XB", IIC_VecFP,
544                      [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
545  def XVCVDPSXWS : XX2Form<60, 216,
546                      (outs vsrc:$XT), (ins vsrc:$XB),
547                      "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
548  def XVCVDPUXDS : XX2Form<60, 456,
549                      (outs vsrc:$XT), (ins vsrc:$XB),
550                      "xvcvdpuxds $XT, $XB", IIC_VecFP,
551                      [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
552  def XVCVDPUXWS : XX2Form<60, 200,
553                      (outs vsrc:$XT), (ins vsrc:$XB),
554                      "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
555
556  def XVCVSPDP : XX2Form<60, 457,
557                      (outs vsrc:$XT), (ins vsrc:$XB),
558                      "xvcvspdp $XT, $XB", IIC_VecFP, []>;
559  def XVCVSPSXDS : XX2Form<60, 408,
560                      (outs vsrc:$XT), (ins vsrc:$XB),
561                      "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
562  def XVCVSPSXWS : XX2Form<60, 152,
563                      (outs vsrc:$XT), (ins vsrc:$XB),
564                      "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
565  def XVCVSPUXDS : XX2Form<60, 392,
566                      (outs vsrc:$XT), (ins vsrc:$XB),
567                      "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
568  def XVCVSPUXWS : XX2Form<60, 136,
569                      (outs vsrc:$XT), (ins vsrc:$XB),
570                      "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
571  def XVCVSXDDP : XX2Form<60, 504,
572                      (outs vsrc:$XT), (ins vsrc:$XB),
573                      "xvcvsxddp $XT, $XB", IIC_VecFP,
574                      [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
575  def XVCVSXDSP : XX2Form<60, 440,
576                      (outs vsrc:$XT), (ins vsrc:$XB),
577                      "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
578  def XVCVSXWDP : XX2Form<60, 248,
579                      (outs vsrc:$XT), (ins vsrc:$XB),
580                      "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
581  def XVCVSXWSP : XX2Form<60, 184,
582                      (outs vsrc:$XT), (ins vsrc:$XB),
583                      "xvcvsxwsp $XT, $XB", IIC_VecFP, []>;
584  def XVCVUXDDP : XX2Form<60, 488,
585                      (outs vsrc:$XT), (ins vsrc:$XB),
586                      "xvcvuxddp $XT, $XB", IIC_VecFP,
587                      [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
588  def XVCVUXDSP : XX2Form<60, 424,
589                      (outs vsrc:$XT), (ins vsrc:$XB),
590                      "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
591  def XVCVUXWDP : XX2Form<60, 232,
592                      (outs vsrc:$XT), (ins vsrc:$XB),
593                      "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
594  def XVCVUXWSP : XX2Form<60, 168,
595                      (outs vsrc:$XT), (ins vsrc:$XB),
596                      "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
597
598  // Rounding Instructions
599  def XSRDPI : XX2Form<60, 73,
600                      (outs vsfrc:$XT), (ins vsfrc:$XB),
601                      "xsrdpi $XT, $XB", IIC_VecFP,
602                      [(set f64:$XT, (frnd f64:$XB))]>;
603  def XSRDPIC : XX2Form<60, 107,
604                      (outs vsfrc:$XT), (ins vsfrc:$XB),
605                      "xsrdpic $XT, $XB", IIC_VecFP,
606                      [(set f64:$XT, (fnearbyint f64:$XB))]>;
607  def XSRDPIM : XX2Form<60, 121,
608                      (outs vsfrc:$XT), (ins vsfrc:$XB),
609                      "xsrdpim $XT, $XB", IIC_VecFP,
610                      [(set f64:$XT, (ffloor f64:$XB))]>;
611  def XSRDPIP : XX2Form<60, 105,
612                      (outs vsfrc:$XT), (ins vsfrc:$XB),
613                      "xsrdpip $XT, $XB", IIC_VecFP,
614                      [(set f64:$XT, (fceil f64:$XB))]>;
615  def XSRDPIZ : XX2Form<60, 89,
616                      (outs vsfrc:$XT), (ins vsfrc:$XB),
617                      "xsrdpiz $XT, $XB", IIC_VecFP,
618                      [(set f64:$XT, (ftrunc f64:$XB))]>;
619
620  def XVRDPI : XX2Form<60, 201,
621                      (outs vsrc:$XT), (ins vsrc:$XB),
622                      "xvrdpi $XT, $XB", IIC_VecFP,
623                      [(set v2f64:$XT, (frnd v2f64:$XB))]>;
624  def XVRDPIC : XX2Form<60, 235,
625                      (outs vsrc:$XT), (ins vsrc:$XB),
626                      "xvrdpic $XT, $XB", IIC_VecFP,
627                      [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
628  def XVRDPIM : XX2Form<60, 249,
629                      (outs vsrc:$XT), (ins vsrc:$XB),
630                      "xvrdpim $XT, $XB", IIC_VecFP,
631                      [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
632  def XVRDPIP : XX2Form<60, 233,
633                      (outs vsrc:$XT), (ins vsrc:$XB),
634                      "xvrdpip $XT, $XB", IIC_VecFP,
635                      [(set v2f64:$XT, (fceil v2f64:$XB))]>;
636  def XVRDPIZ : XX2Form<60, 217,
637                      (outs vsrc:$XT), (ins vsrc:$XB),
638                      "xvrdpiz $XT, $XB", IIC_VecFP,
639                      [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
640
641  def XVRSPI : XX2Form<60, 137,
642                      (outs vsrc:$XT), (ins vsrc:$XB),
643                      "xvrspi $XT, $XB", IIC_VecFP,
644                      [(set v4f32:$XT, (frnd v4f32:$XB))]>;
645  def XVRSPIC : XX2Form<60, 171,
646                      (outs vsrc:$XT), (ins vsrc:$XB),
647                      "xvrspic $XT, $XB", IIC_VecFP,
648                      [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
649  def XVRSPIM : XX2Form<60, 185,
650                      (outs vsrc:$XT), (ins vsrc:$XB),
651                      "xvrspim $XT, $XB", IIC_VecFP,
652                      [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
653  def XVRSPIP : XX2Form<60, 169,
654                      (outs vsrc:$XT), (ins vsrc:$XB),
655                      "xvrspip $XT, $XB", IIC_VecFP,
656                      [(set v4f32:$XT, (fceil v4f32:$XB))]>;
657  def XVRSPIZ : XX2Form<60, 153,
658                      (outs vsrc:$XT), (ins vsrc:$XB),
659                      "xvrspiz $XT, $XB", IIC_VecFP,
660                      [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
661
662  // Max/Min Instructions
663  let isCommutable = 1 in {
664  def XSMAXDP : XX3Form<60, 160,
665                        (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
666                        "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
667                        [(set vsfrc:$XT,
668                              (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
669  def XSMINDP : XX3Form<60, 168,
670                        (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
671                        "xsmindp $XT, $XA, $XB", IIC_VecFP,
672                        [(set vsfrc:$XT,
673                              (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
674
675  def XVMAXDP : XX3Form<60, 224,
676                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
677                        "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
678                        [(set vsrc:$XT,
679                              (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
680  def XVMINDP : XX3Form<60, 232,
681                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
682                        "xvmindp $XT, $XA, $XB", IIC_VecFP,
683                        [(set vsrc:$XT,
684                              (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
685
686  def XVMAXSP : XX3Form<60, 192,
687                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
688                        "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
689                        [(set vsrc:$XT,
690                              (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
691  def XVMINSP : XX3Form<60, 200,
692                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
693                        "xvminsp $XT, $XA, $XB", IIC_VecFP,
694                        [(set vsrc:$XT,
695                              (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
696  } // isCommutable
697} // Uses = [RM]
698
699  // Logical Instructions
700  let isCommutable = 1 in
701  def XXLAND : XX3Form<60, 130,
702                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
703                       "xxland $XT, $XA, $XB", IIC_VecGeneral,
704                       [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
705  def XXLANDC : XX3Form<60, 138,
706                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
707                        "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
708                        [(set v4i32:$XT, (and v4i32:$XA,
709                                              (vnot_ppc v4i32:$XB)))]>;
710  let isCommutable = 1 in {
711  def XXLNOR : XX3Form<60, 162,
712                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
713                       "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
714                       [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
715                                                   v4i32:$XB)))]>;
716  def XXLOR : XX3Form<60, 146,
717                      (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
718                      "xxlor $XT, $XA, $XB", IIC_VecGeneral,
719                      [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
720  let isCodeGenOnly = 1 in
721  def XXLORf: XX3Form<60, 146,
722                      (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
723                      "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
724  def XXLXOR : XX3Form<60, 154,
725                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
726                       "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
727                       [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
728  } // isCommutable
729
730  // Permutation Instructions
731  def XXMRGHW : XX3Form<60, 18,
732                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
733                       "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
734  def XXMRGLW : XX3Form<60, 50,
735                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
736                       "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
737
738  def XXPERMDI : XX3Form_2<60, 10,
739                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
740                       "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
741  def XXSEL : XX4Form<60, 3,
742                      (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
743                      "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
744
745  def XXSLDWI : XX3Form_2<60, 2,
746                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
747                       "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, []>;
748  def XXSPLTW : XX2Form_2<60, 164,
749                       (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
750                       "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
751} // hasSideEffects
752
753// SELECT_CC_* - Used to implement the SELECT_CC DAG operation.  Expanded after
754// instruction selection into a branch sequence.
755let usesCustomInserter = 1,    // Expanded after instruction selection.
756    PPC970_Single = 1 in {
757
758  def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
759                             (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
760                             "#SELECT_CC_VSRC",
761                             []>;
762  def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
763                          (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
764                          "#SELECT_VSRC",
765                          [(set v2f64:$dst,
766                                (select i1:$cond, v2f64:$T, v2f64:$F))]>;
767  def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
768                              (ins crrc:$cond, f8rc:$T, f8rc:$F,
769                               i32imm:$BROPC), "#SELECT_CC_VSFRC",
770                              []>;
771  def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
772                           (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
773                           "#SELECT_VSFRC",
774                           [(set f64:$dst,
775                                 (select i1:$cond, f64:$T, f64:$F))]>;
776} // usesCustomInserter
777} // AddedComplexity
778
779def : InstAlias<"xvmovdp $XT, $XB",
780                (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
781def : InstAlias<"xvmovsp $XT, $XB",
782                (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
783
784def : InstAlias<"xxspltd $XT, $XB, 0",
785                (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
786def : InstAlias<"xxspltd $XT, $XB, 1",
787                (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
788def : InstAlias<"xxmrghd $XT, $XA, $XB",
789                (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
790def : InstAlias<"xxmrgld $XT, $XA, $XB",
791                (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
792def : InstAlias<"xxswapd $XT, $XB",
793                (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
794
795let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
796
797let Predicates = [IsBigEndian] in {
798def : Pat<(v2f64 (scalar_to_vector f64:$A)),
799          (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
800
801def : Pat<(f64 (vector_extract v2f64:$S, 0)),
802          (f64 (EXTRACT_SUBREG $S, sub_64))>;
803def : Pat<(f64 (vector_extract v2f64:$S, 1)),
804          (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
805}
806
807let Predicates = [IsLittleEndian] in {
808def : Pat<(v2f64 (scalar_to_vector f64:$A)),
809          (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
810                           (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
811
812def : Pat<(f64 (vector_extract v2f64:$S, 0)),
813          (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
814def : Pat<(f64 (vector_extract v2f64:$S, 1)),
815          (f64 (EXTRACT_SUBREG $S, sub_64))>;
816}
817
818// Additional fnmsub patterns: -a*c + b == -(a*c - b)
819def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
820          (XSNMSUBADP $B, $C, $A)>;
821def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
822          (XSNMSUBADP $B, $C, $A)>;
823
824def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
825          (XVNMSUBADP $B, $C, $A)>;
826def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
827          (XVNMSUBADP $B, $C, $A)>;
828
829def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
830          (XVNMSUBASP $B, $C, $A)>;
831def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
832          (XVNMSUBASP $B, $C, $A)>;
833
834def : Pat<(v2f64 (bitconvert v4f32:$A)),
835          (COPY_TO_REGCLASS $A, VSRC)>;
836def : Pat<(v2f64 (bitconvert v4i32:$A)),
837          (COPY_TO_REGCLASS $A, VSRC)>;
838def : Pat<(v2f64 (bitconvert v8i16:$A)),
839          (COPY_TO_REGCLASS $A, VSRC)>;
840def : Pat<(v2f64 (bitconvert v16i8:$A)),
841          (COPY_TO_REGCLASS $A, VSRC)>;
842
843def : Pat<(v4f32 (bitconvert v2f64:$A)),
844          (COPY_TO_REGCLASS $A, VRRC)>;
845def : Pat<(v4i32 (bitconvert v2f64:$A)),
846          (COPY_TO_REGCLASS $A, VRRC)>;
847def : Pat<(v8i16 (bitconvert v2f64:$A)),
848          (COPY_TO_REGCLASS $A, VRRC)>;
849def : Pat<(v16i8 (bitconvert v2f64:$A)),
850          (COPY_TO_REGCLASS $A, VRRC)>;
851
852def : Pat<(v2i64 (bitconvert v4f32:$A)),
853          (COPY_TO_REGCLASS $A, VSRC)>;
854def : Pat<(v2i64 (bitconvert v4i32:$A)),
855          (COPY_TO_REGCLASS $A, VSRC)>;
856def : Pat<(v2i64 (bitconvert v8i16:$A)),
857          (COPY_TO_REGCLASS $A, VSRC)>;
858def : Pat<(v2i64 (bitconvert v16i8:$A)),
859          (COPY_TO_REGCLASS $A, VSRC)>;
860
861def : Pat<(v4f32 (bitconvert v2i64:$A)),
862          (COPY_TO_REGCLASS $A, VRRC)>;
863def : Pat<(v4i32 (bitconvert v2i64:$A)),
864          (COPY_TO_REGCLASS $A, VRRC)>;
865def : Pat<(v8i16 (bitconvert v2i64:$A)),
866          (COPY_TO_REGCLASS $A, VRRC)>;
867def : Pat<(v16i8 (bitconvert v2i64:$A)),
868          (COPY_TO_REGCLASS $A, VRRC)>;
869
870def : Pat<(v2f64 (bitconvert v2i64:$A)),
871          (COPY_TO_REGCLASS $A, VRRC)>;
872def : Pat<(v2i64 (bitconvert v2f64:$A)),
873          (COPY_TO_REGCLASS $A, VRRC)>;
874
875// sign extension patterns
876// To extend "in place" from v2i32 to v2i64, we have input data like:
877// | undef | i32 | undef | i32 |
878// but xvcvsxwdp expects the input in big-Endian format:
879// | i32 | undef | i32 | undef |
880// so we need to shift everything to the left by one i32 (word) before
881// the conversion.
882def : Pat<(sext_inreg v2i64:$C, v2i32),
883          (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
884def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
885          (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
886
887// Loads.
888def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
889def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
890def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
891def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
892
893// Stores.
894def : Pat<(store v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
895def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
896def : Pat<(store v4i32:$rS, xoaddr:$dst), (STXVW4X $rS, xoaddr:$dst)>;
897def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
898
899// Permutes.
900def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
901def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
902def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
903def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
904
905// Selects.
906def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
907          (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
908def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
909          (SELECT_VSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
910def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
911          (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
912def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
913          (SELECT_VSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
914def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
915          (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
916def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
917          (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
918
919def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
920          (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
921def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
922          (SELECT_VSFRC (CRORC  $rhs, $lhs), $tval, $fval)>;
923def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
924          (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
925def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
926          (SELECT_VSFRC (CRORC  $lhs, $rhs), $tval, $fval)>;
927def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
928          (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
929def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
930          (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
931
932// Divides.
933def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
934          (XVDIVSP $A, $B)>;
935def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
936          (XVDIVDP $A, $B)>;
937
938} // AddedComplexity
939} // HasVSX
940
941