blob: 8321d7f2ecf06d0640d7147316f56cfb3cbc3941 [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
Zaara Syedafcd96972017-09-21 16:12:33 +000050def PPCRegSPILLTOVSRRCAsmOperand : AsmOperandClass {
51 let Name = "RegSPILLTOVSRRC"; let PredicateMethod = "isVSRegNumber";
52}
53
54def spilltovsrrc : RegisterOperand<SPILLTOVSRRC> {
55 let ParserMatchClass = PPCRegSPILLTOVSRRCAsmOperand;
56}
Bill Schmidtfae5d712014-12-09 16:35:51 +000057// Little-endian-specific nodes.
58def SDT_PPClxvd2x : SDTypeProfile<1, 1, [
59 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
60]>;
61def SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
62 SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
63]>;
64def SDT_PPCxxswapd : SDTypeProfile<1, 1, [
65 SDTCisSameAs<0, 1>
66]>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000067def SDTVecConv : SDTypeProfile<1, 2, [
68 SDTCisVec<0>, SDTCisVec<1>, SDTCisPtrTy<2>
69]>;
Kewen Lin3dac12522018-12-18 03:16:43 +000070def SDTVabsd : SDTypeProfile<1, 3, [
71 SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisVT<3, i32>
72]>;
73
Bill Schmidtfae5d712014-12-09 16:35:51 +000074
75def PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
Sean Fertile3c8c3852017-01-26 18:59:15 +000076 [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000077def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
78 [SDNPHasChain, SDNPMayStore]>;
79def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +000080def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
81def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
82def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000083def PPCsvec2fp : SDNode<"PPCISD::SINT_VEC_TO_FP", SDTVecConv, []>;
84def PPCuvec2fp: SDNode<"PPCISD::UINT_VEC_TO_FP", SDTVecConv, []>;
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +000085def PPCswapNoChain : SDNode<"PPCISD::SWAP_NO_CHAIN", SDT_PPCxxswapd>;
Kewen Lin3dac12522018-12-18 03:16:43 +000086def PPCvabsd : SDNode<"PPCISD::VABSD", SDTVabsd, []>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000087
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000088multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase,
89 string asmstr, InstrItinClass itin, Intrinsic Int,
90 ValueType OutTy, ValueType InTy> {
Hal Finkel27774d92014-03-13 07:58:58 +000091 let BaseName = asmbase in {
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000092 def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000093 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000094 [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000095 let Defs = [CR6] in
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000096 def o : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000097 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000098 [(set InTy:$XT,
99 (InTy (PPCvcmp_o InTy:$XA, InTy:$XB, xo)))]>,
100 isDOT;
Hal Finkel27774d92014-03-13 07:58:58 +0000101 }
102}
103
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000104// Instruction form with a single input register for instructions such as
105// XXPERMDI. The reason for defining this is that specifying multiple chained
106// operands (such as loads) to an instruction will perform both chained
107// operations rather than coalescing them into a single register - even though
108// the source memory location is the same. This simply forces the instruction
109// to use the same register for both inputs.
110// For example, an output DAG such as this:
111// (XXPERMDI (LXSIBZX xoaddr:$src), (LXSIBZX xoaddr:$src ), 0))
112// would result in two load instructions emitted and used as separate inputs
113// to the XXPERMDI instruction.
114class XX3Form_2s<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
115 InstrItinClass itin, list<dag> pattern>
116 : XX3Form_2<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
117 let XB = XA;
118}
119
Eric Christopher1b8e7632014-05-22 01:07:24 +0000120def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000121def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
122def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000123def HasOnlySwappingMemOps : Predicate<"!PPCSubTarget->hasP9Vector()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000124
Hal Finkel27774d92014-03-13 07:58:58 +0000125let Predicates = [HasVSX] in {
126let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000127let UseVSXReg = 1 in {
Craig Topperc50d64b2014-11-26 00:46:26 +0000128let hasSideEffects = 0 in { // VSX instructions don't have side effects.
Hal Finkel27774d92014-03-13 07:58:58 +0000129let Uses = [RM] in {
130
131 // Load indexed instructions
Sean Fertile3c8c3852017-01-26 18:59:15 +0000132 let mayLoad = 1, mayStore = 0 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +0000133 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000134 def LXSDX : XX1Form_memOp<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +0000135 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +0000136 "lxsdx $XT, $src", IIC_LdStLFD,
Lei Huangf4ec6782018-05-24 03:20:28 +0000137 []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000138
Tony Jiang438bf4a2017-11-20 14:38:30 +0000139 // Pseudo instruction XFLOADf64 will be expanded to LXSDX or LFDX later
Jinsong Jic7b43b92018-12-13 15:12:57 +0000140 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000141 def XFLOADf64 : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src),
Tony Jiang438bf4a2017-11-20 14:38:30 +0000142 "#XFLOADf64",
143 [(set f64:$XT, (load xoaddr:$src))]>;
144
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000145 let Predicates = [HasVSX, HasOnlySwappingMemOps] in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000146 def LXVD2X : XX1Form_memOp<31, 844,
Hal Finkel27774d92014-03-13 07:58:58 +0000147 (outs vsrc:$XT), (ins memrr:$src),
148 "lxvd2x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000149 [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000150
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000151 def LXVDSX : XX1Form_memOp<31, 332,
Hal Finkel27774d92014-03-13 07:58:58 +0000152 (outs vsrc:$XT), (ins memrr:$src),
153 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000154
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000155 let Predicates = [HasVSX, HasOnlySwappingMemOps] in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000156 def LXVW4X : XX1Form_memOp<31, 780,
Hal Finkel27774d92014-03-13 07:58:58 +0000157 (outs vsrc:$XT), (ins memrr:$src),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000158 "lxvw4x $XT, $src", IIC_LdStLFD,
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +0000159 []>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000160 } // mayLoad
Hal Finkel27774d92014-03-13 07:58:58 +0000161
162 // Store indexed instructions
Sean Fertile3c8c3852017-01-26 18:59:15 +0000163 let mayStore = 1, mayLoad = 0 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +0000164 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000165 def STXSDX : XX1Form_memOp<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +0000166 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +0000167 "stxsdx $XT, $dst", IIC_LdStSTFD,
Lei Huangf4ec6782018-05-24 03:20:28 +0000168 []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000169
Tony Jiang438bf4a2017-11-20 14:38:30 +0000170 // Pseudo instruction XFSTOREf64 will be expanded to STXSDX or STFDX later
Jinsong Jic7b43b92018-12-13 15:12:57 +0000171 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000172 def XFSTOREf64 : PseudoXFormMemOp<(outs), (ins vsfrc:$XT, memrr:$dst),
Tony Jiang438bf4a2017-11-20 14:38:30 +0000173 "#XFSTOREf64",
174 [(store f64:$XT, xoaddr:$dst)]>;
175
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000176 let Predicates = [HasVSX, HasOnlySwappingMemOps] in {
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +0000177 // The behaviour of this instruction is endianness-specific so we provide no
178 // pattern to match it without considering endianness.
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000179 def STXVD2X : XX1Form_memOp<31, 972,
Hal Finkel27774d92014-03-13 07:58:58 +0000180 (outs), (ins vsrc:$XT, memrr:$dst),
181 "stxvd2x $XT, $dst", IIC_LdStSTFD,
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +0000182 []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000183
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000184 def STXVW4X : XX1Form_memOp<31, 908,
Hal Finkel27774d92014-03-13 07:58:58 +0000185 (outs), (ins vsrc:$XT, memrr:$dst),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000186 "stxvw4x $XT, $dst", IIC_LdStSTFD,
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +0000187 []>;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000188 }
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000189 } // mayStore
Hal Finkel27774d92014-03-13 07:58:58 +0000190
191 // Add/Mul Instructions
192 let isCommutable = 1 in {
193 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +0000194 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000195 "xsadddp $XT, $XA, $XB", IIC_VecFP,
196 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
197 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +0000198 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000199 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
200 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
201
202 def XVADDDP : XX3Form<60, 96,
203 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
204 "xvadddp $XT, $XA, $XB", IIC_VecFP,
205 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
206
207 def XVADDSP : XX3Form<60, 64,
208 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
209 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
210 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
211
212 def XVMULDP : XX3Form<60, 112,
213 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
214 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
215 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
216
217 def XVMULSP : XX3Form<60, 80,
218 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
219 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
220 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
221 }
222
223 // Subtract Instructions
224 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000225 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000226 "xssubdp $XT, $XA, $XB", IIC_VecFP,
227 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
228
229 def XVSUBDP : XX3Form<60, 104,
230 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
231 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
232 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
233 def XVSUBSP : XX3Form<60, 72,
234 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
235 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
236 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
237
238 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000239 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000240 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000241 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000242 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000243 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
244 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000245 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
246 AltVSXFMARel;
247 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000248 def XSMADDMDP : XX3Form<60, 41,
Hal Finkel19be5062014-03-29 05:29:01 +0000249 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000250 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000251 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
252 AltVSXFMARel;
253 }
Hal Finkel27774d92014-03-13 07:58:58 +0000254
Hal Finkel25e04542014-03-25 18:55:11 +0000255 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000256 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000257 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000258 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000259 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
260 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000261 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
262 AltVSXFMARel;
263 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000264 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000265 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000266 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000267 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
268 AltVSXFMARel;
269 }
Hal Finkel27774d92014-03-13 07:58:58 +0000270
Hal Finkel25e04542014-03-25 18:55:11 +0000271 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000272 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000273 def XSNMADDADP : XX3Form<60, 161,
Hal Finkel19be5062014-03-29 05:29:01 +0000274 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000275 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
276 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000277 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
278 AltVSXFMARel;
279 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000280 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000281 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000282 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000283 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
284 AltVSXFMARel;
285 }
Hal Finkel27774d92014-03-13 07:58:58 +0000286
Hal Finkel25e04542014-03-25 18:55:11 +0000287 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000288 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000289 def XSNMSUBADP : XX3Form<60, 177,
Hal Finkel19be5062014-03-29 05:29:01 +0000290 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000291 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
292 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000293 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
294 AltVSXFMARel;
295 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000296 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000297 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000298 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000299 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
300 AltVSXFMARel;
301 }
Hal Finkel27774d92014-03-13 07:58:58 +0000302
Hal Finkel25e04542014-03-25 18:55:11 +0000303 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000304 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000305 def XVMADDADP : XX3Form<60, 97,
306 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
307 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
308 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000309 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
310 AltVSXFMARel;
311 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000312 def XVMADDMDP : XX3Form<60, 105,
313 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
314 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000315 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
316 AltVSXFMARel;
317 }
Hal Finkel27774d92014-03-13 07:58:58 +0000318
Hal Finkel25e04542014-03-25 18:55:11 +0000319 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000320 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000321 def XVMADDASP : XX3Form<60, 65,
322 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
323 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
324 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000325 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
326 AltVSXFMARel;
327 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000328 def XVMADDMSP : XX3Form<60, 73,
329 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
330 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000331 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
332 AltVSXFMARel;
333 }
Hal Finkel27774d92014-03-13 07:58:58 +0000334
Hal Finkel25e04542014-03-25 18:55:11 +0000335 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000336 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000337 def XVMSUBADP : XX3Form<60, 113,
338 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
339 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
340 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000341 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
342 AltVSXFMARel;
343 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000344 def XVMSUBMDP : XX3Form<60, 121,
345 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
346 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000347 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
348 AltVSXFMARel;
349 }
Hal Finkel27774d92014-03-13 07:58:58 +0000350
Hal Finkel25e04542014-03-25 18:55:11 +0000351 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000352 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000353 def XVMSUBASP : XX3Form<60, 81,
354 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
355 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
356 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000357 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
358 AltVSXFMARel;
359 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000360 def XVMSUBMSP : XX3Form<60, 89,
361 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
362 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000363 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
364 AltVSXFMARel;
365 }
Hal Finkel27774d92014-03-13 07:58:58 +0000366
Hal Finkel25e04542014-03-25 18:55:11 +0000367 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000368 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000369 def XVNMADDADP : XX3Form<60, 225,
370 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
371 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
372 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000373 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
374 AltVSXFMARel;
375 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000376 def XVNMADDMDP : XX3Form<60, 233,
377 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
378 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000379 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
380 AltVSXFMARel;
381 }
Hal Finkel27774d92014-03-13 07:58:58 +0000382
Hal Finkel25e04542014-03-25 18:55:11 +0000383 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000384 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000385 def XVNMADDASP : XX3Form<60, 193,
386 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
387 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
388 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000389 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
390 AltVSXFMARel;
391 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000392 def XVNMADDMSP : XX3Form<60, 201,
393 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
394 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000395 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
396 AltVSXFMARel;
397 }
Hal Finkel27774d92014-03-13 07:58:58 +0000398
Hal Finkel25e04542014-03-25 18:55:11 +0000399 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000400 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000401 def XVNMSUBADP : XX3Form<60, 241,
402 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
403 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
404 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000405 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
406 AltVSXFMARel;
407 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000408 def XVNMSUBMDP : XX3Form<60, 249,
409 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
410 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000411 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
412 AltVSXFMARel;
413 }
Hal Finkel27774d92014-03-13 07:58:58 +0000414
Hal Finkel25e04542014-03-25 18:55:11 +0000415 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000416 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000417 def XVNMSUBASP : XX3Form<60, 209,
418 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
419 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
420 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000421 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
422 AltVSXFMARel;
423 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000424 def XVNMSUBMSP : XX3Form<60, 217,
425 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
426 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000427 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
428 AltVSXFMARel;
429 }
Hal Finkel27774d92014-03-13 07:58:58 +0000430
431 // Division Instructions
432 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000433 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000434 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000435 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
436 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000437 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000438 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000439 [(set f64:$XT, (fsqrt f64:$XB))]>;
440
441 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000442 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000443 "xsredp $XT, $XB", IIC_VecFP,
444 [(set f64:$XT, (PPCfre f64:$XB))]>;
445 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000446 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000447 "xsrsqrtedp $XT, $XB", IIC_VecFP,
448 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
449
450 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000451 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000452 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000453 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000454 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000455 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000456
457 def XVDIVDP : XX3Form<60, 120,
458 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000459 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000460 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
461 def XVDIVSP : XX3Form<60, 88,
462 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000463 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000464 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
465
466 def XVSQRTDP : XX2Form<60, 203,
467 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000468 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000469 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
470 def XVSQRTSP : XX2Form<60, 139,
471 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000472 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000473 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
474
475 def XVTDIVDP : XX3Form_1<60, 125,
476 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000477 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000478 def XVTDIVSP : XX3Form_1<60, 93,
479 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000480 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000481
482 def XVTSQRTDP : XX2Form_1<60, 234,
483 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000484 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000485 def XVTSQRTSP : XX2Form_1<60, 170,
486 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000487 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000488
489 def XVREDP : XX2Form<60, 218,
490 (outs vsrc:$XT), (ins vsrc:$XB),
491 "xvredp $XT, $XB", IIC_VecFP,
492 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
493 def XVRESP : XX2Form<60, 154,
494 (outs vsrc:$XT), (ins vsrc:$XB),
495 "xvresp $XT, $XB", IIC_VecFP,
496 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
497
498 def XVRSQRTEDP : XX2Form<60, 202,
499 (outs vsrc:$XT), (ins vsrc:$XB),
500 "xvrsqrtedp $XT, $XB", IIC_VecFP,
501 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
502 def XVRSQRTESP : XX2Form<60, 138,
503 (outs vsrc:$XT), (ins vsrc:$XB),
504 "xvrsqrtesp $XT, $XB", IIC_VecFP,
505 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
506
507 // Compare Instructions
508 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000509 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000510 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000511 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000512 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000513 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000514
515 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000516 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000517 int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000518 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000519 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000520 int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000521 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000522 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000523 int_ppc_vsx_xvcmpgedp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000524 defm XVCMPGESP : XX3Form_Rcr<60, 83,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000525 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000526 int_ppc_vsx_xvcmpgesp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000527 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000528 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000529 int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000530 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000531 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000532 int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000533
534 // Move Instructions
535 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000536 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000537 "xsabsdp $XT, $XB", IIC_VecFP,
538 [(set f64:$XT, (fabs f64:$XB))]>;
539 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000540 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000541 "xsnabsdp $XT, $XB", IIC_VecFP,
542 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
543 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000544 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000545 "xsnegdp $XT, $XB", IIC_VecFP,
546 [(set f64:$XT, (fneg f64:$XB))]>;
547 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000548 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000549 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
550 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
551
552 def XVABSDP : XX2Form<60, 473,
553 (outs vsrc:$XT), (ins vsrc:$XB),
554 "xvabsdp $XT, $XB", IIC_VecFP,
555 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
556
557 def XVABSSP : XX2Form<60, 409,
558 (outs vsrc:$XT), (ins vsrc:$XB),
559 "xvabssp $XT, $XB", IIC_VecFP,
560 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
561
562 def XVCPSGNDP : XX3Form<60, 240,
563 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
564 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
565 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
566 def XVCPSGNSP : XX3Form<60, 208,
567 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
568 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
569 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
570
571 def XVNABSDP : XX2Form<60, 489,
572 (outs vsrc:$XT), (ins vsrc:$XB),
573 "xvnabsdp $XT, $XB", IIC_VecFP,
574 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
575 def XVNABSSP : XX2Form<60, 425,
576 (outs vsrc:$XT), (ins vsrc:$XB),
577 "xvnabssp $XT, $XB", IIC_VecFP,
578 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
579
580 def XVNEGDP : XX2Form<60, 505,
581 (outs vsrc:$XT), (ins vsrc:$XB),
582 "xvnegdp $XT, $XB", IIC_VecFP,
583 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
584 def XVNEGSP : XX2Form<60, 441,
585 (outs vsrc:$XT), (ins vsrc:$XB),
586 "xvnegsp $XT, $XB", IIC_VecFP,
587 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
588
589 // Conversion Instructions
590 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000591 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000592 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
593 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000594 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000595 "xscvdpsxds $XT, $XB", IIC_VecFP,
596 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000597 let isCodeGenOnly = 1 in
598 def XSCVDPSXDSs : XX2Form<60, 344,
599 (outs vssrc:$XT), (ins vssrc:$XB),
600 "xscvdpsxds $XT, $XB", IIC_VecFP,
601 [(set f32:$XT, (PPCfctidz f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000602 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000603 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000604 "xscvdpsxws $XT, $XB", IIC_VecFP,
605 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000606 let isCodeGenOnly = 1 in
607 def XSCVDPSXWSs : XX2Form<60, 88,
608 (outs vssrc:$XT), (ins vssrc:$XB),
609 "xscvdpsxws $XT, $XB", IIC_VecFP,
610 [(set f32:$XT, (PPCfctiwz f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000611 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000612 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000613 "xscvdpuxds $XT, $XB", IIC_VecFP,
614 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000615 let isCodeGenOnly = 1 in
616 def XSCVDPUXDSs : XX2Form<60, 328,
617 (outs vssrc:$XT), (ins vssrc:$XB),
618 "xscvdpuxds $XT, $XB", IIC_VecFP,
619 [(set f32:$XT, (PPCfctiduz f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000620 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000621 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000622 "xscvdpuxws $XT, $XB", IIC_VecFP,
623 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000624 let isCodeGenOnly = 1 in
625 def XSCVDPUXWSs : XX2Form<60, 72,
626 (outs vssrc:$XT), (ins vssrc:$XB),
627 "xscvdpuxws $XT, $XB", IIC_VecFP,
628 [(set f32:$XT, (PPCfctiwuz f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000629 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000630 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000631 "xscvspdp $XT, $XB", IIC_VecFP, []>;
632 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000633 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000634 "xscvsxddp $XT, $XB", IIC_VecFP,
635 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000636 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000637 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000638 "xscvuxddp $XT, $XB", IIC_VecFP,
639 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000640
641 def XVCVDPSP : XX2Form<60, 393,
642 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000643 "xvcvdpsp $XT, $XB", IIC_VecFP,
644 [(set v4f32:$XT, (int_ppc_vsx_xvcvdpsp v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000645 def XVCVDPSXDS : XX2Form<60, 472,
646 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000647 "xvcvdpsxds $XT, $XB", IIC_VecFP,
648 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000649 def XVCVDPSXWS : XX2Form<60, 216,
650 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000651 "xvcvdpsxws $XT, $XB", IIC_VecFP,
652 [(set v4i32:$XT, (int_ppc_vsx_xvcvdpsxws v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000653 def XVCVDPUXDS : XX2Form<60, 456,
654 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000655 "xvcvdpuxds $XT, $XB", IIC_VecFP,
656 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000657 def XVCVDPUXWS : XX2Form<60, 200,
658 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000659 "xvcvdpuxws $XT, $XB", IIC_VecFP,
660 [(set v4i32:$XT, (int_ppc_vsx_xvcvdpuxws v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000661
662 def XVCVSPDP : XX2Form<60, 457,
663 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000664 "xvcvspdp $XT, $XB", IIC_VecFP,
665 [(set v2f64:$XT, (int_ppc_vsx_xvcvspdp v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000666 def XVCVSPSXDS : XX2Form<60, 408,
667 (outs vsrc:$XT), (ins vsrc:$XB),
668 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
669 def XVCVSPSXWS : XX2Form<60, 152,
670 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000671 "xvcvspsxws $XT, $XB", IIC_VecFP,
672 [(set v4i32:$XT, (fp_to_sint v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000673 def XVCVSPUXDS : XX2Form<60, 392,
674 (outs vsrc:$XT), (ins vsrc:$XB),
675 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
676 def XVCVSPUXWS : XX2Form<60, 136,
677 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000678 "xvcvspuxws $XT, $XB", IIC_VecFP,
679 [(set v4i32:$XT, (fp_to_uint v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000680 def XVCVSXDDP : XX2Form<60, 504,
681 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000682 "xvcvsxddp $XT, $XB", IIC_VecFP,
683 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000684 def XVCVSXDSP : XX2Form<60, 440,
685 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000686 "xvcvsxdsp $XT, $XB", IIC_VecFP,
687 [(set v4f32:$XT, (int_ppc_vsx_xvcvsxdsp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000688 def XVCVSXWDP : XX2Form<60, 248,
689 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000690 "xvcvsxwdp $XT, $XB", IIC_VecFP,
691 [(set v2f64:$XT, (int_ppc_vsx_xvcvsxwdp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000692 def XVCVSXWSP : XX2Form<60, 184,
693 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic44513e52016-07-05 09:22:29 +0000694 "xvcvsxwsp $XT, $XB", IIC_VecFP,
695 [(set v4f32:$XT, (sint_to_fp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000696 def XVCVUXDDP : XX2Form<60, 488,
697 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000698 "xvcvuxddp $XT, $XB", IIC_VecFP,
699 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000700 def XVCVUXDSP : XX2Form<60, 424,
701 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000702 "xvcvuxdsp $XT, $XB", IIC_VecFP,
703 [(set v4f32:$XT, (int_ppc_vsx_xvcvuxdsp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000704 def XVCVUXWDP : XX2Form<60, 232,
705 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000706 "xvcvuxwdp $XT, $XB", IIC_VecFP,
707 [(set v2f64:$XT, (int_ppc_vsx_xvcvuxwdp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000708 def XVCVUXWSP : XX2Form<60, 168,
709 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000710 "xvcvuxwsp $XT, $XB", IIC_VecFP,
711 [(set v4f32:$XT, (uint_to_fp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000712
713 // Rounding Instructions
714 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000715 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000716 "xsrdpi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000717 [(set f64:$XT, (fround f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000718 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000719 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000720 "xsrdpic $XT, $XB", IIC_VecFP,
721 [(set f64:$XT, (fnearbyint f64:$XB))]>;
722 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000723 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000724 "xsrdpim $XT, $XB", IIC_VecFP,
725 [(set f64:$XT, (ffloor f64:$XB))]>;
726 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000727 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000728 "xsrdpip $XT, $XB", IIC_VecFP,
729 [(set f64:$XT, (fceil f64:$XB))]>;
730 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000731 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000732 "xsrdpiz $XT, $XB", IIC_VecFP,
733 [(set f64:$XT, (ftrunc f64:$XB))]>;
734
735 def XVRDPI : XX2Form<60, 201,
736 (outs vsrc:$XT), (ins vsrc:$XB),
737 "xvrdpi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000738 [(set v2f64:$XT, (fround v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000739 def XVRDPIC : XX2Form<60, 235,
740 (outs vsrc:$XT), (ins vsrc:$XB),
741 "xvrdpic $XT, $XB", IIC_VecFP,
742 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
743 def XVRDPIM : XX2Form<60, 249,
744 (outs vsrc:$XT), (ins vsrc:$XB),
745 "xvrdpim $XT, $XB", IIC_VecFP,
746 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
747 def XVRDPIP : XX2Form<60, 233,
748 (outs vsrc:$XT), (ins vsrc:$XB),
749 "xvrdpip $XT, $XB", IIC_VecFP,
750 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
751 def XVRDPIZ : XX2Form<60, 217,
752 (outs vsrc:$XT), (ins vsrc:$XB),
753 "xvrdpiz $XT, $XB", IIC_VecFP,
754 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
755
756 def XVRSPI : XX2Form<60, 137,
757 (outs vsrc:$XT), (ins vsrc:$XB),
758 "xvrspi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000759 [(set v4f32:$XT, (fround v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000760 def XVRSPIC : XX2Form<60, 171,
761 (outs vsrc:$XT), (ins vsrc:$XB),
762 "xvrspic $XT, $XB", IIC_VecFP,
763 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
764 def XVRSPIM : XX2Form<60, 185,
765 (outs vsrc:$XT), (ins vsrc:$XB),
766 "xvrspim $XT, $XB", IIC_VecFP,
767 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
768 def XVRSPIP : XX2Form<60, 169,
769 (outs vsrc:$XT), (ins vsrc:$XB),
770 "xvrspip $XT, $XB", IIC_VecFP,
771 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
772 def XVRSPIZ : XX2Form<60, 153,
773 (outs vsrc:$XT), (ins vsrc:$XB),
774 "xvrspiz $XT, $XB", IIC_VecFP,
775 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
776
777 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000778 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000779 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000780 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000781 "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
782 [(set vsfrc:$XT,
783 (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000784 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000785 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000786 "xsmindp $XT, $XA, $XB", IIC_VecFP,
787 [(set vsfrc:$XT,
788 (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000789
790 def XVMAXDP : XX3Form<60, 224,
791 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000792 "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
793 [(set vsrc:$XT,
794 (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000795 def XVMINDP : XX3Form<60, 232,
796 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000797 "xvmindp $XT, $XA, $XB", IIC_VecFP,
798 [(set vsrc:$XT,
799 (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000800
801 def XVMAXSP : XX3Form<60, 192,
802 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000803 "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
804 [(set vsrc:$XT,
805 (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000806 def XVMINSP : XX3Form<60, 200,
807 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000808 "xvminsp $XT, $XA, $XB", IIC_VecFP,
809 [(set vsrc:$XT,
810 (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000811 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000812} // Uses = [RM]
813
814 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000815 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000816 def XXLAND : XX3Form<60, 130,
817 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000818 "xxland $XT, $XA, $XB", IIC_VecGeneral,
819 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000820 def XXLANDC : XX3Form<60, 138,
821 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000822 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
823 [(set v4i32:$XT, (and v4i32:$XA,
824 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000825 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000826 def XXLNOR : XX3Form<60, 162,
827 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000828 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
829 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
830 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000831 def XXLOR : XX3Form<60, 146,
832 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000833 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
834 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000835 let isCodeGenOnly = 1 in
836 def XXLORf: XX3Form<60, 146,
837 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
838 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000839 def XXLXOR : XX3Form<60, 154,
840 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000841 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
842 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000843 } // isCommutable
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +0000844 let isCodeGenOnly = 1 in
845 def XXLXORz : XX3Form_Zero<60, 154, (outs vsrc:$XT), (ins),
846 "xxlxor $XT, $XT, $XT", IIC_VecGeneral,
847 [(set v4i32:$XT, (v4i32 immAllZerosV))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000848
Ehsan Amiric90b02c2016-10-24 17:31:09 +0000849 let isCodeGenOnly = 1 in {
850 def XXLXORdpz : XX3Form_SetZero<60, 154,
851 (outs vsfrc:$XT), (ins),
852 "xxlxor $XT, $XT, $XT", IIC_VecGeneral,
853 [(set f64:$XT, (fpimm0))]>;
854 def XXLXORspz : XX3Form_SetZero<60, 154,
855 (outs vssrc:$XT), (ins),
856 "xxlxor $XT, $XT, $XT", IIC_VecGeneral,
857 [(set f32:$XT, (fpimm0))]>;
858 }
859
Hal Finkel27774d92014-03-13 07:58:58 +0000860 // Permutation Instructions
861 def XXMRGHW : XX3Form<60, 18,
862 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
863 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
864 def XXMRGLW : XX3Form<60, 50,
865 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
866 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
867
868 def XXPERMDI : XX3Form_2<60, 10,
869 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
Tony Jiang60c247d2017-05-31 13:09:57 +0000870 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm,
871 [(set v2i64:$XT, (PPCxxpermdi v2i64:$XA, v2i64:$XB,
872 imm32SExt16:$DM))]>;
Nemanja Ivanovic15748f42016-12-06 11:47:14 +0000873 let isCodeGenOnly = 1 in
874 def XXPERMDIs : XX3Form_2s<60, 10, (outs vsrc:$XT), (ins vsfrc:$XA, u2imm:$DM),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000875 "xxpermdi $XT, $XA, $XA, $DM", IIC_VecPerm, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000876 def XXSEL : XX4Form<60, 3,
877 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
Nemanja Ivanovic5d06f172018-08-27 13:20:42 +0000878 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000879
880 def XXSLDWI : XX3Form_2<60, 2,
881 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +0000882 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm,
883 [(set v4i32:$XT, (PPCvecshl v4i32:$XA, v4i32:$XB,
884 imm32SExt16:$SHW))]>;
Zaara Syedab2595b92018-08-08 15:20:43 +0000885
886 let isCodeGenOnly = 1 in
887 def XXSLDWIs : XX3Form_2s<60, 2,
888 (outs vsrc:$XT), (ins vsfrc:$XA, u2imm:$SHW),
889 "xxsldwi $XT, $XA, $XA, $SHW", IIC_VecPerm, []>;
890
Hal Finkel27774d92014-03-13 07:58:58 +0000891 def XXSPLTW : XX2Form_2<60, 164,
892 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
Nemanja Ivanovic1a2b2f02016-05-04 16:04:02 +0000893 "xxspltw $XT, $XB, $UIM", IIC_VecPerm,
894 [(set v4i32:$XT,
895 (PPCxxsplt v4i32:$XB, imm32SExt16:$UIM))]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000896 let isCodeGenOnly = 1 in
897 def XXSPLTWs : XX2Form_2<60, 164,
898 (outs vsrc:$XT), (ins vfrc:$XB, u2imm:$UIM),
899 "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
Zaara Syedab2595b92018-08-08 15:20:43 +0000900
Craig Topperc50d64b2014-11-26 00:46:26 +0000901} // hasSideEffects
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000902} // UseVSXReg = 1
Hal Finkel27774d92014-03-13 07:58:58 +0000903
Bill Schmidt61e65232014-10-22 13:13:40 +0000904// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
905// instruction selection into a branch sequence.
Jinsong Jic7b43b92018-12-13 15:12:57 +0000906let PPC970_Single = 1 in {
Bill Schmidt61e65232014-10-22 13:13:40 +0000907
Jinsong Jic7b43b92018-12-13 15:12:57 +0000908 def SELECT_CC_VSRC: PPCCustomInserterPseudo<(outs vsrc:$dst),
Bill Schmidt61e65232014-10-22 13:13:40 +0000909 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
910 "#SELECT_CC_VSRC",
911 []>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000912 def SELECT_VSRC: PPCCustomInserterPseudo<(outs vsrc:$dst),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000913 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
914 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000915 [(set v2f64:$dst,
916 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000917 def SELECT_CC_VSFRC: PPCCustomInserterPseudo<(outs f8rc:$dst),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000918 (ins crrc:$cond, f8rc:$T, f8rc:$F,
919 i32imm:$BROPC), "#SELECT_CC_VSFRC",
920 []>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000921 def SELECT_VSFRC: PPCCustomInserterPseudo<(outs f8rc:$dst),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000922 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
923 "#SELECT_VSFRC",
924 [(set f64:$dst,
925 (select i1:$cond, f64:$T, f64:$F))]>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000926 def SELECT_CC_VSSRC: PPCCustomInserterPseudo<(outs f4rc:$dst),
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000927 (ins crrc:$cond, f4rc:$T, f4rc:$F,
928 i32imm:$BROPC), "#SELECT_CC_VSSRC",
929 []>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000930 def SELECT_VSSRC: PPCCustomInserterPseudo<(outs f4rc:$dst),
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000931 (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
932 "#SELECT_VSSRC",
933 [(set f32:$dst,
934 (select i1:$cond, f32:$T, f32:$F))]>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000935}
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000936} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000937
Hal Finkel27774d92014-03-13 07:58:58 +0000938def : InstAlias<"xvmovdp $XT, $XB",
939 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
940def : InstAlias<"xvmovsp $XT, $XB",
941 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
942
943def : InstAlias<"xxspltd $XT, $XB, 0",
944 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
945def : InstAlias<"xxspltd $XT, $XB, 1",
946 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
947def : InstAlias<"xxmrghd $XT, $XA, $XB",
948 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
949def : InstAlias<"xxmrgld $XT, $XA, $XB",
950 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
951def : InstAlias<"xxswapd $XT, $XB",
952 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
Nemanja Ivanovic15748f42016-12-06 11:47:14 +0000953def : InstAlias<"xxspltd $XT, $XB, 0",
954 (XXPERMDIs vsrc:$XT, vsfrc:$XB, 0)>;
955def : InstAlias<"xxspltd $XT, $XB, 1",
956 (XXPERMDIs vsrc:$XT, vsfrc:$XB, 3)>;
957def : InstAlias<"xxswapd $XT, $XB",
958 (XXPERMDIs vsrc:$XT, vsfrc:$XB, 2)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000959
960let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000961
Nemanja Ivanovic6f22b412016-09-27 08:42:12 +0000962def : Pat<(v4i32 (vnot_ppc v4i32:$A)),
963 (v4i32 (XXLNOR $A, $A))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000964let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000965def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000966 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000967
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000968def : Pat<(f64 (extractelt v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000969 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000970def : Pat<(f64 (extractelt v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000971 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000972}
973
974let Predicates = [IsLittleEndian] in {
975def : Pat<(v2f64 (scalar_to_vector f64:$A)),
976 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
977 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
978
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000979def : Pat<(f64 (extractelt v2f64:$S, 0)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000980 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000981def : Pat<(f64 (extractelt v2f64:$S, 1)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000982 (f64 (EXTRACT_SUBREG $S, sub_64))>;
983}
Hal Finkel27774d92014-03-13 07:58:58 +0000984
985// Additional fnmsub patterns: -a*c + b == -(a*c - b)
986def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
987 (XSNMSUBADP $B, $C, $A)>;
988def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
989 (XSNMSUBADP $B, $C, $A)>;
990
991def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
992 (XVNMSUBADP $B, $C, $A)>;
993def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
994 (XVNMSUBADP $B, $C, $A)>;
995
996def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
997 (XVNMSUBASP $B, $C, $A)>;
998def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
999 (XVNMSUBASP $B, $C, $A)>;
1000
Hal Finkel9e0baa62014-04-01 19:24:27 +00001001def : Pat<(v2f64 (bitconvert v4f32:$A)),
1002 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +00001003def : Pat<(v2f64 (bitconvert v4i32:$A)),
1004 (COPY_TO_REGCLASS $A, VSRC)>;
1005def : Pat<(v2f64 (bitconvert v8i16:$A)),
1006 (COPY_TO_REGCLASS $A, VSRC)>;
1007def : Pat<(v2f64 (bitconvert v16i8:$A)),
1008 (COPY_TO_REGCLASS $A, VSRC)>;
1009
Hal Finkel9e0baa62014-04-01 19:24:27 +00001010def : Pat<(v4f32 (bitconvert v2f64:$A)),
1011 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +00001012def : Pat<(v4i32 (bitconvert v2f64:$A)),
1013 (COPY_TO_REGCLASS $A, VRRC)>;
1014def : Pat<(v8i16 (bitconvert v2f64:$A)),
1015 (COPY_TO_REGCLASS $A, VRRC)>;
1016def : Pat<(v16i8 (bitconvert v2f64:$A)),
1017 (COPY_TO_REGCLASS $A, VRRC)>;
1018
Hal Finkel9e0baa62014-04-01 19:24:27 +00001019def : Pat<(v2i64 (bitconvert v4f32:$A)),
1020 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +00001021def : Pat<(v2i64 (bitconvert v4i32:$A)),
1022 (COPY_TO_REGCLASS $A, VSRC)>;
1023def : Pat<(v2i64 (bitconvert v8i16:$A)),
1024 (COPY_TO_REGCLASS $A, VSRC)>;
1025def : Pat<(v2i64 (bitconvert v16i8:$A)),
1026 (COPY_TO_REGCLASS $A, VSRC)>;
1027
Hal Finkel9e0baa62014-04-01 19:24:27 +00001028def : Pat<(v4f32 (bitconvert v2i64:$A)),
1029 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +00001030def : Pat<(v4i32 (bitconvert v2i64:$A)),
1031 (COPY_TO_REGCLASS $A, VRRC)>;
1032def : Pat<(v8i16 (bitconvert v2i64:$A)),
1033 (COPY_TO_REGCLASS $A, VRRC)>;
1034def : Pat<(v16i8 (bitconvert v2i64:$A)),
1035 (COPY_TO_REGCLASS $A, VRRC)>;
1036
Hal Finkel9281c9a2014-03-26 18:26:30 +00001037def : Pat<(v2f64 (bitconvert v2i64:$A)),
1038 (COPY_TO_REGCLASS $A, VRRC)>;
1039def : Pat<(v2i64 (bitconvert v2f64:$A)),
1040 (COPY_TO_REGCLASS $A, VRRC)>;
1041
Kit Bartond4eb73c2015-05-05 16:10:44 +00001042def : Pat<(v2f64 (bitconvert v1i128:$A)),
1043 (COPY_TO_REGCLASS $A, VRRC)>;
1044def : Pat<(v1i128 (bitconvert v2f64:$A)),
1045 (COPY_TO_REGCLASS $A, VRRC)>;
1046
Stefan Pintilie927e8bf2018-10-23 17:11:36 +00001047def : Pat<(v2i64 (bitconvert f128:$A)),
1048 (COPY_TO_REGCLASS $A, VRRC)>;
1049def : Pat<(v4i32 (bitconvert f128:$A)),
1050 (COPY_TO_REGCLASS $A, VRRC)>;
1051def : Pat<(v8i16 (bitconvert f128:$A)),
1052 (COPY_TO_REGCLASS $A, VRRC)>;
1053def : Pat<(v16i8 (bitconvert f128:$A)),
1054 (COPY_TO_REGCLASS $A, VRRC)>;
1055
Nemanja Ivanovic44513e52016-07-05 09:22:29 +00001056def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 0)),
1057 (v2f64 (XVCVSXWDP (v2i64 (XXMRGHW $C, $C))))>;
1058def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 1)),
1059 (v2f64 (XVCVSXWDP (v2i64 (XXMRGLW $C, $C))))>;
1060
1061def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 0)),
1062 (v2f64 (XVCVUXWDP (v2i64 (XXMRGHW $C, $C))))>;
1063def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 1)),
1064 (v2f64 (XVCVUXWDP (v2i64 (XXMRGLW $C, $C))))>;
1065
Bill Schmidt2d1128a2014-10-17 15:13:38 +00001066// Loads.
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001067let Predicates = [HasVSX, HasOnlySwappingMemOps] in {
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001068 def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +00001069
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001070 // Stores.
1071 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
1072 (STXVD2X $rS, xoaddr:$dst)>;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001073 def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
1074}
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +00001075let Predicates = [IsBigEndian, HasVSX, HasOnlySwappingMemOps] in {
1076 def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
1077 def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
1078 def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +00001079 def : Pat<(v4i32 (int_ppc_vsx_lxvw4x xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +00001080 def : Pat<(store v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
1081 def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +00001082 def : Pat<(store v4i32:$XT, xoaddr:$dst), (STXVW4X $XT, xoaddr:$dst)>;
1083 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
1084 (STXVW4X $rS, xoaddr:$dst)>;
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +00001085}
Bill Schmidtfae5d712014-12-09 16:35:51 +00001086
1087// Permutes.
1088def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
1089def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
1090def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
1091def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001092def : Pat<(v2f64 (PPCswapNoChain v2f64:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +00001093
Tony Jiang0a429f02017-05-24 23:48:29 +00001094// PPCvecshl XT, XA, XA, 2 can be selected to both XXSLDWI XT,XA,XA,2 and
1095// XXSWAPD XT,XA (i.e. XXPERMDI XT,XA,XA,2), the later one is more profitable.
1096def : Pat<(v4i32 (PPCvecshl v4i32:$src, v4i32:$src, 2)), (XXPERMDI $src, $src, 2)>;
1097
Bill Schmidt61e65232014-10-22 13:13:40 +00001098// Selects.
1099def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001100 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1101def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001102 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1103def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001104 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1105def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001106 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1107def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
1108 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1109def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001110 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1111def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001112 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1113def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001114 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1115def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001116 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1117def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
1118 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1119
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001120def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001121 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1122def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001123 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1124def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001125 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1126def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001127 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1128def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
1129 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
1130def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001131 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1132def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001133 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1134def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001135 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1136def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001137 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1138def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
1139 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1140
Bill Schmidt76746922014-11-14 12:10:40 +00001141// Divides.
1142def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
1143 (XVDIVSP $A, $B)>;
1144def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
1145 (XVDIVDP $A, $B)>;
1146
Nemanja Ivanovic984a3612015-07-14 17:25:20 +00001147// Reciprocal estimate
1148def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
1149 (XVRESP $A)>;
1150def : Pat<(int_ppc_vsx_xvredp v2f64:$A),
1151 (XVREDP $A)>;
1152
Nemanja Ivanovicd358b8f2015-07-05 06:03:51 +00001153// Recip. square root estimate
1154def : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
1155 (XVRSQRTESP $A)>;
1156def : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
1157 (XVRSQRTEDP $A)>;
1158
Zi Xuan Wu6a3c2792018-11-14 02:34:45 +00001159// Vector selection
1160def : Pat<(v16i8 (vselect v16i8:$vA, v16i8:$vB, v16i8:$vC)),
1161 (COPY_TO_REGCLASS
1162 (XXSEL (COPY_TO_REGCLASS $vC, VSRC),
1163 (COPY_TO_REGCLASS $vB, VSRC),
1164 (COPY_TO_REGCLASS $vA, VSRC)), VRRC)>;
1165def : Pat<(v8i16 (vselect v8i16:$vA, v8i16:$vB, v8i16:$vC)),
1166 (COPY_TO_REGCLASS
1167 (XXSEL (COPY_TO_REGCLASS $vC, VSRC),
1168 (COPY_TO_REGCLASS $vB, VSRC),
1169 (COPY_TO_REGCLASS $vA, VSRC)), VRRC)>;
1170def : Pat<(vselect v4i32:$vA, v4i32:$vB, v4i32:$vC),
1171 (XXSEL $vC, $vB, $vA)>;
1172def : Pat<(vselect v2i64:$vA, v2i64:$vB, v2i64:$vC),
1173 (XXSEL $vC, $vB, $vA)>;
1174def : Pat<(vselect v4i32:$vA, v4f32:$vB, v4f32:$vC),
1175 (XXSEL $vC, $vB, $vA)>;
1176def : Pat<(vselect v2i64:$vA, v2f64:$vB, v2f64:$vC),
1177 (XXSEL $vC, $vB, $vA)>;
1178
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001179let Predicates = [IsLittleEndian] in {
1180def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1181 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1182def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1183 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1184def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1185 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1186def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1187 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1188} // IsLittleEndian
1189
1190let Predicates = [IsBigEndian] in {
1191def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1192 (f64 (XSCVSXDDP (COPY_TO_REGCLASS $S, VSFRC)))>;
1193def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1194 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1195def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1196 (f64 (XSCVUXDDP (COPY_TO_REGCLASS $S, VSFRC)))>;
1197def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1198 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1199} // IsBigEndian
1200
Hal Finkel27774d92014-03-13 07:58:58 +00001201} // AddedComplexity
1202} // HasVSX
1203
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001204def ScalarLoads {
1205 dag Li8 = (i32 (extloadi8 xoaddr:$src));
1206 dag ZELi8 = (i32 (zextloadi8 xoaddr:$src));
1207 dag ZELi8i64 = (i64 (zextloadi8 xoaddr:$src));
1208 dag SELi8 = (i32 (sext_inreg (extloadi8 xoaddr:$src), i8));
1209 dag SELi8i64 = (i64 (sext_inreg (extloadi8 xoaddr:$src), i8));
1210
1211 dag Li16 = (i32 (extloadi16 xoaddr:$src));
1212 dag ZELi16 = (i32 (zextloadi16 xoaddr:$src));
1213 dag ZELi16i64 = (i64 (zextloadi16 xoaddr:$src));
1214 dag SELi16 = (i32 (sextloadi16 xoaddr:$src));
1215 dag SELi16i64 = (i64 (sextloadi16 xoaddr:$src));
1216
1217 dag Li32 = (i32 (load xoaddr:$src));
1218}
1219
Kit Barton298beb52015-02-18 16:21:46 +00001220// The following VSX instructions were introduced in Power ISA 2.07
1221/* FIXME: if the operands are v2i64, these patterns will not match.
1222 we should define new patterns or otherwise match the same patterns
1223 when the elements are larger than i32.
1224*/
1225def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001226def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Lei Huangc29229a2018-05-08 17:36:40 +00001227def NoP9Vector : Predicate<"!PPCSubTarget->hasP9Vector()">;
Kit Barton298beb52015-02-18 16:21:46 +00001228let Predicates = [HasP8Vector] in {
1229let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001230 let isCommutable = 1, UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001231 def XXLEQV : XX3Form<60, 186,
1232 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1233 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
1234 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
1235 def XXLNAND : XX3Form<60, 178,
1236 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1237 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
1238 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
Kit Barton298beb52015-02-18 16:21:46 +00001239 v4i32:$XB)))]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001240 } // isCommutable, UseVSXReg
Nemanja Ivanovicd9e4b4f2015-07-10 14:25:17 +00001241
Nemanja Ivanovic5655fb32015-07-10 12:38:08 +00001242 def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
1243 (XXLEQV $A, $B)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001244
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001245 let UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001246 def XXLORC : XX3Form<60, 170,
1247 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1248 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
1249 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
1250
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001251 // VSX scalar loads introduced in ISA 2.07
Sean Fertile3c8c3852017-01-26 18:59:15 +00001252 let mayLoad = 1, mayStore = 0 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00001253 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001254 def LXSSPX : XX1Form_memOp<31, 524, (outs vssrc:$XT), (ins memrr:$src),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001255 "lxsspx $XT, $src", IIC_LdStLFD, []>;
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001256 def LXSIWAX : XX1Form_memOp<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001257 "lxsiwax $XT, $src", IIC_LdStLFD, []>;
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001258 def LXSIWZX : XX1Form_memOp<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001259 "lxsiwzx $XT, $src", IIC_LdStLFD, []>;
1260
Jinsong Jic7b43b92018-12-13 15:12:57 +00001261 // Pseudo instruction XFLOADf32 will be expanded to LXSSPX or LFSX later
1262 let CodeSize = 3 in
1263 def XFLOADf32 : PseudoXFormMemOp<(outs vssrc:$XT), (ins memrr:$src),
1264 "#XFLOADf32",
1265 [(set f32:$XT, (load xoaddr:$src))]>;
1266 // Pseudo instruction LIWAX will be expanded to LXSIWAX or LFIWAX later
1267 def LIWAX : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src),
1268 "#LIWAX",
1269 [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
1270 // Pseudo instruction LIWZX will be expanded to LXSIWZX or LFIWZX later
1271 def LIWZX : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src),
1272 "#LIWZX",
1273 [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001274 } // mayLoad
1275
1276 // VSX scalar stores introduced in ISA 2.07
Sean Fertile3c8c3852017-01-26 18:59:15 +00001277 let mayStore = 1, mayLoad = 0 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00001278 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001279 def STXSSPX : XX1Form_memOp<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001280 "stxsspx $XT, $dst", IIC_LdStSTFD, []>;
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001281 def STXSIWX : XX1Form_memOp<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001282 "stxsiwx $XT, $dst", IIC_LdStSTFD, []>;
1283
Jinsong Jic7b43b92018-12-13 15:12:57 +00001284 // Pseudo instruction XFSTOREf32 will be expanded to STXSSPX or STFSX later
1285 let CodeSize = 3 in
1286 def XFSTOREf32 : PseudoXFormMemOp<(outs), (ins vssrc:$XT, memrr:$dst),
1287 "#XFSTOREf32",
1288 [(store f32:$XT, xoaddr:$dst)]>;
1289 // Pseudo instruction STIWX will be expanded to STXSIWX or STFIWX later
1290 def STIWX : PseudoXFormMemOp<(outs), (ins vsfrc:$XT, memrr:$dst),
1291 "#STIWX",
1292 [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001293 } // mayStore
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001294 } // UseVSXReg = 1
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001295
1296 def : Pat<(f64 (extloadf32 xoaddr:$src)),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001297 (COPY_TO_REGCLASS (XFLOADf32 xoaddr:$src), VSFRC)>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001298 def : Pat<(f32 (fpround (f64 (extloadf32 xoaddr:$src)))),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001299 (f32 (XFLOADf32 xoaddr:$src))>;
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +00001300 def : Pat<(f64 (fpextend f32:$src)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001301 (COPY_TO_REGCLASS $src, VSFRC)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00001302
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001303 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001304 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1305 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001306 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1307 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001308 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1309 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001310 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1311 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
1312 (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1313 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001314 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1315 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001316 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1317 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001318 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1319 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001320 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1321 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001322 (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001323
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001324 let UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001325 // VSX Elementary Scalar FP arithmetic (SP)
1326 let isCommutable = 1 in {
1327 def XSADDSP : XX3Form<60, 0,
1328 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1329 "xsaddsp $XT, $XA, $XB", IIC_VecFP,
1330 [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
1331 def XSMULSP : XX3Form<60, 16,
1332 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1333 "xsmulsp $XT, $XA, $XB", IIC_VecFP,
1334 [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
1335 } // isCommutable
1336
1337 def XSDIVSP : XX3Form<60, 24,
1338 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1339 "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
1340 [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
1341 def XSRESP : XX2Form<60, 26,
1342 (outs vssrc:$XT), (ins vssrc:$XB),
1343 "xsresp $XT, $XB", IIC_VecFP,
1344 [(set f32:$XT, (PPCfre f32:$XB))]>;
Lei Huang6270ab62018-07-04 21:59:16 +00001345 def XSRSP : XX2Form<60, 281,
1346 (outs vssrc:$XT), (ins vsfrc:$XB),
1347 "xsrsp $XT, $XB", IIC_VecFP, []>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001348 def XSSQRTSP : XX2Form<60, 11,
1349 (outs vssrc:$XT), (ins vssrc:$XB),
1350 "xssqrtsp $XT, $XB", IIC_FPSqrtS,
1351 [(set f32:$XT, (fsqrt f32:$XB))]>;
1352 def XSRSQRTESP : XX2Form<60, 10,
1353 (outs vssrc:$XT), (ins vssrc:$XB),
1354 "xsrsqrtesp $XT, $XB", IIC_VecFP,
1355 [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
1356 def XSSUBSP : XX3Form<60, 8,
1357 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1358 "xssubsp $XT, $XA, $XB", IIC_VecFP,
1359 [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00001360
1361 // FMA Instructions
1362 let BaseName = "XSMADDASP" in {
1363 let isCommutable = 1 in
1364 def XSMADDASP : XX3Form<60, 1,
1365 (outs vssrc:$XT),
1366 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1367 "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
1368 [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
1369 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1370 AltVSXFMARel;
1371 let IsVSXFMAAlt = 1 in
1372 def XSMADDMSP : XX3Form<60, 9,
1373 (outs vssrc:$XT),
1374 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1375 "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1376 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1377 AltVSXFMARel;
1378 }
1379
1380 let BaseName = "XSMSUBASP" in {
1381 let isCommutable = 1 in
1382 def XSMSUBASP : XX3Form<60, 17,
1383 (outs vssrc:$XT),
1384 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1385 "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
1386 [(set f32:$XT, (fma f32:$XA, f32:$XB,
1387 (fneg f32:$XTi)))]>,
1388 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1389 AltVSXFMARel;
1390 let IsVSXFMAAlt = 1 in
1391 def XSMSUBMSP : XX3Form<60, 25,
1392 (outs vssrc:$XT),
1393 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1394 "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1395 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1396 AltVSXFMARel;
1397 }
1398
1399 let BaseName = "XSNMADDASP" in {
1400 let isCommutable = 1 in
1401 def XSNMADDASP : XX3Form<60, 129,
1402 (outs vssrc:$XT),
1403 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1404 "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
1405 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1406 f32:$XTi)))]>,
1407 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1408 AltVSXFMARel;
1409 let IsVSXFMAAlt = 1 in
1410 def XSNMADDMSP : XX3Form<60, 137,
1411 (outs vssrc:$XT),
1412 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1413 "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1414 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1415 AltVSXFMARel;
1416 }
1417
1418 let BaseName = "XSNMSUBASP" in {
1419 let isCommutable = 1 in
1420 def XSNMSUBASP : XX3Form<60, 145,
1421 (outs vssrc:$XT),
1422 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1423 "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
1424 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1425 (fneg f32:$XTi))))]>,
1426 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1427 AltVSXFMARel;
1428 let IsVSXFMAAlt = 1 in
1429 def XSNMSUBMSP : XX3Form<60, 153,
1430 (outs vssrc:$XT),
1431 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1432 "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1433 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1434 AltVSXFMARel;
1435 }
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001436
1437 // Single Precision Conversions (FP <-> INT)
1438 def XSCVSXDSP : XX2Form<60, 312,
1439 (outs vssrc:$XT), (ins vsfrc:$XB),
1440 "xscvsxdsp $XT, $XB", IIC_VecFP,
1441 [(set f32:$XT, (PPCfcfids f64:$XB))]>;
1442 def XSCVUXDSP : XX2Form<60, 296,
1443 (outs vssrc:$XT), (ins vsfrc:$XB),
1444 "xscvuxdsp $XT, $XB", IIC_VecFP,
1445 [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
1446
1447 // Conversions between vector and scalar single precision
1448 def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
1449 "xscvdpspn $XT, $XB", IIC_VecFP, []>;
1450 def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
1451 "xscvspdpn $XT, $XB", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001452 } // UseVSXReg = 1
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001453
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001454 let Predicates = [IsLittleEndian] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00001455 def : Pat<(f32 (PPCfcfids
1456 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 0)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001457 (f32 (XSCVSXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001458 def : Pat<(f32 (PPCfcfids
1459 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 1)))))),
1460 (f32 (XSCVSXDSP (COPY_TO_REGCLASS
1461 (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1462 def : Pat<(f32 (PPCfcfidus
1463 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 0)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001464 (f32 (XSCVUXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001465 def : Pat<(f32 (PPCfcfidus
1466 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 1)))))),
1467 (f32 (XSCVUXDSP (COPY_TO_REGCLASS
1468 (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001469 }
1470
1471 let Predicates = [IsBigEndian] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00001472 def : Pat<(f32 (PPCfcfids
1473 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 0)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001474 (f32 (XSCVSXDSP (COPY_TO_REGCLASS $S, VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001475 def : Pat<(f32 (PPCfcfids
1476 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 1)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001477 (f32 (XSCVSXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001478 def : Pat<(f32 (PPCfcfidus
1479 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 0)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001480 (f32 (XSCVUXDSP (COPY_TO_REGCLASS $S, VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001481 def : Pat<(f32 (PPCfcfidus
1482 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 1)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001483 (f32 (XSCVUXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1484 }
Lei Huangc29229a2018-05-08 17:36:40 +00001485
1486 // Instructions for converting float to i64 feeding a store.
1487 let Predicates = [NoP9Vector] in {
1488 def : Pat<(PPCstore_scal_int_from_vsr
1489 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xoaddr:$dst, 8),
1490 (STXSDX (XSCVDPSXDS f64:$src), xoaddr:$dst)>;
1491 def : Pat<(PPCstore_scal_int_from_vsr
1492 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xoaddr:$dst, 8),
1493 (STXSDX (XSCVDPUXDS f64:$src), xoaddr:$dst)>;
1494 }
1495
1496 // Instructions for converting float to i32 feeding a store.
1497 def : Pat<(PPCstore_scal_int_from_vsr
1498 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xoaddr:$dst, 4),
1499 (STIWX (XSCVDPSXWS f64:$src), xoaddr:$dst)>;
1500 def : Pat<(PPCstore_scal_int_from_vsr
1501 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xoaddr:$dst, 4),
1502 (STIWX (XSCVDPUXWS f64:$src), xoaddr:$dst)>;
1503
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001504} // AddedComplexity = 400
Kit Barton298beb52015-02-18 16:21:46 +00001505} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001506
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00001507let UseVSXReg = 1, AddedComplexity = 400 in {
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001508let Predicates = [HasDirectMove] in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001509 // VSX direct move instructions
1510 def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
1511 "mfvsrd $rA, $XT", IIC_VecGeneral,
1512 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
1513 Requires<[In64BitMode]>;
Nemanja Ivanovicffcf0fb2017-03-15 16:04:53 +00001514 let isCodeGenOnly = 1 in
1515 def MFVRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vrrc:$XT),
1516 "mfvsrd $rA, $XT", IIC_VecGeneral,
1517 []>,
1518 Requires<[In64BitMode]>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001519 def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
1520 "mfvsrwz $rA, $XT", IIC_VecGeneral,
1521 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
1522 def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
1523 "mtvsrd $XT, $rA", IIC_VecGeneral,
1524 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1525 Requires<[In64BitMode]>;
1526 def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1527 "mtvsrwa $XT, $rA", IIC_VecGeneral,
1528 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1529 def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1530 "mtvsrwz $XT, $rA", IIC_VecGeneral,
1531 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001532} // HasDirectMove
1533
1534let Predicates = [IsISA3_0, HasDirectMove] in {
1535 def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00001536 "mtvsrws $XT, $rA", IIC_VecGeneral, []>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001537
Guozhi Wei22e7da92017-05-11 22:17:35 +00001538 def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc_nox0:$rA, g8rc:$rB),
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001539 "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,
1540 []>, Requires<[In64BitMode]>;
1541
1542 def MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT),
1543 "mfvsrld $rA, $XT", IIC_VecGeneral,
1544 []>, Requires<[In64BitMode]>;
1545
1546} // IsISA3_0, HasDirectMove
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001547} // UseVSXReg = 1
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001548
Nemanja Ivanovicffcf0fb2017-03-15 16:04:53 +00001549// We want to parse this from asm, but we don't want to emit this as it would
1550// be emitted with a VSX reg. So leave Emit = 0 here.
1551def : InstAlias<"mfvrd $rA, $XT",
1552 (MFVRD g8rc:$rA, vrrc:$XT), 0>;
1553def : InstAlias<"mffprd $rA, $src",
1554 (MFVSRD g8rc:$rA, f8rc:$src)>;
1555
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001556/* Direct moves of various widths from GPR's into VSR's. Each move lines
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001557 the value up into element 0 (both BE and LE). Namely, entities smaller than
1558 a doubleword are shifted left and moved for BE. For LE, they're moved, then
1559 swapped to go into the least significant element of the VSR.
1560*/
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001561def MovesToVSR {
1562 dag BE_BYTE_0 =
1563 (MTVSRD
1564 (RLDICR
1565 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1566 dag BE_HALF_0 =
1567 (MTVSRD
1568 (RLDICR
1569 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1570 dag BE_WORD_0 =
1571 (MTVSRD
1572 (RLDICR
1573 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001574 dag BE_DWORD_0 = (MTVSRD $A);
1575
1576 dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001577 dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1578 LE_MTVSRW, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001579 dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001580 dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1581 BE_DWORD_0, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001582 dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1583}
1584
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001585/* Patterns for extracting elements out of vectors. Integer elements are
1586 extracted using direct move operations. Patterns for extracting elements
1587 whose indices are not available at compile time are also provided with
1588 various _VARIABLE_ patterns.
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001589 The numbering for the DAG's is for LE, but when used on BE, the correct
1590 LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1591*/
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001592def VectorExtractions {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001593 // Doubleword extraction
1594 dag LE_DWORD_0 =
1595 (MFVSRD
1596 (EXTRACT_SUBREG
1597 (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1598 (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1599 dag LE_DWORD_1 = (MFVSRD
1600 (EXTRACT_SUBREG
1601 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1602
1603 // Word extraction
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001604 dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001605 dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1606 dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1607 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1608 dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1609
1610 // Halfword extraction
1611 dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1612 dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1613 dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1614 dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1615 dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1616 dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1617 dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1618 dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1619
1620 // Byte extraction
1621 dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1622 dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1623 dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1624 dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1625 dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1626 dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1627 dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1628 dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1629 dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1630 dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1631 dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1632 dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1633 dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1634 dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1635 dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1636 dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1637
1638 /* Variable element number (BE and LE patterns must be specified separately)
1639 This is a rather involved process.
1640
1641 Conceptually, this is how the move is accomplished:
1642 1. Identify which doubleword contains the element
1643 2. Shift in the VMX register so that the correct doubleword is correctly
1644 lined up for the MFVSRD
1645 3. Perform the move so that the element (along with some extra stuff)
1646 is in the GPR
1647 4. Right shift within the GPR so that the element is right-justified
1648
1649 Of course, the index is an element number which has a different meaning
1650 on LE/BE so the patterns have to be specified separately.
1651
1652 Note: The final result will be the element right-justified with high
1653 order bits being arbitrarily defined (namely, whatever was in the
1654 vector register to the left of the value originally).
1655 */
1656
1657 /* LE variable byte
1658 Number 1. above:
1659 - For elements 0-7, we shift left by 8 bytes since they're on the right
1660 - For elements 8-15, we need not shift (shift left by zero bytes)
1661 This is accomplished by inverting the bits of the index and AND-ing
1662 with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1663 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001664 dag LE_VBYTE_PERM_VEC = (v16i8 (LVSL ZERO8, (ANDC8 (LI8 8), $Idx)));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001665
1666 // Number 2. above:
1667 // - Now that we set up the shift amount, we shift in the VMX register
Lei Huangcd4f3852018-03-12 19:26:18 +00001668 dag LE_VBYTE_PERMUTE = (v16i8 (VPERM $S, $S, LE_VBYTE_PERM_VEC));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001669
1670 // Number 3. above:
1671 // - The doubleword containing our element is moved to a GPR
1672 dag LE_MV_VBYTE = (MFVSRD
1673 (EXTRACT_SUBREG
1674 (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1675 sub_64));
1676
1677 /* Number 4. above:
1678 - Truncate the element number to the range 0-7 (8-15 are symmetrical
1679 and out of range values are truncated accordingly)
1680 - Multiply by 8 as we need to shift right by the number of bits, not bytes
1681 - Shift right in the GPR by the calculated value
1682 */
1683 dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1684 sub_32);
1685 dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1686 sub_32);
1687
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001688 /* LE variable halfword
1689 Number 1. above:
1690 - For elements 0-3, we shift left by 8 since they're on the right
1691 - For elements 4-7, we need not shift (shift left by zero bytes)
1692 Similarly to the byte pattern, we invert the bits of the index, but we
1693 AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1694 Of course, the shift is still by 8 bytes, so we must multiply by 2.
1695 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001696 dag LE_VHALF_PERM_VEC =
1697 (v16i8 (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62)));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001698
1699 // Number 2. above:
1700 // - Now that we set up the shift amount, we shift in the VMX register
Lei Huangcd4f3852018-03-12 19:26:18 +00001701 dag LE_VHALF_PERMUTE = (v16i8 (VPERM $S, $S, LE_VHALF_PERM_VEC));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001702
1703 // Number 3. above:
1704 // - The doubleword containing our element is moved to a GPR
1705 dag LE_MV_VHALF = (MFVSRD
1706 (EXTRACT_SUBREG
1707 (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1708 sub_64));
1709
1710 /* Number 4. above:
1711 - Truncate the element number to the range 0-3 (4-7 are symmetrical
1712 and out of range values are truncated accordingly)
1713 - Multiply by 16 as we need to shift right by the number of bits
1714 - Shift right in the GPR by the calculated value
1715 */
1716 dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1717 sub_32);
1718 dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1719 sub_32);
1720
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001721 /* LE variable word
1722 Number 1. above:
1723 - For elements 0-1, we shift left by 8 since they're on the right
1724 - For elements 2-3, we need not shift
1725 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001726 dag LE_VWORD_PERM_VEC = (v16i8 (LVSL ZERO8,
1727 (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61)));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001728
1729 // Number 2. above:
1730 // - Now that we set up the shift amount, we shift in the VMX register
Lei Huangcd4f3852018-03-12 19:26:18 +00001731 dag LE_VWORD_PERMUTE = (v16i8 (VPERM $S, $S, LE_VWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001732
1733 // Number 3. above:
1734 // - The doubleword containing our element is moved to a GPR
1735 dag LE_MV_VWORD = (MFVSRD
1736 (EXTRACT_SUBREG
1737 (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
1738 sub_64));
1739
1740 /* Number 4. above:
1741 - Truncate the element number to the range 0-1 (2-3 are symmetrical
1742 and out of range values are truncated accordingly)
1743 - Multiply by 32 as we need to shift right by the number of bits
1744 - Shift right in the GPR by the calculated value
1745 */
1746 dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
1747 sub_32);
1748 dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
1749 sub_32);
1750
1751 /* LE variable doubleword
1752 Number 1. above:
1753 - For element 0, we shift left by 8 since it's on the right
1754 - For element 1, we need not shift
1755 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001756 dag LE_VDWORD_PERM_VEC = (v16i8 (LVSL ZERO8,
1757 (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60)));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001758
1759 // Number 2. above:
1760 // - Now that we set up the shift amount, we shift in the VMX register
Lei Huangcd4f3852018-03-12 19:26:18 +00001761 dag LE_VDWORD_PERMUTE = (v16i8 (VPERM $S, $S, LE_VDWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001762
1763 // Number 3. above:
1764 // - The doubleword containing our element is moved to a GPR
1765 // - Number 4. is not needed for the doubleword as the value is 64-bits
1766 dag LE_VARIABLE_DWORD =
1767 (MFVSRD (EXTRACT_SUBREG
1768 (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
1769 sub_64));
1770
1771 /* LE variable float
1772 - Shift the vector to line up the desired element to BE Word 0
1773 - Convert 32-bit float to a 64-bit single precision float
1774 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001775 dag LE_VFLOAT_PERM_VEC = (v16i8 (LVSL ZERO8,
1776 (RLDICR (XOR8 (LI8 3), $Idx), 2, 61)));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001777 dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
1778 dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
1779
1780 /* LE variable double
1781 Same as the LE doubleword except there is no move.
1782 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001783 dag LE_VDOUBLE_PERMUTE = (v16i8 (VPERM (v16i8 (COPY_TO_REGCLASS $S, VRRC)),
1784 (v16i8 (COPY_TO_REGCLASS $S, VRRC)),
1785 LE_VDWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001786 dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
1787
1788 /* BE variable byte
1789 The algorithm here is the same as the LE variable byte except:
1790 - The shift in the VMX register is by 0/8 for opposite element numbers so
1791 we simply AND the element number with 0x8
1792 - The order of elements after the move to GPR is reversed, so we invert
1793 the bits of the index prior to truncating to the range 0-7
1794 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001795 dag BE_VBYTE_PERM_VEC = (v16i8 (LVSL ZERO8, (ANDIo8 $Idx, 8)));
1796 dag BE_VBYTE_PERMUTE = (v16i8 (VPERM $S, $S, BE_VBYTE_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001797 dag BE_MV_VBYTE = (MFVSRD
1798 (EXTRACT_SUBREG
1799 (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1800 sub_64));
1801 dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1802 sub_32);
1803 dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1804 sub_32);
1805
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001806 /* BE variable halfword
1807 The algorithm here is the same as the LE variable halfword except:
1808 - The shift in the VMX register is by 0/8 for opposite element numbers so
1809 we simply AND the element number with 0x4 and multiply by 2
1810 - The order of elements after the move to GPR is reversed, so we invert
1811 the bits of the index prior to truncating to the range 0-3
1812 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001813 dag BE_VHALF_PERM_VEC = (v16i8 (LVSL ZERO8,
1814 (RLDICR (ANDIo8 $Idx, 4), 1, 62)));
1815 dag BE_VHALF_PERMUTE = (v16i8 (VPERM $S, $S, BE_VHALF_PERM_VEC));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001816 dag BE_MV_VHALF = (MFVSRD
1817 (EXTRACT_SUBREG
1818 (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1819 sub_64));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001820 dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001821 sub_32);
1822 dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1823 sub_32);
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001824
1825 /* BE variable word
1826 The algorithm is the same as the LE variable word except:
1827 - The shift in the VMX register happens for opposite element numbers
1828 - The order of elements after the move to GPR is reversed, so we invert
1829 the bits of the index prior to truncating to the range 0-1
1830 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001831 dag BE_VWORD_PERM_VEC = (v16i8 (LVSL ZERO8,
1832 (RLDICR (ANDIo8 $Idx, 2), 2, 61)));
1833 dag BE_VWORD_PERMUTE = (v16i8 (VPERM $S, $S, BE_VWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001834 dag BE_MV_VWORD = (MFVSRD
1835 (EXTRACT_SUBREG
1836 (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
1837 sub_64));
1838 dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
1839 sub_32);
1840 dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
1841 sub_32);
1842
1843 /* BE variable doubleword
1844 Same as the LE doubleword except we shift in the VMX register for opposite
1845 element indices.
1846 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001847 dag BE_VDWORD_PERM_VEC = (v16i8 (LVSL ZERO8,
1848 (RLDICR (ANDIo8 $Idx, 1), 3, 60)));
1849 dag BE_VDWORD_PERMUTE = (v16i8 (VPERM $S, $S, BE_VDWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001850 dag BE_VARIABLE_DWORD =
1851 (MFVSRD (EXTRACT_SUBREG
1852 (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
1853 sub_64));
1854
1855 /* BE variable float
1856 - Shift the vector to line up the desired element to BE Word 0
1857 - Convert 32-bit float to a 64-bit single precision float
1858 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001859 dag BE_VFLOAT_PERM_VEC = (v16i8 (LVSL ZERO8, (RLDICR $Idx, 2, 61)));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001860 dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
1861 dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
1862
1863 /* BE variable double
1864 Same as the BE doubleword except there is no move.
1865 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001866 dag BE_VDOUBLE_PERMUTE = (v16i8 (VPERM (v16i8 (COPY_TO_REGCLASS $S, VRRC)),
1867 (v16i8 (COPY_TO_REGCLASS $S, VRRC)),
1868 BE_VDWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001869 dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001870}
1871
Zaara Syeda48cb3c12017-11-27 17:11:03 +00001872def NoP9Altivec : Predicate<"!PPCSubTarget->hasP9Altivec()">;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00001873let AddedComplexity = 400 in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001874// v4f32 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001875let Predicates = [IsBigEndian, HasP8Vector] in {
1876 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1877 (v4f32 (XSCVDPSPN $A))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001878 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1879 (f32 (XSCVSPDPN $S))>;
1880 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1881 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1882 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001883 (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001884 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1885 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001886 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1887 (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001888} // IsBigEndian, HasP8Vector
1889
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001890// Variable index vector_extract for v2f64 does not require P8Vector
1891let Predicates = [IsBigEndian, HasVSX] in
1892 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1893 (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
1894
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001895let Predicates = [IsBigEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001896 // v16i8 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001897 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001898 (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001899 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001900 (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001901 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001902 (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001903 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001904 (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00001905
1906 // v2i64 scalar <-> vector conversions (BE)
1907 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
1908 (i64 VectorExtractions.LE_DWORD_1)>;
1909 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
1910 (i64 VectorExtractions.LE_DWORD_0)>;
1911 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1912 (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
1913} // IsBigEndian, HasDirectMove
1914
1915let Predicates = [IsBigEndian, HasDirectMove, NoP9Altivec] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001916 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001917 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001918 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001919 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001920 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001921 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001922 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001923 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001924 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001925 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001926 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001927 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001928 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001929 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001930 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001931 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001932 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001933 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001934 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001935 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001936 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001937 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001938 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001939 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001940 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001941 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001942 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001943 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001944 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001945 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001946 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001947 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001948 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001949 (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001950
1951 // v8i16 scalar <-> vector conversions (BE)
1952 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001953 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001954 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001955 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001956 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001957 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001958 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001959 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001960 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001961 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001962 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001963 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001964 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001965 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001966 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001967 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001968 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001969 (i32 VectorExtractions.BE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001970
1971 // v4i32 scalar <-> vector conversions (BE)
1972 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001973 (i32 VectorExtractions.LE_WORD_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001974 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001975 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001976 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001977 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001978 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001979 (i32 VectorExtractions.LE_WORD_0)>;
1980 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1981 (i32 VectorExtractions.BE_VARIABLE_WORD)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00001982} // IsBigEndian, HasDirectMove, NoP9Altivec
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001983
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001984// v4f32 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001985let Predicates = [IsLittleEndian, HasP8Vector] in {
1986 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1987 (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001988 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1989 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1990 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001991 (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001992 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1993 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1994 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1995 (f32 (XSCVSPDPN $S))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001996 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1997 (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001998} // IsLittleEndian, HasP8Vector
1999
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002000// Variable index vector_extract for v2f64 does not require P8Vector
2001let Predicates = [IsLittleEndian, HasVSX] in
2002 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
2003 (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
2004
Zaara Syeda75098802018-11-05 17:31:26 +00002005def : Pat<(int_ppc_vsx_stxvd2x_be v2f64:$rS, xoaddr:$dst),
2006 (STXVD2X $rS, xoaddr:$dst)>;
2007def : Pat<(int_ppc_vsx_stxvw4x_be v4i32:$rS, xoaddr:$dst),
2008 (STXVW4X $rS, xoaddr:$dst)>;
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +00002009def : Pat<(v4i32 (int_ppc_vsx_lxvw4x_be xoaddr:$src)), (LXVW4X xoaddr:$src)>;
2010def : Pat<(v2f64 (int_ppc_vsx_lxvd2x_be xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Tony Jiang5f850cd2016-11-15 14:25:56 +00002011
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002012// Variable index unsigned vector_extract on Power9
2013let Predicates = [HasP9Altivec, IsLittleEndian] in {
2014 def : Pat<(i64 (anyext (i32 (vector_extract v16i8:$S, i64:$Idx)))),
2015 (VEXTUBRX $Idx, $S)>;
2016
2017 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, i64:$Idx)))),
2018 (VEXTUHRX (RLWINM8 $Idx, 1, 28, 30), $S)>;
2019 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 0)))),
2020 (VEXTUHRX (LI8 0), $S)>;
2021 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 1)))),
2022 (VEXTUHRX (LI8 2), $S)>;
2023 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 2)))),
2024 (VEXTUHRX (LI8 4), $S)>;
2025 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 3)))),
2026 (VEXTUHRX (LI8 6), $S)>;
2027 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 4)))),
2028 (VEXTUHRX (LI8 8), $S)>;
2029 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 5)))),
2030 (VEXTUHRX (LI8 10), $S)>;
2031 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 6)))),
2032 (VEXTUHRX (LI8 12), $S)>;
2033 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 7)))),
2034 (VEXTUHRX (LI8 14), $S)>;
2035
2036 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, i64:$Idx)))),
2037 (VEXTUWRX (RLWINM8 $Idx, 2, 28, 29), $S)>;
2038 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 0)))),
2039 (VEXTUWRX (LI8 0), $S)>;
2040 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 1)))),
2041 (VEXTUWRX (LI8 4), $S)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002042 // For extracting LE word 2, MFVSRWZ is better than VEXTUWRX
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002043 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 2)))),
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002044 (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
2045 (i32 VectorExtractions.LE_WORD_2), sub_32)>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002046 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 3)))),
2047 (VEXTUWRX (LI8 12), $S)>;
2048
2049 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, i64:$Idx)))),
2050 (EXTSW (VEXTUWRX (RLWINM8 $Idx, 2, 28, 29), $S))>;
2051 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 0)))),
2052 (EXTSW (VEXTUWRX (LI8 0), $S))>;
2053 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 1)))),
2054 (EXTSW (VEXTUWRX (LI8 4), $S))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002055 // For extracting LE word 2, MFVSRWZ is better than VEXTUWRX
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002056 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 2)))),
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002057 (EXTSW (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
2058 (i32 VectorExtractions.LE_WORD_2), sub_32))>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002059 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 3)))),
2060 (EXTSW (VEXTUWRX (LI8 12), $S))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002061
2062 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
2063 (i32 (EXTRACT_SUBREG (VEXTUBRX $Idx, $S), sub_32))>;
2064 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
2065 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 0), $S), sub_32))>;
2066 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
2067 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 1), $S), sub_32))>;
2068 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
2069 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 2), $S), sub_32))>;
2070 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
2071 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 3), $S), sub_32))>;
2072 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
2073 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 4), $S), sub_32))>;
2074 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
2075 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 5), $S), sub_32))>;
2076 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
2077 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 6), $S), sub_32))>;
2078 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
2079 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 7), $S), sub_32))>;
2080 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
2081 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 8), $S), sub_32))>;
2082 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
2083 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 9), $S), sub_32))>;
2084 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
2085 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 10), $S), sub_32))>;
2086 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
2087 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 11), $S), sub_32))>;
2088 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
2089 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 12), $S), sub_32))>;
2090 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
2091 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 13), $S), sub_32))>;
2092 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
2093 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 14), $S), sub_32))>;
2094 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
2095 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 15), $S), sub_32))>;
2096
2097 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
2098 (i32 (EXTRACT_SUBREG (VEXTUHRX
2099 (RLWINM8 $Idx, 1, 28, 30), $S), sub_32))>;
2100 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
2101 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 0), $S), sub_32))>;
2102 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
2103 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 2), $S), sub_32))>;
2104 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
2105 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 4), $S), sub_32))>;
2106 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
2107 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 6), $S), sub_32))>;
2108 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
2109 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 8), $S), sub_32))>;
2110 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
2111 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 10), $S), sub_32))>;
2112 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
2113 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 12), $S), sub_32))>;
2114 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
2115 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 14), $S), sub_32))>;
2116
2117 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
2118 (i32 (EXTRACT_SUBREG (VEXTUWRX
2119 (RLWINM8 $Idx, 2, 28, 29), $S), sub_32))>;
2120 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
2121 (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 0), $S), sub_32))>;
2122 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
2123 (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 4), $S), sub_32))>;
2124 // For extracting LE word 2, MFVSRWZ is better than VEXTUWRX
2125 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
2126 (i32 VectorExtractions.LE_WORD_2)>;
2127 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
2128 (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 12), $S), sub_32))>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002129}
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002130
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002131let Predicates = [HasP9Altivec, IsBigEndian] in {
2132 def : Pat<(i64 (anyext (i32 (vector_extract v16i8:$S, i64:$Idx)))),
2133 (VEXTUBLX $Idx, $S)>;
2134
2135 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, i64:$Idx)))),
2136 (VEXTUHLX (RLWINM8 $Idx, 1, 28, 30), $S)>;
2137 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 0)))),
2138 (VEXTUHLX (LI8 0), $S)>;
2139 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 1)))),
2140 (VEXTUHLX (LI8 2), $S)>;
2141 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 2)))),
2142 (VEXTUHLX (LI8 4), $S)>;
2143 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 3)))),
2144 (VEXTUHLX (LI8 6), $S)>;
2145 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 4)))),
2146 (VEXTUHLX (LI8 8), $S)>;
2147 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 5)))),
2148 (VEXTUHLX (LI8 10), $S)>;
2149 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 6)))),
2150 (VEXTUHLX (LI8 12), $S)>;
2151 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 7)))),
2152 (VEXTUHLX (LI8 14), $S)>;
2153
2154 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, i64:$Idx)))),
2155 (VEXTUWLX (RLWINM8 $Idx, 2, 28, 29), $S)>;
2156 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 0)))),
2157 (VEXTUWLX (LI8 0), $S)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002158
2159 // For extracting BE word 1, MFVSRWZ is better than VEXTUWLX
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002160 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 1)))),
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002161 (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
2162 (i32 VectorExtractions.LE_WORD_2), sub_32)>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002163 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 2)))),
2164 (VEXTUWLX (LI8 8), $S)>;
2165 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 3)))),
2166 (VEXTUWLX (LI8 12), $S)>;
2167
2168 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, i64:$Idx)))),
2169 (EXTSW (VEXTUWLX (RLWINM8 $Idx, 2, 28, 29), $S))>;
2170 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 0)))),
2171 (EXTSW (VEXTUWLX (LI8 0), $S))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002172 // For extracting BE word 1, MFVSRWZ is better than VEXTUWLX
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002173 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 1)))),
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002174 (EXTSW (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
2175 (i32 VectorExtractions.LE_WORD_2), sub_32))>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002176 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 2)))),
2177 (EXTSW (VEXTUWLX (LI8 8), $S))>;
2178 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 3)))),
2179 (EXTSW (VEXTUWLX (LI8 12), $S))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002180
2181 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
2182 (i32 (EXTRACT_SUBREG (VEXTUBLX $Idx, $S), sub_32))>;
2183 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
2184 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 0), $S), sub_32))>;
2185 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
2186 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 1), $S), sub_32))>;
2187 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
2188 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 2), $S), sub_32))>;
2189 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
2190 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 3), $S), sub_32))>;
2191 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
2192 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 4), $S), sub_32))>;
2193 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
2194 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 5), $S), sub_32))>;
2195 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
2196 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 6), $S), sub_32))>;
2197 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
2198 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 7), $S), sub_32))>;
2199 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
2200 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 8), $S), sub_32))>;
2201 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
2202 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 9), $S), sub_32))>;
2203 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
2204 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 10), $S), sub_32))>;
2205 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
2206 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 11), $S), sub_32))>;
2207 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
2208 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 12), $S), sub_32))>;
2209 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
2210 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 13), $S), sub_32))>;
2211 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
2212 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 14), $S), sub_32))>;
2213 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
2214 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 15), $S), sub_32))>;
2215
2216 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
2217 (i32 (EXTRACT_SUBREG (VEXTUHLX
2218 (RLWINM8 $Idx, 1, 28, 30), $S), sub_32))>;
2219 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
2220 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 0), $S), sub_32))>;
2221 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
2222 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 2), $S), sub_32))>;
2223 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
2224 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 4), $S), sub_32))>;
2225 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
2226 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 6), $S), sub_32))>;
2227 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
2228 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 8), $S), sub_32))>;
2229 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
2230 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 10), $S), sub_32))>;
2231 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
2232 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 12), $S), sub_32))>;
2233 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
2234 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 14), $S), sub_32))>;
2235
2236 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
2237 (i32 (EXTRACT_SUBREG (VEXTUWLX
2238 (RLWINM8 $Idx, 2, 28, 29), $S), sub_32))>;
2239 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
2240 (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 0), $S), sub_32))>;
2241 // For extracting BE word 1, MFVSRWZ is better than VEXTUWLX
2242 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
2243 (i32 VectorExtractions.LE_WORD_2)>;
2244 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
2245 (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 8), $S), sub_32))>;
2246 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
2247 (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 12), $S), sub_32))>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002248}
2249
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002250let Predicates = [IsLittleEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002251 // v16i8 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002252 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002253 (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002254 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002255 (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002256 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002257 (v4i32 MovesToVSR.LE_WORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002258 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002259 (v2i64 MovesToVSR.LE_DWORD_0)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002260 // v2i64 scalar <-> vector conversions (LE)
2261 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
2262 (i64 VectorExtractions.LE_DWORD_0)>;
2263 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
2264 (i64 VectorExtractions.LE_DWORD_1)>;
2265 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
2266 (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
2267} // IsLittleEndian, HasDirectMove
2268
2269let Predicates = [IsLittleEndian, HasDirectMove, NoP9Altivec] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002270 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002271 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002272 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002273 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002274 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002275 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002276 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002277 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002278 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002279 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002280 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002281 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002282 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002283 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002284 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002285 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002286 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002287 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002288 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002289 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002290 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002291 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002292 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002293 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002294 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002295 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002296 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002297 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002298 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002299 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002300 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002301 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002302 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002303 (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002304
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002305 // v8i16 scalar <-> vector conversions (LE)
2306 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002307 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002308 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002309 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002310 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002311 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002312 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002313 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002314 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002315 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002316 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002317 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002318 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002319 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002320 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002321 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002322 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002323 (i32 VectorExtractions.LE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002324
2325 // v4i32 scalar <-> vector conversions (LE)
2326 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002327 (i32 VectorExtractions.LE_WORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002328 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002329 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002330 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002331 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002332 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002333 (i32 VectorExtractions.LE_WORD_3)>;
2334 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
2335 (i32 VectorExtractions.LE_VARIABLE_WORD)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002336} // IsLittleEndian, HasDirectMove, NoP9Altivec
Nemanja Ivanovic89224762015-12-15 14:50:34 +00002337
2338let Predicates = [HasDirectMove, HasVSX] in {
2339// bitconvert f32 -> i32
2340// (convert to 32-bit fp single, shift right 1 word, move to GPR)
2341def : Pat<(i32 (bitconvert f32:$S)),
2342 (i32 (MFVSRWZ (EXTRACT_SUBREG
Lei Huangcd4f3852018-03-12 19:26:18 +00002343 (XXSLDWI (XSCVDPSPN $S), (XSCVDPSPN $S), 3),
Nemanja Ivanovic89224762015-12-15 14:50:34 +00002344 sub_64)))>;
2345// bitconvert i32 -> f32
2346// (move to FPR, shift left 1 word, convert to 64-bit fp single)
2347def : Pat<(f32 (bitconvert i32:$A)),
2348 (f32 (XSCVSPDPN
2349 (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
2350
2351// bitconvert f64 -> i64
2352// (move to GPR, nothing else needed)
2353def : Pat<(i64 (bitconvert f64:$S)),
2354 (i64 (MFVSRD $S))>;
2355
2356// bitconvert i64 -> f64
2357// (move to FPR, nothing else needed)
2358def : Pat<(f64 (bitconvert i64:$S)),
2359 (f64 (MTVSRD $S))>;
2360}
Kit Barton93612ec2016-02-26 21:11:55 +00002361
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00002362// Materialize a zero-vector of long long
2363def : Pat<(v2i64 immAllZerosV),
2364 (v2i64 (XXLXORz))>;
2365}
2366
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002367def AlignValues {
2368 dag F32_TO_BE_WORD1 = (v4f32 (XXSLDWI (XSCVDPSPN $B), (XSCVDPSPN $B), 3));
2369 dag I32_TO_BE_WORD1 = (COPY_TO_REGCLASS (MTVSRWZ $B), VSRC);
2370}
2371
Kit Barton93612ec2016-02-26 21:11:55 +00002372// The following VSX instructions were introduced in Power ISA 3.0
2373def HasP9Vector : Predicate<"PPCSubTarget->hasP9Vector()">;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002374let AddedComplexity = 400, Predicates = [HasP9Vector] in {
Kit Barton93612ec2016-02-26 21:11:55 +00002375
2376 // [PO VRT XO VRB XO /]
2377 class X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2378 list<dag> pattern>
2379 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB),
2380 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
2381
2382 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
2383 class X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2384 list<dag> pattern>
2385 : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isDOT;
2386
2387 // [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less),
2388 // So we use different operand class for VRB
2389 class X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2390 RegisterOperand vbtype, list<dag> pattern>
2391 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB),
2392 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
2393
Lei Huang6270ab62018-07-04 21:59:16 +00002394 // [PO VRT XO VRB XO /]
2395 class X_VT5_XO5_VB5_VSFR<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2396 list<dag> pattern>
2397 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vfrc:$vT), (ins vrrc:$vB),
2398 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
2399
2400 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
2401 class X_VT5_XO5_VB5_VSFR_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2402 list<dag> pattern>
2403 : X_VT5_XO5_VB5_VSFR<opcode, xo2, xo, opc, pattern>, isDOT;
2404
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002405 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002406 // [PO T XO B XO BX /]
2407 class XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
2408 list<dag> pattern>
2409 : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB),
2410 !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>;
2411
Kit Barton93612ec2016-02-26 21:11:55 +00002412 // [PO T XO B XO BX TX]
2413 class XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
2414 RegisterOperand vtype, list<dag> pattern>
2415 : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB),
2416 !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>;
2417
2418 // [PO T A B XO AX BX TX], src and dest register use different operand class
2419 class XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc,
2420 RegisterOperand xty, RegisterOperand aty, RegisterOperand bty,
2421 InstrItinClass itin, list<dag> pattern>
2422 : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB),
2423 !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002424 } // UseVSXReg = 1
Kit Barton93612ec2016-02-26 21:11:55 +00002425
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002426 // [PO VRT VRA VRB XO /]
2427 class X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
2428 list<dag> pattern>
2429 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB),
2430 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>;
2431
2432 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
2433 class X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc,
2434 list<dag> pattern>
2435 : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isDOT;
2436
Lei Huang09fda632018-04-04 16:43:50 +00002437 // [PO VRT VRA VRB XO /]
2438 class X_VT5_VA5_VB5_FMA<bits<6> opcode, bits<10> xo, string opc,
2439 list<dag> pattern>
2440 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vTi, vrrc:$vA, vrrc:$vB),
2441 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>,
2442 RegConstraint<"$vTi = $vT">, NoEncode<"$vTi">;
2443
2444 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
2445 class X_VT5_VA5_VB5_FMA_Ro<bits<6> opcode, bits<10> xo, string opc,
2446 list<dag> pattern>
2447 : X_VT5_VA5_VB5_FMA<opcode, xo, opc, pattern>, isDOT;
2448
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002449 //===--------------------------------------------------------------------===//
2450 // Quad-Precision Scalar Move Instructions:
2451
2452 // Copy Sign
Lei Huangecfede92018-03-19 19:22:52 +00002453 def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp",
2454 [(set f128:$vT,
2455 (fcopysign f128:$vB, f128:$vA))]>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002456
2457 // Absolute/Negative-Absolute/Negate
Lei Huangecfede92018-03-19 19:22:52 +00002458 def XSABSQP : X_VT5_XO5_VB5<63, 0, 804, "xsabsqp",
2459 [(set f128:$vT, (fabs f128:$vB))]>;
2460 def XSNABSQP : X_VT5_XO5_VB5<63, 8, 804, "xsnabsqp",
2461 [(set f128:$vT, (fneg (fabs f128:$vB)))]>;
2462 def XSNEGQP : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp",
2463 [(set f128:$vT, (fneg f128:$vB))]>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002464
2465 //===--------------------------------------------------------------------===//
2466 // Quad-Precision Scalar Floating-Point Arithmetic Instructions:
2467
2468 // Add/Divide/Multiply/Subtract
Lei Huang6d1596a2018-03-19 18:52:20 +00002469 let isCommutable = 1 in {
2470 def XSADDQP : X_VT5_VA5_VB5 <63, 4, "xsaddqp",
2471 [(set f128:$vT, (fadd f128:$vA, f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002472 def XSADDQPO : X_VT5_VA5_VB5_Ro<63, 4, "xsaddqpo",
2473 [(set f128:$vT,
2474 (int_ppc_addf128_round_to_odd
2475 f128:$vA, f128:$vB))]>;
Lei Huang6d1596a2018-03-19 18:52:20 +00002476 def XSMULQP : X_VT5_VA5_VB5 <63, 36, "xsmulqp",
2477 [(set f128:$vT, (fmul f128:$vA, f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002478 def XSMULQPO : X_VT5_VA5_VB5_Ro<63, 36, "xsmulqpo",
2479 [(set f128:$vT,
2480 (int_ppc_mulf128_round_to_odd
2481 f128:$vA, f128:$vB))]>;
Lei Huang6d1596a2018-03-19 18:52:20 +00002482 }
2483
2484 def XSSUBQP : X_VT5_VA5_VB5 <63, 516, "xssubqp" ,
2485 [(set f128:$vT, (fsub f128:$vA, f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002486 def XSSUBQPO : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo",
2487 [(set f128:$vT,
2488 (int_ppc_subf128_round_to_odd
2489 f128:$vA, f128:$vB))]>;
Lei Huang6d1596a2018-03-19 18:52:20 +00002490 def XSDIVQP : X_VT5_VA5_VB5 <63, 548, "xsdivqp",
2491 [(set f128:$vT, (fdiv f128:$vA, f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002492 def XSDIVQPO : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo",
2493 [(set f128:$vT,
2494 (int_ppc_divf128_round_to_odd
2495 f128:$vA, f128:$vB))]>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002496
2497 // Square-Root
Lei Huangecfede92018-03-19 19:22:52 +00002498 def XSSQRTQP : X_VT5_XO5_VB5 <63, 27, 804, "xssqrtqp",
2499 [(set f128:$vT, (fsqrt f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002500 def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo",
2501 [(set f128:$vT,
2502 (int_ppc_sqrtf128_round_to_odd f128:$vB))]>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002503
2504 // (Negative) Multiply-{Add/Subtract}
Lei Huang09fda632018-04-04 16:43:50 +00002505 def XSMADDQP : X_VT5_VA5_VB5_FMA <63, 388, "xsmaddqp",
2506 [(set f128:$vT,
2507 (fma f128:$vA, f128:$vB,
2508 f128:$vTi))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002509
2510 def XSMADDQPO : X_VT5_VA5_VB5_FMA_Ro<63, 388, "xsmaddqpo",
2511 [(set f128:$vT,
2512 (int_ppc_fmaf128_round_to_odd
2513 f128:$vA,f128:$vB,f128:$vTi))]>;
2514
Lei Huang09fda632018-04-04 16:43:50 +00002515 def XSMSUBQP : X_VT5_VA5_VB5_FMA <63, 420, "xsmsubqp" ,
2516 [(set f128:$vT,
2517 (fma f128:$vA, f128:$vB,
2518 (fneg f128:$vTi)))]>;
Stefan Pintilieb9d01aa2018-07-11 01:42:22 +00002519 def XSMSUBQPO : X_VT5_VA5_VB5_FMA_Ro<63, 420, "xsmsubqpo" ,
2520 [(set f128:$vT,
2521 (int_ppc_fmaf128_round_to_odd
2522 f128:$vA, f128:$vB, (fneg f128:$vTi)))]>;
Lei Huang09fda632018-04-04 16:43:50 +00002523 def XSNMADDQP : X_VT5_VA5_VB5_FMA <63, 452, "xsnmaddqp",
2524 [(set f128:$vT,
2525 (fneg (fma f128:$vA, f128:$vB,
2526 f128:$vTi)))]>;
Stefan Pintilieb9d01aa2018-07-11 01:42:22 +00002527 def XSNMADDQPO: X_VT5_VA5_VB5_FMA_Ro<63, 452, "xsnmaddqpo",
2528 [(set f128:$vT,
2529 (fneg (int_ppc_fmaf128_round_to_odd
2530 f128:$vA, f128:$vB, f128:$vTi)))]>;
Lei Huang09fda632018-04-04 16:43:50 +00002531 def XSNMSUBQP : X_VT5_VA5_VB5_FMA <63, 484, "xsnmsubqp",
2532 [(set f128:$vT,
2533 (fneg (fma f128:$vA, f128:$vB,
2534 (fneg f128:$vTi))))]>;
Stefan Pintilieb9d01aa2018-07-11 01:42:22 +00002535 def XSNMSUBQPO: X_VT5_VA5_VB5_FMA_Ro<63, 484, "xsnmsubqpo",
2536 [(set f128:$vT,
2537 (fneg (int_ppc_fmaf128_round_to_odd
2538 f128:$vA, f128:$vB, (fneg f128:$vTi))))]>;
Lei Huang09fda632018-04-04 16:43:50 +00002539
2540 // Additional fnmsub patterns: -a*c + b == -(a*c - b)
2541 def : Pat<(fma (fneg f128:$A), f128:$C, f128:$B), (XSNMSUBQP $B, $C, $A)>;
2542 def : Pat<(fma f128:$A, (fneg f128:$C), f128:$B), (XSNMSUBQP $B, $C, $A)>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002543
Kit Barton93612ec2016-02-26 21:11:55 +00002544 //===--------------------------------------------------------------------===//
2545 // Quad/Double-Precision Compare Instructions:
2546
2547 // [PO BF // VRA VRB XO /]
2548 class X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
2549 list<dag> pattern>
2550 : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB),
2551 !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> {
2552 let Pattern = pattern;
2553 }
2554
2555 // QP Compare Ordered/Unordered
2556 def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>;
2557 def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>;
2558
2559 // DP/QP Compare Exponents
2560 def XSCMPEXPDP : XX3Form_1<60, 59,
2561 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002562 "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>,
2563 UseVSXReg;
Kit Barton93612ec2016-02-26 21:11:55 +00002564 def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>;
2565
2566 // DP Compare ==, >=, >, !=
2567 // Use vsrc for XT, because the entire register of XT is set.
2568 // XT.dword[1] = 0x0000_0000_0000_0000
2569 def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc,
2570 IIC_FPCompare, []>;
2571 def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc,
2572 IIC_FPCompare, []>;
2573 def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc,
2574 IIC_FPCompare, []>;
Kit Barton93612ec2016-02-26 21:11:55 +00002575
2576 //===--------------------------------------------------------------------===//
2577 // Quad-Precision Floating-Point Conversion Instructions:
2578
2579 // Convert DP -> QP
Lei Huangd17c39c2018-07-05 04:18:37 +00002580 def XSCVDPQP : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vfrc,
2581 [(set f128:$vT, (fpextend f64:$vB))]>;
Kit Barton93612ec2016-02-26 21:11:55 +00002582
2583 // Round & Convert QP -> DP (dword[1] is set to zero)
Lei Huang6270ab62018-07-04 21:59:16 +00002584 def XSCVQPDP : X_VT5_XO5_VB5_VSFR<63, 20, 836, "xscvqpdp" , []>;
Stefan Pintilie58e3e0a2018-07-09 20:09:22 +00002585 def XSCVQPDPO : X_VT5_XO5_VB5_VSFR_Ro<63, 20, 836, "xscvqpdpo",
2586 [(set f64:$vT,
2587 (int_ppc_truncf128_round_to_odd
2588 f128:$vB))]>;
Kit Barton93612ec2016-02-26 21:11:55 +00002589
2590 // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero)
2591 def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>;
2592 def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>;
2593 def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>;
2594 def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>;
2595
Lei Huangc517e952018-05-08 18:23:31 +00002596 // Convert (Un)Signed DWord -> QP.
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002597 def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vfrc, []>;
Lei Huang10367eb2018-04-12 18:00:14 +00002598 def : Pat<(f128 (sint_to_fp i64:$src)),
2599 (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>;
Lei Huang66e22c22018-07-05 07:46:01 +00002600 def : Pat<(f128 (sint_to_fp (i64 (PPCmfvsr f64:$src)))),
2601 (f128 (XSCVSDQP $src))>;
2602 def : Pat<(f128 (sint_to_fp (i32 (PPCmfvsr f64:$src)))),
2603 (f128 (XSCVSDQP (VEXTSW2Ds $src)))>;
2604
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002605 def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vfrc, []>;
Lei Huang10367eb2018-04-12 18:00:14 +00002606 def : Pat<(f128 (uint_to_fp i64:$src)),
2607 (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>;
Lei Huang66e22c22018-07-05 07:46:01 +00002608 def : Pat<(f128 (uint_to_fp (i64 (PPCmfvsr f64:$src)))),
2609 (f128 (XSCVUDQP $src))>;
Kit Barton93612ec2016-02-26 21:11:55 +00002610
Lei Huangc517e952018-05-08 18:23:31 +00002611 // Convert (Un)Signed Word -> QP.
Lei Huang198e6782018-04-18 16:34:22 +00002612 def : Pat<(f128 (sint_to_fp i32:$src)),
2613 (f128 (XSCVSDQP (MTVSRWA $src)))>;
2614 def : Pat<(f128 (sint_to_fp (i32 (load xoaddr:$src)))),
2615 (f128 (XSCVSDQP (LIWAX xoaddr:$src)))>;
2616 def : Pat<(f128 (uint_to_fp i32:$src)),
2617 (f128 (XSCVUDQP (MTVSRWZ $src)))>;
2618 def : Pat<(f128 (uint_to_fp (i32 (load xoaddr:$src)))),
2619 (f128 (XSCVUDQP (LIWZX xoaddr:$src)))>;
2620
Sean Fertilea435e072016-11-14 18:43:59 +00002621 let UseVSXReg = 1 in {
Kit Barton93612ec2016-02-26 21:11:55 +00002622 //===--------------------------------------------------------------------===//
2623 // Round to Floating-Point Integer Instructions
2624
2625 // (Round &) Convert DP <-> HP
2626 // Note! xscvdphp's src and dest register both use the left 64 bits, so we use
2627 // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits,
2628 // but we still use vsfrc for it.
2629 def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>;
2630 def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>;
2631
2632 // Vector HP -> SP
2633 def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>;
Nemanja Ivanovicec4b0c32016-11-11 21:42:01 +00002634 def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc,
2635 [(set v4f32:$XT,
2636 (int_ppc_vsx_xvcvsphp v4f32:$XB))]>;
Kit Barton93612ec2016-02-26 21:11:55 +00002637
Sean Fertilea435e072016-11-14 18:43:59 +00002638 } // UseVSXReg = 1
2639
2640 // Pattern for matching Vector HP -> Vector SP intrinsic. Defined as a
Simon Pilgrim68168d12017-03-30 12:59:53 +00002641 // separate pattern so that it can convert the input register class from
Sean Fertilea435e072016-11-14 18:43:59 +00002642 // VRRC(v8i16) to VSRC.
2643 def : Pat<(v4f32 (int_ppc_vsx_xvcvhpsp v8i16:$A)),
2644 (v4f32 (XVCVHPSP (COPY_TO_REGCLASS $A, VSRC)))>;
2645
Kit Barton93612ec2016-02-26 21:11:55 +00002646 class Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc,
2647 list<dag> pattern>
Zaara Syeda421a5962018-05-14 15:45:15 +00002648 : Z23Form_8<opcode, xo,
Kit Barton93612ec2016-02-26 21:11:55 +00002649 (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc),
2650 !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> {
2651 let RC = ex;
2652 }
2653
2654 // Round to Quad-Precision Integer [with Inexact]
2655 def XSRQPI : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 0, "xsrqpi" , []>;
2656 def XSRQPIX : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 1, "xsrqpix", []>;
2657
Stefan Pintilie133acb22018-07-09 20:38:40 +00002658 // Use current rounding mode
2659 def : Pat<(f128 (fnearbyint f128:$vB)), (f128 (XSRQPI 0, $vB, 3))>;
2660 // Round to nearest, ties away from zero
2661 def : Pat<(f128 (fround f128:$vB)), (f128 (XSRQPI 0, $vB, 0))>;
2662 // Round towards Zero
2663 def : Pat<(f128 (ftrunc f128:$vB)), (f128 (XSRQPI 1, $vB, 1))>;
2664 // Round towards +Inf
2665 def : Pat<(f128 (fceil f128:$vB)), (f128 (XSRQPI 1, $vB, 2))>;
2666 // Round towards -Inf
2667 def : Pat<(f128 (ffloor f128:$vB)), (f128 (XSRQPI 1, $vB, 3))>;
2668
2669 // Use current rounding mode, [with Inexact]
2670 def : Pat<(f128 (frint f128:$vB)), (f128 (XSRQPIX 0, $vB, 3))>;
2671
Kit Barton93612ec2016-02-26 21:11:55 +00002672 // Round Quad-Precision to Double-Extended Precision (fp80)
2673 def XSRQPXP : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002674
2675 //===--------------------------------------------------------------------===//
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002676 // Insert/Extract Instructions
2677
2678 // Insert Exponent DP/QP
2679 // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU
2680 def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002681 "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>, UseVSXReg;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002682 // vB NOTE: only vB.dword[0] is used, that's why we don't use
2683 // X_VT5_VA5_VB5 form
2684 def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB),
2685 "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>;
2686
Stefan Pintilieb5305772018-09-24 18:14:13 +00002687 def : Pat<(f128 (int_ppc_scalar_insert_exp_qp f128:$vA, i64:$vB)),
2688 (f128 (XSIEXPQP $vA, (MTVSRD $vB)))>;
2689
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002690 // Extract Exponent/Significand DP/QP
2691 def XSXEXPDP : XX2_RT5_XO5_XB6<60, 0, 347, "xsxexpdp", []>;
2692 def XSXSIGDP : XX2_RT5_XO5_XB6<60, 1, 347, "xsxsigdp", []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002693
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002694 def XSXEXPQP : X_VT5_XO5_VB5 <63, 2, 804, "xsxexpqp", []>;
2695 def XSXSIGQP : X_VT5_XO5_VB5 <63, 18, 804, "xsxsigqp", []>;
2696
Stefan Pintilieb5305772018-09-24 18:14:13 +00002697 def : Pat<(i64 (int_ppc_scalar_extract_expq f128:$vA)),
2698 (i64 (MFVSRD (EXTRACT_SUBREG
2699 (v2i64 (XSXEXPQP $vA)), sub_64)))>;
2700
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002701 // Vector Insert Word
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002702 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002703 // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB.
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002704 def XXINSERTW :
2705 XX2_RD6_UIM5_RS6<60, 181, (outs vsrc:$XT),
2706 (ins vsrc:$XTi, vsrc:$XB, u4imm:$UIM),
2707 "xxinsertw $XT, $XB, $UIM", IIC_VecFP,
Tony Jiang61ef1c52017-09-05 18:08:02 +00002708 [(set v4i32:$XT, (PPCvecinsert v4i32:$XTi, v4i32:$XB,
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002709 imm32SExt16:$UIM))]>,
2710 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002711
2712 // Vector Extract Unsigned Word
2713 def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165,
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002714 (outs vsfrc:$XT), (ins vsrc:$XB, u4imm:$UIMM),
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002715 "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002716 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002717
2718 // Vector Insert Exponent DP/SP
2719 def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc,
Nemanja Ivanovic0f459982016-10-26 19:03:40 +00002720 IIC_VecFP, [(set v2f64: $XT,(int_ppc_vsx_xviexpdp v2i64:$XA, v2i64:$XB))]>;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002721 def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc,
Nemanja Ivanovic0f459982016-10-26 19:03:40 +00002722 IIC_VecFP, [(set v4f32: $XT,(int_ppc_vsx_xviexpsp v4i32:$XA, v4i32:$XB))]>;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002723
2724 // Vector Extract Exponent/Significand DP/SP
Sean Fertileadda5b22016-11-14 14:42:37 +00002725 def XVXEXPDP : XX2_XT6_XO5_XB6<60, 0, 475, "xvxexpdp", vsrc,
2726 [(set v2i64: $XT,
2727 (int_ppc_vsx_xvxexpdp v2f64:$XB))]>;
2728 def XVXEXPSP : XX2_XT6_XO5_XB6<60, 8, 475, "xvxexpsp", vsrc,
2729 [(set v4i32: $XT,
2730 (int_ppc_vsx_xvxexpsp v4f32:$XB))]>;
2731 def XVXSIGDP : XX2_XT6_XO5_XB6<60, 1, 475, "xvxsigdp", vsrc,
2732 [(set v2i64: $XT,
2733 (int_ppc_vsx_xvxsigdp v2f64:$XB))]>;
2734 def XVXSIGSP : XX2_XT6_XO5_XB6<60, 9, 475, "xvxsigsp", vsrc,
2735 [(set v4i32: $XT,
2736 (int_ppc_vsx_xvxsigsp v4f32:$XB))]>;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002737
Sean Fertile1c4109b2016-12-09 17:21:42 +00002738 let AddedComplexity = 400, Predicates = [HasP9Vector] in {
2739 // Extra patterns expanding to vector Extract Word/Insert Word
2740 def : Pat<(v4i32 (int_ppc_vsx_xxinsertw v4i32:$A, v2i64:$B, imm:$IMM)),
2741 (v4i32 (XXINSERTW $A, $B, imm:$IMM))>;
2742 def : Pat<(v2i64 (int_ppc_vsx_xxextractuw v2i64:$A, imm:$IMM)),
2743 (v2i64 (COPY_TO_REGCLASS (XXEXTRACTUW $A, imm:$IMM), VSRC))>;
2744 } // AddedComplexity = 400, HasP9Vector
2745
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002746 //===--------------------------------------------------------------------===//
2747
2748 // Test Data Class SP/DP/QP
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002749 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002750 def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298,
2751 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2752 "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>;
2753 def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362,
2754 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2755 "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002756 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002757 def XSTSTDCQP : X_BF3_DCMX7_RS5 <63, 708,
2758 (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB),
2759 "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>;
2760
2761 // Vector Test Data Class SP/DP
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002762 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002763 def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5,
2764 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
Sean Fertileadda5b22016-11-14 14:42:37 +00002765 "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP,
2766 [(set v4i32: $XT,
2767 (int_ppc_vsx_xvtstdcsp v4f32:$XB, imm:$DCMX))]>;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002768 def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5,
2769 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
Sean Fertileadda5b22016-11-14 14:42:37 +00002770 "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP,
2771 [(set v2i64: $XT,
2772 (int_ppc_vsx_xvtstdcdp v2f64:$XB, imm:$DCMX))]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002773 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002774
2775 //===--------------------------------------------------------------------===//
2776
2777 // Maximum/Minimum Type-C/Type-J DP
2778 // XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU, so we use vsrc for XT
2779 def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsrc, vsfrc, vsfrc,
2780 IIC_VecFP, []>;
2781 def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc,
2782 IIC_VecFP, []>;
2783 def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsrc, vsfrc, vsfrc,
2784 IIC_VecFP, []>;
2785 def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc,
2786 IIC_VecFP, []>;
2787
2788 //===--------------------------------------------------------------------===//
2789
2790 // Vector Byte-Reverse H/W/D/Q Word
2791 def XXBRH : XX2_XT6_XO5_XB6<60, 7, 475, "xxbrh", vsrc, []>;
2792 def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, []>;
2793 def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, []>;
2794 def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>;
2795
Tony Jiang1a8eec12017-06-12 18:24:36 +00002796 // Vector Reverse
2797 def : Pat<(v8i16 (PPCxxreverse v8i16 :$A)),
2798 (v8i16 (COPY_TO_REGCLASS (XXBRH (COPY_TO_REGCLASS $A, VSRC)), VRRC))>;
2799 def : Pat<(v4i32 (PPCxxreverse v4i32 :$A)),
2800 (v4i32 (XXBRW $A))>;
2801 def : Pat<(v2i64 (PPCxxreverse v2i64 :$A)),
2802 (v2i64 (XXBRD $A))>;
2803 def : Pat<(v1i128 (PPCxxreverse v1i128 :$A)),
2804 (v1i128 (COPY_TO_REGCLASS (XXBRQ (COPY_TO_REGCLASS $A, VSRC)), VRRC))>;
2805
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002806 // Vector Permute
2807 def XXPERM : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc,
2808 IIC_VecPerm, []>;
2809 def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc,
2810 IIC_VecPerm, []>;
2811
2812 // Vector Splat Immediate Byte
2813 def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002814 "xxspltib $XT, $IMM8", IIC_VecPerm, []>, UseVSXReg;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002815
2816 //===--------------------------------------------------------------------===//
Kit Bartonba532dc2016-03-08 03:49:13 +00002817 // Vector/Scalar Load/Store Instructions
2818
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00002819 // When adding new D-Form loads/stores, be sure to update the ImmToIdxMap in
2820 // PPCRegisterInfo::PPCRegisterInfo and maybe save yourself some debugging.
Sean Fertile3c8c3852017-01-26 18:59:15 +00002821 let mayLoad = 1, mayStore = 0 in {
Kit Bartonba532dc2016-03-08 03:49:13 +00002822 // Load Vector
2823 def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002824 "lxv $XT, $src", IIC_LdStLFD, []>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002825 // Load DWord
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002826 def LXSD : DSForm_1<57, 2, (outs vfrc:$vD), (ins memrix:$src),
Kit Bartonba532dc2016-03-08 03:49:13 +00002827 "lxsd $vD, $src", IIC_LdStLFD, []>;
2828 // Load SP from src, convert it to DP, and place in dword[0]
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002829 def LXSSP : DSForm_1<57, 3, (outs vfrc:$vD), (ins memrix:$src),
Kit Bartonba532dc2016-03-08 03:49:13 +00002830 "lxssp $vD, $src", IIC_LdStLFD, []>;
2831
2832 // [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different
2833 // "out" and "in" dag
2834 class X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2835 RegisterOperand vtype, list<dag> pattern>
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002836 : XX1Form_memOp<opcode, xo, (outs vtype:$XT), (ins memrr:$src),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002837 !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002838
2839 // Load as Integer Byte/Halfword & Zero Indexed
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002840 def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc,
2841 [(set f64:$XT, (PPClxsizx xoaddr:$src, 1))]>;
2842 def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc,
2843 [(set f64:$XT, (PPClxsizx xoaddr:$src, 2))]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002844
2845 // Load Vector Halfword*8/Byte*16 Indexed
2846 def LXVH8X : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>;
2847 def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>;
2848
2849 // Load Vector Indexed
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00002850 def LXVX : X_XT6_RA5_RB5<31, 268, "lxvx" , vsrc,
Zaara Syeda93297832017-05-24 17:50:37 +00002851 [(set v2f64:$XT, (load xaddr:$src))]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002852 // Load Vector (Left-justified) with Length
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002853 def LXVL : XX1Form_memOp<31, 269, (outs vsrc:$XT), (ins memr:$src, g8rc:$rB),
Zaara Syedaa19c9e62016-11-15 17:54:19 +00002854 "lxvl $XT, $src, $rB", IIC_LdStLoad,
2855 [(set v4i32:$XT, (int_ppc_vsx_lxvl addr:$src, i64:$rB))]>,
2856 UseVSXReg;
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002857 def LXVLL : XX1Form_memOp<31,301, (outs vsrc:$XT), (ins memr:$src, g8rc:$rB),
Zaara Syedaa19c9e62016-11-15 17:54:19 +00002858 "lxvll $XT, $src, $rB", IIC_LdStLoad,
2859 [(set v4i32:$XT, (int_ppc_vsx_lxvll addr:$src, i64:$rB))]>,
2860 UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002861
2862 // Load Vector Word & Splat Indexed
2863 def LXVWSX : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002864 } // mayLoad
Kit Bartonba532dc2016-03-08 03:49:13 +00002865
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00002866 // When adding new D-Form loads/stores, be sure to update the ImmToIdxMap in
2867 // PPCRegisterInfo::PPCRegisterInfo and maybe save yourself some debugging.
Sean Fertile3c8c3852017-01-26 18:59:15 +00002868 let mayStore = 1, mayLoad = 0 in {
Kit Bartonba532dc2016-03-08 03:49:13 +00002869 // Store Vector
2870 def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002871 "stxv $XT, $dst", IIC_LdStSTFD, []>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002872 // Store DWord
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002873 def STXSD : DSForm_1<61, 2, (outs), (ins vfrc:$vS, memrix:$dst),
Kit Bartonba532dc2016-03-08 03:49:13 +00002874 "stxsd $vS, $dst", IIC_LdStSTFD, []>;
2875 // Convert DP of dword[0] to SP, and Store to dst
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002876 def STXSSP : DSForm_1<61, 3, (outs), (ins vfrc:$vS, memrix:$dst),
Kit Bartonba532dc2016-03-08 03:49:13 +00002877 "stxssp $vS, $dst", IIC_LdStSTFD, []>;
2878
2879 // [PO S RA RB XO SX]
2880 class X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2881 RegisterOperand vtype, list<dag> pattern>
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002882 : XX1Form_memOp<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002883 !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002884
2885 // Store as Integer Byte/Halfword Indexed
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002886 def STXSIBX : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsfrc,
2887 [(PPCstxsix f64:$XT, xoaddr:$dst, 1)]>;
2888 def STXSIHX : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsfrc,
2889 [(PPCstxsix f64:$XT, xoaddr:$dst, 2)]>;
2890 let isCodeGenOnly = 1 in {
2891 def STXSIBXv : X_XS6_RA5_RB5<31, 909, "stxsibx" , vrrc, []>;
2892 def STXSIHXv : X_XS6_RA5_RB5<31, 941, "stxsihx" , vrrc, []>;
2893 }
Kit Bartonba532dc2016-03-08 03:49:13 +00002894
2895 // Store Vector Halfword*8/Byte*16 Indexed
2896 def STXVH8X : X_XS6_RA5_RB5<31, 940, "stxvh8x" , vsrc, []>;
2897 def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>;
2898
2899 // Store Vector Indexed
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00002900 def STXVX : X_XS6_RA5_RB5<31, 396, "stxvx" , vsrc,
Zaara Syeda93297832017-05-24 17:50:37 +00002901 [(store v2f64:$XT, xaddr:$dst)]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002902
2903 // Store Vector (Left-justified) with Length
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002904 def STXVL : XX1Form_memOp<31, 397, (outs),
2905 (ins vsrc:$XT, memr:$dst, g8rc:$rB),
2906 "stxvl $XT, $dst, $rB", IIC_LdStLoad,
2907 [(int_ppc_vsx_stxvl v4i32:$XT, addr:$dst,
2908 i64:$rB)]>,
2909 UseVSXReg;
2910 def STXVLL : XX1Form_memOp<31, 429, (outs),
2911 (ins vsrc:$XT, memr:$dst, g8rc:$rB),
2912 "stxvll $XT, $dst, $rB", IIC_LdStLoad,
2913 [(int_ppc_vsx_stxvll v4i32:$XT, addr:$dst,
2914 i64:$rB)]>,
2915 UseVSXReg;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002916 } // mayStore
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002917
Lei Huang451ef4a2017-08-14 18:09:29 +00002918 let Predicates = [IsLittleEndian] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00002919 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002920 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 3))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002921 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002922 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 2))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002923 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002924 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 1))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002925 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002926 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 0))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002927 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002928 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 3)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002929 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002930 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 2)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002931 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002932 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 1)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002933 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002934 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 0)), VSFRC))>;
2935 }
2936
2937 let Predicates = [IsBigEndian] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00002938 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002939 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 0))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002940 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002941 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 1))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002942 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002943 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 2))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002944 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002945 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 3))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002946 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002947 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 0)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002948 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002949 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 1)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002950 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002951 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 2)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002952 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002953 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 3)), VSFRC))>;
2954 }
2955
Graham Yiu5cd044e2017-11-07 20:55:43 +00002956 // Alternate patterns for PPCmtvsrz where the output is v8i16 or v16i8 instead
2957 // of f64
2958 def : Pat<(v8i16 (PPCmtvsrz i32:$A)),
2959 (v8i16 (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64))>;
2960 def : Pat<(v16i8 (PPCmtvsrz i32:$A)),
2961 (v16i8 (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64))>;
2962
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002963 // Patterns for which instructions from ISA 3.0 are a better match
2964 let Predicates = [IsLittleEndian, HasP9Vector] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00002965 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002966 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002967 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002968 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002969 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002970 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002971 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002972 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002973 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002974 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 12)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002975 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002976 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 8)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002977 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002978 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 4)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002979 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002980 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 0)))>;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002981 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
2982 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
2983 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
2984 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
2985 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
2986 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
2987 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
2988 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
2989 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
2990 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
2991 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
2992 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
2993 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
2994 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
2995 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
2996 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
2997 } // IsLittleEndian, HasP9Vector
2998
2999 let Predicates = [IsBigEndian, HasP9Vector] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00003000 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00003001 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003002 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00003003 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003004 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00003005 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003006 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00003007 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003008 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00003009 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 0)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003010 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00003011 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 4)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003012 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00003013 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 8)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003014 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00003015 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 12)))>;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00003016 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
3017 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
3018 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
3019 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
3020 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
3021 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
3022 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
3023 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
3024 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
3025 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
3026 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
3027 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
3028 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
3029 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
3030 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
3031 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
3032 } // IsLittleEndian, HasP9Vector
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00003033
Zaara Syeda93297832017-05-24 17:50:37 +00003034 // D-Form Load/Store
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003035 def : Pat<(v4i32 (quadwOffsetLoad iqaddr:$src)), (LXV memrix16:$src)>;
3036 def : Pat<(v4f32 (quadwOffsetLoad iqaddr:$src)), (LXV memrix16:$src)>;
3037 def : Pat<(v2i64 (quadwOffsetLoad iqaddr:$src)), (LXV memrix16:$src)>;
3038 def : Pat<(v2f64 (quadwOffsetLoad iqaddr:$src)), (LXV memrix16:$src)>;
Lei Huang6d1596a2018-03-19 18:52:20 +00003039 def : Pat<(f128 (quadwOffsetLoad iqaddr:$src)),
3040 (COPY_TO_REGCLASS (LXV memrix16:$src), VRRC)>;
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003041 def : Pat<(v4i32 (int_ppc_vsx_lxvw4x iqaddr:$src)), (LXV memrix16:$src)>;
3042 def : Pat<(v2f64 (int_ppc_vsx_lxvd2x iqaddr:$src)), (LXV memrix16:$src)>;
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00003043
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003044 def : Pat<(quadwOffsetStore v4f32:$rS, iqaddr:$dst), (STXV $rS, memrix16:$dst)>;
3045 def : Pat<(quadwOffsetStore v4i32:$rS, iqaddr:$dst), (STXV $rS, memrix16:$dst)>;
3046 def : Pat<(quadwOffsetStore v2f64:$rS, iqaddr:$dst), (STXV $rS, memrix16:$dst)>;
Lei Huang6d1596a2018-03-19 18:52:20 +00003047 def : Pat<(quadwOffsetStore f128:$rS, iqaddr:$dst),
3048 (STXV (COPY_TO_REGCLASS $rS, VSRC), memrix16:$dst)>;
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003049 def : Pat<(quadwOffsetStore v2i64:$rS, iqaddr:$dst), (STXV $rS, memrix16:$dst)>;
3050 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, iqaddr:$dst),
Zaara Syeda93297832017-05-24 17:50:37 +00003051 (STXV $rS, memrix16:$dst)>;
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003052 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, iqaddr:$dst),
Zaara Syeda93297832017-05-24 17:50:37 +00003053 (STXV $rS, memrix16:$dst)>;
3054
3055
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003056 def : Pat<(v2f64 (nonQuadwOffsetLoad xoaddr:$src)), (LXVX xoaddr:$src)>;
3057 def : Pat<(v2i64 (nonQuadwOffsetLoad xoaddr:$src)), (LXVX xoaddr:$src)>;
3058 def : Pat<(v4f32 (nonQuadwOffsetLoad xoaddr:$src)), (LXVX xoaddr:$src)>;
3059 def : Pat<(v4i32 (nonQuadwOffsetLoad xoaddr:$src)), (LXVX xoaddr:$src)>;
3060 def : Pat<(v4i32 (int_ppc_vsx_lxvw4x xoaddr:$src)), (LXVX xoaddr:$src)>;
3061 def : Pat<(v2f64 (int_ppc_vsx_lxvd2x xoaddr:$src)), (LXVX xoaddr:$src)>;
Lei Huang6d1596a2018-03-19 18:52:20 +00003062 def : Pat<(f128 (nonQuadwOffsetLoad xoaddr:$src)),
3063 (COPY_TO_REGCLASS (LXVX xoaddr:$src), VRRC)>;
3064 def : Pat<(nonQuadwOffsetStore f128:$rS, xoaddr:$dst),
3065 (STXVX (COPY_TO_REGCLASS $rS, VSRC), xoaddr:$dst)>;
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003066 def : Pat<(nonQuadwOffsetStore v2f64:$rS, xoaddr:$dst),
3067 (STXVX $rS, xoaddr:$dst)>;
3068 def : Pat<(nonQuadwOffsetStore v2i64:$rS, xoaddr:$dst),
3069 (STXVX $rS, xoaddr:$dst)>;
3070 def : Pat<(nonQuadwOffsetStore v4f32:$rS, xoaddr:$dst),
3071 (STXVX $rS, xoaddr:$dst)>;
3072 def : Pat<(nonQuadwOffsetStore v4i32:$rS, xoaddr:$dst),
3073 (STXVX $rS, xoaddr:$dst)>;
3074 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
3075 (STXVX $rS, xoaddr:$dst)>;
3076 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
3077 (STXVX $rS, xoaddr:$dst)>;
Zaara Syedab2595b92018-08-08 15:20:43 +00003078
3079 let AddedComplexity = 400 in {
3080 // LIWAX - This instruction is used for sign extending i32 -> i64.
3081 // LIWZX - This instruction will be emitted for i32, f32, and when
3082 // zero-extending i32 to i64 (zext i32 -> i64).
3083 let Predicates = [IsLittleEndian] in {
3084
3085 def : Pat<(v2i64 (scalar_to_vector (i64 (sextloadi32 xoaddr:$src)))),
3086 (v2i64 (XXPERMDIs
3087 (COPY_TO_REGCLASS (LIWAX xoaddr:$src), VSRC), 2))>;
3088
3089 def : Pat<(v2i64 (scalar_to_vector (i64 (zextloadi32 xoaddr:$src)))),
3090 (v2i64 (XXPERMDIs
3091 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 2))>;
3092
3093 def : Pat<(v4i32 (scalar_to_vector (i32 (load xoaddr:$src)))),
3094 (v4i32 (XXPERMDIs
3095 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 2))>;
3096
3097 def : Pat<(v4f32 (scalar_to_vector (f32 (load xoaddr:$src)))),
3098 (v4f32 (XXPERMDIs
3099 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 2))>;
3100 }
3101
3102 let Predicates = [IsBigEndian] in {
3103 def : Pat<(v2i64 (scalar_to_vector (i64 (sextloadi32 xoaddr:$src)))),
3104 (v2i64 (COPY_TO_REGCLASS (LIWAX xoaddr:$src), VSRC))>;
3105
3106 def : Pat<(v2i64 (scalar_to_vector (i64 (zextloadi32 xoaddr:$src)))),
3107 (v2i64 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC))>;
3108
3109 def : Pat<(v4i32 (scalar_to_vector (i32 (load xoaddr:$src)))),
3110 (v4i32 (XXSLDWIs
3111 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 1))>;
3112
3113 def : Pat<(v4f32 (scalar_to_vector (f32 (load xoaddr:$src)))),
3114 (v4f32 (XXSLDWIs
3115 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 1))>;
3116 }
3117
3118 }
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003119
3120 // Build vectors from i8 loads
3121 def : Pat<(v16i8 (scalar_to_vector ScalarLoads.Li8)),
3122 (v16i8 (VSPLTBs 7, (LXSIBZX xoaddr:$src)))>;
3123 def : Pat<(v8i16 (scalar_to_vector ScalarLoads.ZELi8)),
3124 (v8i16 (VSPLTHs 3, (LXSIBZX xoaddr:$src)))>;
3125 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.ZELi8)),
3126 (v4i32 (XXSPLTWs (LXSIBZX xoaddr:$src), 1))>;
3127 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.ZELi8i64)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003128 (v2i64 (XXPERMDIs (LXSIBZX xoaddr:$src), 0))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003129 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.SELi8)),
3130 (v4i32 (XXSPLTWs (VEXTSB2Ws (LXSIBZX xoaddr:$src)), 1))>;
3131 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.SELi8i64)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003132 (v2i64 (XXPERMDIs (VEXTSB2Ds (LXSIBZX xoaddr:$src)), 0))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003133
3134 // Build vectors from i16 loads
3135 def : Pat<(v8i16 (scalar_to_vector ScalarLoads.Li16)),
3136 (v8i16 (VSPLTHs 3, (LXSIHZX xoaddr:$src)))>;
3137 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.ZELi16)),
3138 (v4i32 (XXSPLTWs (LXSIHZX xoaddr:$src), 1))>;
3139 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.ZELi16i64)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003140 (v2i64 (XXPERMDIs (LXSIHZX xoaddr:$src), 0))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003141 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.SELi16)),
3142 (v4i32 (XXSPLTWs (VEXTSH2Ws (LXSIHZX xoaddr:$src)), 1))>;
3143 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.SELi16i64)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003144 (v2i64 (XXPERMDIs (VEXTSH2Ds (LXSIHZX xoaddr:$src)), 0))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003145
3146 let Predicates = [IsBigEndian, HasP9Vector] in {
3147 // Scalar stores of i8
3148 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 0)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003149 (STXSIBXv (v16i8 (VSLDOI $S, $S, 9)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003150 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 1)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003151 (STXSIBXv (v16i8 (VSLDOI $S, $S, 10)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003152 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 2)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003153 (STXSIBXv (v16i8 (VSLDOI $S, $S, 11)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003154 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 3)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003155 (STXSIBXv (v16i8 (VSLDOI $S, $S, 12)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003156 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 4)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003157 (STXSIBXv (v16i8 (VSLDOI $S, $S, 13)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003158 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 5)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003159 (STXSIBXv (v16i8 (VSLDOI $S, $S, 14)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003160 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 6)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003161 (STXSIBXv (v16i8 (VSLDOI $S, $S, 15)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003162 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 7)), xoaddr:$dst),
3163 (STXSIBXv $S, xoaddr:$dst)>;
3164 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 8)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003165 (STXSIBXv (v16i8 (VSLDOI $S, $S, 1)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003166 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 9)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003167 (STXSIBXv (v16i8 (VSLDOI $S, $S, 2)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003168 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 10)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003169 (STXSIBXv (v16i8 (VSLDOI $S, $S, 3)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003170 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 11)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003171 (STXSIBXv (v16i8 (VSLDOI $S, $S, 4)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003172 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 12)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003173 (STXSIBXv (v16i8 (VSLDOI $S, $S, 5)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003174 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 13)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003175 (STXSIBXv (v16i8 (VSLDOI $S, $S, 6)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003176 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 14)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003177 (STXSIBXv (v16i8 (VSLDOI $S, $S, 7)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003178 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 15)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003179 (STXSIBXv (v16i8 (VSLDOI $S, $S, 8)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003180
3181 // Scalar stores of i16
3182 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 0)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003183 (STXSIHXv (v16i8 (VSLDOI $S, $S, 10)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003184 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 1)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003185 (STXSIHXv (v16i8 (VSLDOI $S, $S, 12)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003186 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 2)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003187 (STXSIHXv (v16i8 (VSLDOI $S, $S, 14)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003188 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 3)), xoaddr:$dst),
3189 (STXSIHXv $S, xoaddr:$dst)>;
3190 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 4)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003191 (STXSIHXv (v16i8 (VSLDOI $S, $S, 2)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003192 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 5)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003193 (STXSIHXv (v16i8 (VSLDOI $S, $S, 4)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003194 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 6)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003195 (STXSIHXv (v16i8 (VSLDOI $S, $S, 6)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003196 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 7)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003197 (STXSIHXv (v16i8 (VSLDOI $S, $S, 8)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003198 } // IsBigEndian, HasP9Vector
3199
3200 let Predicates = [IsLittleEndian, HasP9Vector] in {
3201 // Scalar stores of i8
3202 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 0)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003203 (STXSIBXv (v16i8 (VSLDOI $S, $S, 8)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003204 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 1)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003205 (STXSIBXv (v16i8 (VSLDOI $S, $S, 7)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003206 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 2)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003207 (STXSIBXv (v16i8 (VSLDOI $S, $S, 6)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003208 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 3)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003209 (STXSIBXv (v16i8 (VSLDOI $S, $S, 5)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003210 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 4)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003211 (STXSIBXv (v16i8 (VSLDOI $S, $S, 4)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003212 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 5)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003213 (STXSIBXv (v16i8 (VSLDOI $S, $S, 3)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003214 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 6)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003215 (STXSIBXv (v16i8 (VSLDOI $S, $S, 2)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003216 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 7)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003217 (STXSIBXv (v16i8 (VSLDOI $S, $S, 1)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003218 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 8)), xoaddr:$dst),
3219 (STXSIBXv $S, xoaddr:$dst)>;
3220 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 9)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003221 (STXSIBXv (v16i8 (VSLDOI $S, $S, 15)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003222 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 10)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003223 (STXSIBXv (v16i8 (VSLDOI $S, $S, 14)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003224 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 11)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003225 (STXSIBXv (v16i8 (VSLDOI $S, $S, 13)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003226 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 12)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003227 (STXSIBXv (v16i8 (VSLDOI $S, $S, 12)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003228 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 13)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003229 (STXSIBXv (v16i8 (VSLDOI $S, $S, 11)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003230 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 14)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003231 (STXSIBXv (v16i8 (VSLDOI $S, $S, 10)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003232 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 15)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003233 (STXSIBXv (v16i8 (VSLDOI $S, $S, 9)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003234
3235 // Scalar stores of i16
3236 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 0)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003237 (STXSIHXv (v16i8 (VSLDOI $S, $S, 8)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003238 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 1)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003239 (STXSIHXv (v16i8 (VSLDOI $S, $S, 6)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003240 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 2)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003241 (STXSIHXv (v16i8 (VSLDOI $S, $S, 4)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003242 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 3)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003243 (STXSIHXv (v16i8 (VSLDOI $S, $S, 2)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003244 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 4)), xoaddr:$dst),
3245 (STXSIHXv $S, xoaddr:$dst)>;
3246 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 5)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003247 (STXSIHXv (v16i8 (VSLDOI $S, $S, 14)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003248 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 6)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003249 (STXSIHXv (v16i8 (VSLDOI $S, $S, 12)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003250 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 7)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003251 (STXSIHXv (v16i8 (VSLDOI $S, $S, 10)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003252 } // IsLittleEndian, HasP9Vector
3253
Sean Fertile1c4109b2016-12-09 17:21:42 +00003254
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003255 // Vector sign extensions
3256 def : Pat<(f64 (PPCVexts f64:$A, 1)),
3257 (f64 (COPY_TO_REGCLASS (VEXTSB2Ds $A), VSFRC))>;
3258 def : Pat<(f64 (PPCVexts f64:$A, 2)),
3259 (f64 (COPY_TO_REGCLASS (VEXTSH2Ds $A), VSFRC))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003260
Jinsong Jic7b43b92018-12-13 15:12:57 +00003261 def DFLOADf32 : PPCPostRAExpPseudo<(outs vssrc:$XT), (ins memrix:$src),
3262 "#DFLOADf32",
3263 [(set f32:$XT, (load ixaddr:$src))]>;
3264 def DFLOADf64 : PPCPostRAExpPseudo<(outs vsfrc:$XT), (ins memrix:$src),
3265 "#DFLOADf64",
3266 [(set f64:$XT, (load ixaddr:$src))]>;
3267 def DFSTOREf32 : PPCPostRAExpPseudo<(outs), (ins vssrc:$XT, memrix:$dst),
3268 "#DFSTOREf32",
3269 [(store f32:$XT, ixaddr:$dst)]>;
3270 def DFSTOREf64 : PPCPostRAExpPseudo<(outs), (ins vsfrc:$XT, memrix:$dst),
3271 "#DFSTOREf64",
3272 [(store f64:$XT, ixaddr:$dst)]>;
3273
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003274 def : Pat<(f64 (extloadf32 ixaddr:$src)),
3275 (COPY_TO_REGCLASS (DFLOADf32 ixaddr:$src), VSFRC)>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003276 def : Pat<(f32 (fpround (f64 (extloadf32 ixaddr:$src)))),
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003277 (f32 (DFLOADf32 ixaddr:$src))>;
Lei Huang10367eb2018-04-12 18:00:14 +00003278
Zaara Syedab2595b92018-08-08 15:20:43 +00003279
3280 let AddedComplexity = 400 in {
3281 // The following pseudoinstructions are used to ensure the utilization
3282 // of all 64 VSX registers.
3283 let Predicates = [IsLittleEndian, HasP9Vector] in {
3284 def : Pat<(v2i64 (scalar_to_vector (i64 (load ixaddr:$src)))),
3285 (v2i64 (XXPERMDIs
3286 (COPY_TO_REGCLASS (DFLOADf64 ixaddr:$src), VSRC), 2))>;
3287 def : Pat<(v2i64 (scalar_to_vector (i64 (load xaddr:$src)))),
3288 (v2i64 (XXPERMDIs
3289 (COPY_TO_REGCLASS (XFLOADf64 xaddr:$src), VSRC), 2))>;
3290
3291 def : Pat<(v2f64 (scalar_to_vector (f64 (load ixaddr:$src)))),
3292 (v2f64 (XXPERMDIs
3293 (COPY_TO_REGCLASS (DFLOADf64 ixaddr:$src), VSRC), 2))>;
3294 def : Pat<(v2f64 (scalar_to_vector (f64 (load xaddr:$src)))),
3295 (v2f64 (XXPERMDIs
3296 (COPY_TO_REGCLASS (XFLOADf64 xaddr:$src), VSRC), 2))>;
3297 }
3298
3299 let Predicates = [IsBigEndian, HasP9Vector] in {
3300 def : Pat<(v2i64 (scalar_to_vector (i64 (load ixaddr:$src)))),
3301 (v2i64 (COPY_TO_REGCLASS (DFLOADf64 ixaddr:$src), VSRC))>;
3302 def : Pat<(v2i64 (scalar_to_vector (i64 (load xaddr:$src)))),
3303 (v2i64 (COPY_TO_REGCLASS (XFLOADf64 xaddr:$src), VSRC))>;
3304
3305 def : Pat<(v2f64 (scalar_to_vector (f64 (load ixaddr:$src)))),
3306 (v2f64 (COPY_TO_REGCLASS (DFLOADf64 ixaddr:$src), VSRC))>;
3307 def : Pat<(v2f64 (scalar_to_vector (f64 (load xaddr:$src)))),
3308 (v2f64 (COPY_TO_REGCLASS (XFLOADf64 xaddr:$src), VSRC))>;
3309 }
3310 }
3311
Lei Huang8b0da652018-05-23 19:31:54 +00003312 let Predicates = [IsBigEndian, HasP9Vector] in {
Lei Huang89901682018-05-23 18:36:51 +00003313
Lei Huang8b0da652018-05-23 19:31:54 +00003314 // (Un)Signed DWord vector extract -> QP
3315 def : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 0)))),
3316 (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>;
3317 def : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 1)))),
3318 (f128 (XSCVSDQP
3319 (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>;
3320 def : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 0)))),
3321 (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>;
3322 def : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 1)))),
3323 (f128 (XSCVUDQP
3324 (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>;
3325
3326 // (Un)Signed Word vector extract -> QP
3327 def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, 1)))),
3328 (f128 (XSCVSDQP (EXTRACT_SUBREG (VEXTSW2D $src), sub_64)))>;
3329 foreach Idx = [0,2,3] in {
3330 def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, Idx)))),
3331 (f128 (XSCVSDQP (EXTRACT_SUBREG
3332 (VEXTSW2D (VSPLTW Idx, $src)), sub_64)))>;
3333 }
3334 foreach Idx = 0-3 in {
3335 def : Pat<(f128 (uint_to_fp (i32 (extractelt v4i32:$src, Idx)))),
3336 (f128 (XSCVUDQP (XXEXTRACTUW $src, !shl(Idx, 2))))>;
3337 }
3338
Lei Huang651be442018-05-28 16:43:29 +00003339 // (Un)Signed HWord vector extract -> QP
3340 foreach Idx = 0-7 in {
3341 def : Pat<(f128 (sint_to_fp
3342 (i32 (sext_inreg
3343 (vector_extract v8i16:$src, Idx), i16)))),
3344 (f128 (XSCVSDQP (EXTRACT_SUBREG
3345 (VEXTSH2D (VEXTRACTUH !add(Idx, Idx), $src)),
3346 sub_64)))>;
3347 // The SDAG adds the `and` since an `i16` is being extracted as an `i32`.
3348 def : Pat<(f128 (uint_to_fp
3349 (and (i32 (vector_extract v8i16:$src, Idx)), 65535))),
3350 (f128 (XSCVUDQP (EXTRACT_SUBREG
3351 (VEXTRACTUH !add(Idx, Idx), $src), sub_64)))>;
3352 }
3353
3354 // (Un)Signed Byte vector extract -> QP
3355 foreach Idx = 0-15 in {
3356 def : Pat<(f128 (sint_to_fp
3357 (i32 (sext_inreg (vector_extract v16i8:$src, Idx),
3358 i8)))),
3359 (f128 (XSCVSDQP (EXTRACT_SUBREG
3360 (VEXTSB2D (VEXTRACTUB Idx, $src)), sub_64)))>;
3361 def : Pat<(f128 (uint_to_fp
3362 (and (i32 (vector_extract v16i8:$src, Idx)), 255))),
3363 (f128 (XSCVUDQP
3364 (EXTRACT_SUBREG (VEXTRACTUB Idx, $src), sub_64)))>;
3365 }
Lei Huang66e22c22018-07-05 07:46:01 +00003366
3367 // Unsiged int in vsx register -> QP
3368 def : Pat<(f128 (uint_to_fp (i32 (PPCmfvsr f64:$src)))),
3369 (f128 (XSCVUDQP
3370 (XXEXTRACTUW (SUBREG_TO_REG (i64 1), $src, sub_64), 4)))>;
Lei Huang8b0da652018-05-23 19:31:54 +00003371 } // IsBigEndian, HasP9Vector
3372
3373 let Predicates = [IsLittleEndian, HasP9Vector] in {
3374
3375 // (Un)Signed DWord vector extract -> QP
Lei Huang89901682018-05-23 18:36:51 +00003376 def : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 0)))),
3377 (f128 (XSCVSDQP
3378 (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>;
3379 def : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 1)))),
3380 (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>;
3381 def : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 0)))),
3382 (f128 (XSCVUDQP
3383 (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>;
3384 def : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 1)))),
3385 (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>;
Lei Huang8b0da652018-05-23 19:31:54 +00003386
3387 // (Un)Signed Word vector extract -> QP
3388 foreach Idx = [[0,3],[1,2],[3,0]] in {
3389 def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, !head(Idx))))),
3390 (f128 (XSCVSDQP (EXTRACT_SUBREG
3391 (VEXTSW2D (VSPLTW !head(!tail(Idx)), $src)),
3392 sub_64)))>;
3393 }
3394 def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, 2)))),
3395 (f128 (XSCVSDQP (EXTRACT_SUBREG (VEXTSW2D $src), sub_64)))>;
3396
3397 foreach Idx = [[0,12],[1,8],[2,4],[3,0]] in {
3398 def : Pat<(f128 (uint_to_fp (i32 (extractelt v4i32:$src, !head(Idx))))),
3399 (f128 (XSCVUDQP (XXEXTRACTUW $src, !head(!tail(Idx)))))>;
3400 }
Lei Huang651be442018-05-28 16:43:29 +00003401
3402 // (Un)Signed HWord vector extract -> QP
3403 // The Nested foreach lists identifies the vector element and corresponding
3404 // register byte location.
3405 foreach Idx = [[0,14],[1,12],[2,10],[3,8],[4,6],[5,4],[6,2],[7,0]] in {
3406 def : Pat<(f128 (sint_to_fp
3407 (i32 (sext_inreg
3408 (vector_extract v8i16:$src, !head(Idx)), i16)))),
3409 (f128 (XSCVSDQP
3410 (EXTRACT_SUBREG (VEXTSH2D
3411 (VEXTRACTUH !head(!tail(Idx)), $src)),
3412 sub_64)))>;
3413 def : Pat<(f128 (uint_to_fp
3414 (and (i32 (vector_extract v8i16:$src, !head(Idx))),
3415 65535))),
3416 (f128 (XSCVUDQP (EXTRACT_SUBREG
3417 (VEXTRACTUH !head(!tail(Idx)), $src), sub_64)))>;
3418 }
3419
3420 // (Un)Signed Byte vector extract -> QP
3421 foreach Idx = [[0,15],[1,14],[2,13],[3,12],[4,11],[5,10],[6,9],[7,8],[8,7],
3422 [9,6],[10,5],[11,4],[12,3],[13,2],[14,1],[15,0]] in {
3423 def : Pat<(f128 (sint_to_fp
3424 (i32 (sext_inreg
3425 (vector_extract v16i8:$src, !head(Idx)), i8)))),
3426 (f128 (XSCVSDQP
3427 (EXTRACT_SUBREG
3428 (VEXTSB2D (VEXTRACTUB !head(!tail(Idx)), $src)),
3429 sub_64)))>;
3430 def : Pat<(f128 (uint_to_fp
3431 (and (i32 (vector_extract v16i8:$src, !head(Idx))),
3432 255))),
3433 (f128 (XSCVUDQP
3434 (EXTRACT_SUBREG
3435 (VEXTRACTUB !head(!tail(Idx)), $src), sub_64)))>;
3436 }
Lei Huang66e22c22018-07-05 07:46:01 +00003437
3438 // Unsiged int in vsx register -> QP
3439 def : Pat<(f128 (uint_to_fp (i32 (PPCmfvsr f64:$src)))),
3440 (f128 (XSCVUDQP
3441 (XXEXTRACTUW (SUBREG_TO_REG (i64 1), $src, sub_64), 8)))>;
Lei Huang8b0da652018-05-23 19:31:54 +00003442 } // IsLittleEndian, HasP9Vector
Lei Huang89901682018-05-23 18:36:51 +00003443
Lei Huang10367eb2018-04-12 18:00:14 +00003444 // Convert (Un)Signed DWord in memory -> QP
3445 def : Pat<(f128 (sint_to_fp (i64 (load xaddr:$src)))),
3446 (f128 (XSCVSDQP (LXSDX xaddr:$src)))>;
3447 def : Pat<(f128 (sint_to_fp (i64 (load ixaddr:$src)))),
3448 (f128 (XSCVSDQP (LXSD ixaddr:$src)))>;
3449 def : Pat<(f128 (uint_to_fp (i64 (load xaddr:$src)))),
3450 (f128 (XSCVUDQP (LXSDX xaddr:$src)))>;
3451 def : Pat<(f128 (uint_to_fp (i64 (load ixaddr:$src)))),
3452 (f128 (XSCVUDQP (LXSD ixaddr:$src)))>;
3453
Lei Huang192c6cc2018-04-18 17:41:46 +00003454 // Convert Unsigned HWord in memory -> QP
3455 def : Pat<(f128 (uint_to_fp ScalarLoads.ZELi16)),
3456 (f128 (XSCVUDQP (LXSIHZX xaddr:$src)))>;
3457
3458 // Convert Unsigned Byte in memory -> QP
3459 def : Pat<(f128 (uint_to_fp ScalarLoads.ZELi8)),
3460 (f128 (XSCVUDQP (LXSIBZX xoaddr:$src)))>;
3461
Lei Huangc517e952018-05-08 18:23:31 +00003462 // Truncate & Convert QP -> (Un)Signed (D)Word.
3463 def : Pat<(i64 (fp_to_sint f128:$src)), (i64 (MFVRD (XSCVQPSDZ $src)))>;
3464 def : Pat<(i64 (fp_to_uint f128:$src)), (i64 (MFVRD (XSCVQPUDZ $src)))>;
Lei Huang63642882018-05-08 18:34:00 +00003465 def : Pat<(i32 (fp_to_sint f128:$src)),
3466 (i32 (MFVSRWZ (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC)))>;
3467 def : Pat<(i32 (fp_to_uint f128:$src)),
3468 (i32 (MFVSRWZ (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC)))>;
Lei Huangc517e952018-05-08 18:23:31 +00003469
Lei Huange41e3d32018-05-08 18:52:06 +00003470 // Instructions for store(fptosi).
Lei Huangc29229a2018-05-08 17:36:40 +00003471 // The 8-byte version is repeated here due to availability of D-Form STXSD.
3472 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huangc517e952018-05-08 18:23:31 +00003473 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), xaddr:$dst, 8),
3474 (STXSDX (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC),
3475 xaddr:$dst)>;
3476 def : Pat<(PPCstore_scal_int_from_vsr
3477 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), ixaddr:$dst, 8),
3478 (STXSD (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC),
3479 ixaddr:$dst)>;
3480 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huang63642882018-05-08 18:34:00 +00003481 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), xoaddr:$dst, 4),
3482 (STXSIWX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), xoaddr:$dst)>;
3483 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huange41e3d32018-05-08 18:52:06 +00003484 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), xoaddr:$dst, 2),
3485 (STXSIHX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), xoaddr:$dst)>;
3486 def : Pat<(PPCstore_scal_int_from_vsr
3487 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), xoaddr:$dst, 1),
3488 (STXSIBX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), xoaddr:$dst)>;
3489 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huangc29229a2018-05-08 17:36:40 +00003490 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xaddr:$dst, 8),
3491 (STXSDX (XSCVDPSXDS f64:$src), xaddr:$dst)>;
3492 def : Pat<(PPCstore_scal_int_from_vsr
3493 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ixaddr:$dst, 8),
3494 (STXSD (XSCVDPSXDS f64:$src), ixaddr:$dst)>;
3495 def : Pat<(PPCstore_scal_int_from_vsr
3496 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xoaddr:$dst, 2),
3497 (STXSIHX (XSCVDPSXWS f64:$src), xoaddr:$dst)>;
3498 def : Pat<(PPCstore_scal_int_from_vsr
3499 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xoaddr:$dst, 1),
3500 (STXSIBX (XSCVDPSXWS f64:$src), xoaddr:$dst)>;
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00003501
Lei Huange41e3d32018-05-08 18:52:06 +00003502 // Instructions for store(fptoui).
Lei Huangc29229a2018-05-08 17:36:40 +00003503 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huangc517e952018-05-08 18:23:31 +00003504 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), xaddr:$dst, 8),
3505 (STXSDX (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC),
3506 xaddr:$dst)>;
3507 def : Pat<(PPCstore_scal_int_from_vsr
3508 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), ixaddr:$dst, 8),
3509 (STXSD (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC),
3510 ixaddr:$dst)>;
3511 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huang63642882018-05-08 18:34:00 +00003512 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), xoaddr:$dst, 4),
3513 (STXSIWX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), xoaddr:$dst)>;
3514 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huange41e3d32018-05-08 18:52:06 +00003515 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), xoaddr:$dst, 2),
3516 (STXSIHX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), xoaddr:$dst)>;
3517 def : Pat<(PPCstore_scal_int_from_vsr
3518 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), xoaddr:$dst, 1),
3519 (STXSIBX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), xoaddr:$dst)>;
3520 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huangc29229a2018-05-08 17:36:40 +00003521 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xaddr:$dst, 8),
3522 (STXSDX (XSCVDPUXDS f64:$src), xaddr:$dst)>;
3523 def : Pat<(PPCstore_scal_int_from_vsr
3524 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ixaddr:$dst, 8),
3525 (STXSD (XSCVDPUXDS f64:$src), ixaddr:$dst)>;
3526 def : Pat<(PPCstore_scal_int_from_vsr
3527 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xoaddr:$dst, 2),
3528 (STXSIHX (XSCVDPUXWS f64:$src), xoaddr:$dst)>;
3529 def : Pat<(PPCstore_scal_int_from_vsr
3530 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xoaddr:$dst, 1),
3531 (STXSIBX (XSCVDPUXWS f64:$src), xoaddr:$dst)>;
3532
Lei Huang6270ab62018-07-04 21:59:16 +00003533 // Round & Convert QP -> DP/SP
3534 def : Pat<(f64 (fpround f128:$src)), (f64 (XSCVQPDP $src))>;
3535 def : Pat<(f32 (fpround f128:$src)), (f32 (XSRSP (XSCVQPDPO $src)))>;
Lei Huangd17c39c2018-07-05 04:18:37 +00003536
3537 // Convert SP -> QP
3538 def : Pat<(f128 (fpextend f32:$src)),
3539 (f128 (XSCVDPQP (COPY_TO_REGCLASS $src, VFRC)))>;
3540
Lei Huangc29229a2018-05-08 17:36:40 +00003541} // end HasP9Vector, AddedComplexity
Lei Huang6270ab62018-07-04 21:59:16 +00003542
Lei Huanga855e172018-07-05 06:21:37 +00003543let AddedComplexity = 400 in {
3544 let Predicates = [IsISA3_0, HasP9Vector, HasDirectMove, IsBigEndian] in {
3545 def : Pat<(f128 (PPCbuild_fp128 i64:$rB, i64:$rA)),
3546 (f128 (COPY_TO_REGCLASS (MTVSRDD $rB, $rA), VRRC))>;
3547 }
3548 let Predicates = [IsISA3_0, HasP9Vector, HasDirectMove, IsLittleEndian] in {
3549 def : Pat<(f128 (PPCbuild_fp128 i64:$rA, i64:$rB)),
3550 (f128 (COPY_TO_REGCLASS (MTVSRDD $rB, $rA), VRRC))>;
3551 }
3552}
3553
Zaara Syedafcd96972017-09-21 16:12:33 +00003554let Predicates = [HasP9Vector] in {
Jinsong Jic7b43b92018-12-13 15:12:57 +00003555 let mayStore = 1 in {
3556 def SPILLTOVSR_STX : PseudoXFormMemOp<(outs),
3557 (ins spilltovsrrc:$XT, memrr:$dst),
3558 "#SPILLTOVSR_STX", []>;
3559 def SPILLTOVSR_ST : PPCPostRAExpPseudo<(outs), (ins spilltovsrrc:$XT, memrix:$dst),
3560 "#SPILLTOVSR_ST", []>;
3561 }
3562 let mayLoad = 1 in {
3563 def SPILLTOVSR_LDX : PseudoXFormMemOp<(outs spilltovsrrc:$XT),
3564 (ins memrr:$src),
3565 "#SPILLTOVSR_LDX", []>;
3566 def SPILLTOVSR_LD : PPCPostRAExpPseudo<(outs spilltovsrrc:$XT), (ins memrix:$src),
3567 "#SPILLTOVSR_LD", []>;
Zaara Syedafcd96972017-09-21 16:12:33 +00003568
Zaara Syedafcd96972017-09-21 16:12:33 +00003569 }
3570}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003571// Integer extend helper dags 32 -> 64
3572def AnyExts {
3573 dag A = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32);
3574 dag B = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $B, sub_32);
3575 dag C = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $C, sub_32);
3576 dag D = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $D, sub_32);
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00003577}
3578
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003579def DblToFlt {
3580 dag A0 = (f32 (fpround (f64 (extractelt v2f64:$A, 0))));
3581 dag A1 = (f32 (fpround (f64 (extractelt v2f64:$A, 1))));
3582 dag B0 = (f32 (fpround (f64 (extractelt v2f64:$B, 0))));
3583 dag B1 = (f32 (fpround (f64 (extractelt v2f64:$B, 1))));
3584}
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003585
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003586def ExtDbl {
3587 dag A0S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$A, 0))))));
3588 dag A1S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$A, 1))))));
3589 dag B0S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$B, 0))))));
3590 dag B1S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$B, 1))))));
3591 dag A0U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$A, 0))))));
3592 dag A1U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$A, 1))))));
3593 dag B0U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$B, 0))))));
3594 dag B1U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$B, 1))))));
3595}
3596
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003597def ByteToWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003598 dag LE_A0 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 0)), i8));
3599 dag LE_A1 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 4)), i8));
3600 dag LE_A2 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 8)), i8));
3601 dag LE_A3 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 12)), i8));
3602 dag BE_A0 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 3)), i8));
3603 dag BE_A1 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 7)), i8));
3604 dag BE_A2 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 11)), i8));
3605 dag BE_A3 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 15)), i8));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003606}
3607
3608def ByteToDWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003609 dag LE_A0 = (i64 (sext_inreg
3610 (i64 (anyext (i32 (vector_extract v16i8:$A, 0)))), i8));
3611 dag LE_A1 = (i64 (sext_inreg
3612 (i64 (anyext (i32 (vector_extract v16i8:$A, 8)))), i8));
3613 dag BE_A0 = (i64 (sext_inreg
3614 (i64 (anyext (i32 (vector_extract v16i8:$A, 7)))), i8));
3615 dag BE_A1 = (i64 (sext_inreg
3616 (i64 (anyext (i32 (vector_extract v16i8:$A, 15)))), i8));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003617}
3618
3619def HWordToWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003620 dag LE_A0 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 0)), i16));
3621 dag LE_A1 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 2)), i16));
3622 dag LE_A2 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 4)), i16));
3623 dag LE_A3 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 6)), i16));
3624 dag BE_A0 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 1)), i16));
3625 dag BE_A1 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 3)), i16));
3626 dag BE_A2 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 5)), i16));
3627 dag BE_A3 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 7)), i16));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003628}
3629
3630def HWordToDWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003631 dag LE_A0 = (i64 (sext_inreg
3632 (i64 (anyext (i32 (vector_extract v8i16:$A, 0)))), i16));
3633 dag LE_A1 = (i64 (sext_inreg
3634 (i64 (anyext (i32 (vector_extract v8i16:$A, 4)))), i16));
3635 dag BE_A0 = (i64 (sext_inreg
3636 (i64 (anyext (i32 (vector_extract v8i16:$A, 3)))), i16));
3637 dag BE_A1 = (i64 (sext_inreg
3638 (i64 (anyext (i32 (vector_extract v8i16:$A, 7)))), i16));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003639}
3640
3641def WordToDWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003642 dag LE_A0 = (i64 (sext (i32 (vector_extract v4i32:$A, 0))));
3643 dag LE_A1 = (i64 (sext (i32 (vector_extract v4i32:$A, 2))));
3644 dag BE_A0 = (i64 (sext (i32 (vector_extract v4i32:$A, 1))));
3645 dag BE_A1 = (i64 (sext (i32 (vector_extract v4i32:$A, 3))));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003646}
3647
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003648def FltToIntLoad {
3649 dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (extloadf32 xoaddr:$A)))));
3650}
3651def FltToUIntLoad {
3652 dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (extloadf32 xoaddr:$A)))));
3653}
3654def FltToLongLoad {
3655 dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (extloadf32 xoaddr:$A)))));
3656}
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003657def FltToLongLoadP9 {
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003658 dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (extloadf32 ixaddr:$A)))));
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003659}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003660def FltToULongLoad {
3661 dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (extloadf32 xoaddr:$A)))));
3662}
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003663def FltToULongLoadP9 {
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003664 dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (extloadf32 ixaddr:$A)))));
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003665}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003666def FltToLong {
Lei Huangcd4f3852018-03-12 19:26:18 +00003667 dag A = (i64 (PPCmfvsr (f64 (PPCfctidz (fpextend f32:$A)))));
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003668}
3669def FltToULong {
Lei Huangcd4f3852018-03-12 19:26:18 +00003670 dag A = (i64 (PPCmfvsr (f64 (PPCfctiduz (fpextend f32:$A)))));
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003671}
3672def DblToInt {
3673 dag A = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$A))));
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003674 dag B = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$B))));
3675 dag C = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$C))));
3676 dag D = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$D))));
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003677}
3678def DblToUInt {
3679 dag A = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$A))));
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003680 dag B = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$B))));
3681 dag C = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$C))));
3682 dag D = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$D))));
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003683}
3684def DblToLong {
3685 dag A = (i64 (PPCmfvsr (f64 (PPCfctidz f64:$A))));
3686}
3687def DblToULong {
3688 dag A = (i64 (PPCmfvsr (f64 (PPCfctiduz f64:$A))));
3689}
3690def DblToIntLoad {
3691 dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (load xoaddr:$A)))));
3692}
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003693def DblToIntLoadP9 {
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003694 dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (load ixaddr:$A)))));
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003695}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003696def DblToUIntLoad {
3697 dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (load xoaddr:$A)))));
3698}
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003699def DblToUIntLoadP9 {
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003700 dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (load ixaddr:$A)))));
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003701}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003702def DblToLongLoad {
3703 dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (load xoaddr:$A)))));
3704}
3705def DblToULongLoad {
3706 dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (load xoaddr:$A)))));
3707}
3708
3709// FP merge dags (for f32 -> v4f32)
3710def MrgFP {
3711 dag AC = (XVCVDPSP (XXPERMDI (COPY_TO_REGCLASS $A, VSRC),
3712 (COPY_TO_REGCLASS $C, VSRC), 0));
3713 dag BD = (XVCVDPSP (XXPERMDI (COPY_TO_REGCLASS $B, VSRC),
3714 (COPY_TO_REGCLASS $D, VSRC), 0));
3715 dag ABhToFlt = (XVCVDPSP (XXPERMDI $A, $B, 0));
3716 dag ABlToFlt = (XVCVDPSP (XXPERMDI $A, $B, 3));
3717 dag BAhToFlt = (XVCVDPSP (XXPERMDI $B, $A, 0));
3718 dag BAlToFlt = (XVCVDPSP (XXPERMDI $B, $A, 3));
3719}
3720
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003721// Word-element merge dags - conversions from f64 to i32 merged into vectors.
3722def MrgWords {
3723 // For big endian, we merge low and hi doublewords (A, B).
3724 dag A0B0 = (v2f64 (XXPERMDI v2f64:$A, v2f64:$B, 0));
3725 dag A1B1 = (v2f64 (XXPERMDI v2f64:$A, v2f64:$B, 3));
3726 dag CVA1B1S = (v4i32 (XVCVDPSXWS A1B1));
3727 dag CVA0B0S = (v4i32 (XVCVDPSXWS A0B0));
3728 dag CVA1B1U = (v4i32 (XVCVDPUXWS A1B1));
3729 dag CVA0B0U = (v4i32 (XVCVDPUXWS A0B0));
3730
3731 // For little endian, we merge low and hi doublewords (B, A).
3732 dag B1A1 = (v2f64 (XXPERMDI v2f64:$B, v2f64:$A, 0));
3733 dag B0A0 = (v2f64 (XXPERMDI v2f64:$B, v2f64:$A, 3));
3734 dag CVB1A1S = (v4i32 (XVCVDPSXWS B1A1));
3735 dag CVB0A0S = (v4i32 (XVCVDPSXWS B0A0));
3736 dag CVB1A1U = (v4i32 (XVCVDPUXWS B1A1));
3737 dag CVB0A0U = (v4i32 (XVCVDPUXWS B0A0));
3738
3739 // For big endian, we merge hi doublewords of (A, C) and (B, D), convert
3740 // then merge.
3741 dag AC = (v2f64 (XXPERMDI (COPY_TO_REGCLASS f64:$A, VSRC),
3742 (COPY_TO_REGCLASS f64:$C, VSRC), 0));
3743 dag BD = (v2f64 (XXPERMDI (COPY_TO_REGCLASS f64:$B, VSRC),
3744 (COPY_TO_REGCLASS f64:$D, VSRC), 0));
3745 dag CVACS = (v4i32 (XVCVDPSXWS AC));
3746 dag CVBDS = (v4i32 (XVCVDPSXWS BD));
3747 dag CVACU = (v4i32 (XVCVDPUXWS AC));
3748 dag CVBDU = (v4i32 (XVCVDPUXWS BD));
3749
3750 // For little endian, we merge hi doublewords of (D, B) and (C, A), convert
3751 // then merge.
3752 dag DB = (v2f64 (XXPERMDI (COPY_TO_REGCLASS f64:$D, VSRC),
3753 (COPY_TO_REGCLASS f64:$B, VSRC), 0));
3754 dag CA = (v2f64 (XXPERMDI (COPY_TO_REGCLASS f64:$C, VSRC),
3755 (COPY_TO_REGCLASS f64:$A, VSRC), 0));
3756 dag CVDBS = (v4i32 (XVCVDPSXWS DB));
3757 dag CVCAS = (v4i32 (XVCVDPSXWS CA));
3758 dag CVDBU = (v4i32 (XVCVDPUXWS DB));
3759 dag CVCAU = (v4i32 (XVCVDPUXWS CA));
3760}
3761
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003762// Patterns for BUILD_VECTOR nodes.
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003763let AddedComplexity = 400 in {
3764
3765 let Predicates = [HasVSX] in {
3766 // Build vectors of floating point converted to i32.
3767 def : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.A,
3768 DblToInt.A, DblToInt.A)),
3769 (v4i32 (XXSPLTW (COPY_TO_REGCLASS (XSCVDPSXWS $A), VSRC), 1))>;
3770 def : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.A,
3771 DblToUInt.A, DblToUInt.A)),
3772 (v4i32 (XXSPLTW (COPY_TO_REGCLASS (XSCVDPUXWS $A), VSRC), 1))>;
3773 def : Pat<(v2i64 (build_vector DblToLong.A, DblToLong.A)),
3774 (v2i64 (XXPERMDI (COPY_TO_REGCLASS (XSCVDPSXDS $A), VSRC),
3775 (COPY_TO_REGCLASS (XSCVDPSXDS $A), VSRC), 0))>;
3776 def : Pat<(v2i64 (build_vector DblToULong.A, DblToULong.A)),
3777 (v2i64 (XXPERMDI (COPY_TO_REGCLASS (XSCVDPUXDS $A), VSRC),
3778 (COPY_TO_REGCLASS (XSCVDPUXDS $A), VSRC), 0))>;
3779 def : Pat<(v4i32 (scalar_to_vector FltToIntLoad.A)),
3780 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003781 (XSCVDPSXWSs (XFLOADf32 xoaddr:$A)), VSRC), 1))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003782 def : Pat<(v4i32 (scalar_to_vector FltToUIntLoad.A)),
3783 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003784 (XSCVDPUXWSs (XFLOADf32 xoaddr:$A)), VSRC), 1))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003785 def : Pat<(v4f32 (build_vector f32:$A, f32:$A, f32:$A, f32:$A)),
3786 (v4f32 (XXSPLTW (v4f32 (XSCVDPSPN $A)), 0))>;
3787
3788 // Build vectors of floating point converted to i64.
3789 def : Pat<(v2i64 (build_vector FltToLong.A, FltToLong.A)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003790 (v2i64 (XXPERMDIs
3791 (COPY_TO_REGCLASS (XSCVDPSXDSs $A), VSFRC), 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003792 def : Pat<(v2i64 (build_vector FltToULong.A, FltToULong.A)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003793 (v2i64 (XXPERMDIs
3794 (COPY_TO_REGCLASS (XSCVDPUXDSs $A), VSFRC), 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003795 def : Pat<(v2i64 (scalar_to_vector DblToLongLoad.A)),
3796 (v2i64 (XVCVDPSXDS (LXVDSX xoaddr:$A)))>;
3797 def : Pat<(v2i64 (scalar_to_vector DblToULongLoad.A)),
3798 (v2i64 (XVCVDPUXDS (LXVDSX xoaddr:$A)))>;
3799 }
3800
3801 let Predicates = [HasVSX, NoP9Vector] in {
Tony Jiang438bf4a2017-11-20 14:38:30 +00003802 // Load-and-splat with fp-to-int conversion (using X-Form VSX/FP loads).
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003803 def : Pat<(v4i32 (scalar_to_vector DblToIntLoad.A)),
3804 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003805 (XSCVDPSXWS (XFLOADf64 xoaddr:$A)), VSRC), 1))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003806 def : Pat<(v4i32 (scalar_to_vector DblToUIntLoad.A)),
3807 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003808 (XSCVDPUXWS (XFLOADf64 xoaddr:$A)), VSRC), 1))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003809 def : Pat<(v2i64 (scalar_to_vector FltToLongLoad.A)),
3810 (v2i64 (XXPERMDIs (XSCVDPSXDS (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003811 (XFLOADf32 xoaddr:$A), VSFRC)), 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003812 def : Pat<(v2i64 (scalar_to_vector FltToULongLoad.A)),
3813 (v2i64 (XXPERMDIs (XSCVDPUXDS (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003814 (XFLOADf32 xoaddr:$A), VSFRC)), 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003815 }
3816
3817 // Big endian, available on all targets with VSX
3818 let Predicates = [IsBigEndian, HasVSX] in {
3819 def : Pat<(v2f64 (build_vector f64:$A, f64:$B)),
3820 (v2f64 (XXPERMDI
3821 (COPY_TO_REGCLASS $A, VSRC),
3822 (COPY_TO_REGCLASS $B, VSRC), 0))>;
3823
3824 def : Pat<(v4f32 (build_vector f32:$A, f32:$B, f32:$C, f32:$D)),
3825 (VMRGEW MrgFP.AC, MrgFP.BD)>;
3826 def : Pat<(v4f32 (build_vector DblToFlt.A0, DblToFlt.A1,
3827 DblToFlt.B0, DblToFlt.B1)),
3828 (v4f32 (VMRGEW MrgFP.ABhToFlt, MrgFP.ABlToFlt))>;
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003829
3830 // Convert 4 doubles to a vector of ints.
3831 def : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.B,
3832 DblToInt.C, DblToInt.D)),
3833 (v4i32 (VMRGEW MrgWords.CVACS, MrgWords.CVBDS))>;
3834 def : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.B,
3835 DblToUInt.C, DblToUInt.D)),
3836 (v4i32 (VMRGEW MrgWords.CVACU, MrgWords.CVBDU))>;
3837 def : Pat<(v4i32 (build_vector ExtDbl.A0S, ExtDbl.A1S,
3838 ExtDbl.B0S, ExtDbl.B1S)),
3839 (v4i32 (VMRGEW MrgWords.CVA0B0S, MrgWords.CVA1B1S))>;
3840 def : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U,
3841 ExtDbl.B0U, ExtDbl.B1U)),
3842 (v4i32 (VMRGEW MrgWords.CVA0B0U, MrgWords.CVA1B1U))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003843 }
3844
3845 let Predicates = [IsLittleEndian, HasVSX] in {
3846 // Little endian, available on all targets with VSX
3847 def : Pat<(v2f64 (build_vector f64:$A, f64:$B)),
3848 (v2f64 (XXPERMDI
3849 (COPY_TO_REGCLASS $B, VSRC),
3850 (COPY_TO_REGCLASS $A, VSRC), 0))>;
3851
3852 def : Pat<(v4f32 (build_vector f32:$D, f32:$C, f32:$B, f32:$A)),
3853 (VMRGEW MrgFP.AC, MrgFP.BD)>;
3854 def : Pat<(v4f32 (build_vector DblToFlt.A0, DblToFlt.A1,
3855 DblToFlt.B0, DblToFlt.B1)),
3856 (v4f32 (VMRGEW MrgFP.BAhToFlt, MrgFP.BAlToFlt))>;
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003857
3858 // Convert 4 doubles to a vector of ints.
3859 def : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.B,
3860 DblToInt.C, DblToInt.D)),
3861 (v4i32 (VMRGEW MrgWords.CVDBS, MrgWords.CVCAS))>;
3862 def : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.B,
3863 DblToUInt.C, DblToUInt.D)),
3864 (v4i32 (VMRGEW MrgWords.CVDBU, MrgWords.CVCAU))>;
3865 def : Pat<(v4i32 (build_vector ExtDbl.A0S, ExtDbl.A1S,
3866 ExtDbl.B0S, ExtDbl.B1S)),
3867 (v4i32 (VMRGEW MrgWords.CVB1A1S, MrgWords.CVB0A0S))>;
3868 def : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U,
3869 ExtDbl.B0U, ExtDbl.B1U)),
3870 (v4i32 (VMRGEW MrgWords.CVB1A1U, MrgWords.CVB0A0U))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003871 }
3872
3873 let Predicates = [HasDirectMove] in {
3874 // Endianness-neutral constant splat on P8 and newer targets. The reason
3875 // for this pattern is that on targets with direct moves, we don't expand
3876 // BUILD_VECTOR nodes for v4i32.
3877 def : Pat<(v4i32 (build_vector immSExt5NonZero:$A, immSExt5NonZero:$A,
3878 immSExt5NonZero:$A, immSExt5NonZero:$A)),
3879 (v4i32 (VSPLTISW imm:$A))>;
3880 }
3881
3882 let Predicates = [IsBigEndian, HasDirectMove, NoP9Vector] in {
3883 // Big endian integer vectors using direct moves.
3884 def : Pat<(v2i64 (build_vector i64:$A, i64:$B)),
3885 (v2i64 (XXPERMDI
3886 (COPY_TO_REGCLASS (MTVSRD $A), VSRC),
3887 (COPY_TO_REGCLASS (MTVSRD $B), VSRC), 0))>;
3888 def : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)),
Lei Huangde208432018-10-26 18:09:36 +00003889 (XXPERMDI
3890 (COPY_TO_REGCLASS
3891 (MTVSRD (RLDIMI AnyExts.B, AnyExts.A, 32, 0)), VSRC),
3892 (COPY_TO_REGCLASS
3893 (MTVSRD (RLDIMI AnyExts.D, AnyExts.C, 32, 0)), VSRC), 0)>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003894 def : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)),
3895 (XXSPLTW (COPY_TO_REGCLASS (MTVSRWZ $A), VSRC), 1)>;
3896 }
3897
3898 let Predicates = [IsLittleEndian, HasDirectMove, NoP9Vector] in {
3899 // Little endian integer vectors using direct moves.
3900 def : Pat<(v2i64 (build_vector i64:$A, i64:$B)),
3901 (v2i64 (XXPERMDI
3902 (COPY_TO_REGCLASS (MTVSRD $B), VSRC),
3903 (COPY_TO_REGCLASS (MTVSRD $A), VSRC), 0))>;
3904 def : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)),
Lei Huangde208432018-10-26 18:09:36 +00003905 (XXPERMDI
3906 (COPY_TO_REGCLASS
3907 (MTVSRD (RLDIMI AnyExts.C, AnyExts.D, 32, 0)), VSRC),
3908 (COPY_TO_REGCLASS
3909 (MTVSRD (RLDIMI AnyExts.A, AnyExts.B, 32, 0)), VSRC), 0)>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003910 def : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)),
3911 (XXSPLTW (COPY_TO_REGCLASS (MTVSRWZ $A), VSRC), 1)>;
3912 }
3913
3914 let Predicates = [HasP9Vector] in {
3915 // Endianness-neutral patterns for const splats with ISA 3.0 instructions.
3916 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
3917 (v4i32 (MTVSRWS $A))>;
3918 def : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)),
3919 (v4i32 (MTVSRWS $A))>;
Nemanja Ivanovic552c8e92016-12-15 11:16:20 +00003920 def : Pat<(v16i8 (build_vector immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3921 immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3922 immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3923 immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3924 immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3925 immAnyExt8:$A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003926 (v16i8 (COPY_TO_REGCLASS (XXSPLTIB imm:$A), VSRC))>;
3927 def : Pat<(v16i8 immAllOnesV),
3928 (v16i8 (COPY_TO_REGCLASS (XXSPLTIB 255), VSRC))>;
3929 def : Pat<(v8i16 immAllOnesV),
3930 (v8i16 (COPY_TO_REGCLASS (XXSPLTIB 255), VSRC))>;
3931 def : Pat<(v4i32 immAllOnesV),
3932 (v4i32 (XXSPLTIB 255))>;
3933 def : Pat<(v2i64 immAllOnesV),
3934 (v2i64 (XXSPLTIB 255))>;
3935 def : Pat<(v4i32 (scalar_to_vector FltToIntLoad.A)),
3936 (v4i32 (XVCVSPSXWS (LXVWSX xoaddr:$A)))>;
3937 def : Pat<(v4i32 (scalar_to_vector FltToUIntLoad.A)),
3938 (v4i32 (XVCVSPUXWS (LXVWSX xoaddr:$A)))>;
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003939 def : Pat<(v4i32 (scalar_to_vector DblToIntLoadP9.A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003940 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003941 (XSCVDPSXWS (DFLOADf64 ixaddr:$A)), VSRC), 1))>;
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003942 def : Pat<(v4i32 (scalar_to_vector DblToUIntLoadP9.A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003943 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003944 (XSCVDPUXWS (DFLOADf64 ixaddr:$A)), VSRC), 1))>;
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003945 def : Pat<(v2i64 (scalar_to_vector FltToLongLoadP9.A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003946 (v2i64 (XXPERMDIs (XSCVDPSXDS (COPY_TO_REGCLASS
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003947 (DFLOADf32 ixaddr:$A),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003948 VSFRC)), 0))>;
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003949 def : Pat<(v2i64 (scalar_to_vector FltToULongLoadP9.A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003950 (v2i64 (XXPERMDIs (XSCVDPUXDS (COPY_TO_REGCLASS
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003951 (DFLOADf32 ixaddr:$A),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003952 VSFRC)), 0))>;
3953 }
3954
3955 let Predicates = [IsISA3_0, HasDirectMove, IsBigEndian] in {
3956 def : Pat<(i64 (extractelt v2i64:$A, 1)),
3957 (i64 (MFVSRLD $A))>;
3958 // Better way to build integer vectors if we have MTVSRDD. Big endian.
3959 def : Pat<(v2i64 (build_vector i64:$rB, i64:$rA)),
3960 (v2i64 (MTVSRDD $rB, $rA))>;
3961 def : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)),
Lei Huangde208432018-10-26 18:09:36 +00003962 (MTVSRDD
3963 (RLDIMI AnyExts.B, AnyExts.A, 32, 0),
3964 (RLDIMI AnyExts.D, AnyExts.C, 32, 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003965 }
3966
3967 let Predicates = [IsISA3_0, HasDirectMove, IsLittleEndian] in {
3968 def : Pat<(i64 (extractelt v2i64:$A, 0)),
3969 (i64 (MFVSRLD $A))>;
3970 // Better way to build integer vectors if we have MTVSRDD. Little endian.
3971 def : Pat<(v2i64 (build_vector i64:$rA, i64:$rB)),
3972 (v2i64 (MTVSRDD $rB, $rA))>;
3973 def : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)),
Lei Huangde208432018-10-26 18:09:36 +00003974 (MTVSRDD
3975 (RLDIMI AnyExts.C, AnyExts.D, 32, 0),
3976 (RLDIMI AnyExts.A, AnyExts.B, 32, 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003977 }
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003978 // P9 Altivec instructions that can be used to build vectors.
3979 // Adding them to PPCInstrVSX.td rather than PPCAltivecVSX.td to compete
3980 // with complexities of existing build vector patterns in this file.
Tony Jiang9a91a182017-07-05 16:00:38 +00003981 let Predicates = [HasP9Altivec, IsLittleEndian] in {
3982 def : Pat<(v2i64 (build_vector WordToDWord.LE_A0, WordToDWord.LE_A1)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003983 (v2i64 (VEXTSW2D $A))>;
Tony Jiang9a91a182017-07-05 16:00:38 +00003984 def : Pat<(v2i64 (build_vector HWordToDWord.LE_A0, HWordToDWord.LE_A1)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003985 (v2i64 (VEXTSH2D $A))>;
Tony Jiang9a91a182017-07-05 16:00:38 +00003986 def : Pat<(v4i32 (build_vector HWordToWord.LE_A0, HWordToWord.LE_A1,
3987 HWordToWord.LE_A2, HWordToWord.LE_A3)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003988 (v4i32 (VEXTSH2W $A))>;
Tony Jiang9a91a182017-07-05 16:00:38 +00003989 def : Pat<(v4i32 (build_vector ByteToWord.LE_A0, ByteToWord.LE_A1,
3990 ByteToWord.LE_A2, ByteToWord.LE_A3)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003991 (v4i32 (VEXTSB2W $A))>;
Tony Jiang9a91a182017-07-05 16:00:38 +00003992 def : Pat<(v2i64 (build_vector ByteToDWord.LE_A0, ByteToDWord.LE_A1)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003993 (v2i64 (VEXTSB2D $A))>;
3994 }
Tony Jiang9a91a182017-07-05 16:00:38 +00003995
3996 let Predicates = [HasP9Altivec, IsBigEndian] in {
3997 def : Pat<(v2i64 (build_vector WordToDWord.BE_A0, WordToDWord.BE_A1)),
3998 (v2i64 (VEXTSW2D $A))>;
3999 def : Pat<(v2i64 (build_vector HWordToDWord.BE_A0, HWordToDWord.BE_A1)),
4000 (v2i64 (VEXTSH2D $A))>;
4001 def : Pat<(v4i32 (build_vector HWordToWord.BE_A0, HWordToWord.BE_A1,
4002 HWordToWord.BE_A2, HWordToWord.BE_A3)),
4003 (v4i32 (VEXTSH2W $A))>;
4004 def : Pat<(v4i32 (build_vector ByteToWord.BE_A0, ByteToWord.BE_A1,
4005 ByteToWord.BE_A2, ByteToWord.BE_A3)),
4006 (v4i32 (VEXTSB2W $A))>;
4007 def : Pat<(v2i64 (build_vector ByteToDWord.BE_A0, ByteToDWord.BE_A1)),
4008 (v2i64 (VEXTSB2D $A))>;
4009 }
4010
4011 let Predicates = [HasP9Altivec] in {
4012 def: Pat<(v2i64 (PPCSExtVElems v16i8:$A)),
4013 (v2i64 (VEXTSB2D $A))>;
4014 def: Pat<(v2i64 (PPCSExtVElems v8i16:$A)),
4015 (v2i64 (VEXTSH2D $A))>;
4016 def: Pat<(v2i64 (PPCSExtVElems v4i32:$A)),
4017 (v2i64 (VEXTSW2D $A))>;
4018 def: Pat<(v4i32 (PPCSExtVElems v16i8:$A)),
4019 (v4i32 (VEXTSB2W $A))>;
4020 def: Pat<(v4i32 (PPCSExtVElems v8i16:$A)),
4021 (v4i32 (VEXTSH2W $A))>;
4022 }
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00004023}
Zaara Syedab2595b92018-08-08 15:20:43 +00004024
Kewen Lin3dac12522018-12-18 03:16:43 +00004025// Put this P9Altivec related definition here since it's possible to be
4026// selected to VSX instruction xvnegsp, avoid possible undef.
4027let Predicates = [HasP9Altivec] in {
4028
4029 def : Pat<(v4i32 (PPCvabsd v4i32:$A, v4i32:$B, (i32 0))),
4030 (v4i32 (VABSDUW $A, $B))>;
4031
4032 def : Pat<(v8i16 (PPCvabsd v8i16:$A, v8i16:$B, (i32 0))),
4033 (v8i16 (VABSDUH $A, $B))>;
4034
4035 def : Pat<(v16i8 (PPCvabsd v16i8:$A, v16i8:$B, (i32 0))),
4036 (v16i8 (VABSDUB $A, $B))>;
4037
4038 // As PPCVABSD description, the last operand indicates whether do the
4039 // sign bit flip.
4040 def : Pat<(v4i32 (PPCvabsd v4i32:$A, v4i32:$B, (i32 1))),
4041 (v4i32 (VABSDUW (XVNEGSP $A), (XVNEGSP $B)))>;
4042}