blob: 5206d5747c4e1dad3fbb13e1c7d9da31d032e643 [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
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +000043def PPCRegVSSRCAsmOperand : AsmOperandClass {
44 let Name = "RegVSSRC"; let PredicateMethod = "isVSRegNumber";
45}
46def vssrc : RegisterOperand<VSSRC> {
47 let ParserMatchClass = PPCRegVSSRCAsmOperand;
48}
49
Bill Schmidtfae5d712014-12-09 16:35:51 +000050// Little-endian-specific nodes.
51def SDT_PPClxvd2x : SDTypeProfile<1, 1, [
52 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
53]>;
54def SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
55 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
56]>;
57def SDT_PPCxxswapd : SDTypeProfile<1, 1, [
58 SDTCisSameAs<0, 1>
59]>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000060def SDTVecConv : SDTypeProfile<1, 2, [
61 SDTCisVec<0>, SDTCisVec<1>, SDTCisPtrTy<2>
62]>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000063
64def PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
65 [SDNPHasChain, SDNPMayLoad]>;
66def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
67 [SDNPHasChain, SDNPMayStore]>;
68def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +000069def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
70def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
71def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000072def PPCsvec2fp : SDNode<"PPCISD::SINT_VEC_TO_FP", SDTVecConv, []>;
73def PPCuvec2fp: SDNode<"PPCISD::UINT_VEC_TO_FP", SDTVecConv, []>;
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +000074def PPCswapNoChain : SDNode<"PPCISD::SWAP_NO_CHAIN", SDT_PPCxxswapd>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000075
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000076multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase,
77 string asmstr, InstrItinClass itin, Intrinsic Int,
78 ValueType OutTy, ValueType InTy> {
Hal Finkel27774d92014-03-13 07:58:58 +000079 let BaseName = asmbase in {
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000080 def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000081 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000082 [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000083 let Defs = [CR6] in
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000084 def o : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000085 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000086 [(set InTy:$XT,
87 (InTy (PPCvcmp_o InTy:$XA, InTy:$XB, xo)))]>,
88 isDOT;
Hal Finkel27774d92014-03-13 07:58:58 +000089 }
90}
91
Nemanja Ivanovic11049f82016-10-04 06:59:23 +000092// Instruction form with a single input register for instructions such as
93// XXPERMDI. The reason for defining this is that specifying multiple chained
94// operands (such as loads) to an instruction will perform both chained
95// operations rather than coalescing them into a single register - even though
96// the source memory location is the same. This simply forces the instruction
97// to use the same register for both inputs.
98// For example, an output DAG such as this:
99// (XXPERMDI (LXSIBZX xoaddr:$src), (LXSIBZX xoaddr:$src ), 0))
100// would result in two load instructions emitted and used as separate inputs
101// to the XXPERMDI instruction.
102class XX3Form_2s<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
103 InstrItinClass itin, list<dag> pattern>
104 : XX3Form_2<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
105 let XB = XA;
106}
107
Eric Christopher1b8e7632014-05-22 01:07:24 +0000108def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000109def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
110def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000111def HasOnlySwappingMemOps : Predicate<"!PPCSubTarget->hasP9Vector()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000112
Hal Finkel27774d92014-03-13 07:58:58 +0000113let Predicates = [HasVSX] in {
114let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000115let UseVSXReg = 1 in {
Craig Topperc50d64b2014-11-26 00:46:26 +0000116let hasSideEffects = 0 in { // VSX instructions don't have side effects.
Hal Finkel27774d92014-03-13 07:58:58 +0000117let Uses = [RM] in {
118
119 // Load indexed instructions
Hal Finkel6a778fb2015-03-11 23:28:38 +0000120 let mayLoad = 1 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +0000121 let CodeSize = 3 in
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000122 def LXSDX : XX1Form<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +0000123 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +0000124 "lxsdx $XT, $src", IIC_LdStLFD,
125 [(set f64:$XT, (load xoaddr:$src))]>;
126
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000127 let Predicates = [HasVSX, HasOnlySwappingMemOps] in
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000128 def LXVD2X : XX1Form<31, 844,
Hal Finkel27774d92014-03-13 07:58:58 +0000129 (outs vsrc:$XT), (ins memrr:$src),
130 "lxvd2x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000131 [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000132
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000133 def LXVDSX : XX1Form<31, 332,
Hal Finkel27774d92014-03-13 07:58:58 +0000134 (outs vsrc:$XT), (ins memrr:$src),
135 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000136
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000137 let Predicates = [HasVSX, HasOnlySwappingMemOps] in
Bill Schmidtcb34fd02014-10-09 17:51:35 +0000138 def LXVW4X : XX1Form<31, 780,
Hal Finkel27774d92014-03-13 07:58:58 +0000139 (outs vsrc:$XT), (ins memrr:$src),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000140 "lxvw4x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000141 [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000142 } // mayLoad
Hal Finkel27774d92014-03-13 07:58:58 +0000143
144 // Store indexed instructions
145 let mayStore = 1 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +0000146 let CodeSize = 3 in
Hal Finkel27774d92014-03-13 07:58:58 +0000147 def STXSDX : XX1Form<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +0000148 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +0000149 "stxsdx $XT, $dst", IIC_LdStSTFD,
150 [(store f64:$XT, xoaddr:$dst)]>;
151
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000152 let Predicates = [HasVSX, HasOnlySwappingMemOps] in {
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +0000153 // The behaviour of this instruction is endianness-specific so we provide no
154 // pattern to match it without considering endianness.
Hal Finkel27774d92014-03-13 07:58:58 +0000155 def STXVD2X : XX1Form<31, 972,
156 (outs), (ins vsrc:$XT, memrr:$dst),
157 "stxvd2x $XT, $dst", IIC_LdStSTFD,
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +0000158 []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000159
160 def STXVW4X : XX1Form<31, 908,
161 (outs), (ins vsrc:$XT, memrr:$dst),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000162 "stxvw4x $XT, $dst", IIC_LdStSTFD,
Hal Finkele3d2b202015-02-01 19:07:41 +0000163 [(store v4i32:$XT, xoaddr:$dst)]>;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000164 }
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000165 } // mayStore
Hal Finkel27774d92014-03-13 07:58:58 +0000166
167 // Add/Mul Instructions
168 let isCommutable = 1 in {
169 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +0000170 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000171 "xsadddp $XT, $XA, $XB", IIC_VecFP,
172 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
173 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +0000174 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000175 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
176 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
177
178 def XVADDDP : XX3Form<60, 96,
179 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
180 "xvadddp $XT, $XA, $XB", IIC_VecFP,
181 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
182
183 def XVADDSP : XX3Form<60, 64,
184 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
185 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
186 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
187
188 def XVMULDP : XX3Form<60, 112,
189 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
190 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
191 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
192
193 def XVMULSP : XX3Form<60, 80,
194 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
195 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
196 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
197 }
198
199 // Subtract Instructions
200 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000201 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000202 "xssubdp $XT, $XA, $XB", IIC_VecFP,
203 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
204
205 def XVSUBDP : XX3Form<60, 104,
206 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
207 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
208 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
209 def XVSUBSP : XX3Form<60, 72,
210 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
211 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
212 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
213
214 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000215 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000216 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000217 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000218 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000219 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
220 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000221 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
222 AltVSXFMARel;
223 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000224 def XSMADDMDP : XX3Form<60, 41,
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 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000227 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
228 AltVSXFMARel;
229 }
Hal Finkel27774d92014-03-13 07:58:58 +0000230
Hal Finkel25e04542014-03-25 18:55:11 +0000231 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000232 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000233 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000234 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000235 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
236 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000237 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
238 AltVSXFMARel;
239 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000240 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000241 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000242 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000243 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
244 AltVSXFMARel;
245 }
Hal Finkel27774d92014-03-13 07:58:58 +0000246
Hal Finkel25e04542014-03-25 18:55:11 +0000247 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000248 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000249 def XSNMADDADP : XX3Form<60, 161,
Hal Finkel19be5062014-03-29 05:29:01 +0000250 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000251 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
252 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000253 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
254 AltVSXFMARel;
255 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000256 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000257 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000258 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000259 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
260 AltVSXFMARel;
261 }
Hal Finkel27774d92014-03-13 07:58:58 +0000262
Hal Finkel25e04542014-03-25 18:55:11 +0000263 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000264 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000265 def XSNMSUBADP : XX3Form<60, 177,
Hal Finkel19be5062014-03-29 05:29:01 +0000266 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000267 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
268 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000269 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
270 AltVSXFMARel;
271 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000272 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000273 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000274 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000275 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
276 AltVSXFMARel;
277 }
Hal Finkel27774d92014-03-13 07:58:58 +0000278
Hal Finkel25e04542014-03-25 18:55:11 +0000279 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000280 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000281 def XVMADDADP : XX3Form<60, 97,
282 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
283 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
284 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000285 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
286 AltVSXFMARel;
287 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000288 def XVMADDMDP : XX3Form<60, 105,
289 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
290 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000291 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
292 AltVSXFMARel;
293 }
Hal Finkel27774d92014-03-13 07:58:58 +0000294
Hal Finkel25e04542014-03-25 18:55:11 +0000295 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000296 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000297 def XVMADDASP : XX3Form<60, 65,
298 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
299 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
300 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000301 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
302 AltVSXFMARel;
303 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000304 def XVMADDMSP : XX3Form<60, 73,
305 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
306 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000307 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
308 AltVSXFMARel;
309 }
Hal Finkel27774d92014-03-13 07:58:58 +0000310
Hal Finkel25e04542014-03-25 18:55:11 +0000311 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000312 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000313 def XVMSUBADP : XX3Form<60, 113,
314 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
315 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
316 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000317 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
318 AltVSXFMARel;
319 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000320 def XVMSUBMDP : XX3Form<60, 121,
321 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
322 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000323 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
324 AltVSXFMARel;
325 }
Hal Finkel27774d92014-03-13 07:58:58 +0000326
Hal Finkel25e04542014-03-25 18:55:11 +0000327 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000328 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000329 def XVMSUBASP : XX3Form<60, 81,
330 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
331 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
332 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000333 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
334 AltVSXFMARel;
335 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000336 def XVMSUBMSP : XX3Form<60, 89,
337 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
338 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000339 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
340 AltVSXFMARel;
341 }
Hal Finkel27774d92014-03-13 07:58:58 +0000342
Hal Finkel25e04542014-03-25 18:55:11 +0000343 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000344 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000345 def XVNMADDADP : XX3Form<60, 225,
346 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
347 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
348 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000349 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
350 AltVSXFMARel;
351 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000352 def XVNMADDMDP : XX3Form<60, 233,
353 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
354 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000355 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
356 AltVSXFMARel;
357 }
Hal Finkel27774d92014-03-13 07:58:58 +0000358
Hal Finkel25e04542014-03-25 18:55:11 +0000359 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000360 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000361 def XVNMADDASP : XX3Form<60, 193,
362 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
363 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
364 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000365 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
366 AltVSXFMARel;
367 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000368 def XVNMADDMSP : XX3Form<60, 201,
369 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
370 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000371 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
372 AltVSXFMARel;
373 }
Hal Finkel27774d92014-03-13 07:58:58 +0000374
Hal Finkel25e04542014-03-25 18:55:11 +0000375 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000376 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000377 def XVNMSUBADP : XX3Form<60, 241,
378 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
379 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
380 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000381 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
382 AltVSXFMARel;
383 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000384 def XVNMSUBMDP : XX3Form<60, 249,
385 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
386 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000387 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
388 AltVSXFMARel;
389 }
Hal Finkel27774d92014-03-13 07:58:58 +0000390
Hal Finkel25e04542014-03-25 18:55:11 +0000391 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000392 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000393 def XVNMSUBASP : XX3Form<60, 209,
394 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
395 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
396 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000397 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
398 AltVSXFMARel;
399 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000400 def XVNMSUBMSP : XX3Form<60, 217,
401 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
402 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000403 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
404 AltVSXFMARel;
405 }
Hal Finkel27774d92014-03-13 07:58:58 +0000406
407 // Division Instructions
408 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000409 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000410 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000411 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
412 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000413 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000414 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000415 [(set f64:$XT, (fsqrt f64:$XB))]>;
416
417 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000418 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000419 "xsredp $XT, $XB", IIC_VecFP,
420 [(set f64:$XT, (PPCfre f64:$XB))]>;
421 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000422 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000423 "xsrsqrtedp $XT, $XB", IIC_VecFP,
424 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
425
426 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000427 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000428 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000429 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000430 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000431 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000432
433 def XVDIVDP : XX3Form<60, 120,
434 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000435 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000436 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
437 def XVDIVSP : XX3Form<60, 88,
438 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000439 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000440 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
441
442 def XVSQRTDP : XX2Form<60, 203,
443 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000444 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000445 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
446 def XVSQRTSP : XX2Form<60, 139,
447 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000448 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000449 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
450
451 def XVTDIVDP : XX3Form_1<60, 125,
452 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000453 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000454 def XVTDIVSP : XX3Form_1<60, 93,
455 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000456 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000457
458 def XVTSQRTDP : XX2Form_1<60, 234,
459 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000460 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000461 def XVTSQRTSP : XX2Form_1<60, 170,
462 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000463 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000464
465 def XVREDP : XX2Form<60, 218,
466 (outs vsrc:$XT), (ins vsrc:$XB),
467 "xvredp $XT, $XB", IIC_VecFP,
468 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
469 def XVRESP : XX2Form<60, 154,
470 (outs vsrc:$XT), (ins vsrc:$XB),
471 "xvresp $XT, $XB", IIC_VecFP,
472 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
473
474 def XVRSQRTEDP : XX2Form<60, 202,
475 (outs vsrc:$XT), (ins vsrc:$XB),
476 "xvrsqrtedp $XT, $XB", IIC_VecFP,
477 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
478 def XVRSQRTESP : XX2Form<60, 138,
479 (outs vsrc:$XT), (ins vsrc:$XB),
480 "xvrsqrtesp $XT, $XB", IIC_VecFP,
481 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
482
483 // Compare Instructions
484 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000485 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000486 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000487 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000488 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000489 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000490
491 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000492 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000493 int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000494 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000495 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000496 int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000497 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000498 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000499 int_ppc_vsx_xvcmpgedp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000500 defm XVCMPGESP : XX3Form_Rcr<60, 83,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000501 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000502 int_ppc_vsx_xvcmpgesp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000503 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000504 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000505 int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000506 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000507 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000508 int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000509
510 // Move Instructions
511 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000512 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000513 "xsabsdp $XT, $XB", IIC_VecFP,
514 [(set f64:$XT, (fabs f64:$XB))]>;
515 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000516 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000517 "xsnabsdp $XT, $XB", IIC_VecFP,
518 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
519 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000520 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000521 "xsnegdp $XT, $XB", IIC_VecFP,
522 [(set f64:$XT, (fneg f64:$XB))]>;
523 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000524 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000525 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
526 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
527
528 def XVABSDP : XX2Form<60, 473,
529 (outs vsrc:$XT), (ins vsrc:$XB),
530 "xvabsdp $XT, $XB", IIC_VecFP,
531 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
532
533 def XVABSSP : XX2Form<60, 409,
534 (outs vsrc:$XT), (ins vsrc:$XB),
535 "xvabssp $XT, $XB", IIC_VecFP,
536 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
537
538 def XVCPSGNDP : XX3Form<60, 240,
539 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
540 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
541 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
542 def XVCPSGNSP : XX3Form<60, 208,
543 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
544 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
545 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
546
547 def XVNABSDP : XX2Form<60, 489,
548 (outs vsrc:$XT), (ins vsrc:$XB),
549 "xvnabsdp $XT, $XB", IIC_VecFP,
550 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
551 def XVNABSSP : XX2Form<60, 425,
552 (outs vsrc:$XT), (ins vsrc:$XB),
553 "xvnabssp $XT, $XB", IIC_VecFP,
554 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
555
556 def XVNEGDP : XX2Form<60, 505,
557 (outs vsrc:$XT), (ins vsrc:$XB),
558 "xvnegdp $XT, $XB", IIC_VecFP,
559 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
560 def XVNEGSP : XX2Form<60, 441,
561 (outs vsrc:$XT), (ins vsrc:$XB),
562 "xvnegsp $XT, $XB", IIC_VecFP,
563 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
564
565 // Conversion Instructions
566 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000567 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000568 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
569 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000570 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000571 "xscvdpsxds $XT, $XB", IIC_VecFP,
572 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000573 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000574 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000575 "xscvdpsxws $XT, $XB", IIC_VecFP,
576 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000577 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000578 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000579 "xscvdpuxds $XT, $XB", IIC_VecFP,
580 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000581 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000582 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000583 "xscvdpuxws $XT, $XB", IIC_VecFP,
584 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000585 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000586 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000587 "xscvspdp $XT, $XB", IIC_VecFP, []>;
588 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000589 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000590 "xscvsxddp $XT, $XB", IIC_VecFP,
591 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000592 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000593 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000594 "xscvuxddp $XT, $XB", IIC_VecFP,
595 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000596
597 def XVCVDPSP : XX2Form<60, 393,
598 (outs vsrc:$XT), (ins vsrc:$XB),
599 "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
600 def XVCVDPSXDS : XX2Form<60, 472,
601 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000602 "xvcvdpsxds $XT, $XB", IIC_VecFP,
603 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000604 def XVCVDPSXWS : XX2Form<60, 216,
605 (outs vsrc:$XT), (ins vsrc:$XB),
606 "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
607 def XVCVDPUXDS : XX2Form<60, 456,
608 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000609 "xvcvdpuxds $XT, $XB", IIC_VecFP,
610 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000611 def XVCVDPUXWS : XX2Form<60, 200,
612 (outs vsrc:$XT), (ins vsrc:$XB),
613 "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
614
615 def XVCVSPDP : XX2Form<60, 457,
616 (outs vsrc:$XT), (ins vsrc:$XB),
617 "xvcvspdp $XT, $XB", IIC_VecFP, []>;
618 def XVCVSPSXDS : XX2Form<60, 408,
619 (outs vsrc:$XT), (ins vsrc:$XB),
620 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
621 def XVCVSPSXWS : XX2Form<60, 152,
622 (outs vsrc:$XT), (ins vsrc:$XB),
623 "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
624 def XVCVSPUXDS : XX2Form<60, 392,
625 (outs vsrc:$XT), (ins vsrc:$XB),
626 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
627 def XVCVSPUXWS : XX2Form<60, 136,
628 (outs vsrc:$XT), (ins vsrc:$XB),
629 "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
630 def XVCVSXDDP : XX2Form<60, 504,
631 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000632 "xvcvsxddp $XT, $XB", IIC_VecFP,
633 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000634 def XVCVSXDSP : XX2Form<60, 440,
635 (outs vsrc:$XT), (ins vsrc:$XB),
636 "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
637 def XVCVSXWDP : XX2Form<60, 248,
638 (outs vsrc:$XT), (ins vsrc:$XB),
639 "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
640 def XVCVSXWSP : XX2Form<60, 184,
641 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic44513e52016-07-05 09:22:29 +0000642 "xvcvsxwsp $XT, $XB", IIC_VecFP,
643 [(set v4f32:$XT, (sint_to_fp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000644 def XVCVUXDDP : XX2Form<60, 488,
645 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000646 "xvcvuxddp $XT, $XB", IIC_VecFP,
647 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000648 def XVCVUXDSP : XX2Form<60, 424,
649 (outs vsrc:$XT), (ins vsrc:$XB),
650 "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
651 def XVCVUXWDP : XX2Form<60, 232,
652 (outs vsrc:$XT), (ins vsrc:$XB),
653 "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
654 def XVCVUXWSP : XX2Form<60, 168,
655 (outs vsrc:$XT), (ins vsrc:$XB),
656 "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
657
658 // Rounding Instructions
659 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000660 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000661 "xsrdpi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000662 [(set f64:$XT, (fround f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000663 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000664 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000665 "xsrdpic $XT, $XB", IIC_VecFP,
666 [(set f64:$XT, (fnearbyint f64:$XB))]>;
667 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000668 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000669 "xsrdpim $XT, $XB", IIC_VecFP,
670 [(set f64:$XT, (ffloor f64:$XB))]>;
671 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000672 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000673 "xsrdpip $XT, $XB", IIC_VecFP,
674 [(set f64:$XT, (fceil f64:$XB))]>;
675 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000676 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000677 "xsrdpiz $XT, $XB", IIC_VecFP,
678 [(set f64:$XT, (ftrunc f64:$XB))]>;
679
680 def XVRDPI : XX2Form<60, 201,
681 (outs vsrc:$XT), (ins vsrc:$XB),
682 "xvrdpi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000683 [(set v2f64:$XT, (fround v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000684 def XVRDPIC : XX2Form<60, 235,
685 (outs vsrc:$XT), (ins vsrc:$XB),
686 "xvrdpic $XT, $XB", IIC_VecFP,
687 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
688 def XVRDPIM : XX2Form<60, 249,
689 (outs vsrc:$XT), (ins vsrc:$XB),
690 "xvrdpim $XT, $XB", IIC_VecFP,
691 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
692 def XVRDPIP : XX2Form<60, 233,
693 (outs vsrc:$XT), (ins vsrc:$XB),
694 "xvrdpip $XT, $XB", IIC_VecFP,
695 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
696 def XVRDPIZ : XX2Form<60, 217,
697 (outs vsrc:$XT), (ins vsrc:$XB),
698 "xvrdpiz $XT, $XB", IIC_VecFP,
699 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
700
701 def XVRSPI : XX2Form<60, 137,
702 (outs vsrc:$XT), (ins vsrc:$XB),
703 "xvrspi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000704 [(set v4f32:$XT, (fround v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000705 def XVRSPIC : XX2Form<60, 171,
706 (outs vsrc:$XT), (ins vsrc:$XB),
707 "xvrspic $XT, $XB", IIC_VecFP,
708 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
709 def XVRSPIM : XX2Form<60, 185,
710 (outs vsrc:$XT), (ins vsrc:$XB),
711 "xvrspim $XT, $XB", IIC_VecFP,
712 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
713 def XVRSPIP : XX2Form<60, 169,
714 (outs vsrc:$XT), (ins vsrc:$XB),
715 "xvrspip $XT, $XB", IIC_VecFP,
716 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
717 def XVRSPIZ : XX2Form<60, 153,
718 (outs vsrc:$XT), (ins vsrc:$XB),
719 "xvrspiz $XT, $XB", IIC_VecFP,
720 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
721
722 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000723 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000724 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000725 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000726 "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
727 [(set vsfrc:$XT,
728 (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000729 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000730 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000731 "xsmindp $XT, $XA, $XB", IIC_VecFP,
732 [(set vsfrc:$XT,
733 (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000734
735 def XVMAXDP : XX3Form<60, 224,
736 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000737 "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
738 [(set vsrc:$XT,
739 (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000740 def XVMINDP : XX3Form<60, 232,
741 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000742 "xvmindp $XT, $XA, $XB", IIC_VecFP,
743 [(set vsrc:$XT,
744 (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000745
746 def XVMAXSP : XX3Form<60, 192,
747 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000748 "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
749 [(set vsrc:$XT,
750 (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000751 def XVMINSP : XX3Form<60, 200,
752 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000753 "xvminsp $XT, $XA, $XB", IIC_VecFP,
754 [(set vsrc:$XT,
755 (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000756 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000757} // Uses = [RM]
758
759 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000760 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000761 def XXLAND : XX3Form<60, 130,
762 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000763 "xxland $XT, $XA, $XB", IIC_VecGeneral,
764 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000765 def XXLANDC : XX3Form<60, 138,
766 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000767 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
768 [(set v4i32:$XT, (and v4i32:$XA,
769 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000770 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000771 def XXLNOR : XX3Form<60, 162,
772 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000773 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
774 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
775 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000776 def XXLOR : XX3Form<60, 146,
777 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000778 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
779 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000780 let isCodeGenOnly = 1 in
781 def XXLORf: XX3Form<60, 146,
782 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
783 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000784 def XXLXOR : XX3Form<60, 154,
785 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000786 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
787 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000788 } // isCommutable
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +0000789 let isCodeGenOnly = 1 in
790 def XXLXORz : XX3Form_Zero<60, 154, (outs vsrc:$XT), (ins),
791 "xxlxor $XT, $XT, $XT", IIC_VecGeneral,
792 [(set v4i32:$XT, (v4i32 immAllZerosV))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000793
794 // Permutation Instructions
795 def XXMRGHW : XX3Form<60, 18,
796 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
797 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
798 def XXMRGLW : XX3Form<60, 50,
799 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
800 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
801
802 def XXPERMDI : XX3Form_2<60, 10,
803 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
804 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000805 let isCodeGenOnly = 1 in
806 def XXPERMDIs : XX3Form_2s<60, 10, (outs vsrc:$XT), (ins vfrc:$XA, u2imm:$DM),
807 "xxpermdi $XT, $XA, $XA, $DM", IIC_VecPerm, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000808 def XXSEL : XX4Form<60, 3,
809 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
810 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
811
812 def XXSLDWI : XX3Form_2<60, 2,
813 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +0000814 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm,
815 [(set v4i32:$XT, (PPCvecshl v4i32:$XA, v4i32:$XB,
816 imm32SExt16:$SHW))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000817 def XXSPLTW : XX2Form_2<60, 164,
818 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
Nemanja Ivanovic1a2b2f02016-05-04 16:04:02 +0000819 "xxspltw $XT, $XB, $UIM", IIC_VecPerm,
820 [(set v4i32:$XT,
821 (PPCxxsplt v4i32:$XB, imm32SExt16:$UIM))]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000822 let isCodeGenOnly = 1 in
823 def XXSPLTWs : XX2Form_2<60, 164,
824 (outs vsrc:$XT), (ins vfrc:$XB, u2imm:$UIM),
825 "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
Craig Topperc50d64b2014-11-26 00:46:26 +0000826} // hasSideEffects
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000827} // UseVSXReg = 1
Hal Finkel27774d92014-03-13 07:58:58 +0000828
Bill Schmidt61e65232014-10-22 13:13:40 +0000829// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
830// instruction selection into a branch sequence.
831let usesCustomInserter = 1, // Expanded after instruction selection.
832 PPC970_Single = 1 in {
833
834 def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
835 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
836 "#SELECT_CC_VSRC",
837 []>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000838 def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
839 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
840 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000841 [(set v2f64:$dst,
842 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000843 def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
844 (ins crrc:$cond, f8rc:$T, f8rc:$F,
845 i32imm:$BROPC), "#SELECT_CC_VSFRC",
846 []>;
847 def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
848 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
849 "#SELECT_VSFRC",
850 [(set f64:$dst,
851 (select i1:$cond, f64:$T, f64:$F))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000852 def SELECT_CC_VSSRC: Pseudo<(outs f4rc:$dst),
853 (ins crrc:$cond, f4rc:$T, f4rc:$F,
854 i32imm:$BROPC), "#SELECT_CC_VSSRC",
855 []>;
856 def SELECT_VSSRC: Pseudo<(outs f4rc:$dst),
857 (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
858 "#SELECT_VSSRC",
859 [(set f32:$dst,
860 (select i1:$cond, f32:$T, f32:$F))]>;
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000861} // usesCustomInserter
862} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000863
Hal Finkel27774d92014-03-13 07:58:58 +0000864def : InstAlias<"xvmovdp $XT, $XB",
865 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
866def : InstAlias<"xvmovsp $XT, $XB",
867 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
868
869def : InstAlias<"xxspltd $XT, $XB, 0",
870 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
871def : InstAlias<"xxspltd $XT, $XB, 1",
872 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
873def : InstAlias<"xxmrghd $XT, $XA, $XB",
874 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
875def : InstAlias<"xxmrgld $XT, $XA, $XB",
876 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
877def : InstAlias<"xxswapd $XT, $XB",
878 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000879def : InstAlias<"xxspltd $XT, $XB, 0",
880 (XXPERMDIs vsrc:$XT, vfrc:$XB, 0)>;
881def : InstAlias<"xxspltd $XT, $XB, 1",
882 (XXPERMDIs vsrc:$XT, vfrc:$XB, 3)>;
883def : InstAlias<"xxswapd $XT, $XB",
884 (XXPERMDIs vsrc:$XT, vfrc:$XB, 2)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000885
886let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000887
Nemanja Ivanovic6f22b412016-09-27 08:42:12 +0000888def : Pat<(v4i32 (vnot_ppc v4i32:$A)),
889 (v4i32 (XXLNOR $A, $A))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000890let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000891def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000892 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000893
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000894def : Pat<(f64 (extractelt v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000895 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000896def : Pat<(f64 (extractelt v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000897 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000898}
899
900let Predicates = [IsLittleEndian] in {
901def : Pat<(v2f64 (scalar_to_vector f64:$A)),
902 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
903 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
904
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000905def : Pat<(f64 (extractelt v2f64:$S, 0)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000906 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000907def : Pat<(f64 (extractelt v2f64:$S, 1)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000908 (f64 (EXTRACT_SUBREG $S, sub_64))>;
909}
Hal Finkel27774d92014-03-13 07:58:58 +0000910
911// Additional fnmsub patterns: -a*c + b == -(a*c - b)
912def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
913 (XSNMSUBADP $B, $C, $A)>;
914def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
915 (XSNMSUBADP $B, $C, $A)>;
916
917def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
918 (XVNMSUBADP $B, $C, $A)>;
919def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
920 (XVNMSUBADP $B, $C, $A)>;
921
922def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
923 (XVNMSUBASP $B, $C, $A)>;
924def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
925 (XVNMSUBASP $B, $C, $A)>;
926
Hal Finkel9e0baa62014-04-01 19:24:27 +0000927def : Pat<(v2f64 (bitconvert v4f32:$A)),
928 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000929def : Pat<(v2f64 (bitconvert v4i32:$A)),
930 (COPY_TO_REGCLASS $A, VSRC)>;
931def : Pat<(v2f64 (bitconvert v8i16:$A)),
932 (COPY_TO_REGCLASS $A, VSRC)>;
933def : Pat<(v2f64 (bitconvert v16i8:$A)),
934 (COPY_TO_REGCLASS $A, VSRC)>;
935
Hal Finkel9e0baa62014-04-01 19:24:27 +0000936def : Pat<(v4f32 (bitconvert v2f64:$A)),
937 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000938def : Pat<(v4i32 (bitconvert v2f64:$A)),
939 (COPY_TO_REGCLASS $A, VRRC)>;
940def : Pat<(v8i16 (bitconvert v2f64:$A)),
941 (COPY_TO_REGCLASS $A, VRRC)>;
942def : Pat<(v16i8 (bitconvert v2f64:$A)),
943 (COPY_TO_REGCLASS $A, VRRC)>;
944
Hal Finkel9e0baa62014-04-01 19:24:27 +0000945def : Pat<(v2i64 (bitconvert v4f32:$A)),
946 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000947def : Pat<(v2i64 (bitconvert v4i32:$A)),
948 (COPY_TO_REGCLASS $A, VSRC)>;
949def : Pat<(v2i64 (bitconvert v8i16:$A)),
950 (COPY_TO_REGCLASS $A, VSRC)>;
951def : Pat<(v2i64 (bitconvert v16i8:$A)),
952 (COPY_TO_REGCLASS $A, VSRC)>;
953
Hal Finkel9e0baa62014-04-01 19:24:27 +0000954def : Pat<(v4f32 (bitconvert v2i64:$A)),
955 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +0000956def : Pat<(v4i32 (bitconvert v2i64:$A)),
957 (COPY_TO_REGCLASS $A, VRRC)>;
958def : Pat<(v8i16 (bitconvert v2i64:$A)),
959 (COPY_TO_REGCLASS $A, VRRC)>;
960def : Pat<(v16i8 (bitconvert v2i64:$A)),
961 (COPY_TO_REGCLASS $A, VRRC)>;
962
Hal Finkel9281c9a2014-03-26 18:26:30 +0000963def : Pat<(v2f64 (bitconvert v2i64:$A)),
964 (COPY_TO_REGCLASS $A, VRRC)>;
965def : Pat<(v2i64 (bitconvert v2f64:$A)),
966 (COPY_TO_REGCLASS $A, VRRC)>;
967
Kit Bartond4eb73c2015-05-05 16:10:44 +0000968def : Pat<(v2f64 (bitconvert v1i128:$A)),
969 (COPY_TO_REGCLASS $A, VRRC)>;
970def : Pat<(v1i128 (bitconvert v2f64:$A)),
971 (COPY_TO_REGCLASS $A, VRRC)>;
972
Hal Finkel5c0d1452014-03-30 13:22:59 +0000973// sign extension patterns
974// To extend "in place" from v2i32 to v2i64, we have input data like:
975// | undef | i32 | undef | i32 |
976// but xvcvsxwdp expects the input in big-Endian format:
977// | i32 | undef | i32 | undef |
978// so we need to shift everything to the left by one i32 (word) before
979// the conversion.
980def : Pat<(sext_inreg v2i64:$C, v2i32),
981 (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
982def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
983 (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
984
Nemanja Ivanovic44513e52016-07-05 09:22:29 +0000985def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 0)),
986 (v2f64 (XVCVSXWDP (v2i64 (XXMRGHW $C, $C))))>;
987def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 1)),
988 (v2f64 (XVCVSXWDP (v2i64 (XXMRGLW $C, $C))))>;
989
990def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 0)),
991 (v2f64 (XVCVUXWDP (v2i64 (XXMRGHW $C, $C))))>;
992def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 1)),
993 (v2f64 (XVCVUXWDP (v2i64 (XXMRGLW $C, $C))))>;
994
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000995// Loads.
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000996let Predicates = [HasVSX, HasOnlySwappingMemOps] in {
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000997 def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000998
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000999 // Stores.
1000 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
1001 (STXVD2X $rS, xoaddr:$dst)>;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001002 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
1003 (STXVW4X $rS, xoaddr:$dst)>;
1004 def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
1005}
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +00001006let Predicates = [IsBigEndian, HasVSX, HasOnlySwappingMemOps] in {
1007 def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
1008 def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
1009 def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
1010 def : Pat<(store v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
1011 def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
1012}
Bill Schmidtfae5d712014-12-09 16:35:51 +00001013
1014// Permutes.
1015def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
1016def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
1017def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
1018def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001019def : Pat<(v2f64 (PPCswapNoChain v2f64:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +00001020
Bill Schmidt61e65232014-10-22 13:13:40 +00001021// Selects.
1022def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001023 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1024def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001025 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1026def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001027 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1028def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001029 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1030def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
1031 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1032def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001033 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1034def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001035 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1036def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001037 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1038def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001039 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1040def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
1041 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1042
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001043def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001044 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1045def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001046 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1047def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001048 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1049def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001050 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1051def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
1052 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
1053def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001054 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1055def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001056 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1057def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001058 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1059def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001060 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1061def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
1062 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1063
Bill Schmidt76746922014-11-14 12:10:40 +00001064// Divides.
1065def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
1066 (XVDIVSP $A, $B)>;
1067def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
1068 (XVDIVDP $A, $B)>;
1069
Nemanja Ivanovic984a3612015-07-14 17:25:20 +00001070// Reciprocal estimate
1071def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
1072 (XVRESP $A)>;
1073def : Pat<(int_ppc_vsx_xvredp v2f64:$A),
1074 (XVREDP $A)>;
1075
Nemanja Ivanovicd358b8f2015-07-05 06:03:51 +00001076// Recip. square root estimate
1077def : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
1078 (XVRSQRTESP $A)>;
1079def : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
1080 (XVRSQRTEDP $A)>;
1081
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001082let Predicates = [IsLittleEndian] in {
1083def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1084 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1085def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1086 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1087def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1088 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1089def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1090 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1091} // IsLittleEndian
1092
1093let Predicates = [IsBigEndian] in {
1094def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1095 (f64 (XSCVSXDDP (COPY_TO_REGCLASS $S, VSFRC)))>;
1096def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1097 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1098def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1099 (f64 (XSCVUXDDP (COPY_TO_REGCLASS $S, VSFRC)))>;
1100def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1101 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1102} // IsBigEndian
1103
Hal Finkel27774d92014-03-13 07:58:58 +00001104} // AddedComplexity
1105} // HasVSX
1106
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001107def ScalarLoads {
1108 dag Li8 = (i32 (extloadi8 xoaddr:$src));
1109 dag ZELi8 = (i32 (zextloadi8 xoaddr:$src));
1110 dag ZELi8i64 = (i64 (zextloadi8 xoaddr:$src));
1111 dag SELi8 = (i32 (sext_inreg (extloadi8 xoaddr:$src), i8));
1112 dag SELi8i64 = (i64 (sext_inreg (extloadi8 xoaddr:$src), i8));
1113
1114 dag Li16 = (i32 (extloadi16 xoaddr:$src));
1115 dag ZELi16 = (i32 (zextloadi16 xoaddr:$src));
1116 dag ZELi16i64 = (i64 (zextloadi16 xoaddr:$src));
1117 dag SELi16 = (i32 (sextloadi16 xoaddr:$src));
1118 dag SELi16i64 = (i64 (sextloadi16 xoaddr:$src));
1119
1120 dag Li32 = (i32 (load xoaddr:$src));
1121}
1122
Kit Barton298beb52015-02-18 16:21:46 +00001123// The following VSX instructions were introduced in Power ISA 2.07
1124/* FIXME: if the operands are v2i64, these patterns will not match.
1125 we should define new patterns or otherwise match the same patterns
1126 when the elements are larger than i32.
1127*/
1128def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001129def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Kit Barton298beb52015-02-18 16:21:46 +00001130let Predicates = [HasP8Vector] in {
1131let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001132 let isCommutable = 1, UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001133 def XXLEQV : XX3Form<60, 186,
1134 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1135 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
1136 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
1137 def XXLNAND : XX3Form<60, 178,
1138 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1139 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
1140 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
Kit Barton298beb52015-02-18 16:21:46 +00001141 v4i32:$XB)))]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001142 } // isCommutable, UseVSXReg
Nemanja Ivanovicd9e4b4f2015-07-10 14:25:17 +00001143
Nemanja Ivanovic5655fb32015-07-10 12:38:08 +00001144 def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
1145 (XXLEQV $A, $B)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001146
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001147 let UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001148 def XXLORC : XX3Form<60, 170,
1149 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1150 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
1151 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
1152
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001153 // VSX scalar loads introduced in ISA 2.07
1154 let mayLoad = 1 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00001155 let CodeSize = 3 in
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001156 def LXSSPX : XX1Form<31, 524, (outs vssrc:$XT), (ins memrr:$src),
1157 "lxsspx $XT, $src", IIC_LdStLFD,
1158 [(set f32:$XT, (load xoaddr:$src))]>;
1159 def LXSIWAX : XX1Form<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
1160 "lxsiwax $XT, $src", IIC_LdStLFD,
1161 [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
1162 def LXSIWZX : XX1Form<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
1163 "lxsiwzx $XT, $src", IIC_LdStLFD,
1164 [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
1165 } // mayLoad
1166
1167 // VSX scalar stores introduced in ISA 2.07
1168 let mayStore = 1 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00001169 let CodeSize = 3 in
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001170 def STXSSPX : XX1Form<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
1171 "stxsspx $XT, $dst", IIC_LdStSTFD,
1172 [(store f32:$XT, xoaddr:$dst)]>;
1173 def STXSIWX : XX1Form<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
1174 "stxsiwx $XT, $dst", IIC_LdStSTFD,
1175 [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
1176 } // mayStore
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001177 } // UseVSXReg = 1
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001178
1179 def : Pat<(f64 (extloadf32 xoaddr:$src)),
1180 (COPY_TO_REGCLASS (LXSSPX xoaddr:$src), VSFRC)>;
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +00001181 def : Pat<(f64 (fpextend f32:$src)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001182 (COPY_TO_REGCLASS $src, VSFRC)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00001183
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001184 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001185 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1186 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001187 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1188 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001189 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1190 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001191 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1192 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
1193 (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1194 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001195 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1196 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001197 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1198 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001199 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1200 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001201 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1202 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001203 (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001204
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001205 let UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001206 // VSX Elementary Scalar FP arithmetic (SP)
1207 let isCommutable = 1 in {
1208 def XSADDSP : XX3Form<60, 0,
1209 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1210 "xsaddsp $XT, $XA, $XB", IIC_VecFP,
1211 [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
1212 def XSMULSP : XX3Form<60, 16,
1213 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1214 "xsmulsp $XT, $XA, $XB", IIC_VecFP,
1215 [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
1216 } // isCommutable
1217
1218 def XSDIVSP : XX3Form<60, 24,
1219 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1220 "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
1221 [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
1222 def XSRESP : XX2Form<60, 26,
1223 (outs vssrc:$XT), (ins vssrc:$XB),
1224 "xsresp $XT, $XB", IIC_VecFP,
1225 [(set f32:$XT, (PPCfre f32:$XB))]>;
1226 def XSSQRTSP : XX2Form<60, 11,
1227 (outs vssrc:$XT), (ins vssrc:$XB),
1228 "xssqrtsp $XT, $XB", IIC_FPSqrtS,
1229 [(set f32:$XT, (fsqrt f32:$XB))]>;
1230 def XSRSQRTESP : XX2Form<60, 10,
1231 (outs vssrc:$XT), (ins vssrc:$XB),
1232 "xsrsqrtesp $XT, $XB", IIC_VecFP,
1233 [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
1234 def XSSUBSP : XX3Form<60, 8,
1235 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1236 "xssubsp $XT, $XA, $XB", IIC_VecFP,
1237 [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00001238
1239 // FMA Instructions
1240 let BaseName = "XSMADDASP" in {
1241 let isCommutable = 1 in
1242 def XSMADDASP : XX3Form<60, 1,
1243 (outs vssrc:$XT),
1244 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1245 "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
1246 [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
1247 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1248 AltVSXFMARel;
1249 let IsVSXFMAAlt = 1 in
1250 def XSMADDMSP : XX3Form<60, 9,
1251 (outs vssrc:$XT),
1252 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1253 "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1254 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1255 AltVSXFMARel;
1256 }
1257
1258 let BaseName = "XSMSUBASP" in {
1259 let isCommutable = 1 in
1260 def XSMSUBASP : XX3Form<60, 17,
1261 (outs vssrc:$XT),
1262 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1263 "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
1264 [(set f32:$XT, (fma f32:$XA, f32:$XB,
1265 (fneg f32:$XTi)))]>,
1266 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1267 AltVSXFMARel;
1268 let IsVSXFMAAlt = 1 in
1269 def XSMSUBMSP : XX3Form<60, 25,
1270 (outs vssrc:$XT),
1271 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1272 "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1273 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1274 AltVSXFMARel;
1275 }
1276
1277 let BaseName = "XSNMADDASP" in {
1278 let isCommutable = 1 in
1279 def XSNMADDASP : XX3Form<60, 129,
1280 (outs vssrc:$XT),
1281 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1282 "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
1283 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1284 f32:$XTi)))]>,
1285 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1286 AltVSXFMARel;
1287 let IsVSXFMAAlt = 1 in
1288 def XSNMADDMSP : XX3Form<60, 137,
1289 (outs vssrc:$XT),
1290 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1291 "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1292 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1293 AltVSXFMARel;
1294 }
1295
1296 let BaseName = "XSNMSUBASP" in {
1297 let isCommutable = 1 in
1298 def XSNMSUBASP : XX3Form<60, 145,
1299 (outs vssrc:$XT),
1300 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1301 "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
1302 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1303 (fneg f32:$XTi))))]>,
1304 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1305 AltVSXFMARel;
1306 let IsVSXFMAAlt = 1 in
1307 def XSNMSUBMSP : XX3Form<60, 153,
1308 (outs vssrc:$XT),
1309 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1310 "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1311 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1312 AltVSXFMARel;
1313 }
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001314
1315 // Single Precision Conversions (FP <-> INT)
1316 def XSCVSXDSP : XX2Form<60, 312,
1317 (outs vssrc:$XT), (ins vsfrc:$XB),
1318 "xscvsxdsp $XT, $XB", IIC_VecFP,
1319 [(set f32:$XT, (PPCfcfids f64:$XB))]>;
1320 def XSCVUXDSP : XX2Form<60, 296,
1321 (outs vssrc:$XT), (ins vsfrc:$XB),
1322 "xscvuxdsp $XT, $XB", IIC_VecFP,
1323 [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
1324
1325 // Conversions between vector and scalar single precision
1326 def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
1327 "xscvdpspn $XT, $XB", IIC_VecFP, []>;
1328 def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
1329 "xscvspdpn $XT, $XB", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001330 } // UseVSXReg = 1
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001331
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001332 let Predicates = [IsLittleEndian] in {
1333 def : Pat<(f32 (PPCfcfids (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1334 (f32 (XSCVSXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1335 def : Pat<(f32 (PPCfcfids (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1336 (f32 (XSCVSXDSP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1337 def : Pat<(f32 (PPCfcfidus (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1338 (f32 (XSCVUXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1339 def : Pat<(f32 (PPCfcfidus (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1340 (f32 (XSCVUXDSP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1341 }
1342
1343 let Predicates = [IsBigEndian] in {
1344 def : Pat<(f32 (PPCfcfids (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1345 (f32 (XSCVSXDSP (COPY_TO_REGCLASS $S, VSFRC)))>;
1346 def : Pat<(f32 (PPCfcfids (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1347 (f32 (XSCVSXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1348 def : Pat<(f32 (PPCfcfidus (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1349 (f32 (XSCVUXDSP (COPY_TO_REGCLASS $S, VSFRC)))>;
1350 def : Pat<(f32 (PPCfcfidus (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1351 (f32 (XSCVUXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1352 }
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001353 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.Li32)),
1354 (v4i32 (XXSPLTWs (LXSIWAX xoaddr:$src), 1))>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001355} // AddedComplexity = 400
Kit Barton298beb52015-02-18 16:21:46 +00001356} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001357
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001358let UseVSXReg = 1 in {
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001359let Predicates = [HasDirectMove] in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001360 // VSX direct move instructions
1361 def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
1362 "mfvsrd $rA, $XT", IIC_VecGeneral,
1363 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
1364 Requires<[In64BitMode]>;
1365 def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
1366 "mfvsrwz $rA, $XT", IIC_VecGeneral,
1367 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
1368 def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
1369 "mtvsrd $XT, $rA", IIC_VecGeneral,
1370 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1371 Requires<[In64BitMode]>;
1372 def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1373 "mtvsrwa $XT, $rA", IIC_VecGeneral,
1374 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1375 def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1376 "mtvsrwz $XT, $rA", IIC_VecGeneral,
1377 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001378} // HasDirectMove
1379
1380let Predicates = [IsISA3_0, HasDirectMove] in {
1381 def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00001382 "mtvsrws $XT, $rA", IIC_VecGeneral, []>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001383
1384 def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
1385 "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,
1386 []>, Requires<[In64BitMode]>;
1387
1388 def MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT),
1389 "mfvsrld $rA, $XT", IIC_VecGeneral,
1390 []>, Requires<[In64BitMode]>;
1391
1392} // IsISA3_0, HasDirectMove
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001393} // UseVSXReg = 1
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001394
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001395/* Direct moves of various widths from GPR's into VSR's. Each move lines
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001396 the value up into element 0 (both BE and LE). Namely, entities smaller than
1397 a doubleword are shifted left and moved for BE. For LE, they're moved, then
1398 swapped to go into the least significant element of the VSR.
1399*/
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001400def MovesToVSR {
1401 dag BE_BYTE_0 =
1402 (MTVSRD
1403 (RLDICR
1404 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1405 dag BE_HALF_0 =
1406 (MTVSRD
1407 (RLDICR
1408 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1409 dag BE_WORD_0 =
1410 (MTVSRD
1411 (RLDICR
1412 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001413 dag BE_DWORD_0 = (MTVSRD $A);
1414
1415 dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001416 dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1417 LE_MTVSRW, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001418 dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001419 dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1420 BE_DWORD_0, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001421 dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1422}
1423
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001424/* Patterns for extracting elements out of vectors. Integer elements are
1425 extracted using direct move operations. Patterns for extracting elements
1426 whose indices are not available at compile time are also provided with
1427 various _VARIABLE_ patterns.
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001428 The numbering for the DAG's is for LE, but when used on BE, the correct
1429 LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1430*/
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001431def VectorExtractions {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001432 // Doubleword extraction
1433 dag LE_DWORD_0 =
1434 (MFVSRD
1435 (EXTRACT_SUBREG
1436 (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1437 (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1438 dag LE_DWORD_1 = (MFVSRD
1439 (EXTRACT_SUBREG
1440 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1441
1442 // Word extraction
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001443 dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001444 dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1445 dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1446 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1447 dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1448
1449 // Halfword extraction
1450 dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1451 dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1452 dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1453 dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1454 dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1455 dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1456 dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1457 dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1458
1459 // Byte extraction
1460 dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1461 dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1462 dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1463 dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1464 dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1465 dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1466 dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1467 dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1468 dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1469 dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1470 dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1471 dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1472 dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1473 dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1474 dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1475 dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1476
1477 /* Variable element number (BE and LE patterns must be specified separately)
1478 This is a rather involved process.
1479
1480 Conceptually, this is how the move is accomplished:
1481 1. Identify which doubleword contains the element
1482 2. Shift in the VMX register so that the correct doubleword is correctly
1483 lined up for the MFVSRD
1484 3. Perform the move so that the element (along with some extra stuff)
1485 is in the GPR
1486 4. Right shift within the GPR so that the element is right-justified
1487
1488 Of course, the index is an element number which has a different meaning
1489 on LE/BE so the patterns have to be specified separately.
1490
1491 Note: The final result will be the element right-justified with high
1492 order bits being arbitrarily defined (namely, whatever was in the
1493 vector register to the left of the value originally).
1494 */
1495
1496 /* LE variable byte
1497 Number 1. above:
1498 - For elements 0-7, we shift left by 8 bytes since they're on the right
1499 - For elements 8-15, we need not shift (shift left by zero bytes)
1500 This is accomplished by inverting the bits of the index and AND-ing
1501 with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1502 */
1503 dag LE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDC8 (LI8 8), $Idx));
1504
1505 // Number 2. above:
1506 // - Now that we set up the shift amount, we shift in the VMX register
1507 dag LE_VBYTE_PERMUTE = (VPERM $S, $S, LE_VBYTE_PERM_VEC);
1508
1509 // Number 3. above:
1510 // - The doubleword containing our element is moved to a GPR
1511 dag LE_MV_VBYTE = (MFVSRD
1512 (EXTRACT_SUBREG
1513 (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1514 sub_64));
1515
1516 /* Number 4. above:
1517 - Truncate the element number to the range 0-7 (8-15 are symmetrical
1518 and out of range values are truncated accordingly)
1519 - Multiply by 8 as we need to shift right by the number of bits, not bytes
1520 - Shift right in the GPR by the calculated value
1521 */
1522 dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1523 sub_32);
1524 dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1525 sub_32);
1526
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001527 /* LE variable halfword
1528 Number 1. above:
1529 - For elements 0-3, we shift left by 8 since they're on the right
1530 - For elements 4-7, we need not shift (shift left by zero bytes)
1531 Similarly to the byte pattern, we invert the bits of the index, but we
1532 AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1533 Of course, the shift is still by 8 bytes, so we must multiply by 2.
1534 */
1535 dag LE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62));
1536
1537 // Number 2. above:
1538 // - Now that we set up the shift amount, we shift in the VMX register
1539 dag LE_VHALF_PERMUTE = (VPERM $S, $S, LE_VHALF_PERM_VEC);
1540
1541 // Number 3. above:
1542 // - The doubleword containing our element is moved to a GPR
1543 dag LE_MV_VHALF = (MFVSRD
1544 (EXTRACT_SUBREG
1545 (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1546 sub_64));
1547
1548 /* Number 4. above:
1549 - Truncate the element number to the range 0-3 (4-7 are symmetrical
1550 and out of range values are truncated accordingly)
1551 - Multiply by 16 as we need to shift right by the number of bits
1552 - Shift right in the GPR by the calculated value
1553 */
1554 dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1555 sub_32);
1556 dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1557 sub_32);
1558
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001559 /* LE variable word
1560 Number 1. above:
1561 - For elements 0-1, we shift left by 8 since they're on the right
1562 - For elements 2-3, we need not shift
1563 */
1564 dag LE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61));
1565
1566 // Number 2. above:
1567 // - Now that we set up the shift amount, we shift in the VMX register
1568 dag LE_VWORD_PERMUTE = (VPERM $S, $S, LE_VWORD_PERM_VEC);
1569
1570 // Number 3. above:
1571 // - The doubleword containing our element is moved to a GPR
1572 dag LE_MV_VWORD = (MFVSRD
1573 (EXTRACT_SUBREG
1574 (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
1575 sub_64));
1576
1577 /* Number 4. above:
1578 - Truncate the element number to the range 0-1 (2-3 are symmetrical
1579 and out of range values are truncated accordingly)
1580 - Multiply by 32 as we need to shift right by the number of bits
1581 - Shift right in the GPR by the calculated value
1582 */
1583 dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
1584 sub_32);
1585 dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
1586 sub_32);
1587
1588 /* LE variable doubleword
1589 Number 1. above:
1590 - For element 0, we shift left by 8 since it's on the right
1591 - For element 1, we need not shift
1592 */
1593 dag LE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60));
1594
1595 // Number 2. above:
1596 // - Now that we set up the shift amount, we shift in the VMX register
1597 dag LE_VDWORD_PERMUTE = (VPERM $S, $S, LE_VDWORD_PERM_VEC);
1598
1599 // Number 3. above:
1600 // - The doubleword containing our element is moved to a GPR
1601 // - Number 4. is not needed for the doubleword as the value is 64-bits
1602 dag LE_VARIABLE_DWORD =
1603 (MFVSRD (EXTRACT_SUBREG
1604 (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
1605 sub_64));
1606
1607 /* LE variable float
1608 - Shift the vector to line up the desired element to BE Word 0
1609 - Convert 32-bit float to a 64-bit single precision float
1610 */
1611 dag LE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR (XOR8 (LI8 3), $Idx), 2, 61));
1612 dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
1613 dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
1614
1615 /* LE variable double
1616 Same as the LE doubleword except there is no move.
1617 */
1618 dag LE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1619 (COPY_TO_REGCLASS $S, VRRC),
1620 LE_VDWORD_PERM_VEC);
1621 dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
1622
1623 /* BE variable byte
1624 The algorithm here is the same as the LE variable byte except:
1625 - The shift in the VMX register is by 0/8 for opposite element numbers so
1626 we simply AND the element number with 0x8
1627 - The order of elements after the move to GPR is reversed, so we invert
1628 the bits of the index prior to truncating to the range 0-7
1629 */
1630 dag BE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDIo8 $Idx, 8));
1631 dag BE_VBYTE_PERMUTE = (VPERM $S, $S, BE_VBYTE_PERM_VEC);
1632 dag BE_MV_VBYTE = (MFVSRD
1633 (EXTRACT_SUBREG
1634 (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1635 sub_64));
1636 dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1637 sub_32);
1638 dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1639 sub_32);
1640
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001641 /* BE variable halfword
1642 The algorithm here is the same as the LE variable halfword except:
1643 - The shift in the VMX register is by 0/8 for opposite element numbers so
1644 we simply AND the element number with 0x4 and multiply by 2
1645 - The order of elements after the move to GPR is reversed, so we invert
1646 the bits of the index prior to truncating to the range 0-3
1647 */
1648 dag BE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 4), 1, 62));
1649 dag BE_VHALF_PERMUTE = (VPERM $S, $S, BE_VHALF_PERM_VEC);
1650 dag BE_MV_VHALF = (MFVSRD
1651 (EXTRACT_SUBREG
1652 (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1653 sub_64));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001654 dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001655 sub_32);
1656 dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1657 sub_32);
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001658
1659 /* BE variable word
1660 The algorithm is the same as the LE variable word except:
1661 - The shift in the VMX register happens for opposite element numbers
1662 - The order of elements after the move to GPR is reversed, so we invert
1663 the bits of the index prior to truncating to the range 0-1
1664 */
1665 dag BE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 2), 2, 61));
1666 dag BE_VWORD_PERMUTE = (VPERM $S, $S, BE_VWORD_PERM_VEC);
1667 dag BE_MV_VWORD = (MFVSRD
1668 (EXTRACT_SUBREG
1669 (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
1670 sub_64));
1671 dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
1672 sub_32);
1673 dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
1674 sub_32);
1675
1676 /* BE variable doubleword
1677 Same as the LE doubleword except we shift in the VMX register for opposite
1678 element indices.
1679 */
1680 dag BE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 1), 3, 60));
1681 dag BE_VDWORD_PERMUTE = (VPERM $S, $S, BE_VDWORD_PERM_VEC);
1682 dag BE_VARIABLE_DWORD =
1683 (MFVSRD (EXTRACT_SUBREG
1684 (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
1685 sub_64));
1686
1687 /* BE variable float
1688 - Shift the vector to line up the desired element to BE Word 0
1689 - Convert 32-bit float to a 64-bit single precision float
1690 */
1691 dag BE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR $Idx, 2, 61));
1692 dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
1693 dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
1694
1695 /* BE variable double
1696 Same as the BE doubleword except there is no move.
1697 */
1698 dag BE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1699 (COPY_TO_REGCLASS $S, VRRC),
1700 BE_VDWORD_PERM_VEC);
1701 dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001702}
1703
1704// v4f32 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001705let Predicates = [IsBigEndian, HasP8Vector] in {
1706 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1707 (v4f32 (XSCVDPSPN $A))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001708 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1709 (f32 (XSCVSPDPN $S))>;
1710 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1711 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1712 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001713 (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001714 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1715 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001716 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1717 (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001718} // IsBigEndian, HasP8Vector
1719
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001720// Variable index vector_extract for v2f64 does not require P8Vector
1721let Predicates = [IsBigEndian, HasVSX] in
1722 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1723 (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
1724
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001725let Predicates = [IsBigEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001726 // v16i8 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001727 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001728 (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001729 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001730 (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001731 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001732 (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001733 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001734 (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
1735 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001736 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001737 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001738 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001739 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001740 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001741 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001742 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001743 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001744 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001745 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001746 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001747 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001748 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001749 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001750 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001751 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001752 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001753 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001754 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001755 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001756 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001757 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001758 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001759 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001760 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001761 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001762 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001763 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001764 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001765 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001766 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001767 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001768 (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001769
1770 // v8i16 scalar <-> vector conversions (BE)
1771 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001772 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001773 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001774 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001775 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001776 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001777 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001778 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001779 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001780 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001781 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001782 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001783 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001784 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001785 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001786 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001787 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001788 (i32 VectorExtractions.BE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001789
1790 // v4i32 scalar <-> vector conversions (BE)
1791 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001792 (i32 VectorExtractions.LE_WORD_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001793 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001794 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001795 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001796 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001797 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001798 (i32 VectorExtractions.LE_WORD_0)>;
1799 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1800 (i32 VectorExtractions.BE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001801
1802 // v2i64 scalar <-> vector conversions (BE)
1803 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001804 (i64 VectorExtractions.LE_DWORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001805 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001806 (i64 VectorExtractions.LE_DWORD_0)>;
1807 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1808 (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001809} // IsBigEndian, HasDirectMove
1810
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001811// v4f32 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001812let Predicates = [IsLittleEndian, HasP8Vector] in {
1813 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1814 (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001815 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1816 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1817 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001818 (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001819 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1820 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1821 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1822 (f32 (XSCVSPDPN $S))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001823 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1824 (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001825} // IsLittleEndian, HasP8Vector
1826
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001827// Variable index vector_extract for v2f64 does not require P8Vector
1828let Predicates = [IsLittleEndian, HasVSX] in
1829 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1830 (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
1831
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001832let Predicates = [IsLittleEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001833 // v16i8 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001834 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001835 (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001836 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001837 (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001838 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001839 (v4i32 MovesToVSR.LE_WORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001840 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001841 (v2i64 MovesToVSR.LE_DWORD_0)>;
1842 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001843 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001844 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001845 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001846 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001847 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001848 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001849 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001850 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001851 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001852 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001853 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001854 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001855 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001856 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001857 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001858 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001859 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001860 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001861 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001862 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001863 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001864 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001865 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001866 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001867 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001868 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001869 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001870 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001871 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001872 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001873 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001874 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001875 (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001876
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001877 // v8i16 scalar <-> vector conversions (LE)
1878 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001879 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001880 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001881 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001882 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001883 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001884 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001885 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001886 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001887 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001888 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001889 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001890 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001891 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001892 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001893 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001894 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001895 (i32 VectorExtractions.LE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001896
1897 // v4i32 scalar <-> vector conversions (LE)
1898 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001899 (i32 VectorExtractions.LE_WORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001900 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001901 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001902 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001903 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001904 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001905 (i32 VectorExtractions.LE_WORD_3)>;
1906 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1907 (i32 VectorExtractions.LE_VARIABLE_WORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001908
1909 // v2i64 scalar <-> vector conversions (LE)
1910 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001911 (i64 VectorExtractions.LE_DWORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001912 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001913 (i64 VectorExtractions.LE_DWORD_1)>;
1914 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1915 (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001916} // IsLittleEndian, HasDirectMove
Nemanja Ivanovic89224762015-12-15 14:50:34 +00001917
1918let Predicates = [HasDirectMove, HasVSX] in {
1919// bitconvert f32 -> i32
1920// (convert to 32-bit fp single, shift right 1 word, move to GPR)
1921def : Pat<(i32 (bitconvert f32:$S)),
1922 (i32 (MFVSRWZ (EXTRACT_SUBREG
1923 (XXSLDWI (XSCVDPSPN $S),(XSCVDPSPN $S), 3),
1924 sub_64)))>;
1925// bitconvert i32 -> f32
1926// (move to FPR, shift left 1 word, convert to 64-bit fp single)
1927def : Pat<(f32 (bitconvert i32:$A)),
1928 (f32 (XSCVSPDPN
1929 (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
1930
1931// bitconvert f64 -> i64
1932// (move to GPR, nothing else needed)
1933def : Pat<(i64 (bitconvert f64:$S)),
1934 (i64 (MFVSRD $S))>;
1935
1936// bitconvert i64 -> f64
1937// (move to FPR, nothing else needed)
1938def : Pat<(f64 (bitconvert i64:$S)),
1939 (f64 (MTVSRD $S))>;
1940}
Kit Barton93612ec2016-02-26 21:11:55 +00001941
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00001942def AlignValues {
1943 dag F32_TO_BE_WORD1 = (v4f32 (XXSLDWI (XSCVDPSPN $B), (XSCVDPSPN $B), 3));
1944 dag I32_TO_BE_WORD1 = (COPY_TO_REGCLASS (MTVSRWZ $B), VSRC);
1945}
1946
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00001947// Materialize a zero-vector of long long
1948def : Pat<(v2i64 immAllZerosV),
1949 (v2i64 (XXLXORz))>;
1950
Kit Barton93612ec2016-02-26 21:11:55 +00001951// The following VSX instructions were introduced in Power ISA 3.0
1952def HasP9Vector : Predicate<"PPCSubTarget->hasP9Vector()">;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00001953let AddedComplexity = 400, Predicates = [HasP9Vector] in {
Kit Barton93612ec2016-02-26 21:11:55 +00001954
1955 // [PO VRT XO VRB XO /]
1956 class X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1957 list<dag> pattern>
1958 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB),
1959 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1960
1961 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
1962 class X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1963 list<dag> pattern>
1964 : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isDOT;
1965
1966 // [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less),
1967 // So we use different operand class for VRB
1968 class X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1969 RegisterOperand vbtype, list<dag> pattern>
1970 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB),
1971 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1972
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001973 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00001974 // [PO T XO B XO BX /]
1975 class XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1976 list<dag> pattern>
1977 : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB),
1978 !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>;
1979
Kit Barton93612ec2016-02-26 21:11:55 +00001980 // [PO T XO B XO BX TX]
1981 class XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1982 RegisterOperand vtype, list<dag> pattern>
1983 : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB),
1984 !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>;
1985
1986 // [PO T A B XO AX BX TX], src and dest register use different operand class
1987 class XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc,
1988 RegisterOperand xty, RegisterOperand aty, RegisterOperand bty,
1989 InstrItinClass itin, list<dag> pattern>
1990 : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB),
1991 !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001992 } // UseVSXReg = 1
Kit Barton93612ec2016-02-26 21:11:55 +00001993
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00001994 // [PO VRT VRA VRB XO /]
1995 class X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1996 list<dag> pattern>
1997 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB),
1998 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>;
1999
2000 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
2001 class X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc,
2002 list<dag> pattern>
2003 : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isDOT;
2004
2005 //===--------------------------------------------------------------------===//
2006 // Quad-Precision Scalar Move Instructions:
2007
2008 // Copy Sign
2009 def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp", []>;
2010
2011 // Absolute/Negative-Absolute/Negate
2012 def XSABSQP : X_VT5_XO5_VB5<63, 0, 804, "xsabsqp" , []>;
2013 def XSNABSQP : X_VT5_XO5_VB5<63, 8, 804, "xsnabsqp", []>;
2014 def XSNEGQP : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp" , []>;
2015
2016 //===--------------------------------------------------------------------===//
2017 // Quad-Precision Scalar Floating-Point Arithmetic Instructions:
2018
2019 // Add/Divide/Multiply/Subtract
2020 def XSADDQP : X_VT5_VA5_VB5 <63, 4, "xsaddqp" , []>;
2021 def XSADDQPO : X_VT5_VA5_VB5_Ro<63, 4, "xsaddqpo", []>;
2022 def XSDIVQP : X_VT5_VA5_VB5 <63, 548, "xsdivqp" , []>;
2023 def XSDIVQPO : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo", []>;
2024 def XSMULQP : X_VT5_VA5_VB5 <63, 36, "xsmulqp" , []>;
2025 def XSMULQPO : X_VT5_VA5_VB5_Ro<63, 36, "xsmulqpo", []>;
2026 def XSSUBQP : X_VT5_VA5_VB5 <63, 516, "xssubqp" , []>;
2027 def XSSUBQPO : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo", []>;
2028
2029 // Square-Root
2030 def XSSQRTQP : X_VT5_XO5_VB5 <63, 27, 804, "xssqrtqp" , []>;
2031 def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo", []>;
2032
2033 // (Negative) Multiply-{Add/Subtract}
2034 def XSMADDQP : X_VT5_VA5_VB5 <63, 388, "xsmaddqp" , []>;
2035 def XSMADDQPO : X_VT5_VA5_VB5_Ro<63, 388, "xsmaddqpo" , []>;
2036 def XSMSUBQP : X_VT5_VA5_VB5 <63, 420, "xsmsubqp" , []>;
2037 def XSMSUBQPO : X_VT5_VA5_VB5_Ro<63, 420, "xsmsubqpo" , []>;
2038 def XSNMADDQP : X_VT5_VA5_VB5 <63, 452, "xsnmaddqp" , []>;
2039 def XSNMADDQPO: X_VT5_VA5_VB5_Ro<63, 452, "xsnmaddqpo", []>;
2040 def XSNMSUBQP : X_VT5_VA5_VB5 <63, 484, "xsnmsubqp" , []>;
2041 def XSNMSUBQPO: X_VT5_VA5_VB5_Ro<63, 484, "xsnmsubqpo", []>;
2042
Kit Barton93612ec2016-02-26 21:11:55 +00002043 //===--------------------------------------------------------------------===//
2044 // Quad/Double-Precision Compare Instructions:
2045
2046 // [PO BF // VRA VRB XO /]
2047 class X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
2048 list<dag> pattern>
2049 : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB),
2050 !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> {
2051 let Pattern = pattern;
2052 }
2053
2054 // QP Compare Ordered/Unordered
2055 def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>;
2056 def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>;
2057
2058 // DP/QP Compare Exponents
2059 def XSCMPEXPDP : XX3Form_1<60, 59,
2060 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002061 "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>,
2062 UseVSXReg;
Kit Barton93612ec2016-02-26 21:11:55 +00002063 def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>;
2064
2065 // DP Compare ==, >=, >, !=
2066 // Use vsrc for XT, because the entire register of XT is set.
2067 // XT.dword[1] = 0x0000_0000_0000_0000
2068 def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc,
2069 IIC_FPCompare, []>;
2070 def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc,
2071 IIC_FPCompare, []>;
2072 def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc,
2073 IIC_FPCompare, []>;
2074 def XSCMPNEDP : XX3_XT5_XA5_XB5<60, 27, "xscmpnedp", vsrc, vsfrc, vsfrc,
2075 IIC_FPCompare, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002076 let UseVSXReg = 1 in {
Kit Barton93612ec2016-02-26 21:11:55 +00002077 // Vector Compare Not Equal
2078 def XVCMPNEDP : XX3Form_Rc<60, 123,
2079 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
2080 "xvcmpnedp $XT, $XA, $XB", IIC_VecFPCompare, []>;
2081 let Defs = [CR6] in
2082 def XVCMPNEDPo : XX3Form_Rc<60, 123,
2083 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
2084 "xvcmpnedp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
2085 isDOT;
2086 def XVCMPNESP : XX3Form_Rc<60, 91,
2087 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
2088 "xvcmpnesp $XT, $XA, $XB", IIC_VecFPCompare, []>;
2089 let Defs = [CR6] in
2090 def XVCMPNESPo : XX3Form_Rc<60, 91,
2091 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
2092 "xvcmpnesp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
2093 isDOT;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002094 } // UseVSXReg = 1
Kit Barton93612ec2016-02-26 21:11:55 +00002095
2096 //===--------------------------------------------------------------------===//
2097 // Quad-Precision Floating-Point Conversion Instructions:
2098
2099 // Convert DP -> QP
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002100 def XSCVDPQP : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vfrc, []>;
Kit Barton93612ec2016-02-26 21:11:55 +00002101
2102 // Round & Convert QP -> DP (dword[1] is set to zero)
2103 def XSCVQPDP : X_VT5_XO5_VB5 <63, 20, 836, "xscvqpdp" , []>;
2104 def XSCVQPDPO : X_VT5_XO5_VB5_Ro<63, 20, 836, "xscvqpdpo", []>;
2105
2106 // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero)
2107 def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>;
2108 def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>;
2109 def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>;
2110 def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>;
2111
2112 // Convert (Un)Signed DWord -> QP
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002113 def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vfrc, []>;
2114 def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vfrc, []>;
Kit Barton93612ec2016-02-26 21:11:55 +00002115
2116 //===--------------------------------------------------------------------===//
2117 // Round to Floating-Point Integer Instructions
2118
2119 // (Round &) Convert DP <-> HP
2120 // Note! xscvdphp's src and dest register both use the left 64 bits, so we use
2121 // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits,
2122 // but we still use vsfrc for it.
2123 def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>;
2124 def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>;
2125
2126 // Vector HP -> SP
2127 def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>;
2128 def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc, []>;
2129
2130 class Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc,
2131 list<dag> pattern>
2132 : Z23Form_1<opcode, xo,
2133 (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc),
2134 !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> {
2135 let RC = ex;
2136 }
2137
2138 // Round to Quad-Precision Integer [with Inexact]
2139 def XSRQPI : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 0, "xsrqpi" , []>;
2140 def XSRQPIX : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 1, "xsrqpix", []>;
2141
2142 // Round Quad-Precision to Double-Extended Precision (fp80)
2143 def XSRQPXP : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002144
2145 //===--------------------------------------------------------------------===//
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002146 // Insert/Extract Instructions
2147
2148 // Insert Exponent DP/QP
2149 // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU
2150 def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002151 "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>, UseVSXReg;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002152 // vB NOTE: only vB.dword[0] is used, that's why we don't use
2153 // X_VT5_VA5_VB5 form
2154 def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB),
2155 "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>;
2156
2157 // Extract Exponent/Significand DP/QP
2158 def XSXEXPDP : XX2_RT5_XO5_XB6<60, 0, 347, "xsxexpdp", []>;
2159 def XSXSIGDP : XX2_RT5_XO5_XB6<60, 1, 347, "xsxsigdp", []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002160
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002161 def XSXEXPQP : X_VT5_XO5_VB5 <63, 2, 804, "xsxexpqp", []>;
2162 def XSXSIGQP : X_VT5_XO5_VB5 <63, 18, 804, "xsxsigqp", []>;
2163
2164 // Vector Insert Word
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002165 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002166 // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB.
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002167 def XXINSERTW :
2168 XX2_RD6_UIM5_RS6<60, 181, (outs vsrc:$XT),
2169 (ins vsrc:$XTi, vsrc:$XB, u4imm:$UIM),
2170 "xxinsertw $XT, $XB, $UIM", IIC_VecFP,
2171 [(set v4i32:$XT, (PPCxxinsert v4i32:$XTi, v4i32:$XB,
2172 imm32SExt16:$UIM))]>,
2173 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002174
2175 // Vector Extract Unsigned Word
2176 def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165,
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002177 (outs vsfrc:$XT), (ins vsrc:$XB, u4imm:$UIMM),
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002178 "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002179 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002180
2181 // Vector Insert Exponent DP/SP
2182 def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc,
2183 IIC_VecFP, []>;
2184 def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc,
2185 IIC_VecFP, []>;
2186
2187 // Vector Extract Exponent/Significand DP/SP
2188 def XVXEXPDP : XX2_XT6_XO5_XB6<60, 0, 475, "xvxexpdp", vsrc, []>;
2189 def XVXEXPSP : XX2_XT6_XO5_XB6<60, 8, 475, "xvxexpsp", vsrc, []>;
2190 def XVXSIGDP : XX2_XT6_XO5_XB6<60, 1, 475, "xvxsigdp", vsrc, []>;
2191 def XVXSIGSP : XX2_XT6_XO5_XB6<60, 9, 475, "xvxsigsp", vsrc, []>;
2192
2193 //===--------------------------------------------------------------------===//
2194
2195 // Test Data Class SP/DP/QP
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002196 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002197 def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298,
2198 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2199 "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>;
2200 def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362,
2201 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2202 "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002203 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002204 def XSTSTDCQP : X_BF3_DCMX7_RS5 <63, 708,
2205 (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB),
2206 "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>;
2207
2208 // Vector Test Data Class SP/DP
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002209 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002210 def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5,
2211 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2212 "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP, []>;
2213 def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5,
2214 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2215 "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002216 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002217
2218 //===--------------------------------------------------------------------===//
2219
2220 // Maximum/Minimum Type-C/Type-J DP
2221 // XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU, so we use vsrc for XT
2222 def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsrc, vsfrc, vsfrc,
2223 IIC_VecFP, []>;
2224 def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc,
2225 IIC_VecFP, []>;
2226 def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsrc, vsfrc, vsfrc,
2227 IIC_VecFP, []>;
2228 def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc,
2229 IIC_VecFP, []>;
2230
2231 //===--------------------------------------------------------------------===//
2232
2233 // Vector Byte-Reverse H/W/D/Q Word
2234 def XXBRH : XX2_XT6_XO5_XB6<60, 7, 475, "xxbrh", vsrc, []>;
2235 def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, []>;
2236 def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, []>;
2237 def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>;
2238
2239 // Vector Permute
2240 def XXPERM : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc,
2241 IIC_VecPerm, []>;
2242 def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc,
2243 IIC_VecPerm, []>;
2244
2245 // Vector Splat Immediate Byte
2246 def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002247 "xxspltib $XT, $IMM8", IIC_VecPerm, []>, UseVSXReg;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002248
2249 //===--------------------------------------------------------------------===//
Kit Bartonba532dc2016-03-08 03:49:13 +00002250 // Vector/Scalar Load/Store Instructions
2251
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00002252 // When adding new D-Form loads/stores, be sure to update the ImmToIdxMap in
2253 // PPCRegisterInfo::PPCRegisterInfo and maybe save yourself some debugging.
Kit Bartonba532dc2016-03-08 03:49:13 +00002254 let mayLoad = 1 in {
2255 // Load Vector
2256 def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002257 "lxv $XT, $src", IIC_LdStLFD, []>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002258 // Load DWord
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002259 def LXSD : DSForm_1<57, 2, (outs vfrc:$vD), (ins memrix:$src),
Kit Bartonba532dc2016-03-08 03:49:13 +00002260 "lxsd $vD, $src", IIC_LdStLFD, []>;
2261 // Load SP from src, convert it to DP, and place in dword[0]
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002262 def LXSSP : DSForm_1<57, 3, (outs vfrc:$vD), (ins memrix:$src),
Kit Bartonba532dc2016-03-08 03:49:13 +00002263 "lxssp $vD, $src", IIC_LdStLFD, []>;
2264
2265 // [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different
2266 // "out" and "in" dag
2267 class X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2268 RegisterOperand vtype, list<dag> pattern>
2269 : XX1Form<opcode, xo, (outs vtype:$XT), (ins memrr:$src),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002270 !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002271
2272 // Load as Integer Byte/Halfword & Zero Indexed
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002273 def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc,
2274 [(set f64:$XT, (PPClxsizx xoaddr:$src, 1))]>;
2275 def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc,
2276 [(set f64:$XT, (PPClxsizx xoaddr:$src, 2))]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002277
2278 // Load Vector Halfword*8/Byte*16 Indexed
2279 def LXVH8X : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>;
2280 def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>;
2281
2282 // Load Vector Indexed
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00002283 def LXVX : X_XT6_RA5_RB5<31, 268, "lxvx" , vsrc,
2284 [(set v2f64:$XT, (load xoaddr:$src))]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002285
2286 // Load Vector (Left-justified) with Length
2287 def LXVL : X_XT6_RA5_RB5<31, 269, "lxvl" , vsrc, []>;
2288 def LXVLL : X_XT6_RA5_RB5<31, 301, "lxvll" , vsrc, []>;
2289
2290 // Load Vector Word & Splat Indexed
2291 def LXVWSX : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002292 } // mayLoad
Kit Bartonba532dc2016-03-08 03:49:13 +00002293
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00002294 // When adding new D-Form loads/stores, be sure to update the ImmToIdxMap in
2295 // PPCRegisterInfo::PPCRegisterInfo and maybe save yourself some debugging.
Kit Bartonba532dc2016-03-08 03:49:13 +00002296 let mayStore = 1 in {
2297 // Store Vector
2298 def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002299 "stxv $XT, $dst", IIC_LdStSTFD, []>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002300 // Store DWord
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002301 def STXSD : DSForm_1<61, 2, (outs), (ins vfrc:$vS, memrix:$dst),
Kit Bartonba532dc2016-03-08 03:49:13 +00002302 "stxsd $vS, $dst", IIC_LdStSTFD, []>;
2303 // Convert DP of dword[0] to SP, and Store to dst
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002304 def STXSSP : DSForm_1<61, 3, (outs), (ins vfrc:$vS, memrix:$dst),
Kit Bartonba532dc2016-03-08 03:49:13 +00002305 "stxssp $vS, $dst", IIC_LdStSTFD, []>;
2306
2307 // [PO S RA RB XO SX]
2308 class X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2309 RegisterOperand vtype, list<dag> pattern>
2310 : XX1Form<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002311 !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002312
2313 // Store as Integer Byte/Halfword Indexed
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002314 def STXSIBX : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsfrc,
2315 [(PPCstxsix f64:$XT, xoaddr:$dst, 1)]>;
2316 def STXSIHX : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsfrc,
2317 [(PPCstxsix f64:$XT, xoaddr:$dst, 2)]>;
2318 let isCodeGenOnly = 1 in {
2319 def STXSIBXv : X_XS6_RA5_RB5<31, 909, "stxsibx" , vrrc, []>;
2320 def STXSIHXv : X_XS6_RA5_RB5<31, 941, "stxsihx" , vrrc, []>;
2321 }
Kit Bartonba532dc2016-03-08 03:49:13 +00002322
2323 // Store Vector Halfword*8/Byte*16 Indexed
2324 def STXVH8X : X_XS6_RA5_RB5<31, 940, "stxvh8x" , vsrc, []>;
2325 def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>;
2326
2327 // Store Vector Indexed
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00002328 def STXVX : X_XS6_RA5_RB5<31, 396, "stxvx" , vsrc,
2329 [(store v2f64:$XT, xoaddr:$dst)]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002330
2331 // Store Vector (Left-justified) with Length
2332 def STXVL : X_XS6_RA5_RB5<31, 397, "stxvl" , vsrc, []>;
2333 def STXVLL : X_XS6_RA5_RB5<31, 429, "stxvll" , vsrc, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002334 } // mayStore
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002335
2336 // Patterns for which instructions from ISA 3.0 are a better match
2337 let Predicates = [IsLittleEndian, HasP9Vector] in {
2338 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 0))))),
2339 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
2340 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 1))))),
2341 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
2342 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 2))))),
2343 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
2344 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 3))))),
2345 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
2346 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
2347 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
2348 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
2349 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
2350 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
2351 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
2352 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
2353 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
2354 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
2355 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
2356 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
2357 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
2358 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
2359 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
2360 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
2361 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
2362 } // IsLittleEndian, HasP9Vector
2363
2364 let Predicates = [IsBigEndian, HasP9Vector] in {
2365 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 0))))),
2366 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
2367 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 1))))),
2368 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
2369 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 2))))),
2370 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
2371 def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 3))))),
2372 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
2373 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
2374 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
2375 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
2376 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
2377 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
2378 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
2379 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
2380 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
2381 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
2382 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
2383 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
2384 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
2385 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
2386 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
2387 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
2388 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
2389 } // IsLittleEndian, HasP9Vector
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00002390
2391 def : Pat<(v2f64 (load xoaddr:$src)), (LXVX xoaddr:$src)>;
2392 def : Pat<(v2i64 (load xoaddr:$src)), (LXVX xoaddr:$src)>;
2393 def : Pat<(v4f32 (load xoaddr:$src)), (LXVX xoaddr:$src)>;
2394 def : Pat<(v4i32 (load xoaddr:$src)), (LXVX xoaddr:$src)>;
2395 def : Pat<(v4i32 (int_ppc_vsx_lxvw4x xoaddr:$src)), (LXVX xoaddr:$src)>;
2396 def : Pat<(v2f64 (int_ppc_vsx_lxvd2x xoaddr:$src)), (LXVX xoaddr:$src)>;
2397 def : Pat<(store v2f64:$rS, xoaddr:$dst), (STXVX $rS, xoaddr:$dst)>;
2398 def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVX $rS, xoaddr:$dst)>;
2399 def : Pat<(store v4f32:$rS, xoaddr:$dst), (STXVX $rS, xoaddr:$dst)>;
2400 def : Pat<(store v4i32:$rS, xoaddr:$dst), (STXVX $rS, xoaddr:$dst)>;
2401 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
2402 (STXVX $rS, xoaddr:$dst)>;
2403 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
2404 (STXVX $rS, xoaddr:$dst)>;
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00002405
2406 def : Pat<(v4i32 (scalar_to_vector (i32 (load xoaddr:$src)))),
2407 (v4i32 (LXVWSX xoaddr:$src))>;
2408 def : Pat<(v4f32 (scalar_to_vector (f32 (load xoaddr:$src)))),
2409 (v4f32 (LXVWSX xoaddr:$src))>;
2410 def : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)),
2411 (v4i32 (MTVSRWS $A))>;
2412 def : Pat<(v16i8 (build_vector immSExt8:$A, immSExt8:$A, immSExt8:$A,
2413 immSExt8:$A, immSExt8:$A, immSExt8:$A,
2414 immSExt8:$A, immSExt8:$A, immSExt8:$A,
2415 immSExt8:$A, immSExt8:$A, immSExt8:$A,
2416 immSExt8:$A, immSExt8:$A, immSExt8:$A,
2417 immSExt8:$A)),
2418 (v16i8 (COPY_TO_REGCLASS (XXSPLTIB imm:$A), VSRC))>;
2419 def : Pat<(v16i8 immAllOnesV),
2420 (v16i8 (COPY_TO_REGCLASS (XXSPLTIB 255), VSRC))>;
2421 def : Pat<(v8i16 immAllOnesV),
2422 (v8i16 (COPY_TO_REGCLASS (XXSPLTIB 255), VSRC))>;
2423 def : Pat<(v4i32 immAllOnesV),
2424 (v4i32 (XXSPLTIB 255))>;
2425 def : Pat<(v2i64 immAllOnesV),
2426 (v2i64 (XXSPLTIB 255))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002427
2428 // Build vectors from i8 loads
2429 def : Pat<(v16i8 (scalar_to_vector ScalarLoads.Li8)),
2430 (v16i8 (VSPLTBs 7, (LXSIBZX xoaddr:$src)))>;
2431 def : Pat<(v8i16 (scalar_to_vector ScalarLoads.ZELi8)),
2432 (v8i16 (VSPLTHs 3, (LXSIBZX xoaddr:$src)))>;
2433 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.ZELi8)),
2434 (v4i32 (XXSPLTWs (LXSIBZX xoaddr:$src), 1))>;
2435 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.ZELi8i64)),
2436 (v2i64 (XXPERMDIs (LXSIBZX xoaddr:$src), 0))>;
2437 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.SELi8)),
2438 (v4i32 (XXSPLTWs (VEXTSB2Ws (LXSIBZX xoaddr:$src)), 1))>;
2439 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.SELi8i64)),
2440 (v2i64 (XXPERMDIs (VEXTSB2Ds (LXSIBZX xoaddr:$src)), 0))>;
2441
2442 // Build vectors from i16 loads
2443 def : Pat<(v8i16 (scalar_to_vector ScalarLoads.Li16)),
2444 (v8i16 (VSPLTHs 3, (LXSIHZX xoaddr:$src)))>;
2445 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.ZELi16)),
2446 (v4i32 (XXSPLTWs (LXSIHZX xoaddr:$src), 1))>;
2447 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.ZELi16i64)),
2448 (v2i64 (XXPERMDIs (LXSIHZX xoaddr:$src), 0))>;
2449 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.SELi16)),
2450 (v4i32 (XXSPLTWs (VEXTSH2Ws (LXSIHZX xoaddr:$src)), 1))>;
2451 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.SELi16i64)),
2452 (v2i64 (XXPERMDIs (VEXTSH2Ds (LXSIHZX xoaddr:$src)), 0))>;
2453
2454 let Predicates = [IsBigEndian, HasP9Vector] in {
2455 // Scalar stores of i8
2456 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 0)), xoaddr:$dst),
2457 (STXSIBXv (VSLDOI $S, $S, 9), xoaddr:$dst)>;
2458 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 1)), xoaddr:$dst),
2459 (STXSIBXv (VSLDOI $S, $S, 10), xoaddr:$dst)>;
2460 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 2)), xoaddr:$dst),
2461 (STXSIBXv (VSLDOI $S, $S, 11), xoaddr:$dst)>;
2462 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 3)), xoaddr:$dst),
2463 (STXSIBXv (VSLDOI $S, $S, 12), xoaddr:$dst)>;
2464 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 4)), xoaddr:$dst),
2465 (STXSIBXv (VSLDOI $S, $S, 13), xoaddr:$dst)>;
2466 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 5)), xoaddr:$dst),
2467 (STXSIBXv (VSLDOI $S, $S, 14), xoaddr:$dst)>;
2468 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 6)), xoaddr:$dst),
2469 (STXSIBXv (VSLDOI $S, $S, 15), xoaddr:$dst)>;
2470 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 7)), xoaddr:$dst),
2471 (STXSIBXv $S, xoaddr:$dst)>;
2472 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 8)), xoaddr:$dst),
2473 (STXSIBXv (VSLDOI $S, $S, 1), xoaddr:$dst)>;
2474 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 9)), xoaddr:$dst),
2475 (STXSIBXv (VSLDOI $S, $S, 2), xoaddr:$dst)>;
2476 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 10)), xoaddr:$dst),
2477 (STXSIBXv (VSLDOI $S, $S, 3), xoaddr:$dst)>;
2478 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 11)), xoaddr:$dst),
2479 (STXSIBXv (VSLDOI $S, $S, 4), xoaddr:$dst)>;
2480 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 12)), xoaddr:$dst),
2481 (STXSIBXv (VSLDOI $S, $S, 5), xoaddr:$dst)>;
2482 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 13)), xoaddr:$dst),
2483 (STXSIBXv (VSLDOI $S, $S, 6), xoaddr:$dst)>;
2484 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 14)), xoaddr:$dst),
2485 (STXSIBXv (VSLDOI $S, $S, 7), xoaddr:$dst)>;
2486 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 15)), xoaddr:$dst),
2487 (STXSIBXv (VSLDOI $S, $S, 8), xoaddr:$dst)>;
2488
2489 // Scalar stores of i16
2490 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 0)), xoaddr:$dst),
2491 (STXSIHXv (VSLDOI $S, $S, 10), xoaddr:$dst)>;
2492 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 1)), xoaddr:$dst),
2493 (STXSIHXv (VSLDOI $S, $S, 12), xoaddr:$dst)>;
2494 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 2)), xoaddr:$dst),
2495 (STXSIHXv (VSLDOI $S, $S, 14), xoaddr:$dst)>;
2496 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 3)), xoaddr:$dst),
2497 (STXSIHXv $S, xoaddr:$dst)>;
2498 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 4)), xoaddr:$dst),
2499 (STXSIHXv (VSLDOI $S, $S, 2), xoaddr:$dst)>;
2500 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 5)), xoaddr:$dst),
2501 (STXSIHXv (VSLDOI $S, $S, 4), xoaddr:$dst)>;
2502 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 6)), xoaddr:$dst),
2503 (STXSIHXv (VSLDOI $S, $S, 6), xoaddr:$dst)>;
2504 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 7)), xoaddr:$dst),
2505 (STXSIHXv (VSLDOI $S, $S, 8), xoaddr:$dst)>;
2506 } // IsBigEndian, HasP9Vector
2507
2508 let Predicates = [IsLittleEndian, HasP9Vector] in {
2509 // Scalar stores of i8
2510 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 0)), xoaddr:$dst),
2511 (STXSIBXv (VSLDOI $S, $S, 8), xoaddr:$dst)>;
2512 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 1)), xoaddr:$dst),
2513 (STXSIBXv (VSLDOI $S, $S, 7), xoaddr:$dst)>;
2514 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 2)), xoaddr:$dst),
2515 (STXSIBXv (VSLDOI $S, $S, 6), xoaddr:$dst)>;
2516 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 3)), xoaddr:$dst),
2517 (STXSIBXv (VSLDOI $S, $S, 5), xoaddr:$dst)>;
2518 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 4)), xoaddr:$dst),
2519 (STXSIBXv (VSLDOI $S, $S, 4), xoaddr:$dst)>;
2520 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 5)), xoaddr:$dst),
2521 (STXSIBXv (VSLDOI $S, $S, 3), xoaddr:$dst)>;
2522 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 6)), xoaddr:$dst),
2523 (STXSIBXv (VSLDOI $S, $S, 2), xoaddr:$dst)>;
2524 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 7)), xoaddr:$dst),
2525 (STXSIBXv (VSLDOI $S, $S, 1), xoaddr:$dst)>;
2526 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 8)), xoaddr:$dst),
2527 (STXSIBXv $S, xoaddr:$dst)>;
2528 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 9)), xoaddr:$dst),
2529 (STXSIBXv (VSLDOI $S, $S, 15), xoaddr:$dst)>;
2530 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 10)), xoaddr:$dst),
2531 (STXSIBXv (VSLDOI $S, $S, 14), xoaddr:$dst)>;
2532 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 11)), xoaddr:$dst),
2533 (STXSIBXv (VSLDOI $S, $S, 13), xoaddr:$dst)>;
2534 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 12)), xoaddr:$dst),
2535 (STXSIBXv (VSLDOI $S, $S, 12), xoaddr:$dst)>;
2536 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 13)), xoaddr:$dst),
2537 (STXSIBXv (VSLDOI $S, $S, 11), xoaddr:$dst)>;
2538 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 14)), xoaddr:$dst),
2539 (STXSIBXv (VSLDOI $S, $S, 10), xoaddr:$dst)>;
2540 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 15)), xoaddr:$dst),
2541 (STXSIBXv (VSLDOI $S, $S, 9), xoaddr:$dst)>;
2542
2543 // Scalar stores of i16
2544 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 0)), xoaddr:$dst),
2545 (STXSIHXv (VSLDOI $S, $S, 8), xoaddr:$dst)>;
2546 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 1)), xoaddr:$dst),
2547 (STXSIHXv (VSLDOI $S, $S, 6), xoaddr:$dst)>;
2548 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 2)), xoaddr:$dst),
2549 (STXSIHXv (VSLDOI $S, $S, 4), xoaddr:$dst)>;
2550 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 3)), xoaddr:$dst),
2551 (STXSIHXv (VSLDOI $S, $S, 2), xoaddr:$dst)>;
2552 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 4)), xoaddr:$dst),
2553 (STXSIHXv $S, xoaddr:$dst)>;
2554 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 5)), xoaddr:$dst),
2555 (STXSIHXv (VSLDOI $S, $S, 14), xoaddr:$dst)>;
2556 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 6)), xoaddr:$dst),
2557 (STXSIHXv (VSLDOI $S, $S, 12), xoaddr:$dst)>;
2558 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 7)), xoaddr:$dst),
2559 (STXSIHXv (VSLDOI $S, $S, 10), xoaddr:$dst)>;
2560 } // IsLittleEndian, HasP9Vector
2561
2562 // Vector sign extensions
2563 def : Pat<(f64 (PPCVexts f64:$A, 1)),
2564 (f64 (COPY_TO_REGCLASS (VEXTSB2Ds $A), VSFRC))>;
2565 def : Pat<(f64 (PPCVexts f64:$A, 2)),
2566 (f64 (COPY_TO_REGCLASS (VEXTSH2Ds $A), VSFRC))>;
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00002567 let isPseudo = 1 in {
2568 def DFLOADf32 : Pseudo<(outs vssrc:$XT), (ins memrix:$src),
2569 "#DFLOADf32",
2570 [(set f32:$XT, (load iaddr:$src))]>;
2571 def DFLOADf64 : Pseudo<(outs vsfrc:$XT), (ins memrix:$src),
2572 "#DFLOADf64",
2573 [(set f64:$XT, (load iaddr:$src))]>;
2574 def DFSTOREf32 : Pseudo<(outs), (ins vssrc:$XT, memrix:$dst),
2575 "#DFSTOREf32",
2576 [(store f32:$XT, iaddr:$dst)]>;
2577 def DFSTOREf64 : Pseudo<(outs), (ins vsfrc:$XT, memrix:$dst),
2578 "#DFSTOREf64",
2579 [(store f64:$XT, iaddr:$dst)]>;
2580 }
2581 def : Pat<(f64 (extloadf32 iaddr:$src)),
2582 (COPY_TO_REGCLASS (DFLOADf32 iaddr:$src), VSFRC)>;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002583} // end HasP9Vector, AddedComplexity
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00002584
2585let Predicates = [IsISA3_0, HasDirectMove, IsLittleEndian] in {
2586def : Pat<(v2i64 (build_vector i64:$rA, i64:$rB)),
2587 (v2i64 (MTVSRDD $rB, $rA))>;
2588def : Pat<(i64 (extractelt v2i64:$A, 0)),
2589 (i64 (MFVSRLD $A))>;
2590}
2591
2592let Predicates = [IsISA3_0, HasDirectMove, IsBigEndian] in {
2593def : Pat<(v2i64 (build_vector i64:$rB, i64:$rA)),
2594 (v2i64 (MTVSRDD $rB, $rA))>;
2595def : Pat<(i64 (extractelt v2i64:$A, 1)),
2596 (i64 (MFVSRLD $A))>;
2597}