blob: bae25ad830cfa871b8ea9170973348f81c0fd3da [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]>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000070
71def PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
Sean Fertile3c8c3852017-01-26 18:59:15 +000072 [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000073def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
74 [SDNPHasChain, SDNPMayStore]>;
75def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +000076def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
77def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
78def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
Nemanja Ivanovic44513e52016-07-05 09:22:29 +000079def PPCsvec2fp : SDNode<"PPCISD::SINT_VEC_TO_FP", SDTVecConv, []>;
80def PPCuvec2fp: SDNode<"PPCISD::UINT_VEC_TO_FP", SDTVecConv, []>;
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +000081def PPCswapNoChain : SDNode<"PPCISD::SWAP_NO_CHAIN", SDT_PPCxxswapd>;
Bill Schmidtfae5d712014-12-09 16:35:51 +000082
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000083multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase,
84 string asmstr, InstrItinClass itin, Intrinsic Int,
85 ValueType OutTy, ValueType InTy> {
Hal Finkel27774d92014-03-13 07:58:58 +000086 let BaseName = asmbase in {
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000087 def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000088 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000089 [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +000090 let Defs = [CR6] in
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000091 def o : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +000092 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +000093 [(set InTy:$XT,
94 (InTy (PPCvcmp_o InTy:$XA, InTy:$XB, xo)))]>,
95 isDOT;
Hal Finkel27774d92014-03-13 07:58:58 +000096 }
97}
98
Nemanja Ivanovic11049f82016-10-04 06:59:23 +000099// Instruction form with a single input register for instructions such as
100// XXPERMDI. The reason for defining this is that specifying multiple chained
101// operands (such as loads) to an instruction will perform both chained
102// operations rather than coalescing them into a single register - even though
103// the source memory location is the same. This simply forces the instruction
104// to use the same register for both inputs.
105// For example, an output DAG such as this:
106// (XXPERMDI (LXSIBZX xoaddr:$src), (LXSIBZX xoaddr:$src ), 0))
107// would result in two load instructions emitted and used as separate inputs
108// to the XXPERMDI instruction.
109class XX3Form_2s<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
110 InstrItinClass itin, list<dag> pattern>
111 : XX3Form_2<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
112 let XB = XA;
113}
114
Eric Christopher1b8e7632014-05-22 01:07:24 +0000115def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000116def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
117def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000118def HasOnlySwappingMemOps : Predicate<"!PPCSubTarget->hasP9Vector()">;
Bill Schmidtfae5d712014-12-09 16:35:51 +0000119
Hal Finkel27774d92014-03-13 07:58:58 +0000120let Predicates = [HasVSX] in {
121let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000122let UseVSXReg = 1 in {
Craig Topperc50d64b2014-11-26 00:46:26 +0000123let hasSideEffects = 0 in { // VSX instructions don't have side effects.
Hal Finkel27774d92014-03-13 07:58:58 +0000124let Uses = [RM] in {
125
126 // Load indexed instructions
Sean Fertile3c8c3852017-01-26 18:59:15 +0000127 let mayLoad = 1, mayStore = 0 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +0000128 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000129 def LXSDX : XX1Form_memOp<31, 588,
Hal Finkel19be5062014-03-29 05:29:01 +0000130 (outs vsfrc:$XT), (ins memrr:$src),
Hal Finkel27774d92014-03-13 07:58:58 +0000131 "lxsdx $XT, $src", IIC_LdStLFD,
Lei Huangf4ec6782018-05-24 03:20:28 +0000132 []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000133
Tony Jiang438bf4a2017-11-20 14:38:30 +0000134 // Pseudo instruction XFLOADf64 will be expanded to LXSDX or LFDX later
Jinsong Jic7b43b92018-12-13 15:12:57 +0000135 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000136 def XFLOADf64 : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src),
Tony Jiang438bf4a2017-11-20 14:38:30 +0000137 "#XFLOADf64",
138 [(set f64:$XT, (load xoaddr:$src))]>;
139
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000140 let Predicates = [HasVSX, HasOnlySwappingMemOps] in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000141 def LXVD2X : XX1Form_memOp<31, 844,
Hal Finkel27774d92014-03-13 07:58:58 +0000142 (outs vsrc:$XT), (ins memrr:$src),
143 "lxvd2x $XT, $src", IIC_LdStLFD,
Bill Schmidt72954782014-11-12 04:19:40 +0000144 [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000145
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000146 def LXVDSX : XX1Form_memOp<31, 332,
Hal Finkel27774d92014-03-13 07:58:58 +0000147 (outs vsrc:$XT), (ins memrr:$src),
148 "lxvdsx $XT, $src", IIC_LdStLFD, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000149
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000150 let Predicates = [HasVSX, HasOnlySwappingMemOps] in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000151 def LXVW4X : XX1Form_memOp<31, 780,
Hal Finkel27774d92014-03-13 07:58:58 +0000152 (outs vsrc:$XT), (ins memrr:$src),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000153 "lxvw4x $XT, $src", IIC_LdStLFD,
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +0000154 []>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000155 } // mayLoad
Hal Finkel27774d92014-03-13 07:58:58 +0000156
157 // Store indexed instructions
Sean Fertile3c8c3852017-01-26 18:59:15 +0000158 let mayStore = 1, mayLoad = 0 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +0000159 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000160 def STXSDX : XX1Form_memOp<31, 716,
Hal Finkel19be5062014-03-29 05:29:01 +0000161 (outs), (ins vsfrc:$XT, memrr:$dst),
Hal Finkel27774d92014-03-13 07:58:58 +0000162 "stxsdx $XT, $dst", IIC_LdStSTFD,
Lei Huangf4ec6782018-05-24 03:20:28 +0000163 []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000164
Tony Jiang438bf4a2017-11-20 14:38:30 +0000165 // Pseudo instruction XFSTOREf64 will be expanded to STXSDX or STFDX later
Jinsong Jic7b43b92018-12-13 15:12:57 +0000166 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000167 def XFSTOREf64 : PseudoXFormMemOp<(outs), (ins vsfrc:$XT, memrr:$dst),
Tony Jiang438bf4a2017-11-20 14:38:30 +0000168 "#XFSTOREf64",
169 [(store f64:$XT, xoaddr:$dst)]>;
170
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000171 let Predicates = [HasVSX, HasOnlySwappingMemOps] in {
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +0000172 // The behaviour of this instruction is endianness-specific so we provide no
173 // pattern to match it without considering endianness.
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000174 def STXVD2X : XX1Form_memOp<31, 972,
Hal Finkel27774d92014-03-13 07:58:58 +0000175 (outs), (ins vsrc:$XT, memrr:$dst),
176 "stxvd2x $XT, $dst", IIC_LdStSTFD,
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +0000177 []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000178
Stefan Pintilie26d4f922018-03-26 17:39:18 +0000179 def STXVW4X : XX1Form_memOp<31, 908,
Hal Finkel27774d92014-03-13 07:58:58 +0000180 (outs), (ins vsrc:$XT, memrr:$dst),
Bill Schmidt2d1128a2014-10-17 15:13:38 +0000181 "stxvw4x $XT, $dst", IIC_LdStSTFD,
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +0000182 []>;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +0000183 }
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000184 } // mayStore
Hal Finkel27774d92014-03-13 07:58:58 +0000185
186 // Add/Mul Instructions
187 let isCommutable = 1 in {
188 def XSADDDP : XX3Form<60, 32,
Hal Finkel19be5062014-03-29 05:29:01 +0000189 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000190 "xsadddp $XT, $XA, $XB", IIC_VecFP,
191 [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
192 def XSMULDP : XX3Form<60, 48,
Hal Finkel19be5062014-03-29 05:29:01 +0000193 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000194 "xsmuldp $XT, $XA, $XB", IIC_VecFP,
195 [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
196
197 def XVADDDP : XX3Form<60, 96,
198 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
199 "xvadddp $XT, $XA, $XB", IIC_VecFP,
200 [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
201
202 def XVADDSP : XX3Form<60, 64,
203 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
204 "xvaddsp $XT, $XA, $XB", IIC_VecFP,
205 [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
206
207 def XVMULDP : XX3Form<60, 112,
208 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
209 "xvmuldp $XT, $XA, $XB", IIC_VecFP,
210 [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
211
212 def XVMULSP : XX3Form<60, 80,
213 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
214 "xvmulsp $XT, $XA, $XB", IIC_VecFP,
215 [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
216 }
217
218 // Subtract Instructions
219 def XSSUBDP : XX3Form<60, 40,
Hal Finkel19be5062014-03-29 05:29:01 +0000220 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000221 "xssubdp $XT, $XA, $XB", IIC_VecFP,
222 [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
223
224 def XVSUBDP : XX3Form<60, 104,
225 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
226 "xvsubdp $XT, $XA, $XB", IIC_VecFP,
227 [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
228 def XVSUBSP : XX3Form<60, 72,
229 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
230 "xvsubsp $XT, $XA, $XB", IIC_VecFP,
231 [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
232
233 // FMA Instructions
Hal Finkel25e04542014-03-25 18:55:11 +0000234 let BaseName = "XSMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000235 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000236 def XSMADDADP : XX3Form<60, 33,
Hal Finkel19be5062014-03-29 05:29:01 +0000237 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000238 "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
239 [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000240 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
241 AltVSXFMARel;
242 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000243 def XSMADDMDP : XX3Form<60, 41,
Hal Finkel19be5062014-03-29 05:29:01 +0000244 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000245 "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000246 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
247 AltVSXFMARel;
248 }
Hal Finkel27774d92014-03-13 07:58:58 +0000249
Hal Finkel25e04542014-03-25 18:55:11 +0000250 let BaseName = "XSMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000251 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000252 def XSMSUBADP : XX3Form<60, 49,
Hal Finkel19be5062014-03-29 05:29:01 +0000253 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000254 "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
255 [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000256 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
257 AltVSXFMARel;
258 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000259 def XSMSUBMDP : XX3Form<60, 57,
Hal Finkel19be5062014-03-29 05:29:01 +0000260 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000261 "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000262 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
263 AltVSXFMARel;
264 }
Hal Finkel27774d92014-03-13 07:58:58 +0000265
Hal Finkel25e04542014-03-25 18:55:11 +0000266 let BaseName = "XSNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000267 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000268 def XSNMADDADP : XX3Form<60, 161,
Hal Finkel19be5062014-03-29 05:29:01 +0000269 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000270 "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
271 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000272 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
273 AltVSXFMARel;
274 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000275 def XSNMADDMDP : XX3Form<60, 169,
Hal Finkel19be5062014-03-29 05:29:01 +0000276 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000277 "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000278 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
279 AltVSXFMARel;
280 }
Hal Finkel27774d92014-03-13 07:58:58 +0000281
Hal Finkel25e04542014-03-25 18:55:11 +0000282 let BaseName = "XSNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000283 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000284 def XSNMSUBADP : XX3Form<60, 177,
Hal Finkel19be5062014-03-29 05:29:01 +0000285 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000286 "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
287 [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000288 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
289 AltVSXFMARel;
290 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000291 def XSNMSUBMDP : XX3Form<60, 185,
Hal Finkel19be5062014-03-29 05:29:01 +0000292 (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000293 "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000294 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
295 AltVSXFMARel;
296 }
Hal Finkel27774d92014-03-13 07:58:58 +0000297
Hal Finkel25e04542014-03-25 18:55:11 +0000298 let BaseName = "XVMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000299 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000300 def XVMADDADP : XX3Form<60, 97,
301 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
302 "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
303 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000304 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
305 AltVSXFMARel;
306 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000307 def XVMADDMDP : XX3Form<60, 105,
308 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
309 "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000310 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
311 AltVSXFMARel;
312 }
Hal Finkel27774d92014-03-13 07:58:58 +0000313
Hal Finkel25e04542014-03-25 18:55:11 +0000314 let BaseName = "XVMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000315 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000316 def XVMADDASP : XX3Form<60, 65,
317 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
318 "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
319 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000320 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
321 AltVSXFMARel;
322 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000323 def XVMADDMSP : XX3Form<60, 73,
324 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
325 "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000326 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
327 AltVSXFMARel;
328 }
Hal Finkel27774d92014-03-13 07:58:58 +0000329
Hal Finkel25e04542014-03-25 18:55:11 +0000330 let BaseName = "XVMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000331 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000332 def XVMSUBADP : XX3Form<60, 113,
333 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
334 "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
335 [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000336 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
337 AltVSXFMARel;
338 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000339 def XVMSUBMDP : XX3Form<60, 121,
340 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
341 "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000342 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
343 AltVSXFMARel;
344 }
Hal Finkel27774d92014-03-13 07:58:58 +0000345
Hal Finkel25e04542014-03-25 18:55:11 +0000346 let BaseName = "XVMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000347 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000348 def XVMSUBASP : XX3Form<60, 81,
349 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
350 "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
351 [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000352 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
353 AltVSXFMARel;
354 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000355 def XVMSUBMSP : XX3Form<60, 89,
356 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
357 "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000358 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
359 AltVSXFMARel;
360 }
Hal Finkel27774d92014-03-13 07:58:58 +0000361
Hal Finkel25e04542014-03-25 18:55:11 +0000362 let BaseName = "XVNMADDADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000363 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000364 def XVNMADDADP : XX3Form<60, 225,
365 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
366 "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
367 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000368 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
369 AltVSXFMARel;
370 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000371 def XVNMADDMDP : XX3Form<60, 233,
372 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
373 "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000374 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
375 AltVSXFMARel;
376 }
Hal Finkel27774d92014-03-13 07:58:58 +0000377
Hal Finkel25e04542014-03-25 18:55:11 +0000378 let BaseName = "XVNMADDASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000379 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000380 def XVNMADDASP : XX3Form<60, 193,
381 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
382 "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
383 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000384 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
385 AltVSXFMARel;
386 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000387 def XVNMADDMSP : XX3Form<60, 201,
388 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
389 "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000390 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
391 AltVSXFMARel;
392 }
Hal Finkel27774d92014-03-13 07:58:58 +0000393
Hal Finkel25e04542014-03-25 18:55:11 +0000394 let BaseName = "XVNMSUBADP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000395 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000396 def XVNMSUBADP : XX3Form<60, 241,
397 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
398 "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
399 [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000400 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
401 AltVSXFMARel;
402 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000403 def XVNMSUBMDP : XX3Form<60, 249,
404 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
405 "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000406 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
407 AltVSXFMARel;
408 }
Hal Finkel27774d92014-03-13 07:58:58 +0000409
Hal Finkel25e04542014-03-25 18:55:11 +0000410 let BaseName = "XVNMSUBASP" in {
Hal Finkele01d3212014-03-24 15:07:28 +0000411 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000412 def XVNMSUBASP : XX3Form<60, 209,
413 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
414 "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
415 [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
Hal Finkel25e04542014-03-25 18:55:11 +0000416 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
417 AltVSXFMARel;
418 let IsVSXFMAAlt = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000419 def XVNMSUBMSP : XX3Form<60, 217,
420 (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
421 "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
Hal Finkel25e04542014-03-25 18:55:11 +0000422 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
423 AltVSXFMARel;
424 }
Hal Finkel27774d92014-03-13 07:58:58 +0000425
426 // Division Instructions
427 def XSDIVDP : XX3Form<60, 56,
Hal Finkel19be5062014-03-29 05:29:01 +0000428 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000429 "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000430 [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
431 def XSSQRTDP : XX2Form<60, 75,
Hal Finkel19be5062014-03-29 05:29:01 +0000432 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000433 "xssqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000434 [(set f64:$XT, (fsqrt f64:$XB))]>;
435
436 def XSREDP : XX2Form<60, 90,
Hal Finkel19be5062014-03-29 05:29:01 +0000437 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000438 "xsredp $XT, $XB", IIC_VecFP,
439 [(set f64:$XT, (PPCfre f64:$XB))]>;
440 def XSRSQRTEDP : XX2Form<60, 74,
Hal Finkel19be5062014-03-29 05:29:01 +0000441 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000442 "xsrsqrtedp $XT, $XB", IIC_VecFP,
443 [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
444
445 def XSTDIVDP : XX3Form_1<60, 61,
Hal Finkel19be5062014-03-29 05:29:01 +0000446 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000447 "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000448 def XSTSQRTDP : XX2Form_1<60, 106,
Hal Finkel19be5062014-03-29 05:29:01 +0000449 (outs crrc:$crD), (ins vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000450 "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000451
452 def XVDIVDP : XX3Form<60, 120,
453 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000454 "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
Hal Finkel27774d92014-03-13 07:58:58 +0000455 [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
456 def XVDIVSP : XX3Form<60, 88,
457 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000458 "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
Hal Finkel27774d92014-03-13 07:58:58 +0000459 [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
460
461 def XVSQRTDP : XX2Form<60, 203,
462 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000463 "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
Hal Finkel27774d92014-03-13 07:58:58 +0000464 [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
465 def XVSQRTSP : XX2Form<60, 139,
466 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000467 "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
Hal Finkel27774d92014-03-13 07:58:58 +0000468 [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
469
470 def XVTDIVDP : XX3Form_1<60, 125,
471 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000472 "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000473 def XVTDIVSP : XX3Form_1<60, 93,
474 (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000475 "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000476
477 def XVTSQRTDP : XX2Form_1<60, 234,
478 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000479 "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000480 def XVTSQRTSP : XX2Form_1<60, 170,
481 (outs crrc:$crD), (ins vsrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000482 "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000483
484 def XVREDP : XX2Form<60, 218,
485 (outs vsrc:$XT), (ins vsrc:$XB),
486 "xvredp $XT, $XB", IIC_VecFP,
487 [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
488 def XVRESP : XX2Form<60, 154,
489 (outs vsrc:$XT), (ins vsrc:$XB),
490 "xvresp $XT, $XB", IIC_VecFP,
491 [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
492
493 def XVRSQRTEDP : XX2Form<60, 202,
494 (outs vsrc:$XT), (ins vsrc:$XB),
495 "xvrsqrtedp $XT, $XB", IIC_VecFP,
496 [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
497 def XVRSQRTESP : XX2Form<60, 138,
498 (outs vsrc:$XT), (ins vsrc:$XB),
499 "xvrsqrtesp $XT, $XB", IIC_VecFP,
500 [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
501
502 // Compare Instructions
503 def XSCMPODP : XX3Form_1<60, 43,
Hal Finkel19be5062014-03-29 05:29:01 +0000504 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000505 "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000506 def XSCMPUDP : XX3Form_1<60, 35,
Hal Finkel19be5062014-03-29 05:29:01 +0000507 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkele8fba982014-03-29 13:20:31 +0000508 "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000509
510 defm XVCMPEQDP : XX3Form_Rcr<60, 99,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000511 "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000512 int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000513 defm XVCMPEQSP : XX3Form_Rcr<60, 67,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000514 "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000515 int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000516 defm XVCMPGEDP : XX3Form_Rcr<60, 115,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000517 "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000518 int_ppc_vsx_xvcmpgedp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000519 defm XVCMPGESP : XX3Form_Rcr<60, 83,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000520 "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000521 int_ppc_vsx_xvcmpgesp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000522 defm XVCMPGTDP : XX3Form_Rcr<60, 107,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000523 "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000524 int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>;
Hal Finkel27774d92014-03-13 07:58:58 +0000525 defm XVCMPGTSP : XX3Form_Rcr<60, 75,
Nemanja Ivanovicf502a422015-06-26 19:26:53 +0000526 "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare,
Nemanja Ivanovic2c84b292015-09-29 17:41:53 +0000527 int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>;
Hal Finkel27774d92014-03-13 07:58:58 +0000528
529 // Move Instructions
530 def XSABSDP : XX2Form<60, 345,
Hal Finkel19be5062014-03-29 05:29:01 +0000531 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000532 "xsabsdp $XT, $XB", IIC_VecFP,
533 [(set f64:$XT, (fabs f64:$XB))]>;
534 def XSNABSDP : XX2Form<60, 361,
Hal Finkel19be5062014-03-29 05:29:01 +0000535 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000536 "xsnabsdp $XT, $XB", IIC_VecFP,
537 [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
538 def XSNEGDP : XX2Form<60, 377,
Hal Finkel19be5062014-03-29 05:29:01 +0000539 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000540 "xsnegdp $XT, $XB", IIC_VecFP,
541 [(set f64:$XT, (fneg f64:$XB))]>;
542 def XSCPSGNDP : XX3Form<60, 176,
Hal Finkel19be5062014-03-29 05:29:01 +0000543 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000544 "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
545 [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
546
547 def XVABSDP : XX2Form<60, 473,
548 (outs vsrc:$XT), (ins vsrc:$XB),
549 "xvabsdp $XT, $XB", IIC_VecFP,
550 [(set v2f64:$XT, (fabs v2f64:$XB))]>;
551
552 def XVABSSP : XX2Form<60, 409,
553 (outs vsrc:$XT), (ins vsrc:$XB),
554 "xvabssp $XT, $XB", IIC_VecFP,
555 [(set v4f32:$XT, (fabs v4f32:$XB))]>;
556
557 def XVCPSGNDP : XX3Form<60, 240,
558 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
559 "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
560 [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
561 def XVCPSGNSP : XX3Form<60, 208,
562 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
563 "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
564 [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
565
566 def XVNABSDP : XX2Form<60, 489,
567 (outs vsrc:$XT), (ins vsrc:$XB),
568 "xvnabsdp $XT, $XB", IIC_VecFP,
569 [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
570 def XVNABSSP : XX2Form<60, 425,
571 (outs vsrc:$XT), (ins vsrc:$XB),
572 "xvnabssp $XT, $XB", IIC_VecFP,
573 [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
574
575 def XVNEGDP : XX2Form<60, 505,
576 (outs vsrc:$XT), (ins vsrc:$XB),
577 "xvnegdp $XT, $XB", IIC_VecFP,
578 [(set v2f64:$XT, (fneg v2f64:$XB))]>;
579 def XVNEGSP : XX2Form<60, 441,
580 (outs vsrc:$XT), (ins vsrc:$XB),
581 "xvnegsp $XT, $XB", IIC_VecFP,
582 [(set v4f32:$XT, (fneg v4f32:$XB))]>;
583
584 // Conversion Instructions
585 def XSCVDPSP : XX2Form<60, 265,
Hal Finkel19be5062014-03-29 05:29:01 +0000586 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000587 "xscvdpsp $XT, $XB", IIC_VecFP, []>;
588 def XSCVDPSXDS : XX2Form<60, 344,
Hal Finkel19be5062014-03-29 05:29:01 +0000589 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000590 "xscvdpsxds $XT, $XB", IIC_VecFP,
591 [(set f64:$XT, (PPCfctidz f64:$XB))]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000592 let isCodeGenOnly = 1 in
593 def XSCVDPSXDSs : XX2Form<60, 344,
594 (outs vssrc:$XT), (ins vssrc:$XB),
595 "xscvdpsxds $XT, $XB", IIC_VecFP,
596 [(set f32:$XT, (PPCfctidz f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000597 def XSCVDPSXWS : XX2Form<60, 88,
Hal Finkel19be5062014-03-29 05:29:01 +0000598 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000599 "xscvdpsxws $XT, $XB", IIC_VecFP,
600 [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000601 let isCodeGenOnly = 1 in
602 def XSCVDPSXWSs : XX2Form<60, 88,
603 (outs vssrc:$XT), (ins vssrc:$XB),
604 "xscvdpsxws $XT, $XB", IIC_VecFP,
605 [(set f32:$XT, (PPCfctiwz f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000606 def XSCVDPUXDS : XX2Form<60, 328,
Hal Finkel19be5062014-03-29 05:29:01 +0000607 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000608 "xscvdpuxds $XT, $XB", IIC_VecFP,
609 [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000610 let isCodeGenOnly = 1 in
611 def XSCVDPUXDSs : XX2Form<60, 328,
612 (outs vssrc:$XT), (ins vssrc:$XB),
613 "xscvdpuxds $XT, $XB", IIC_VecFP,
614 [(set f32:$XT, (PPCfctiduz f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000615 def XSCVDPUXWS : XX2Form<60, 72,
Hal Finkel19be5062014-03-29 05:29:01 +0000616 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000617 "xscvdpuxws $XT, $XB", IIC_VecFP,
618 [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000619 let isCodeGenOnly = 1 in
620 def XSCVDPUXWSs : XX2Form<60, 72,
621 (outs vssrc:$XT), (ins vssrc:$XB),
622 "xscvdpuxws $XT, $XB", IIC_VecFP,
623 [(set f32:$XT, (PPCfctiwuz f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000624 def XSCVSPDP : XX2Form<60, 329,
Hal Finkel19be5062014-03-29 05:29:01 +0000625 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000626 "xscvspdp $XT, $XB", IIC_VecFP, []>;
627 def XSCVSXDDP : XX2Form<60, 376,
Hal Finkel19be5062014-03-29 05:29:01 +0000628 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000629 "xscvsxddp $XT, $XB", IIC_VecFP,
630 [(set f64:$XT, (PPCfcfid f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000631 def XSCVUXDDP : XX2Form<60, 360,
Hal Finkel19be5062014-03-29 05:29:01 +0000632 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel4a912252014-03-23 05:35:00 +0000633 "xscvuxddp $XT, $XB", IIC_VecFP,
634 [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000635
636 def XVCVDPSP : XX2Form<60, 393,
637 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000638 "xvcvdpsp $XT, $XB", IIC_VecFP,
639 [(set v4f32:$XT, (int_ppc_vsx_xvcvdpsp v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000640 def XVCVDPSXDS : XX2Form<60, 472,
641 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000642 "xvcvdpsxds $XT, $XB", IIC_VecFP,
643 [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000644 def XVCVDPSXWS : XX2Form<60, 216,
645 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000646 "xvcvdpsxws $XT, $XB", IIC_VecFP,
647 [(set v4i32:$XT, (int_ppc_vsx_xvcvdpsxws v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000648 def XVCVDPUXDS : XX2Form<60, 456,
649 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000650 "xvcvdpuxds $XT, $XB", IIC_VecFP,
651 [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000652 def XVCVDPUXWS : XX2Form<60, 200,
653 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000654 "xvcvdpuxws $XT, $XB", IIC_VecFP,
655 [(set v4i32:$XT, (int_ppc_vsx_xvcvdpuxws v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000656
657 def XVCVSPDP : XX2Form<60, 457,
658 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000659 "xvcvspdp $XT, $XB", IIC_VecFP,
660 [(set v2f64:$XT, (int_ppc_vsx_xvcvspdp v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000661 def XVCVSPSXDS : XX2Form<60, 408,
662 (outs vsrc:$XT), (ins vsrc:$XB),
663 "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
664 def XVCVSPSXWS : XX2Form<60, 152,
665 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000666 "xvcvspsxws $XT, $XB", IIC_VecFP,
667 [(set v4i32:$XT, (fp_to_sint v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000668 def XVCVSPUXDS : XX2Form<60, 392,
669 (outs vsrc:$XT), (ins vsrc:$XB),
670 "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
671 def XVCVSPUXWS : XX2Form<60, 136,
672 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000673 "xvcvspuxws $XT, $XB", IIC_VecFP,
674 [(set v4i32:$XT, (fp_to_uint v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000675 def XVCVSXDDP : XX2Form<60, 504,
676 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000677 "xvcvsxddp $XT, $XB", IIC_VecFP,
678 [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000679 def XVCVSXDSP : XX2Form<60, 440,
680 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000681 "xvcvsxdsp $XT, $XB", IIC_VecFP,
682 [(set v4f32:$XT, (int_ppc_vsx_xvcvsxdsp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000683 def XVCVSXWDP : XX2Form<60, 248,
684 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000685 "xvcvsxwdp $XT, $XB", IIC_VecFP,
686 [(set v2f64:$XT, (int_ppc_vsx_xvcvsxwdp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000687 def XVCVSXWSP : XX2Form<60, 184,
688 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic44513e52016-07-05 09:22:29 +0000689 "xvcvsxwsp $XT, $XB", IIC_VecFP,
690 [(set v4f32:$XT, (sint_to_fp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000691 def XVCVUXDDP : XX2Form<60, 488,
692 (outs vsrc:$XT), (ins vsrc:$XB),
Hal Finkel7279f4b2014-03-26 19:13:54 +0000693 "xvcvuxddp $XT, $XB", IIC_VecFP,
694 [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000695 def XVCVUXDSP : XX2Form<60, 424,
696 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000697 "xvcvuxdsp $XT, $XB", IIC_VecFP,
698 [(set v4f32:$XT, (int_ppc_vsx_xvcvuxdsp v2i64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000699 def XVCVUXWDP : XX2Form<60, 232,
700 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovic2efc3cb2016-11-11 14:41:19 +0000701 "xvcvuxwdp $XT, $XB", IIC_VecFP,
702 [(set v2f64:$XT, (int_ppc_vsx_xvcvuxwdp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000703 def XVCVUXWSP : XX2Form<60, 168,
704 (outs vsrc:$XT), (ins vsrc:$XB),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000705 "xvcvuxwsp $XT, $XB", IIC_VecFP,
706 [(set v4f32:$XT, (uint_to_fp v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000707
708 // Rounding Instructions
709 def XSRDPI : XX2Form<60, 73,
Hal Finkel19be5062014-03-29 05:29:01 +0000710 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000711 "xsrdpi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000712 [(set f64:$XT, (fround f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000713 def XSRDPIC : XX2Form<60, 107,
Hal Finkel19be5062014-03-29 05:29:01 +0000714 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000715 "xsrdpic $XT, $XB", IIC_VecFP,
716 [(set f64:$XT, (fnearbyint f64:$XB))]>;
717 def XSRDPIM : XX2Form<60, 121,
Hal Finkel19be5062014-03-29 05:29:01 +0000718 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000719 "xsrdpim $XT, $XB", IIC_VecFP,
720 [(set f64:$XT, (ffloor f64:$XB))]>;
721 def XSRDPIP : XX2Form<60, 105,
Hal Finkel19be5062014-03-29 05:29:01 +0000722 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000723 "xsrdpip $XT, $XB", IIC_VecFP,
724 [(set f64:$XT, (fceil f64:$XB))]>;
725 def XSRDPIZ : XX2Form<60, 89,
Hal Finkel19be5062014-03-29 05:29:01 +0000726 (outs vsfrc:$XT), (ins vsfrc:$XB),
Hal Finkel27774d92014-03-13 07:58:58 +0000727 "xsrdpiz $XT, $XB", IIC_VecFP,
728 [(set f64:$XT, (ftrunc f64:$XB))]>;
729
730 def XVRDPI : XX2Form<60, 201,
731 (outs vsrc:$XT), (ins vsrc:$XB),
732 "xvrdpi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000733 [(set v2f64:$XT, (fround v2f64:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000734 def XVRDPIC : XX2Form<60, 235,
735 (outs vsrc:$XT), (ins vsrc:$XB),
736 "xvrdpic $XT, $XB", IIC_VecFP,
737 [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
738 def XVRDPIM : XX2Form<60, 249,
739 (outs vsrc:$XT), (ins vsrc:$XB),
740 "xvrdpim $XT, $XB", IIC_VecFP,
741 [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
742 def XVRDPIP : XX2Form<60, 233,
743 (outs vsrc:$XT), (ins vsrc:$XB),
744 "xvrdpip $XT, $XB", IIC_VecFP,
745 [(set v2f64:$XT, (fceil v2f64:$XB))]>;
746 def XVRDPIZ : XX2Form<60, 217,
747 (outs vsrc:$XT), (ins vsrc:$XB),
748 "xvrdpiz $XT, $XB", IIC_VecFP,
749 [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
750
751 def XVRSPI : XX2Form<60, 137,
752 (outs vsrc:$XT), (ins vsrc:$XB),
753 "xvrspi $XT, $XB", IIC_VecFP,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +0000754 [(set v4f32:$XT, (fround v4f32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000755 def XVRSPIC : XX2Form<60, 171,
756 (outs vsrc:$XT), (ins vsrc:$XB),
757 "xvrspic $XT, $XB", IIC_VecFP,
758 [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
759 def XVRSPIM : XX2Form<60, 185,
760 (outs vsrc:$XT), (ins vsrc:$XB),
761 "xvrspim $XT, $XB", IIC_VecFP,
762 [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
763 def XVRSPIP : XX2Form<60, 169,
764 (outs vsrc:$XT), (ins vsrc:$XB),
765 "xvrspip $XT, $XB", IIC_VecFP,
766 [(set v4f32:$XT, (fceil v4f32:$XB))]>;
767 def XVRSPIZ : XX2Form<60, 153,
768 (outs vsrc:$XT), (ins vsrc:$XB),
769 "xvrspiz $XT, $XB", IIC_VecFP,
770 [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
771
772 // Max/Min Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000773 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000774 def XSMAXDP : XX3Form<60, 160,
Hal Finkel19be5062014-03-29 05:29:01 +0000775 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000776 "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
777 [(set vsfrc:$XT,
778 (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000779 def XSMINDP : XX3Form<60, 168,
Hal Finkel19be5062014-03-29 05:29:01 +0000780 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000781 "xsmindp $XT, $XA, $XB", IIC_VecFP,
782 [(set vsfrc:$XT,
783 (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000784
785 def XVMAXDP : XX3Form<60, 224,
786 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000787 "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
788 [(set vsrc:$XT,
789 (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000790 def XVMINDP : XX3Form<60, 232,
791 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000792 "xvmindp $XT, $XA, $XB", IIC_VecFP,
793 [(set vsrc:$XT,
794 (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000795
796 def XVMAXSP : XX3Form<60, 192,
797 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000798 "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
799 [(set vsrc:$XT,
800 (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000801 def XVMINSP : XX3Form<60, 200,
802 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Bill Schmidt1ca69fa2014-10-31 19:19:07 +0000803 "xvminsp $XT, $XA, $XB", IIC_VecFP,
804 [(set vsrc:$XT,
805 (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000806 } // isCommutable
Hal Finkel27774d92014-03-13 07:58:58 +0000807} // Uses = [RM]
808
809 // Logical Instructions
Hal Finkele01d3212014-03-24 15:07:28 +0000810 let isCommutable = 1 in
Hal Finkel27774d92014-03-13 07:58:58 +0000811 def XXLAND : XX3Form<60, 130,
812 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000813 "xxland $XT, $XA, $XB", IIC_VecGeneral,
814 [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000815 def XXLANDC : XX3Form<60, 138,
816 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000817 "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
818 [(set v4i32:$XT, (and v4i32:$XA,
819 (vnot_ppc v4i32:$XB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000820 let isCommutable = 1 in {
Hal Finkel27774d92014-03-13 07:58:58 +0000821 def XXLNOR : XX3Form<60, 162,
822 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000823 "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
824 [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
825 v4i32:$XB)))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000826 def XXLOR : XX3Form<60, 146,
827 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000828 "xxlor $XT, $XA, $XB", IIC_VecGeneral,
829 [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
Hal Finkel19be5062014-03-29 05:29:01 +0000830 let isCodeGenOnly = 1 in
831 def XXLORf: XX3Form<60, 146,
832 (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
833 "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000834 def XXLXOR : XX3Form<60, 154,
835 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
Hal Finkelbd4de9d2014-03-26 04:55:40 +0000836 "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
837 [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +0000838 } // isCommutable
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +0000839 let isCodeGenOnly = 1 in
840 def XXLXORz : XX3Form_Zero<60, 154, (outs vsrc:$XT), (ins),
841 "xxlxor $XT, $XT, $XT", IIC_VecGeneral,
842 [(set v4i32:$XT, (v4i32 immAllZerosV))]>;
Hal Finkel27774d92014-03-13 07:58:58 +0000843
Ehsan Amiric90b02c2016-10-24 17:31:09 +0000844 let isCodeGenOnly = 1 in {
845 def XXLXORdpz : XX3Form_SetZero<60, 154,
846 (outs vsfrc:$XT), (ins),
847 "xxlxor $XT, $XT, $XT", IIC_VecGeneral,
848 [(set f64:$XT, (fpimm0))]>;
849 def XXLXORspz : XX3Form_SetZero<60, 154,
850 (outs vssrc:$XT), (ins),
851 "xxlxor $XT, $XT, $XT", IIC_VecGeneral,
852 [(set f32:$XT, (fpimm0))]>;
853 }
854
Hal Finkel27774d92014-03-13 07:58:58 +0000855 // Permutation Instructions
856 def XXMRGHW : XX3Form<60, 18,
857 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
858 "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
859 def XXMRGLW : XX3Form<60, 50,
860 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
861 "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
862
863 def XXPERMDI : XX3Form_2<60, 10,
864 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
Tony Jiang60c247d2017-05-31 13:09:57 +0000865 "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm,
866 [(set v2i64:$XT, (PPCxxpermdi v2i64:$XA, v2i64:$XB,
867 imm32SExt16:$DM))]>;
Nemanja Ivanovic15748f42016-12-06 11:47:14 +0000868 let isCodeGenOnly = 1 in
869 def XXPERMDIs : XX3Form_2s<60, 10, (outs vsrc:$XT), (ins vsfrc:$XA, u2imm:$DM),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000870 "xxpermdi $XT, $XA, $XA, $DM", IIC_VecPerm, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000871 def XXSEL : XX4Form<60, 3,
872 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
Nemanja Ivanovic5d06f172018-08-27 13:20:42 +0000873 "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
Hal Finkel27774d92014-03-13 07:58:58 +0000874
875 def XXSLDWI : XX3Form_2<60, 2,
876 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +0000877 "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm,
878 [(set v4i32:$XT, (PPCvecshl v4i32:$XA, v4i32:$XB,
879 imm32SExt16:$SHW))]>;
Zaara Syedab2595b92018-08-08 15:20:43 +0000880
881 let isCodeGenOnly = 1 in
882 def XXSLDWIs : XX3Form_2s<60, 2,
883 (outs vsrc:$XT), (ins vsfrc:$XA, u2imm:$SHW),
884 "xxsldwi $XT, $XA, $XA, $SHW", IIC_VecPerm, []>;
885
Hal Finkel27774d92014-03-13 07:58:58 +0000886 def XXSPLTW : XX2Form_2<60, 164,
887 (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
Nemanja Ivanovic1a2b2f02016-05-04 16:04:02 +0000888 "xxspltw $XT, $XB, $UIM", IIC_VecPerm,
889 [(set v4i32:$XT,
890 (PPCxxsplt v4i32:$XB, imm32SExt16:$UIM))]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000891 let isCodeGenOnly = 1 in
892 def XXSPLTWs : XX2Form_2<60, 164,
893 (outs vsrc:$XT), (ins vfrc:$XB, u2imm:$UIM),
894 "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
Zaara Syedab2595b92018-08-08 15:20:43 +0000895
Craig Topperc50d64b2014-11-26 00:46:26 +0000896} // hasSideEffects
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000897} // UseVSXReg = 1
Hal Finkel27774d92014-03-13 07:58:58 +0000898
Bill Schmidt61e65232014-10-22 13:13:40 +0000899// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
900// instruction selection into a branch sequence.
Jinsong Jic7b43b92018-12-13 15:12:57 +0000901let PPC970_Single = 1 in {
Bill Schmidt61e65232014-10-22 13:13:40 +0000902
Jinsong Jic7b43b92018-12-13 15:12:57 +0000903 def SELECT_CC_VSRC: PPCCustomInserterPseudo<(outs vsrc:$dst),
Bill Schmidt61e65232014-10-22 13:13:40 +0000904 (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
905 "#SELECT_CC_VSRC",
906 []>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000907 def SELECT_VSRC: PPCCustomInserterPseudo<(outs vsrc:$dst),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000908 (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
909 "#SELECT_VSRC",
Bill Schmidt61e65232014-10-22 13:13:40 +0000910 [(set v2f64:$dst,
911 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000912 def SELECT_CC_VSFRC: PPCCustomInserterPseudo<(outs f8rc:$dst),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000913 (ins crrc:$cond, f8rc:$T, f8rc:$F,
914 i32imm:$BROPC), "#SELECT_CC_VSFRC",
915 []>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000916 def SELECT_VSFRC: PPCCustomInserterPseudo<(outs f8rc:$dst),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000917 (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
918 "#SELECT_VSFRC",
919 [(set f64:$dst,
920 (select i1:$cond, f64:$T, f64:$F))]>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000921 def SELECT_CC_VSSRC: PPCCustomInserterPseudo<(outs f4rc:$dst),
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000922 (ins crrc:$cond, f4rc:$T, f4rc:$F,
923 i32imm:$BROPC), "#SELECT_CC_VSSRC",
924 []>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000925 def SELECT_VSSRC: PPCCustomInserterPseudo<(outs f4rc:$dst),
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +0000926 (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
927 "#SELECT_VSSRC",
928 [(set f32:$dst,
929 (select i1:$cond, f32:$T, f32:$F))]>;
Jinsong Jic7b43b92018-12-13 15:12:57 +0000930}
Bill Schmidt9c54bbd2014-10-22 16:58:20 +0000931} // AddedComplexity
Bill Schmidt61e65232014-10-22 13:13:40 +0000932
Hal Finkel27774d92014-03-13 07:58:58 +0000933def : InstAlias<"xvmovdp $XT, $XB",
934 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
935def : InstAlias<"xvmovsp $XT, $XB",
936 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
937
938def : InstAlias<"xxspltd $XT, $XB, 0",
939 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
940def : InstAlias<"xxspltd $XT, $XB, 1",
941 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
942def : InstAlias<"xxmrghd $XT, $XA, $XB",
943 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
944def : InstAlias<"xxmrgld $XT, $XA, $XB",
945 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
946def : InstAlias<"xxswapd $XT, $XB",
947 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
Nemanja Ivanovic15748f42016-12-06 11:47:14 +0000948def : InstAlias<"xxspltd $XT, $XB, 0",
949 (XXPERMDIs vsrc:$XT, vsfrc:$XB, 0)>;
950def : InstAlias<"xxspltd $XT, $XB, 1",
951 (XXPERMDIs vsrc:$XT, vsfrc:$XB, 3)>;
952def : InstAlias<"xxswapd $XT, $XB",
953 (XXPERMDIs vsrc:$XT, vsfrc:$XB, 2)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000954
955let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000956
Nemanja Ivanovic6f22b412016-09-27 08:42:12 +0000957def : Pat<(v4i32 (vnot_ppc v4i32:$A)),
958 (v4i32 (XXLNOR $A, $A))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000959let Predicates = [IsBigEndian] in {
Hal Finkel27774d92014-03-13 07:58:58 +0000960def : Pat<(v2f64 (scalar_to_vector f64:$A)),
Hal Finkel19be5062014-03-29 05:29:01 +0000961 (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
Hal Finkel27774d92014-03-13 07:58:58 +0000962
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000963def : Pat<(f64 (extractelt v2f64:$S, 0)),
Hal Finkel19be5062014-03-29 05:29:01 +0000964 (f64 (EXTRACT_SUBREG $S, sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000965def : Pat<(f64 (extractelt v2f64:$S, 1)),
Hal Finkel19be5062014-03-29 05:29:01 +0000966 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000967}
968
969let Predicates = [IsLittleEndian] in {
970def : Pat<(v2f64 (scalar_to_vector f64:$A)),
971 (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
972 (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
973
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000974def : Pat<(f64 (extractelt v2f64:$S, 0)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000975 (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
Matt Arsenaultfbd9bbf2015-12-11 19:20:16 +0000976def : Pat<(f64 (extractelt v2f64:$S, 1)),
Bill Schmidt10f6eb92014-12-09 16:43:32 +0000977 (f64 (EXTRACT_SUBREG $S, sub_64))>;
978}
Hal Finkel27774d92014-03-13 07:58:58 +0000979
980// Additional fnmsub patterns: -a*c + b == -(a*c - b)
981def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
982 (XSNMSUBADP $B, $C, $A)>;
983def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
984 (XSNMSUBADP $B, $C, $A)>;
985
986def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
987 (XVNMSUBADP $B, $C, $A)>;
988def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
989 (XVNMSUBADP $B, $C, $A)>;
990
991def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
992 (XVNMSUBASP $B, $C, $A)>;
993def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
994 (XVNMSUBASP $B, $C, $A)>;
995
Hal Finkel9e0baa62014-04-01 19:24:27 +0000996def : Pat<(v2f64 (bitconvert v4f32:$A)),
997 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +0000998def : Pat<(v2f64 (bitconvert v4i32:$A)),
999 (COPY_TO_REGCLASS $A, VSRC)>;
1000def : Pat<(v2f64 (bitconvert v8i16:$A)),
1001 (COPY_TO_REGCLASS $A, VSRC)>;
1002def : Pat<(v2f64 (bitconvert v16i8:$A)),
1003 (COPY_TO_REGCLASS $A, VSRC)>;
1004
Hal Finkel9e0baa62014-04-01 19:24:27 +00001005def : Pat<(v4f32 (bitconvert v2f64:$A)),
1006 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkel27774d92014-03-13 07:58:58 +00001007def : Pat<(v4i32 (bitconvert v2f64:$A)),
1008 (COPY_TO_REGCLASS $A, VRRC)>;
1009def : Pat<(v8i16 (bitconvert v2f64:$A)),
1010 (COPY_TO_REGCLASS $A, VRRC)>;
1011def : Pat<(v16i8 (bitconvert v2f64:$A)),
1012 (COPY_TO_REGCLASS $A, VRRC)>;
1013
Hal Finkel9e0baa62014-04-01 19:24:27 +00001014def : Pat<(v2i64 (bitconvert v4f32:$A)),
1015 (COPY_TO_REGCLASS $A, VSRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +00001016def : Pat<(v2i64 (bitconvert v4i32:$A)),
1017 (COPY_TO_REGCLASS $A, VSRC)>;
1018def : Pat<(v2i64 (bitconvert v8i16:$A)),
1019 (COPY_TO_REGCLASS $A, VSRC)>;
1020def : Pat<(v2i64 (bitconvert v16i8:$A)),
1021 (COPY_TO_REGCLASS $A, VSRC)>;
1022
Hal Finkel9e0baa62014-04-01 19:24:27 +00001023def : Pat<(v4f32 (bitconvert v2i64:$A)),
1024 (COPY_TO_REGCLASS $A, VRRC)>;
Hal Finkela6c8b512014-03-26 16:12:58 +00001025def : Pat<(v4i32 (bitconvert v2i64:$A)),
1026 (COPY_TO_REGCLASS $A, VRRC)>;
1027def : Pat<(v8i16 (bitconvert v2i64:$A)),
1028 (COPY_TO_REGCLASS $A, VRRC)>;
1029def : Pat<(v16i8 (bitconvert v2i64:$A)),
1030 (COPY_TO_REGCLASS $A, VRRC)>;
1031
Hal Finkel9281c9a2014-03-26 18:26:30 +00001032def : Pat<(v2f64 (bitconvert v2i64:$A)),
1033 (COPY_TO_REGCLASS $A, VRRC)>;
1034def : Pat<(v2i64 (bitconvert v2f64:$A)),
1035 (COPY_TO_REGCLASS $A, VRRC)>;
1036
Kit Bartond4eb73c2015-05-05 16:10:44 +00001037def : Pat<(v2f64 (bitconvert v1i128:$A)),
1038 (COPY_TO_REGCLASS $A, VRRC)>;
1039def : Pat<(v1i128 (bitconvert v2f64:$A)),
1040 (COPY_TO_REGCLASS $A, VRRC)>;
1041
Stefan Pintilie927e8bf2018-10-23 17:11:36 +00001042def : Pat<(v2i64 (bitconvert f128:$A)),
1043 (COPY_TO_REGCLASS $A, VRRC)>;
1044def : Pat<(v4i32 (bitconvert f128:$A)),
1045 (COPY_TO_REGCLASS $A, VRRC)>;
1046def : Pat<(v8i16 (bitconvert f128:$A)),
1047 (COPY_TO_REGCLASS $A, VRRC)>;
1048def : Pat<(v16i8 (bitconvert f128:$A)),
1049 (COPY_TO_REGCLASS $A, VRRC)>;
1050
Nemanja Ivanovic44513e52016-07-05 09:22:29 +00001051def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 0)),
1052 (v2f64 (XVCVSXWDP (v2i64 (XXMRGHW $C, $C))))>;
1053def : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 1)),
1054 (v2f64 (XVCVSXWDP (v2i64 (XXMRGLW $C, $C))))>;
1055
1056def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 0)),
1057 (v2f64 (XVCVUXWDP (v2i64 (XXMRGHW $C, $C))))>;
1058def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 1)),
1059 (v2f64 (XVCVUXWDP (v2i64 (XXMRGLW $C, $C))))>;
1060
Bill Schmidt2d1128a2014-10-17 15:13:38 +00001061// Loads.
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001062let Predicates = [HasVSX, HasOnlySwappingMemOps] in {
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001063 def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +00001064
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001065 // Stores.
1066 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
1067 (STXVD2X $rS, xoaddr:$dst)>;
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00001068 def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
1069}
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +00001070let Predicates = [IsBigEndian, HasVSX, HasOnlySwappingMemOps] in {
1071 def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
1072 def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
1073 def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +00001074 def : Pat<(v4i32 (int_ppc_vsx_lxvw4x xoaddr:$src)), (LXVW4X xoaddr:$src)>;
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +00001075 def : Pat<(store v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
1076 def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +00001077 def : Pat<(store v4i32:$XT, xoaddr:$dst), (STXVW4X $XT, xoaddr:$dst)>;
1078 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
1079 (STXVW4X $rS, xoaddr:$dst)>;
Nemanja Ivanovice78ffed2016-09-22 10:32:03 +00001080}
Bill Schmidtfae5d712014-12-09 16:35:51 +00001081
1082// Permutes.
1083def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
1084def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
1085def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
1086def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001087def : Pat<(v2f64 (PPCswapNoChain v2f64:$src)), (XXPERMDI $src, $src, 2)>;
Bill Schmidt2d1128a2014-10-17 15:13:38 +00001088
Tony Jiang0a429f02017-05-24 23:48:29 +00001089// PPCvecshl XT, XA, XA, 2 can be selected to both XXSLDWI XT,XA,XA,2 and
1090// XXSWAPD XT,XA (i.e. XXPERMDI XT,XA,XA,2), the later one is more profitable.
1091def : Pat<(v4i32 (PPCvecshl v4i32:$src, v4i32:$src, 2)), (XXPERMDI $src, $src, 2)>;
1092
Bill Schmidt61e65232014-10-22 13:13:40 +00001093// Selects.
1094def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001095 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1096def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001097 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1098def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001099 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1100def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001101 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1102def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
1103 (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1104def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001105 (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1106def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001107 (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1108def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001109 (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1110def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
Bill Schmidt61e65232014-10-22 13:13:40 +00001111 (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1112def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
1113 (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1114
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001115def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001116 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1117def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001118 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1119def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001120 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1121def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001122 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1123def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
1124 (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
1125def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001126 (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>;
1127def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001128 (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>;
1129def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001130 (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1131def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
Bill Schmidt9c54bbd2014-10-22 16:58:20 +00001132 (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1133def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
1134 (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1135
Bill Schmidt76746922014-11-14 12:10:40 +00001136// Divides.
1137def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
1138 (XVDIVSP $A, $B)>;
1139def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
1140 (XVDIVDP $A, $B)>;
1141
Nemanja Ivanovic984a3612015-07-14 17:25:20 +00001142// Reciprocal estimate
1143def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
1144 (XVRESP $A)>;
1145def : Pat<(int_ppc_vsx_xvredp v2f64:$A),
1146 (XVREDP $A)>;
1147
Nemanja Ivanovicd358b8f2015-07-05 06:03:51 +00001148// Recip. square root estimate
1149def : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
1150 (XVRSQRTESP $A)>;
1151def : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
1152 (XVRSQRTEDP $A)>;
1153
Zi Xuan Wu6a3c2792018-11-14 02:34:45 +00001154// Vector selection
1155def : Pat<(v16i8 (vselect v16i8:$vA, v16i8:$vB, v16i8:$vC)),
1156 (COPY_TO_REGCLASS
1157 (XXSEL (COPY_TO_REGCLASS $vC, VSRC),
1158 (COPY_TO_REGCLASS $vB, VSRC),
1159 (COPY_TO_REGCLASS $vA, VSRC)), VRRC)>;
1160def : Pat<(v8i16 (vselect v8i16:$vA, v8i16:$vB, v8i16:$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<(vselect v4i32:$vA, v4i32:$vB, v4i32:$vC),
1166 (XXSEL $vC, $vB, $vA)>;
1167def : Pat<(vselect v2i64:$vA, v2i64:$vB, v2i64:$vC),
1168 (XXSEL $vC, $vB, $vA)>;
1169def : Pat<(vselect v4i32:$vA, v4f32:$vB, v4f32:$vC),
1170 (XXSEL $vC, $vB, $vA)>;
1171def : Pat<(vselect v2i64:$vA, v2f64:$vB, v2f64:$vC),
1172 (XXSEL $vC, $vB, $vA)>;
1173
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001174let Predicates = [IsLittleEndian] in {
1175def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1176 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1177def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1178 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1179def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1180 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1181def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1182 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1183} // IsLittleEndian
1184
1185let Predicates = [IsBigEndian] in {
1186def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1187 (f64 (XSCVSXDDP (COPY_TO_REGCLASS $S, VSFRC)))>;
1188def : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1189 (f64 (XSCVSXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1190def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))),
1191 (f64 (XSCVUXDDP (COPY_TO_REGCLASS $S, VSFRC)))>;
1192def : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))),
1193 (f64 (XSCVUXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1194} // IsBigEndian
1195
Hal Finkel27774d92014-03-13 07:58:58 +00001196} // AddedComplexity
1197} // HasVSX
1198
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001199def ScalarLoads {
1200 dag Li8 = (i32 (extloadi8 xoaddr:$src));
1201 dag ZELi8 = (i32 (zextloadi8 xoaddr:$src));
1202 dag ZELi8i64 = (i64 (zextloadi8 xoaddr:$src));
1203 dag SELi8 = (i32 (sext_inreg (extloadi8 xoaddr:$src), i8));
1204 dag SELi8i64 = (i64 (sext_inreg (extloadi8 xoaddr:$src), i8));
1205
1206 dag Li16 = (i32 (extloadi16 xoaddr:$src));
1207 dag ZELi16 = (i32 (zextloadi16 xoaddr:$src));
1208 dag ZELi16i64 = (i64 (zextloadi16 xoaddr:$src));
1209 dag SELi16 = (i32 (sextloadi16 xoaddr:$src));
1210 dag SELi16i64 = (i64 (sextloadi16 xoaddr:$src));
1211
1212 dag Li32 = (i32 (load xoaddr:$src));
1213}
1214
Kit Barton298beb52015-02-18 16:21:46 +00001215// The following VSX instructions were introduced in Power ISA 2.07
1216/* FIXME: if the operands are v2i64, these patterns will not match.
1217 we should define new patterns or otherwise match the same patterns
1218 when the elements are larger than i32.
1219*/
1220def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001221def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
Lei Huangc29229a2018-05-08 17:36:40 +00001222def NoP9Vector : Predicate<"!PPCSubTarget->hasP9Vector()">;
Kit Barton298beb52015-02-18 16:21:46 +00001223let Predicates = [HasP8Vector] in {
1224let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001225 let isCommutable = 1, UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001226 def XXLEQV : XX3Form<60, 186,
1227 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1228 "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
1229 [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
1230 def XXLNAND : XX3Form<60, 178,
1231 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1232 "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
1233 [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
Kit Barton298beb52015-02-18 16:21:46 +00001234 v4i32:$XB)))]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001235 } // isCommutable, UseVSXReg
Nemanja Ivanovicd9e4b4f2015-07-10 14:25:17 +00001236
Nemanja Ivanovic5655fb32015-07-10 12:38:08 +00001237 def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
1238 (XXLEQV $A, $B)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001239
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001240 let UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001241 def XXLORC : XX3Form<60, 170,
1242 (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1243 "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
1244 [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
1245
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001246 // VSX scalar loads introduced in ISA 2.07
Sean Fertile3c8c3852017-01-26 18:59:15 +00001247 let mayLoad = 1, mayStore = 0 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00001248 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001249 def LXSSPX : XX1Form_memOp<31, 524, (outs vssrc:$XT), (ins memrr:$src),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001250 "lxsspx $XT, $src", IIC_LdStLFD, []>;
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001251 def LXSIWAX : XX1Form_memOp<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001252 "lxsiwax $XT, $src", IIC_LdStLFD, []>;
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001253 def LXSIWZX : XX1Form_memOp<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001254 "lxsiwzx $XT, $src", IIC_LdStLFD, []>;
1255
Jinsong Jic7b43b92018-12-13 15:12:57 +00001256 // Pseudo instruction XFLOADf32 will be expanded to LXSSPX or LFSX later
1257 let CodeSize = 3 in
1258 def XFLOADf32 : PseudoXFormMemOp<(outs vssrc:$XT), (ins memrr:$src),
1259 "#XFLOADf32",
1260 [(set f32:$XT, (load xoaddr:$src))]>;
1261 // Pseudo instruction LIWAX will be expanded to LXSIWAX or LFIWAX later
1262 def LIWAX : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src),
1263 "#LIWAX",
1264 [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
1265 // Pseudo instruction LIWZX will be expanded to LXSIWZX or LFIWZX later
1266 def LIWZX : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src),
1267 "#LIWZX",
1268 [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001269 } // mayLoad
1270
1271 // VSX scalar stores introduced in ISA 2.07
Sean Fertile3c8c3852017-01-26 18:59:15 +00001272 let mayStore = 1, mayLoad = 0 in {
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00001273 let CodeSize = 3 in
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001274 def STXSSPX : XX1Form_memOp<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001275 "stxsspx $XT, $dst", IIC_LdStSTFD, []>;
Stefan Pintilie26d4f922018-03-26 17:39:18 +00001276 def STXSIWX : XX1Form_memOp<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001277 "stxsiwx $XT, $dst", IIC_LdStSTFD, []>;
1278
Jinsong Jic7b43b92018-12-13 15:12:57 +00001279 // Pseudo instruction XFSTOREf32 will be expanded to STXSSPX or STFSX later
1280 let CodeSize = 3 in
1281 def XFSTOREf32 : PseudoXFormMemOp<(outs), (ins vssrc:$XT, memrr:$dst),
1282 "#XFSTOREf32",
1283 [(store f32:$XT, xoaddr:$dst)]>;
1284 // Pseudo instruction STIWX will be expanded to STXSIWX or STFIWX later
1285 def STIWX : PseudoXFormMemOp<(outs), (ins vsfrc:$XT, memrr:$dst),
1286 "#STIWX",
1287 [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001288 } // mayStore
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001289 } // UseVSXReg = 1
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001290
1291 def : Pat<(f64 (extloadf32 xoaddr:$src)),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001292 (COPY_TO_REGCLASS (XFLOADf32 xoaddr:$src), VSFRC)>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001293 def : Pat<(f32 (fpround (f64 (extloadf32 xoaddr:$src)))),
Tony Jiang438bf4a2017-11-20 14:38:30 +00001294 (f32 (XFLOADf32 xoaddr:$src))>;
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +00001295 def : Pat<(f64 (fpextend f32:$src)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001296 (COPY_TO_REGCLASS $src, VSFRC)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00001297
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001298 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001299 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1300 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001301 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1302 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001303 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1304 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001305 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1306 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
1307 (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1308 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001309 (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>;
1310 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001311 (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>;
1312 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001313 (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1314 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001315 (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1316 def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00001317 (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001318
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001319 let UseVSXReg = 1 in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001320 // VSX Elementary Scalar FP arithmetic (SP)
1321 let isCommutable = 1 in {
1322 def XSADDSP : XX3Form<60, 0,
1323 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1324 "xsaddsp $XT, $XA, $XB", IIC_VecFP,
1325 [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
1326 def XSMULSP : XX3Form<60, 16,
1327 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1328 "xsmulsp $XT, $XA, $XB", IIC_VecFP,
1329 [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
1330 } // isCommutable
1331
1332 def XSDIVSP : XX3Form<60, 24,
1333 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1334 "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
1335 [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
1336 def XSRESP : XX2Form<60, 26,
1337 (outs vssrc:$XT), (ins vssrc:$XB),
1338 "xsresp $XT, $XB", IIC_VecFP,
1339 [(set f32:$XT, (PPCfre f32:$XB))]>;
Lei Huang6270ab62018-07-04 21:59:16 +00001340 def XSRSP : XX2Form<60, 281,
1341 (outs vssrc:$XT), (ins vsfrc:$XB),
1342 "xsrsp $XT, $XB", IIC_VecFP, []>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001343 def XSSQRTSP : XX2Form<60, 11,
1344 (outs vssrc:$XT), (ins vssrc:$XB),
1345 "xssqrtsp $XT, $XB", IIC_FPSqrtS,
1346 [(set f32:$XT, (fsqrt f32:$XB))]>;
1347 def XSRSQRTESP : XX2Form<60, 10,
1348 (outs vssrc:$XT), (ins vssrc:$XB),
1349 "xsrsqrtesp $XT, $XB", IIC_VecFP,
1350 [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
1351 def XSSUBSP : XX3Form<60, 8,
1352 (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1353 "xssubsp $XT, $XA, $XB", IIC_VecFP,
1354 [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
Nemanja Ivanovic376e1732015-05-29 17:13:25 +00001355
1356 // FMA Instructions
1357 let BaseName = "XSMADDASP" in {
1358 let isCommutable = 1 in
1359 def XSMADDASP : XX3Form<60, 1,
1360 (outs vssrc:$XT),
1361 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1362 "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
1363 [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
1364 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1365 AltVSXFMARel;
1366 let IsVSXFMAAlt = 1 in
1367 def XSMADDMSP : XX3Form<60, 9,
1368 (outs vssrc:$XT),
1369 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1370 "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1371 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1372 AltVSXFMARel;
1373 }
1374
1375 let BaseName = "XSMSUBASP" in {
1376 let isCommutable = 1 in
1377 def XSMSUBASP : XX3Form<60, 17,
1378 (outs vssrc:$XT),
1379 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1380 "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
1381 [(set f32:$XT, (fma f32:$XA, f32:$XB,
1382 (fneg f32:$XTi)))]>,
1383 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1384 AltVSXFMARel;
1385 let IsVSXFMAAlt = 1 in
1386 def XSMSUBMSP : XX3Form<60, 25,
1387 (outs vssrc:$XT),
1388 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1389 "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1390 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1391 AltVSXFMARel;
1392 }
1393
1394 let BaseName = "XSNMADDASP" in {
1395 let isCommutable = 1 in
1396 def XSNMADDASP : XX3Form<60, 129,
1397 (outs vssrc:$XT),
1398 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1399 "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
1400 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1401 f32:$XTi)))]>,
1402 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1403 AltVSXFMARel;
1404 let IsVSXFMAAlt = 1 in
1405 def XSNMADDMSP : XX3Form<60, 137,
1406 (outs vssrc:$XT),
1407 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1408 "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1409 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1410 AltVSXFMARel;
1411 }
1412
1413 let BaseName = "XSNMSUBASP" in {
1414 let isCommutable = 1 in
1415 def XSNMSUBASP : XX3Form<60, 145,
1416 (outs vssrc:$XT),
1417 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1418 "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
1419 [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1420 (fneg f32:$XTi))))]>,
1421 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1422 AltVSXFMARel;
1423 let IsVSXFMAAlt = 1 in
1424 def XSNMSUBMSP : XX3Form<60, 153,
1425 (outs vssrc:$XT),
1426 (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1427 "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1428 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1429 AltVSXFMARel;
1430 }
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001431
1432 // Single Precision Conversions (FP <-> INT)
1433 def XSCVSXDSP : XX2Form<60, 312,
1434 (outs vssrc:$XT), (ins vsfrc:$XB),
1435 "xscvsxdsp $XT, $XB", IIC_VecFP,
1436 [(set f32:$XT, (PPCfcfids f64:$XB))]>;
1437 def XSCVUXDSP : XX2Form<60, 296,
1438 (outs vssrc:$XT), (ins vsfrc:$XB),
1439 "xscvuxdsp $XT, $XB", IIC_VecFP,
1440 [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
1441
1442 // Conversions between vector and scalar single precision
1443 def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
1444 "xscvdpspn $XT, $XB", IIC_VecFP, []>;
1445 def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
1446 "xscvspdpn $XT, $XB", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001447 } // UseVSXReg = 1
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001448
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001449 let Predicates = [IsLittleEndian] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00001450 def : Pat<(f32 (PPCfcfids
1451 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 0)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001452 (f32 (XSCVSXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001453 def : Pat<(f32 (PPCfcfids
1454 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 1)))))),
1455 (f32 (XSCVSXDSP (COPY_TO_REGCLASS
1456 (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
1457 def : Pat<(f32 (PPCfcfidus
1458 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 0)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001459 (f32 (XSCVUXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001460 def : Pat<(f32 (PPCfcfidus
1461 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 1)))))),
1462 (f32 (XSCVUXDSP (COPY_TO_REGCLASS
1463 (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>;
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001464 }
1465
1466 let Predicates = [IsBigEndian] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00001467 def : Pat<(f32 (PPCfcfids
1468 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 0)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001469 (f32 (XSCVSXDSP (COPY_TO_REGCLASS $S, VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001470 def : Pat<(f32 (PPCfcfids
1471 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 1)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001472 (f32 (XSCVSXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001473 def : Pat<(f32 (PPCfcfidus
1474 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 0)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001475 (f32 (XSCVUXDSP (COPY_TO_REGCLASS $S, VSFRC)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00001476 def : Pat<(f32 (PPCfcfidus
1477 (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S, 1)))))),
Nemanja Ivanovicd3c284f2016-07-18 15:30:00 +00001478 (f32 (XSCVUXDSP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>;
1479 }
Lei Huangc29229a2018-05-08 17:36:40 +00001480
1481 // Instructions for converting float to i64 feeding a store.
1482 let Predicates = [NoP9Vector] in {
1483 def : Pat<(PPCstore_scal_int_from_vsr
1484 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xoaddr:$dst, 8),
1485 (STXSDX (XSCVDPSXDS f64:$src), xoaddr:$dst)>;
1486 def : Pat<(PPCstore_scal_int_from_vsr
1487 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xoaddr:$dst, 8),
1488 (STXSDX (XSCVDPUXDS f64:$src), xoaddr:$dst)>;
1489 }
1490
1491 // Instructions for converting float to i32 feeding a store.
1492 def : Pat<(PPCstore_scal_int_from_vsr
1493 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xoaddr:$dst, 4),
1494 (STIWX (XSCVDPSXWS f64:$src), xoaddr:$dst)>;
1495 def : Pat<(PPCstore_scal_int_from_vsr
1496 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xoaddr:$dst, 4),
1497 (STIWX (XSCVDPUXWS f64:$src), xoaddr:$dst)>;
1498
Nemanja Ivanovicf3c94b12015-05-07 18:24:05 +00001499} // AddedComplexity = 400
Kit Barton298beb52015-02-18 16:21:46 +00001500} // HasP8Vector
Nemanja Ivanovicc38b5312015-04-11 10:40:42 +00001501
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00001502let UseVSXReg = 1, AddedComplexity = 400 in {
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001503let Predicates = [HasDirectMove] in {
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001504 // VSX direct move instructions
1505 def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
1506 "mfvsrd $rA, $XT", IIC_VecGeneral,
1507 [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
1508 Requires<[In64BitMode]>;
Nemanja Ivanovicffcf0fb2017-03-15 16:04:53 +00001509 let isCodeGenOnly = 1 in
1510 def MFVRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vrrc:$XT),
1511 "mfvsrd $rA, $XT", IIC_VecGeneral,
1512 []>,
1513 Requires<[In64BitMode]>;
Nemanja Ivanovicf02def62015-05-21 19:32:49 +00001514 def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
1515 "mfvsrwz $rA, $XT", IIC_VecGeneral,
1516 [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
1517 def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
1518 "mtvsrd $XT, $rA", IIC_VecGeneral,
1519 [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1520 Requires<[In64BitMode]>;
1521 def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1522 "mtvsrwa $XT, $rA", IIC_VecGeneral,
1523 [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1524 def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1525 "mtvsrwz $XT, $rA", IIC_VecGeneral,
1526 [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001527} // HasDirectMove
1528
1529let Predicates = [IsISA3_0, HasDirectMove] in {
1530 def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00001531 "mtvsrws $XT, $rA", IIC_VecGeneral, []>;
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001532
Guozhi Wei22e7da92017-05-11 22:17:35 +00001533 def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc_nox0:$rA, g8rc:$rB),
Ehsan Amiri99b017a2016-03-31 17:47:17 +00001534 "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,
1535 []>, Requires<[In64BitMode]>;
1536
1537 def MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT),
1538 "mfvsrld $rA, $XT", IIC_VecGeneral,
1539 []>, Requires<[In64BitMode]>;
1540
1541} // IsISA3_0, HasDirectMove
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00001542} // UseVSXReg = 1
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001543
Nemanja Ivanovicffcf0fb2017-03-15 16:04:53 +00001544// We want to parse this from asm, but we don't want to emit this as it would
1545// be emitted with a VSX reg. So leave Emit = 0 here.
1546def : InstAlias<"mfvrd $rA, $XT",
1547 (MFVRD g8rc:$rA, vrrc:$XT), 0>;
1548def : InstAlias<"mffprd $rA, $src",
1549 (MFVSRD g8rc:$rA, f8rc:$src)>;
1550
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001551/* Direct moves of various widths from GPR's into VSR's. Each move lines
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001552 the value up into element 0 (both BE and LE). Namely, entities smaller than
1553 a doubleword are shifted left and moved for BE. For LE, they're moved, then
1554 swapped to go into the least significant element of the VSR.
1555*/
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001556def MovesToVSR {
1557 dag BE_BYTE_0 =
1558 (MTVSRD
1559 (RLDICR
1560 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1561 dag BE_HALF_0 =
1562 (MTVSRD
1563 (RLDICR
1564 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1565 dag BE_WORD_0 =
1566 (MTVSRD
1567 (RLDICR
1568 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001569 dag BE_DWORD_0 = (MTVSRD $A);
1570
1571 dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001572 dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1573 LE_MTVSRW, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001574 dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001575 dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1576 BE_DWORD_0, sub_64));
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001577 dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1578}
1579
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001580/* Patterns for extracting elements out of vectors. Integer elements are
1581 extracted using direct move operations. Patterns for extracting elements
1582 whose indices are not available at compile time are also provided with
1583 various _VARIABLE_ patterns.
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001584 The numbering for the DAG's is for LE, but when used on BE, the correct
1585 LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1586*/
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001587def VectorExtractions {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001588 // Doubleword extraction
1589 dag LE_DWORD_0 =
1590 (MFVSRD
1591 (EXTRACT_SUBREG
1592 (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1593 (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1594 dag LE_DWORD_1 = (MFVSRD
1595 (EXTRACT_SUBREG
1596 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1597
1598 // Word extraction
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001599 dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001600 dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1601 dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1602 (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1603 dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1604
1605 // Halfword extraction
1606 dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1607 dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1608 dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1609 dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1610 dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1611 dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1612 dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1613 dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1614
1615 // Byte extraction
1616 dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1617 dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1618 dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1619 dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1620 dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1621 dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1622 dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1623 dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1624 dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1625 dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1626 dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1627 dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1628 dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1629 dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1630 dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1631 dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1632
1633 /* Variable element number (BE and LE patterns must be specified separately)
1634 This is a rather involved process.
1635
1636 Conceptually, this is how the move is accomplished:
1637 1. Identify which doubleword contains the element
1638 2. Shift in the VMX register so that the correct doubleword is correctly
1639 lined up for the MFVSRD
1640 3. Perform the move so that the element (along with some extra stuff)
1641 is in the GPR
1642 4. Right shift within the GPR so that the element is right-justified
1643
1644 Of course, the index is an element number which has a different meaning
1645 on LE/BE so the patterns have to be specified separately.
1646
1647 Note: The final result will be the element right-justified with high
1648 order bits being arbitrarily defined (namely, whatever was in the
1649 vector register to the left of the value originally).
1650 */
1651
1652 /* LE variable byte
1653 Number 1. above:
1654 - For elements 0-7, we shift left by 8 bytes since they're on the right
1655 - For elements 8-15, we need not shift (shift left by zero bytes)
1656 This is accomplished by inverting the bits of the index and AND-ing
1657 with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1658 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001659 dag LE_VBYTE_PERM_VEC = (v16i8 (LVSL ZERO8, (ANDC8 (LI8 8), $Idx)));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001660
1661 // Number 2. above:
1662 // - Now that we set up the shift amount, we shift in the VMX register
Lei Huangcd4f3852018-03-12 19:26:18 +00001663 dag LE_VBYTE_PERMUTE = (v16i8 (VPERM $S, $S, LE_VBYTE_PERM_VEC));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001664
1665 // Number 3. above:
1666 // - The doubleword containing our element is moved to a GPR
1667 dag LE_MV_VBYTE = (MFVSRD
1668 (EXTRACT_SUBREG
1669 (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1670 sub_64));
1671
1672 /* Number 4. above:
1673 - Truncate the element number to the range 0-7 (8-15 are symmetrical
1674 and out of range values are truncated accordingly)
1675 - Multiply by 8 as we need to shift right by the number of bits, not bytes
1676 - Shift right in the GPR by the calculated value
1677 */
1678 dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1679 sub_32);
1680 dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1681 sub_32);
1682
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001683 /* LE variable halfword
1684 Number 1. above:
1685 - For elements 0-3, we shift left by 8 since they're on the right
1686 - For elements 4-7, we need not shift (shift left by zero bytes)
1687 Similarly to the byte pattern, we invert the bits of the index, but we
1688 AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1689 Of course, the shift is still by 8 bytes, so we must multiply by 2.
1690 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001691 dag LE_VHALF_PERM_VEC =
1692 (v16i8 (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62)));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001693
1694 // Number 2. above:
1695 // - Now that we set up the shift amount, we shift in the VMX register
Lei Huangcd4f3852018-03-12 19:26:18 +00001696 dag LE_VHALF_PERMUTE = (v16i8 (VPERM $S, $S, LE_VHALF_PERM_VEC));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001697
1698 // Number 3. above:
1699 // - The doubleword containing our element is moved to a GPR
1700 dag LE_MV_VHALF = (MFVSRD
1701 (EXTRACT_SUBREG
1702 (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1703 sub_64));
1704
1705 /* Number 4. above:
1706 - Truncate the element number to the range 0-3 (4-7 are symmetrical
1707 and out of range values are truncated accordingly)
1708 - Multiply by 16 as we need to shift right by the number of bits
1709 - Shift right in the GPR by the calculated value
1710 */
1711 dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1712 sub_32);
1713 dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1714 sub_32);
1715
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001716 /* LE variable word
1717 Number 1. above:
1718 - For elements 0-1, we shift left by 8 since they're on the right
1719 - For elements 2-3, we need not shift
1720 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001721 dag LE_VWORD_PERM_VEC = (v16i8 (LVSL ZERO8,
1722 (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61)));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001723
1724 // Number 2. above:
1725 // - Now that we set up the shift amount, we shift in the VMX register
Lei Huangcd4f3852018-03-12 19:26:18 +00001726 dag LE_VWORD_PERMUTE = (v16i8 (VPERM $S, $S, LE_VWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001727
1728 // Number 3. above:
1729 // - The doubleword containing our element is moved to a GPR
1730 dag LE_MV_VWORD = (MFVSRD
1731 (EXTRACT_SUBREG
1732 (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
1733 sub_64));
1734
1735 /* Number 4. above:
1736 - Truncate the element number to the range 0-1 (2-3 are symmetrical
1737 and out of range values are truncated accordingly)
1738 - Multiply by 32 as we need to shift right by the number of bits
1739 - Shift right in the GPR by the calculated value
1740 */
1741 dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
1742 sub_32);
1743 dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
1744 sub_32);
1745
1746 /* LE variable doubleword
1747 Number 1. above:
1748 - For element 0, we shift left by 8 since it's on the right
1749 - For element 1, we need not shift
1750 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001751 dag LE_VDWORD_PERM_VEC = (v16i8 (LVSL ZERO8,
1752 (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60)));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001753
1754 // Number 2. above:
1755 // - Now that we set up the shift amount, we shift in the VMX register
Lei Huangcd4f3852018-03-12 19:26:18 +00001756 dag LE_VDWORD_PERMUTE = (v16i8 (VPERM $S, $S, LE_VDWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001757
1758 // Number 3. above:
1759 // - The doubleword containing our element is moved to a GPR
1760 // - Number 4. is not needed for the doubleword as the value is 64-bits
1761 dag LE_VARIABLE_DWORD =
1762 (MFVSRD (EXTRACT_SUBREG
1763 (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
1764 sub_64));
1765
1766 /* LE variable float
1767 - Shift the vector to line up the desired element to BE Word 0
1768 - Convert 32-bit float to a 64-bit single precision float
1769 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001770 dag LE_VFLOAT_PERM_VEC = (v16i8 (LVSL ZERO8,
1771 (RLDICR (XOR8 (LI8 3), $Idx), 2, 61)));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001772 dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
1773 dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
1774
1775 /* LE variable double
1776 Same as the LE doubleword except there is no move.
1777 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001778 dag LE_VDOUBLE_PERMUTE = (v16i8 (VPERM (v16i8 (COPY_TO_REGCLASS $S, VRRC)),
1779 (v16i8 (COPY_TO_REGCLASS $S, VRRC)),
1780 LE_VDWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001781 dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
1782
1783 /* BE variable byte
1784 The algorithm here is the same as the LE variable byte except:
1785 - The shift in the VMX register is by 0/8 for opposite element numbers so
1786 we simply AND the element number with 0x8
1787 - The order of elements after the move to GPR is reversed, so we invert
1788 the bits of the index prior to truncating to the range 0-7
1789 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001790 dag BE_VBYTE_PERM_VEC = (v16i8 (LVSL ZERO8, (ANDIo8 $Idx, 8)));
1791 dag BE_VBYTE_PERMUTE = (v16i8 (VPERM $S, $S, BE_VBYTE_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001792 dag BE_MV_VBYTE = (MFVSRD
1793 (EXTRACT_SUBREG
1794 (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1795 sub_64));
1796 dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1797 sub_32);
1798 dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1799 sub_32);
1800
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001801 /* BE variable halfword
1802 The algorithm here is the same as the LE variable halfword except:
1803 - The shift in the VMX register is by 0/8 for opposite element numbers so
1804 we simply AND the element number with 0x4 and multiply by 2
1805 - The order of elements after the move to GPR is reversed, so we invert
1806 the bits of the index prior to truncating to the range 0-3
1807 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001808 dag BE_VHALF_PERM_VEC = (v16i8 (LVSL ZERO8,
1809 (RLDICR (ANDIo8 $Idx, 4), 1, 62)));
1810 dag BE_VHALF_PERMUTE = (v16i8 (VPERM $S, $S, BE_VHALF_PERM_VEC));
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001811 dag BE_MV_VHALF = (MFVSRD
1812 (EXTRACT_SUBREG
1813 (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1814 sub_64));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001815 dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001816 sub_32);
1817 dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1818 sub_32);
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001819
1820 /* BE variable word
1821 The algorithm is the same as the LE variable word except:
1822 - The shift in the VMX register happens for opposite element numbers
1823 - The order of elements after the move to GPR is reversed, so we invert
1824 the bits of the index prior to truncating to the range 0-1
1825 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001826 dag BE_VWORD_PERM_VEC = (v16i8 (LVSL ZERO8,
1827 (RLDICR (ANDIo8 $Idx, 2), 2, 61)));
1828 dag BE_VWORD_PERMUTE = (v16i8 (VPERM $S, $S, BE_VWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001829 dag BE_MV_VWORD = (MFVSRD
1830 (EXTRACT_SUBREG
1831 (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
1832 sub_64));
1833 dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
1834 sub_32);
1835 dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
1836 sub_32);
1837
1838 /* BE variable doubleword
1839 Same as the LE doubleword except we shift in the VMX register for opposite
1840 element indices.
1841 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001842 dag BE_VDWORD_PERM_VEC = (v16i8 (LVSL ZERO8,
1843 (RLDICR (ANDIo8 $Idx, 1), 3, 60)));
1844 dag BE_VDWORD_PERMUTE = (v16i8 (VPERM $S, $S, BE_VDWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001845 dag BE_VARIABLE_DWORD =
1846 (MFVSRD (EXTRACT_SUBREG
1847 (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
1848 sub_64));
1849
1850 /* BE variable float
1851 - Shift the vector to line up the desired element to BE Word 0
1852 - Convert 32-bit float to a 64-bit single precision float
1853 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001854 dag BE_VFLOAT_PERM_VEC = (v16i8 (LVSL ZERO8, (RLDICR $Idx, 2, 61)));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001855 dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
1856 dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
1857
1858 /* BE variable double
1859 Same as the BE doubleword except there is no move.
1860 */
Lei Huangcd4f3852018-03-12 19:26:18 +00001861 dag BE_VDOUBLE_PERMUTE = (v16i8 (VPERM (v16i8 (COPY_TO_REGCLASS $S, VRRC)),
1862 (v16i8 (COPY_TO_REGCLASS $S, VRRC)),
1863 BE_VDWORD_PERM_VEC));
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001864 dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001865}
1866
Zaara Syeda48cb3c12017-11-27 17:11:03 +00001867def NoP9Altivec : Predicate<"!PPCSubTarget->hasP9Altivec()">;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00001868let AddedComplexity = 400 in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001869// v4f32 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001870let Predicates = [IsBigEndian, HasP8Vector] in {
1871 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1872 (v4f32 (XSCVDPSPN $A))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001873 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1874 (f32 (XSCVSPDPN $S))>;
1875 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1876 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1877 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001878 (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001879 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1880 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001881 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1882 (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001883} // IsBigEndian, HasP8Vector
1884
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001885// Variable index vector_extract for v2f64 does not require P8Vector
1886let Predicates = [IsBigEndian, HasVSX] in
1887 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1888 (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
1889
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001890let Predicates = [IsBigEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001891 // v16i8 scalar <-> vector conversions (BE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001892 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001893 (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001894 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001895 (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001896 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001897 (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001898 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001899 (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00001900
1901 // v2i64 scalar <-> vector conversions (BE)
1902 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
1903 (i64 VectorExtractions.LE_DWORD_1)>;
1904 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
1905 (i64 VectorExtractions.LE_DWORD_0)>;
1906 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1907 (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
1908} // IsBigEndian, HasDirectMove
1909
1910let Predicates = [IsBigEndian, HasDirectMove, NoP9Altivec] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001911 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001912 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001913 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001914 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001915 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001916 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001917 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001918 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001919 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001920 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001921 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001922 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001923 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001924 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001925 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001926 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001927 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001928 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001929 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001930 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001931 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001932 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001933 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001934 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001935 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001936 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001937 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001938 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001939 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001940 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001941 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001942 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001943 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001944 (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001945
1946 // v8i16 scalar <-> vector conversions (BE)
1947 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001948 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001949 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001950 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001951 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001952 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001953 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001954 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001955 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001956 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001957 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001958 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001959 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001960 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001961 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001962 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001963 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001964 (i32 VectorExtractions.BE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001965
1966 // v4i32 scalar <-> vector conversions (BE)
1967 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001968 (i32 VectorExtractions.LE_WORD_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001969 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001970 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001971 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001972 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001973 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001974 (i32 VectorExtractions.LE_WORD_0)>;
1975 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1976 (i32 VectorExtractions.BE_VARIABLE_WORD)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00001977} // IsBigEndian, HasDirectMove, NoP9Altivec
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001978
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001979// v4f32 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001980let Predicates = [IsLittleEndian, HasP8Vector] in {
1981 def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1982 (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001983 def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1984 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1985 def : Pat<(f32 (vector_extract v4f32:$S, 1)),
Nemanja Ivanoviceebbcb62016-07-12 12:16:27 +00001986 (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00001987 def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1988 (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1989 def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1990 (f32 (XSCVSPDPN $S))>;
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001991 def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1992 (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00001993} // IsLittleEndian, HasP8Vector
1994
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00001995// Variable index vector_extract for v2f64 does not require P8Vector
1996let Predicates = [IsLittleEndian, HasVSX] in
1997 def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1998 (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
1999
Zaara Syeda75098802018-11-05 17:31:26 +00002000def : Pat<(int_ppc_vsx_stxvd2x_be v2f64:$rS, xoaddr:$dst),
2001 (STXVD2X $rS, xoaddr:$dst)>;
2002def : Pat<(int_ppc_vsx_stxvw4x_be v4i32:$rS, xoaddr:$dst),
2003 (STXVW4X $rS, xoaddr:$dst)>;
Nemanja Ivanovicb89c27f2017-05-02 01:47:34 +00002004def : Pat<(v4i32 (int_ppc_vsx_lxvw4x_be xoaddr:$src)), (LXVW4X xoaddr:$src)>;
2005def : Pat<(v2f64 (int_ppc_vsx_lxvd2x_be xoaddr:$src)), (LXVD2X xoaddr:$src)>;
Tony Jiang5f850cd2016-11-15 14:25:56 +00002006
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002007// Variable index unsigned vector_extract on Power9
2008let Predicates = [HasP9Altivec, IsLittleEndian] in {
2009 def : Pat<(i64 (anyext (i32 (vector_extract v16i8:$S, i64:$Idx)))),
2010 (VEXTUBRX $Idx, $S)>;
2011
2012 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, i64:$Idx)))),
2013 (VEXTUHRX (RLWINM8 $Idx, 1, 28, 30), $S)>;
2014 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 0)))),
2015 (VEXTUHRX (LI8 0), $S)>;
2016 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 1)))),
2017 (VEXTUHRX (LI8 2), $S)>;
2018 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 2)))),
2019 (VEXTUHRX (LI8 4), $S)>;
2020 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 3)))),
2021 (VEXTUHRX (LI8 6), $S)>;
2022 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 4)))),
2023 (VEXTUHRX (LI8 8), $S)>;
2024 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 5)))),
2025 (VEXTUHRX (LI8 10), $S)>;
2026 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 6)))),
2027 (VEXTUHRX (LI8 12), $S)>;
2028 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 7)))),
2029 (VEXTUHRX (LI8 14), $S)>;
2030
2031 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, i64:$Idx)))),
2032 (VEXTUWRX (RLWINM8 $Idx, 2, 28, 29), $S)>;
2033 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 0)))),
2034 (VEXTUWRX (LI8 0), $S)>;
2035 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 1)))),
2036 (VEXTUWRX (LI8 4), $S)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002037 // For extracting LE word 2, MFVSRWZ is better than VEXTUWRX
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002038 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 2)))),
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002039 (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
2040 (i32 VectorExtractions.LE_WORD_2), sub_32)>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002041 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 3)))),
2042 (VEXTUWRX (LI8 12), $S)>;
2043
2044 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, i64:$Idx)))),
2045 (EXTSW (VEXTUWRX (RLWINM8 $Idx, 2, 28, 29), $S))>;
2046 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 0)))),
2047 (EXTSW (VEXTUWRX (LI8 0), $S))>;
2048 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 1)))),
2049 (EXTSW (VEXTUWRX (LI8 4), $S))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002050 // For extracting LE word 2, MFVSRWZ is better than VEXTUWRX
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002051 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 2)))),
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002052 (EXTSW (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
2053 (i32 VectorExtractions.LE_WORD_2), sub_32))>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002054 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 3)))),
2055 (EXTSW (VEXTUWRX (LI8 12), $S))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002056
2057 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
2058 (i32 (EXTRACT_SUBREG (VEXTUBRX $Idx, $S), sub_32))>;
2059 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
2060 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 0), $S), sub_32))>;
2061 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
2062 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 1), $S), sub_32))>;
2063 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
2064 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 2), $S), sub_32))>;
2065 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
2066 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 3), $S), sub_32))>;
2067 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
2068 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 4), $S), sub_32))>;
2069 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
2070 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 5), $S), sub_32))>;
2071 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
2072 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 6), $S), sub_32))>;
2073 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
2074 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 7), $S), sub_32))>;
2075 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
2076 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 8), $S), sub_32))>;
2077 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
2078 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 9), $S), sub_32))>;
2079 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
2080 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 10), $S), sub_32))>;
2081 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
2082 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 11), $S), sub_32))>;
2083 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
2084 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 12), $S), sub_32))>;
2085 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
2086 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 13), $S), sub_32))>;
2087 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
2088 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 14), $S), sub_32))>;
2089 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
2090 (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 15), $S), sub_32))>;
2091
2092 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
2093 (i32 (EXTRACT_SUBREG (VEXTUHRX
2094 (RLWINM8 $Idx, 1, 28, 30), $S), sub_32))>;
2095 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
2096 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 0), $S), sub_32))>;
2097 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
2098 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 2), $S), sub_32))>;
2099 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
2100 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 4), $S), sub_32))>;
2101 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
2102 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 6), $S), sub_32))>;
2103 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
2104 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 8), $S), sub_32))>;
2105 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
2106 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 10), $S), sub_32))>;
2107 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
2108 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 12), $S), sub_32))>;
2109 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
2110 (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 14), $S), sub_32))>;
2111
2112 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
2113 (i32 (EXTRACT_SUBREG (VEXTUWRX
2114 (RLWINM8 $Idx, 2, 28, 29), $S), sub_32))>;
2115 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
2116 (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 0), $S), sub_32))>;
2117 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
2118 (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 4), $S), sub_32))>;
2119 // For extracting LE word 2, MFVSRWZ is better than VEXTUWRX
2120 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
2121 (i32 VectorExtractions.LE_WORD_2)>;
2122 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
2123 (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 12), $S), sub_32))>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002124}
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002125
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002126let Predicates = [HasP9Altivec, IsBigEndian] in {
2127 def : Pat<(i64 (anyext (i32 (vector_extract v16i8:$S, i64:$Idx)))),
2128 (VEXTUBLX $Idx, $S)>;
2129
2130 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, i64:$Idx)))),
2131 (VEXTUHLX (RLWINM8 $Idx, 1, 28, 30), $S)>;
2132 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 0)))),
2133 (VEXTUHLX (LI8 0), $S)>;
2134 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 1)))),
2135 (VEXTUHLX (LI8 2), $S)>;
2136 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 2)))),
2137 (VEXTUHLX (LI8 4), $S)>;
2138 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 3)))),
2139 (VEXTUHLX (LI8 6), $S)>;
2140 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 4)))),
2141 (VEXTUHLX (LI8 8), $S)>;
2142 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 5)))),
2143 (VEXTUHLX (LI8 10), $S)>;
2144 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 6)))),
2145 (VEXTUHLX (LI8 12), $S)>;
2146 def : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 7)))),
2147 (VEXTUHLX (LI8 14), $S)>;
2148
2149 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, i64:$Idx)))),
2150 (VEXTUWLX (RLWINM8 $Idx, 2, 28, 29), $S)>;
2151 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 0)))),
2152 (VEXTUWLX (LI8 0), $S)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002153
2154 // For extracting BE word 1, MFVSRWZ is better than VEXTUWLX
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002155 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 1)))),
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002156 (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
2157 (i32 VectorExtractions.LE_WORD_2), sub_32)>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002158 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 2)))),
2159 (VEXTUWLX (LI8 8), $S)>;
2160 def : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 3)))),
2161 (VEXTUWLX (LI8 12), $S)>;
2162
2163 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, i64:$Idx)))),
2164 (EXTSW (VEXTUWLX (RLWINM8 $Idx, 2, 28, 29), $S))>;
2165 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 0)))),
2166 (EXTSW (VEXTUWLX (LI8 0), $S))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002167 // For extracting BE word 1, MFVSRWZ is better than VEXTUWLX
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002168 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 1)))),
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002169 (EXTSW (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
2170 (i32 VectorExtractions.LE_WORD_2), sub_32))>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002171 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 2)))),
2172 (EXTSW (VEXTUWLX (LI8 8), $S))>;
2173 def : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 3)))),
2174 (EXTSW (VEXTUWLX (LI8 12), $S))>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002175
2176 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
2177 (i32 (EXTRACT_SUBREG (VEXTUBLX $Idx, $S), sub_32))>;
2178 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
2179 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 0), $S), sub_32))>;
2180 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
2181 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 1), $S), sub_32))>;
2182 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
2183 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 2), $S), sub_32))>;
2184 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
2185 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 3), $S), sub_32))>;
2186 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
2187 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 4), $S), sub_32))>;
2188 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
2189 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 5), $S), sub_32))>;
2190 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
2191 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 6), $S), sub_32))>;
2192 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
2193 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 7), $S), sub_32))>;
2194 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
2195 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 8), $S), sub_32))>;
2196 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
2197 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 9), $S), sub_32))>;
2198 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
2199 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 10), $S), sub_32))>;
2200 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
2201 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 11), $S), sub_32))>;
2202 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
2203 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 12), $S), sub_32))>;
2204 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
2205 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 13), $S), sub_32))>;
2206 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
2207 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 14), $S), sub_32))>;
2208 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
2209 (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 15), $S), sub_32))>;
2210
2211 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
2212 (i32 (EXTRACT_SUBREG (VEXTUHLX
2213 (RLWINM8 $Idx, 1, 28, 30), $S), sub_32))>;
2214 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
2215 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 0), $S), sub_32))>;
2216 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
2217 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 2), $S), sub_32))>;
2218 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
2219 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 4), $S), sub_32))>;
2220 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
2221 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 6), $S), sub_32))>;
2222 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
2223 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 8), $S), sub_32))>;
2224 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
2225 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 10), $S), sub_32))>;
2226 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
2227 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 12), $S), sub_32))>;
2228 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
2229 (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 14), $S), sub_32))>;
2230
2231 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
2232 (i32 (EXTRACT_SUBREG (VEXTUWLX
2233 (RLWINM8 $Idx, 2, 28, 29), $S), sub_32))>;
2234 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
2235 (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 0), $S), sub_32))>;
2236 // For extracting BE word 1, MFVSRWZ is better than VEXTUWLX
2237 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
2238 (i32 VectorExtractions.LE_WORD_2)>;
2239 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
2240 (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 8), $S), sub_32))>;
2241 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
2242 (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 12), $S), sub_32))>;
Tony Jiangaa5a6a12017-07-05 16:55:00 +00002243}
2244
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002245let Predicates = [IsLittleEndian, HasDirectMove] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002246 // v16i8 scalar <-> vector conversions (LE)
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002247 def : Pat<(v16i8 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002248 (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002249 def : Pat<(v8i16 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002250 (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002251 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002252 (v4i32 MovesToVSR.LE_WORD_0)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002253 def : Pat<(v2i64 (scalar_to_vector i64:$A)),
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002254 (v2i64 MovesToVSR.LE_DWORD_0)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002255 // v2i64 scalar <-> vector conversions (LE)
2256 def : Pat<(i64 (vector_extract v2i64:$S, 0)),
2257 (i64 VectorExtractions.LE_DWORD_0)>;
2258 def : Pat<(i64 (vector_extract v2i64:$S, 1)),
2259 (i64 VectorExtractions.LE_DWORD_1)>;
2260 def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
2261 (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
2262} // IsLittleEndian, HasDirectMove
2263
2264let Predicates = [IsLittleEndian, HasDirectMove, NoP9Altivec] in {
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002265 def : Pat<(i32 (vector_extract v16i8:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002266 (i32 VectorExtractions.LE_BYTE_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002267 def : Pat<(i32 (vector_extract v16i8:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002268 (i32 VectorExtractions.LE_BYTE_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002269 def : Pat<(i32 (vector_extract v16i8:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002270 (i32 VectorExtractions.LE_BYTE_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002271 def : Pat<(i32 (vector_extract v16i8:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002272 (i32 VectorExtractions.LE_BYTE_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002273 def : Pat<(i32 (vector_extract v16i8:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002274 (i32 VectorExtractions.LE_BYTE_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002275 def : Pat<(i32 (vector_extract v16i8:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002276 (i32 VectorExtractions.LE_BYTE_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002277 def : Pat<(i32 (vector_extract v16i8:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002278 (i32 VectorExtractions.LE_BYTE_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002279 def : Pat<(i32 (vector_extract v16i8:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002280 (i32 VectorExtractions.LE_BYTE_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002281 def : Pat<(i32 (vector_extract v16i8:$S, 8)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002282 (i32 VectorExtractions.LE_BYTE_8)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002283 def : Pat<(i32 (vector_extract v16i8:$S, 9)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002284 (i32 VectorExtractions.LE_BYTE_9)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002285 def : Pat<(i32 (vector_extract v16i8:$S, 10)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002286 (i32 VectorExtractions.LE_BYTE_10)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002287 def : Pat<(i32 (vector_extract v16i8:$S, 11)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002288 (i32 VectorExtractions.LE_BYTE_11)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002289 def : Pat<(i32 (vector_extract v16i8:$S, 12)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002290 (i32 VectorExtractions.LE_BYTE_12)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002291 def : Pat<(i32 (vector_extract v16i8:$S, 13)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002292 (i32 VectorExtractions.LE_BYTE_13)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002293 def : Pat<(i32 (vector_extract v16i8:$S, 14)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002294 (i32 VectorExtractions.LE_BYTE_14)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002295 def : Pat<(i32 (vector_extract v16i8:$S, 15)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002296 (i32 VectorExtractions.LE_BYTE_15)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002297 def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002298 (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
Nemanja Ivanovic1c39ca62015-08-13 17:40:44 +00002299
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002300 // v8i16 scalar <-> vector conversions (LE)
2301 def : Pat<(i32 (vector_extract v8i16:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002302 (i32 VectorExtractions.LE_HALF_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002303 def : Pat<(i32 (vector_extract v8i16:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002304 (i32 VectorExtractions.LE_HALF_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002305 def : Pat<(i32 (vector_extract v8i16:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002306 (i32 VectorExtractions.LE_HALF_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002307 def : Pat<(i32 (vector_extract v8i16:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002308 (i32 VectorExtractions.LE_HALF_3)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002309 def : Pat<(i32 (vector_extract v8i16:$S, 4)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002310 (i32 VectorExtractions.LE_HALF_4)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002311 def : Pat<(i32 (vector_extract v8i16:$S, 5)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002312 (i32 VectorExtractions.LE_HALF_5)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002313 def : Pat<(i32 (vector_extract v8i16:$S, 6)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002314 (i32 VectorExtractions.LE_HALF_6)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002315 def : Pat<(i32 (vector_extract v8i16:$S, 7)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002316 (i32 VectorExtractions.LE_HALF_7)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002317 def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002318 (i32 VectorExtractions.LE_VARIABLE_HALF)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002319
2320 // v4i32 scalar <-> vector conversions (LE)
2321 def : Pat<(i32 (vector_extract v4i32:$S, 0)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002322 (i32 VectorExtractions.LE_WORD_0)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002323 def : Pat<(i32 (vector_extract v4i32:$S, 1)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002324 (i32 VectorExtractions.LE_WORD_1)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002325 def : Pat<(i32 (vector_extract v4i32:$S, 2)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002326 (i32 VectorExtractions.LE_WORD_2)>;
Nemanja Ivanovicd3896572015-10-09 11:12:18 +00002327 def : Pat<(i32 (vector_extract v4i32:$S, 3)),
Nemanja Ivanovicac8d01a2015-12-10 13:35:28 +00002328 (i32 VectorExtractions.LE_WORD_3)>;
2329 def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
2330 (i32 VectorExtractions.LE_VARIABLE_WORD)>;
Zaara Syeda48cb3c12017-11-27 17:11:03 +00002331} // IsLittleEndian, HasDirectMove, NoP9Altivec
Nemanja Ivanovic89224762015-12-15 14:50:34 +00002332
2333let Predicates = [HasDirectMove, HasVSX] in {
2334// bitconvert f32 -> i32
2335// (convert to 32-bit fp single, shift right 1 word, move to GPR)
2336def : Pat<(i32 (bitconvert f32:$S)),
2337 (i32 (MFVSRWZ (EXTRACT_SUBREG
Lei Huangcd4f3852018-03-12 19:26:18 +00002338 (XXSLDWI (XSCVDPSPN $S), (XSCVDPSPN $S), 3),
Nemanja Ivanovic89224762015-12-15 14:50:34 +00002339 sub_64)))>;
2340// bitconvert i32 -> f32
2341// (move to FPR, shift left 1 word, convert to 64-bit fp single)
2342def : Pat<(f32 (bitconvert i32:$A)),
2343 (f32 (XSCVSPDPN
2344 (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
2345
2346// bitconvert f64 -> i64
2347// (move to GPR, nothing else needed)
2348def : Pat<(i64 (bitconvert f64:$S)),
2349 (i64 (MFVSRD $S))>;
2350
2351// bitconvert i64 -> f64
2352// (move to FPR, nothing else needed)
2353def : Pat<(f64 (bitconvert i64:$S)),
2354 (f64 (MTVSRD $S))>;
2355}
Kit Barton93612ec2016-02-26 21:11:55 +00002356
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00002357// Materialize a zero-vector of long long
2358def : Pat<(v2i64 immAllZerosV),
2359 (v2i64 (XXLXORz))>;
2360}
2361
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002362def AlignValues {
2363 dag F32_TO_BE_WORD1 = (v4f32 (XXSLDWI (XSCVDPSPN $B), (XSCVDPSPN $B), 3));
2364 dag I32_TO_BE_WORD1 = (COPY_TO_REGCLASS (MTVSRWZ $B), VSRC);
2365}
2366
Kit Barton93612ec2016-02-26 21:11:55 +00002367// The following VSX instructions were introduced in Power ISA 3.0
2368def HasP9Vector : Predicate<"PPCSubTarget->hasP9Vector()">;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002369let AddedComplexity = 400, Predicates = [HasP9Vector] in {
Kit Barton93612ec2016-02-26 21:11:55 +00002370
2371 // [PO VRT XO VRB XO /]
2372 class X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2373 list<dag> pattern>
2374 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB),
2375 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
2376
2377 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
2378 class X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2379 list<dag> pattern>
2380 : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isDOT;
2381
2382 // [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less),
2383 // So we use different operand class for VRB
2384 class X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2385 RegisterOperand vbtype, list<dag> pattern>
2386 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB),
2387 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
2388
Lei Huang6270ab62018-07-04 21:59:16 +00002389 // [PO VRT XO VRB XO /]
2390 class X_VT5_XO5_VB5_VSFR<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2391 list<dag> pattern>
2392 : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vfrc:$vT), (ins vrrc:$vB),
2393 !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
2394
2395 // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
2396 class X_VT5_XO5_VB5_VSFR_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
2397 list<dag> pattern>
2398 : X_VT5_XO5_VB5_VSFR<opcode, xo2, xo, opc, pattern>, isDOT;
2399
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002400 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002401 // [PO T XO B XO BX /]
2402 class XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
2403 list<dag> pattern>
2404 : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB),
2405 !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>;
2406
Kit Barton93612ec2016-02-26 21:11:55 +00002407 // [PO T XO B XO BX TX]
2408 class XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
2409 RegisterOperand vtype, list<dag> pattern>
2410 : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB),
2411 !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>;
2412
2413 // [PO T A B XO AX BX TX], src and dest register use different operand class
2414 class XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc,
2415 RegisterOperand xty, RegisterOperand aty, RegisterOperand bty,
2416 InstrItinClass itin, list<dag> pattern>
2417 : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB),
2418 !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002419 } // UseVSXReg = 1
Kit Barton93612ec2016-02-26 21:11:55 +00002420
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002421 // [PO VRT VRA VRB XO /]
2422 class X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
2423 list<dag> pattern>
2424 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB),
2425 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>;
2426
2427 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
2428 class X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc,
2429 list<dag> pattern>
2430 : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isDOT;
2431
Lei Huang09fda632018-04-04 16:43:50 +00002432 // [PO VRT VRA VRB XO /]
2433 class X_VT5_VA5_VB5_FMA<bits<6> opcode, bits<10> xo, string opc,
2434 list<dag> pattern>
2435 : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vTi, vrrc:$vA, vrrc:$vB),
2436 !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>,
2437 RegConstraint<"$vTi = $vT">, NoEncode<"$vTi">;
2438
2439 // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
2440 class X_VT5_VA5_VB5_FMA_Ro<bits<6> opcode, bits<10> xo, string opc,
2441 list<dag> pattern>
2442 : X_VT5_VA5_VB5_FMA<opcode, xo, opc, pattern>, isDOT;
2443
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002444 //===--------------------------------------------------------------------===//
2445 // Quad-Precision Scalar Move Instructions:
2446
2447 // Copy Sign
Lei Huangecfede92018-03-19 19:22:52 +00002448 def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp",
2449 [(set f128:$vT,
2450 (fcopysign f128:$vB, f128:$vA))]>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002451
2452 // Absolute/Negative-Absolute/Negate
Lei Huangecfede92018-03-19 19:22:52 +00002453 def XSABSQP : X_VT5_XO5_VB5<63, 0, 804, "xsabsqp",
2454 [(set f128:$vT, (fabs f128:$vB))]>;
2455 def XSNABSQP : X_VT5_XO5_VB5<63, 8, 804, "xsnabsqp",
2456 [(set f128:$vT, (fneg (fabs f128:$vB)))]>;
2457 def XSNEGQP : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp",
2458 [(set f128:$vT, (fneg f128:$vB))]>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002459
2460 //===--------------------------------------------------------------------===//
2461 // Quad-Precision Scalar Floating-Point Arithmetic Instructions:
2462
2463 // Add/Divide/Multiply/Subtract
Lei Huang6d1596a2018-03-19 18:52:20 +00002464 let isCommutable = 1 in {
2465 def XSADDQP : X_VT5_VA5_VB5 <63, 4, "xsaddqp",
2466 [(set f128:$vT, (fadd f128:$vA, f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002467 def XSADDQPO : X_VT5_VA5_VB5_Ro<63, 4, "xsaddqpo",
2468 [(set f128:$vT,
2469 (int_ppc_addf128_round_to_odd
2470 f128:$vA, f128:$vB))]>;
Lei Huang6d1596a2018-03-19 18:52:20 +00002471 def XSMULQP : X_VT5_VA5_VB5 <63, 36, "xsmulqp",
2472 [(set f128:$vT, (fmul f128:$vA, f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002473 def XSMULQPO : X_VT5_VA5_VB5_Ro<63, 36, "xsmulqpo",
2474 [(set f128:$vT,
2475 (int_ppc_mulf128_round_to_odd
2476 f128:$vA, f128:$vB))]>;
Lei Huang6d1596a2018-03-19 18:52:20 +00002477 }
2478
2479 def XSSUBQP : X_VT5_VA5_VB5 <63, 516, "xssubqp" ,
2480 [(set f128:$vT, (fsub f128:$vA, f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002481 def XSSUBQPO : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo",
2482 [(set f128:$vT,
2483 (int_ppc_subf128_round_to_odd
2484 f128:$vA, f128:$vB))]>;
Lei Huang6d1596a2018-03-19 18:52:20 +00002485 def XSDIVQP : X_VT5_VA5_VB5 <63, 548, "xsdivqp",
2486 [(set f128:$vT, (fdiv f128:$vA, f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002487 def XSDIVQPO : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo",
2488 [(set f128:$vT,
2489 (int_ppc_divf128_round_to_odd
2490 f128:$vA, f128:$vB))]>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002491
2492 // Square-Root
Lei Huangecfede92018-03-19 19:22:52 +00002493 def XSSQRTQP : X_VT5_XO5_VB5 <63, 27, 804, "xssqrtqp",
2494 [(set f128:$vT, (fsqrt f128:$vB))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002495 def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo",
2496 [(set f128:$vT,
2497 (int_ppc_sqrtf128_round_to_odd f128:$vB))]>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002498
2499 // (Negative) Multiply-{Add/Subtract}
Lei Huang09fda632018-04-04 16:43:50 +00002500 def XSMADDQP : X_VT5_VA5_VB5_FMA <63, 388, "xsmaddqp",
2501 [(set f128:$vT,
2502 (fma f128:$vA, f128:$vB,
2503 f128:$vTi))]>;
Stefan Pintilie83a5fe12018-07-09 18:50:06 +00002504
2505 def XSMADDQPO : X_VT5_VA5_VB5_FMA_Ro<63, 388, "xsmaddqpo",
2506 [(set f128:$vT,
2507 (int_ppc_fmaf128_round_to_odd
2508 f128:$vA,f128:$vB,f128:$vTi))]>;
2509
Lei Huang09fda632018-04-04 16:43:50 +00002510 def XSMSUBQP : X_VT5_VA5_VB5_FMA <63, 420, "xsmsubqp" ,
2511 [(set f128:$vT,
2512 (fma f128:$vA, f128:$vB,
2513 (fneg f128:$vTi)))]>;
Stefan Pintilieb9d01aa2018-07-11 01:42:22 +00002514 def XSMSUBQPO : X_VT5_VA5_VB5_FMA_Ro<63, 420, "xsmsubqpo" ,
2515 [(set f128:$vT,
2516 (int_ppc_fmaf128_round_to_odd
2517 f128:$vA, f128:$vB, (fneg f128:$vTi)))]>;
Lei Huang09fda632018-04-04 16:43:50 +00002518 def XSNMADDQP : X_VT5_VA5_VB5_FMA <63, 452, "xsnmaddqp",
2519 [(set f128:$vT,
2520 (fneg (fma f128:$vA, f128:$vB,
2521 f128:$vTi)))]>;
Stefan Pintilieb9d01aa2018-07-11 01:42:22 +00002522 def XSNMADDQPO: X_VT5_VA5_VB5_FMA_Ro<63, 452, "xsnmaddqpo",
2523 [(set f128:$vT,
2524 (fneg (int_ppc_fmaf128_round_to_odd
2525 f128:$vA, f128:$vB, f128:$vTi)))]>;
Lei Huang09fda632018-04-04 16:43:50 +00002526 def XSNMSUBQP : X_VT5_VA5_VB5_FMA <63, 484, "xsnmsubqp",
2527 [(set f128:$vT,
2528 (fneg (fma f128:$vA, f128:$vB,
2529 (fneg f128:$vTi))))]>;
Stefan Pintilieb9d01aa2018-07-11 01:42:22 +00002530 def XSNMSUBQPO: X_VT5_VA5_VB5_FMA_Ro<63, 484, "xsnmsubqpo",
2531 [(set f128:$vT,
2532 (fneg (int_ppc_fmaf128_round_to_odd
2533 f128:$vA, f128:$vB, (fneg f128:$vTi))))]>;
Lei Huang09fda632018-04-04 16:43:50 +00002534
2535 // Additional fnmsub patterns: -a*c + b == -(a*c - b)
2536 def : Pat<(fma (fneg f128:$A), f128:$C, f128:$B), (XSNMSUBQP $B, $C, $A)>;
2537 def : Pat<(fma f128:$A, (fneg f128:$C), f128:$B), (XSNMSUBQP $B, $C, $A)>;
Chuang-Yu Cheng56638482016-03-28 07:38:01 +00002538
Kit Barton93612ec2016-02-26 21:11:55 +00002539 //===--------------------------------------------------------------------===//
2540 // Quad/Double-Precision Compare Instructions:
2541
2542 // [PO BF // VRA VRB XO /]
2543 class X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
2544 list<dag> pattern>
2545 : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB),
2546 !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> {
2547 let Pattern = pattern;
2548 }
2549
2550 // QP Compare Ordered/Unordered
2551 def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>;
2552 def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>;
2553
2554 // DP/QP Compare Exponents
2555 def XSCMPEXPDP : XX3Form_1<60, 59,
2556 (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002557 "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>,
2558 UseVSXReg;
Kit Barton93612ec2016-02-26 21:11:55 +00002559 def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>;
2560
2561 // DP Compare ==, >=, >, !=
2562 // Use vsrc for XT, because the entire register of XT is set.
2563 // XT.dword[1] = 0x0000_0000_0000_0000
2564 def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc,
2565 IIC_FPCompare, []>;
2566 def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc,
2567 IIC_FPCompare, []>;
2568 def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc,
2569 IIC_FPCompare, []>;
Kit Barton93612ec2016-02-26 21:11:55 +00002570
2571 //===--------------------------------------------------------------------===//
2572 // Quad-Precision Floating-Point Conversion Instructions:
2573
2574 // Convert DP -> QP
Lei Huangd17c39c2018-07-05 04:18:37 +00002575 def XSCVDPQP : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vfrc,
2576 [(set f128:$vT, (fpextend f64:$vB))]>;
Kit Barton93612ec2016-02-26 21:11:55 +00002577
2578 // Round & Convert QP -> DP (dword[1] is set to zero)
Lei Huang6270ab62018-07-04 21:59:16 +00002579 def XSCVQPDP : X_VT5_XO5_VB5_VSFR<63, 20, 836, "xscvqpdp" , []>;
Stefan Pintilie58e3e0a2018-07-09 20:09:22 +00002580 def XSCVQPDPO : X_VT5_XO5_VB5_VSFR_Ro<63, 20, 836, "xscvqpdpo",
2581 [(set f64:$vT,
2582 (int_ppc_truncf128_round_to_odd
2583 f128:$vB))]>;
Kit Barton93612ec2016-02-26 21:11:55 +00002584
2585 // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero)
2586 def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>;
2587 def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>;
2588 def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>;
2589 def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>;
2590
Lei Huangc517e952018-05-08 18:23:31 +00002591 // Convert (Un)Signed DWord -> QP.
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002592 def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vfrc, []>;
Lei Huang10367eb2018-04-12 18:00:14 +00002593 def : Pat<(f128 (sint_to_fp i64:$src)),
2594 (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>;
Lei Huang66e22c22018-07-05 07:46:01 +00002595 def : Pat<(f128 (sint_to_fp (i64 (PPCmfvsr f64:$src)))),
2596 (f128 (XSCVSDQP $src))>;
2597 def : Pat<(f128 (sint_to_fp (i32 (PPCmfvsr f64:$src)))),
2598 (f128 (XSCVSDQP (VEXTSW2Ds $src)))>;
2599
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002600 def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vfrc, []>;
Lei Huang10367eb2018-04-12 18:00:14 +00002601 def : Pat<(f128 (uint_to_fp i64:$src)),
2602 (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>;
Lei Huang66e22c22018-07-05 07:46:01 +00002603 def : Pat<(f128 (uint_to_fp (i64 (PPCmfvsr f64:$src)))),
2604 (f128 (XSCVUDQP $src))>;
Kit Barton93612ec2016-02-26 21:11:55 +00002605
Lei Huangc517e952018-05-08 18:23:31 +00002606 // Convert (Un)Signed Word -> QP.
Lei Huang198e6782018-04-18 16:34:22 +00002607 def : Pat<(f128 (sint_to_fp i32:$src)),
2608 (f128 (XSCVSDQP (MTVSRWA $src)))>;
2609 def : Pat<(f128 (sint_to_fp (i32 (load xoaddr:$src)))),
2610 (f128 (XSCVSDQP (LIWAX xoaddr:$src)))>;
2611 def : Pat<(f128 (uint_to_fp i32:$src)),
2612 (f128 (XSCVUDQP (MTVSRWZ $src)))>;
2613 def : Pat<(f128 (uint_to_fp (i32 (load xoaddr:$src)))),
2614 (f128 (XSCVUDQP (LIWZX xoaddr:$src)))>;
2615
Sean Fertilea435e072016-11-14 18:43:59 +00002616 let UseVSXReg = 1 in {
Kit Barton93612ec2016-02-26 21:11:55 +00002617 //===--------------------------------------------------------------------===//
2618 // Round to Floating-Point Integer Instructions
2619
2620 // (Round &) Convert DP <-> HP
2621 // Note! xscvdphp's src and dest register both use the left 64 bits, so we use
2622 // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits,
2623 // but we still use vsfrc for it.
2624 def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>;
2625 def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>;
2626
2627 // Vector HP -> SP
2628 def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>;
Nemanja Ivanovicec4b0c32016-11-11 21:42:01 +00002629 def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc,
2630 [(set v4f32:$XT,
2631 (int_ppc_vsx_xvcvsphp v4f32:$XB))]>;
Kit Barton93612ec2016-02-26 21:11:55 +00002632
Sean Fertilea435e072016-11-14 18:43:59 +00002633 } // UseVSXReg = 1
2634
2635 // Pattern for matching Vector HP -> Vector SP intrinsic. Defined as a
Simon Pilgrim68168d12017-03-30 12:59:53 +00002636 // separate pattern so that it can convert the input register class from
Sean Fertilea435e072016-11-14 18:43:59 +00002637 // VRRC(v8i16) to VSRC.
2638 def : Pat<(v4f32 (int_ppc_vsx_xvcvhpsp v8i16:$A)),
2639 (v4f32 (XVCVHPSP (COPY_TO_REGCLASS $A, VSRC)))>;
2640
Kit Barton93612ec2016-02-26 21:11:55 +00002641 class Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc,
2642 list<dag> pattern>
Zaara Syeda421a5962018-05-14 15:45:15 +00002643 : Z23Form_8<opcode, xo,
Kit Barton93612ec2016-02-26 21:11:55 +00002644 (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc),
2645 !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> {
2646 let RC = ex;
2647 }
2648
2649 // Round to Quad-Precision Integer [with Inexact]
2650 def XSRQPI : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 0, "xsrqpi" , []>;
2651 def XSRQPIX : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 1, "xsrqpix", []>;
2652
Stefan Pintilie133acb22018-07-09 20:38:40 +00002653 // Use current rounding mode
2654 def : Pat<(f128 (fnearbyint f128:$vB)), (f128 (XSRQPI 0, $vB, 3))>;
2655 // Round to nearest, ties away from zero
2656 def : Pat<(f128 (fround f128:$vB)), (f128 (XSRQPI 0, $vB, 0))>;
2657 // Round towards Zero
2658 def : Pat<(f128 (ftrunc f128:$vB)), (f128 (XSRQPI 1, $vB, 1))>;
2659 // Round towards +Inf
2660 def : Pat<(f128 (fceil f128:$vB)), (f128 (XSRQPI 1, $vB, 2))>;
2661 // Round towards -Inf
2662 def : Pat<(f128 (ffloor f128:$vB)), (f128 (XSRQPI 1, $vB, 3))>;
2663
2664 // Use current rounding mode, [with Inexact]
2665 def : Pat<(f128 (frint f128:$vB)), (f128 (XSRQPIX 0, $vB, 3))>;
2666
Kit Barton93612ec2016-02-26 21:11:55 +00002667 // Round Quad-Precision to Double-Extended Precision (fp80)
2668 def XSRQPXP : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002669
2670 //===--------------------------------------------------------------------===//
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002671 // Insert/Extract Instructions
2672
2673 // Insert Exponent DP/QP
2674 // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU
2675 def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002676 "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>, UseVSXReg;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002677 // vB NOTE: only vB.dword[0] is used, that's why we don't use
2678 // X_VT5_VA5_VB5 form
2679 def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB),
2680 "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>;
2681
Stefan Pintilieb5305772018-09-24 18:14:13 +00002682 def : Pat<(f128 (int_ppc_scalar_insert_exp_qp f128:$vA, i64:$vB)),
2683 (f128 (XSIEXPQP $vA, (MTVSRD $vB)))>;
2684
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002685 // Extract Exponent/Significand DP/QP
2686 def XSXEXPDP : XX2_RT5_XO5_XB6<60, 0, 347, "xsxexpdp", []>;
2687 def XSXSIGDP : XX2_RT5_XO5_XB6<60, 1, 347, "xsxsigdp", []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002688
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002689 def XSXEXPQP : X_VT5_XO5_VB5 <63, 2, 804, "xsxexpqp", []>;
2690 def XSXSIGQP : X_VT5_XO5_VB5 <63, 18, 804, "xsxsigqp", []>;
2691
Stefan Pintilieb5305772018-09-24 18:14:13 +00002692 def : Pat<(i64 (int_ppc_scalar_extract_expq f128:$vA)),
2693 (i64 (MFVSRD (EXTRACT_SUBREG
2694 (v2i64 (XSXEXPQP $vA)), sub_64)))>;
2695
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002696 // Vector Insert Word
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002697 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002698 // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB.
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002699 def XXINSERTW :
2700 XX2_RD6_UIM5_RS6<60, 181, (outs vsrc:$XT),
2701 (ins vsrc:$XTi, vsrc:$XB, u4imm:$UIM),
2702 "xxinsertw $XT, $XB, $UIM", IIC_VecFP,
Tony Jiang61ef1c52017-09-05 18:08:02 +00002703 [(set v4i32:$XT, (PPCvecinsert v4i32:$XTi, v4i32:$XB,
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002704 imm32SExt16:$UIM))]>,
2705 RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002706
2707 // Vector Extract Unsigned Word
2708 def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165,
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002709 (outs vsfrc:$XT), (ins vsrc:$XB, u4imm:$UIMM),
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002710 "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002711 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002712
2713 // Vector Insert Exponent DP/SP
2714 def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc,
Nemanja Ivanovic0f459982016-10-26 19:03:40 +00002715 IIC_VecFP, [(set v2f64: $XT,(int_ppc_vsx_xviexpdp v2i64:$XA, v2i64:$XB))]>;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002716 def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc,
Nemanja Ivanovic0f459982016-10-26 19:03:40 +00002717 IIC_VecFP, [(set v4f32: $XT,(int_ppc_vsx_xviexpsp v4i32:$XA, v4i32:$XB))]>;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002718
2719 // Vector Extract Exponent/Significand DP/SP
Sean Fertileadda5b22016-11-14 14:42:37 +00002720 def XVXEXPDP : XX2_XT6_XO5_XB6<60, 0, 475, "xvxexpdp", vsrc,
2721 [(set v2i64: $XT,
2722 (int_ppc_vsx_xvxexpdp v2f64:$XB))]>;
2723 def XVXEXPSP : XX2_XT6_XO5_XB6<60, 8, 475, "xvxexpsp", vsrc,
2724 [(set v4i32: $XT,
2725 (int_ppc_vsx_xvxexpsp v4f32:$XB))]>;
2726 def XVXSIGDP : XX2_XT6_XO5_XB6<60, 1, 475, "xvxsigdp", vsrc,
2727 [(set v2i64: $XT,
2728 (int_ppc_vsx_xvxsigdp v2f64:$XB))]>;
2729 def XVXSIGSP : XX2_XT6_XO5_XB6<60, 9, 475, "xvxsigsp", vsrc,
2730 [(set v4i32: $XT,
2731 (int_ppc_vsx_xvxsigsp v4f32:$XB))]>;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002732
Sean Fertile1c4109b2016-12-09 17:21:42 +00002733 let AddedComplexity = 400, Predicates = [HasP9Vector] in {
2734 // Extra patterns expanding to vector Extract Word/Insert Word
2735 def : Pat<(v4i32 (int_ppc_vsx_xxinsertw v4i32:$A, v2i64:$B, imm:$IMM)),
2736 (v4i32 (XXINSERTW $A, $B, imm:$IMM))>;
2737 def : Pat<(v2i64 (int_ppc_vsx_xxextractuw v2i64:$A, imm:$IMM)),
2738 (v2i64 (COPY_TO_REGCLASS (XXEXTRACTUW $A, imm:$IMM), VSRC))>;
2739 } // AddedComplexity = 400, HasP9Vector
2740
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002741 //===--------------------------------------------------------------------===//
2742
2743 // Test Data Class SP/DP/QP
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002744 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002745 def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298,
2746 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2747 "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>;
2748 def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362,
2749 (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2750 "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002751 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002752 def XSTSTDCQP : X_BF3_DCMX7_RS5 <63, 708,
2753 (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB),
2754 "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>;
2755
2756 // Vector Test Data Class SP/DP
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002757 let UseVSXReg = 1 in {
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002758 def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5,
2759 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
Sean Fertileadda5b22016-11-14 14:42:37 +00002760 "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP,
2761 [(set v4i32: $XT,
2762 (int_ppc_vsx_xvtstdcsp v4f32:$XB, imm:$DCMX))]>;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002763 def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5,
2764 (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
Sean Fertileadda5b22016-11-14 14:42:37 +00002765 "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP,
2766 [(set v2i64: $XT,
2767 (int_ppc_vsx_xvtstdcdp v2f64:$XB, imm:$DCMX))]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002768 } // UseVSXReg = 1
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002769
2770 //===--------------------------------------------------------------------===//
2771
2772 // Maximum/Minimum Type-C/Type-J DP
2773 // XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU, so we use vsrc for XT
2774 def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsrc, vsfrc, vsfrc,
2775 IIC_VecFP, []>;
2776 def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc,
2777 IIC_VecFP, []>;
2778 def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsrc, vsfrc, vsfrc,
2779 IIC_VecFP, []>;
2780 def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc,
2781 IIC_VecFP, []>;
2782
2783 //===--------------------------------------------------------------------===//
2784
2785 // Vector Byte-Reverse H/W/D/Q Word
2786 def XXBRH : XX2_XT6_XO5_XB6<60, 7, 475, "xxbrh", vsrc, []>;
2787 def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, []>;
2788 def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, []>;
2789 def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>;
2790
Tony Jiang1a8eec12017-06-12 18:24:36 +00002791 // Vector Reverse
2792 def : Pat<(v8i16 (PPCxxreverse v8i16 :$A)),
2793 (v8i16 (COPY_TO_REGCLASS (XXBRH (COPY_TO_REGCLASS $A, VSRC)), VRRC))>;
2794 def : Pat<(v4i32 (PPCxxreverse v4i32 :$A)),
2795 (v4i32 (XXBRW $A))>;
2796 def : Pat<(v2i64 (PPCxxreverse v2i64 :$A)),
2797 (v2i64 (XXBRD $A))>;
2798 def : Pat<(v1i128 (PPCxxreverse v1i128 :$A)),
2799 (v1i128 (COPY_TO_REGCLASS (XXBRQ (COPY_TO_REGCLASS $A, VSRC)), VRRC))>;
2800
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002801 // Vector Permute
2802 def XXPERM : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc,
2803 IIC_VecPerm, []>;
2804 def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc,
2805 IIC_VecPerm, []>;
2806
2807 // Vector Splat Immediate Byte
2808 def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002809 "xxspltib $XT, $IMM8", IIC_VecPerm, []>, UseVSXReg;
Chuang-Yu Cheng80722712016-03-28 08:34:28 +00002810
2811 //===--------------------------------------------------------------------===//
Kit Bartonba532dc2016-03-08 03:49:13 +00002812 // Vector/Scalar Load/Store Instructions
2813
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00002814 // When adding new D-Form loads/stores, be sure to update the ImmToIdxMap in
2815 // PPCRegisterInfo::PPCRegisterInfo and maybe save yourself some debugging.
Sean Fertile3c8c3852017-01-26 18:59:15 +00002816 let mayLoad = 1, mayStore = 0 in {
Kit Bartonba532dc2016-03-08 03:49:13 +00002817 // Load Vector
2818 def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002819 "lxv $XT, $src", IIC_LdStLFD, []>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002820 // Load DWord
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002821 def LXSD : DSForm_1<57, 2, (outs vfrc:$vD), (ins memrix:$src),
Kit Bartonba532dc2016-03-08 03:49:13 +00002822 "lxsd $vD, $src", IIC_LdStLFD, []>;
2823 // Load SP from src, convert it to DP, and place in dword[0]
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002824 def LXSSP : DSForm_1<57, 3, (outs vfrc:$vD), (ins memrix:$src),
Kit Bartonba532dc2016-03-08 03:49:13 +00002825 "lxssp $vD, $src", IIC_LdStLFD, []>;
2826
2827 // [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different
2828 // "out" and "in" dag
2829 class X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2830 RegisterOperand vtype, list<dag> pattern>
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002831 : XX1Form_memOp<opcode, xo, (outs vtype:$XT), (ins memrr:$src),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002832 !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002833
2834 // Load as Integer Byte/Halfword & Zero Indexed
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002835 def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc,
2836 [(set f64:$XT, (PPClxsizx xoaddr:$src, 1))]>;
2837 def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc,
2838 [(set f64:$XT, (PPClxsizx xoaddr:$src, 2))]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002839
2840 // Load Vector Halfword*8/Byte*16 Indexed
2841 def LXVH8X : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>;
2842 def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>;
2843
2844 // Load Vector Indexed
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00002845 def LXVX : X_XT6_RA5_RB5<31, 268, "lxvx" , vsrc,
Zaara Syeda93297832017-05-24 17:50:37 +00002846 [(set v2f64:$XT, (load xaddr:$src))]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002847 // Load Vector (Left-justified) with Length
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002848 def LXVL : XX1Form_memOp<31, 269, (outs vsrc:$XT), (ins memr:$src, g8rc:$rB),
Zaara Syedaa19c9e62016-11-15 17:54:19 +00002849 "lxvl $XT, $src, $rB", IIC_LdStLoad,
2850 [(set v4i32:$XT, (int_ppc_vsx_lxvl addr:$src, i64:$rB))]>,
2851 UseVSXReg;
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002852 def LXVLL : XX1Form_memOp<31,301, (outs vsrc:$XT), (ins memr:$src, g8rc:$rB),
Zaara Syedaa19c9e62016-11-15 17:54:19 +00002853 "lxvll $XT, $src, $rB", IIC_LdStLoad,
2854 [(set v4i32:$XT, (int_ppc_vsx_lxvll addr:$src, i64:$rB))]>,
2855 UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002856
2857 // Load Vector Word & Splat Indexed
2858 def LXVWSX : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002859 } // mayLoad
Kit Bartonba532dc2016-03-08 03:49:13 +00002860
Nemanja Ivanovic6354d232016-10-04 11:25:52 +00002861 // When adding new D-Form loads/stores, be sure to update the ImmToIdxMap in
2862 // PPCRegisterInfo::PPCRegisterInfo and maybe save yourself some debugging.
Sean Fertile3c8c3852017-01-26 18:59:15 +00002863 let mayStore = 1, mayLoad = 0 in {
Kit Bartonba532dc2016-03-08 03:49:13 +00002864 // Store Vector
2865 def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002866 "stxv $XT, $dst", IIC_LdStSTFD, []>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002867 // Store DWord
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002868 def STXSD : DSForm_1<61, 2, (outs), (ins vfrc:$vS, memrix:$dst),
Kit Bartonba532dc2016-03-08 03:49:13 +00002869 "stxsd $vS, $dst", IIC_LdStSTFD, []>;
2870 // Convert DP of dword[0] to SP, and Store to dst
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002871 def STXSSP : DSForm_1<61, 3, (outs), (ins vfrc:$vS, memrix:$dst),
Kit Bartonba532dc2016-03-08 03:49:13 +00002872 "stxssp $vS, $dst", IIC_LdStSTFD, []>;
2873
2874 // [PO S RA RB XO SX]
2875 class X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2876 RegisterOperand vtype, list<dag> pattern>
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002877 : XX1Form_memOp<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst),
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002878 !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>, UseVSXReg;
Kit Bartonba532dc2016-03-08 03:49:13 +00002879
2880 // Store as Integer Byte/Halfword Indexed
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002881 def STXSIBX : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsfrc,
2882 [(PPCstxsix f64:$XT, xoaddr:$dst, 1)]>;
2883 def STXSIHX : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsfrc,
2884 [(PPCstxsix f64:$XT, xoaddr:$dst, 2)]>;
2885 let isCodeGenOnly = 1 in {
2886 def STXSIBXv : X_XS6_RA5_RB5<31, 909, "stxsibx" , vrrc, []>;
2887 def STXSIHXv : X_XS6_RA5_RB5<31, 941, "stxsihx" , vrrc, []>;
2888 }
Kit Bartonba532dc2016-03-08 03:49:13 +00002889
2890 // Store Vector Halfword*8/Byte*16 Indexed
2891 def STXVH8X : X_XS6_RA5_RB5<31, 940, "stxvh8x" , vsrc, []>;
2892 def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>;
2893
2894 // Store Vector Indexed
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00002895 def STXVX : X_XS6_RA5_RB5<31, 396, "stxvx" , vsrc,
Zaara Syeda93297832017-05-24 17:50:37 +00002896 [(store v2f64:$XT, xaddr:$dst)]>;
Kit Bartonba532dc2016-03-08 03:49:13 +00002897
2898 // Store Vector (Left-justified) with Length
Stefan Pintilie26d4f922018-03-26 17:39:18 +00002899 def STXVL : XX1Form_memOp<31, 397, (outs),
2900 (ins vsrc:$XT, memr:$dst, g8rc:$rB),
2901 "stxvl $XT, $dst, $rB", IIC_LdStLoad,
2902 [(int_ppc_vsx_stxvl v4i32:$XT, addr:$dst,
2903 i64:$rB)]>,
2904 UseVSXReg;
2905 def STXVLL : XX1Form_memOp<31, 429, (outs),
2906 (ins vsrc:$XT, memr:$dst, g8rc:$rB),
2907 "stxvll $XT, $dst, $rB", IIC_LdStLoad,
2908 [(int_ppc_vsx_stxvll v4i32:$XT, addr:$dst,
2909 i64:$rB)]>,
2910 UseVSXReg;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00002911 } // mayStore
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002912
Lei Huang451ef4a2017-08-14 18:09:29 +00002913 let Predicates = [IsLittleEndian] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00002914 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002915 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 3))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002916 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002917 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 2))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002918 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002919 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 1))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002920 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002921 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 0))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002922 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002923 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 3)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002924 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002925 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 2)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002926 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002927 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 1)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002928 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002929 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 0)), VSFRC))>;
2930 }
2931
2932 let Predicates = [IsBigEndian] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00002933 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002934 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 0))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002935 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002936 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 1))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002937 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002938 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 2))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002939 def: Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002940 (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 3))))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002941 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002942 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 0)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002943 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002944 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 1)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002945 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002946 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 2)), VSFRC))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002947 def: Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002948 (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 3)), VSFRC))>;
2949 }
2950
Graham Yiu5cd044e2017-11-07 20:55:43 +00002951 // Alternate patterns for PPCmtvsrz where the output is v8i16 or v16i8 instead
2952 // of f64
2953 def : Pat<(v8i16 (PPCmtvsrz i32:$A)),
2954 (v8i16 (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64))>;
2955 def : Pat<(v16i8 (PPCmtvsrz i32:$A)),
2956 (v16i8 (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64))>;
2957
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002958 // Patterns for which instructions from ISA 3.0 are a better match
2959 let Predicates = [IsLittleEndian, HasP9Vector] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00002960 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002961 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002962 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002963 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002964 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002965 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002966 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002967 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002968 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002969 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 12)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002970 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002971 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 8)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002972 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002973 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 4)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002974 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00002975 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 0)))>;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002976 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
2977 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
2978 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
2979 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
2980 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
2981 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
2982 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
2983 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
2984 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
2985 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
2986 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
2987 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
2988 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
2989 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
2990 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
2991 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
2992 } // IsLittleEndian, HasP9Vector
2993
2994 let Predicates = [IsBigEndian, HasP9Vector] in {
Lei Huangcd4f3852018-03-12 19:26:18 +00002995 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002996 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002997 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00002998 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00002999 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00003000 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003001 def : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))),
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00003002 (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003003 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00003004 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 0)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003005 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00003006 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 4)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003007 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00003008 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 8)))>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003009 def : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))),
Lei Huang451ef4a2017-08-14 18:09:29 +00003010 (f64 (XSCVUXDDP (XXEXTRACTUW $A, 12)))>;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +00003011 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
3012 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
3013 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
3014 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
3015 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
3016 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
3017 def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
3018 (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
3019 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
3020 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
3021 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
3022 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
3023 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
3024 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
3025 def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
3026 (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
3027 } // IsLittleEndian, HasP9Vector
Nemanja Ivanovic6e7879c2016-09-22 09:52:19 +00003028
Zaara Syeda93297832017-05-24 17:50:37 +00003029 // D-Form Load/Store
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003030 def : Pat<(v4i32 (quadwOffsetLoad iqaddr:$src)), (LXV memrix16:$src)>;
3031 def : Pat<(v4f32 (quadwOffsetLoad iqaddr:$src)), (LXV memrix16:$src)>;
3032 def : Pat<(v2i64 (quadwOffsetLoad iqaddr:$src)), (LXV memrix16:$src)>;
3033 def : Pat<(v2f64 (quadwOffsetLoad iqaddr:$src)), (LXV memrix16:$src)>;
Lei Huang6d1596a2018-03-19 18:52:20 +00003034 def : Pat<(f128 (quadwOffsetLoad iqaddr:$src)),
3035 (COPY_TO_REGCLASS (LXV memrix16:$src), VRRC)>;
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003036 def : Pat<(v4i32 (int_ppc_vsx_lxvw4x iqaddr:$src)), (LXV memrix16:$src)>;
3037 def : Pat<(v2f64 (int_ppc_vsx_lxvd2x iqaddr:$src)), (LXV memrix16:$src)>;
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00003038
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003039 def : Pat<(quadwOffsetStore v4f32:$rS, iqaddr:$dst), (STXV $rS, memrix16:$dst)>;
3040 def : Pat<(quadwOffsetStore v4i32:$rS, iqaddr:$dst), (STXV $rS, memrix16:$dst)>;
3041 def : Pat<(quadwOffsetStore v2f64:$rS, iqaddr:$dst), (STXV $rS, memrix16:$dst)>;
Lei Huang6d1596a2018-03-19 18:52:20 +00003042 def : Pat<(quadwOffsetStore f128:$rS, iqaddr:$dst),
3043 (STXV (COPY_TO_REGCLASS $rS, VSRC), memrix16:$dst)>;
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003044 def : Pat<(quadwOffsetStore v2i64:$rS, iqaddr:$dst), (STXV $rS, memrix16:$dst)>;
3045 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, iqaddr:$dst),
Zaara Syeda93297832017-05-24 17:50:37 +00003046 (STXV $rS, memrix16:$dst)>;
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003047 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, iqaddr:$dst),
Zaara Syeda93297832017-05-24 17:50:37 +00003048 (STXV $rS, memrix16:$dst)>;
3049
3050
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003051 def : Pat<(v2f64 (nonQuadwOffsetLoad xoaddr:$src)), (LXVX xoaddr:$src)>;
3052 def : Pat<(v2i64 (nonQuadwOffsetLoad xoaddr:$src)), (LXVX xoaddr:$src)>;
3053 def : Pat<(v4f32 (nonQuadwOffsetLoad xoaddr:$src)), (LXVX xoaddr:$src)>;
3054 def : Pat<(v4i32 (nonQuadwOffsetLoad xoaddr:$src)), (LXVX xoaddr:$src)>;
3055 def : Pat<(v4i32 (int_ppc_vsx_lxvw4x xoaddr:$src)), (LXVX xoaddr:$src)>;
3056 def : Pat<(v2f64 (int_ppc_vsx_lxvd2x xoaddr:$src)), (LXVX xoaddr:$src)>;
Lei Huang6d1596a2018-03-19 18:52:20 +00003057 def : Pat<(f128 (nonQuadwOffsetLoad xoaddr:$src)),
3058 (COPY_TO_REGCLASS (LXVX xoaddr:$src), VRRC)>;
3059 def : Pat<(nonQuadwOffsetStore f128:$rS, xoaddr:$dst),
3060 (STXVX (COPY_TO_REGCLASS $rS, VSRC), xoaddr:$dst)>;
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003061 def : Pat<(nonQuadwOffsetStore v2f64:$rS, xoaddr:$dst),
3062 (STXVX $rS, xoaddr:$dst)>;
3063 def : Pat<(nonQuadwOffsetStore v2i64:$rS, xoaddr:$dst),
3064 (STXVX $rS, xoaddr:$dst)>;
3065 def : Pat<(nonQuadwOffsetStore v4f32:$rS, xoaddr:$dst),
3066 (STXVX $rS, xoaddr:$dst)>;
3067 def : Pat<(nonQuadwOffsetStore v4i32:$rS, xoaddr:$dst),
3068 (STXVX $rS, xoaddr:$dst)>;
3069 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
3070 (STXVX $rS, xoaddr:$dst)>;
3071 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
3072 (STXVX $rS, xoaddr:$dst)>;
Zaara Syedab2595b92018-08-08 15:20:43 +00003073
3074 let AddedComplexity = 400 in {
3075 // LIWAX - This instruction is used for sign extending i32 -> i64.
3076 // LIWZX - This instruction will be emitted for i32, f32, and when
3077 // zero-extending i32 to i64 (zext i32 -> i64).
3078 let Predicates = [IsLittleEndian] in {
3079
3080 def : Pat<(v2i64 (scalar_to_vector (i64 (sextloadi32 xoaddr:$src)))),
3081 (v2i64 (XXPERMDIs
3082 (COPY_TO_REGCLASS (LIWAX xoaddr:$src), VSRC), 2))>;
3083
3084 def : Pat<(v2i64 (scalar_to_vector (i64 (zextloadi32 xoaddr:$src)))),
3085 (v2i64 (XXPERMDIs
3086 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 2))>;
3087
3088 def : Pat<(v4i32 (scalar_to_vector (i32 (load xoaddr:$src)))),
3089 (v4i32 (XXPERMDIs
3090 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 2))>;
3091
3092 def : Pat<(v4f32 (scalar_to_vector (f32 (load xoaddr:$src)))),
3093 (v4f32 (XXPERMDIs
3094 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 2))>;
3095 }
3096
3097 let Predicates = [IsBigEndian] in {
3098 def : Pat<(v2i64 (scalar_to_vector (i64 (sextloadi32 xoaddr:$src)))),
3099 (v2i64 (COPY_TO_REGCLASS (LIWAX xoaddr:$src), VSRC))>;
3100
3101 def : Pat<(v2i64 (scalar_to_vector (i64 (zextloadi32 xoaddr:$src)))),
3102 (v2i64 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC))>;
3103
3104 def : Pat<(v4i32 (scalar_to_vector (i32 (load xoaddr:$src)))),
3105 (v4i32 (XXSLDWIs
3106 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 1))>;
3107
3108 def : Pat<(v4f32 (scalar_to_vector (f32 (load xoaddr:$src)))),
3109 (v4f32 (XXSLDWIs
3110 (COPY_TO_REGCLASS (LIWZX xoaddr:$src), VSRC), 1))>;
3111 }
3112
3113 }
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003114
3115 // Build vectors from i8 loads
3116 def : Pat<(v16i8 (scalar_to_vector ScalarLoads.Li8)),
3117 (v16i8 (VSPLTBs 7, (LXSIBZX xoaddr:$src)))>;
3118 def : Pat<(v8i16 (scalar_to_vector ScalarLoads.ZELi8)),
3119 (v8i16 (VSPLTHs 3, (LXSIBZX xoaddr:$src)))>;
3120 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.ZELi8)),
3121 (v4i32 (XXSPLTWs (LXSIBZX xoaddr:$src), 1))>;
3122 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.ZELi8i64)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003123 (v2i64 (XXPERMDIs (LXSIBZX xoaddr:$src), 0))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003124 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.SELi8)),
3125 (v4i32 (XXSPLTWs (VEXTSB2Ws (LXSIBZX xoaddr:$src)), 1))>;
3126 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.SELi8i64)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003127 (v2i64 (XXPERMDIs (VEXTSB2Ds (LXSIBZX xoaddr:$src)), 0))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003128
3129 // Build vectors from i16 loads
3130 def : Pat<(v8i16 (scalar_to_vector ScalarLoads.Li16)),
3131 (v8i16 (VSPLTHs 3, (LXSIHZX xoaddr:$src)))>;
3132 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.ZELi16)),
3133 (v4i32 (XXSPLTWs (LXSIHZX xoaddr:$src), 1))>;
3134 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.ZELi16i64)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003135 (v2i64 (XXPERMDIs (LXSIHZX xoaddr:$src), 0))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003136 def : Pat<(v4i32 (scalar_to_vector ScalarLoads.SELi16)),
3137 (v4i32 (XXSPLTWs (VEXTSH2Ws (LXSIHZX xoaddr:$src)), 1))>;
3138 def : Pat<(v2i64 (scalar_to_vector ScalarLoads.SELi16i64)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003139 (v2i64 (XXPERMDIs (VEXTSH2Ds (LXSIHZX xoaddr:$src)), 0))>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003140
3141 let Predicates = [IsBigEndian, HasP9Vector] in {
3142 // Scalar stores of i8
3143 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 0)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003144 (STXSIBXv (v16i8 (VSLDOI $S, $S, 9)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003145 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 1)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003146 (STXSIBXv (v16i8 (VSLDOI $S, $S, 10)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003147 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 2)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003148 (STXSIBXv (v16i8 (VSLDOI $S, $S, 11)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003149 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 3)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003150 (STXSIBXv (v16i8 (VSLDOI $S, $S, 12)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003151 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 4)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003152 (STXSIBXv (v16i8 (VSLDOI $S, $S, 13)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003153 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 5)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003154 (STXSIBXv (v16i8 (VSLDOI $S, $S, 14)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003155 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 6)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003156 (STXSIBXv (v16i8 (VSLDOI $S, $S, 15)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003157 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 7)), xoaddr:$dst),
3158 (STXSIBXv $S, xoaddr:$dst)>;
3159 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 8)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003160 (STXSIBXv (v16i8 (VSLDOI $S, $S, 1)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003161 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 9)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003162 (STXSIBXv (v16i8 (VSLDOI $S, $S, 2)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003163 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 10)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003164 (STXSIBXv (v16i8 (VSLDOI $S, $S, 3)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003165 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 11)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003166 (STXSIBXv (v16i8 (VSLDOI $S, $S, 4)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003167 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 12)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003168 (STXSIBXv (v16i8 (VSLDOI $S, $S, 5)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003169 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 13)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003170 (STXSIBXv (v16i8 (VSLDOI $S, $S, 6)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003171 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 14)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003172 (STXSIBXv (v16i8 (VSLDOI $S, $S, 7)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003173 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 15)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003174 (STXSIBXv (v16i8 (VSLDOI $S, $S, 8)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003175
3176 // Scalar stores of i16
3177 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 0)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003178 (STXSIHXv (v16i8 (VSLDOI $S, $S, 10)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003179 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 1)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003180 (STXSIHXv (v16i8 (VSLDOI $S, $S, 12)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003181 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 2)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003182 (STXSIHXv (v16i8 (VSLDOI $S, $S, 14)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003183 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 3)), xoaddr:$dst),
3184 (STXSIHXv $S, xoaddr:$dst)>;
3185 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 4)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003186 (STXSIHXv (v16i8 (VSLDOI $S, $S, 2)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003187 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 5)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003188 (STXSIHXv (v16i8 (VSLDOI $S, $S, 4)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003189 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 6)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003190 (STXSIHXv (v16i8 (VSLDOI $S, $S, 6)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003191 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 7)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003192 (STXSIHXv (v16i8 (VSLDOI $S, $S, 8)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003193 } // IsBigEndian, HasP9Vector
3194
3195 let Predicates = [IsLittleEndian, HasP9Vector] in {
3196 // Scalar stores of i8
3197 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 0)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003198 (STXSIBXv (v16i8 (VSLDOI $S, $S, 8)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003199 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 1)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003200 (STXSIBXv (v16i8 (VSLDOI $S, $S, 7)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003201 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 2)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003202 (STXSIBXv (v16i8 (VSLDOI $S, $S, 6)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003203 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 3)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003204 (STXSIBXv (v16i8 (VSLDOI $S, $S, 5)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003205 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 4)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003206 (STXSIBXv (v16i8 (VSLDOI $S, $S, 4)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003207 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 5)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003208 (STXSIBXv (v16i8 (VSLDOI $S, $S, 3)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003209 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 6)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003210 (STXSIBXv (v16i8 (VSLDOI $S, $S, 2)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003211 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 7)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003212 (STXSIBXv (v16i8 (VSLDOI $S, $S, 1)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003213 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 8)), xoaddr:$dst),
3214 (STXSIBXv $S, xoaddr:$dst)>;
3215 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 9)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003216 (STXSIBXv (v16i8 (VSLDOI $S, $S, 15)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003217 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 10)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003218 (STXSIBXv (v16i8 (VSLDOI $S, $S, 14)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003219 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 11)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003220 (STXSIBXv (v16i8 (VSLDOI $S, $S, 13)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003221 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 12)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003222 (STXSIBXv (v16i8 (VSLDOI $S, $S, 12)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003223 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 13)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003224 (STXSIBXv (v16i8 (VSLDOI $S, $S, 11)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003225 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 14)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003226 (STXSIBXv (v16i8 (VSLDOI $S, $S, 10)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003227 def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 15)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003228 (STXSIBXv (v16i8 (VSLDOI $S, $S, 9)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003229
3230 // Scalar stores of i16
3231 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 0)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003232 (STXSIHXv (v16i8 (VSLDOI $S, $S, 8)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003233 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 1)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003234 (STXSIHXv (v16i8 (VSLDOI $S, $S, 6)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003235 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 2)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003236 (STXSIHXv (v16i8 (VSLDOI $S, $S, 4)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003237 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 3)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003238 (STXSIHXv (v16i8 (VSLDOI $S, $S, 2)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003239 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 4)), xoaddr:$dst),
3240 (STXSIHXv $S, xoaddr:$dst)>;
3241 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 5)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003242 (STXSIHXv (v16i8 (VSLDOI $S, $S, 14)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003243 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 6)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003244 (STXSIHXv (v16i8 (VSLDOI $S, $S, 12)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003245 def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 7)), xoaddr:$dst),
Lei Huangcd4f3852018-03-12 19:26:18 +00003246 (STXSIHXv (v16i8 (VSLDOI $S, $S, 10)), xoaddr:$dst)>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003247 } // IsLittleEndian, HasP9Vector
3248
Sean Fertile1c4109b2016-12-09 17:21:42 +00003249
Nemanja Ivanovic11049f82016-10-04 06:59:23 +00003250 // Vector sign extensions
3251 def : Pat<(f64 (PPCVexts f64:$A, 1)),
3252 (f64 (COPY_TO_REGCLASS (VEXTSB2Ds $A), VSFRC))>;
3253 def : Pat<(f64 (PPCVexts f64:$A, 2)),
3254 (f64 (COPY_TO_REGCLASS (VEXTSH2Ds $A), VSFRC))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003255
Jinsong Jic7b43b92018-12-13 15:12:57 +00003256 def DFLOADf32 : PPCPostRAExpPseudo<(outs vssrc:$XT), (ins memrix:$src),
3257 "#DFLOADf32",
3258 [(set f32:$XT, (load ixaddr:$src))]>;
3259 def DFLOADf64 : PPCPostRAExpPseudo<(outs vsfrc:$XT), (ins memrix:$src),
3260 "#DFLOADf64",
3261 [(set f64:$XT, (load ixaddr:$src))]>;
3262 def DFSTOREf32 : PPCPostRAExpPseudo<(outs), (ins vssrc:$XT, memrix:$dst),
3263 "#DFSTOREf32",
3264 [(store f32:$XT, ixaddr:$dst)]>;
3265 def DFSTOREf64 : PPCPostRAExpPseudo<(outs), (ins vsfrc:$XT, memrix:$dst),
3266 "#DFSTOREf64",
3267 [(store f64:$XT, ixaddr:$dst)]>;
3268
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003269 def : Pat<(f64 (extloadf32 ixaddr:$src)),
3270 (COPY_TO_REGCLASS (DFLOADf32 ixaddr:$src), VSFRC)>;
Lei Huangcd4f3852018-03-12 19:26:18 +00003271 def : Pat<(f32 (fpround (f64 (extloadf32 ixaddr:$src)))),
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003272 (f32 (DFLOADf32 ixaddr:$src))>;
Lei Huang10367eb2018-04-12 18:00:14 +00003273
Zaara Syedab2595b92018-08-08 15:20:43 +00003274
3275 let AddedComplexity = 400 in {
3276 // The following pseudoinstructions are used to ensure the utilization
3277 // of all 64 VSX registers.
3278 let Predicates = [IsLittleEndian, HasP9Vector] in {
3279 def : Pat<(v2i64 (scalar_to_vector (i64 (load ixaddr:$src)))),
3280 (v2i64 (XXPERMDIs
3281 (COPY_TO_REGCLASS (DFLOADf64 ixaddr:$src), VSRC), 2))>;
3282 def : Pat<(v2i64 (scalar_to_vector (i64 (load xaddr:$src)))),
3283 (v2i64 (XXPERMDIs
3284 (COPY_TO_REGCLASS (XFLOADf64 xaddr:$src), VSRC), 2))>;
3285
3286 def : Pat<(v2f64 (scalar_to_vector (f64 (load ixaddr:$src)))),
3287 (v2f64 (XXPERMDIs
3288 (COPY_TO_REGCLASS (DFLOADf64 ixaddr:$src), VSRC), 2))>;
3289 def : Pat<(v2f64 (scalar_to_vector (f64 (load xaddr:$src)))),
3290 (v2f64 (XXPERMDIs
3291 (COPY_TO_REGCLASS (XFLOADf64 xaddr:$src), VSRC), 2))>;
3292 }
3293
3294 let Predicates = [IsBigEndian, HasP9Vector] in {
3295 def : Pat<(v2i64 (scalar_to_vector (i64 (load ixaddr:$src)))),
3296 (v2i64 (COPY_TO_REGCLASS (DFLOADf64 ixaddr:$src), VSRC))>;
3297 def : Pat<(v2i64 (scalar_to_vector (i64 (load xaddr:$src)))),
3298 (v2i64 (COPY_TO_REGCLASS (XFLOADf64 xaddr:$src), VSRC))>;
3299
3300 def : Pat<(v2f64 (scalar_to_vector (f64 (load ixaddr:$src)))),
3301 (v2f64 (COPY_TO_REGCLASS (DFLOADf64 ixaddr:$src), VSRC))>;
3302 def : Pat<(v2f64 (scalar_to_vector (f64 (load xaddr:$src)))),
3303 (v2f64 (COPY_TO_REGCLASS (XFLOADf64 xaddr:$src), VSRC))>;
3304 }
3305 }
3306
Lei Huang8b0da652018-05-23 19:31:54 +00003307 let Predicates = [IsBigEndian, HasP9Vector] in {
Lei Huang89901682018-05-23 18:36:51 +00003308
Lei Huang8b0da652018-05-23 19:31:54 +00003309 // (Un)Signed DWord vector extract -> QP
3310 def : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 0)))),
3311 (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>;
3312 def : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 1)))),
3313 (f128 (XSCVSDQP
3314 (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>;
3315 def : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 0)))),
3316 (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>;
3317 def : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 1)))),
3318 (f128 (XSCVUDQP
3319 (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>;
3320
3321 // (Un)Signed Word vector extract -> QP
3322 def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, 1)))),
3323 (f128 (XSCVSDQP (EXTRACT_SUBREG (VEXTSW2D $src), sub_64)))>;
3324 foreach Idx = [0,2,3] in {
3325 def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, Idx)))),
3326 (f128 (XSCVSDQP (EXTRACT_SUBREG
3327 (VEXTSW2D (VSPLTW Idx, $src)), sub_64)))>;
3328 }
3329 foreach Idx = 0-3 in {
3330 def : Pat<(f128 (uint_to_fp (i32 (extractelt v4i32:$src, Idx)))),
3331 (f128 (XSCVUDQP (XXEXTRACTUW $src, !shl(Idx, 2))))>;
3332 }
3333
Lei Huang651be442018-05-28 16:43:29 +00003334 // (Un)Signed HWord vector extract -> QP
3335 foreach Idx = 0-7 in {
3336 def : Pat<(f128 (sint_to_fp
3337 (i32 (sext_inreg
3338 (vector_extract v8i16:$src, Idx), i16)))),
3339 (f128 (XSCVSDQP (EXTRACT_SUBREG
3340 (VEXTSH2D (VEXTRACTUH !add(Idx, Idx), $src)),
3341 sub_64)))>;
3342 // The SDAG adds the `and` since an `i16` is being extracted as an `i32`.
3343 def : Pat<(f128 (uint_to_fp
3344 (and (i32 (vector_extract v8i16:$src, Idx)), 65535))),
3345 (f128 (XSCVUDQP (EXTRACT_SUBREG
3346 (VEXTRACTUH !add(Idx, Idx), $src), sub_64)))>;
3347 }
3348
3349 // (Un)Signed Byte vector extract -> QP
3350 foreach Idx = 0-15 in {
3351 def : Pat<(f128 (sint_to_fp
3352 (i32 (sext_inreg (vector_extract v16i8:$src, Idx),
3353 i8)))),
3354 (f128 (XSCVSDQP (EXTRACT_SUBREG
3355 (VEXTSB2D (VEXTRACTUB Idx, $src)), sub_64)))>;
3356 def : Pat<(f128 (uint_to_fp
3357 (and (i32 (vector_extract v16i8:$src, Idx)), 255))),
3358 (f128 (XSCVUDQP
3359 (EXTRACT_SUBREG (VEXTRACTUB Idx, $src), sub_64)))>;
3360 }
Lei Huang66e22c22018-07-05 07:46:01 +00003361
3362 // Unsiged int in vsx register -> QP
3363 def : Pat<(f128 (uint_to_fp (i32 (PPCmfvsr f64:$src)))),
3364 (f128 (XSCVUDQP
3365 (XXEXTRACTUW (SUBREG_TO_REG (i64 1), $src, sub_64), 4)))>;
Lei Huang8b0da652018-05-23 19:31:54 +00003366 } // IsBigEndian, HasP9Vector
3367
3368 let Predicates = [IsLittleEndian, HasP9Vector] in {
3369
3370 // (Un)Signed DWord vector extract -> QP
Lei Huang89901682018-05-23 18:36:51 +00003371 def : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 0)))),
3372 (f128 (XSCVSDQP
3373 (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>;
3374 def : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 1)))),
3375 (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>;
3376 def : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 0)))),
3377 (f128 (XSCVUDQP
3378 (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>;
3379 def : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 1)))),
3380 (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>;
Lei Huang8b0da652018-05-23 19:31:54 +00003381
3382 // (Un)Signed Word vector extract -> QP
3383 foreach Idx = [[0,3],[1,2],[3,0]] in {
3384 def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, !head(Idx))))),
3385 (f128 (XSCVSDQP (EXTRACT_SUBREG
3386 (VEXTSW2D (VSPLTW !head(!tail(Idx)), $src)),
3387 sub_64)))>;
3388 }
3389 def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, 2)))),
3390 (f128 (XSCVSDQP (EXTRACT_SUBREG (VEXTSW2D $src), sub_64)))>;
3391
3392 foreach Idx = [[0,12],[1,8],[2,4],[3,0]] in {
3393 def : Pat<(f128 (uint_to_fp (i32 (extractelt v4i32:$src, !head(Idx))))),
3394 (f128 (XSCVUDQP (XXEXTRACTUW $src, !head(!tail(Idx)))))>;
3395 }
Lei Huang651be442018-05-28 16:43:29 +00003396
3397 // (Un)Signed HWord vector extract -> QP
3398 // The Nested foreach lists identifies the vector element and corresponding
3399 // register byte location.
3400 foreach Idx = [[0,14],[1,12],[2,10],[3,8],[4,6],[5,4],[6,2],[7,0]] in {
3401 def : Pat<(f128 (sint_to_fp
3402 (i32 (sext_inreg
3403 (vector_extract v8i16:$src, !head(Idx)), i16)))),
3404 (f128 (XSCVSDQP
3405 (EXTRACT_SUBREG (VEXTSH2D
3406 (VEXTRACTUH !head(!tail(Idx)), $src)),
3407 sub_64)))>;
3408 def : Pat<(f128 (uint_to_fp
3409 (and (i32 (vector_extract v8i16:$src, !head(Idx))),
3410 65535))),
3411 (f128 (XSCVUDQP (EXTRACT_SUBREG
3412 (VEXTRACTUH !head(!tail(Idx)), $src), sub_64)))>;
3413 }
3414
3415 // (Un)Signed Byte vector extract -> QP
3416 foreach Idx = [[0,15],[1,14],[2,13],[3,12],[4,11],[5,10],[6,9],[7,8],[8,7],
3417 [9,6],[10,5],[11,4],[12,3],[13,2],[14,1],[15,0]] in {
3418 def : Pat<(f128 (sint_to_fp
3419 (i32 (sext_inreg
3420 (vector_extract v16i8:$src, !head(Idx)), i8)))),
3421 (f128 (XSCVSDQP
3422 (EXTRACT_SUBREG
3423 (VEXTSB2D (VEXTRACTUB !head(!tail(Idx)), $src)),
3424 sub_64)))>;
3425 def : Pat<(f128 (uint_to_fp
3426 (and (i32 (vector_extract v16i8:$src, !head(Idx))),
3427 255))),
3428 (f128 (XSCVUDQP
3429 (EXTRACT_SUBREG
3430 (VEXTRACTUB !head(!tail(Idx)), $src), sub_64)))>;
3431 }
Lei Huang66e22c22018-07-05 07:46:01 +00003432
3433 // Unsiged int in vsx register -> QP
3434 def : Pat<(f128 (uint_to_fp (i32 (PPCmfvsr f64:$src)))),
3435 (f128 (XSCVUDQP
3436 (XXEXTRACTUW (SUBREG_TO_REG (i64 1), $src, sub_64), 8)))>;
Lei Huang8b0da652018-05-23 19:31:54 +00003437 } // IsLittleEndian, HasP9Vector
Lei Huang89901682018-05-23 18:36:51 +00003438
Lei Huang10367eb2018-04-12 18:00:14 +00003439 // Convert (Un)Signed DWord in memory -> QP
3440 def : Pat<(f128 (sint_to_fp (i64 (load xaddr:$src)))),
3441 (f128 (XSCVSDQP (LXSDX xaddr:$src)))>;
3442 def : Pat<(f128 (sint_to_fp (i64 (load ixaddr:$src)))),
3443 (f128 (XSCVSDQP (LXSD ixaddr:$src)))>;
3444 def : Pat<(f128 (uint_to_fp (i64 (load xaddr:$src)))),
3445 (f128 (XSCVUDQP (LXSDX xaddr:$src)))>;
3446 def : Pat<(f128 (uint_to_fp (i64 (load ixaddr:$src)))),
3447 (f128 (XSCVUDQP (LXSD ixaddr:$src)))>;
3448
Lei Huang192c6cc2018-04-18 17:41:46 +00003449 // Convert Unsigned HWord in memory -> QP
3450 def : Pat<(f128 (uint_to_fp ScalarLoads.ZELi16)),
3451 (f128 (XSCVUDQP (LXSIHZX xaddr:$src)))>;
3452
3453 // Convert Unsigned Byte in memory -> QP
3454 def : Pat<(f128 (uint_to_fp ScalarLoads.ZELi8)),
3455 (f128 (XSCVUDQP (LXSIBZX xoaddr:$src)))>;
3456
Lei Huangc517e952018-05-08 18:23:31 +00003457 // Truncate & Convert QP -> (Un)Signed (D)Word.
3458 def : Pat<(i64 (fp_to_sint f128:$src)), (i64 (MFVRD (XSCVQPSDZ $src)))>;
3459 def : Pat<(i64 (fp_to_uint f128:$src)), (i64 (MFVRD (XSCVQPUDZ $src)))>;
Lei Huang63642882018-05-08 18:34:00 +00003460 def : Pat<(i32 (fp_to_sint f128:$src)),
3461 (i32 (MFVSRWZ (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC)))>;
3462 def : Pat<(i32 (fp_to_uint f128:$src)),
3463 (i32 (MFVSRWZ (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC)))>;
Lei Huangc517e952018-05-08 18:23:31 +00003464
Lei Huange41e3d32018-05-08 18:52:06 +00003465 // Instructions for store(fptosi).
Lei Huangc29229a2018-05-08 17:36:40 +00003466 // The 8-byte version is repeated here due to availability of D-Form STXSD.
3467 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huangc517e952018-05-08 18:23:31 +00003468 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), xaddr:$dst, 8),
3469 (STXSDX (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC),
3470 xaddr:$dst)>;
3471 def : Pat<(PPCstore_scal_int_from_vsr
3472 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), ixaddr:$dst, 8),
3473 (STXSD (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC),
3474 ixaddr:$dst)>;
3475 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huang63642882018-05-08 18:34:00 +00003476 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), xoaddr:$dst, 4),
3477 (STXSIWX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), xoaddr:$dst)>;
3478 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huange41e3d32018-05-08 18:52:06 +00003479 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), xoaddr:$dst, 2),
3480 (STXSIHX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), xoaddr:$dst)>;
3481 def : Pat<(PPCstore_scal_int_from_vsr
3482 (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), xoaddr:$dst, 1),
3483 (STXSIBX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), xoaddr:$dst)>;
3484 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huangc29229a2018-05-08 17:36:40 +00003485 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xaddr:$dst, 8),
3486 (STXSDX (XSCVDPSXDS f64:$src), xaddr:$dst)>;
3487 def : Pat<(PPCstore_scal_int_from_vsr
3488 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ixaddr:$dst, 8),
3489 (STXSD (XSCVDPSXDS f64:$src), ixaddr:$dst)>;
3490 def : Pat<(PPCstore_scal_int_from_vsr
3491 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xoaddr:$dst, 2),
3492 (STXSIHX (XSCVDPSXWS f64:$src), xoaddr:$dst)>;
3493 def : Pat<(PPCstore_scal_int_from_vsr
3494 (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), xoaddr:$dst, 1),
3495 (STXSIBX (XSCVDPSXWS f64:$src), xoaddr:$dst)>;
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00003496
Lei Huange41e3d32018-05-08 18:52:06 +00003497 // Instructions for store(fptoui).
Lei Huangc29229a2018-05-08 17:36:40 +00003498 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huangc517e952018-05-08 18:23:31 +00003499 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), xaddr:$dst, 8),
3500 (STXSDX (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC),
3501 xaddr:$dst)>;
3502 def : Pat<(PPCstore_scal_int_from_vsr
3503 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), ixaddr:$dst, 8),
3504 (STXSD (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC),
3505 ixaddr:$dst)>;
3506 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huang63642882018-05-08 18:34:00 +00003507 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), xoaddr:$dst, 4),
3508 (STXSIWX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), xoaddr:$dst)>;
3509 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huange41e3d32018-05-08 18:52:06 +00003510 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), xoaddr:$dst, 2),
3511 (STXSIHX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), xoaddr:$dst)>;
3512 def : Pat<(PPCstore_scal_int_from_vsr
3513 (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), xoaddr:$dst, 1),
3514 (STXSIBX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), xoaddr:$dst)>;
3515 def : Pat<(PPCstore_scal_int_from_vsr
Lei Huangc29229a2018-05-08 17:36:40 +00003516 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xaddr:$dst, 8),
3517 (STXSDX (XSCVDPUXDS f64:$src), xaddr:$dst)>;
3518 def : Pat<(PPCstore_scal_int_from_vsr
3519 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ixaddr:$dst, 8),
3520 (STXSD (XSCVDPUXDS f64:$src), ixaddr:$dst)>;
3521 def : Pat<(PPCstore_scal_int_from_vsr
3522 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xoaddr:$dst, 2),
3523 (STXSIHX (XSCVDPUXWS f64:$src), xoaddr:$dst)>;
3524 def : Pat<(PPCstore_scal_int_from_vsr
3525 (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), xoaddr:$dst, 1),
3526 (STXSIBX (XSCVDPUXWS f64:$src), xoaddr:$dst)>;
3527
Lei Huang6270ab62018-07-04 21:59:16 +00003528 // Round & Convert QP -> DP/SP
3529 def : Pat<(f64 (fpround f128:$src)), (f64 (XSCVQPDP $src))>;
3530 def : Pat<(f32 (fpround f128:$src)), (f32 (XSRSP (XSCVQPDPO $src)))>;
Lei Huangd17c39c2018-07-05 04:18:37 +00003531
3532 // Convert SP -> QP
3533 def : Pat<(f128 (fpextend f32:$src)),
3534 (f128 (XSCVDPQP (COPY_TO_REGCLASS $src, VFRC)))>;
3535
Lei Huangc29229a2018-05-08 17:36:40 +00003536} // end HasP9Vector, AddedComplexity
Lei Huang6270ab62018-07-04 21:59:16 +00003537
Lei Huanga855e172018-07-05 06:21:37 +00003538let AddedComplexity = 400 in {
3539 let Predicates = [IsISA3_0, HasP9Vector, HasDirectMove, IsBigEndian] in {
3540 def : Pat<(f128 (PPCbuild_fp128 i64:$rB, i64:$rA)),
3541 (f128 (COPY_TO_REGCLASS (MTVSRDD $rB, $rA), VRRC))>;
3542 }
3543 let Predicates = [IsISA3_0, HasP9Vector, HasDirectMove, IsLittleEndian] in {
3544 def : Pat<(f128 (PPCbuild_fp128 i64:$rA, i64:$rB)),
3545 (f128 (COPY_TO_REGCLASS (MTVSRDD $rB, $rA), VRRC))>;
3546 }
3547}
3548
Zaara Syedafcd96972017-09-21 16:12:33 +00003549let Predicates = [HasP9Vector] in {
Jinsong Jic7b43b92018-12-13 15:12:57 +00003550 let mayStore = 1 in {
3551 def SPILLTOVSR_STX : PseudoXFormMemOp<(outs),
3552 (ins spilltovsrrc:$XT, memrr:$dst),
3553 "#SPILLTOVSR_STX", []>;
3554 def SPILLTOVSR_ST : PPCPostRAExpPseudo<(outs), (ins spilltovsrrc:$XT, memrix:$dst),
3555 "#SPILLTOVSR_ST", []>;
3556 }
3557 let mayLoad = 1 in {
3558 def SPILLTOVSR_LDX : PseudoXFormMemOp<(outs spilltovsrrc:$XT),
3559 (ins memrr:$src),
3560 "#SPILLTOVSR_LDX", []>;
3561 def SPILLTOVSR_LD : PPCPostRAExpPseudo<(outs spilltovsrrc:$XT), (ins memrix:$src),
3562 "#SPILLTOVSR_LD", []>;
Zaara Syedafcd96972017-09-21 16:12:33 +00003563
Zaara Syedafcd96972017-09-21 16:12:33 +00003564 }
3565}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003566// Integer extend helper dags 32 -> 64
3567def AnyExts {
3568 dag A = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32);
3569 dag B = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $B, sub_32);
3570 dag C = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $C, sub_32);
3571 dag D = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $D, sub_32);
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00003572}
3573
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003574def DblToFlt {
3575 dag A0 = (f32 (fpround (f64 (extractelt v2f64:$A, 0))));
3576 dag A1 = (f32 (fpround (f64 (extractelt v2f64:$A, 1))));
3577 dag B0 = (f32 (fpround (f64 (extractelt v2f64:$B, 0))));
3578 dag B1 = (f32 (fpround (f64 (extractelt v2f64:$B, 1))));
3579}
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003580
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003581def ExtDbl {
3582 dag A0S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$A, 0))))));
3583 dag A1S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$A, 1))))));
3584 dag B0S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$B, 0))))));
3585 dag B1S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$B, 1))))));
3586 dag A0U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$A, 0))))));
3587 dag A1U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$A, 1))))));
3588 dag B0U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$B, 0))))));
3589 dag B1U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$B, 1))))));
3590}
3591
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003592def ByteToWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003593 dag LE_A0 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 0)), i8));
3594 dag LE_A1 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 4)), i8));
3595 dag LE_A2 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 8)), i8));
3596 dag LE_A3 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 12)), i8));
3597 dag BE_A0 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 3)), i8));
3598 dag BE_A1 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 7)), i8));
3599 dag BE_A2 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 11)), i8));
3600 dag BE_A3 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 15)), i8));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003601}
3602
3603def ByteToDWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003604 dag LE_A0 = (i64 (sext_inreg
3605 (i64 (anyext (i32 (vector_extract v16i8:$A, 0)))), i8));
3606 dag LE_A1 = (i64 (sext_inreg
3607 (i64 (anyext (i32 (vector_extract v16i8:$A, 8)))), i8));
3608 dag BE_A0 = (i64 (sext_inreg
3609 (i64 (anyext (i32 (vector_extract v16i8:$A, 7)))), i8));
3610 dag BE_A1 = (i64 (sext_inreg
3611 (i64 (anyext (i32 (vector_extract v16i8:$A, 15)))), i8));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003612}
3613
3614def HWordToWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003615 dag LE_A0 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 0)), i16));
3616 dag LE_A1 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 2)), i16));
3617 dag LE_A2 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 4)), i16));
3618 dag LE_A3 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 6)), i16));
3619 dag BE_A0 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 1)), i16));
3620 dag BE_A1 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 3)), i16));
3621 dag BE_A2 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 5)), i16));
3622 dag BE_A3 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 7)), i16));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003623}
3624
3625def HWordToDWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003626 dag LE_A0 = (i64 (sext_inreg
3627 (i64 (anyext (i32 (vector_extract v8i16:$A, 0)))), i16));
3628 dag LE_A1 = (i64 (sext_inreg
3629 (i64 (anyext (i32 (vector_extract v8i16:$A, 4)))), i16));
3630 dag BE_A0 = (i64 (sext_inreg
3631 (i64 (anyext (i32 (vector_extract v8i16:$A, 3)))), i16));
3632 dag BE_A1 = (i64 (sext_inreg
3633 (i64 (anyext (i32 (vector_extract v8i16:$A, 7)))), i16));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003634}
3635
3636def WordToDWord {
Tony Jiang9a91a182017-07-05 16:00:38 +00003637 dag LE_A0 = (i64 (sext (i32 (vector_extract v4i32:$A, 0))));
3638 dag LE_A1 = (i64 (sext (i32 (vector_extract v4i32:$A, 2))));
3639 dag BE_A0 = (i64 (sext (i32 (vector_extract v4i32:$A, 1))));
3640 dag BE_A1 = (i64 (sext (i32 (vector_extract v4i32:$A, 3))));
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003641}
3642
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003643def FltToIntLoad {
3644 dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (extloadf32 xoaddr:$A)))));
3645}
3646def FltToUIntLoad {
3647 dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (extloadf32 xoaddr:$A)))));
3648}
3649def FltToLongLoad {
3650 dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (extloadf32 xoaddr:$A)))));
3651}
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003652def FltToLongLoadP9 {
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003653 dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (extloadf32 ixaddr:$A)))));
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003654}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003655def FltToULongLoad {
3656 dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (extloadf32 xoaddr:$A)))));
3657}
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003658def FltToULongLoadP9 {
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003659 dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (extloadf32 ixaddr:$A)))));
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003660}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003661def FltToLong {
Lei Huangcd4f3852018-03-12 19:26:18 +00003662 dag A = (i64 (PPCmfvsr (f64 (PPCfctidz (fpextend f32:$A)))));
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003663}
3664def FltToULong {
Lei Huangcd4f3852018-03-12 19:26:18 +00003665 dag A = (i64 (PPCmfvsr (f64 (PPCfctiduz (fpextend f32:$A)))));
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003666}
3667def DblToInt {
3668 dag A = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$A))));
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003669 dag B = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$B))));
3670 dag C = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$C))));
3671 dag D = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$D))));
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003672}
3673def DblToUInt {
3674 dag A = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$A))));
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003675 dag B = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$B))));
3676 dag C = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$C))));
3677 dag D = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$D))));
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003678}
3679def DblToLong {
3680 dag A = (i64 (PPCmfvsr (f64 (PPCfctidz f64:$A))));
3681}
3682def DblToULong {
3683 dag A = (i64 (PPCmfvsr (f64 (PPCfctiduz f64:$A))));
3684}
3685def DblToIntLoad {
3686 dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (load xoaddr:$A)))));
3687}
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003688def DblToIntLoadP9 {
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003689 dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (load ixaddr:$A)))));
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003690}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003691def DblToUIntLoad {
3692 dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (load xoaddr:$A)))));
3693}
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003694def DblToUIntLoadP9 {
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003695 dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (load ixaddr:$A)))));
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003696}
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003697def DblToLongLoad {
3698 dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (load xoaddr:$A)))));
3699}
3700def DblToULongLoad {
3701 dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (load xoaddr:$A)))));
3702}
3703
3704// FP merge dags (for f32 -> v4f32)
3705def MrgFP {
3706 dag AC = (XVCVDPSP (XXPERMDI (COPY_TO_REGCLASS $A, VSRC),
3707 (COPY_TO_REGCLASS $C, VSRC), 0));
3708 dag BD = (XVCVDPSP (XXPERMDI (COPY_TO_REGCLASS $B, VSRC),
3709 (COPY_TO_REGCLASS $D, VSRC), 0));
3710 dag ABhToFlt = (XVCVDPSP (XXPERMDI $A, $B, 0));
3711 dag ABlToFlt = (XVCVDPSP (XXPERMDI $A, $B, 3));
3712 dag BAhToFlt = (XVCVDPSP (XXPERMDI $B, $A, 0));
3713 dag BAlToFlt = (XVCVDPSP (XXPERMDI $B, $A, 3));
3714}
3715
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003716// Word-element merge dags - conversions from f64 to i32 merged into vectors.
3717def MrgWords {
3718 // For big endian, we merge low and hi doublewords (A, B).
3719 dag A0B0 = (v2f64 (XXPERMDI v2f64:$A, v2f64:$B, 0));
3720 dag A1B1 = (v2f64 (XXPERMDI v2f64:$A, v2f64:$B, 3));
3721 dag CVA1B1S = (v4i32 (XVCVDPSXWS A1B1));
3722 dag CVA0B0S = (v4i32 (XVCVDPSXWS A0B0));
3723 dag CVA1B1U = (v4i32 (XVCVDPUXWS A1B1));
3724 dag CVA0B0U = (v4i32 (XVCVDPUXWS A0B0));
3725
3726 // For little endian, we merge low and hi doublewords (B, A).
3727 dag B1A1 = (v2f64 (XXPERMDI v2f64:$B, v2f64:$A, 0));
3728 dag B0A0 = (v2f64 (XXPERMDI v2f64:$B, v2f64:$A, 3));
3729 dag CVB1A1S = (v4i32 (XVCVDPSXWS B1A1));
3730 dag CVB0A0S = (v4i32 (XVCVDPSXWS B0A0));
3731 dag CVB1A1U = (v4i32 (XVCVDPUXWS B1A1));
3732 dag CVB0A0U = (v4i32 (XVCVDPUXWS B0A0));
3733
3734 // For big endian, we merge hi doublewords of (A, C) and (B, D), convert
3735 // then merge.
3736 dag AC = (v2f64 (XXPERMDI (COPY_TO_REGCLASS f64:$A, VSRC),
3737 (COPY_TO_REGCLASS f64:$C, VSRC), 0));
3738 dag BD = (v2f64 (XXPERMDI (COPY_TO_REGCLASS f64:$B, VSRC),
3739 (COPY_TO_REGCLASS f64:$D, VSRC), 0));
3740 dag CVACS = (v4i32 (XVCVDPSXWS AC));
3741 dag CVBDS = (v4i32 (XVCVDPSXWS BD));
3742 dag CVACU = (v4i32 (XVCVDPUXWS AC));
3743 dag CVBDU = (v4i32 (XVCVDPUXWS BD));
3744
3745 // For little endian, we merge hi doublewords of (D, B) and (C, A), convert
3746 // then merge.
3747 dag DB = (v2f64 (XXPERMDI (COPY_TO_REGCLASS f64:$D, VSRC),
3748 (COPY_TO_REGCLASS f64:$B, VSRC), 0));
3749 dag CA = (v2f64 (XXPERMDI (COPY_TO_REGCLASS f64:$C, VSRC),
3750 (COPY_TO_REGCLASS f64:$A, VSRC), 0));
3751 dag CVDBS = (v4i32 (XVCVDPSXWS DB));
3752 dag CVCAS = (v4i32 (XVCVDPSXWS CA));
3753 dag CVDBU = (v4i32 (XVCVDPUXWS DB));
3754 dag CVCAU = (v4i32 (XVCVDPUXWS CA));
3755}
3756
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003757// Patterns for BUILD_VECTOR nodes.
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003758let AddedComplexity = 400 in {
3759
3760 let Predicates = [HasVSX] in {
3761 // Build vectors of floating point converted to i32.
3762 def : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.A,
3763 DblToInt.A, DblToInt.A)),
3764 (v4i32 (XXSPLTW (COPY_TO_REGCLASS (XSCVDPSXWS $A), VSRC), 1))>;
3765 def : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.A,
3766 DblToUInt.A, DblToUInt.A)),
3767 (v4i32 (XXSPLTW (COPY_TO_REGCLASS (XSCVDPUXWS $A), VSRC), 1))>;
3768 def : Pat<(v2i64 (build_vector DblToLong.A, DblToLong.A)),
3769 (v2i64 (XXPERMDI (COPY_TO_REGCLASS (XSCVDPSXDS $A), VSRC),
3770 (COPY_TO_REGCLASS (XSCVDPSXDS $A), VSRC), 0))>;
3771 def : Pat<(v2i64 (build_vector DblToULong.A, DblToULong.A)),
3772 (v2i64 (XXPERMDI (COPY_TO_REGCLASS (XSCVDPUXDS $A), VSRC),
3773 (COPY_TO_REGCLASS (XSCVDPUXDS $A), VSRC), 0))>;
3774 def : Pat<(v4i32 (scalar_to_vector FltToIntLoad.A)),
3775 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003776 (XSCVDPSXWSs (XFLOADf32 xoaddr:$A)), VSRC), 1))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003777 def : Pat<(v4i32 (scalar_to_vector FltToUIntLoad.A)),
3778 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003779 (XSCVDPUXWSs (XFLOADf32 xoaddr:$A)), VSRC), 1))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003780 def : Pat<(v4f32 (build_vector f32:$A, f32:$A, f32:$A, f32:$A)),
3781 (v4f32 (XXSPLTW (v4f32 (XSCVDPSPN $A)), 0))>;
3782
3783 // Build vectors of floating point converted to i64.
3784 def : Pat<(v2i64 (build_vector FltToLong.A, FltToLong.A)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003785 (v2i64 (XXPERMDIs
3786 (COPY_TO_REGCLASS (XSCVDPSXDSs $A), VSFRC), 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003787 def : Pat<(v2i64 (build_vector FltToULong.A, FltToULong.A)),
Nemanja Ivanovic15748f42016-12-06 11:47:14 +00003788 (v2i64 (XXPERMDIs
3789 (COPY_TO_REGCLASS (XSCVDPUXDSs $A), VSFRC), 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003790 def : Pat<(v2i64 (scalar_to_vector DblToLongLoad.A)),
3791 (v2i64 (XVCVDPSXDS (LXVDSX xoaddr:$A)))>;
3792 def : Pat<(v2i64 (scalar_to_vector DblToULongLoad.A)),
3793 (v2i64 (XVCVDPUXDS (LXVDSX xoaddr:$A)))>;
3794 }
3795
3796 let Predicates = [HasVSX, NoP9Vector] in {
Tony Jiang438bf4a2017-11-20 14:38:30 +00003797 // Load-and-splat with fp-to-int conversion (using X-Form VSX/FP loads).
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003798 def : Pat<(v4i32 (scalar_to_vector DblToIntLoad.A)),
3799 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003800 (XSCVDPSXWS (XFLOADf64 xoaddr:$A)), VSRC), 1))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003801 def : Pat<(v4i32 (scalar_to_vector DblToUIntLoad.A)),
3802 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003803 (XSCVDPUXWS (XFLOADf64 xoaddr:$A)), VSRC), 1))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003804 def : Pat<(v2i64 (scalar_to_vector FltToLongLoad.A)),
3805 (v2i64 (XXPERMDIs (XSCVDPSXDS (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003806 (XFLOADf32 xoaddr:$A), VSFRC)), 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003807 def : Pat<(v2i64 (scalar_to_vector FltToULongLoad.A)),
3808 (v2i64 (XXPERMDIs (XSCVDPUXDS (COPY_TO_REGCLASS
Tony Jiang438bf4a2017-11-20 14:38:30 +00003809 (XFLOADf32 xoaddr:$A), VSFRC)), 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003810 }
3811
3812 // Big endian, available on all targets with VSX
3813 let Predicates = [IsBigEndian, HasVSX] in {
3814 def : Pat<(v2f64 (build_vector f64:$A, f64:$B)),
3815 (v2f64 (XXPERMDI
3816 (COPY_TO_REGCLASS $A, VSRC),
3817 (COPY_TO_REGCLASS $B, VSRC), 0))>;
3818
3819 def : Pat<(v4f32 (build_vector f32:$A, f32:$B, f32:$C, f32:$D)),
3820 (VMRGEW MrgFP.AC, MrgFP.BD)>;
3821 def : Pat<(v4f32 (build_vector DblToFlt.A0, DblToFlt.A1,
3822 DblToFlt.B0, DblToFlt.B1)),
3823 (v4f32 (VMRGEW MrgFP.ABhToFlt, MrgFP.ABlToFlt))>;
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003824
3825 // Convert 4 doubles to a vector of ints.
3826 def : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.B,
3827 DblToInt.C, DblToInt.D)),
3828 (v4i32 (VMRGEW MrgWords.CVACS, MrgWords.CVBDS))>;
3829 def : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.B,
3830 DblToUInt.C, DblToUInt.D)),
3831 (v4i32 (VMRGEW MrgWords.CVACU, MrgWords.CVBDU))>;
3832 def : Pat<(v4i32 (build_vector ExtDbl.A0S, ExtDbl.A1S,
3833 ExtDbl.B0S, ExtDbl.B1S)),
3834 (v4i32 (VMRGEW MrgWords.CVA0B0S, MrgWords.CVA1B1S))>;
3835 def : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U,
3836 ExtDbl.B0U, ExtDbl.B1U)),
3837 (v4i32 (VMRGEW MrgWords.CVA0B0U, MrgWords.CVA1B1U))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003838 }
3839
3840 let Predicates = [IsLittleEndian, HasVSX] in {
3841 // Little endian, available on all targets with VSX
3842 def : Pat<(v2f64 (build_vector f64:$A, f64:$B)),
3843 (v2f64 (XXPERMDI
3844 (COPY_TO_REGCLASS $B, VSRC),
3845 (COPY_TO_REGCLASS $A, VSRC), 0))>;
3846
3847 def : Pat<(v4f32 (build_vector f32:$D, f32:$C, f32:$B, f32:$A)),
3848 (VMRGEW MrgFP.AC, MrgFP.BD)>;
3849 def : Pat<(v4f32 (build_vector DblToFlt.A0, DblToFlt.A1,
3850 DblToFlt.B0, DblToFlt.B1)),
3851 (v4f32 (VMRGEW MrgFP.BAhToFlt, MrgFP.BAlToFlt))>;
Nemanja Ivanovice1a525e2018-08-02 00:03:22 +00003852
3853 // Convert 4 doubles to a vector of ints.
3854 def : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.B,
3855 DblToInt.C, DblToInt.D)),
3856 (v4i32 (VMRGEW MrgWords.CVDBS, MrgWords.CVCAS))>;
3857 def : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.B,
3858 DblToUInt.C, DblToUInt.D)),
3859 (v4i32 (VMRGEW MrgWords.CVDBU, MrgWords.CVCAU))>;
3860 def : Pat<(v4i32 (build_vector ExtDbl.A0S, ExtDbl.A1S,
3861 ExtDbl.B0S, ExtDbl.B1S)),
3862 (v4i32 (VMRGEW MrgWords.CVB1A1S, MrgWords.CVB0A0S))>;
3863 def : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U,
3864 ExtDbl.B0U, ExtDbl.B1U)),
3865 (v4i32 (VMRGEW MrgWords.CVB1A1U, MrgWords.CVB0A0U))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003866 }
3867
3868 let Predicates = [HasDirectMove] in {
3869 // Endianness-neutral constant splat on P8 and newer targets. The reason
3870 // for this pattern is that on targets with direct moves, we don't expand
3871 // BUILD_VECTOR nodes for v4i32.
3872 def : Pat<(v4i32 (build_vector immSExt5NonZero:$A, immSExt5NonZero:$A,
3873 immSExt5NonZero:$A, immSExt5NonZero:$A)),
3874 (v4i32 (VSPLTISW imm:$A))>;
3875 }
3876
3877 let Predicates = [IsBigEndian, HasDirectMove, NoP9Vector] in {
3878 // Big endian integer vectors using direct moves.
3879 def : Pat<(v2i64 (build_vector i64:$A, i64:$B)),
3880 (v2i64 (XXPERMDI
3881 (COPY_TO_REGCLASS (MTVSRD $A), VSRC),
3882 (COPY_TO_REGCLASS (MTVSRD $B), VSRC), 0))>;
3883 def : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)),
Lei Huangde208432018-10-26 18:09:36 +00003884 (XXPERMDI
3885 (COPY_TO_REGCLASS
3886 (MTVSRD (RLDIMI AnyExts.B, AnyExts.A, 32, 0)), VSRC),
3887 (COPY_TO_REGCLASS
3888 (MTVSRD (RLDIMI AnyExts.D, AnyExts.C, 32, 0)), VSRC), 0)>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003889 def : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)),
3890 (XXSPLTW (COPY_TO_REGCLASS (MTVSRWZ $A), VSRC), 1)>;
3891 }
3892
3893 let Predicates = [IsLittleEndian, HasDirectMove, NoP9Vector] in {
3894 // Little endian integer vectors using direct moves.
3895 def : Pat<(v2i64 (build_vector i64:$A, i64:$B)),
3896 (v2i64 (XXPERMDI
3897 (COPY_TO_REGCLASS (MTVSRD $B), VSRC),
3898 (COPY_TO_REGCLASS (MTVSRD $A), VSRC), 0))>;
3899 def : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)),
Lei Huangde208432018-10-26 18:09:36 +00003900 (XXPERMDI
3901 (COPY_TO_REGCLASS
3902 (MTVSRD (RLDIMI AnyExts.C, AnyExts.D, 32, 0)), VSRC),
3903 (COPY_TO_REGCLASS
3904 (MTVSRD (RLDIMI AnyExts.A, AnyExts.B, 32, 0)), VSRC), 0)>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003905 def : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)),
3906 (XXSPLTW (COPY_TO_REGCLASS (MTVSRWZ $A), VSRC), 1)>;
3907 }
3908
3909 let Predicates = [HasP9Vector] in {
3910 // Endianness-neutral patterns for const splats with ISA 3.0 instructions.
3911 def : Pat<(v4i32 (scalar_to_vector i32:$A)),
3912 (v4i32 (MTVSRWS $A))>;
3913 def : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)),
3914 (v4i32 (MTVSRWS $A))>;
Nemanja Ivanovic552c8e92016-12-15 11:16:20 +00003915 def : Pat<(v16i8 (build_vector immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3916 immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3917 immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3918 immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3919 immAnyExt8:$A, immAnyExt8:$A, immAnyExt8:$A,
3920 immAnyExt8:$A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003921 (v16i8 (COPY_TO_REGCLASS (XXSPLTIB imm:$A), VSRC))>;
3922 def : Pat<(v16i8 immAllOnesV),
3923 (v16i8 (COPY_TO_REGCLASS (XXSPLTIB 255), VSRC))>;
3924 def : Pat<(v8i16 immAllOnesV),
3925 (v8i16 (COPY_TO_REGCLASS (XXSPLTIB 255), VSRC))>;
3926 def : Pat<(v4i32 immAllOnesV),
3927 (v4i32 (XXSPLTIB 255))>;
3928 def : Pat<(v2i64 immAllOnesV),
3929 (v2i64 (XXSPLTIB 255))>;
3930 def : Pat<(v4i32 (scalar_to_vector FltToIntLoad.A)),
3931 (v4i32 (XVCVSPSXWS (LXVWSX xoaddr:$A)))>;
3932 def : Pat<(v4i32 (scalar_to_vector FltToUIntLoad.A)),
3933 (v4i32 (XVCVSPUXWS (LXVWSX xoaddr:$A)))>;
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003934 def : Pat<(v4i32 (scalar_to_vector DblToIntLoadP9.A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003935 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003936 (XSCVDPSXWS (DFLOADf64 ixaddr:$A)), VSRC), 1))>;
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003937 def : Pat<(v4i32 (scalar_to_vector DblToUIntLoadP9.A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003938 (v4i32 (XXSPLTW (COPY_TO_REGCLASS
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003939 (XSCVDPUXWS (DFLOADf64 ixaddr:$A)), VSRC), 1))>;
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003940 def : Pat<(v2i64 (scalar_to_vector FltToLongLoadP9.A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003941 (v2i64 (XXPERMDIs (XSCVDPSXDS (COPY_TO_REGCLASS
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003942 (DFLOADf32 ixaddr:$A),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003943 VSFRC)), 0))>;
Hiroshi Inouee3c14eb2017-05-29 07:12:39 +00003944 def : Pat<(v2i64 (scalar_to_vector FltToULongLoadP9.A)),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003945 (v2i64 (XXPERMDIs (XSCVDPUXDS (COPY_TO_REGCLASS
Nemanja Ivanovic3c7e276d2017-07-13 18:17:10 +00003946 (DFLOADf32 ixaddr:$A),
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003947 VSFRC)), 0))>;
3948 }
3949
3950 let Predicates = [IsISA3_0, HasDirectMove, IsBigEndian] in {
3951 def : Pat<(i64 (extractelt v2i64:$A, 1)),
3952 (i64 (MFVSRLD $A))>;
3953 // Better way to build integer vectors if we have MTVSRDD. Big endian.
3954 def : Pat<(v2i64 (build_vector i64:$rB, i64:$rA)),
3955 (v2i64 (MTVSRDD $rB, $rA))>;
3956 def : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)),
Lei Huangde208432018-10-26 18:09:36 +00003957 (MTVSRDD
3958 (RLDIMI AnyExts.B, AnyExts.A, 32, 0),
3959 (RLDIMI AnyExts.D, AnyExts.C, 32, 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003960 }
3961
3962 let Predicates = [IsISA3_0, HasDirectMove, IsLittleEndian] in {
3963 def : Pat<(i64 (extractelt v2i64:$A, 0)),
3964 (i64 (MFVSRLD $A))>;
3965 // Better way to build integer vectors if we have MTVSRDD. Little endian.
3966 def : Pat<(v2i64 (build_vector i64:$rA, i64:$rB)),
3967 (v2i64 (MTVSRDD $rB, $rA))>;
3968 def : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)),
Lei Huangde208432018-10-26 18:09:36 +00003969 (MTVSRDD
3970 (RLDIMI AnyExts.C, AnyExts.D, 32, 0),
3971 (RLDIMI AnyExts.A, AnyExts.B, 32, 0))>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +00003972 }
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003973 // P9 Altivec instructions that can be used to build vectors.
3974 // Adding them to PPCInstrVSX.td rather than PPCAltivecVSX.td to compete
3975 // with complexities of existing build vector patterns in this file.
Tony Jiang9a91a182017-07-05 16:00:38 +00003976 let Predicates = [HasP9Altivec, IsLittleEndian] in {
3977 def : Pat<(v2i64 (build_vector WordToDWord.LE_A0, WordToDWord.LE_A1)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003978 (v2i64 (VEXTSW2D $A))>;
Tony Jiang9a91a182017-07-05 16:00:38 +00003979 def : Pat<(v2i64 (build_vector HWordToDWord.LE_A0, HWordToDWord.LE_A1)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003980 (v2i64 (VEXTSH2D $A))>;
Tony Jiang9a91a182017-07-05 16:00:38 +00003981 def : Pat<(v4i32 (build_vector HWordToWord.LE_A0, HWordToWord.LE_A1,
3982 HWordToWord.LE_A2, HWordToWord.LE_A3)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003983 (v4i32 (VEXTSH2W $A))>;
Tony Jiang9a91a182017-07-05 16:00:38 +00003984 def : Pat<(v4i32 (build_vector ByteToWord.LE_A0, ByteToWord.LE_A1,
3985 ByteToWord.LE_A2, ByteToWord.LE_A3)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003986 (v4i32 (VEXTSB2W $A))>;
Tony Jiang9a91a182017-07-05 16:00:38 +00003987 def : Pat<(v2i64 (build_vector ByteToDWord.LE_A0, ByteToDWord.LE_A1)),
Zaara Syeda79acbbe2017-06-08 17:14:36 +00003988 (v2i64 (VEXTSB2D $A))>;
3989 }
Tony Jiang9a91a182017-07-05 16:00:38 +00003990
3991 let Predicates = [HasP9Altivec, IsBigEndian] in {
3992 def : Pat<(v2i64 (build_vector WordToDWord.BE_A0, WordToDWord.BE_A1)),
3993 (v2i64 (VEXTSW2D $A))>;
3994 def : Pat<(v2i64 (build_vector HWordToDWord.BE_A0, HWordToDWord.BE_A1)),
3995 (v2i64 (VEXTSH2D $A))>;
3996 def : Pat<(v4i32 (build_vector HWordToWord.BE_A0, HWordToWord.BE_A1,
3997 HWordToWord.BE_A2, HWordToWord.BE_A3)),
3998 (v4i32 (VEXTSH2W $A))>;
3999 def : Pat<(v4i32 (build_vector ByteToWord.BE_A0, ByteToWord.BE_A1,
4000 ByteToWord.BE_A2, ByteToWord.BE_A3)),
4001 (v4i32 (VEXTSB2W $A))>;
4002 def : Pat<(v2i64 (build_vector ByteToDWord.BE_A0, ByteToDWord.BE_A1)),
4003 (v2i64 (VEXTSB2D $A))>;
4004 }
4005
4006 let Predicates = [HasP9Altivec] in {
4007 def: Pat<(v2i64 (PPCSExtVElems v16i8:$A)),
4008 (v2i64 (VEXTSB2D $A))>;
4009 def: Pat<(v2i64 (PPCSExtVElems v8i16:$A)),
4010 (v2i64 (VEXTSH2D $A))>;
4011 def: Pat<(v2i64 (PPCSExtVElems v4i32:$A)),
4012 (v2i64 (VEXTSW2D $A))>;
4013 def: Pat<(v4i32 (PPCSExtVElems v16i8:$A)),
4014 (v4i32 (VEXTSB2W $A))>;
4015 def: Pat<(v4i32 (PPCSExtVElems v8i16:$A)),
4016 (v4i32 (VEXTSH2W $A))>;
4017 }
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +00004018}
Zaara Syedab2595b92018-08-08 15:20:43 +00004019