blob: 44f4e8ae46740e5baafa4f29be6de366b82e4390 [file] [log] [blame]
Hal Finkel27774d92014-03-13 07:58:58 +00001//===- PPCInstrVSX.td - The PowerPC VSX Extension --*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the VSX extension to the PowerPC instruction set.
11//
12//===----------------------------------------------------------------------===//
13
Bill Schmidtfe723b92015-04-27 19:57:34 +000014// *********************************** NOTE ***********************************
15// ** For POWER8 Little Endian, the VSX swap optimization relies on knowing **
16// ** which VMX and VSX instructions are lane-sensitive and which are not. **
17// ** A lane-sensitive instruction relies, implicitly or explicitly, on **
18// ** whether lanes are numbered from left to right. An instruction like **
19// ** VADDFP is not lane-sensitive, because each lane of the result vector **
20// ** relies only on the corresponding lane of the source vectors. However, **
21// ** an instruction like VMULESB is lane-sensitive, because "even" and **
22// ** "odd" lanes are different for big-endian and little-endian numbering. **
23// ** **
24// ** When adding new VMX and VSX instructions, please consider whether they **
25// ** are lane-sensitive. If so, they must be added to a switch statement **
26// ** in PPCVSXSwapRemoval::gatherVectorInstructions(). **
27// ****************************************************************************
28
Hal Finkel27774d92014-03-13 07:58:58 +000029def PPCRegVSRCAsmOperand : AsmOperandClass {
30 let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
31}
32def vsrc : RegisterOperand<VSRC> {
33 let ParserMatchClass = PPCRegVSRCAsmOperand;
34}
35
Hal Finkel19be5062014-03-29 05:29:01 +000036def PPCRegVSFRCAsmOperand : AsmOperandClass {
37 let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber";
38}
39def vsfrc : RegisterOperand<VSFRC> {
40 let ParserMatchClass = PPCRegVSFRCAsmOperand;
41}
42
Bill Schmidtfae5d712014-12-09 16:35:51 +000043// Little-endian-specific nodes.
44def SDT_PPClxvd2x : SDTypeProfile<1, 1, [
45 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
46]>;
47def SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
48 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
49]>;
50def SDT_PPCxxswapd : SDTypeProfile<1, 1, [
51 SDTCisSameAs<0, 1>
52]>;
53
54def PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
55 [SDNPHasChain, SDNPMayLoad]>;
56def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
57 [SDNPHasChain, SDNPMayStore]>;
58def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +000059def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
60def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
61def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000062
Hal Finkel27774d92014-03-13 07:58:58 +000063multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, dag OOL, dag IOL,
64 string asmbase, string asmstr, InstrItinClass itin,
65 list<dag> pattern> {
66 let BaseName = asmbase in {
67 def NAME : XX3Form_Rc<opcode, xo, OOL, IOL,
68 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
69 pattern>;
70 let Defs = [CR6] in
71 def o : XX3Form_Rc<opcode, xo, OOL, IOL,
72 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
73 []>, isDOT;
74 }
75}
76
Eric Christopher1b8e7632014-05-22 01:07:24 +000077def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +000078def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
79def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
80
Hal Finkel27774d92014-03-13 07:58:58 +000081let Predicates = [HasVSX] in {
82let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Craig Topperc50d64b2014-11-26 00:46:26 +000083let hasSideEffects = 0 in { // VSX instructions don't have side effects.
Hal Finkel27774d92014-03-13 07:58:58 +000084let Uses = [RM] in {
85
86 // Load indexed instructions
Hal Finkel6a778fb2015-03-11 23:28:38 +000087 let mayLoad = 1 in {
Bill Schmidtcb34fd02014-10-09 17:51:35 +000088 def LXSDX : XX1Form<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +000089 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +000090 "lxsdx $XT, $src", IIC_LdStLFD,
91 [(set f64:$XT, (load xoaddr:$src))]>;
92
Bill Schmidtcb34fd02014-10-09 17:51:35 +000093 def LXVD2X : XX1Form<31, 844,
Hal Finkel27774d92014-03-13 07:58:58 +000094 (outs vsrc:$XT), (ins memrr:$src),
95 "lxvd2x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +000096 [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000097
Bill Schmidtcb34fd02014-10-09 17:51:35 +000098 def LXVDSX : XX1Form<31, 332,
Hal Finkel27774d92014-03-13 07:58:58 +000099 (outs vsrc:$XT), (ins memrr:$src),
100 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000101
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000102 def LXVW4X : XX1Form<31, 780,
Hal Finkel27774d92014-03-13 07:58:58 +0000103 (outs vsrc:$XT), (ins memrr:$src),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000104 "lxvw4x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000105 [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000106 }
107
108 // Store indexed instructions
109 let mayStore = 1 in {
110 def STXSDX : XX1Form<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +0000111 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +0000112 "stxsdx $XT, $dst", IIC_LdStSTFD,
113 [(store f64:$XT, xoaddr:$dst)]>;
114
115 def STXVD2X : XX1Form<31, 972,
116 (outs), (ins vsrc:$XT, memrr:$dst),
117 "stxvd2x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000118 [(store v2f64:$XT, xoaddr:$dst)]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000119
120 def STXVW4X : XX1Form<31, 908,
121 (outs), (ins vsrc:$XT, memrr:$dst),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000122 "stxvw4x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000123 [(store v4i32:$XT, xoaddr:$dst)]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000124 }
125
126 // Add/Mul Instructions
127 let isCommutable = 1 in {
128 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +0000129 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000130 "xsadddp $XT, $XA, $XB", IIC_VecFP,
131 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
132 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +0000133 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000134 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
135 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
136
137 def XVADDDP : XX3Form<60, 96,
138 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
139 "xvadddp $XT, $XA, $XB", IIC_VecFP,
140 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
141
142 def XVADDSP : XX3Form<60, 64,
143 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
144 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
145 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
146
147 def XVMULDP : XX3Form<60, 112,
148 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
149 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
150 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
151
152 def XVMULSP : XX3Form<60, 80,
153 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
154 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
155 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
156 }
157
158 // Subtract Instructions
159 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000160 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000161 "xssubdp $XT, $XA, $XB", IIC_VecFP,
162 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
163
164 def XVSUBDP : XX3Form<60, 104,
165 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
166 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
167 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
168 def XVSUBSP : XX3Form<60, 72,
169 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
170 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
171 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
172
173 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000174 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000175 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000176 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000177 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000178 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
179 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000180 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
181 AltVSXFMARel;
182 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000183 def XSMADDMDP : XX3Form<60, 41,
Hal Finkel19be5062014-03-29 05:29:01 +0000184 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000185 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000186 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
187 AltVSXFMARel;
188 }
Hal Finkel27774d92014-03-13 07:58:58 +0000189
Hal Finkel25e04542014-03-25 18:55:11 +0000190 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000191 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000192 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000193 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000194 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
195 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000196 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
197 AltVSXFMARel;
198 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000199 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000200 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000201 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000202 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
203 AltVSXFMARel;
204 }
Hal Finkel27774d92014-03-13 07:58:58 +0000205
Hal Finkel25e04542014-03-25 18:55:11 +0000206 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000207 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000208 def XSNMADDADP : XX3Form<60, 161,
Hal Finkel19be5062014-03-29 05:29:01 +0000209 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000210 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
211 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000212 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
213 AltVSXFMARel;
214 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000215 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000216 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000217 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000218 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
219 AltVSXFMARel;
220 }
Hal Finkel27774d92014-03-13 07:58:58 +0000221
Hal Finkel25e04542014-03-25 18:55:11 +0000222 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000223 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000224 def XSNMSUBADP : XX3Form<60, 177,
Hal Finkel19be5062014-03-29 05:29:01 +0000225 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000226 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
227 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000228 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
229 AltVSXFMARel;
230 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000231 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000232 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000233 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000234 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
235 AltVSXFMARel;
236 }
Hal Finkel27774d92014-03-13 07:58:58 +0000237
Hal Finkel25e04542014-03-25 18:55:11 +0000238 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000239 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000240 def XVMADDADP : XX3Form<60, 97,
241 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
242 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
243 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000244 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
245 AltVSXFMARel;
246 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000247 def XVMADDMDP : XX3Form<60, 105,
248 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
249 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000250 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
251 AltVSXFMARel;
252 }
Hal Finkel27774d92014-03-13 07:58:58 +0000253
Hal Finkel25e04542014-03-25 18:55:11 +0000254 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000255 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000256 def XVMADDASP : XX3Form<60, 65,
257 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
258 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
259 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000260 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
261 AltVSXFMARel;
262 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000263 def XVMADDMSP : XX3Form<60, 73,
264 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
265 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000266 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
267 AltVSXFMARel;
268 }
Hal Finkel27774d92014-03-13 07:58:58 +0000269
Hal Finkel25e04542014-03-25 18:55:11 +0000270 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000271 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000272 def XVMSUBADP : XX3Form<60, 113,
273 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
274 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
275 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000276 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
277 AltVSXFMARel;
278 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000279 def XVMSUBMDP : XX3Form<60, 121,
280 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
281 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000282 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
283 AltVSXFMARel;
284 }
Hal Finkel27774d92014-03-13 07:58:58 +0000285
Hal Finkel25e04542014-03-25 18:55:11 +0000286 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000287 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000288 def XVMSUBASP : XX3Form<60, 81,
289 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
290 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
291 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000292 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
293 AltVSXFMARel;
294 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000295 def XVMSUBMSP : XX3Form<60, 89,
296 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
297 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000298 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
299 AltVSXFMARel;
300 }
Hal Finkel27774d92014-03-13 07:58:58 +0000301
Hal Finkel25e04542014-03-25 18:55:11 +0000302 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000303 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000304 def XVNMADDADP : XX3Form<60, 225,
305 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
306 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
307 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000308 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
309 AltVSXFMARel;
310 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000311 def XVNMADDMDP : XX3Form<60, 233,
312 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
313 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000314 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
315 AltVSXFMARel;
316 }
Hal Finkel27774d92014-03-13 07:58:58 +0000317
Hal Finkel25e04542014-03-25 18:55:11 +0000318 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000319 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000320 def XVNMADDASP : XX3Form<60, 193,
321 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
322 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
323 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000324 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
325 AltVSXFMARel;
326 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000327 def XVNMADDMSP : XX3Form<60, 201,
328 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
329 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000330 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
331 AltVSXFMARel;
332 }
Hal Finkel27774d92014-03-13 07:58:58 +0000333
Hal Finkel25e04542014-03-25 18:55:11 +0000334 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000335 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000336 def XVNMSUBADP : XX3Form<60, 241,
337 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
338 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
339 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000340 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
341 AltVSXFMARel;
342 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000343 def XVNMSUBMDP : XX3Form<60, 249,
344 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
345 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000346 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
347 AltVSXFMARel;
348 }
Hal Finkel27774d92014-03-13 07:58:58 +0000349
Hal Finkel25e04542014-03-25 18:55:11 +0000350 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000351 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000352 def XVNMSUBASP : XX3Form<60, 209,
353 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
354 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
355 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000356 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
357 AltVSXFMARel;
358 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000359 def XVNMSUBMSP : XX3Form<60, 217,
360 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
361 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000362 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
363 AltVSXFMARel;
364 }
Hal Finkel27774d92014-03-13 07:58:58 +0000365
366 // Division Instructions
367 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000368 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000369 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000370 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
371 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000372 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000373 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000374 [(set f64:$XT, (fsqrt f64:$XB))]>;
375
376 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000377 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000378 "xsredp $XT, $XB", IIC_VecFP,
379 [(set f64:$XT, (PPCfre f64:$XB))]>;
380 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000381 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000382 "xsrsqrtedp $XT, $XB", IIC_VecFP,
383 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
384
385 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000386 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000387 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000388 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000389 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000390 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000391
392 def XVDIVDP : XX3Form<60, 120,
393 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000394 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000395 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
396 def XVDIVSP : XX3Form<60, 88,
397 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000398 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000399 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
400
401 def XVSQRTDP : XX2Form<60, 203,
402 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000403 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000404 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
405 def XVSQRTSP : XX2Form<60, 139,
406 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000407 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000408 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
409
410 def XVTDIVDP : XX3Form_1<60, 125,
411 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000412 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000413 def XVTDIVSP : XX3Form_1<60, 93,
414 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000415 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000416
417 def XVTSQRTDP : XX2Form_1<60, 234,
418 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000419 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000420 def XVTSQRTSP : XX2Form_1<60, 170,
421 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000422 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000423
424 def XVREDP : XX2Form<60, 218,
425 (outs vsrc:$XT), (ins vsrc:$XB),
426 "xvredp $XT, $XB", IIC_VecFP,
427 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
428 def XVRESP : XX2Form<60, 154,
429 (outs vsrc:$XT), (ins vsrc:$XB),
430 "xvresp $XT, $XB", IIC_VecFP,
431 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
432
433 def XVRSQRTEDP : XX2Form<60, 202,
434 (outs vsrc:$XT), (ins vsrc:$XB),
435 "xvrsqrtedp $XT, $XB", IIC_VecFP,
436 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
437 def XVRSQRTESP : XX2Form<60, 138,
438 (outs vsrc:$XT), (ins vsrc:$XB),
439 "xvrsqrtesp $XT, $XB", IIC_VecFP,
440 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
441
442 // Compare Instructions
443 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000444 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000445 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000446 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000447 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000448 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000449
450 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
451 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
452 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
453 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
454 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
455 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
456 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
457 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
458 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
459 defm XVCMPGESP : XX3Form_Rcr<60, 83,
460 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
461 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
462 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
463 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
464 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
465 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
466 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
467 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
468
469 // Move Instructions
470 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000471 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000472 "xsabsdp $XT, $XB", IIC_VecFP,
473 [(set f64:$XT, (fabs f64:$XB))]>;
474 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000475 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000476 "xsnabsdp $XT, $XB", IIC_VecFP,
477 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
478 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000479 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000480 "xsnegdp $XT, $XB", IIC_VecFP,
481 [(set f64:$XT, (fneg f64:$XB))]>;
482 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000483 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000484 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
485 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
486
487 def XVABSDP : XX2Form<60, 473,
488 (outs vsrc:$XT), (ins vsrc:$XB),
489 "xvabsdp $XT, $XB", IIC_VecFP,
490 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
491
492 def XVABSSP : XX2Form<60, 409,
493 (outs vsrc:$XT), (ins vsrc:$XB),
494 "xvabssp $XT, $XB", IIC_VecFP,
495 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
496
497 def XVCPSGNDP : XX3Form<60, 240,
498 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
499 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
500 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
501 def XVCPSGNSP : XX3Form<60, 208,
502 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
503 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
504 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
505
506 def XVNABSDP : XX2Form<60, 489,
507 (outs vsrc:$XT), (ins vsrc:$XB),
508 "xvnabsdp $XT, $XB", IIC_VecFP,
509 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
510 def XVNABSSP : XX2Form<60, 425,
511 (outs vsrc:$XT), (ins vsrc:$XB),
512 "xvnabssp $XT, $XB", IIC_VecFP,
513 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
514
515 def XVNEGDP : XX2Form<60, 505,
516 (outs vsrc:$XT), (ins vsrc:$XB),
517 "xvnegdp $XT, $XB", IIC_VecFP,
518 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
519 def XVNEGSP : XX2Form<60, 441,
520 (outs vsrc:$XT), (ins vsrc:$XB),
521 "xvnegsp $XT, $XB", IIC_VecFP,
522 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
523
524 // Conversion Instructions
525 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000526 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000527 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
528 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000529 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000530 "xscvdpsxds $XT, $XB", IIC_VecFP,
531 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000532 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000533 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000534 "xscvdpsxws $XT, $XB", IIC_VecFP,
535 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000536 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000537 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000538 "xscvdpuxds $XT, $XB", IIC_VecFP,
539 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000540 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000541 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000542 "xscvdpuxws $XT, $XB", IIC_VecFP,
543 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000544 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000545 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000546 "xscvspdp $XT, $XB", IIC_VecFP, []>;
547 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000548 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000549 "xscvsxddp $XT, $XB", IIC_VecFP,
550 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000551 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000552 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000553 "xscvuxddp $XT, $XB", IIC_VecFP,
554 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000555
556 def XVCVDPSP : XX2Form<60, 393,
557 (outs vsrc:$XT), (ins vsrc:$XB),
558 "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
559 def XVCVDPSXDS : XX2Form<60, 472,
560 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000561 "xvcvdpsxds $XT, $XB", IIC_VecFP,
562 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000563 def XVCVDPSXWS : XX2Form<60, 216,
564 (outs vsrc:$XT), (ins vsrc:$XB),
565 "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
566 def XVCVDPUXDS : XX2Form<60, 456,
567 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000568 "xvcvdpuxds $XT, $XB", IIC_VecFP,
569 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000570 def XVCVDPUXWS : XX2Form<60, 200,
571 (outs vsrc:$XT), (ins vsrc:$XB),
572 "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
573
574 def XVCVSPDP : XX2Form<60, 457,
575 (outs vsrc:$XT), (ins vsrc:$XB),
576 "xvcvspdp $XT, $XB", IIC_VecFP, []>;
577 def XVCVSPSXDS : XX2Form<60, 408,
578 (outs vsrc:$XT), (ins vsrc:$XB),
579 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
580 def XVCVSPSXWS : XX2Form<60, 152,
581 (outs vsrc:$XT), (ins vsrc:$XB),
582 "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
583 def XVCVSPUXDS : XX2Form<60, 392,
584 (outs vsrc:$XT), (ins vsrc:$XB),
585 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
586 def XVCVSPUXWS : XX2Form<60, 136,
587 (outs vsrc:$XT), (ins vsrc:$XB),
588 "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
589 def XVCVSXDDP : XX2Form<60, 504,
590 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000591 "xvcvsxddp $XT, $XB", IIC_VecFP,
592 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000593 def XVCVSXDSP : XX2Form<60, 440,
594 (outs vsrc:$XT), (ins vsrc:$XB),
595 "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
596 def XVCVSXWDP : XX2Form<60, 248,
597 (outs vsrc:$XT), (ins vsrc:$XB),
598 "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
599 def XVCVSXWSP : XX2Form<60, 184,
600 (outs vsrc:$XT), (ins vsrc:$XB),
601 "xvcvsxwsp $XT, $XB", IIC_VecFP, []>;
602 def XVCVUXDDP : XX2Form<60, 488,
603 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000604 "xvcvuxddp $XT, $XB", IIC_VecFP,
605 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000606 def XVCVUXDSP : XX2Form<60, 424,
607 (outs vsrc:$XT), (ins vsrc:$XB),
608 "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
609 def XVCVUXWDP : XX2Form<60, 232,
610 (outs vsrc:$XT), (ins vsrc:$XB),
611 "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
612 def XVCVUXWSP : XX2Form<60, 168,
613 (outs vsrc:$XT), (ins vsrc:$XB),
614 "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
615
616 // Rounding Instructions
617 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000618 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000619 "xsrdpi $XT, $XB", IIC_VecFP,
620 [(set f64:$XT, (frnd f64:$XB))]>;
621 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000622 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000623 "xsrdpic $XT, $XB", IIC_VecFP,
624 [(set f64:$XT, (fnearbyint f64:$XB))]>;
625 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000626 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000627 "xsrdpim $XT, $XB", IIC_VecFP,
628 [(set f64:$XT, (ffloor f64:$XB))]>;
629 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000630 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000631 "xsrdpip $XT, $XB", IIC_VecFP,
632 [(set f64:$XT, (fceil f64:$XB))]>;
633 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000634 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000635 "xsrdpiz $XT, $XB", IIC_VecFP,
636 [(set f64:$XT, (ftrunc f64:$XB))]>;
637
638 def XVRDPI : XX2Form<60, 201,
639 (outs vsrc:$XT), (ins vsrc:$XB),
640 "xvrdpi $XT, $XB", IIC_VecFP,
641 [(set v2f64:$XT, (frnd v2f64:$XB))]>;
642 def XVRDPIC : XX2Form<60, 235,
643 (outs vsrc:$XT), (ins vsrc:$XB),
644 "xvrdpic $XT, $XB", IIC_VecFP,
645 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
646 def XVRDPIM : XX2Form<60, 249,
647 (outs vsrc:$XT), (ins vsrc:$XB),
648 "xvrdpim $XT, $XB", IIC_VecFP,
649 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
650 def XVRDPIP : XX2Form<60, 233,
651 (outs vsrc:$XT), (ins vsrc:$XB),
652 "xvrdpip $XT, $XB", IIC_VecFP,
653 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
654 def XVRDPIZ : XX2Form<60, 217,
655 (outs vsrc:$XT), (ins vsrc:$XB),
656 "xvrdpiz $XT, $XB", IIC_VecFP,
657 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
658
659 def XVRSPI : XX2Form<60, 137,
660 (outs vsrc:$XT), (ins vsrc:$XB),
661 "xvrspi $XT, $XB", IIC_VecFP,
662 [(set v4f32:$XT, (frnd v4f32:$XB))]>;
663 def XVRSPIC : XX2Form<60, 171,
664 (outs vsrc:$XT), (ins vsrc:$XB),
665 "xvrspic $XT, $XB", IIC_VecFP,
666 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
667 def XVRSPIM : XX2Form<60, 185,
668 (outs vsrc:$XT), (ins vsrc:$XB),
669 "xvrspim $XT, $XB", IIC_VecFP,
670 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
671 def XVRSPIP : XX2Form<60, 169,
672 (outs vsrc:$XT), (ins vsrc:$XB),
673 "xvrspip $XT, $XB", IIC_VecFP,
674 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
675 def XVRSPIZ : XX2Form<60, 153,
676 (outs vsrc:$XT), (ins vsrc:$XB),
677 "xvrspiz $XT, $XB", IIC_VecFP,
678 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
679
680 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000681 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000682 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000683 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000684 "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
685 [(set vsfrc:$XT,
686 (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000687 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000688 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000689 "xsmindp $XT, $XA, $XB", IIC_VecFP,
690 [(set vsfrc:$XT,
691 (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000692
693 def XVMAXDP : XX3Form<60, 224,
694 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000695 "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
696 [(set vsrc:$XT,
697 (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000698 def XVMINDP : XX3Form<60, 232,
699 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000700 "xvmindp $XT, $XA, $XB", IIC_VecFP,
701 [(set vsrc:$XT,
702 (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000703
704 def XVMAXSP : XX3Form<60, 192,
705 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000706 "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
707 [(set vsrc:$XT,
708 (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000709 def XVMINSP : XX3Form<60, 200,
710 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000711 "xvminsp $XT, $XA, $XB", IIC_VecFP,
712 [(set vsrc:$XT,
713 (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000714 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000715} // Uses = [RM]
716
717 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000718 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000719 def XXLAND : XX3Form<60, 130,
720 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000721 "xxland $XT, $XA, $XB", IIC_VecGeneral,
722 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000723 def XXLANDC : XX3Form<60, 138,
724 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000725 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
726 [(set v4i32:$XT, (and v4i32:$XA,
727 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000728 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000729 def XXLNOR : XX3Form<60, 162,
730 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000731 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
732 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
733 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000734 def XXLOR : XX3Form<60, 146,
735 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000736 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
737 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000738 let isCodeGenOnly = 1 in
739 def XXLORf: XX3Form<60, 146,
740 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
741 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000742 def XXLXOR : XX3Form<60, 154,
743 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000744 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
745 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000746 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000747
748 // Permutation Instructions
749 def XXMRGHW : XX3Form<60, 18,
750 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
751 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
752 def XXMRGLW : XX3Form<60, 50,
753 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
754 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
755
756 def XXPERMDI : XX3Form_2<60, 10,
757 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
758 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
759 def XXSEL : XX4Form<60, 3,
760 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
761 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
762
763 def XXSLDWI : XX3Form_2<60, 2,
764 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
765 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, []>;
766 def XXSPLTW : XX2Form_2<60, 164,
767 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
768 "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
Craig Topperc50d64b2014-11-26 00:46:26 +0000769} // hasSideEffects
Hal Finkel27774d92014-03-13 07:58:58 +0000770
Bill Schmidt61e65232014-10-22 13:13:40 +0000771// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
772// instruction selection into a branch sequence.
773let usesCustomInserter = 1, // Expanded after instruction selection.
774 PPC970_Single = 1 in {
775
776 def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
777 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
778 "#SELECT_CC_VSRC",
779 []>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000780 def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
781 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
782 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000783 [(set v2f64:$dst,
784 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000785 def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
786 (ins crrc:$cond, f8rc:$T, f8rc:$F,
787 i32imm:$BROPC), "#SELECT_CC_VSFRC",
788 []>;
789 def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
790 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
791 "#SELECT_VSFRC",
792 [(set f64:$dst,
793 (select i1:$cond, f64:$T, f64:$F))]>;
794} // usesCustomInserter
795} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000796
Hal Finkel27774d92014-03-13 07:58:58 +0000797def : InstAlias<"xvmovdp $XT, $XB",
798 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
799def : InstAlias<"xvmovsp $XT, $XB",
800 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
801
802def : InstAlias<"xxspltd $XT, $XB, 0",
803 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
804def : InstAlias<"xxspltd $XT, $XB, 1",
805 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
806def : InstAlias<"xxmrghd $XT, $XA, $XB",
807 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
808def : InstAlias<"xxmrgld $XT, $XA, $XB",
809 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
810def : InstAlias<"xxswapd $XT, $XB",
811 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
812
813let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000814
815let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000816def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000817 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000818
819def : Pat<(f64 (vector_extract v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000820 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000821def : Pat<(f64 (vector_extract v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000822 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000823}
824
825let Predicates = [IsLittleEndian] in {
826def : Pat<(v2f64 (scalar_to_vector f64:$A)),
827 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
828 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
829
830def : Pat<(f64 (vector_extract v2f64:$S, 0)),
831 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
832def : Pat<(f64 (vector_extract v2f64:$S, 1)),
833 (f64 (EXTRACT_SUBREG $S, sub_64))>;
834}
Hal Finkel27774d92014-03-13 07:58:58 +0000835
836// Additional fnmsub patterns: -a*c + b == -(a*c - b)
837def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
838 (XSNMSUBADP $B, $C, $A)>;
839def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
840 (XSNMSUBADP $B, $C, $A)>;
841
842def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
843 (XVNMSUBADP $B, $C, $A)>;
844def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
845 (XVNMSUBADP $B, $C, $A)>;
846
847def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
848 (XVNMSUBASP $B, $C, $A)>;
849def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
850 (XVNMSUBASP $B, $C, $A)>;
851
Hal Finkel9e0baa62014-04-01 19:24:27 +0000852def : Pat<(v2f64 (bitconvert v4f32:$A)),
853 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000854def : Pat<(v2f64 (bitconvert v4i32:$A)),
855 (COPY_TO_REGCLASS $A, VSRC)>;
856def : Pat<(v2f64 (bitconvert v8i16:$A)),
857 (COPY_TO_REGCLASS $A, VSRC)>;
858def : Pat<(v2f64 (bitconvert v16i8:$A)),
859 (COPY_TO_REGCLASS $A, VSRC)>;
860
Hal Finkel9e0baa62014-04-01 19:24:27 +0000861def : Pat<(v4f32 (bitconvert v2f64:$A)),
862 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000863def : Pat<(v4i32 (bitconvert v2f64:$A)),
864 (COPY_TO_REGCLASS $A, VRRC)>;
865def : Pat<(v8i16 (bitconvert v2f64:$A)),
866 (COPY_TO_REGCLASS $A, VRRC)>;
867def : Pat<(v16i8 (bitconvert v2f64:$A)),
868 (COPY_TO_REGCLASS $A, VRRC)>;
869
Hal Finkel9e0baa62014-04-01 19:24:27 +0000870def : Pat<(v2i64 (bitconvert v4f32:$A)),
871 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000872def : Pat<(v2i64 (bitconvert v4i32:$A)),
873 (COPY_TO_REGCLASS $A, VSRC)>;
874def : Pat<(v2i64 (bitconvert v8i16:$A)),
875 (COPY_TO_REGCLASS $A, VSRC)>;
876def : Pat<(v2i64 (bitconvert v16i8:$A)),
877 (COPY_TO_REGCLASS $A, VSRC)>;
878
Hal Finkel9e0baa62014-04-01 19:24:27 +0000879def : Pat<(v4f32 (bitconvert v2i64:$A)),
880 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000881def : Pat<(v4i32 (bitconvert v2i64:$A)),
882 (COPY_TO_REGCLASS $A, VRRC)>;
883def : Pat<(v8i16 (bitconvert v2i64:$A)),
884 (COPY_TO_REGCLASS $A, VRRC)>;
885def : Pat<(v16i8 (bitconvert v2i64:$A)),
886 (COPY_TO_REGCLASS $A, VRRC)>;
887
Hal Finkel9281c9a2014-03-26 18:26:30 +0000888def : Pat<(v2f64 (bitconvert v2i64:$A)),
889 (COPY_TO_REGCLASS $A, VRRC)>;
890def : Pat<(v2i64 (bitconvert v2f64:$A)),
891 (COPY_TO_REGCLASS $A, VRRC)>;
892
Hal Finkel5c0d1452014-03-30 13:22:59 +0000893// sign extension patterns
894// To extend "in place" from v2i32 to v2i64, we have input data like:
895// | undef | i32 | undef | i32 |
896// but xvcvsxwdp expects the input in big-Endian format:
897// | i32 | undef | i32 | undef |
898// so we need to shift everything to the left by one i32 (word) before
899// the conversion.
900def : Pat<(sext_inreg v2i64:$C, v2i32),
901 (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
902def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
903 (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
904
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000905// Loads.
Bill Schmidt72954782014-11-12 04:19:40 +0000906def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
907def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000908def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000909def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000910
911// Stores.
Hal Finkele3d2b202015-02-01 19:07:41 +0000912def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
913 (STXVD2X $rS, xoaddr:$dst)>;
Bill Schmidt72954782014-11-12 04:19:40 +0000914def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
Hal Finkele3d2b202015-02-01 19:07:41 +0000915def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
916 (STXVW4X $rS, xoaddr:$dst)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000917def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
918
919// Permutes.
920def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
921def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
922def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
923def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000924
Bill Schmidt61e65232014-10-22 13:13:40 +0000925// Selects.
926def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
927 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
928def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
929 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
930def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
931 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
932def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
933 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
934def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
935 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
936def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
937 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
938
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000939def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
940 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
941def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
942 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
943def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
944 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
945def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
946 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
947def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
948 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
949def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
950 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
951
Bill Schmidt76746922014-11-14 12:10:40 +0000952// Divides.
953def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
954 (XVDIVSP $A, $B)>;
955def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
956 (XVDIVDP $A, $B)>;
957
Hal Finkel27774d92014-03-13 07:58:58 +0000958} // AddedComplexity
959} // HasVSX
960
Kit Barton298beb52015-02-18 16:21:46 +0000961// The following VSX instructions were introduced in Power ISA 2.07
962/* FIXME: if the operands are v2i64, these patterns will not match.
963 we should define new patterns or otherwise match the same patterns
964 when the elements are larger than i32.
965*/
966def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +0000967def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Kit Barton298beb52015-02-18 16:21:46 +0000968let Predicates = [HasP8Vector] in {
969let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
970let isCommutable = 1 in {
971 def XXLEQV : XX3Form<60, 186,
972 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
973 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
974 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
975 def XXLNAND : XX3Form<60, 178,
976 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
977 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
978 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
979 v4i32:$XB)))]>;
980 } // isCommutable
981def XXLORC : XX3Form<60, 170,
982 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
983 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
984 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
985} // AddedComplexity = 500
986} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +0000987
988let Predicates = [HasDirectMove, HasVSX] in {
989// VSX direct move instructions
990def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
991 "mfvsrd $rA, $XT", IIC_VecGeneral,
992 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
993 Requires<[In64BitMode]>;
994def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
995 "mfvsrwz $rA, $XT", IIC_VecGeneral,
996 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
997def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
998 "mtvsrd $XT, $rA", IIC_VecGeneral,
999 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1000 Requires<[In64BitMode]>;
1001def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1002 "mtvsrwa $XT, $rA", IIC_VecGeneral,
1003 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1004def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1005 "mtvsrwz $XT, $rA", IIC_VecGeneral,
1006 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
1007} // HasDirectMove, HasVSX