R600/SI: Merge offset0 and offset1 fields for single address DS instructions v2
[oota-llvm.git] / lib / Target / PowerPC / PPCInstrVSX.td
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
14 def PPCRegVSRCAsmOperand : AsmOperandClass {
15   let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
16 }
17 def vsrc : RegisterOperand<VSRC> {
18   let ParserMatchClass = PPCRegVSRCAsmOperand;
19 }
20
21 multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, dag OOL, dag IOL,
22                     string asmbase, string asmstr, InstrItinClass itin,
23                     list<dag> pattern> {
24   let BaseName = asmbase in {
25     def NAME : XX3Form_Rc<opcode, xo, OOL, IOL,
26                        !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
27                        pattern>;
28     let Defs = [CR6] in
29     def o    : XX3Form_Rc<opcode, xo, OOL, IOL,
30                        !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
31                        []>, isDOT;
32   }
33 }
34
35 def HasVSX : Predicate<"PPCSubTarget.hasVSX()">;
36 let Predicates = [HasVSX] in {
37 let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
38 let neverHasSideEffects = 1 in { // VSX instructions don't have side effects.
39 let Uses = [RM] in {
40
41   // Load indexed instructions
42   let mayLoad = 1, canFoldAsLoad = 1 in {
43     def LXSDX : XForm_1<31, 588,
44                         (outs vsrc:$XT), (ins memrr:$src),
45                         "lxsdx $XT, $src", IIC_LdStLFD,
46                         [(set f64:$XT, (load xoaddr:$src))]>;
47
48     def LXVD2X : XForm_1<31, 844,
49                          (outs vsrc:$XT), (ins memrr:$src),
50                          "lxvd2x $XT, $src", IIC_LdStLFD,
51                          [(set v2f64:$XT, (load xoaddr:$src))]>;
52
53     def LXVDSX : XForm_1<31, 332,
54                          (outs vsrc:$XT), (ins memrr:$src),
55                          "lxvdsx $XT, $src", IIC_LdStLFD, []>;
56     // TODO: match load + splat to lxvdsx.
57
58     def LXVW4X : XForm_1<31, 780,
59                          (outs vsrc:$XT), (ins memrr:$src),
60                          "lxvw4x $XT, $src", IIC_LdStLFD,
61                          [(set v4f32:$XT, (load xoaddr:$src))]>;
62   }
63
64   // Store indexed instructions
65   let mayStore = 1 in {
66     def STXSDX : XX1Form<31, 716,
67                         (outs), (ins vsrc:$XT, memrr:$dst),
68                         "stxsdx $XT, $dst", IIC_LdStSTFD,
69                         [(store f64:$XT, xoaddr:$dst)]>;
70
71     def STXVD2X : XX1Form<31, 972,
72                          (outs), (ins vsrc:$XT, memrr:$dst),
73                          "stxvd2x $XT, $dst", IIC_LdStSTFD,
74                          [(store v2f64:$XT, xoaddr:$dst)]>;
75
76     def STXVW4X : XX1Form<31, 908,
77                          (outs), (ins vsrc:$XT, memrr:$dst),
78                          "stxvw4x $XT, $dst", IIC_LdStSTFD,
79                          [(store v4f32:$XT, xoaddr:$dst)]>;
80   }
81
82   // Add/Mul Instructions
83   let isCommutable = 1 in {
84     def XSADDDP : XX3Form<60, 32,
85                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
86                           "xsadddp $XT, $XA, $XB", IIC_VecFP,
87                           [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
88     def XSMULDP : XX3Form<60, 48,
89                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
90                           "xsmuldp $XT, $XA, $XB", IIC_VecFP,
91                           [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
92
93     def XVADDDP : XX3Form<60, 96,
94                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
95                           "xvadddp $XT, $XA, $XB", IIC_VecFP,
96                           [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
97
98     def XVADDSP : XX3Form<60, 64,
99                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
100                           "xvaddsp $XT, $XA, $XB", IIC_VecFP,
101                           [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
102
103     def XVMULDP : XX3Form<60, 112,
104                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
105                           "xvmuldp $XT, $XA, $XB", IIC_VecFP,
106                           [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
107
108     def XVMULSP : XX3Form<60, 80,
109                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
110                           "xvmulsp $XT, $XA, $XB", IIC_VecFP,
111                           [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
112   }
113
114   // Subtract Instructions
115   def XSSUBDP : XX3Form<60, 40,
116                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
117                         "xssubdp $XT, $XA, $XB", IIC_VecFP,
118                         [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
119
120   def XVSUBDP : XX3Form<60, 104,
121                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
122                         "xvsubdp $XT, $XA, $XB", IIC_VecFP,
123                         [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
124   def XVSUBSP : XX3Form<60, 72,
125                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
126                         "xvsubsp $XT, $XA, $XB", IIC_VecFP,
127                         [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
128
129   // FMA Instructions
130   def XSMADDADP : XX3Form<60, 33,
131                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
132                           "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
133                           [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
134                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
135   def XSMADDMDP : XX3Form<60, 41,
136                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
137                           "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
138                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
139   // TODO: Select between these based first on whether one of the operands has
140   // no further uses. We probably want to do this after scheduling but before
141   // register allocation.
142
143   def XSMSUBADP : XX3Form<60, 49,
144                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
145                           "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
146                           [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
147                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
148   def XSMSUBMDP : XX3Form<60, 57,
149                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
150                           "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
151                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
152
153   def XSNMADDADP : XX3Form<60, 161,
154                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
155                           "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
156                           [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
157                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
158   def XSNMADDMDP : XX3Form<60, 169,
159                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
160                           "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
161                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
162
163   def XSNMSUBADP : XX3Form<60, 177,
164                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
165                           "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
166                           [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
167                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
168   def XSNMSUBMDP : XX3Form<60, 185,
169                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
170                           "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
171                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
172
173   def XVMADDADP : XX3Form<60, 97,
174                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
175                           "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
176                           [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
177                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
178   def XVMADDMDP : XX3Form<60, 105,
179                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
180                           "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
181                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
182
183   def XVMADDASP : XX3Form<60, 65,
184                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
185                           "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
186                           [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
187                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
188   def XVMADDMSP : XX3Form<60, 73,
189                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
190                           "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
191                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
192
193   def XVMSUBADP : XX3Form<60, 113,
194                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
195                           "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
196                           [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
197                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
198   def XVMSUBMDP : XX3Form<60, 121,
199                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
200                           "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
201                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
202
203   def XVMSUBASP : XX3Form<60, 81,
204                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
205                           "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
206                           [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
207                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
208   def XVMSUBMSP : XX3Form<60, 89,
209                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
210                           "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
211                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
212
213   def XVNMADDADP : XX3Form<60, 225,
214                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
215                           "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
216                           [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
217                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
218   def XVNMADDMDP : XX3Form<60, 233,
219                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
220                           "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
221                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
222
223   def XVNMADDASP : XX3Form<60, 193,
224                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
225                           "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
226                           [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
227                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
228   def XVNMADDMSP : XX3Form<60, 201,
229                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
230                           "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
231                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
232
233   def XVNMSUBADP : XX3Form<60, 241,
234                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
235                           "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
236                           [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
237                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
238   def XVNMSUBMDP : XX3Form<60, 249,
239                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
240                           "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
241                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
242
243   def XVNMSUBASP : XX3Form<60, 209,
244                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
245                           "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
246                           [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
247                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
248   def XVNMSUBMSP : XX3Form<60, 217,
249                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
250                           "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
251                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
252
253   // Division Instructions
254   def XSDIVDP : XX3Form<60, 56,
255                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
256                         "xsdivdp $XT, $XA, $XB", IIC_VecFP,
257                         [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
258   def XSSQRTDP : XX2Form<60, 75,
259                         (outs vsrc:$XT), (ins vsrc:$XB),
260                         "xssqrtdp $XT, $XB", IIC_VecFP,
261                         [(set f64:$XT, (fsqrt f64:$XB))]>;
262
263   def XSREDP : XX2Form<60, 90,
264                         (outs vsrc:$XT), (ins vsrc:$XB),
265                         "xsredp $XT, $XB", IIC_VecFP,
266                         [(set f64:$XT, (PPCfre f64:$XB))]>;
267   def XSRSQRTEDP : XX2Form<60, 74,
268                            (outs vsrc:$XT), (ins vsrc:$XB),
269                            "xsrsqrtedp $XT, $XB", IIC_VecFP,
270                            [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
271
272   def XSTDIVDP : XX3Form_1<60, 61,
273                          (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
274                          "xstdivdp $crD, $XA, $XB", IIC_VecFP, []>;
275   def XSTSQRTDP : XX2Form_1<60, 106,
276                           (outs crrc:$crD), (ins vsrc:$XB),
277                           "xstsqrtdp $crD, $XB", IIC_VecFP, []>;
278
279   def XVDIVDP : XX3Form<60, 120,
280                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
281                         "xvdivdp $XT, $XA, $XB", IIC_VecFP,
282                         [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
283   def XVDIVSP : XX3Form<60, 88,
284                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
285                         "xvdivsp $XT, $XA, $XB", IIC_VecFP,
286                         [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
287
288   def XVSQRTDP : XX2Form<60, 203,
289                         (outs vsrc:$XT), (ins vsrc:$XB),
290                         "xvsqrtdp $XT, $XB", IIC_VecFP,
291                         [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
292   def XVSQRTSP : XX2Form<60, 139,
293                         (outs vsrc:$XT), (ins vsrc:$XB),
294                         "xvsqrtsp $XT, $XB", IIC_VecFP,
295                         [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
296
297   def XVTDIVDP : XX3Form_1<60, 125,
298                          (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
299                          "xvtdivdp $crD, $XA, $XB", IIC_VecFP, []>;
300   def XVTDIVSP : XX3Form_1<60, 93,
301                          (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
302                          "xvtdivsp $crD, $XA, $XB", IIC_VecFP, []>;
303
304   def XVTSQRTDP : XX2Form_1<60, 234,
305                           (outs crrc:$crD), (ins vsrc:$XB),
306                           "xvtsqrtdp $crD, $XB", IIC_VecFP, []>;
307   def XVTSQRTSP : XX2Form_1<60, 170,
308                           (outs crrc:$crD), (ins vsrc:$XB),
309                           "xvtsqrtsp $crD, $XB", IIC_VecFP, []>;
310
311   def XVREDP : XX2Form<60, 218,
312                         (outs vsrc:$XT), (ins vsrc:$XB),
313                         "xvredp $XT, $XB", IIC_VecFP,
314                         [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
315   def XVRESP : XX2Form<60, 154,
316                         (outs vsrc:$XT), (ins vsrc:$XB),
317                         "xvresp $XT, $XB", IIC_VecFP,
318                         [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
319
320   def XVRSQRTEDP : XX2Form<60, 202,
321                            (outs vsrc:$XT), (ins vsrc:$XB),
322                            "xvrsqrtedp $XT, $XB", IIC_VecFP,
323                            [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
324   def XVRSQRTESP : XX2Form<60, 138,
325                            (outs vsrc:$XT), (ins vsrc:$XB),
326                            "xvrsqrtesp $XT, $XB", IIC_VecFP,
327                            [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
328
329   // Compare Instructions
330   def XSCMPODP : XX3Form_1<60, 43,
331                            (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
332                            "xscmpodp $crD, $XA, $XB", IIC_VecFPCompare, []>;
333   def XSCMPUDP : XX3Form_1<60, 35,
334                            (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
335                            "xscmpudp $crD, $XA, $XB", IIC_VecFPCompare, []>;
336
337   defm XVCMPEQDP : XX3Form_Rcr<60, 99,
338                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
339                              "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
340   defm XVCMPEQSP : XX3Form_Rcr<60, 67,
341                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
342                              "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
343   defm XVCMPGEDP : XX3Form_Rcr<60, 115,
344                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
345                              "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
346   defm XVCMPGESP : XX3Form_Rcr<60, 83,
347                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
348                              "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
349   defm XVCMPGTDP : XX3Form_Rcr<60, 107,
350                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
351                              "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
352   defm XVCMPGTSP : XX3Form_Rcr<60, 75,
353                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
354                              "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
355
356   // Move Instructions
357   def XSABSDP : XX2Form<60, 345,
358                       (outs vsrc:$XT), (ins vsrc:$XB),
359                       "xsabsdp $XT, $XB", IIC_VecFP,
360                       [(set f64:$XT, (fabs f64:$XB))]>;
361   def XSNABSDP : XX2Form<60, 361,
362                       (outs vsrc:$XT), (ins vsrc:$XB),
363                       "xsnabsdp $XT, $XB", IIC_VecFP,
364                       [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
365   def XSNEGDP : XX2Form<60, 377,
366                       (outs vsrc:$XT), (ins vsrc:$XB),
367                       "xsnegdp $XT, $XB", IIC_VecFP,
368                       [(set f64:$XT, (fneg f64:$XB))]>;
369   def XSCPSGNDP : XX3Form<60, 176,
370                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
371                       "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
372                       [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
373
374   def XVABSDP : XX2Form<60, 473,
375                       (outs vsrc:$XT), (ins vsrc:$XB),
376                       "xvabsdp $XT, $XB", IIC_VecFP,
377                       [(set v2f64:$XT, (fabs v2f64:$XB))]>;
378
379   def XVABSSP : XX2Form<60, 409,
380                       (outs vsrc:$XT), (ins vsrc:$XB),
381                       "xvabssp $XT, $XB", IIC_VecFP,
382                       [(set v4f32:$XT, (fabs v4f32:$XB))]>;
383
384   def XVCPSGNDP : XX3Form<60, 240,
385                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
386                       "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
387                       [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
388   def XVCPSGNSP : XX3Form<60, 208,
389                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
390                       "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
391                       [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
392
393   def XVNABSDP : XX2Form<60, 489,
394                       (outs vsrc:$XT), (ins vsrc:$XB),
395                       "xvnabsdp $XT, $XB", IIC_VecFP,
396                       [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
397   def XVNABSSP : XX2Form<60, 425,
398                       (outs vsrc:$XT), (ins vsrc:$XB),
399                       "xvnabssp $XT, $XB", IIC_VecFP,
400                       [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
401
402   def XVNEGDP : XX2Form<60, 505,
403                       (outs vsrc:$XT), (ins vsrc:$XB),
404                       "xvnegdp $XT, $XB", IIC_VecFP,
405                       [(set v2f64:$XT, (fneg v2f64:$XB))]>;
406   def XVNEGSP : XX2Form<60, 441,
407                       (outs vsrc:$XT), (ins vsrc:$XB),
408                       "xvnegsp $XT, $XB", IIC_VecFP,
409                       [(set v4f32:$XT, (fneg v4f32:$XB))]>;
410
411   // Conversion Instructions
412   def XSCVDPSP : XX2Form<60, 265,
413                       (outs vsrc:$XT), (ins vsrc:$XB),
414                       "xscvdpsp $XT, $XB", IIC_VecFP, []>;
415   def XSCVDPSXDS : XX2Form<60, 344,
416                       (outs vsrc:$XT), (ins vsrc:$XB),
417                       "xscvdpsxds $XT, $XB", IIC_VecFP, []>;
418   def XSCVDPSXWS : XX2Form<60, 88,
419                       (outs vsrc:$XT), (ins vsrc:$XB),
420                       "xscvdpsxws $XT, $XB", IIC_VecFP, []>;
421   def XSCVDPUXDS : XX2Form<60, 328,
422                       (outs vsrc:$XT), (ins vsrc:$XB),
423                       "xscvdpuxds $XT, $XB", IIC_VecFP, []>;
424   def XSCVDPUXWS : XX2Form<60, 72,
425                       (outs vsrc:$XT), (ins vsrc:$XB),
426                       "xscvdpuxws $XT, $XB", IIC_VecFP, []>;
427   def XSCVSPDP : XX2Form<60, 329,
428                       (outs vsrc:$XT), (ins vsrc:$XB),
429                       "xscvspdp $XT, $XB", IIC_VecFP, []>;
430   def XSCVSXDDP : XX2Form<60, 376,
431                       (outs vsrc:$XT), (ins vsrc:$XB),
432                       "xscvsxddp $XT, $XB", IIC_VecFP, []>;
433   def XSCVUXDDP : XX2Form<60, 360,
434                       (outs vsrc:$XT), (ins vsrc:$XB),
435                       "xscvuxddp $XT, $XB", IIC_VecFP, []>;
436
437   def XVCVDPSP : XX2Form<60, 393,
438                       (outs vsrc:$XT), (ins vsrc:$XB),
439                       "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
440   def XVCVDPSXDS : XX2Form<60, 472,
441                       (outs vsrc:$XT), (ins vsrc:$XB),
442                       "xvcvdpsxds $XT, $XB", IIC_VecFP, []>;
443   def XVCVDPSXWS : XX2Form<60, 216,
444                       (outs vsrc:$XT), (ins vsrc:$XB),
445                       "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
446   def XVCVDPUXDS : XX2Form<60, 456,
447                       (outs vsrc:$XT), (ins vsrc:$XB),
448                       "xvcvdpuxds $XT, $XB", IIC_VecFP, []>;
449   def XVCVDPUXWS : XX2Form<60, 200,
450                       (outs vsrc:$XT), (ins vsrc:$XB),
451                       "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
452
453   def XVCVSPDP : XX2Form<60, 457,
454                       (outs vsrc:$XT), (ins vsrc:$XB),
455                       "xvcvspdp $XT, $XB", IIC_VecFP, []>;
456   def XVCVSPSXDS : XX2Form<60, 408,
457                       (outs vsrc:$XT), (ins vsrc:$XB),
458                       "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
459   def XVCVSPSXWS : XX2Form<60, 152,
460                       (outs vsrc:$XT), (ins vsrc:$XB),
461                       "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
462   def XVCVSPUXDS : XX2Form<60, 392,
463                       (outs vsrc:$XT), (ins vsrc:$XB),
464                       "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
465   def XVCVSPUXWS : XX2Form<60, 136,
466                       (outs vsrc:$XT), (ins vsrc:$XB),
467                       "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
468   def XVCVSXDDP : XX2Form<60, 504,
469                       (outs vsrc:$XT), (ins vsrc:$XB),
470                       "xvcvsxddp $XT, $XB", IIC_VecFP, []>;
471   def XVCVSXDSP : XX2Form<60, 440,
472                       (outs vsrc:$XT), (ins vsrc:$XB),
473                       "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
474   def XVCVSXWDP : XX2Form<60, 248,
475                       (outs vsrc:$XT), (ins vsrc:$XB),
476                       "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
477   def XVCVSXWSP : XX2Form<60, 184,
478                       (outs vsrc:$XT), (ins vsrc:$XB),
479                       "xvcvsxwsp $XT, $XB", IIC_VecFP, []>;
480   def XVCVUXDDP : XX2Form<60, 488,
481                       (outs vsrc:$XT), (ins vsrc:$XB),
482                       "xvcvuxddp $XT, $XB", IIC_VecFP, []>;
483   def XVCVUXDSP : XX2Form<60, 424,
484                       (outs vsrc:$XT), (ins vsrc:$XB),
485                       "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
486   def XVCVUXWDP : XX2Form<60, 232,
487                       (outs vsrc:$XT), (ins vsrc:$XB),
488                       "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
489   def XVCVUXWSP : XX2Form<60, 168,
490                       (outs vsrc:$XT), (ins vsrc:$XB),
491                       "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
492
493   // Rounding Instructions
494   def XSRDPI : XX2Form<60, 73,
495                       (outs vsrc:$XT), (ins vsrc:$XB),
496                       "xsrdpi $XT, $XB", IIC_VecFP,
497                       [(set f64:$XT, (frnd f64:$XB))]>;
498   def XSRDPIC : XX2Form<60, 107,
499                       (outs vsrc:$XT), (ins vsrc:$XB),
500                       "xsrdpic $XT, $XB", IIC_VecFP,
501                       [(set f64:$XT, (fnearbyint f64:$XB))]>;
502   def XSRDPIM : XX2Form<60, 121,
503                       (outs vsrc:$XT), (ins vsrc:$XB),
504                       "xsrdpim $XT, $XB", IIC_VecFP,
505                       [(set f64:$XT, (ffloor f64:$XB))]>;
506   def XSRDPIP : XX2Form<60, 105,
507                       (outs vsrc:$XT), (ins vsrc:$XB),
508                       "xsrdpip $XT, $XB", IIC_VecFP,
509                       [(set f64:$XT, (fceil f64:$XB))]>;
510   def XSRDPIZ : XX2Form<60, 89,
511                       (outs vsrc:$XT), (ins vsrc:$XB),
512                       "xsrdpiz $XT, $XB", IIC_VecFP,
513                       [(set f64:$XT, (ftrunc f64:$XB))]>;
514
515   def XVRDPI : XX2Form<60, 201,
516                       (outs vsrc:$XT), (ins vsrc:$XB),
517                       "xvrdpi $XT, $XB", IIC_VecFP,
518                       [(set v2f64:$XT, (frnd v2f64:$XB))]>;
519   def XVRDPIC : XX2Form<60, 235,
520                       (outs vsrc:$XT), (ins vsrc:$XB),
521                       "xvrdpic $XT, $XB", IIC_VecFP,
522                       [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
523   def XVRDPIM : XX2Form<60, 249,
524                       (outs vsrc:$XT), (ins vsrc:$XB),
525                       "xvrdpim $XT, $XB", IIC_VecFP,
526                       [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
527   def XVRDPIP : XX2Form<60, 233,
528                       (outs vsrc:$XT), (ins vsrc:$XB),
529                       "xvrdpip $XT, $XB", IIC_VecFP,
530                       [(set v2f64:$XT, (fceil v2f64:$XB))]>;
531   def XVRDPIZ : XX2Form<60, 217,
532                       (outs vsrc:$XT), (ins vsrc:$XB),
533                       "xvrdpiz $XT, $XB", IIC_VecFP,
534                       [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
535
536   def XVRSPI : XX2Form<60, 137,
537                       (outs vsrc:$XT), (ins vsrc:$XB),
538                       "xvrspi $XT, $XB", IIC_VecFP,
539                       [(set v4f32:$XT, (frnd v4f32:$XB))]>;
540   def XVRSPIC : XX2Form<60, 171,
541                       (outs vsrc:$XT), (ins vsrc:$XB),
542                       "xvrspic $XT, $XB", IIC_VecFP,
543                       [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
544   def XVRSPIM : XX2Form<60, 185,
545                       (outs vsrc:$XT), (ins vsrc:$XB),
546                       "xvrspim $XT, $XB", IIC_VecFP,
547                       [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
548   def XVRSPIP : XX2Form<60, 169,
549                       (outs vsrc:$XT), (ins vsrc:$XB),
550                       "xvrspip $XT, $XB", IIC_VecFP,
551                       [(set v4f32:$XT, (fceil v4f32:$XB))]>;
552   def XVRSPIZ : XX2Form<60, 153,
553                       (outs vsrc:$XT), (ins vsrc:$XB),
554                       "xvrspiz $XT, $XB", IIC_VecFP,
555                       [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
556
557   // Max/Min Instructions
558   def XSMAXDP : XX3Form<60, 160,
559                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
560                         "xsmaxdp $XT, $XA, $XB", IIC_VecFP, []>;
561   def XSMINDP : XX3Form<60, 168,
562                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
563                         "xsmindp $XT, $XA, $XB", IIC_VecFP, []>;
564
565   def XVMAXDP : XX3Form<60, 224,
566                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
567                         "xvmaxdp $XT, $XA, $XB", IIC_VecFP, []>;
568   def XVMINDP : XX3Form<60, 232,
569                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
570                         "xvmindp $XT, $XA, $XB", IIC_VecFP, []>;
571
572   def XVMAXSP : XX3Form<60, 192,
573                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
574                         "xvmaxsp $XT, $XA, $XB", IIC_VecFP, []>;
575   def XVMINSP : XX3Form<60, 200,
576                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
577                         "xvminsp $XT, $XA, $XB", IIC_VecFP, []>;
578 } // Uses = [RM]
579
580   // Logical Instructions
581   def XXLAND : XX3Form<60, 130,
582                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
583                        "xxland $XT, $XA, $XB", IIC_VecGeneral, []>;
584   def XXLANDC : XX3Form<60, 138,
585                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
586                         "xxlandc $XT, $XA, $XB", IIC_VecGeneral, []>;
587   def XXLNOR : XX3Form<60, 162,
588                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
589                        "xxlnor $XT, $XA, $XB", IIC_VecGeneral, []>;
590   def XXLOR : XX3Form<60, 146,
591                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
592                       "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
593   def XXLXOR : XX3Form<60, 154,
594                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
595                        "xxlxor $XT, $XA, $XB", IIC_VecGeneral, []>;
596
597   // Permutation Instructions
598   def XXMRGHW : XX3Form<60, 18,
599                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
600                        "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
601   def XXMRGLW : XX3Form<60, 50,
602                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
603                        "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
604
605   def XXPERMDI : XX3Form_2<60, 10,
606                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
607                        "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
608   def XXSEL : XX4Form<60, 3,
609                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
610                       "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
611
612   def XXSLDWI : XX3Form_2<60, 2,
613                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
614                        "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, []>;
615   def XXSPLTW : XX2Form_2<60, 164,
616                        (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
617                        "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
618 } // neverHasSideEffects
619 } // AddedComplexity
620
621 def : InstAlias<"xvmovdp $XT, $XB",
622                 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
623 def : InstAlias<"xvmovsp $XT, $XB",
624                 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
625
626 def : InstAlias<"xxspltd $XT, $XB, 0",
627                 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
628 def : InstAlias<"xxspltd $XT, $XB, 1",
629                 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
630 def : InstAlias<"xxmrghd $XT, $XA, $XB",
631                 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
632 def : InstAlias<"xxmrgld $XT, $XA, $XB",
633                 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
634 def : InstAlias<"xxswapd $XT, $XB",
635                 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
636
637 let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
638 def : Pat<(v2f64 (scalar_to_vector f64:$A)),
639           (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), $A, sub_64)>;
640
641 def : Pat<(f64 (vector_extract v2f64:$S, 0)),
642           (EXTRACT_SUBREG (v2f64 (COPY_TO_REGCLASS $S, VSLRC)), sub_64)>;
643 def : Pat<(f64 (vector_extract v2f64:$S, 1)),
644           (EXTRACT_SUBREG (v2f64 (COPY_TO_REGCLASS (XXPERMDI $S, $S, 3),
645                                                    VSLRC)), sub_64)>;
646
647 // Additional fnmsub patterns: -a*c + b == -(a*c - b)
648 def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
649           (XSNMSUBADP $B, $C, $A)>;
650 def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
651           (XSNMSUBADP $B, $C, $A)>;
652
653 def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
654           (XVNMSUBADP $B, $C, $A)>;
655 def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
656           (XVNMSUBADP $B, $C, $A)>;
657
658 def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
659           (XVNMSUBASP $B, $C, $A)>;
660 def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
661           (XVNMSUBASP $B, $C, $A)>;
662
663 def : Pat<(v2f64 (bitconvert v4i32:$A)),
664           (COPY_TO_REGCLASS $A, VSRC)>;
665 def : Pat<(v2f64 (bitconvert v8i16:$A)),
666           (COPY_TO_REGCLASS $A, VSRC)>;
667 def : Pat<(v2f64 (bitconvert v16i8:$A)),
668           (COPY_TO_REGCLASS $A, VSRC)>;
669
670 def : Pat<(v4i32 (bitconvert v2f64:$A)),
671           (COPY_TO_REGCLASS $A, VRRC)>;
672 def : Pat<(v8i16 (bitconvert v2f64:$A)),
673           (COPY_TO_REGCLASS $A, VRRC)>;
674 def : Pat<(v16i8 (bitconvert v2f64:$A)),
675           (COPY_TO_REGCLASS $A, VRRC)>;
676
677 } // AddedComplexity
678 } // HasVSX
679