blob: a98e58f18ca6ecfda118e88c5915f0b763dbf6f2 [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
14def PPCRegVSRCAsmOperand : AsmOperandClass {
15 let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
16}
17def vsrc : RegisterOperand<VSRC> {
18 let ParserMatchClass = PPCRegVSRCAsmOperand;
19}
20
Hal Finkel19be5062014-03-29 05:29:01 +000021def PPCRegVSFRCAsmOperand : AsmOperandClass {
22 let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber";
23}
24def vsfrc : RegisterOperand<VSFRC> {
25 let ParserMatchClass = PPCRegVSFRCAsmOperand;
26}
27
Bill Schmidtfae5d712014-12-09 16:35:51 +000028// Little-endian-specific nodes.
29def SDT_PPClxvd2x : SDTypeProfile<1, 1, [
30 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
31]>;
32def SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
33 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
34]>;
35def SDT_PPCxxswapd : SDTypeProfile<1, 1, [
36 SDTCisSameAs<0, 1>
37]>;
38
39def PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
40 [SDNPHasChain, SDNPMayLoad]>;
41def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
42 [SDNPHasChain, SDNPMayStore]>;
43def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +000044def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
45def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
46def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000047
Hal Finkel27774d92014-03-13 07:58:58 +000048multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, dag OOL, dag IOL,
49 string asmbase, string asmstr, InstrItinClass itin,
50 list<dag> pattern> {
51 let BaseName = asmbase in {
52 def NAME : XX3Form_Rc<opcode, xo, OOL, IOL,
53 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
54 pattern>;
55 let Defs = [CR6] in
56 def o : XX3Form_Rc<opcode, xo, OOL, IOL,
57 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
58 []>, isDOT;
59 }
60}
61
Eric Christopher1b8e7632014-05-22 01:07:24 +000062def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +000063def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
64def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
65
Hal Finkel27774d92014-03-13 07:58:58 +000066let Predicates = [HasVSX] in {
67let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Craig Topperc50d64b2014-11-26 00:46:26 +000068let hasSideEffects = 0 in { // VSX instructions don't have side effects.
Hal Finkel27774d92014-03-13 07:58:58 +000069let Uses = [RM] in {
70
71 // Load indexed instructions
Hal Finkel6a778fb2015-03-11 23:28:38 +000072 let mayLoad = 1 in {
Bill Schmidtcb34fd02014-10-09 17:51:35 +000073 def LXSDX : XX1Form<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +000074 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +000075 "lxsdx $XT, $src", IIC_LdStLFD,
76 [(set f64:$XT, (load xoaddr:$src))]>;
77
Bill Schmidtcb34fd02014-10-09 17:51:35 +000078 def LXVD2X : XX1Form<31, 844,
Hal Finkel27774d92014-03-13 07:58:58 +000079 (outs vsrc:$XT), (ins memrr:$src),
80 "lxvd2x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +000081 [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000082
Bill Schmidtcb34fd02014-10-09 17:51:35 +000083 def LXVDSX : XX1Form<31, 332,
Hal Finkel27774d92014-03-13 07:58:58 +000084 (outs vsrc:$XT), (ins memrr:$src),
85 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +000086
Bill Schmidtcb34fd02014-10-09 17:51:35 +000087 def LXVW4X : XX1Form<31, 780,
Hal Finkel27774d92014-03-13 07:58:58 +000088 (outs vsrc:$XT), (ins memrr:$src),
Bill Schmidt2d1128a2014-10-17 15:13:38 +000089 "lxvw4x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +000090 [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000091 }
92
93 // Store indexed instructions
94 let mayStore = 1 in {
95 def STXSDX : XX1Form<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +000096 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +000097 "stxsdx $XT, $dst", IIC_LdStSTFD,
98 [(store f64:$XT, xoaddr:$dst)]>;
99
100 def STXVD2X : XX1Form<31, 972,
101 (outs), (ins vsrc:$XT, memrr:$dst),
102 "stxvd2x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000103 [(store v2f64:$XT, xoaddr:$dst)]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000104
105 def STXVW4X : XX1Form<31, 908,
106 (outs), (ins vsrc:$XT, memrr:$dst),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000107 "stxvw4x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000108 [(store v4i32:$XT, xoaddr:$dst)]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000109 }
110
111 // Add/Mul Instructions
112 let isCommutable = 1 in {
113 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +0000114 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000115 "xsadddp $XT, $XA, $XB", IIC_VecFP,
116 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
117 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +0000118 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000119 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
120 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
121
122 def XVADDDP : XX3Form<60, 96,
123 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
124 "xvadddp $XT, $XA, $XB", IIC_VecFP,
125 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
126
127 def XVADDSP : XX3Form<60, 64,
128 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
129 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
130 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
131
132 def XVMULDP : XX3Form<60, 112,
133 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
134 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
135 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
136
137 def XVMULSP : XX3Form<60, 80,
138 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
139 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
140 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
141 }
142
143 // Subtract Instructions
144 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000145 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000146 "xssubdp $XT, $XA, $XB", IIC_VecFP,
147 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
148
149 def XVSUBDP : XX3Form<60, 104,
150 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
151 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
152 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
153 def XVSUBSP : XX3Form<60, 72,
154 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
155 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
156 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
157
158 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000159 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000160 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000161 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000162 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000163 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
164 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000165 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
166 AltVSXFMARel;
167 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000168 def XSMADDMDP : XX3Form<60, 41,
Hal Finkel19be5062014-03-29 05:29:01 +0000169 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000170 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000171 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
172 AltVSXFMARel;
173 }
Hal Finkel27774d92014-03-13 07:58:58 +0000174
Hal Finkel25e04542014-03-25 18:55:11 +0000175 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000176 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000177 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000178 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000179 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
180 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000181 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
182 AltVSXFMARel;
183 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000184 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000185 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000186 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000187 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
188 AltVSXFMARel;
189 }
Hal Finkel27774d92014-03-13 07:58:58 +0000190
Hal Finkel25e04542014-03-25 18:55:11 +0000191 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000192 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000193 def XSNMADDADP : XX3Form<60, 161,
Hal Finkel19be5062014-03-29 05:29:01 +0000194 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000195 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
196 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000197 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
198 AltVSXFMARel;
199 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000200 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000201 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000202 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000203 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
204 AltVSXFMARel;
205 }
Hal Finkel27774d92014-03-13 07:58:58 +0000206
Hal Finkel25e04542014-03-25 18:55:11 +0000207 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000208 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000209 def XSNMSUBADP : XX3Form<60, 177,
Hal Finkel19be5062014-03-29 05:29:01 +0000210 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000211 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
212 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000213 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
214 AltVSXFMARel;
215 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000216 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000217 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000218 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000219 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
220 AltVSXFMARel;
221 }
Hal Finkel27774d92014-03-13 07:58:58 +0000222
Hal Finkel25e04542014-03-25 18:55:11 +0000223 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000224 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000225 def XVMADDADP : XX3Form<60, 97,
226 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
227 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
228 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000229 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
230 AltVSXFMARel;
231 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000232 def XVMADDMDP : XX3Form<60, 105,
233 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
234 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000235 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
236 AltVSXFMARel;
237 }
Hal Finkel27774d92014-03-13 07:58:58 +0000238
Hal Finkel25e04542014-03-25 18:55:11 +0000239 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000240 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000241 def XVMADDASP : XX3Form<60, 65,
242 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
243 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
244 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000245 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
246 AltVSXFMARel;
247 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000248 def XVMADDMSP : XX3Form<60, 73,
249 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
250 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000251 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
252 AltVSXFMARel;
253 }
Hal Finkel27774d92014-03-13 07:58:58 +0000254
Hal Finkel25e04542014-03-25 18:55:11 +0000255 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000256 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000257 def XVMSUBADP : XX3Form<60, 113,
258 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
259 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
260 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000261 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
262 AltVSXFMARel;
263 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000264 def XVMSUBMDP : XX3Form<60, 121,
265 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
266 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000267 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
268 AltVSXFMARel;
269 }
Hal Finkel27774d92014-03-13 07:58:58 +0000270
Hal Finkel25e04542014-03-25 18:55:11 +0000271 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000272 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000273 def XVMSUBASP : XX3Form<60, 81,
274 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
275 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
276 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000277 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
278 AltVSXFMARel;
279 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000280 def XVMSUBMSP : XX3Form<60, 89,
281 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
282 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000283 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
284 AltVSXFMARel;
285 }
Hal Finkel27774d92014-03-13 07:58:58 +0000286
Hal Finkel25e04542014-03-25 18:55:11 +0000287 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000288 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000289 def XVNMADDADP : XX3Form<60, 225,
290 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
291 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
292 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000293 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
294 AltVSXFMARel;
295 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000296 def XVNMADDMDP : XX3Form<60, 233,
297 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
298 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000299 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
300 AltVSXFMARel;
301 }
Hal Finkel27774d92014-03-13 07:58:58 +0000302
Hal Finkel25e04542014-03-25 18:55:11 +0000303 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000304 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000305 def XVNMADDASP : XX3Form<60, 193,
306 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
307 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
308 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000309 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
310 AltVSXFMARel;
311 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000312 def XVNMADDMSP : XX3Form<60, 201,
313 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
314 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000315 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
316 AltVSXFMARel;
317 }
Hal Finkel27774d92014-03-13 07:58:58 +0000318
Hal Finkel25e04542014-03-25 18:55:11 +0000319 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000320 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000321 def XVNMSUBADP : XX3Form<60, 241,
322 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
323 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
324 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000325 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
326 AltVSXFMARel;
327 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000328 def XVNMSUBMDP : XX3Form<60, 249,
329 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
330 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000331 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
332 AltVSXFMARel;
333 }
Hal Finkel27774d92014-03-13 07:58:58 +0000334
Hal Finkel25e04542014-03-25 18:55:11 +0000335 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000336 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000337 def XVNMSUBASP : XX3Form<60, 209,
338 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
339 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
340 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000341 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
342 AltVSXFMARel;
343 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000344 def XVNMSUBMSP : XX3Form<60, 217,
345 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
346 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000347 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
348 AltVSXFMARel;
349 }
Hal Finkel27774d92014-03-13 07:58:58 +0000350
351 // Division Instructions
352 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000353 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000354 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000355 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
356 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000357 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000358 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000359 [(set f64:$XT, (fsqrt f64:$XB))]>;
360
361 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000362 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000363 "xsredp $XT, $XB", IIC_VecFP,
364 [(set f64:$XT, (PPCfre f64:$XB))]>;
365 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000366 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000367 "xsrsqrtedp $XT, $XB", IIC_VecFP,
368 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
369
370 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000371 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000372 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000373 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000374 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000375 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000376
377 def XVDIVDP : XX3Form<60, 120,
378 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000379 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000380 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
381 def XVDIVSP : XX3Form<60, 88,
382 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000383 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000384 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
385
386 def XVSQRTDP : XX2Form<60, 203,
387 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000388 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000389 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
390 def XVSQRTSP : XX2Form<60, 139,
391 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000392 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000393 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
394
395 def XVTDIVDP : XX3Form_1<60, 125,
396 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000397 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000398 def XVTDIVSP : XX3Form_1<60, 93,
399 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000400 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000401
402 def XVTSQRTDP : XX2Form_1<60, 234,
403 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000404 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000405 def XVTSQRTSP : XX2Form_1<60, 170,
406 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000407 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000408
409 def XVREDP : XX2Form<60, 218,
410 (outs vsrc:$XT), (ins vsrc:$XB),
411 "xvredp $XT, $XB", IIC_VecFP,
412 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
413 def XVRESP : XX2Form<60, 154,
414 (outs vsrc:$XT), (ins vsrc:$XB),
415 "xvresp $XT, $XB", IIC_VecFP,
416 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
417
418 def XVRSQRTEDP : XX2Form<60, 202,
419 (outs vsrc:$XT), (ins vsrc:$XB),
420 "xvrsqrtedp $XT, $XB", IIC_VecFP,
421 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
422 def XVRSQRTESP : XX2Form<60, 138,
423 (outs vsrc:$XT), (ins vsrc:$XB),
424 "xvrsqrtesp $XT, $XB", IIC_VecFP,
425 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
426
427 // Compare Instructions
428 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000429 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000430 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000431 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000432 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000433 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000434
435 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
436 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
437 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
438 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
439 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
440 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
441 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
442 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
443 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
444 defm XVCMPGESP : XX3Form_Rcr<60, 83,
445 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
446 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
447 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
448 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
449 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
450 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
451 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
452 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
453
454 // Move Instructions
455 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000456 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000457 "xsabsdp $XT, $XB", IIC_VecFP,
458 [(set f64:$XT, (fabs f64:$XB))]>;
459 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000460 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000461 "xsnabsdp $XT, $XB", IIC_VecFP,
462 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
463 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000464 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000465 "xsnegdp $XT, $XB", IIC_VecFP,
466 [(set f64:$XT, (fneg f64:$XB))]>;
467 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000468 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000469 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
470 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
471
472 def XVABSDP : XX2Form<60, 473,
473 (outs vsrc:$XT), (ins vsrc:$XB),
474 "xvabsdp $XT, $XB", IIC_VecFP,
475 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
476
477 def XVABSSP : XX2Form<60, 409,
478 (outs vsrc:$XT), (ins vsrc:$XB),
479 "xvabssp $XT, $XB", IIC_VecFP,
480 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
481
482 def XVCPSGNDP : XX3Form<60, 240,
483 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
484 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
485 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
486 def XVCPSGNSP : XX3Form<60, 208,
487 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
488 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
489 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
490
491 def XVNABSDP : XX2Form<60, 489,
492 (outs vsrc:$XT), (ins vsrc:$XB),
493 "xvnabsdp $XT, $XB", IIC_VecFP,
494 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
495 def XVNABSSP : XX2Form<60, 425,
496 (outs vsrc:$XT), (ins vsrc:$XB),
497 "xvnabssp $XT, $XB", IIC_VecFP,
498 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
499
500 def XVNEGDP : XX2Form<60, 505,
501 (outs vsrc:$XT), (ins vsrc:$XB),
502 "xvnegdp $XT, $XB", IIC_VecFP,
503 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
504 def XVNEGSP : XX2Form<60, 441,
505 (outs vsrc:$XT), (ins vsrc:$XB),
506 "xvnegsp $XT, $XB", IIC_VecFP,
507 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
508
509 // Conversion Instructions
510 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000511 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000512 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
513 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000514 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000515 "xscvdpsxds $XT, $XB", IIC_VecFP,
516 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000517 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000518 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000519 "xscvdpsxws $XT, $XB", IIC_VecFP,
520 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000521 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000522 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000523 "xscvdpuxds $XT, $XB", IIC_VecFP,
524 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000525 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000526 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000527 "xscvdpuxws $XT, $XB", IIC_VecFP,
528 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000529 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000530 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000531 "xscvspdp $XT, $XB", IIC_VecFP, []>;
532 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000533 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000534 "xscvsxddp $XT, $XB", IIC_VecFP,
535 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000536 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000537 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000538 "xscvuxddp $XT, $XB", IIC_VecFP,
539 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000540
541 def XVCVDPSP : XX2Form<60, 393,
542 (outs vsrc:$XT), (ins vsrc:$XB),
543 "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
544 def XVCVDPSXDS : XX2Form<60, 472,
545 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000546 "xvcvdpsxds $XT, $XB", IIC_VecFP,
547 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000548 def XVCVDPSXWS : XX2Form<60, 216,
549 (outs vsrc:$XT), (ins vsrc:$XB),
550 "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
551 def XVCVDPUXDS : XX2Form<60, 456,
552 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000553 "xvcvdpuxds $XT, $XB", IIC_VecFP,
554 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000555 def XVCVDPUXWS : XX2Form<60, 200,
556 (outs vsrc:$XT), (ins vsrc:$XB),
557 "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
558
559 def XVCVSPDP : XX2Form<60, 457,
560 (outs vsrc:$XT), (ins vsrc:$XB),
561 "xvcvspdp $XT, $XB", IIC_VecFP, []>;
562 def XVCVSPSXDS : XX2Form<60, 408,
563 (outs vsrc:$XT), (ins vsrc:$XB),
564 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
565 def XVCVSPSXWS : XX2Form<60, 152,
566 (outs vsrc:$XT), (ins vsrc:$XB),
567 "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
568 def XVCVSPUXDS : XX2Form<60, 392,
569 (outs vsrc:$XT), (ins vsrc:$XB),
570 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
571 def XVCVSPUXWS : XX2Form<60, 136,
572 (outs vsrc:$XT), (ins vsrc:$XB),
573 "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
574 def XVCVSXDDP : XX2Form<60, 504,
575 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000576 "xvcvsxddp $XT, $XB", IIC_VecFP,
577 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000578 def XVCVSXDSP : XX2Form<60, 440,
579 (outs vsrc:$XT), (ins vsrc:$XB),
580 "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
581 def XVCVSXWDP : XX2Form<60, 248,
582 (outs vsrc:$XT), (ins vsrc:$XB),
583 "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
584 def XVCVSXWSP : XX2Form<60, 184,
585 (outs vsrc:$XT), (ins vsrc:$XB),
586 "xvcvsxwsp $XT, $XB", IIC_VecFP, []>;
587 def XVCVUXDDP : XX2Form<60, 488,
588 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000589 "xvcvuxddp $XT, $XB", IIC_VecFP,
590 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000591 def XVCVUXDSP : XX2Form<60, 424,
592 (outs vsrc:$XT), (ins vsrc:$XB),
593 "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
594 def XVCVUXWDP : XX2Form<60, 232,
595 (outs vsrc:$XT), (ins vsrc:$XB),
596 "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
597 def XVCVUXWSP : XX2Form<60, 168,
598 (outs vsrc:$XT), (ins vsrc:$XB),
599 "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
600
601 // Rounding Instructions
602 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000603 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000604 "xsrdpi $XT, $XB", IIC_VecFP,
605 [(set f64:$XT, (frnd f64:$XB))]>;
606 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000607 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000608 "xsrdpic $XT, $XB", IIC_VecFP,
609 [(set f64:$XT, (fnearbyint f64:$XB))]>;
610 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000611 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000612 "xsrdpim $XT, $XB", IIC_VecFP,
613 [(set f64:$XT, (ffloor f64:$XB))]>;
614 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000615 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000616 "xsrdpip $XT, $XB", IIC_VecFP,
617 [(set f64:$XT, (fceil f64:$XB))]>;
618 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000619 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000620 "xsrdpiz $XT, $XB", IIC_VecFP,
621 [(set f64:$XT, (ftrunc f64:$XB))]>;
622
623 def XVRDPI : XX2Form<60, 201,
624 (outs vsrc:$XT), (ins vsrc:$XB),
625 "xvrdpi $XT, $XB", IIC_VecFP,
626 [(set v2f64:$XT, (frnd v2f64:$XB))]>;
627 def XVRDPIC : XX2Form<60, 235,
628 (outs vsrc:$XT), (ins vsrc:$XB),
629 "xvrdpic $XT, $XB", IIC_VecFP,
630 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
631 def XVRDPIM : XX2Form<60, 249,
632 (outs vsrc:$XT), (ins vsrc:$XB),
633 "xvrdpim $XT, $XB", IIC_VecFP,
634 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
635 def XVRDPIP : XX2Form<60, 233,
636 (outs vsrc:$XT), (ins vsrc:$XB),
637 "xvrdpip $XT, $XB", IIC_VecFP,
638 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
639 def XVRDPIZ : XX2Form<60, 217,
640 (outs vsrc:$XT), (ins vsrc:$XB),
641 "xvrdpiz $XT, $XB", IIC_VecFP,
642 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
643
644 def XVRSPI : XX2Form<60, 137,
645 (outs vsrc:$XT), (ins vsrc:$XB),
646 "xvrspi $XT, $XB", IIC_VecFP,
647 [(set v4f32:$XT, (frnd v4f32:$XB))]>;
648 def XVRSPIC : XX2Form<60, 171,
649 (outs vsrc:$XT), (ins vsrc:$XB),
650 "xvrspic $XT, $XB", IIC_VecFP,
651 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
652 def XVRSPIM : XX2Form<60, 185,
653 (outs vsrc:$XT), (ins vsrc:$XB),
654 "xvrspim $XT, $XB", IIC_VecFP,
655 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
656 def XVRSPIP : XX2Form<60, 169,
657 (outs vsrc:$XT), (ins vsrc:$XB),
658 "xvrspip $XT, $XB", IIC_VecFP,
659 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
660 def XVRSPIZ : XX2Form<60, 153,
661 (outs vsrc:$XT), (ins vsrc:$XB),
662 "xvrspiz $XT, $XB", IIC_VecFP,
663 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
664
665 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000666 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000667 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000668 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000669 "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
670 [(set vsfrc:$XT,
671 (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000672 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000673 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000674 "xsmindp $XT, $XA, $XB", IIC_VecFP,
675 [(set vsfrc:$XT,
676 (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000677
678 def XVMAXDP : XX3Form<60, 224,
679 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000680 "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
681 [(set vsrc:$XT,
682 (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000683 def XVMINDP : XX3Form<60, 232,
684 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000685 "xvmindp $XT, $XA, $XB", IIC_VecFP,
686 [(set vsrc:$XT,
687 (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000688
689 def XVMAXSP : XX3Form<60, 192,
690 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000691 "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
692 [(set vsrc:$XT,
693 (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000694 def XVMINSP : XX3Form<60, 200,
695 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000696 "xvminsp $XT, $XA, $XB", IIC_VecFP,
697 [(set vsrc:$XT,
698 (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000699 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000700} // Uses = [RM]
701
702 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000703 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000704 def XXLAND : XX3Form<60, 130,
705 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000706 "xxland $XT, $XA, $XB", IIC_VecGeneral,
707 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000708 def XXLANDC : XX3Form<60, 138,
709 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000710 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
711 [(set v4i32:$XT, (and v4i32:$XA,
712 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000713 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000714 def XXLNOR : XX3Form<60, 162,
715 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000716 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
717 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
718 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000719 def XXLOR : XX3Form<60, 146,
720 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000721 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
722 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000723 let isCodeGenOnly = 1 in
724 def XXLORf: XX3Form<60, 146,
725 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
726 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000727 def XXLXOR : XX3Form<60, 154,
728 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000729 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
730 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000731 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000732
733 // Permutation Instructions
734 def XXMRGHW : XX3Form<60, 18,
735 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
736 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
737 def XXMRGLW : XX3Form<60, 50,
738 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
739 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
740
741 def XXPERMDI : XX3Form_2<60, 10,
742 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
743 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
744 def XXSEL : XX4Form<60, 3,
745 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
746 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
747
748 def XXSLDWI : XX3Form_2<60, 2,
749 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
750 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, []>;
751 def XXSPLTW : XX2Form_2<60, 164,
752 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
753 "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
Craig Topperc50d64b2014-11-26 00:46:26 +0000754} // hasSideEffects
Hal Finkel27774d92014-03-13 07:58:58 +0000755
Bill Schmidt61e65232014-10-22 13:13:40 +0000756// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
757// instruction selection into a branch sequence.
758let usesCustomInserter = 1, // Expanded after instruction selection.
759 PPC970_Single = 1 in {
760
761 def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
762 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
763 "#SELECT_CC_VSRC",
764 []>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000765 def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
766 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
767 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000768 [(set v2f64:$dst,
769 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000770 def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
771 (ins crrc:$cond, f8rc:$T, f8rc:$F,
772 i32imm:$BROPC), "#SELECT_CC_VSFRC",
773 []>;
774 def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
775 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
776 "#SELECT_VSFRC",
777 [(set f64:$dst,
778 (select i1:$cond, f64:$T, f64:$F))]>;
779} // usesCustomInserter
780} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000781
Hal Finkel27774d92014-03-13 07:58:58 +0000782def : InstAlias<"xvmovdp $XT, $XB",
783 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
784def : InstAlias<"xvmovsp $XT, $XB",
785 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
786
787def : InstAlias<"xxspltd $XT, $XB, 0",
788 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
789def : InstAlias<"xxspltd $XT, $XB, 1",
790 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
791def : InstAlias<"xxmrghd $XT, $XA, $XB",
792 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
793def : InstAlias<"xxmrgld $XT, $XA, $XB",
794 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
795def : InstAlias<"xxswapd $XT, $XB",
796 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
797
798let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000799
800let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000801def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000802 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000803
804def : Pat<(f64 (vector_extract v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000805 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000806def : Pat<(f64 (vector_extract v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000807 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000808}
809
810let Predicates = [IsLittleEndian] in {
811def : Pat<(v2f64 (scalar_to_vector f64:$A)),
812 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
813 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
814
815def : Pat<(f64 (vector_extract v2f64:$S, 0)),
816 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
817def : Pat<(f64 (vector_extract v2f64:$S, 1)),
818 (f64 (EXTRACT_SUBREG $S, sub_64))>;
819}
Hal Finkel27774d92014-03-13 07:58:58 +0000820
821// Additional fnmsub patterns: -a*c + b == -(a*c - b)
822def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
823 (XSNMSUBADP $B, $C, $A)>;
824def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
825 (XSNMSUBADP $B, $C, $A)>;
826
827def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
828 (XVNMSUBADP $B, $C, $A)>;
829def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
830 (XVNMSUBADP $B, $C, $A)>;
831
832def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
833 (XVNMSUBASP $B, $C, $A)>;
834def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
835 (XVNMSUBASP $B, $C, $A)>;
836
Hal Finkel9e0baa62014-04-01 19:24:27 +0000837def : Pat<(v2f64 (bitconvert v4f32:$A)),
838 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000839def : Pat<(v2f64 (bitconvert v4i32:$A)),
840 (COPY_TO_REGCLASS $A, VSRC)>;
841def : Pat<(v2f64 (bitconvert v8i16:$A)),
842 (COPY_TO_REGCLASS $A, VSRC)>;
843def : Pat<(v2f64 (bitconvert v16i8:$A)),
844 (COPY_TO_REGCLASS $A, VSRC)>;
845
Hal Finkel9e0baa62014-04-01 19:24:27 +0000846def : Pat<(v4f32 (bitconvert v2f64:$A)),
847 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000848def : Pat<(v4i32 (bitconvert v2f64:$A)),
849 (COPY_TO_REGCLASS $A, VRRC)>;
850def : Pat<(v8i16 (bitconvert v2f64:$A)),
851 (COPY_TO_REGCLASS $A, VRRC)>;
852def : Pat<(v16i8 (bitconvert v2f64:$A)),
853 (COPY_TO_REGCLASS $A, VRRC)>;
854
Hal Finkel9e0baa62014-04-01 19:24:27 +0000855def : Pat<(v2i64 (bitconvert v4f32:$A)),
856 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000857def : Pat<(v2i64 (bitconvert v4i32:$A)),
858 (COPY_TO_REGCLASS $A, VSRC)>;
859def : Pat<(v2i64 (bitconvert v8i16:$A)),
860 (COPY_TO_REGCLASS $A, VSRC)>;
861def : Pat<(v2i64 (bitconvert v16i8:$A)),
862 (COPY_TO_REGCLASS $A, VSRC)>;
863
Hal Finkel9e0baa62014-04-01 19:24:27 +0000864def : Pat<(v4f32 (bitconvert v2i64:$A)),
865 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000866def : Pat<(v4i32 (bitconvert v2i64:$A)),
867 (COPY_TO_REGCLASS $A, VRRC)>;
868def : Pat<(v8i16 (bitconvert v2i64:$A)),
869 (COPY_TO_REGCLASS $A, VRRC)>;
870def : Pat<(v16i8 (bitconvert v2i64:$A)),
871 (COPY_TO_REGCLASS $A, VRRC)>;
872
Hal Finkel9281c9a2014-03-26 18:26:30 +0000873def : Pat<(v2f64 (bitconvert v2i64:$A)),
874 (COPY_TO_REGCLASS $A, VRRC)>;
875def : Pat<(v2i64 (bitconvert v2f64:$A)),
876 (COPY_TO_REGCLASS $A, VRRC)>;
877
Hal Finkel5c0d1452014-03-30 13:22:59 +0000878// sign extension patterns
879// To extend "in place" from v2i32 to v2i64, we have input data like:
880// | undef | i32 | undef | i32 |
881// but xvcvsxwdp expects the input in big-Endian format:
882// | i32 | undef | i32 | undef |
883// so we need to shift everything to the left by one i32 (word) before
884// the conversion.
885def : Pat<(sext_inreg v2i64:$C, v2i32),
886 (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
887def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
888 (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
889
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000890// Loads.
Bill Schmidt72954782014-11-12 04:19:40 +0000891def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
892def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000893def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000894def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000895
896// Stores.
Hal Finkele3d2b202015-02-01 19:07:41 +0000897def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
898 (STXVD2X $rS, xoaddr:$dst)>;
Bill Schmidt72954782014-11-12 04:19:40 +0000899def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
Hal Finkele3d2b202015-02-01 19:07:41 +0000900def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
901 (STXVW4X $rS, xoaddr:$dst)>;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000902def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
903
904// Permutes.
905def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
906def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
907def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
908def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000909
Bill Schmidt61e65232014-10-22 13:13:40 +0000910// Selects.
911def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
912 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
913def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
914 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
915def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
916 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
917def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
918 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
919def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
920 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
921def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
922 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
923
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000924def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
925 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
926def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
927 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
928def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
929 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
930def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
931 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
932def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
933 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
934def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
935 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
936
Bill Schmidt76746922014-11-14 12:10:40 +0000937// Divides.
938def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
939 (XVDIVSP $A, $B)>;
940def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
941 (XVDIVDP $A, $B)>;
942
Hal Finkel27774d92014-03-13 07:58:58 +0000943} // AddedComplexity
944} // HasVSX
945
Kit Barton298beb52015-02-18 16:21:46 +0000946// The following VSX instructions were introduced in Power ISA 2.07
947/* FIXME: if the operands are v2i64, these patterns will not match.
948 we should define new patterns or otherwise match the same patterns
949 when the elements are larger than i32.
950*/
951def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +0000952def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Kit Barton298beb52015-02-18 16:21:46 +0000953let Predicates = [HasP8Vector] in {
954let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
955let isCommutable = 1 in {
956 def XXLEQV : XX3Form<60, 186,
957 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
958 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
959 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
960 def XXLNAND : XX3Form<60, 178,
961 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
962 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
963 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
964 v4i32:$XB)))]>;
965 } // isCommutable
966def XXLORC : XX3Form<60, 170,
967 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
968 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
969 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
970} // AddedComplexity = 500
971} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +0000972
973let Predicates = [HasDirectMove, HasVSX] in {
974// VSX direct move instructions
975def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
976 "mfvsrd $rA, $XT", IIC_VecGeneral,
977 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
978 Requires<[In64BitMode]>;
979def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
980 "mfvsrwz $rA, $XT", IIC_VecGeneral,
981 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
982def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
983 "mtvsrd $XT, $rA", IIC_VecGeneral,
984 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
985 Requires<[In64BitMode]>;
986def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
987 "mtvsrwa $XT, $rA", IIC_VecGeneral,
988 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
989def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
990 "mtvsrwz $XT, $rA", IIC_VecGeneral,
991 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
992} // HasDirectMove, HasVSX