1 //===- PPCInstrVSX.td - The PowerPC VSX Extension --*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file describes the VSX extension to the PowerPC instruction set.
12 //===----------------------------------------------------------------------===//
14 def PPCRegVSRCAsmOperand : AsmOperandClass {
15 let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
17 def vsrc : RegisterOperand<VSRC> {
18 let ParserMatchClass = PPCRegVSRCAsmOperand;
21 multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, dag OOL, dag IOL,
22 string asmbase, string asmstr, InstrItinClass itin,
24 let BaseName = asmbase in {
25 def NAME : XX3Form_Rc<opcode, xo, OOL, IOL,
26 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
29 def o : XX3Form_Rc<opcode, xo, OOL, IOL,
30 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
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.
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))]>;
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))]>;
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.
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))]>;
64 // Store indexed instructions
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)]>;
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)]>;
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)]>;
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))]>;
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))]>;
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))]>;
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))]>;
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))]>;
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))]>;
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))]>;
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.
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">;
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">;
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">;
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">;
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">;
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">;
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">;
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">;
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">;
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">;
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">;
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))]>;
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))]>;
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, []>;
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))]>;
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))]>;
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, []>;
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, []>;
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))]>;
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))]>;
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, []>;
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, []>;
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))]>;
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))]>;
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))]>;
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))]>;
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)))]>;
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))]>;
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, []>;
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, []>;
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, []>;
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))]>;
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))]>;
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))]>;
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, []>;
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, []>;
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, []>;
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, []>;
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, []>;
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, []>;
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
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)>;
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)>;
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)>;
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),
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)>;
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)>;
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)>;
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)>;
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)>;