blob: 9fdfacfb0ebbc1f8a0c52303ca00cf2e8de0c73e [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
Hal Finkel27774d92014-03-13 07:58:58 +000028multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, dag OOL, dag IOL,
29 string asmbase, string asmstr, InstrItinClass itin,
30 list<dag> pattern> {
31 let BaseName = asmbase in {
32 def NAME : XX3Form_Rc<opcode, xo, OOL, IOL,
33 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
34 pattern>;
35 let Defs = [CR6] in
36 def o : XX3Form_Rc<opcode, xo, OOL, IOL,
37 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
38 []>, isDOT;
39 }
40}
41
42def HasVSX : Predicate<"PPCSubTarget.hasVSX()">;
43let Predicates = [HasVSX] in {
44let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
45let neverHasSideEffects = 1 in { // VSX instructions don't have side effects.
46let Uses = [RM] in {
47
48 // Load indexed instructions
49 let mayLoad = 1, canFoldAsLoad = 1 in {
50 def LXSDX : XForm_1<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +000051 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +000052 "lxsdx $XT, $src", IIC_LdStLFD,
53 [(set f64:$XT, (load xoaddr:$src))]>;
54
55 def LXVD2X : XForm_1<31, 844,
56 (outs vsrc:$XT), (ins memrr:$src),
57 "lxvd2x $XT, $src", IIC_LdStLFD,
58 [(set v2f64:$XT, (load xoaddr:$src))]>;
59
60 def LXVDSX : XForm_1<31, 332,
61 (outs vsrc:$XT), (ins memrr:$src),
62 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +000063
64 def LXVW4X : XForm_1<31, 780,
65 (outs vsrc:$XT), (ins memrr:$src),
Hal Finkelea76a442014-03-26 18:26:36 +000066 "lxvw4x $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +000067 }
68
69 // Store indexed instructions
70 let mayStore = 1 in {
71 def STXSDX : XX1Form<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +000072 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +000073 "stxsdx $XT, $dst", IIC_LdStSTFD,
74 [(store f64:$XT, xoaddr:$dst)]>;
75
76 def STXVD2X : XX1Form<31, 972,
77 (outs), (ins vsrc:$XT, memrr:$dst),
78 "stxvd2x $XT, $dst", IIC_LdStSTFD,
79 [(store v2f64:$XT, xoaddr:$dst)]>;
80
81 def STXVW4X : XX1Form<31, 908,
82 (outs), (ins vsrc:$XT, memrr:$dst),
Hal Finkelea76a442014-03-26 18:26:36 +000083 "stxvw4x $XT, $dst", IIC_LdStSTFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +000084 }
85
86 // Add/Mul Instructions
87 let isCommutable = 1 in {
88 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +000089 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000090 "xsadddp $XT, $XA, $XB", IIC_VecFP,
91 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
92 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +000093 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000094 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
95 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
96
97 def XVADDDP : XX3Form<60, 96,
98 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
99 "xvadddp $XT, $XA, $XB", IIC_VecFP,
100 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
101
102 def XVADDSP : XX3Form<60, 64,
103 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
104 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
105 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
106
107 def XVMULDP : XX3Form<60, 112,
108 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
109 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
110 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
111
112 def XVMULSP : XX3Form<60, 80,
113 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
114 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
115 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
116 }
117
118 // Subtract Instructions
119 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000120 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000121 "xssubdp $XT, $XA, $XB", IIC_VecFP,
122 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
123
124 def XVSUBDP : XX3Form<60, 104,
125 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
126 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
127 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
128 def XVSUBSP : XX3Form<60, 72,
129 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
130 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
131 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
132
133 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000134 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000135 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000136 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000137 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000138 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
139 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000140 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
141 AltVSXFMARel;
142 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000143 def XSMADDMDP : XX3Form<60, 41,
Hal Finkel19be5062014-03-29 05:29:01 +0000144 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000145 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000146 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
147 AltVSXFMARel;
148 }
Hal Finkel27774d92014-03-13 07:58:58 +0000149
Hal Finkel25e04542014-03-25 18:55:11 +0000150 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000151 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000152 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000153 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000154 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
155 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000156 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
157 AltVSXFMARel;
158 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000159 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000160 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000161 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000162 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
163 AltVSXFMARel;
164 }
Hal Finkel27774d92014-03-13 07:58:58 +0000165
Hal Finkel25e04542014-03-25 18:55:11 +0000166 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000167 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000168 def XSNMADDADP : XX3Form<60, 161,
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 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
171 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000172 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
173 AltVSXFMARel;
174 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000175 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000176 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000177 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000178 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
179 AltVSXFMARel;
180 }
Hal Finkel27774d92014-03-13 07:58:58 +0000181
Hal Finkel25e04542014-03-25 18:55:11 +0000182 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000183 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000184 def XSNMSUBADP : XX3Form<60, 177,
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 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
187 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000188 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
189 AltVSXFMARel;
190 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000191 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000192 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000193 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000194 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
195 AltVSXFMARel;
196 }
Hal Finkel27774d92014-03-13 07:58:58 +0000197
Hal Finkel25e04542014-03-25 18:55:11 +0000198 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000199 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000200 def XVMADDADP : XX3Form<60, 97,
201 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
202 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
203 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000204 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
205 AltVSXFMARel;
206 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000207 def XVMADDMDP : XX3Form<60, 105,
208 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
209 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000210 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
211 AltVSXFMARel;
212 }
Hal Finkel27774d92014-03-13 07:58:58 +0000213
Hal Finkel25e04542014-03-25 18:55:11 +0000214 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000215 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000216 def XVMADDASP : XX3Form<60, 65,
217 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
218 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
219 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000220 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
221 AltVSXFMARel;
222 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000223 def XVMADDMSP : XX3Form<60, 73,
224 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
225 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000226 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
227 AltVSXFMARel;
228 }
Hal Finkel27774d92014-03-13 07:58:58 +0000229
Hal Finkel25e04542014-03-25 18:55:11 +0000230 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000231 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000232 def XVMSUBADP : XX3Form<60, 113,
233 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
234 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
235 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000236 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
237 AltVSXFMARel;
238 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000239 def XVMSUBMDP : XX3Form<60, 121,
240 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
241 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000242 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
243 AltVSXFMARel;
244 }
Hal Finkel27774d92014-03-13 07:58:58 +0000245
Hal Finkel25e04542014-03-25 18:55:11 +0000246 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000247 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000248 def XVMSUBASP : XX3Form<60, 81,
249 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
250 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
251 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000252 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
253 AltVSXFMARel;
254 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000255 def XVMSUBMSP : XX3Form<60, 89,
256 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
257 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000258 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
259 AltVSXFMARel;
260 }
Hal Finkel27774d92014-03-13 07:58:58 +0000261
Hal Finkel25e04542014-03-25 18:55:11 +0000262 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000263 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000264 def XVNMADDADP : XX3Form<60, 225,
265 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
266 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
267 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000268 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
269 AltVSXFMARel;
270 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000271 def XVNMADDMDP : XX3Form<60, 233,
272 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
273 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000274 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
275 AltVSXFMARel;
276 }
Hal Finkel27774d92014-03-13 07:58:58 +0000277
Hal Finkel25e04542014-03-25 18:55:11 +0000278 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000279 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000280 def XVNMADDASP : XX3Form<60, 193,
281 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
282 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
283 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000284 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
285 AltVSXFMARel;
286 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000287 def XVNMADDMSP : XX3Form<60, 201,
288 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
289 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000290 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
291 AltVSXFMARel;
292 }
Hal Finkel27774d92014-03-13 07:58:58 +0000293
Hal Finkel25e04542014-03-25 18:55:11 +0000294 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000295 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000296 def XVNMSUBADP : XX3Form<60, 241,
297 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
298 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
299 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000300 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
301 AltVSXFMARel;
302 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000303 def XVNMSUBMDP : XX3Form<60, 249,
304 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
305 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000306 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
307 AltVSXFMARel;
308 }
Hal Finkel27774d92014-03-13 07:58:58 +0000309
Hal Finkel25e04542014-03-25 18:55:11 +0000310 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000311 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000312 def XVNMSUBASP : XX3Form<60, 209,
313 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
314 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
315 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000316 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
317 AltVSXFMARel;
318 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000319 def XVNMSUBMSP : XX3Form<60, 217,
320 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
321 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000322 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
323 AltVSXFMARel;
324 }
Hal Finkel27774d92014-03-13 07:58:58 +0000325
326 // Division Instructions
327 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000328 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000329 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000330 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
331 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000332 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000333 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000334 [(set f64:$XT, (fsqrt f64:$XB))]>;
335
336 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000337 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000338 "xsredp $XT, $XB", IIC_VecFP,
339 [(set f64:$XT, (PPCfre f64:$XB))]>;
340 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000341 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000342 "xsrsqrtedp $XT, $XB", IIC_VecFP,
343 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
344
345 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000346 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000347 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000348 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000349 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000350 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000351
352 def XVDIVDP : XX3Form<60, 120,
353 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000354 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000355 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
356 def XVDIVSP : XX3Form<60, 88,
357 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000358 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000359 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
360
361 def XVSQRTDP : XX2Form<60, 203,
362 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000363 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000364 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
365 def XVSQRTSP : XX2Form<60, 139,
366 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000367 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000368 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
369
370 def XVTDIVDP : XX3Form_1<60, 125,
371 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000372 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000373 def XVTDIVSP : XX3Form_1<60, 93,
374 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000375 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000376
377 def XVTSQRTDP : XX2Form_1<60, 234,
378 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000379 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000380 def XVTSQRTSP : XX2Form_1<60, 170,
381 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000382 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000383
384 def XVREDP : XX2Form<60, 218,
385 (outs vsrc:$XT), (ins vsrc:$XB),
386 "xvredp $XT, $XB", IIC_VecFP,
387 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
388 def XVRESP : XX2Form<60, 154,
389 (outs vsrc:$XT), (ins vsrc:$XB),
390 "xvresp $XT, $XB", IIC_VecFP,
391 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
392
393 def XVRSQRTEDP : XX2Form<60, 202,
394 (outs vsrc:$XT), (ins vsrc:$XB),
395 "xvrsqrtedp $XT, $XB", IIC_VecFP,
396 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
397 def XVRSQRTESP : XX2Form<60, 138,
398 (outs vsrc:$XT), (ins vsrc:$XB),
399 "xvrsqrtesp $XT, $XB", IIC_VecFP,
400 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
401
402 // Compare Instructions
403 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000404 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000405 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000406 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000407 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000408 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000409
410 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
411 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
412 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
413 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
414 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
415 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
416 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
417 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
418 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
419 defm XVCMPGESP : XX3Form_Rcr<60, 83,
420 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
421 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
422 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
423 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
424 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
425 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
426 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
427 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare, []>;
428
429 // Move Instructions
430 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000431 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000432 "xsabsdp $XT, $XB", IIC_VecFP,
433 [(set f64:$XT, (fabs f64:$XB))]>;
434 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000435 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000436 "xsnabsdp $XT, $XB", IIC_VecFP,
437 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
438 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000439 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000440 "xsnegdp $XT, $XB", IIC_VecFP,
441 [(set f64:$XT, (fneg f64:$XB))]>;
442 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000443 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000444 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
445 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
446
447 def XVABSDP : XX2Form<60, 473,
448 (outs vsrc:$XT), (ins vsrc:$XB),
449 "xvabsdp $XT, $XB", IIC_VecFP,
450 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
451
452 def XVABSSP : XX2Form<60, 409,
453 (outs vsrc:$XT), (ins vsrc:$XB),
454 "xvabssp $XT, $XB", IIC_VecFP,
455 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
456
457 def XVCPSGNDP : XX3Form<60, 240,
458 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
459 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
460 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
461 def XVCPSGNSP : XX3Form<60, 208,
462 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
463 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
464 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
465
466 def XVNABSDP : XX2Form<60, 489,
467 (outs vsrc:$XT), (ins vsrc:$XB),
468 "xvnabsdp $XT, $XB", IIC_VecFP,
469 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
470 def XVNABSSP : XX2Form<60, 425,
471 (outs vsrc:$XT), (ins vsrc:$XB),
472 "xvnabssp $XT, $XB", IIC_VecFP,
473 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
474
475 def XVNEGDP : XX2Form<60, 505,
476 (outs vsrc:$XT), (ins vsrc:$XB),
477 "xvnegdp $XT, $XB", IIC_VecFP,
478 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
479 def XVNEGSP : XX2Form<60, 441,
480 (outs vsrc:$XT), (ins vsrc:$XB),
481 "xvnegsp $XT, $XB", IIC_VecFP,
482 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
483
484 // Conversion Instructions
485 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000486 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000487 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
488 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000489 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000490 "xscvdpsxds $XT, $XB", IIC_VecFP,
491 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000492 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000493 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000494 "xscvdpsxws $XT, $XB", IIC_VecFP,
495 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000496 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000497 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000498 "xscvdpuxds $XT, $XB", IIC_VecFP,
499 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000500 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000501 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000502 "xscvdpuxws $XT, $XB", IIC_VecFP,
503 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000504 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000505 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000506 "xscvspdp $XT, $XB", IIC_VecFP, []>;
507 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000508 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000509 "xscvsxddp $XT, $XB", IIC_VecFP,
510 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000511 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000512 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000513 "xscvuxddp $XT, $XB", IIC_VecFP,
514 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000515
516 def XVCVDPSP : XX2Form<60, 393,
517 (outs vsrc:$XT), (ins vsrc:$XB),
518 "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
519 def XVCVDPSXDS : XX2Form<60, 472,
520 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000521 "xvcvdpsxds $XT, $XB", IIC_VecFP,
522 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000523 def XVCVDPSXWS : XX2Form<60, 216,
524 (outs vsrc:$XT), (ins vsrc:$XB),
525 "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
526 def XVCVDPUXDS : XX2Form<60, 456,
527 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000528 "xvcvdpuxds $XT, $XB", IIC_VecFP,
529 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000530 def XVCVDPUXWS : XX2Form<60, 200,
531 (outs vsrc:$XT), (ins vsrc:$XB),
532 "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
533
534 def XVCVSPDP : XX2Form<60, 457,
535 (outs vsrc:$XT), (ins vsrc:$XB),
536 "xvcvspdp $XT, $XB", IIC_VecFP, []>;
537 def XVCVSPSXDS : XX2Form<60, 408,
538 (outs vsrc:$XT), (ins vsrc:$XB),
539 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
540 def XVCVSPSXWS : XX2Form<60, 152,
541 (outs vsrc:$XT), (ins vsrc:$XB),
542 "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
543 def XVCVSPUXDS : XX2Form<60, 392,
544 (outs vsrc:$XT), (ins vsrc:$XB),
545 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
546 def XVCVSPUXWS : XX2Form<60, 136,
547 (outs vsrc:$XT), (ins vsrc:$XB),
548 "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
549 def XVCVSXDDP : XX2Form<60, 504,
550 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000551 "xvcvsxddp $XT, $XB", IIC_VecFP,
552 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000553 def XVCVSXDSP : XX2Form<60, 440,
554 (outs vsrc:$XT), (ins vsrc:$XB),
555 "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
556 def XVCVSXWDP : XX2Form<60, 248,
557 (outs vsrc:$XT), (ins vsrc:$XB),
558 "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
559 def XVCVSXWSP : XX2Form<60, 184,
560 (outs vsrc:$XT), (ins vsrc:$XB),
561 "xvcvsxwsp $XT, $XB", IIC_VecFP, []>;
562 def XVCVUXDDP : XX2Form<60, 488,
563 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000564 "xvcvuxddp $XT, $XB", IIC_VecFP,
565 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000566 def XVCVUXDSP : XX2Form<60, 424,
567 (outs vsrc:$XT), (ins vsrc:$XB),
568 "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
569 def XVCVUXWDP : XX2Form<60, 232,
570 (outs vsrc:$XT), (ins vsrc:$XB),
571 "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
572 def XVCVUXWSP : XX2Form<60, 168,
573 (outs vsrc:$XT), (ins vsrc:$XB),
574 "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
575
576 // Rounding Instructions
577 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000578 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000579 "xsrdpi $XT, $XB", IIC_VecFP,
580 [(set f64:$XT, (frnd f64:$XB))]>;
581 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000582 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000583 "xsrdpic $XT, $XB", IIC_VecFP,
584 [(set f64:$XT, (fnearbyint f64:$XB))]>;
585 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000586 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000587 "xsrdpim $XT, $XB", IIC_VecFP,
588 [(set f64:$XT, (ffloor f64:$XB))]>;
589 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000590 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000591 "xsrdpip $XT, $XB", IIC_VecFP,
592 [(set f64:$XT, (fceil f64:$XB))]>;
593 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000594 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000595 "xsrdpiz $XT, $XB", IIC_VecFP,
596 [(set f64:$XT, (ftrunc f64:$XB))]>;
597
598 def XVRDPI : XX2Form<60, 201,
599 (outs vsrc:$XT), (ins vsrc:$XB),
600 "xvrdpi $XT, $XB", IIC_VecFP,
601 [(set v2f64:$XT, (frnd v2f64:$XB))]>;
602 def XVRDPIC : XX2Form<60, 235,
603 (outs vsrc:$XT), (ins vsrc:$XB),
604 "xvrdpic $XT, $XB", IIC_VecFP,
605 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
606 def XVRDPIM : XX2Form<60, 249,
607 (outs vsrc:$XT), (ins vsrc:$XB),
608 "xvrdpim $XT, $XB", IIC_VecFP,
609 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
610 def XVRDPIP : XX2Form<60, 233,
611 (outs vsrc:$XT), (ins vsrc:$XB),
612 "xvrdpip $XT, $XB", IIC_VecFP,
613 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
614 def XVRDPIZ : XX2Form<60, 217,
615 (outs vsrc:$XT), (ins vsrc:$XB),
616 "xvrdpiz $XT, $XB", IIC_VecFP,
617 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
618
619 def XVRSPI : XX2Form<60, 137,
620 (outs vsrc:$XT), (ins vsrc:$XB),
621 "xvrspi $XT, $XB", IIC_VecFP,
622 [(set v4f32:$XT, (frnd v4f32:$XB))]>;
623 def XVRSPIC : XX2Form<60, 171,
624 (outs vsrc:$XT), (ins vsrc:$XB),
625 "xvrspic $XT, $XB", IIC_VecFP,
626 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
627 def XVRSPIM : XX2Form<60, 185,
628 (outs vsrc:$XT), (ins vsrc:$XB),
629 "xvrspim $XT, $XB", IIC_VecFP,
630 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
631 def XVRSPIP : XX2Form<60, 169,
632 (outs vsrc:$XT), (ins vsrc:$XB),
633 "xvrspip $XT, $XB", IIC_VecFP,
634 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
635 def XVRSPIZ : XX2Form<60, 153,
636 (outs vsrc:$XT), (ins vsrc:$XB),
637 "xvrspiz $XT, $XB", IIC_VecFP,
638 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
639
640 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000641 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000642 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000643 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000644 "xsmaxdp $XT, $XA, $XB", IIC_VecFP, []>;
645 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000646 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000647 "xsmindp $XT, $XA, $XB", IIC_VecFP, []>;
648
649 def XVMAXDP : XX3Form<60, 224,
650 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
651 "xvmaxdp $XT, $XA, $XB", IIC_VecFP, []>;
652 def XVMINDP : XX3Form<60, 232,
653 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
654 "xvmindp $XT, $XA, $XB", IIC_VecFP, []>;
655
656 def XVMAXSP : XX3Form<60, 192,
657 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
658 "xvmaxsp $XT, $XA, $XB", IIC_VecFP, []>;
659 def XVMINSP : XX3Form<60, 200,
660 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
661 "xvminsp $XT, $XA, $XB", IIC_VecFP, []>;
Hal Finkele01d3212014-03-24 15:07:28 +0000662 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000663} // Uses = [RM]
664
665 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000666 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000667 def XXLAND : XX3Form<60, 130,
668 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000669 "xxland $XT, $XA, $XB", IIC_VecGeneral,
670 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000671 def XXLANDC : XX3Form<60, 138,
672 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000673 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
674 [(set v4i32:$XT, (and v4i32:$XA,
675 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000676 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000677 def XXLNOR : XX3Form<60, 162,
678 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000679 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
680 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
681 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000682 def XXLOR : XX3Form<60, 146,
683 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000684 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
685 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000686 let isCodeGenOnly = 1 in
687 def XXLORf: XX3Form<60, 146,
688 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
689 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000690 def XXLXOR : XX3Form<60, 154,
691 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000692 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
693 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000694 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000695
696 // Permutation Instructions
697 def XXMRGHW : XX3Form<60, 18,
698 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
699 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
700 def XXMRGLW : XX3Form<60, 50,
701 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
702 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
703
704 def XXPERMDI : XX3Form_2<60, 10,
705 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
706 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
707 def XXSEL : XX4Form<60, 3,
708 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
709 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
710
711 def XXSLDWI : XX3Form_2<60, 2,
712 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
713 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, []>;
714 def XXSPLTW : XX2Form_2<60, 164,
715 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
716 "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
717} // neverHasSideEffects
718} // AddedComplexity
719
720def : InstAlias<"xvmovdp $XT, $XB",
721 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
722def : InstAlias<"xvmovsp $XT, $XB",
723 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
724
725def : InstAlias<"xxspltd $XT, $XB, 0",
726 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
727def : InstAlias<"xxspltd $XT, $XB, 1",
728 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
729def : InstAlias<"xxmrghd $XT, $XA, $XB",
730 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
731def : InstAlias<"xxmrgld $XT, $XA, $XB",
732 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
733def : InstAlias<"xxswapd $XT, $XB",
734 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
735
736let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
737def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000738 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000739
740def : Pat<(f64 (vector_extract v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000741 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000742def : Pat<(f64 (vector_extract v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000743 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000744
745// Additional fnmsub patterns: -a*c + b == -(a*c - b)
746def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
747 (XSNMSUBADP $B, $C, $A)>;
748def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
749 (XSNMSUBADP $B, $C, $A)>;
750
751def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
752 (XVNMSUBADP $B, $C, $A)>;
753def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
754 (XVNMSUBADP $B, $C, $A)>;
755
756def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
757 (XVNMSUBASP $B, $C, $A)>;
758def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
759 (XVNMSUBASP $B, $C, $A)>;
760
761def : Pat<(v2f64 (bitconvert v4i32:$A)),
762 (COPY_TO_REGCLASS $A, VSRC)>;
763def : Pat<(v2f64 (bitconvert v8i16:$A)),
764 (COPY_TO_REGCLASS $A, VSRC)>;
765def : Pat<(v2f64 (bitconvert v16i8:$A)),
766 (COPY_TO_REGCLASS $A, VSRC)>;
767
768def : Pat<(v4i32 (bitconvert v2f64:$A)),
769 (COPY_TO_REGCLASS $A, VRRC)>;
770def : Pat<(v8i16 (bitconvert v2f64:$A)),
771 (COPY_TO_REGCLASS $A, VRRC)>;
772def : Pat<(v16i8 (bitconvert v2f64:$A)),
773 (COPY_TO_REGCLASS $A, VRRC)>;
774
Hal Finkela6c8b512014-03-26 16:12:58 +0000775def : Pat<(v2i64 (bitconvert v4i32:$A)),
776 (COPY_TO_REGCLASS $A, VSRC)>;
777def : Pat<(v2i64 (bitconvert v8i16:$A)),
778 (COPY_TO_REGCLASS $A, VSRC)>;
779def : Pat<(v2i64 (bitconvert v16i8:$A)),
780 (COPY_TO_REGCLASS $A, VSRC)>;
781
782def : Pat<(v4i32 (bitconvert v2i64:$A)),
783 (COPY_TO_REGCLASS $A, VRRC)>;
784def : Pat<(v8i16 (bitconvert v2i64:$A)),
785 (COPY_TO_REGCLASS $A, VRRC)>;
786def : Pat<(v16i8 (bitconvert v2i64:$A)),
787 (COPY_TO_REGCLASS $A, VRRC)>;
788
Hal Finkel9281c9a2014-03-26 18:26:30 +0000789def : Pat<(v2f64 (bitconvert v2i64:$A)),
790 (COPY_TO_REGCLASS $A, VRRC)>;
791def : Pat<(v2i64 (bitconvert v2f64:$A)),
792 (COPY_TO_REGCLASS $A, VRRC)>;
793
Hal Finkel27774d92014-03-13 07:58:58 +0000794} // AddedComplexity
795} // HasVSX
796