xref: /aosp_15_r20/external/llvm/lib/Target/PowerPC/PPCInstrVSX.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===- PPCInstrVSX.td - The PowerPC VSX Extension --*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes the VSX extension to the PowerPC instruction set.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker// *********************************** NOTE ***********************************
15*9880d681SAndroid Build Coastguard Worker// ** For POWER8 Little Endian, the VSX swap optimization relies on knowing  **
16*9880d681SAndroid Build Coastguard Worker// ** which VMX and VSX instructions are lane-sensitive and which are not.   **
17*9880d681SAndroid Build Coastguard Worker// ** A lane-sensitive instruction relies, implicitly or explicitly, on      **
18*9880d681SAndroid Build Coastguard Worker// ** whether lanes are numbered from left to right.  An instruction like    **
19*9880d681SAndroid Build Coastguard Worker// ** VADDFP is not lane-sensitive, because each lane of the result vector   **
20*9880d681SAndroid Build Coastguard Worker// ** relies only on the corresponding lane of the source vectors.  However, **
21*9880d681SAndroid Build Coastguard Worker// ** an instruction like VMULESB is lane-sensitive, because "even" and      **
22*9880d681SAndroid Build Coastguard Worker// ** "odd" lanes are different for big-endian and little-endian numbering.  **
23*9880d681SAndroid Build Coastguard Worker// **                                                                        **
24*9880d681SAndroid Build Coastguard Worker// ** When adding new VMX and VSX instructions, please consider whether they **
25*9880d681SAndroid Build Coastguard Worker// ** are lane-sensitive.  If so, they must be added to a switch statement   **
26*9880d681SAndroid Build Coastguard Worker// ** in PPCVSXSwapRemoval::gatherVectorInstructions().                      **
27*9880d681SAndroid Build Coastguard Worker// ****************************************************************************
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdef PPCRegVSRCAsmOperand : AsmOperandClass {
30*9880d681SAndroid Build Coastguard Worker  let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Workerdef vsrc : RegisterOperand<VSRC> {
33*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegVSRCAsmOperand;
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdef PPCRegVSFRCAsmOperand : AsmOperandClass {
37*9880d681SAndroid Build Coastguard Worker  let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber";
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Workerdef vsfrc : RegisterOperand<VSFRC> {
40*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegVSFRCAsmOperand;
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdef PPCRegVSSRCAsmOperand : AsmOperandClass {
44*9880d681SAndroid Build Coastguard Worker  let Name = "RegVSSRC"; let PredicateMethod = "isVSRegNumber";
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Workerdef vssrc : RegisterOperand<VSSRC> {
47*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegVSSRCAsmOperand;
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker// Little-endian-specific nodes.
51*9880d681SAndroid Build Coastguard Workerdef SDT_PPClxvd2x : SDTypeProfile<1, 1, [
52*9880d681SAndroid Build Coastguard Worker  SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
53*9880d681SAndroid Build Coastguard Worker]>;
54*9880d681SAndroid Build Coastguard Workerdef SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
55*9880d681SAndroid Build Coastguard Worker  SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
56*9880d681SAndroid Build Coastguard Worker]>;
57*9880d681SAndroid Build Coastguard Workerdef SDT_PPCxxswapd : SDTypeProfile<1, 1, [
58*9880d681SAndroid Build Coastguard Worker  SDTCisSameAs<0, 1>
59*9880d681SAndroid Build Coastguard Worker]>;
60*9880d681SAndroid Build Coastguard Workerdef SDTVecConv : SDTypeProfile<1, 2, [
61*9880d681SAndroid Build Coastguard Worker  SDTCisVec<0>, SDTCisVec<1>, SDTCisPtrTy<2>
62*9880d681SAndroid Build Coastguard Worker]>;
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdef PPClxvd2x  : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
65*9880d681SAndroid Build Coastguard Worker                        [SDNPHasChain, SDNPMayLoad]>;
66*9880d681SAndroid Build Coastguard Workerdef PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
67*9880d681SAndroid Build Coastguard Worker                        [SDNPHasChain, SDNPMayStore]>;
68*9880d681SAndroid Build Coastguard Workerdef PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
69*9880d681SAndroid Build Coastguard Workerdef PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
70*9880d681SAndroid Build Coastguard Workerdef PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
71*9880d681SAndroid Build Coastguard Workerdef PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
72*9880d681SAndroid Build Coastguard Workerdef PPCsvec2fp : SDNode<"PPCISD::SINT_VEC_TO_FP", SDTVecConv, []>;
73*9880d681SAndroid Build Coastguard Workerdef PPCuvec2fp: SDNode<"PPCISD::UINT_VEC_TO_FP", SDTVecConv, []>;
74*9880d681SAndroid Build Coastguard Workerdef PPCswapNoChain : SDNode<"PPCISD::SWAP_NO_CHAIN", SDT_PPCxxswapd>;
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workermulticlass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase,
77*9880d681SAndroid Build Coastguard Worker                    string asmstr, InstrItinClass itin, Intrinsic Int,
78*9880d681SAndroid Build Coastguard Worker                    ValueType OutTy, ValueType InTy> {
79*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
80*9880d681SAndroid Build Coastguard Worker    def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
81*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
82*9880d681SAndroid Build Coastguard Worker                       [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>;
83*9880d681SAndroid Build Coastguard Worker    let Defs = [CR6] in
84*9880d681SAndroid Build Coastguard Worker    def o    : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
85*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
86*9880d681SAndroid Build Coastguard Worker                       [(set InTy:$XT,
87*9880d681SAndroid Build Coastguard Worker                                (InTy (PPCvcmp_o InTy:$XA, InTy:$XB, xo)))]>,
88*9880d681SAndroid Build Coastguard Worker                       isDOT;
89*9880d681SAndroid Build Coastguard Worker  }
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdef HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
93*9880d681SAndroid Build Coastguard Workerdef IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
94*9880d681SAndroid Build Coastguard Workerdef IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasVSX] in {
97*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
98*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { // VSX instructions don't have side effects.
99*9880d681SAndroid Build Coastguard Workerlet Uses = [RM] in {
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker  // Load indexed instructions
102*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1 in {
103*9880d681SAndroid Build Coastguard Worker    def LXSDX : XX1Form<31, 588,
104*9880d681SAndroid Build Coastguard Worker                        (outs vsfrc:$XT), (ins memrr:$src),
105*9880d681SAndroid Build Coastguard Worker                        "lxsdx $XT, $src", IIC_LdStLFD,
106*9880d681SAndroid Build Coastguard Worker                        [(set f64:$XT, (load xoaddr:$src))]>;
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker    def LXVD2X : XX1Form<31, 844,
109*9880d681SAndroid Build Coastguard Worker                         (outs vsrc:$XT), (ins memrr:$src),
110*9880d681SAndroid Build Coastguard Worker                         "lxvd2x $XT, $src", IIC_LdStLFD,
111*9880d681SAndroid Build Coastguard Worker                         [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker    def LXVDSX : XX1Form<31, 332,
114*9880d681SAndroid Build Coastguard Worker                         (outs vsrc:$XT), (ins memrr:$src),
115*9880d681SAndroid Build Coastguard Worker                         "lxvdsx $XT, $src", IIC_LdStLFD, []>;
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker    def LXVW4X : XX1Form<31, 780,
118*9880d681SAndroid Build Coastguard Worker                         (outs vsrc:$XT), (ins memrr:$src),
119*9880d681SAndroid Build Coastguard Worker                         "lxvw4x $XT, $src", IIC_LdStLFD,
120*9880d681SAndroid Build Coastguard Worker                         [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
121*9880d681SAndroid Build Coastguard Worker  } // mayLoad
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker  // Store indexed instructions
124*9880d681SAndroid Build Coastguard Worker  let mayStore = 1 in {
125*9880d681SAndroid Build Coastguard Worker    def STXSDX : XX1Form<31, 716,
126*9880d681SAndroid Build Coastguard Worker                        (outs), (ins vsfrc:$XT, memrr:$dst),
127*9880d681SAndroid Build Coastguard Worker                        "stxsdx $XT, $dst", IIC_LdStSTFD,
128*9880d681SAndroid Build Coastguard Worker                        [(store f64:$XT, xoaddr:$dst)]>;
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker    def STXVD2X : XX1Form<31, 972,
131*9880d681SAndroid Build Coastguard Worker                         (outs), (ins vsrc:$XT, memrr:$dst),
132*9880d681SAndroid Build Coastguard Worker                         "stxvd2x $XT, $dst", IIC_LdStSTFD,
133*9880d681SAndroid Build Coastguard Worker                         [(store v2f64:$XT, xoaddr:$dst)]>;
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker    def STXVW4X : XX1Form<31, 908,
136*9880d681SAndroid Build Coastguard Worker                         (outs), (ins vsrc:$XT, memrr:$dst),
137*9880d681SAndroid Build Coastguard Worker                         "stxvw4x $XT, $dst", IIC_LdStSTFD,
138*9880d681SAndroid Build Coastguard Worker                         [(store v4i32:$XT, xoaddr:$dst)]>;
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker  } // mayStore
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker  // Add/Mul Instructions
143*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
144*9880d681SAndroid Build Coastguard Worker    def XSADDDP : XX3Form<60, 32,
145*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
146*9880d681SAndroid Build Coastguard Worker                          "xsadddp $XT, $XA, $XB", IIC_VecFP,
147*9880d681SAndroid Build Coastguard Worker                          [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
148*9880d681SAndroid Build Coastguard Worker    def XSMULDP : XX3Form<60, 48,
149*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
150*9880d681SAndroid Build Coastguard Worker                          "xsmuldp $XT, $XA, $XB", IIC_VecFP,
151*9880d681SAndroid Build Coastguard Worker                          [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker    def XVADDDP : XX3Form<60, 96,
154*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
155*9880d681SAndroid Build Coastguard Worker                          "xvadddp $XT, $XA, $XB", IIC_VecFP,
156*9880d681SAndroid Build Coastguard Worker                          [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker    def XVADDSP : XX3Form<60, 64,
159*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
160*9880d681SAndroid Build Coastguard Worker                          "xvaddsp $XT, $XA, $XB", IIC_VecFP,
161*9880d681SAndroid Build Coastguard Worker                          [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker    def XVMULDP : XX3Form<60, 112,
164*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
165*9880d681SAndroid Build Coastguard Worker                          "xvmuldp $XT, $XA, $XB", IIC_VecFP,
166*9880d681SAndroid Build Coastguard Worker                          [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker    def XVMULSP : XX3Form<60, 80,
169*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
170*9880d681SAndroid Build Coastguard Worker                          "xvmulsp $XT, $XA, $XB", IIC_VecFP,
171*9880d681SAndroid Build Coastguard Worker                          [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
172*9880d681SAndroid Build Coastguard Worker  }
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker  // Subtract Instructions
175*9880d681SAndroid Build Coastguard Worker  def XSSUBDP : XX3Form<60, 40,
176*9880d681SAndroid Build Coastguard Worker                        (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
177*9880d681SAndroid Build Coastguard Worker                        "xssubdp $XT, $XA, $XB", IIC_VecFP,
178*9880d681SAndroid Build Coastguard Worker                        [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker  def XVSUBDP : XX3Form<60, 104,
181*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
182*9880d681SAndroid Build Coastguard Worker                        "xvsubdp $XT, $XA, $XB", IIC_VecFP,
183*9880d681SAndroid Build Coastguard Worker                        [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
184*9880d681SAndroid Build Coastguard Worker  def XVSUBSP : XX3Form<60, 72,
185*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
186*9880d681SAndroid Build Coastguard Worker                        "xvsubsp $XT, $XA, $XB", IIC_VecFP,
187*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker  // FMA Instructions
190*9880d681SAndroid Build Coastguard Worker  let BaseName = "XSMADDADP" in {
191*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
192*9880d681SAndroid Build Coastguard Worker  def XSMADDADP : XX3Form<60, 33,
193*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
194*9880d681SAndroid Build Coastguard Worker                          "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
195*9880d681SAndroid Build Coastguard Worker                          [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
196*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
197*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
198*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
199*9880d681SAndroid Build Coastguard Worker  def XSMADDMDP : XX3Form<60, 41,
200*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
201*9880d681SAndroid Build Coastguard Worker                          "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
202*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
203*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
204*9880d681SAndroid Build Coastguard Worker  }
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker  let BaseName = "XSMSUBADP" in {
207*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
208*9880d681SAndroid Build Coastguard Worker  def XSMSUBADP : XX3Form<60, 49,
209*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
210*9880d681SAndroid Build Coastguard Worker                          "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
211*9880d681SAndroid Build Coastguard Worker                          [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
212*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
213*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
214*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
215*9880d681SAndroid Build Coastguard Worker  def XSMSUBMDP : XX3Form<60, 57,
216*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
217*9880d681SAndroid Build Coastguard Worker                          "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
218*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
219*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
220*9880d681SAndroid Build Coastguard Worker  }
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker  let BaseName = "XSNMADDADP" in {
223*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
224*9880d681SAndroid Build Coastguard Worker  def XSNMADDADP : XX3Form<60, 161,
225*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
226*9880d681SAndroid Build Coastguard Worker                          "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
227*9880d681SAndroid Build Coastguard Worker                          [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
228*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
229*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
230*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
231*9880d681SAndroid Build Coastguard Worker  def XSNMADDMDP : XX3Form<60, 169,
232*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
233*9880d681SAndroid Build Coastguard Worker                          "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
234*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
235*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
236*9880d681SAndroid Build Coastguard Worker  }
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker  let BaseName = "XSNMSUBADP" in {
239*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
240*9880d681SAndroid Build Coastguard Worker  def XSNMSUBADP : XX3Form<60, 177,
241*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
242*9880d681SAndroid Build Coastguard Worker                          "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
243*9880d681SAndroid Build Coastguard Worker                          [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
244*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
245*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
246*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
247*9880d681SAndroid Build Coastguard Worker  def XSNMSUBMDP : XX3Form<60, 185,
248*9880d681SAndroid Build Coastguard Worker                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
249*9880d681SAndroid Build Coastguard Worker                          "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
250*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
251*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
252*9880d681SAndroid Build Coastguard Worker  }
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker  let BaseName = "XVMADDADP" in {
255*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
256*9880d681SAndroid Build Coastguard Worker  def XVMADDADP : XX3Form<60, 97,
257*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
258*9880d681SAndroid Build Coastguard Worker                          "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
259*9880d681SAndroid Build Coastguard Worker                          [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
260*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
261*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
262*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
263*9880d681SAndroid Build Coastguard Worker  def XVMADDMDP : XX3Form<60, 105,
264*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
265*9880d681SAndroid Build Coastguard Worker                          "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
266*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
267*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
268*9880d681SAndroid Build Coastguard Worker  }
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker  let BaseName = "XVMADDASP" in {
271*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
272*9880d681SAndroid Build Coastguard Worker  def XVMADDASP : XX3Form<60, 65,
273*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
274*9880d681SAndroid Build Coastguard Worker                          "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
275*9880d681SAndroid Build Coastguard Worker                          [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
276*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
277*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
278*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
279*9880d681SAndroid Build Coastguard Worker  def XVMADDMSP : XX3Form<60, 73,
280*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
281*9880d681SAndroid Build Coastguard Worker                          "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
282*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
283*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
284*9880d681SAndroid Build Coastguard Worker  }
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker  let BaseName = "XVMSUBADP" in {
287*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
288*9880d681SAndroid Build Coastguard Worker  def XVMSUBADP : XX3Form<60, 113,
289*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
290*9880d681SAndroid Build Coastguard Worker                          "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
291*9880d681SAndroid Build Coastguard Worker                          [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
292*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
293*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
294*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
295*9880d681SAndroid Build Coastguard Worker  def XVMSUBMDP : XX3Form<60, 121,
296*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
297*9880d681SAndroid Build Coastguard Worker                          "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
298*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
299*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
300*9880d681SAndroid Build Coastguard Worker  }
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker  let BaseName = "XVMSUBASP" in {
303*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
304*9880d681SAndroid Build Coastguard Worker  def XVMSUBASP : XX3Form<60, 81,
305*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
306*9880d681SAndroid Build Coastguard Worker                          "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
307*9880d681SAndroid Build Coastguard Worker                          [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
308*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
309*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
310*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
311*9880d681SAndroid Build Coastguard Worker  def XVMSUBMSP : XX3Form<60, 89,
312*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
313*9880d681SAndroid Build Coastguard Worker                          "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
314*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
315*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
316*9880d681SAndroid Build Coastguard Worker  }
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker  let BaseName = "XVNMADDADP" in {
319*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
320*9880d681SAndroid Build Coastguard Worker  def XVNMADDADP : XX3Form<60, 225,
321*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
322*9880d681SAndroid Build Coastguard Worker                          "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
323*9880d681SAndroid Build Coastguard Worker                          [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
324*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
325*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
326*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
327*9880d681SAndroid Build Coastguard Worker  def XVNMADDMDP : XX3Form<60, 233,
328*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
329*9880d681SAndroid Build Coastguard Worker                          "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
330*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
331*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
332*9880d681SAndroid Build Coastguard Worker  }
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker  let BaseName = "XVNMADDASP" in {
335*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
336*9880d681SAndroid Build Coastguard Worker  def XVNMADDASP : XX3Form<60, 193,
337*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
338*9880d681SAndroid Build Coastguard Worker                          "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
339*9880d681SAndroid Build Coastguard Worker                          [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
340*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
341*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
342*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
343*9880d681SAndroid Build Coastguard Worker  def XVNMADDMSP : XX3Form<60, 201,
344*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
345*9880d681SAndroid Build Coastguard Worker                          "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
346*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
347*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
348*9880d681SAndroid Build Coastguard Worker  }
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker  let BaseName = "XVNMSUBADP" in {
351*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
352*9880d681SAndroid Build Coastguard Worker  def XVNMSUBADP : XX3Form<60, 241,
353*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
354*9880d681SAndroid Build Coastguard Worker                          "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
355*9880d681SAndroid Build Coastguard Worker                          [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
356*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
357*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
358*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
359*9880d681SAndroid Build Coastguard Worker  def XVNMSUBMDP : XX3Form<60, 249,
360*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
361*9880d681SAndroid Build Coastguard Worker                          "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
362*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
363*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
364*9880d681SAndroid Build Coastguard Worker  }
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker  let BaseName = "XVNMSUBASP" in {
367*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
368*9880d681SAndroid Build Coastguard Worker  def XVNMSUBASP : XX3Form<60, 209,
369*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
370*9880d681SAndroid Build Coastguard Worker                          "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
371*9880d681SAndroid Build Coastguard Worker                          [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
372*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
373*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
374*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
375*9880d681SAndroid Build Coastguard Worker  def XVNMSUBMSP : XX3Form<60, 217,
376*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
377*9880d681SAndroid Build Coastguard Worker                          "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
378*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
379*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
380*9880d681SAndroid Build Coastguard Worker  }
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Worker  // Division Instructions
383*9880d681SAndroid Build Coastguard Worker  def XSDIVDP : XX3Form<60, 56,
384*9880d681SAndroid Build Coastguard Worker                        (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
385*9880d681SAndroid Build Coastguard Worker                        "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
386*9880d681SAndroid Build Coastguard Worker                        [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
387*9880d681SAndroid Build Coastguard Worker  def XSSQRTDP : XX2Form<60, 75,
388*9880d681SAndroid Build Coastguard Worker                        (outs vsfrc:$XT), (ins vsfrc:$XB),
389*9880d681SAndroid Build Coastguard Worker                        "xssqrtdp $XT, $XB", IIC_FPSqrtD,
390*9880d681SAndroid Build Coastguard Worker                        [(set f64:$XT, (fsqrt f64:$XB))]>;
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker  def XSREDP : XX2Form<60, 90,
393*9880d681SAndroid Build Coastguard Worker                        (outs vsfrc:$XT), (ins vsfrc:$XB),
394*9880d681SAndroid Build Coastguard Worker                        "xsredp $XT, $XB", IIC_VecFP,
395*9880d681SAndroid Build Coastguard Worker                        [(set f64:$XT, (PPCfre f64:$XB))]>;
396*9880d681SAndroid Build Coastguard Worker  def XSRSQRTEDP : XX2Form<60, 74,
397*9880d681SAndroid Build Coastguard Worker                           (outs vsfrc:$XT), (ins vsfrc:$XB),
398*9880d681SAndroid Build Coastguard Worker                           "xsrsqrtedp $XT, $XB", IIC_VecFP,
399*9880d681SAndroid Build Coastguard Worker                           [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Worker  def XSTDIVDP : XX3Form_1<60, 61,
402*9880d681SAndroid Build Coastguard Worker                         (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
403*9880d681SAndroid Build Coastguard Worker                         "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
404*9880d681SAndroid Build Coastguard Worker  def XSTSQRTDP : XX2Form_1<60, 106,
405*9880d681SAndroid Build Coastguard Worker                          (outs crrc:$crD), (ins vsfrc:$XB),
406*9880d681SAndroid Build Coastguard Worker                          "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
407*9880d681SAndroid Build Coastguard Worker
408*9880d681SAndroid Build Coastguard Worker  def XVDIVDP : XX3Form<60, 120,
409*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
410*9880d681SAndroid Build Coastguard Worker                        "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
411*9880d681SAndroid Build Coastguard Worker                        [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
412*9880d681SAndroid Build Coastguard Worker  def XVDIVSP : XX3Form<60, 88,
413*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
414*9880d681SAndroid Build Coastguard Worker                        "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
415*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Worker  def XVSQRTDP : XX2Form<60, 203,
418*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XB),
419*9880d681SAndroid Build Coastguard Worker                        "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
420*9880d681SAndroid Build Coastguard Worker                        [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
421*9880d681SAndroid Build Coastguard Worker  def XVSQRTSP : XX2Form<60, 139,
422*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XB),
423*9880d681SAndroid Build Coastguard Worker                        "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
424*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Worker  def XVTDIVDP : XX3Form_1<60, 125,
427*9880d681SAndroid Build Coastguard Worker                         (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
428*9880d681SAndroid Build Coastguard Worker                         "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
429*9880d681SAndroid Build Coastguard Worker  def XVTDIVSP : XX3Form_1<60, 93,
430*9880d681SAndroid Build Coastguard Worker                         (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
431*9880d681SAndroid Build Coastguard Worker                         "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker  def XVTSQRTDP : XX2Form_1<60, 234,
434*9880d681SAndroid Build Coastguard Worker                          (outs crrc:$crD), (ins vsrc:$XB),
435*9880d681SAndroid Build Coastguard Worker                          "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
436*9880d681SAndroid Build Coastguard Worker  def XVTSQRTSP : XX2Form_1<60, 170,
437*9880d681SAndroid Build Coastguard Worker                          (outs crrc:$crD), (ins vsrc:$XB),
438*9880d681SAndroid Build Coastguard Worker                          "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Worker  def XVREDP : XX2Form<60, 218,
441*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XB),
442*9880d681SAndroid Build Coastguard Worker                        "xvredp $XT, $XB", IIC_VecFP,
443*9880d681SAndroid Build Coastguard Worker                        [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
444*9880d681SAndroid Build Coastguard Worker  def XVRESP : XX2Form<60, 154,
445*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XB),
446*9880d681SAndroid Build Coastguard Worker                        "xvresp $XT, $XB", IIC_VecFP,
447*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker  def XVRSQRTEDP : XX2Form<60, 202,
450*9880d681SAndroid Build Coastguard Worker                           (outs vsrc:$XT), (ins vsrc:$XB),
451*9880d681SAndroid Build Coastguard Worker                           "xvrsqrtedp $XT, $XB", IIC_VecFP,
452*9880d681SAndroid Build Coastguard Worker                           [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
453*9880d681SAndroid Build Coastguard Worker  def XVRSQRTESP : XX2Form<60, 138,
454*9880d681SAndroid Build Coastguard Worker                           (outs vsrc:$XT), (ins vsrc:$XB),
455*9880d681SAndroid Build Coastguard Worker                           "xvrsqrtesp $XT, $XB", IIC_VecFP,
456*9880d681SAndroid Build Coastguard Worker                           [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
457*9880d681SAndroid Build Coastguard Worker
458*9880d681SAndroid Build Coastguard Worker  // Compare Instructions
459*9880d681SAndroid Build Coastguard Worker  def XSCMPODP : XX3Form_1<60, 43,
460*9880d681SAndroid Build Coastguard Worker                           (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
461*9880d681SAndroid Build Coastguard Worker                           "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
462*9880d681SAndroid Build Coastguard Worker  def XSCMPUDP : XX3Form_1<60, 35,
463*9880d681SAndroid Build Coastguard Worker                           (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
464*9880d681SAndroid Build Coastguard Worker                           "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker  defm XVCMPEQDP : XX3Form_Rcr<60, 99,
467*9880d681SAndroid Build Coastguard Worker                             "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare,
468*9880d681SAndroid Build Coastguard Worker                             int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>;
469*9880d681SAndroid Build Coastguard Worker  defm XVCMPEQSP : XX3Form_Rcr<60, 67,
470*9880d681SAndroid Build Coastguard Worker                             "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare,
471*9880d681SAndroid Build Coastguard Worker                             int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>;
472*9880d681SAndroid Build Coastguard Worker  defm XVCMPGEDP : XX3Form_Rcr<60, 115,
473*9880d681SAndroid Build Coastguard Worker                             "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare,
474*9880d681SAndroid Build Coastguard Worker                             int_ppc_vsx_xvcmpgedp, v2i64, v2f64>;
475*9880d681SAndroid Build Coastguard Worker  defm XVCMPGESP : XX3Form_Rcr<60, 83,
476*9880d681SAndroid Build Coastguard Worker                             "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare,
477*9880d681SAndroid Build Coastguard Worker                             int_ppc_vsx_xvcmpgesp, v4i32, v4f32>;
478*9880d681SAndroid Build Coastguard Worker  defm XVCMPGTDP : XX3Form_Rcr<60, 107,
479*9880d681SAndroid Build Coastguard Worker                             "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare,
480*9880d681SAndroid Build Coastguard Worker                             int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>;
481*9880d681SAndroid Build Coastguard Worker  defm XVCMPGTSP : XX3Form_Rcr<60, 75,
482*9880d681SAndroid Build Coastguard Worker                             "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare,
483*9880d681SAndroid Build Coastguard Worker                             int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>;
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker  // Move Instructions
486*9880d681SAndroid Build Coastguard Worker  def XSABSDP : XX2Form<60, 345,
487*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
488*9880d681SAndroid Build Coastguard Worker                      "xsabsdp $XT, $XB", IIC_VecFP,
489*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (fabs f64:$XB))]>;
490*9880d681SAndroid Build Coastguard Worker  def XSNABSDP : XX2Form<60, 361,
491*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
492*9880d681SAndroid Build Coastguard Worker                      "xsnabsdp $XT, $XB", IIC_VecFP,
493*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
494*9880d681SAndroid Build Coastguard Worker  def XSNEGDP : XX2Form<60, 377,
495*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
496*9880d681SAndroid Build Coastguard Worker                      "xsnegdp $XT, $XB", IIC_VecFP,
497*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (fneg f64:$XB))]>;
498*9880d681SAndroid Build Coastguard Worker  def XSCPSGNDP : XX3Form<60, 176,
499*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
500*9880d681SAndroid Build Coastguard Worker                      "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
501*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
502*9880d681SAndroid Build Coastguard Worker
503*9880d681SAndroid Build Coastguard Worker  def XVABSDP : XX2Form<60, 473,
504*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
505*9880d681SAndroid Build Coastguard Worker                      "xvabsdp $XT, $XB", IIC_VecFP,
506*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (fabs v2f64:$XB))]>;
507*9880d681SAndroid Build Coastguard Worker
508*9880d681SAndroid Build Coastguard Worker  def XVABSSP : XX2Form<60, 409,
509*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
510*9880d681SAndroid Build Coastguard Worker                      "xvabssp $XT, $XB", IIC_VecFP,
511*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (fabs v4f32:$XB))]>;
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker  def XVCPSGNDP : XX3Form<60, 240,
514*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
515*9880d681SAndroid Build Coastguard Worker                      "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
516*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
517*9880d681SAndroid Build Coastguard Worker  def XVCPSGNSP : XX3Form<60, 208,
518*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
519*9880d681SAndroid Build Coastguard Worker                      "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
520*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
521*9880d681SAndroid Build Coastguard Worker
522*9880d681SAndroid Build Coastguard Worker  def XVNABSDP : XX2Form<60, 489,
523*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
524*9880d681SAndroid Build Coastguard Worker                      "xvnabsdp $XT, $XB", IIC_VecFP,
525*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
526*9880d681SAndroid Build Coastguard Worker  def XVNABSSP : XX2Form<60, 425,
527*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
528*9880d681SAndroid Build Coastguard Worker                      "xvnabssp $XT, $XB", IIC_VecFP,
529*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
530*9880d681SAndroid Build Coastguard Worker
531*9880d681SAndroid Build Coastguard Worker  def XVNEGDP : XX2Form<60, 505,
532*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
533*9880d681SAndroid Build Coastguard Worker                      "xvnegdp $XT, $XB", IIC_VecFP,
534*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (fneg v2f64:$XB))]>;
535*9880d681SAndroid Build Coastguard Worker  def XVNEGSP : XX2Form<60, 441,
536*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
537*9880d681SAndroid Build Coastguard Worker                      "xvnegsp $XT, $XB", IIC_VecFP,
538*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (fneg v4f32:$XB))]>;
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Worker  // Conversion Instructions
541*9880d681SAndroid Build Coastguard Worker  def XSCVDPSP : XX2Form<60, 265,
542*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
543*9880d681SAndroid Build Coastguard Worker                      "xscvdpsp $XT, $XB", IIC_VecFP, []>;
544*9880d681SAndroid Build Coastguard Worker  def XSCVDPSXDS : XX2Form<60, 344,
545*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
546*9880d681SAndroid Build Coastguard Worker                      "xscvdpsxds $XT, $XB", IIC_VecFP,
547*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (PPCfctidz f64:$XB))]>;
548*9880d681SAndroid Build Coastguard Worker  def XSCVDPSXWS : XX2Form<60, 88,
549*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
550*9880d681SAndroid Build Coastguard Worker                      "xscvdpsxws $XT, $XB", IIC_VecFP,
551*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
552*9880d681SAndroid Build Coastguard Worker  def XSCVDPUXDS : XX2Form<60, 328,
553*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
554*9880d681SAndroid Build Coastguard Worker                      "xscvdpuxds $XT, $XB", IIC_VecFP,
555*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
556*9880d681SAndroid Build Coastguard Worker  def XSCVDPUXWS : XX2Form<60, 72,
557*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
558*9880d681SAndroid Build Coastguard Worker                      "xscvdpuxws $XT, $XB", IIC_VecFP,
559*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
560*9880d681SAndroid Build Coastguard Worker  def XSCVSPDP : XX2Form<60, 329,
561*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
562*9880d681SAndroid Build Coastguard Worker                      "xscvspdp $XT, $XB", IIC_VecFP, []>;
563*9880d681SAndroid Build Coastguard Worker  def XSCVSXDDP : XX2Form<60, 376,
564*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
565*9880d681SAndroid Build Coastguard Worker                      "xscvsxddp $XT, $XB", IIC_VecFP,
566*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (PPCfcfid f64:$XB))]>;
567*9880d681SAndroid Build Coastguard Worker  def XSCVUXDDP : XX2Form<60, 360,
568*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
569*9880d681SAndroid Build Coastguard Worker                      "xscvuxddp $XT, $XB", IIC_VecFP,
570*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
571*9880d681SAndroid Build Coastguard Worker
572*9880d681SAndroid Build Coastguard Worker  def XVCVDPSP : XX2Form<60, 393,
573*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
574*9880d681SAndroid Build Coastguard Worker                      "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
575*9880d681SAndroid Build Coastguard Worker  def XVCVDPSXDS : XX2Form<60, 472,
576*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
577*9880d681SAndroid Build Coastguard Worker                      "xvcvdpsxds $XT, $XB", IIC_VecFP,
578*9880d681SAndroid Build Coastguard Worker                      [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
579*9880d681SAndroid Build Coastguard Worker  def XVCVDPSXWS : XX2Form<60, 216,
580*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
581*9880d681SAndroid Build Coastguard Worker                      "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
582*9880d681SAndroid Build Coastguard Worker  def XVCVDPUXDS : XX2Form<60, 456,
583*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
584*9880d681SAndroid Build Coastguard Worker                      "xvcvdpuxds $XT, $XB", IIC_VecFP,
585*9880d681SAndroid Build Coastguard Worker                      [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
586*9880d681SAndroid Build Coastguard Worker  def XVCVDPUXWS : XX2Form<60, 200,
587*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
588*9880d681SAndroid Build Coastguard Worker                      "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
589*9880d681SAndroid Build Coastguard Worker
590*9880d681SAndroid Build Coastguard Worker  def XVCVSPDP : XX2Form<60, 457,
591*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
592*9880d681SAndroid Build Coastguard Worker                      "xvcvspdp $XT, $XB", IIC_VecFP, []>;
593*9880d681SAndroid Build Coastguard Worker  def XVCVSPSXDS : XX2Form<60, 408,
594*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
595*9880d681SAndroid Build Coastguard Worker                      "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
596*9880d681SAndroid Build Coastguard Worker  def XVCVSPSXWS : XX2Form<60, 152,
597*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
598*9880d681SAndroid Build Coastguard Worker                      "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
599*9880d681SAndroid Build Coastguard Worker  def XVCVSPUXDS : XX2Form<60, 392,
600*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
601*9880d681SAndroid Build Coastguard Worker                      "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
602*9880d681SAndroid Build Coastguard Worker  def XVCVSPUXWS : XX2Form<60, 136,
603*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
604*9880d681SAndroid Build Coastguard Worker                      "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
605*9880d681SAndroid Build Coastguard Worker  def XVCVSXDDP : XX2Form<60, 504,
606*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
607*9880d681SAndroid Build Coastguard Worker                      "xvcvsxddp $XT, $XB", IIC_VecFP,
608*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
609*9880d681SAndroid Build Coastguard Worker  def XVCVSXDSP : XX2Form<60, 440,
610*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
611*9880d681SAndroid Build Coastguard Worker                      "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
612*9880d681SAndroid Build Coastguard Worker  def XVCVSXWDP : XX2Form<60, 248,
613*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
614*9880d681SAndroid Build Coastguard Worker                      "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
615*9880d681SAndroid Build Coastguard Worker  def XVCVSXWSP : XX2Form<60, 184,
616*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
617*9880d681SAndroid Build Coastguard Worker                      "xvcvsxwsp $XT, $XB", IIC_VecFP,
618*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (sint_to_fp v4i32:$XB))]>;
619*9880d681SAndroid Build Coastguard Worker  def XVCVUXDDP : XX2Form<60, 488,
620*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
621*9880d681SAndroid Build Coastguard Worker                      "xvcvuxddp $XT, $XB", IIC_VecFP,
622*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
623*9880d681SAndroid Build Coastguard Worker  def XVCVUXDSP : XX2Form<60, 424,
624*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
625*9880d681SAndroid Build Coastguard Worker                      "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
626*9880d681SAndroid Build Coastguard Worker  def XVCVUXWDP : XX2Form<60, 232,
627*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
628*9880d681SAndroid Build Coastguard Worker                      "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
629*9880d681SAndroid Build Coastguard Worker  def XVCVUXWSP : XX2Form<60, 168,
630*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
631*9880d681SAndroid Build Coastguard Worker                      "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
632*9880d681SAndroid Build Coastguard Worker
633*9880d681SAndroid Build Coastguard Worker  // Rounding Instructions
634*9880d681SAndroid Build Coastguard Worker  def XSRDPI : XX2Form<60, 73,
635*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
636*9880d681SAndroid Build Coastguard Worker                      "xsrdpi $XT, $XB", IIC_VecFP,
637*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (frnd f64:$XB))]>;
638*9880d681SAndroid Build Coastguard Worker  def XSRDPIC : XX2Form<60, 107,
639*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
640*9880d681SAndroid Build Coastguard Worker                      "xsrdpic $XT, $XB", IIC_VecFP,
641*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (fnearbyint f64:$XB))]>;
642*9880d681SAndroid Build Coastguard Worker  def XSRDPIM : XX2Form<60, 121,
643*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
644*9880d681SAndroid Build Coastguard Worker                      "xsrdpim $XT, $XB", IIC_VecFP,
645*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (ffloor f64:$XB))]>;
646*9880d681SAndroid Build Coastguard Worker  def XSRDPIP : XX2Form<60, 105,
647*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
648*9880d681SAndroid Build Coastguard Worker                      "xsrdpip $XT, $XB", IIC_VecFP,
649*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (fceil f64:$XB))]>;
650*9880d681SAndroid Build Coastguard Worker  def XSRDPIZ : XX2Form<60, 89,
651*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XB),
652*9880d681SAndroid Build Coastguard Worker                      "xsrdpiz $XT, $XB", IIC_VecFP,
653*9880d681SAndroid Build Coastguard Worker                      [(set f64:$XT, (ftrunc f64:$XB))]>;
654*9880d681SAndroid Build Coastguard Worker
655*9880d681SAndroid Build Coastguard Worker  def XVRDPI : XX2Form<60, 201,
656*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
657*9880d681SAndroid Build Coastguard Worker                      "xvrdpi $XT, $XB", IIC_VecFP,
658*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (frnd v2f64:$XB))]>;
659*9880d681SAndroid Build Coastguard Worker  def XVRDPIC : XX2Form<60, 235,
660*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
661*9880d681SAndroid Build Coastguard Worker                      "xvrdpic $XT, $XB", IIC_VecFP,
662*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
663*9880d681SAndroid Build Coastguard Worker  def XVRDPIM : XX2Form<60, 249,
664*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
665*9880d681SAndroid Build Coastguard Worker                      "xvrdpim $XT, $XB", IIC_VecFP,
666*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
667*9880d681SAndroid Build Coastguard Worker  def XVRDPIP : XX2Form<60, 233,
668*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
669*9880d681SAndroid Build Coastguard Worker                      "xvrdpip $XT, $XB", IIC_VecFP,
670*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (fceil v2f64:$XB))]>;
671*9880d681SAndroid Build Coastguard Worker  def XVRDPIZ : XX2Form<60, 217,
672*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
673*9880d681SAndroid Build Coastguard Worker                      "xvrdpiz $XT, $XB", IIC_VecFP,
674*9880d681SAndroid Build Coastguard Worker                      [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
675*9880d681SAndroid Build Coastguard Worker
676*9880d681SAndroid Build Coastguard Worker  def XVRSPI : XX2Form<60, 137,
677*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
678*9880d681SAndroid Build Coastguard Worker                      "xvrspi $XT, $XB", IIC_VecFP,
679*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (frnd v4f32:$XB))]>;
680*9880d681SAndroid Build Coastguard Worker  def XVRSPIC : XX2Form<60, 171,
681*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
682*9880d681SAndroid Build Coastguard Worker                      "xvrspic $XT, $XB", IIC_VecFP,
683*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
684*9880d681SAndroid Build Coastguard Worker  def XVRSPIM : XX2Form<60, 185,
685*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
686*9880d681SAndroid Build Coastguard Worker                      "xvrspim $XT, $XB", IIC_VecFP,
687*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
688*9880d681SAndroid Build Coastguard Worker  def XVRSPIP : XX2Form<60, 169,
689*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
690*9880d681SAndroid Build Coastguard Worker                      "xvrspip $XT, $XB", IIC_VecFP,
691*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (fceil v4f32:$XB))]>;
692*9880d681SAndroid Build Coastguard Worker  def XVRSPIZ : XX2Form<60, 153,
693*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XB),
694*9880d681SAndroid Build Coastguard Worker                      "xvrspiz $XT, $XB", IIC_VecFP,
695*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
696*9880d681SAndroid Build Coastguard Worker
697*9880d681SAndroid Build Coastguard Worker  // Max/Min Instructions
698*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
699*9880d681SAndroid Build Coastguard Worker  def XSMAXDP : XX3Form<60, 160,
700*9880d681SAndroid Build Coastguard Worker                        (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
701*9880d681SAndroid Build Coastguard Worker                        "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
702*9880d681SAndroid Build Coastguard Worker                        [(set vsfrc:$XT,
703*9880d681SAndroid Build Coastguard Worker                              (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
704*9880d681SAndroid Build Coastguard Worker  def XSMINDP : XX3Form<60, 168,
705*9880d681SAndroid Build Coastguard Worker                        (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
706*9880d681SAndroid Build Coastguard Worker                        "xsmindp $XT, $XA, $XB", IIC_VecFP,
707*9880d681SAndroid Build Coastguard Worker                        [(set vsfrc:$XT,
708*9880d681SAndroid Build Coastguard Worker                              (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
709*9880d681SAndroid Build Coastguard Worker
710*9880d681SAndroid Build Coastguard Worker  def XVMAXDP : XX3Form<60, 224,
711*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
712*9880d681SAndroid Build Coastguard Worker                        "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
713*9880d681SAndroid Build Coastguard Worker                        [(set vsrc:$XT,
714*9880d681SAndroid Build Coastguard Worker                              (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
715*9880d681SAndroid Build Coastguard Worker  def XVMINDP : XX3Form<60, 232,
716*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
717*9880d681SAndroid Build Coastguard Worker                        "xvmindp $XT, $XA, $XB", IIC_VecFP,
718*9880d681SAndroid Build Coastguard Worker                        [(set vsrc:$XT,
719*9880d681SAndroid Build Coastguard Worker                              (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
720*9880d681SAndroid Build Coastguard Worker
721*9880d681SAndroid Build Coastguard Worker  def XVMAXSP : XX3Form<60, 192,
722*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
723*9880d681SAndroid Build Coastguard Worker                        "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
724*9880d681SAndroid Build Coastguard Worker                        [(set vsrc:$XT,
725*9880d681SAndroid Build Coastguard Worker                              (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
726*9880d681SAndroid Build Coastguard Worker  def XVMINSP : XX3Form<60, 200,
727*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
728*9880d681SAndroid Build Coastguard Worker                        "xvminsp $XT, $XA, $XB", IIC_VecFP,
729*9880d681SAndroid Build Coastguard Worker                        [(set vsrc:$XT,
730*9880d681SAndroid Build Coastguard Worker                              (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
731*9880d681SAndroid Build Coastguard Worker  } // isCommutable
732*9880d681SAndroid Build Coastguard Worker} // Uses = [RM]
733*9880d681SAndroid Build Coastguard Worker
734*9880d681SAndroid Build Coastguard Worker  // Logical Instructions
735*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
736*9880d681SAndroid Build Coastguard Worker  def XXLAND : XX3Form<60, 130,
737*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
738*9880d681SAndroid Build Coastguard Worker                       "xxland $XT, $XA, $XB", IIC_VecGeneral,
739*9880d681SAndroid Build Coastguard Worker                       [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
740*9880d681SAndroid Build Coastguard Worker  def XXLANDC : XX3Form<60, 138,
741*9880d681SAndroid Build Coastguard Worker                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
742*9880d681SAndroid Build Coastguard Worker                        "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
743*9880d681SAndroid Build Coastguard Worker                        [(set v4i32:$XT, (and v4i32:$XA,
744*9880d681SAndroid Build Coastguard Worker                                              (vnot_ppc v4i32:$XB)))]>;
745*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
746*9880d681SAndroid Build Coastguard Worker  def XXLNOR : XX3Form<60, 162,
747*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
748*9880d681SAndroid Build Coastguard Worker                       "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
749*9880d681SAndroid Build Coastguard Worker                       [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
750*9880d681SAndroid Build Coastguard Worker                                                   v4i32:$XB)))]>;
751*9880d681SAndroid Build Coastguard Worker  def XXLOR : XX3Form<60, 146,
752*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
753*9880d681SAndroid Build Coastguard Worker                      "xxlor $XT, $XA, $XB", IIC_VecGeneral,
754*9880d681SAndroid Build Coastguard Worker                      [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
755*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
756*9880d681SAndroid Build Coastguard Worker  def XXLORf: XX3Form<60, 146,
757*9880d681SAndroid Build Coastguard Worker                      (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
758*9880d681SAndroid Build Coastguard Worker                      "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
759*9880d681SAndroid Build Coastguard Worker  def XXLXOR : XX3Form<60, 154,
760*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
761*9880d681SAndroid Build Coastguard Worker                       "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
762*9880d681SAndroid Build Coastguard Worker                       [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
763*9880d681SAndroid Build Coastguard Worker  } // isCommutable
764*9880d681SAndroid Build Coastguard Worker
765*9880d681SAndroid Build Coastguard Worker  // Permutation Instructions
766*9880d681SAndroid Build Coastguard Worker  def XXMRGHW : XX3Form<60, 18,
767*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
768*9880d681SAndroid Build Coastguard Worker                       "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
769*9880d681SAndroid Build Coastguard Worker  def XXMRGLW : XX3Form<60, 50,
770*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
771*9880d681SAndroid Build Coastguard Worker                       "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
772*9880d681SAndroid Build Coastguard Worker
773*9880d681SAndroid Build Coastguard Worker  def XXPERMDI : XX3Form_2<60, 10,
774*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
775*9880d681SAndroid Build Coastguard Worker                       "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
776*9880d681SAndroid Build Coastguard Worker  def XXSEL : XX4Form<60, 3,
777*9880d681SAndroid Build Coastguard Worker                      (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
778*9880d681SAndroid Build Coastguard Worker                      "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
779*9880d681SAndroid Build Coastguard Worker
780*9880d681SAndroid Build Coastguard Worker  def XXSLDWI : XX3Form_2<60, 2,
781*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
782*9880d681SAndroid Build Coastguard Worker                       "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm,
783*9880d681SAndroid Build Coastguard Worker                       [(set v4i32:$XT, (PPCvecshl v4i32:$XA, v4i32:$XB,
784*9880d681SAndroid Build Coastguard Worker                                                  imm32SExt16:$SHW))]>;
785*9880d681SAndroid Build Coastguard Worker  def XXSPLTW : XX2Form_2<60, 164,
786*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
787*9880d681SAndroid Build Coastguard Worker                       "xxspltw $XT, $XB, $UIM", IIC_VecPerm,
788*9880d681SAndroid Build Coastguard Worker                       [(set v4i32:$XT,
789*9880d681SAndroid Build Coastguard Worker                             (PPCxxsplt v4i32:$XB, imm32SExt16:$UIM))]>;
790*9880d681SAndroid Build Coastguard Worker} // hasSideEffects
791*9880d681SAndroid Build Coastguard Worker
792*9880d681SAndroid Build Coastguard Worker// SELECT_CC_* - Used to implement the SELECT_CC DAG operation.  Expanded after
793*9880d681SAndroid Build Coastguard Worker// instruction selection into a branch sequence.
794*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1,    // Expanded after instruction selection.
795*9880d681SAndroid Build Coastguard Worker    PPC970_Single = 1 in {
796*9880d681SAndroid Build Coastguard Worker
797*9880d681SAndroid Build Coastguard Worker  def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
798*9880d681SAndroid Build Coastguard Worker                             (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
799*9880d681SAndroid Build Coastguard Worker                             "#SELECT_CC_VSRC",
800*9880d681SAndroid Build Coastguard Worker                             []>;
801*9880d681SAndroid Build Coastguard Worker  def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
802*9880d681SAndroid Build Coastguard Worker                          (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
803*9880d681SAndroid Build Coastguard Worker                          "#SELECT_VSRC",
804*9880d681SAndroid Build Coastguard Worker                          [(set v2f64:$dst,
805*9880d681SAndroid Build Coastguard Worker                                (select i1:$cond, v2f64:$T, v2f64:$F))]>;
806*9880d681SAndroid Build Coastguard Worker  def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
807*9880d681SAndroid Build Coastguard Worker                              (ins crrc:$cond, f8rc:$T, f8rc:$F,
808*9880d681SAndroid Build Coastguard Worker                               i32imm:$BROPC), "#SELECT_CC_VSFRC",
809*9880d681SAndroid Build Coastguard Worker                              []>;
810*9880d681SAndroid Build Coastguard Worker  def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
811*9880d681SAndroid Build Coastguard Worker                           (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
812*9880d681SAndroid Build Coastguard Worker                           "#SELECT_VSFRC",
813*9880d681SAndroid Build Coastguard Worker                           [(set f64:$dst,
814*9880d681SAndroid Build Coastguard Worker                                 (select i1:$cond, f64:$T, f64:$F))]>;
815*9880d681SAndroid Build Coastguard Worker  def SELECT_CC_VSSRC: Pseudo<(outs f4rc:$dst),
816*9880d681SAndroid Build Coastguard Worker                              (ins crrc:$cond, f4rc:$T, f4rc:$F,
817*9880d681SAndroid Build Coastguard Worker                               i32imm:$BROPC), "#SELECT_CC_VSSRC",
818*9880d681SAndroid Build Coastguard Worker                              []>;
819*9880d681SAndroid Build Coastguard Worker  def SELECT_VSSRC: Pseudo<(outs f4rc:$dst),
820*9880d681SAndroid Build Coastguard Worker                           (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
821*9880d681SAndroid Build Coastguard Worker                           "#SELECT_VSSRC",
822*9880d681SAndroid Build Coastguard Worker                           [(set f32:$dst,
823*9880d681SAndroid Build Coastguard Worker                                 (select i1:$cond, f32:$T, f32:$F))]>;
824*9880d681SAndroid Build Coastguard Worker} // usesCustomInserter
825*9880d681SAndroid Build Coastguard Worker} // AddedComplexity
826*9880d681SAndroid Build Coastguard Worker
827*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xvmovdp $XT, $XB",
828*9880d681SAndroid Build Coastguard Worker                (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
829*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xvmovsp $XT, $XB",
830*9880d681SAndroid Build Coastguard Worker                (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
831*9880d681SAndroid Build Coastguard Worker
832*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xxspltd $XT, $XB, 0",
833*9880d681SAndroid Build Coastguard Worker                (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
834*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xxspltd $XT, $XB, 1",
835*9880d681SAndroid Build Coastguard Worker                (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
836*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xxmrghd $XT, $XA, $XB",
837*9880d681SAndroid Build Coastguard Worker                (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
838*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xxmrgld $XT, $XA, $XB",
839*9880d681SAndroid Build Coastguard Worker                (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
840*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xxswapd $XT, $XB",
841*9880d681SAndroid Build Coastguard Worker                (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
842*9880d681SAndroid Build Coastguard Worker
843*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
844*9880d681SAndroid Build Coastguard Worker
845*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBigEndian] in {
846*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (scalar_to_vector f64:$A)),
847*9880d681SAndroid Build Coastguard Worker          (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
848*9880d681SAndroid Build Coastguard Worker
849*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v2f64:$S, 0)),
850*9880d681SAndroid Build Coastguard Worker          (f64 (EXTRACT_SUBREG $S, sub_64))>;
851*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v2f64:$S, 1)),
852*9880d681SAndroid Build Coastguard Worker          (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
853*9880d681SAndroid Build Coastguard Worker}
854*9880d681SAndroid Build Coastguard Worker
855*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLittleEndian] in {
856*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (scalar_to_vector f64:$A)),
857*9880d681SAndroid Build Coastguard Worker          (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
858*9880d681SAndroid Build Coastguard Worker                           (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
859*9880d681SAndroid Build Coastguard Worker
860*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v2f64:$S, 0)),
861*9880d681SAndroid Build Coastguard Worker          (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
862*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v2f64:$S, 1)),
863*9880d681SAndroid Build Coastguard Worker          (f64 (EXTRACT_SUBREG $S, sub_64))>;
864*9880d681SAndroid Build Coastguard Worker}
865*9880d681SAndroid Build Coastguard Worker
866*9880d681SAndroid Build Coastguard Worker// Additional fnmsub patterns: -a*c + b == -(a*c - b)
867*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
868*9880d681SAndroid Build Coastguard Worker          (XSNMSUBADP $B, $C, $A)>;
869*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
870*9880d681SAndroid Build Coastguard Worker          (XSNMSUBADP $B, $C, $A)>;
871*9880d681SAndroid Build Coastguard Worker
872*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
873*9880d681SAndroid Build Coastguard Worker          (XVNMSUBADP $B, $C, $A)>;
874*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
875*9880d681SAndroid Build Coastguard Worker          (XVNMSUBADP $B, $C, $A)>;
876*9880d681SAndroid Build Coastguard Worker
877*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
878*9880d681SAndroid Build Coastguard Worker          (XVNMSUBASP $B, $C, $A)>;
879*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
880*9880d681SAndroid Build Coastguard Worker          (XVNMSUBASP $B, $C, $A)>;
881*9880d681SAndroid Build Coastguard Worker
882*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert v4f32:$A)),
883*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VSRC)>;
884*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert v4i32:$A)),
885*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VSRC)>;
886*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert v8i16:$A)),
887*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VSRC)>;
888*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert v16i8:$A)),
889*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VSRC)>;
890*9880d681SAndroid Build Coastguard Worker
891*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert v2f64:$A)),
892*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
893*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert v2f64:$A)),
894*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
895*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert v2f64:$A)),
896*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
897*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert v2f64:$A)),
898*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
899*9880d681SAndroid Build Coastguard Worker
900*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert v4f32:$A)),
901*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VSRC)>;
902*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert v4i32:$A)),
903*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VSRC)>;
904*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert v8i16:$A)),
905*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VSRC)>;
906*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert v16i8:$A)),
907*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VSRC)>;
908*9880d681SAndroid Build Coastguard Worker
909*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert v2i64:$A)),
910*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
911*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert v2i64:$A)),
912*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
913*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert v2i64:$A)),
914*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
915*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert v2i64:$A)),
916*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
917*9880d681SAndroid Build Coastguard Worker
918*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert v2i64:$A)),
919*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
920*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert v2f64:$A)),
921*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
922*9880d681SAndroid Build Coastguard Worker
923*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert v1i128:$A)),
924*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
925*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i128 (bitconvert v2f64:$A)),
926*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $A, VRRC)>;
927*9880d681SAndroid Build Coastguard Worker
928*9880d681SAndroid Build Coastguard Worker// sign extension patterns
929*9880d681SAndroid Build Coastguard Worker// To extend "in place" from v2i32 to v2i64, we have input data like:
930*9880d681SAndroid Build Coastguard Worker// | undef | i32 | undef | i32 |
931*9880d681SAndroid Build Coastguard Worker// but xvcvsxwdp expects the input in big-Endian format:
932*9880d681SAndroid Build Coastguard Worker// | i32 | undef | i32 | undef |
933*9880d681SAndroid Build Coastguard Worker// so we need to shift everything to the left by one i32 (word) before
934*9880d681SAndroid Build Coastguard Worker// the conversion.
935*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg v2i64:$C, v2i32),
936*9880d681SAndroid Build Coastguard Worker          (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
937*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
938*9880d681SAndroid Build Coastguard Worker          (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
939*9880d681SAndroid Build Coastguard Worker
940*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 0)),
941*9880d681SAndroid Build Coastguard Worker          (v2f64 (XVCVSXWDP (v2i64 (XXMRGHW $C, $C))))>;
942*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 1)),
943*9880d681SAndroid Build Coastguard Worker          (v2f64 (XVCVSXWDP (v2i64 (XXMRGLW $C, $C))))>;
944*9880d681SAndroid Build Coastguard Worker
945*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 0)),
946*9880d681SAndroid Build Coastguard Worker          (v2f64 (XVCVUXWDP (v2i64 (XXMRGHW $C, $C))))>;
947*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 1)),
948*9880d681SAndroid Build Coastguard Worker          (v2f64 (XVCVUXWDP (v2i64 (XXMRGLW $C, $C))))>;
949*9880d681SAndroid Build Coastguard Worker
950*9880d681SAndroid Build Coastguard Worker// Loads.
951*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
952*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
953*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
954*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
955*9880d681SAndroid Build Coastguard Worker
956*9880d681SAndroid Build Coastguard Worker// Stores.
957*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
958*9880d681SAndroid Build Coastguard Worker          (STXVD2X $rS, xoaddr:$dst)>;
959*9880d681SAndroid Build Coastguard Workerdef : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
960*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
961*9880d681SAndroid Build Coastguard Worker          (STXVW4X $rS, xoaddr:$dst)>;
962*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
963*9880d681SAndroid Build Coastguard Worker
964*9880d681SAndroid Build Coastguard Worker// Permutes.
965*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
966*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
967*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
968*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
969*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (PPCswapNoChain v2f64:$src)), (XXPERMDI $src, $src, 2)>;
970*9880d681SAndroid Build Coastguard Worker
971*9880d681SAndroid Build Coastguard Worker// Selects.
972*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
973*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
974*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
975*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
976*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
977*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
978*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
979*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
980*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
981*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
982*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
983*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
984*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
985*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
986*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
987*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
988*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
989*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
990*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
991*9880d681SAndroid Build Coastguard Worker          (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
992*9880d681SAndroid Build Coastguard Worker
993*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
994*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
995*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
996*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
997*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
998*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRORC  $lhs, $rhs), $tval, $fval)>;
999*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
1000*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1001*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
1002*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
1003*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
1004*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1005*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
1006*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1007*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
1008*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1009*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
1010*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1011*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
1012*9880d681SAndroid Build Coastguard Worker          (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1013*9880d681SAndroid Build Coastguard Worker
1014*9880d681SAndroid Build Coastguard Worker// Divides.
1015*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
1016*9880d681SAndroid Build Coastguard Worker          (XVDIVSP $A, $B)>;
1017*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
1018*9880d681SAndroid Build Coastguard Worker          (XVDIVDP $A, $B)>;
1019*9880d681SAndroid Build Coastguard Worker
1020*9880d681SAndroid Build Coastguard Worker// Reciprocal estimate
1021*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_vsx_xvresp v4f32:$A),
1022*9880d681SAndroid Build Coastguard Worker          (XVRESP $A)>;
1023*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_vsx_xvredp v2f64:$A),
1024*9880d681SAndroid Build Coastguard Worker          (XVREDP $A)>;
1025*9880d681SAndroid Build Coastguard Worker
1026*9880d681SAndroid Build Coastguard Worker// Recip. square root estimate
1027*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
1028*9880d681SAndroid Build Coastguard Worker          (XVRSQRTESP $A)>;
1029*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
1030*9880d681SAndroid Build Coastguard Worker          (XVRSQRTEDP $A)>;
1031*9880d681SAndroid Build Coastguard Worker
1032*9880d681SAndroid Build Coastguard Worker} // AddedComplexity
1033*9880d681SAndroid Build Coastguard Worker} // HasVSX
1034*9880d681SAndroid Build Coastguard Worker
1035*9880d681SAndroid Build Coastguard Worker// The following VSX instructions were introduced in Power ISA 2.07
1036*9880d681SAndroid Build Coastguard Worker/* FIXME: if the operands are v2i64, these patterns will not match.
1037*9880d681SAndroid Build Coastguard Worker   we should define new patterns or otherwise match the same patterns
1038*9880d681SAndroid Build Coastguard Worker   when the elements are larger than i32.
1039*9880d681SAndroid Build Coastguard Worker*/
1040*9880d681SAndroid Build Coastguard Workerdef HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
1041*9880d681SAndroid Build Coastguard Workerdef HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
1042*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasP8Vector] in {
1043*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
1044*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
1045*9880d681SAndroid Build Coastguard Worker    def XXLEQV : XX3Form<60, 186,
1046*9880d681SAndroid Build Coastguard Worker                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1047*9880d681SAndroid Build Coastguard Worker                         "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
1048*9880d681SAndroid Build Coastguard Worker                         [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
1049*9880d681SAndroid Build Coastguard Worker    def XXLNAND : XX3Form<60, 178,
1050*9880d681SAndroid Build Coastguard Worker                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1051*9880d681SAndroid Build Coastguard Worker                          "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
1052*9880d681SAndroid Build Coastguard Worker                          [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
1053*9880d681SAndroid Build Coastguard Worker                                                    v4i32:$XB)))]>;
1054*9880d681SAndroid Build Coastguard Worker  } // isCommutable
1055*9880d681SAndroid Build Coastguard Worker
1056*9880d681SAndroid Build Coastguard Worker  def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
1057*9880d681SAndroid Build Coastguard Worker            (XXLEQV $A, $B)>;
1058*9880d681SAndroid Build Coastguard Worker
1059*9880d681SAndroid Build Coastguard Worker  def XXLORC : XX3Form<60, 170,
1060*9880d681SAndroid Build Coastguard Worker                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1061*9880d681SAndroid Build Coastguard Worker                       "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
1062*9880d681SAndroid Build Coastguard Worker                       [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
1063*9880d681SAndroid Build Coastguard Worker
1064*9880d681SAndroid Build Coastguard Worker  // VSX scalar loads introduced in ISA 2.07
1065*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1 in {
1066*9880d681SAndroid Build Coastguard Worker    def LXSSPX : XX1Form<31, 524, (outs vssrc:$XT), (ins memrr:$src),
1067*9880d681SAndroid Build Coastguard Worker                         "lxsspx $XT, $src", IIC_LdStLFD,
1068*9880d681SAndroid Build Coastguard Worker                         [(set f32:$XT, (load xoaddr:$src))]>;
1069*9880d681SAndroid Build Coastguard Worker    def LXSIWAX : XX1Form<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
1070*9880d681SAndroid Build Coastguard Worker                          "lxsiwax $XT, $src", IIC_LdStLFD,
1071*9880d681SAndroid Build Coastguard Worker                          [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
1072*9880d681SAndroid Build Coastguard Worker    def LXSIWZX : XX1Form<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
1073*9880d681SAndroid Build Coastguard Worker                          "lxsiwzx $XT, $src", IIC_LdStLFD,
1074*9880d681SAndroid Build Coastguard Worker                          [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
1075*9880d681SAndroid Build Coastguard Worker  } // mayLoad
1076*9880d681SAndroid Build Coastguard Worker
1077*9880d681SAndroid Build Coastguard Worker  // VSX scalar stores introduced in ISA 2.07
1078*9880d681SAndroid Build Coastguard Worker  let mayStore = 1 in {
1079*9880d681SAndroid Build Coastguard Worker    def STXSSPX : XX1Form<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
1080*9880d681SAndroid Build Coastguard Worker                          "stxsspx $XT, $dst", IIC_LdStSTFD,
1081*9880d681SAndroid Build Coastguard Worker                          [(store f32:$XT, xoaddr:$dst)]>;
1082*9880d681SAndroid Build Coastguard Worker    def STXSIWX : XX1Form<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
1083*9880d681SAndroid Build Coastguard Worker                          "stxsiwx $XT, $dst", IIC_LdStSTFD,
1084*9880d681SAndroid Build Coastguard Worker                          [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
1085*9880d681SAndroid Build Coastguard Worker  } // mayStore
1086*9880d681SAndroid Build Coastguard Worker
1087*9880d681SAndroid Build Coastguard Worker  def : Pat<(f64 (extloadf32 xoaddr:$src)),
1088*9880d681SAndroid Build Coastguard Worker            (COPY_TO_REGCLASS (LXSSPX xoaddr:$src), VSFRC)>;
1089*9880d681SAndroid Build Coastguard Worker  def : Pat<(f64 (fextend f32:$src)),
1090*9880d681SAndroid Build Coastguard Worker            (COPY_TO_REGCLASS $src, VSFRC)>;
1091*9880d681SAndroid Build Coastguard Worker
1092*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
1093*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1094*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
1095*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1096*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
1097*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1098*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
1099*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1100*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
1101*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1102*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
1103*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1104*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
1105*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1106*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
1107*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1108*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
1109*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1110*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
1111*9880d681SAndroid Build Coastguard Worker            (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1112*9880d681SAndroid Build Coastguard Worker
1113*9880d681SAndroid Build Coastguard Worker  // VSX Elementary Scalar FP arithmetic (SP)
1114*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
1115*9880d681SAndroid Build Coastguard Worker    def XSADDSP : XX3Form<60, 0,
1116*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1117*9880d681SAndroid Build Coastguard Worker                          "xsaddsp $XT, $XA, $XB", IIC_VecFP,
1118*9880d681SAndroid Build Coastguard Worker                          [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
1119*9880d681SAndroid Build Coastguard Worker    def XSMULSP : XX3Form<60, 16,
1120*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1121*9880d681SAndroid Build Coastguard Worker                          "xsmulsp $XT, $XA, $XB", IIC_VecFP,
1122*9880d681SAndroid Build Coastguard Worker                          [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
1123*9880d681SAndroid Build Coastguard Worker  } // isCommutable
1124*9880d681SAndroid Build Coastguard Worker
1125*9880d681SAndroid Build Coastguard Worker  def XSDIVSP : XX3Form<60, 24,
1126*9880d681SAndroid Build Coastguard Worker                        (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1127*9880d681SAndroid Build Coastguard Worker                        "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
1128*9880d681SAndroid Build Coastguard Worker                        [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
1129*9880d681SAndroid Build Coastguard Worker  def XSRESP : XX2Form<60, 26,
1130*9880d681SAndroid Build Coastguard Worker                        (outs vssrc:$XT), (ins vssrc:$XB),
1131*9880d681SAndroid Build Coastguard Worker                        "xsresp $XT, $XB", IIC_VecFP,
1132*9880d681SAndroid Build Coastguard Worker                        [(set f32:$XT, (PPCfre f32:$XB))]>;
1133*9880d681SAndroid Build Coastguard Worker  def XSSQRTSP : XX2Form<60, 11,
1134*9880d681SAndroid Build Coastguard Worker                        (outs vssrc:$XT), (ins vssrc:$XB),
1135*9880d681SAndroid Build Coastguard Worker                        "xssqrtsp $XT, $XB", IIC_FPSqrtS,
1136*9880d681SAndroid Build Coastguard Worker                        [(set f32:$XT, (fsqrt f32:$XB))]>;
1137*9880d681SAndroid Build Coastguard Worker  def XSRSQRTESP : XX2Form<60, 10,
1138*9880d681SAndroid Build Coastguard Worker                           (outs vssrc:$XT), (ins vssrc:$XB),
1139*9880d681SAndroid Build Coastguard Worker                           "xsrsqrtesp $XT, $XB", IIC_VecFP,
1140*9880d681SAndroid Build Coastguard Worker                           [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
1141*9880d681SAndroid Build Coastguard Worker  def XSSUBSP : XX3Form<60, 8,
1142*9880d681SAndroid Build Coastguard Worker                        (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
1143*9880d681SAndroid Build Coastguard Worker                        "xssubsp $XT, $XA, $XB", IIC_VecFP,
1144*9880d681SAndroid Build Coastguard Worker                        [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
1145*9880d681SAndroid Build Coastguard Worker
1146*9880d681SAndroid Build Coastguard Worker  // FMA Instructions
1147*9880d681SAndroid Build Coastguard Worker  let BaseName = "XSMADDASP" in {
1148*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
1149*9880d681SAndroid Build Coastguard Worker  def XSMADDASP : XX3Form<60, 1,
1150*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT),
1151*9880d681SAndroid Build Coastguard Worker                          (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1152*9880d681SAndroid Build Coastguard Worker                          "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
1153*9880d681SAndroid Build Coastguard Worker                          [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
1154*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1155*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
1156*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
1157*9880d681SAndroid Build Coastguard Worker  def XSMADDMSP : XX3Form<60, 9,
1158*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT),
1159*9880d681SAndroid Build Coastguard Worker                          (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1160*9880d681SAndroid Build Coastguard Worker                          "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1161*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1162*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
1163*9880d681SAndroid Build Coastguard Worker  }
1164*9880d681SAndroid Build Coastguard Worker
1165*9880d681SAndroid Build Coastguard Worker  let BaseName = "XSMSUBASP" in {
1166*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
1167*9880d681SAndroid Build Coastguard Worker  def XSMSUBASP : XX3Form<60, 17,
1168*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT),
1169*9880d681SAndroid Build Coastguard Worker                          (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1170*9880d681SAndroid Build Coastguard Worker                          "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
1171*9880d681SAndroid Build Coastguard Worker                          [(set f32:$XT, (fma f32:$XA, f32:$XB,
1172*9880d681SAndroid Build Coastguard Worker                                              (fneg f32:$XTi)))]>,
1173*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1174*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
1175*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
1176*9880d681SAndroid Build Coastguard Worker  def XSMSUBMSP : XX3Form<60, 25,
1177*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT),
1178*9880d681SAndroid Build Coastguard Worker                          (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1179*9880d681SAndroid Build Coastguard Worker                          "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1180*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1181*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
1182*9880d681SAndroid Build Coastguard Worker  }
1183*9880d681SAndroid Build Coastguard Worker
1184*9880d681SAndroid Build Coastguard Worker  let BaseName = "XSNMADDASP" in {
1185*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
1186*9880d681SAndroid Build Coastguard Worker  def XSNMADDASP : XX3Form<60, 129,
1187*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT),
1188*9880d681SAndroid Build Coastguard Worker                          (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1189*9880d681SAndroid Build Coastguard Worker                          "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
1190*9880d681SAndroid Build Coastguard Worker                          [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1191*9880d681SAndroid Build Coastguard Worker                                                    f32:$XTi)))]>,
1192*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1193*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
1194*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
1195*9880d681SAndroid Build Coastguard Worker  def XSNMADDMSP : XX3Form<60, 137,
1196*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT),
1197*9880d681SAndroid Build Coastguard Worker                          (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1198*9880d681SAndroid Build Coastguard Worker                          "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
1199*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1200*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
1201*9880d681SAndroid Build Coastguard Worker  }
1202*9880d681SAndroid Build Coastguard Worker
1203*9880d681SAndroid Build Coastguard Worker  let BaseName = "XSNMSUBASP" in {
1204*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in
1205*9880d681SAndroid Build Coastguard Worker  def XSNMSUBASP : XX3Form<60, 145,
1206*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT),
1207*9880d681SAndroid Build Coastguard Worker                          (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1208*9880d681SAndroid Build Coastguard Worker                          "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
1209*9880d681SAndroid Build Coastguard Worker                          [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
1210*9880d681SAndroid Build Coastguard Worker                                                    (fneg f32:$XTi))))]>,
1211*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1212*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
1213*9880d681SAndroid Build Coastguard Worker  let IsVSXFMAAlt = 1 in
1214*9880d681SAndroid Build Coastguard Worker  def XSNMSUBMSP : XX3Form<60, 153,
1215*9880d681SAndroid Build Coastguard Worker                          (outs vssrc:$XT),
1216*9880d681SAndroid Build Coastguard Worker                          (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
1217*9880d681SAndroid Build Coastguard Worker                          "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
1218*9880d681SAndroid Build Coastguard Worker                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
1219*9880d681SAndroid Build Coastguard Worker                          AltVSXFMARel;
1220*9880d681SAndroid Build Coastguard Worker  }
1221*9880d681SAndroid Build Coastguard Worker
1222*9880d681SAndroid Build Coastguard Worker  // Single Precision Conversions (FP <-> INT)
1223*9880d681SAndroid Build Coastguard Worker  def XSCVSXDSP : XX2Form<60, 312,
1224*9880d681SAndroid Build Coastguard Worker                      (outs vssrc:$XT), (ins vsfrc:$XB),
1225*9880d681SAndroid Build Coastguard Worker                      "xscvsxdsp $XT, $XB", IIC_VecFP,
1226*9880d681SAndroid Build Coastguard Worker                      [(set f32:$XT, (PPCfcfids f64:$XB))]>;
1227*9880d681SAndroid Build Coastguard Worker  def XSCVUXDSP : XX2Form<60, 296,
1228*9880d681SAndroid Build Coastguard Worker                      (outs vssrc:$XT), (ins vsfrc:$XB),
1229*9880d681SAndroid Build Coastguard Worker                      "xscvuxdsp $XT, $XB", IIC_VecFP,
1230*9880d681SAndroid Build Coastguard Worker                      [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
1231*9880d681SAndroid Build Coastguard Worker
1232*9880d681SAndroid Build Coastguard Worker  // Conversions between vector and scalar single precision
1233*9880d681SAndroid Build Coastguard Worker  def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
1234*9880d681SAndroid Build Coastguard Worker                          "xscvdpspn $XT, $XB", IIC_VecFP, []>;
1235*9880d681SAndroid Build Coastguard Worker  def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
1236*9880d681SAndroid Build Coastguard Worker                          "xscvspdpn $XT, $XB", IIC_VecFP, []>;
1237*9880d681SAndroid Build Coastguard Worker
1238*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 400
1239*9880d681SAndroid Build Coastguard Worker} // HasP8Vector
1240*9880d681SAndroid Build Coastguard Worker
1241*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasDirectMove] in {
1242*9880d681SAndroid Build Coastguard Worker  // VSX direct move instructions
1243*9880d681SAndroid Build Coastguard Worker  def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
1244*9880d681SAndroid Build Coastguard Worker                              "mfvsrd $rA, $XT", IIC_VecGeneral,
1245*9880d681SAndroid Build Coastguard Worker                              [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
1246*9880d681SAndroid Build Coastguard Worker      Requires<[In64BitMode]>;
1247*9880d681SAndroid Build Coastguard Worker  def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
1248*9880d681SAndroid Build Coastguard Worker                               "mfvsrwz $rA, $XT", IIC_VecGeneral,
1249*9880d681SAndroid Build Coastguard Worker                               [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
1250*9880d681SAndroid Build Coastguard Worker  def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
1251*9880d681SAndroid Build Coastguard Worker                              "mtvsrd $XT, $rA", IIC_VecGeneral,
1252*9880d681SAndroid Build Coastguard Worker                              [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
1253*9880d681SAndroid Build Coastguard Worker      Requires<[In64BitMode]>;
1254*9880d681SAndroid Build Coastguard Worker  def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
1255*9880d681SAndroid Build Coastguard Worker                               "mtvsrwa $XT, $rA", IIC_VecGeneral,
1256*9880d681SAndroid Build Coastguard Worker                               [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
1257*9880d681SAndroid Build Coastguard Worker  def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
1258*9880d681SAndroid Build Coastguard Worker                               "mtvsrwz $XT, $rA", IIC_VecGeneral,
1259*9880d681SAndroid Build Coastguard Worker                               [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
1260*9880d681SAndroid Build Coastguard Worker} // HasDirectMove
1261*9880d681SAndroid Build Coastguard Worker
1262*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsISA3_0, HasDirectMove] in {
1263*9880d681SAndroid Build Coastguard Worker  def MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA),
1264*9880d681SAndroid Build Coastguard Worker                              "mtvsrws $XT, $rA", IIC_VecGeneral,
1265*9880d681SAndroid Build Coastguard Worker                              []>;
1266*9880d681SAndroid Build Coastguard Worker
1267*9880d681SAndroid Build Coastguard Worker  def MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
1268*9880d681SAndroid Build Coastguard Worker                       "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral,
1269*9880d681SAndroid Build Coastguard Worker                       []>, Requires<[In64BitMode]>;
1270*9880d681SAndroid Build Coastguard Worker
1271*9880d681SAndroid Build Coastguard Worker  def MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT),
1272*9880d681SAndroid Build Coastguard Worker                              "mfvsrld $rA, $XT", IIC_VecGeneral,
1273*9880d681SAndroid Build Coastguard Worker                              []>, Requires<[In64BitMode]>;
1274*9880d681SAndroid Build Coastguard Worker
1275*9880d681SAndroid Build Coastguard Worker} // IsISA3_0, HasDirectMove
1276*9880d681SAndroid Build Coastguard Worker
1277*9880d681SAndroid Build Coastguard Worker/*  Direct moves of various widths from GPR's into VSR's. Each move lines
1278*9880d681SAndroid Build Coastguard Worker    the value up into element 0 (both BE and LE). Namely, entities smaller than
1279*9880d681SAndroid Build Coastguard Worker    a doubleword are shifted left and moved for BE. For LE, they're moved, then
1280*9880d681SAndroid Build Coastguard Worker    swapped to go into the least significant element of the VSR.
1281*9880d681SAndroid Build Coastguard Worker*/
1282*9880d681SAndroid Build Coastguard Workerdef MovesToVSR {
1283*9880d681SAndroid Build Coastguard Worker  dag BE_BYTE_0 =
1284*9880d681SAndroid Build Coastguard Worker    (MTVSRD
1285*9880d681SAndroid Build Coastguard Worker      (RLDICR
1286*9880d681SAndroid Build Coastguard Worker        (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
1287*9880d681SAndroid Build Coastguard Worker  dag BE_HALF_0 =
1288*9880d681SAndroid Build Coastguard Worker    (MTVSRD
1289*9880d681SAndroid Build Coastguard Worker      (RLDICR
1290*9880d681SAndroid Build Coastguard Worker        (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
1291*9880d681SAndroid Build Coastguard Worker  dag BE_WORD_0 =
1292*9880d681SAndroid Build Coastguard Worker    (MTVSRD
1293*9880d681SAndroid Build Coastguard Worker      (RLDICR
1294*9880d681SAndroid Build Coastguard Worker        (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
1295*9880d681SAndroid Build Coastguard Worker  dag BE_DWORD_0 = (MTVSRD $A);
1296*9880d681SAndroid Build Coastguard Worker
1297*9880d681SAndroid Build Coastguard Worker  dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
1298*9880d681SAndroid Build Coastguard Worker  dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1299*9880d681SAndroid Build Coastguard Worker                                        LE_MTVSRW, sub_64));
1300*9880d681SAndroid Build Coastguard Worker  dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
1301*9880d681SAndroid Build Coastguard Worker  dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1302*9880d681SAndroid Build Coastguard Worker                                         BE_DWORD_0, sub_64));
1303*9880d681SAndroid Build Coastguard Worker  dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
1304*9880d681SAndroid Build Coastguard Worker}
1305*9880d681SAndroid Build Coastguard Worker
1306*9880d681SAndroid Build Coastguard Worker/*  Patterns for extracting elements out of vectors. Integer elements are
1307*9880d681SAndroid Build Coastguard Worker    extracted using direct move operations. Patterns for extracting elements
1308*9880d681SAndroid Build Coastguard Worker    whose indices are not available at compile time are also provided with
1309*9880d681SAndroid Build Coastguard Worker    various _VARIABLE_ patterns.
1310*9880d681SAndroid Build Coastguard Worker    The numbering for the DAG's is for LE, but when used on BE, the correct
1311*9880d681SAndroid Build Coastguard Worker    LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
1312*9880d681SAndroid Build Coastguard Worker*/
1313*9880d681SAndroid Build Coastguard Workerdef VectorExtractions {
1314*9880d681SAndroid Build Coastguard Worker  // Doubleword extraction
1315*9880d681SAndroid Build Coastguard Worker  dag LE_DWORD_0 =
1316*9880d681SAndroid Build Coastguard Worker    (MFVSRD
1317*9880d681SAndroid Build Coastguard Worker      (EXTRACT_SUBREG
1318*9880d681SAndroid Build Coastguard Worker        (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
1319*9880d681SAndroid Build Coastguard Worker                  (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
1320*9880d681SAndroid Build Coastguard Worker  dag LE_DWORD_1 = (MFVSRD
1321*9880d681SAndroid Build Coastguard Worker                     (EXTRACT_SUBREG
1322*9880d681SAndroid Build Coastguard Worker                       (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1323*9880d681SAndroid Build Coastguard Worker
1324*9880d681SAndroid Build Coastguard Worker  // Word extraction
1325*9880d681SAndroid Build Coastguard Worker  dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64));
1326*9880d681SAndroid Build Coastguard Worker  dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
1327*9880d681SAndroid Build Coastguard Worker  dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
1328*9880d681SAndroid Build Coastguard Worker                             (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
1329*9880d681SAndroid Build Coastguard Worker  dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
1330*9880d681SAndroid Build Coastguard Worker
1331*9880d681SAndroid Build Coastguard Worker  // Halfword extraction
1332*9880d681SAndroid Build Coastguard Worker  dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
1333*9880d681SAndroid Build Coastguard Worker  dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
1334*9880d681SAndroid Build Coastguard Worker  dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
1335*9880d681SAndroid Build Coastguard Worker  dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
1336*9880d681SAndroid Build Coastguard Worker  dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
1337*9880d681SAndroid Build Coastguard Worker  dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
1338*9880d681SAndroid Build Coastguard Worker  dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
1339*9880d681SAndroid Build Coastguard Worker  dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
1340*9880d681SAndroid Build Coastguard Worker
1341*9880d681SAndroid Build Coastguard Worker  // Byte extraction
1342*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
1343*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
1344*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
1345*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
1346*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
1347*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
1348*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
1349*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
1350*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
1351*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
1352*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
1353*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
1354*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
1355*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
1356*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
1357*9880d681SAndroid Build Coastguard Worker  dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
1358*9880d681SAndroid Build Coastguard Worker
1359*9880d681SAndroid Build Coastguard Worker  /* Variable element number (BE and LE patterns must be specified separately)
1360*9880d681SAndroid Build Coastguard Worker     This is a rather involved process.
1361*9880d681SAndroid Build Coastguard Worker
1362*9880d681SAndroid Build Coastguard Worker     Conceptually, this is how the move is accomplished:
1363*9880d681SAndroid Build Coastguard Worker     1. Identify which doubleword contains the element
1364*9880d681SAndroid Build Coastguard Worker     2. Shift in the VMX register so that the correct doubleword is correctly
1365*9880d681SAndroid Build Coastguard Worker        lined up for the MFVSRD
1366*9880d681SAndroid Build Coastguard Worker     3. Perform the move so that the element (along with some extra stuff)
1367*9880d681SAndroid Build Coastguard Worker        is in the GPR
1368*9880d681SAndroid Build Coastguard Worker     4. Right shift within the GPR so that the element is right-justified
1369*9880d681SAndroid Build Coastguard Worker
1370*9880d681SAndroid Build Coastguard Worker     Of course, the index is an element number which has a different meaning
1371*9880d681SAndroid Build Coastguard Worker     on LE/BE so the patterns have to be specified separately.
1372*9880d681SAndroid Build Coastguard Worker
1373*9880d681SAndroid Build Coastguard Worker     Note: The final result will be the element right-justified with high
1374*9880d681SAndroid Build Coastguard Worker           order bits being arbitrarily defined (namely, whatever was in the
1375*9880d681SAndroid Build Coastguard Worker           vector register to the left of the value originally).
1376*9880d681SAndroid Build Coastguard Worker  */
1377*9880d681SAndroid Build Coastguard Worker
1378*9880d681SAndroid Build Coastguard Worker  /*  LE variable byte
1379*9880d681SAndroid Build Coastguard Worker      Number 1. above:
1380*9880d681SAndroid Build Coastguard Worker      - For elements 0-7, we shift left by 8 bytes since they're on the right
1381*9880d681SAndroid Build Coastguard Worker      - For elements 8-15, we need not shift (shift left by zero bytes)
1382*9880d681SAndroid Build Coastguard Worker      This is accomplished by inverting the bits of the index and AND-ing
1383*9880d681SAndroid Build Coastguard Worker      with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
1384*9880d681SAndroid Build Coastguard Worker  */
1385*9880d681SAndroid Build Coastguard Worker  dag LE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDC8 (LI8 8), $Idx));
1386*9880d681SAndroid Build Coastguard Worker
1387*9880d681SAndroid Build Coastguard Worker  //  Number 2. above:
1388*9880d681SAndroid Build Coastguard Worker  //  - Now that we set up the shift amount, we shift in the VMX register
1389*9880d681SAndroid Build Coastguard Worker  dag LE_VBYTE_PERMUTE = (VPERM $S, $S, LE_VBYTE_PERM_VEC);
1390*9880d681SAndroid Build Coastguard Worker
1391*9880d681SAndroid Build Coastguard Worker  //  Number 3. above:
1392*9880d681SAndroid Build Coastguard Worker  //  - The doubleword containing our element is moved to a GPR
1393*9880d681SAndroid Build Coastguard Worker  dag LE_MV_VBYTE = (MFVSRD
1394*9880d681SAndroid Build Coastguard Worker                      (EXTRACT_SUBREG
1395*9880d681SAndroid Build Coastguard Worker                        (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
1396*9880d681SAndroid Build Coastguard Worker                        sub_64));
1397*9880d681SAndroid Build Coastguard Worker
1398*9880d681SAndroid Build Coastguard Worker  /*  Number 4. above:
1399*9880d681SAndroid Build Coastguard Worker      - Truncate the element number to the range 0-7 (8-15 are symmetrical
1400*9880d681SAndroid Build Coastguard Worker        and out of range values are truncated accordingly)
1401*9880d681SAndroid Build Coastguard Worker      - Multiply by 8 as we need to shift right by the number of bits, not bytes
1402*9880d681SAndroid Build Coastguard Worker      - Shift right in the GPR by the calculated value
1403*9880d681SAndroid Build Coastguard Worker  */
1404*9880d681SAndroid Build Coastguard Worker  dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
1405*9880d681SAndroid Build Coastguard Worker                                       sub_32);
1406*9880d681SAndroid Build Coastguard Worker  dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
1407*9880d681SAndroid Build Coastguard Worker                                         sub_32);
1408*9880d681SAndroid Build Coastguard Worker
1409*9880d681SAndroid Build Coastguard Worker  /*  LE variable halfword
1410*9880d681SAndroid Build Coastguard Worker      Number 1. above:
1411*9880d681SAndroid Build Coastguard Worker      - For elements 0-3, we shift left by 8 since they're on the right
1412*9880d681SAndroid Build Coastguard Worker      - For elements 4-7, we need not shift (shift left by zero bytes)
1413*9880d681SAndroid Build Coastguard Worker      Similarly to the byte pattern, we invert the bits of the index, but we
1414*9880d681SAndroid Build Coastguard Worker      AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
1415*9880d681SAndroid Build Coastguard Worker      Of course, the shift is still by 8 bytes, so we must multiply by 2.
1416*9880d681SAndroid Build Coastguard Worker  */
1417*9880d681SAndroid Build Coastguard Worker  dag LE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62));
1418*9880d681SAndroid Build Coastguard Worker
1419*9880d681SAndroid Build Coastguard Worker  //  Number 2. above:
1420*9880d681SAndroid Build Coastguard Worker  //  - Now that we set up the shift amount, we shift in the VMX register
1421*9880d681SAndroid Build Coastguard Worker  dag LE_VHALF_PERMUTE = (VPERM $S, $S, LE_VHALF_PERM_VEC);
1422*9880d681SAndroid Build Coastguard Worker
1423*9880d681SAndroid Build Coastguard Worker  //  Number 3. above:
1424*9880d681SAndroid Build Coastguard Worker  //  - The doubleword containing our element is moved to a GPR
1425*9880d681SAndroid Build Coastguard Worker  dag LE_MV_VHALF = (MFVSRD
1426*9880d681SAndroid Build Coastguard Worker                      (EXTRACT_SUBREG
1427*9880d681SAndroid Build Coastguard Worker                        (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
1428*9880d681SAndroid Build Coastguard Worker                        sub_64));
1429*9880d681SAndroid Build Coastguard Worker
1430*9880d681SAndroid Build Coastguard Worker  /*  Number 4. above:
1431*9880d681SAndroid Build Coastguard Worker      - Truncate the element number to the range 0-3 (4-7 are symmetrical
1432*9880d681SAndroid Build Coastguard Worker        and out of range values are truncated accordingly)
1433*9880d681SAndroid Build Coastguard Worker      - Multiply by 16 as we need to shift right by the number of bits
1434*9880d681SAndroid Build Coastguard Worker      - Shift right in the GPR by the calculated value
1435*9880d681SAndroid Build Coastguard Worker  */
1436*9880d681SAndroid Build Coastguard Worker  dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
1437*9880d681SAndroid Build Coastguard Worker                                       sub_32);
1438*9880d681SAndroid Build Coastguard Worker  dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
1439*9880d681SAndroid Build Coastguard Worker                                         sub_32);
1440*9880d681SAndroid Build Coastguard Worker
1441*9880d681SAndroid Build Coastguard Worker  /*  LE variable word
1442*9880d681SAndroid Build Coastguard Worker      Number 1. above:
1443*9880d681SAndroid Build Coastguard Worker      - For elements 0-1, we shift left by 8 since they're on the right
1444*9880d681SAndroid Build Coastguard Worker      - For elements 2-3, we need not shift
1445*9880d681SAndroid Build Coastguard Worker  */
1446*9880d681SAndroid Build Coastguard Worker  dag LE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61));
1447*9880d681SAndroid Build Coastguard Worker
1448*9880d681SAndroid Build Coastguard Worker  //  Number 2. above:
1449*9880d681SAndroid Build Coastguard Worker  //  - Now that we set up the shift amount, we shift in the VMX register
1450*9880d681SAndroid Build Coastguard Worker  dag LE_VWORD_PERMUTE = (VPERM $S, $S, LE_VWORD_PERM_VEC);
1451*9880d681SAndroid Build Coastguard Worker
1452*9880d681SAndroid Build Coastguard Worker  //  Number 3. above:
1453*9880d681SAndroid Build Coastguard Worker  //  - The doubleword containing our element is moved to a GPR
1454*9880d681SAndroid Build Coastguard Worker  dag LE_MV_VWORD = (MFVSRD
1455*9880d681SAndroid Build Coastguard Worker                      (EXTRACT_SUBREG
1456*9880d681SAndroid Build Coastguard Worker                        (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
1457*9880d681SAndroid Build Coastguard Worker                        sub_64));
1458*9880d681SAndroid Build Coastguard Worker
1459*9880d681SAndroid Build Coastguard Worker  /*  Number 4. above:
1460*9880d681SAndroid Build Coastguard Worker      - Truncate the element number to the range 0-1 (2-3 are symmetrical
1461*9880d681SAndroid Build Coastguard Worker        and out of range values are truncated accordingly)
1462*9880d681SAndroid Build Coastguard Worker      - Multiply by 32 as we need to shift right by the number of bits
1463*9880d681SAndroid Build Coastguard Worker      - Shift right in the GPR by the calculated value
1464*9880d681SAndroid Build Coastguard Worker  */
1465*9880d681SAndroid Build Coastguard Worker  dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
1466*9880d681SAndroid Build Coastguard Worker                                       sub_32);
1467*9880d681SAndroid Build Coastguard Worker  dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
1468*9880d681SAndroid Build Coastguard Worker                                         sub_32);
1469*9880d681SAndroid Build Coastguard Worker
1470*9880d681SAndroid Build Coastguard Worker  /*  LE variable doubleword
1471*9880d681SAndroid Build Coastguard Worker      Number 1. above:
1472*9880d681SAndroid Build Coastguard Worker      - For element 0, we shift left by 8 since it's on the right
1473*9880d681SAndroid Build Coastguard Worker      - For element 1, we need not shift
1474*9880d681SAndroid Build Coastguard Worker  */
1475*9880d681SAndroid Build Coastguard Worker  dag LE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60));
1476*9880d681SAndroid Build Coastguard Worker
1477*9880d681SAndroid Build Coastguard Worker  //  Number 2. above:
1478*9880d681SAndroid Build Coastguard Worker  //  - Now that we set up the shift amount, we shift in the VMX register
1479*9880d681SAndroid Build Coastguard Worker  dag LE_VDWORD_PERMUTE = (VPERM $S, $S, LE_VDWORD_PERM_VEC);
1480*9880d681SAndroid Build Coastguard Worker
1481*9880d681SAndroid Build Coastguard Worker  // Number 3. above:
1482*9880d681SAndroid Build Coastguard Worker  //  - The doubleword containing our element is moved to a GPR
1483*9880d681SAndroid Build Coastguard Worker  //  - Number 4. is not needed for the doubleword as the value is 64-bits
1484*9880d681SAndroid Build Coastguard Worker  dag LE_VARIABLE_DWORD =
1485*9880d681SAndroid Build Coastguard Worker        (MFVSRD (EXTRACT_SUBREG
1486*9880d681SAndroid Build Coastguard Worker                  (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
1487*9880d681SAndroid Build Coastguard Worker                  sub_64));
1488*9880d681SAndroid Build Coastguard Worker
1489*9880d681SAndroid Build Coastguard Worker  /*  LE variable float
1490*9880d681SAndroid Build Coastguard Worker      - Shift the vector to line up the desired element to BE Word 0
1491*9880d681SAndroid Build Coastguard Worker      - Convert 32-bit float to a 64-bit single precision float
1492*9880d681SAndroid Build Coastguard Worker  */
1493*9880d681SAndroid Build Coastguard Worker  dag LE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR (XOR8 (LI8 3), $Idx), 2, 61));
1494*9880d681SAndroid Build Coastguard Worker  dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
1495*9880d681SAndroid Build Coastguard Worker  dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
1496*9880d681SAndroid Build Coastguard Worker
1497*9880d681SAndroid Build Coastguard Worker  /*  LE variable double
1498*9880d681SAndroid Build Coastguard Worker      Same as the LE doubleword except there is no move.
1499*9880d681SAndroid Build Coastguard Worker  */
1500*9880d681SAndroid Build Coastguard Worker  dag LE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1501*9880d681SAndroid Build Coastguard Worker                                  (COPY_TO_REGCLASS $S, VRRC),
1502*9880d681SAndroid Build Coastguard Worker                                  LE_VDWORD_PERM_VEC);
1503*9880d681SAndroid Build Coastguard Worker  dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
1504*9880d681SAndroid Build Coastguard Worker
1505*9880d681SAndroid Build Coastguard Worker  /*  BE variable byte
1506*9880d681SAndroid Build Coastguard Worker      The algorithm here is the same as the LE variable byte except:
1507*9880d681SAndroid Build Coastguard Worker      - The shift in the VMX register is by 0/8 for opposite element numbers so
1508*9880d681SAndroid Build Coastguard Worker        we simply AND the element number with 0x8
1509*9880d681SAndroid Build Coastguard Worker      - The order of elements after the move to GPR is reversed, so we invert
1510*9880d681SAndroid Build Coastguard Worker        the bits of the index prior to truncating to the range 0-7
1511*9880d681SAndroid Build Coastguard Worker  */
1512*9880d681SAndroid Build Coastguard Worker  dag BE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDIo8 $Idx, 8));
1513*9880d681SAndroid Build Coastguard Worker  dag BE_VBYTE_PERMUTE = (VPERM $S, $S, BE_VBYTE_PERM_VEC);
1514*9880d681SAndroid Build Coastguard Worker  dag BE_MV_VBYTE = (MFVSRD
1515*9880d681SAndroid Build Coastguard Worker                      (EXTRACT_SUBREG
1516*9880d681SAndroid Build Coastguard Worker                        (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
1517*9880d681SAndroid Build Coastguard Worker                        sub_64));
1518*9880d681SAndroid Build Coastguard Worker  dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
1519*9880d681SAndroid Build Coastguard Worker                                       sub_32);
1520*9880d681SAndroid Build Coastguard Worker  dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
1521*9880d681SAndroid Build Coastguard Worker                                         sub_32);
1522*9880d681SAndroid Build Coastguard Worker
1523*9880d681SAndroid Build Coastguard Worker  /*  BE variable halfword
1524*9880d681SAndroid Build Coastguard Worker      The algorithm here is the same as the LE variable halfword except:
1525*9880d681SAndroid Build Coastguard Worker      - The shift in the VMX register is by 0/8 for opposite element numbers so
1526*9880d681SAndroid Build Coastguard Worker        we simply AND the element number with 0x4 and multiply by 2
1527*9880d681SAndroid Build Coastguard Worker      - The order of elements after the move to GPR is reversed, so we invert
1528*9880d681SAndroid Build Coastguard Worker        the bits of the index prior to truncating to the range 0-3
1529*9880d681SAndroid Build Coastguard Worker  */
1530*9880d681SAndroid Build Coastguard Worker  dag BE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 4), 1, 62));
1531*9880d681SAndroid Build Coastguard Worker  dag BE_VHALF_PERMUTE = (VPERM $S, $S, BE_VHALF_PERM_VEC);
1532*9880d681SAndroid Build Coastguard Worker  dag BE_MV_VHALF = (MFVSRD
1533*9880d681SAndroid Build Coastguard Worker                      (EXTRACT_SUBREG
1534*9880d681SAndroid Build Coastguard Worker                        (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
1535*9880d681SAndroid Build Coastguard Worker                        sub_64));
1536*9880d681SAndroid Build Coastguard Worker  dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
1537*9880d681SAndroid Build Coastguard Worker                                       sub_32);
1538*9880d681SAndroid Build Coastguard Worker  dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
1539*9880d681SAndroid Build Coastguard Worker                                         sub_32);
1540*9880d681SAndroid Build Coastguard Worker
1541*9880d681SAndroid Build Coastguard Worker  /*  BE variable word
1542*9880d681SAndroid Build Coastguard Worker      The algorithm is the same as the LE variable word except:
1543*9880d681SAndroid Build Coastguard Worker      - The shift in the VMX register happens for opposite element numbers
1544*9880d681SAndroid Build Coastguard Worker      - The order of elements after the move to GPR is reversed, so we invert
1545*9880d681SAndroid Build Coastguard Worker        the bits of the index prior to truncating to the range 0-1
1546*9880d681SAndroid Build Coastguard Worker  */
1547*9880d681SAndroid Build Coastguard Worker  dag BE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 2), 2, 61));
1548*9880d681SAndroid Build Coastguard Worker  dag BE_VWORD_PERMUTE = (VPERM $S, $S, BE_VWORD_PERM_VEC);
1549*9880d681SAndroid Build Coastguard Worker  dag BE_MV_VWORD = (MFVSRD
1550*9880d681SAndroid Build Coastguard Worker                      (EXTRACT_SUBREG
1551*9880d681SAndroid Build Coastguard Worker                        (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
1552*9880d681SAndroid Build Coastguard Worker                        sub_64));
1553*9880d681SAndroid Build Coastguard Worker  dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
1554*9880d681SAndroid Build Coastguard Worker                                       sub_32);
1555*9880d681SAndroid Build Coastguard Worker  dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
1556*9880d681SAndroid Build Coastguard Worker                                         sub_32);
1557*9880d681SAndroid Build Coastguard Worker
1558*9880d681SAndroid Build Coastguard Worker  /*  BE variable doubleword
1559*9880d681SAndroid Build Coastguard Worker      Same as the LE doubleword except we shift in the VMX register for opposite
1560*9880d681SAndroid Build Coastguard Worker      element indices.
1561*9880d681SAndroid Build Coastguard Worker  */
1562*9880d681SAndroid Build Coastguard Worker  dag BE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 1), 3, 60));
1563*9880d681SAndroid Build Coastguard Worker  dag BE_VDWORD_PERMUTE = (VPERM $S, $S, BE_VDWORD_PERM_VEC);
1564*9880d681SAndroid Build Coastguard Worker  dag BE_VARIABLE_DWORD =
1565*9880d681SAndroid Build Coastguard Worker        (MFVSRD (EXTRACT_SUBREG
1566*9880d681SAndroid Build Coastguard Worker                  (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
1567*9880d681SAndroid Build Coastguard Worker                  sub_64));
1568*9880d681SAndroid Build Coastguard Worker
1569*9880d681SAndroid Build Coastguard Worker  /*  BE variable float
1570*9880d681SAndroid Build Coastguard Worker      - Shift the vector to line up the desired element to BE Word 0
1571*9880d681SAndroid Build Coastguard Worker      - Convert 32-bit float to a 64-bit single precision float
1572*9880d681SAndroid Build Coastguard Worker  */
1573*9880d681SAndroid Build Coastguard Worker  dag BE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR $Idx, 2, 61));
1574*9880d681SAndroid Build Coastguard Worker  dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
1575*9880d681SAndroid Build Coastguard Worker  dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
1576*9880d681SAndroid Build Coastguard Worker
1577*9880d681SAndroid Build Coastguard Worker  /* BE variable double
1578*9880d681SAndroid Build Coastguard Worker      Same as the BE doubleword except there is no move.
1579*9880d681SAndroid Build Coastguard Worker  */
1580*9880d681SAndroid Build Coastguard Worker  dag BE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
1581*9880d681SAndroid Build Coastguard Worker                                  (COPY_TO_REGCLASS $S, VRRC),
1582*9880d681SAndroid Build Coastguard Worker                                  BE_VDWORD_PERM_VEC);
1583*9880d681SAndroid Build Coastguard Worker  dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
1584*9880d681SAndroid Build Coastguard Worker}
1585*9880d681SAndroid Build Coastguard Worker
1586*9880d681SAndroid Build Coastguard Worker// v4f32 scalar <-> vector conversions (BE)
1587*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBigEndian, HasP8Vector] in {
1588*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1589*9880d681SAndroid Build Coastguard Worker            (v4f32 (XSCVDPSPN $A))>;
1590*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1591*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVSPDPN $S))>;
1592*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1593*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1594*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1595*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
1596*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1597*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1598*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1599*9880d681SAndroid Build Coastguard Worker            (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
1600*9880d681SAndroid Build Coastguard Worker} // IsBigEndian, HasP8Vector
1601*9880d681SAndroid Build Coastguard Worker
1602*9880d681SAndroid Build Coastguard Worker// Variable index vector_extract for v2f64 does not require P8Vector
1603*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBigEndian, HasVSX] in
1604*9880d681SAndroid Build Coastguard Worker  def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1605*9880d681SAndroid Build Coastguard Worker            (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
1606*9880d681SAndroid Build Coastguard Worker
1607*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBigEndian, HasDirectMove] in {
1608*9880d681SAndroid Build Coastguard Worker  // v16i8 scalar <-> vector conversions (BE)
1609*9880d681SAndroid Build Coastguard Worker  def : Pat<(v16i8 (scalar_to_vector i32:$A)),
1610*9880d681SAndroid Build Coastguard Worker            (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
1611*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8i16 (scalar_to_vector i32:$A)),
1612*9880d681SAndroid Build Coastguard Worker            (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
1613*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (scalar_to_vector i32:$A)),
1614*9880d681SAndroid Build Coastguard Worker            (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
1615*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2i64 (scalar_to_vector i64:$A)),
1616*9880d681SAndroid Build Coastguard Worker            (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
1617*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 0)),
1618*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_15)>;
1619*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 1)),
1620*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_14)>;
1621*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 2)),
1622*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_13)>;
1623*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 3)),
1624*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_12)>;
1625*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 4)),
1626*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_11)>;
1627*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 5)),
1628*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_10)>;
1629*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 6)),
1630*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_9)>;
1631*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 7)),
1632*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_8)>;
1633*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 8)),
1634*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_7)>;
1635*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 9)),
1636*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_6)>;
1637*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 10)),
1638*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_5)>;
1639*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 11)),
1640*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_4)>;
1641*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 12)),
1642*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_3)>;
1643*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 13)),
1644*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_2)>;
1645*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 14)),
1646*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_1)>;
1647*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 15)),
1648*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_0)>;
1649*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
1650*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
1651*9880d681SAndroid Build Coastguard Worker
1652*9880d681SAndroid Build Coastguard Worker  // v8i16 scalar <-> vector conversions (BE)
1653*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 0)),
1654*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_7)>;
1655*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 1)),
1656*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_6)>;
1657*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 2)),
1658*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_5)>;
1659*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 3)),
1660*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_4)>;
1661*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 4)),
1662*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_3)>;
1663*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 5)),
1664*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_2)>;
1665*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 6)),
1666*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_1)>;
1667*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 7)),
1668*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_0)>;
1669*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
1670*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.BE_VARIABLE_HALF)>;
1671*9880d681SAndroid Build Coastguard Worker
1672*9880d681SAndroid Build Coastguard Worker  // v4i32 scalar <-> vector conversions (BE)
1673*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, 0)),
1674*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_WORD_3)>;
1675*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, 1)),
1676*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_WORD_2)>;
1677*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, 2)),
1678*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_WORD_1)>;
1679*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, 3)),
1680*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_WORD_0)>;
1681*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1682*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.BE_VARIABLE_WORD)>;
1683*9880d681SAndroid Build Coastguard Worker
1684*9880d681SAndroid Build Coastguard Worker  // v2i64 scalar <-> vector conversions (BE)
1685*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (vector_extract v2i64:$S, 0)),
1686*9880d681SAndroid Build Coastguard Worker            (i64 VectorExtractions.LE_DWORD_1)>;
1687*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (vector_extract v2i64:$S, 1)),
1688*9880d681SAndroid Build Coastguard Worker            (i64 VectorExtractions.LE_DWORD_0)>;
1689*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1690*9880d681SAndroid Build Coastguard Worker            (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
1691*9880d681SAndroid Build Coastguard Worker} // IsBigEndian, HasDirectMove
1692*9880d681SAndroid Build Coastguard Worker
1693*9880d681SAndroid Build Coastguard Worker// v4f32 scalar <-> vector conversions (LE)
1694*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLittleEndian, HasP8Vector] in {
1695*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (scalar_to_vector f32:$A)),
1696*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
1697*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, 0)),
1698*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
1699*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, 1)),
1700*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>;
1701*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, 2)),
1702*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
1703*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, 3)),
1704*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVSPDPN $S))>;
1705*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
1706*9880d681SAndroid Build Coastguard Worker            (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
1707*9880d681SAndroid Build Coastguard Worker} // IsLittleEndian, HasP8Vector
1708*9880d681SAndroid Build Coastguard Worker
1709*9880d681SAndroid Build Coastguard Worker// Variable index vector_extract for v2f64 does not require P8Vector
1710*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLittleEndian, HasVSX] in
1711*9880d681SAndroid Build Coastguard Worker  def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
1712*9880d681SAndroid Build Coastguard Worker            (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
1713*9880d681SAndroid Build Coastguard Worker
1714*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLittleEndian, HasDirectMove] in {
1715*9880d681SAndroid Build Coastguard Worker  // v16i8 scalar <-> vector conversions (LE)
1716*9880d681SAndroid Build Coastguard Worker  def : Pat<(v16i8 (scalar_to_vector i32:$A)),
1717*9880d681SAndroid Build Coastguard Worker            (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
1718*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8i16 (scalar_to_vector i32:$A)),
1719*9880d681SAndroid Build Coastguard Worker            (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
1720*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (scalar_to_vector i32:$A)),
1721*9880d681SAndroid Build Coastguard Worker            (v4i32 MovesToVSR.LE_WORD_0)>;
1722*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2i64 (scalar_to_vector i64:$A)),
1723*9880d681SAndroid Build Coastguard Worker            (v2i64 MovesToVSR.LE_DWORD_0)>;
1724*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 0)),
1725*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_0)>;
1726*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 1)),
1727*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_1)>;
1728*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 2)),
1729*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_2)>;
1730*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 3)),
1731*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_3)>;
1732*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 4)),
1733*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_4)>;
1734*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 5)),
1735*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_5)>;
1736*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 6)),
1737*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_6)>;
1738*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 7)),
1739*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_7)>;
1740*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 8)),
1741*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_8)>;
1742*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 9)),
1743*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_9)>;
1744*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 10)),
1745*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_10)>;
1746*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 11)),
1747*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_11)>;
1748*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 12)),
1749*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_12)>;
1750*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 13)),
1751*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_13)>;
1752*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 14)),
1753*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_14)>;
1754*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, 15)),
1755*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_BYTE_15)>;
1756*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
1757*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
1758*9880d681SAndroid Build Coastguard Worker
1759*9880d681SAndroid Build Coastguard Worker  // v8i16 scalar <-> vector conversions (LE)
1760*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 0)),
1761*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_0)>;
1762*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 1)),
1763*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_1)>;
1764*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 2)),
1765*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_2)>;
1766*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 3)),
1767*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_3)>;
1768*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 4)),
1769*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_4)>;
1770*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 5)),
1771*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_5)>;
1772*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 6)),
1773*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_6)>;
1774*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, 7)),
1775*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_HALF_7)>;
1776*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
1777*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_VARIABLE_HALF)>;
1778*9880d681SAndroid Build Coastguard Worker
1779*9880d681SAndroid Build Coastguard Worker  // v4i32 scalar <-> vector conversions (LE)
1780*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, 0)),
1781*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_WORD_0)>;
1782*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, 1)),
1783*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_WORD_1)>;
1784*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, 2)),
1785*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_WORD_2)>;
1786*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, 3)),
1787*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_WORD_3)>;
1788*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
1789*9880d681SAndroid Build Coastguard Worker            (i32 VectorExtractions.LE_VARIABLE_WORD)>;
1790*9880d681SAndroid Build Coastguard Worker
1791*9880d681SAndroid Build Coastguard Worker  // v2i64 scalar <-> vector conversions (LE)
1792*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (vector_extract v2i64:$S, 0)),
1793*9880d681SAndroid Build Coastguard Worker            (i64 VectorExtractions.LE_DWORD_0)>;
1794*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (vector_extract v2i64:$S, 1)),
1795*9880d681SAndroid Build Coastguard Worker            (i64 VectorExtractions.LE_DWORD_1)>;
1796*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
1797*9880d681SAndroid Build Coastguard Worker            (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
1798*9880d681SAndroid Build Coastguard Worker} // IsLittleEndian, HasDirectMove
1799*9880d681SAndroid Build Coastguard Worker
1800*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasDirectMove, HasVSX] in {
1801*9880d681SAndroid Build Coastguard Worker// bitconvert f32 -> i32
1802*9880d681SAndroid Build Coastguard Worker// (convert to 32-bit fp single, shift right 1 word, move to GPR)
1803*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (bitconvert f32:$S)),
1804*9880d681SAndroid Build Coastguard Worker          (i32 (MFVSRWZ (EXTRACT_SUBREG
1805*9880d681SAndroid Build Coastguard Worker                          (XXSLDWI (XSCVDPSPN $S),(XSCVDPSPN $S), 3),
1806*9880d681SAndroid Build Coastguard Worker                          sub_64)))>;
1807*9880d681SAndroid Build Coastguard Worker// bitconvert i32 -> f32
1808*9880d681SAndroid Build Coastguard Worker// (move to FPR, shift left 1 word, convert to 64-bit fp single)
1809*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (bitconvert i32:$A)),
1810*9880d681SAndroid Build Coastguard Worker          (f32 (XSCVSPDPN
1811*9880d681SAndroid Build Coastguard Worker                 (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
1812*9880d681SAndroid Build Coastguard Worker
1813*9880d681SAndroid Build Coastguard Worker// bitconvert f64 -> i64
1814*9880d681SAndroid Build Coastguard Worker// (move to GPR, nothing else needed)
1815*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert f64:$S)),
1816*9880d681SAndroid Build Coastguard Worker          (i64 (MFVSRD $S))>;
1817*9880d681SAndroid Build Coastguard Worker
1818*9880d681SAndroid Build Coastguard Worker// bitconvert i64 -> f64
1819*9880d681SAndroid Build Coastguard Worker// (move to FPR, nothing else needed)
1820*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert i64:$S)),
1821*9880d681SAndroid Build Coastguard Worker          (f64 (MTVSRD $S))>;
1822*9880d681SAndroid Build Coastguard Worker}
1823*9880d681SAndroid Build Coastguard Worker
1824*9880d681SAndroid Build Coastguard Workerdef AlignValues {
1825*9880d681SAndroid Build Coastguard Worker  dag F32_TO_BE_WORD1 = (v4f32 (XXSLDWI (XSCVDPSPN $B), (XSCVDPSPN $B), 3));
1826*9880d681SAndroid Build Coastguard Worker  dag I32_TO_BE_WORD1 = (COPY_TO_REGCLASS (MTVSRWZ $B), VSRC);
1827*9880d681SAndroid Build Coastguard Worker}
1828*9880d681SAndroid Build Coastguard Worker
1829*9880d681SAndroid Build Coastguard Worker// The following VSX instructions were introduced in Power ISA 3.0
1830*9880d681SAndroid Build Coastguard Workerdef HasP9Vector : Predicate<"PPCSubTarget->hasP9Vector()">;
1831*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 400, Predicates = [HasP9Vector] in {
1832*9880d681SAndroid Build Coastguard Worker
1833*9880d681SAndroid Build Coastguard Worker  // [PO VRT XO VRB XO /]
1834*9880d681SAndroid Build Coastguard Worker  class X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1835*9880d681SAndroid Build Coastguard Worker                      list<dag> pattern>
1836*9880d681SAndroid Build Coastguard Worker    : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB),
1837*9880d681SAndroid Build Coastguard Worker                    !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1838*9880d681SAndroid Build Coastguard Worker
1839*9880d681SAndroid Build Coastguard Worker  // [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /]
1840*9880d681SAndroid Build Coastguard Worker  class X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1841*9880d681SAndroid Build Coastguard Worker                         list<dag> pattern>
1842*9880d681SAndroid Build Coastguard Worker    : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isDOT;
1843*9880d681SAndroid Build Coastguard Worker
1844*9880d681SAndroid Build Coastguard Worker  // [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less),
1845*9880d681SAndroid Build Coastguard Worker  // So we use different operand class for VRB
1846*9880d681SAndroid Build Coastguard Worker  class X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc,
1847*9880d681SAndroid Build Coastguard Worker                           RegisterOperand vbtype, list<dag> pattern>
1848*9880d681SAndroid Build Coastguard Worker    : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB),
1849*9880d681SAndroid Build Coastguard Worker                    !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>;
1850*9880d681SAndroid Build Coastguard Worker
1851*9880d681SAndroid Build Coastguard Worker  // [PO T XO B XO BX /]
1852*9880d681SAndroid Build Coastguard Worker  class XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1853*9880d681SAndroid Build Coastguard Worker                        list<dag> pattern>
1854*9880d681SAndroid Build Coastguard Worker    : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB),
1855*9880d681SAndroid Build Coastguard Worker                      !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>;
1856*9880d681SAndroid Build Coastguard Worker
1857*9880d681SAndroid Build Coastguard Worker  // [PO T XO B XO BX TX]
1858*9880d681SAndroid Build Coastguard Worker  class XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc,
1859*9880d681SAndroid Build Coastguard Worker                        RegisterOperand vtype, list<dag> pattern>
1860*9880d681SAndroid Build Coastguard Worker    : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB),
1861*9880d681SAndroid Build Coastguard Worker                      !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>;
1862*9880d681SAndroid Build Coastguard Worker
1863*9880d681SAndroid Build Coastguard Worker  // [PO T A B XO AX BX TX], src and dest register use different operand class
1864*9880d681SAndroid Build Coastguard Worker  class XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc,
1865*9880d681SAndroid Build Coastguard Worker                  RegisterOperand xty, RegisterOperand aty, RegisterOperand bty,
1866*9880d681SAndroid Build Coastguard Worker                  InstrItinClass itin, list<dag> pattern>
1867*9880d681SAndroid Build Coastguard Worker    : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB),
1868*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>;
1869*9880d681SAndroid Build Coastguard Worker
1870*9880d681SAndroid Build Coastguard Worker  // [PO VRT VRA VRB XO /]
1871*9880d681SAndroid Build Coastguard Worker  class X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1872*9880d681SAndroid Build Coastguard Worker                      list<dag> pattern>
1873*9880d681SAndroid Build Coastguard Worker    : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB),
1874*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>;
1875*9880d681SAndroid Build Coastguard Worker
1876*9880d681SAndroid Build Coastguard Worker  // [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /]
1877*9880d681SAndroid Build Coastguard Worker  class X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc,
1878*9880d681SAndroid Build Coastguard Worker                         list<dag> pattern>
1879*9880d681SAndroid Build Coastguard Worker    : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isDOT;
1880*9880d681SAndroid Build Coastguard Worker
1881*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
1882*9880d681SAndroid Build Coastguard Worker  // Quad-Precision Scalar Move Instructions:
1883*9880d681SAndroid Build Coastguard Worker
1884*9880d681SAndroid Build Coastguard Worker  // Copy Sign
1885*9880d681SAndroid Build Coastguard Worker  def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp", []>;
1886*9880d681SAndroid Build Coastguard Worker
1887*9880d681SAndroid Build Coastguard Worker  // Absolute/Negative-Absolute/Negate
1888*9880d681SAndroid Build Coastguard Worker  def XSABSQP   : X_VT5_XO5_VB5<63,  0, 804, "xsabsqp" , []>;
1889*9880d681SAndroid Build Coastguard Worker  def XSNABSQP  : X_VT5_XO5_VB5<63,  8, 804, "xsnabsqp", []>;
1890*9880d681SAndroid Build Coastguard Worker  def XSNEGQP   : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp" , []>;
1891*9880d681SAndroid Build Coastguard Worker
1892*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
1893*9880d681SAndroid Build Coastguard Worker  // Quad-Precision Scalar Floating-Point Arithmetic Instructions:
1894*9880d681SAndroid Build Coastguard Worker
1895*9880d681SAndroid Build Coastguard Worker  // Add/Divide/Multiply/Subtract
1896*9880d681SAndroid Build Coastguard Worker  def XSADDQP   : X_VT5_VA5_VB5   <63,   4, "xsaddqp" , []>;
1897*9880d681SAndroid Build Coastguard Worker  def XSADDQPO  : X_VT5_VA5_VB5_Ro<63,   4, "xsaddqpo", []>;
1898*9880d681SAndroid Build Coastguard Worker  def XSDIVQP   : X_VT5_VA5_VB5   <63, 548, "xsdivqp" , []>;
1899*9880d681SAndroid Build Coastguard Worker  def XSDIVQPO  : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo", []>;
1900*9880d681SAndroid Build Coastguard Worker  def XSMULQP   : X_VT5_VA5_VB5   <63,  36, "xsmulqp" , []>;
1901*9880d681SAndroid Build Coastguard Worker  def XSMULQPO  : X_VT5_VA5_VB5_Ro<63,  36, "xsmulqpo", []>;
1902*9880d681SAndroid Build Coastguard Worker  def XSSUBQP   : X_VT5_VA5_VB5   <63, 516, "xssubqp" , []>;
1903*9880d681SAndroid Build Coastguard Worker  def XSSUBQPO  : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo", []>;
1904*9880d681SAndroid Build Coastguard Worker
1905*9880d681SAndroid Build Coastguard Worker  // Square-Root
1906*9880d681SAndroid Build Coastguard Worker  def XSSQRTQP  : X_VT5_XO5_VB5   <63, 27, 804, "xssqrtqp" , []>;
1907*9880d681SAndroid Build Coastguard Worker  def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo", []>;
1908*9880d681SAndroid Build Coastguard Worker
1909*9880d681SAndroid Build Coastguard Worker  // (Negative) Multiply-{Add/Subtract}
1910*9880d681SAndroid Build Coastguard Worker  def XSMADDQP  : X_VT5_VA5_VB5   <63, 388, "xsmaddqp"  , []>;
1911*9880d681SAndroid Build Coastguard Worker  def XSMADDQPO : X_VT5_VA5_VB5_Ro<63, 388, "xsmaddqpo" , []>;
1912*9880d681SAndroid Build Coastguard Worker  def XSMSUBQP  : X_VT5_VA5_VB5   <63, 420, "xsmsubqp"  , []>;
1913*9880d681SAndroid Build Coastguard Worker  def XSMSUBQPO : X_VT5_VA5_VB5_Ro<63, 420, "xsmsubqpo" , []>;
1914*9880d681SAndroid Build Coastguard Worker  def XSNMADDQP : X_VT5_VA5_VB5   <63, 452, "xsnmaddqp" , []>;
1915*9880d681SAndroid Build Coastguard Worker  def XSNMADDQPO: X_VT5_VA5_VB5_Ro<63, 452, "xsnmaddqpo", []>;
1916*9880d681SAndroid Build Coastguard Worker  def XSNMSUBQP : X_VT5_VA5_VB5   <63, 484, "xsnmsubqp" , []>;
1917*9880d681SAndroid Build Coastguard Worker  def XSNMSUBQPO: X_VT5_VA5_VB5_Ro<63, 484, "xsnmsubqpo", []>;
1918*9880d681SAndroid Build Coastguard Worker
1919*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
1920*9880d681SAndroid Build Coastguard Worker  // Quad/Double-Precision Compare Instructions:
1921*9880d681SAndroid Build Coastguard Worker
1922*9880d681SAndroid Build Coastguard Worker  // [PO BF // VRA VRB XO /]
1923*9880d681SAndroid Build Coastguard Worker  class X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc,
1924*9880d681SAndroid Build Coastguard Worker                      list<dag> pattern>
1925*9880d681SAndroid Build Coastguard Worker    : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB),
1926*9880d681SAndroid Build Coastguard Worker               !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> {
1927*9880d681SAndroid Build Coastguard Worker    let Pattern = pattern;
1928*9880d681SAndroid Build Coastguard Worker  }
1929*9880d681SAndroid Build Coastguard Worker
1930*9880d681SAndroid Build Coastguard Worker  // QP Compare Ordered/Unordered
1931*9880d681SAndroid Build Coastguard Worker  def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>;
1932*9880d681SAndroid Build Coastguard Worker  def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>;
1933*9880d681SAndroid Build Coastguard Worker
1934*9880d681SAndroid Build Coastguard Worker  // DP/QP Compare Exponents
1935*9880d681SAndroid Build Coastguard Worker  def XSCMPEXPDP : XX3Form_1<60, 59,
1936*9880d681SAndroid Build Coastguard Worker                             (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
1937*9880d681SAndroid Build Coastguard Worker                             "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>;
1938*9880d681SAndroid Build Coastguard Worker  def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>;
1939*9880d681SAndroid Build Coastguard Worker
1940*9880d681SAndroid Build Coastguard Worker  // DP Compare ==, >=, >, !=
1941*9880d681SAndroid Build Coastguard Worker  // Use vsrc for XT, because the entire register of XT is set.
1942*9880d681SAndroid Build Coastguard Worker  // XT.dword[1] = 0x0000_0000_0000_0000
1943*9880d681SAndroid Build Coastguard Worker  def XSCMPEQDP : XX3_XT5_XA5_XB5<60,  3, "xscmpeqdp", vsrc, vsfrc, vsfrc,
1944*9880d681SAndroid Build Coastguard Worker                                  IIC_FPCompare, []>;
1945*9880d681SAndroid Build Coastguard Worker  def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc,
1946*9880d681SAndroid Build Coastguard Worker                                  IIC_FPCompare, []>;
1947*9880d681SAndroid Build Coastguard Worker  def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc,
1948*9880d681SAndroid Build Coastguard Worker                                  IIC_FPCompare, []>;
1949*9880d681SAndroid Build Coastguard Worker  def XSCMPNEDP : XX3_XT5_XA5_XB5<60, 27, "xscmpnedp", vsrc, vsfrc, vsfrc,
1950*9880d681SAndroid Build Coastguard Worker                                  IIC_FPCompare, []>;
1951*9880d681SAndroid Build Coastguard Worker  // Vector Compare Not Equal
1952*9880d681SAndroid Build Coastguard Worker  def XVCMPNEDP  : XX3Form_Rc<60, 123,
1953*9880d681SAndroid Build Coastguard Worker                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1954*9880d681SAndroid Build Coastguard Worker                              "xvcmpnedp  $XT, $XA, $XB", IIC_VecFPCompare, []>;
1955*9880d681SAndroid Build Coastguard Worker  let Defs = [CR6] in
1956*9880d681SAndroid Build Coastguard Worker  def XVCMPNEDPo : XX3Form_Rc<60, 123,
1957*9880d681SAndroid Build Coastguard Worker                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1958*9880d681SAndroid Build Coastguard Worker                              "xvcmpnedp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1959*9880d681SAndroid Build Coastguard Worker                              isDOT;
1960*9880d681SAndroid Build Coastguard Worker  def XVCMPNESP  : XX3Form_Rc<60,  91,
1961*9880d681SAndroid Build Coastguard Worker                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1962*9880d681SAndroid Build Coastguard Worker                              "xvcmpnesp  $XT, $XA, $XB", IIC_VecFPCompare, []>;
1963*9880d681SAndroid Build Coastguard Worker  let Defs = [CR6] in
1964*9880d681SAndroid Build Coastguard Worker  def XVCMPNESPo : XX3Form_Rc<60,  91,
1965*9880d681SAndroid Build Coastguard Worker                              (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
1966*9880d681SAndroid Build Coastguard Worker                              "xvcmpnesp. $XT, $XA, $XB", IIC_VecFPCompare, []>,
1967*9880d681SAndroid Build Coastguard Worker                              isDOT;
1968*9880d681SAndroid Build Coastguard Worker
1969*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
1970*9880d681SAndroid Build Coastguard Worker  // Quad-Precision Floating-Point Conversion Instructions:
1971*9880d681SAndroid Build Coastguard Worker
1972*9880d681SAndroid Build Coastguard Worker  // Convert DP -> QP
1973*9880d681SAndroid Build Coastguard Worker  def XSCVDPQP  : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vsfrc, []>;
1974*9880d681SAndroid Build Coastguard Worker
1975*9880d681SAndroid Build Coastguard Worker  // Round & Convert QP -> DP (dword[1] is set to zero)
1976*9880d681SAndroid Build Coastguard Worker  def XSCVQPDP  : X_VT5_XO5_VB5   <63, 20, 836, "xscvqpdp" , []>;
1977*9880d681SAndroid Build Coastguard Worker  def XSCVQPDPO : X_VT5_XO5_VB5_Ro<63, 20, 836, "xscvqpdpo", []>;
1978*9880d681SAndroid Build Coastguard Worker
1979*9880d681SAndroid Build Coastguard Worker  // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero)
1980*9880d681SAndroid Build Coastguard Worker  def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>;
1981*9880d681SAndroid Build Coastguard Worker  def XSCVQPSWZ : X_VT5_XO5_VB5<63,  9, 836, "xscvqpswz", []>;
1982*9880d681SAndroid Build Coastguard Worker  def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>;
1983*9880d681SAndroid Build Coastguard Worker  def XSCVQPUWZ : X_VT5_XO5_VB5<63,  1, 836, "xscvqpuwz", []>;
1984*9880d681SAndroid Build Coastguard Worker
1985*9880d681SAndroid Build Coastguard Worker  // Convert (Un)Signed DWord -> QP
1986*9880d681SAndroid Build Coastguard Worker  def XSCVSDQP  : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vsfrc, []>;
1987*9880d681SAndroid Build Coastguard Worker  def XSCVUDQP  : X_VT5_XO5_VB5_TyVB<63,  2, 836, "xscvudqp", vsfrc, []>;
1988*9880d681SAndroid Build Coastguard Worker
1989*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
1990*9880d681SAndroid Build Coastguard Worker  // Round to Floating-Point Integer Instructions
1991*9880d681SAndroid Build Coastguard Worker
1992*9880d681SAndroid Build Coastguard Worker  // (Round &) Convert DP <-> HP
1993*9880d681SAndroid Build Coastguard Worker  // Note! xscvdphp's src and dest register both use the left 64 bits, so we use
1994*9880d681SAndroid Build Coastguard Worker  // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits,
1995*9880d681SAndroid Build Coastguard Worker  // but we still use vsfrc for it.
1996*9880d681SAndroid Build Coastguard Worker  def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>;
1997*9880d681SAndroid Build Coastguard Worker  def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>;
1998*9880d681SAndroid Build Coastguard Worker
1999*9880d681SAndroid Build Coastguard Worker  // Vector HP -> SP
2000*9880d681SAndroid Build Coastguard Worker  def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>;
2001*9880d681SAndroid Build Coastguard Worker  def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc, []>;
2002*9880d681SAndroid Build Coastguard Worker
2003*9880d681SAndroid Build Coastguard Worker  class Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc,
2004*9880d681SAndroid Build Coastguard Worker                                list<dag> pattern>
2005*9880d681SAndroid Build Coastguard Worker    : Z23Form_1<opcode, xo,
2006*9880d681SAndroid Build Coastguard Worker                (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc),
2007*9880d681SAndroid Build Coastguard Worker                !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> {
2008*9880d681SAndroid Build Coastguard Worker    let RC = ex;
2009*9880d681SAndroid Build Coastguard Worker  }
2010*9880d681SAndroid Build Coastguard Worker
2011*9880d681SAndroid Build Coastguard Worker  // Round to Quad-Precision Integer [with Inexact]
2012*9880d681SAndroid Build Coastguard Worker  def XSRQPI   : Z23_VT5_R1_VB5_RMC2_EX1<63,  5, 0, "xsrqpi" , []>;
2013*9880d681SAndroid Build Coastguard Worker  def XSRQPIX  : Z23_VT5_R1_VB5_RMC2_EX1<63,  5, 1, "xsrqpix", []>;
2014*9880d681SAndroid Build Coastguard Worker
2015*9880d681SAndroid Build Coastguard Worker  // Round Quad-Precision to Double-Extended Precision (fp80)
2016*9880d681SAndroid Build Coastguard Worker  def XSRQPXP  : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>;
2017*9880d681SAndroid Build Coastguard Worker
2018*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
2019*9880d681SAndroid Build Coastguard Worker  // Insert/Extract Instructions
2020*9880d681SAndroid Build Coastguard Worker
2021*9880d681SAndroid Build Coastguard Worker  // Insert Exponent DP/QP
2022*9880d681SAndroid Build Coastguard Worker  // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU
2023*9880d681SAndroid Build Coastguard Worker  def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB),
2024*9880d681SAndroid Build Coastguard Worker                          "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>;
2025*9880d681SAndroid Build Coastguard Worker  // vB NOTE: only vB.dword[0] is used, that's why we don't use
2026*9880d681SAndroid Build Coastguard Worker  //          X_VT5_VA5_VB5 form
2027*9880d681SAndroid Build Coastguard Worker  def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB),
2028*9880d681SAndroid Build Coastguard Worker                          "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>;
2029*9880d681SAndroid Build Coastguard Worker
2030*9880d681SAndroid Build Coastguard Worker  // Extract Exponent/Significand DP/QP
2031*9880d681SAndroid Build Coastguard Worker  def XSXEXPDP : XX2_RT5_XO5_XB6<60,  0, 347, "xsxexpdp", []>;
2032*9880d681SAndroid Build Coastguard Worker  def XSXSIGDP : XX2_RT5_XO5_XB6<60,  1, 347, "xsxsigdp", []>;
2033*9880d681SAndroid Build Coastguard Worker  def XSXEXPQP : X_VT5_XO5_VB5  <63,  2, 804, "xsxexpqp", []>;
2034*9880d681SAndroid Build Coastguard Worker  def XSXSIGQP : X_VT5_XO5_VB5  <63, 18, 804, "xsxsigqp", []>;
2035*9880d681SAndroid Build Coastguard Worker
2036*9880d681SAndroid Build Coastguard Worker  // Vector Insert Word
2037*9880d681SAndroid Build Coastguard Worker  // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB.
2038*9880d681SAndroid Build Coastguard Worker  def XXINSERTW   :
2039*9880d681SAndroid Build Coastguard Worker    XX2_RD6_UIM5_RS6<60, 181, (outs vsrc:$XT),
2040*9880d681SAndroid Build Coastguard Worker                     (ins vsrc:$XTi, vsrc:$XB, u4imm:$UIM),
2041*9880d681SAndroid Build Coastguard Worker                     "xxinsertw $XT, $XB, $UIM", IIC_VecFP,
2042*9880d681SAndroid Build Coastguard Worker                     [(set v4i32:$XT, (PPCxxinsert v4i32:$XTi, v4i32:$XB,
2043*9880d681SAndroid Build Coastguard Worker                                                   imm32SExt16:$UIM))]>,
2044*9880d681SAndroid Build Coastguard Worker                     RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
2045*9880d681SAndroid Build Coastguard Worker
2046*9880d681SAndroid Build Coastguard Worker  // Vector Extract Unsigned Word
2047*9880d681SAndroid Build Coastguard Worker  def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165,
2048*9880d681SAndroid Build Coastguard Worker                                  (outs vsfrc:$XT), (ins vsrc:$XB, u4imm:$UIMM),
2049*9880d681SAndroid Build Coastguard Worker                                  "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>;
2050*9880d681SAndroid Build Coastguard Worker
2051*9880d681SAndroid Build Coastguard Worker  // Vector Insert Exponent DP/SP
2052*9880d681SAndroid Build Coastguard Worker  def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc,
2053*9880d681SAndroid Build Coastguard Worker                                 IIC_VecFP, []>;
2054*9880d681SAndroid Build Coastguard Worker  def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc,
2055*9880d681SAndroid Build Coastguard Worker                                 IIC_VecFP, []>;
2056*9880d681SAndroid Build Coastguard Worker
2057*9880d681SAndroid Build Coastguard Worker  // Vector Extract Exponent/Significand DP/SP
2058*9880d681SAndroid Build Coastguard Worker  def XVXEXPDP : XX2_XT6_XO5_XB6<60,  0, 475, "xvxexpdp", vsrc, []>;
2059*9880d681SAndroid Build Coastguard Worker  def XVXEXPSP : XX2_XT6_XO5_XB6<60,  8, 475, "xvxexpsp", vsrc, []>;
2060*9880d681SAndroid Build Coastguard Worker  def XVXSIGDP : XX2_XT6_XO5_XB6<60,  1, 475, "xvxsigdp", vsrc, []>;
2061*9880d681SAndroid Build Coastguard Worker  def XVXSIGSP : XX2_XT6_XO5_XB6<60,  9, 475, "xvxsigsp", vsrc, []>;
2062*9880d681SAndroid Build Coastguard Worker
2063*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
2064*9880d681SAndroid Build Coastguard Worker
2065*9880d681SAndroid Build Coastguard Worker  // Test Data Class SP/DP/QP
2066*9880d681SAndroid Build Coastguard Worker  def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298,
2067*9880d681SAndroid Build Coastguard Worker                              (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2068*9880d681SAndroid Build Coastguard Worker                              "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>;
2069*9880d681SAndroid Build Coastguard Worker  def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362,
2070*9880d681SAndroid Build Coastguard Worker                              (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB),
2071*9880d681SAndroid Build Coastguard Worker                              "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>;
2072*9880d681SAndroid Build Coastguard Worker  def XSTSTDCQP : X_BF3_DCMX7_RS5  <63, 708,
2073*9880d681SAndroid Build Coastguard Worker                              (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB),
2074*9880d681SAndroid Build Coastguard Worker                              "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>;
2075*9880d681SAndroid Build Coastguard Worker
2076*9880d681SAndroid Build Coastguard Worker  // Vector Test Data Class SP/DP
2077*9880d681SAndroid Build Coastguard Worker  def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5,
2078*9880d681SAndroid Build Coastguard Worker                              (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2079*9880d681SAndroid Build Coastguard Worker                              "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP, []>;
2080*9880d681SAndroid Build Coastguard Worker  def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5,
2081*9880d681SAndroid Build Coastguard Worker                              (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB),
2082*9880d681SAndroid Build Coastguard Worker                              "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP, []>;
2083*9880d681SAndroid Build Coastguard Worker
2084*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
2085*9880d681SAndroid Build Coastguard Worker
2086*9880d681SAndroid Build Coastguard Worker  // Maximum/Minimum Type-C/Type-J DP
2087*9880d681SAndroid Build Coastguard Worker  // XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU, so we use vsrc for XT
2088*9880d681SAndroid Build Coastguard Worker  def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsrc, vsfrc, vsfrc,
2089*9880d681SAndroid Build Coastguard Worker                                 IIC_VecFP, []>;
2090*9880d681SAndroid Build Coastguard Worker  def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc,
2091*9880d681SAndroid Build Coastguard Worker                                 IIC_VecFP, []>;
2092*9880d681SAndroid Build Coastguard Worker  def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsrc, vsfrc, vsfrc,
2093*9880d681SAndroid Build Coastguard Worker                                 IIC_VecFP, []>;
2094*9880d681SAndroid Build Coastguard Worker  def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc,
2095*9880d681SAndroid Build Coastguard Worker                                 IIC_VecFP, []>;
2096*9880d681SAndroid Build Coastguard Worker
2097*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
2098*9880d681SAndroid Build Coastguard Worker
2099*9880d681SAndroid Build Coastguard Worker  // Vector Byte-Reverse H/W/D/Q Word
2100*9880d681SAndroid Build Coastguard Worker  def XXBRH : XX2_XT6_XO5_XB6<60,  7, 475, "xxbrh", vsrc, []>;
2101*9880d681SAndroid Build Coastguard Worker  def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, []>;
2102*9880d681SAndroid Build Coastguard Worker  def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, []>;
2103*9880d681SAndroid Build Coastguard Worker  def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>;
2104*9880d681SAndroid Build Coastguard Worker
2105*9880d681SAndroid Build Coastguard Worker  // Vector Permute
2106*9880d681SAndroid Build Coastguard Worker  def XXPERM  : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc,
2107*9880d681SAndroid Build Coastguard Worker                                IIC_VecPerm, []>;
2108*9880d681SAndroid Build Coastguard Worker  def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc,
2109*9880d681SAndroid Build Coastguard Worker                                IIC_VecPerm, []>;
2110*9880d681SAndroid Build Coastguard Worker
2111*9880d681SAndroid Build Coastguard Worker  // Vector Splat Immediate Byte
2112*9880d681SAndroid Build Coastguard Worker  def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8),
2113*9880d681SAndroid Build Coastguard Worker                            "xxspltib $XT, $IMM8", IIC_VecPerm, []>;
2114*9880d681SAndroid Build Coastguard Worker
2115*9880d681SAndroid Build Coastguard Worker  //===--------------------------------------------------------------------===//
2116*9880d681SAndroid Build Coastguard Worker  // Vector/Scalar Load/Store Instructions
2117*9880d681SAndroid Build Coastguard Worker
2118*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1 in {
2119*9880d681SAndroid Build Coastguard Worker  // Load Vector
2120*9880d681SAndroid Build Coastguard Worker  def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src),
2121*9880d681SAndroid Build Coastguard Worker                            "lxv $XT, $src", IIC_LdStLFD, []>;
2122*9880d681SAndroid Build Coastguard Worker  // Load DWord
2123*9880d681SAndroid Build Coastguard Worker  def LXSD  : DSForm_1<57, 2, (outs vrrc:$vD), (ins memrix:$src),
2124*9880d681SAndroid Build Coastguard Worker                       "lxsd $vD, $src", IIC_LdStLFD, []>;
2125*9880d681SAndroid Build Coastguard Worker  // Load SP from src, convert it to DP, and place in dword[0]
2126*9880d681SAndroid Build Coastguard Worker  def LXSSP : DSForm_1<57, 3, (outs vrrc:$vD), (ins memrix:$src),
2127*9880d681SAndroid Build Coastguard Worker                       "lxssp $vD, $src", IIC_LdStLFD, []>;
2128*9880d681SAndroid Build Coastguard Worker
2129*9880d681SAndroid Build Coastguard Worker  // [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different
2130*9880d681SAndroid Build Coastguard Worker  // "out" and "in" dag
2131*9880d681SAndroid Build Coastguard Worker  class X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2132*9880d681SAndroid Build Coastguard Worker                      RegisterOperand vtype, list<dag> pattern>
2133*9880d681SAndroid Build Coastguard Worker    : XX1Form<opcode, xo, (outs vtype:$XT), (ins memrr:$src),
2134*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>;
2135*9880d681SAndroid Build Coastguard Worker
2136*9880d681SAndroid Build Coastguard Worker  // Load as Integer Byte/Halfword & Zero Indexed
2137*9880d681SAndroid Build Coastguard Worker  def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc, []>;
2138*9880d681SAndroid Build Coastguard Worker  def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc, []>;
2139*9880d681SAndroid Build Coastguard Worker
2140*9880d681SAndroid Build Coastguard Worker  // Load Vector Halfword*8/Byte*16 Indexed
2141*9880d681SAndroid Build Coastguard Worker  def LXVH8X  : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>;
2142*9880d681SAndroid Build Coastguard Worker  def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>;
2143*9880d681SAndroid Build Coastguard Worker
2144*9880d681SAndroid Build Coastguard Worker  // Load Vector Indexed
2145*9880d681SAndroid Build Coastguard Worker  def LXVX    : X_XT6_RA5_RB5<31, 268, "lxvx"   , vsrc, []>;
2146*9880d681SAndroid Build Coastguard Worker
2147*9880d681SAndroid Build Coastguard Worker  // Load Vector (Left-justified) with Length
2148*9880d681SAndroid Build Coastguard Worker  def LXVL    : X_XT6_RA5_RB5<31, 269, "lxvl"   , vsrc, []>;
2149*9880d681SAndroid Build Coastguard Worker  def LXVLL   : X_XT6_RA5_RB5<31, 301, "lxvll"  , vsrc, []>;
2150*9880d681SAndroid Build Coastguard Worker
2151*9880d681SAndroid Build Coastguard Worker  // Load Vector Word & Splat Indexed
2152*9880d681SAndroid Build Coastguard Worker  def LXVWSX  : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>;
2153*9880d681SAndroid Build Coastguard Worker  } // end mayLoad
2154*9880d681SAndroid Build Coastguard Worker
2155*9880d681SAndroid Build Coastguard Worker  let mayStore = 1 in {
2156*9880d681SAndroid Build Coastguard Worker  // Store Vector
2157*9880d681SAndroid Build Coastguard Worker  def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst),
2158*9880d681SAndroid Build Coastguard Worker                             "stxv $XT, $dst", IIC_LdStSTFD, []>;
2159*9880d681SAndroid Build Coastguard Worker  // Store DWord
2160*9880d681SAndroid Build Coastguard Worker  def STXSD  : DSForm_1<61, 2, (outs), (ins vrrc:$vS, memrix:$dst),
2161*9880d681SAndroid Build Coastguard Worker                        "stxsd $vS, $dst", IIC_LdStSTFD, []>;
2162*9880d681SAndroid Build Coastguard Worker  // Convert DP of dword[0] to SP, and Store to dst
2163*9880d681SAndroid Build Coastguard Worker  def STXSSP : DSForm_1<61, 3, (outs), (ins vrrc:$vS, memrix:$dst),
2164*9880d681SAndroid Build Coastguard Worker                        "stxssp $vS, $dst", IIC_LdStSTFD, []>;
2165*9880d681SAndroid Build Coastguard Worker
2166*9880d681SAndroid Build Coastguard Worker  // [PO S RA RB XO SX]
2167*9880d681SAndroid Build Coastguard Worker  class X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc,
2168*9880d681SAndroid Build Coastguard Worker                      RegisterOperand vtype, list<dag> pattern>
2169*9880d681SAndroid Build Coastguard Worker    : XX1Form<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst),
2170*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>;
2171*9880d681SAndroid Build Coastguard Worker
2172*9880d681SAndroid Build Coastguard Worker  // Store as Integer Byte/Halfword Indexed
2173*9880d681SAndroid Build Coastguard Worker  def STXSIBX  : X_XS6_RA5_RB5<31,  909, "stxsibx" , vsfrc, []>;
2174*9880d681SAndroid Build Coastguard Worker  def STXSIHX  : X_XS6_RA5_RB5<31,  941, "stxsihx" , vsfrc, []>;
2175*9880d681SAndroid Build Coastguard Worker
2176*9880d681SAndroid Build Coastguard Worker  // Store Vector Halfword*8/Byte*16 Indexed
2177*9880d681SAndroid Build Coastguard Worker  def STXVH8X  : X_XS6_RA5_RB5<31,  940, "stxvh8x" , vsrc, []>;
2178*9880d681SAndroid Build Coastguard Worker  def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>;
2179*9880d681SAndroid Build Coastguard Worker
2180*9880d681SAndroid Build Coastguard Worker  // Store Vector Indexed
2181*9880d681SAndroid Build Coastguard Worker  def STXVX    : X_XS6_RA5_RB5<31,  396, "stxvx"   , vsrc, []>;
2182*9880d681SAndroid Build Coastguard Worker
2183*9880d681SAndroid Build Coastguard Worker  // Store Vector (Left-justified) with Length
2184*9880d681SAndroid Build Coastguard Worker  def STXVL    : X_XS6_RA5_RB5<31,  397, "stxvl"   , vsrc, []>;
2185*9880d681SAndroid Build Coastguard Worker  def STXVLL   : X_XS6_RA5_RB5<31,  429, "stxvll"  , vsrc, []>;
2186*9880d681SAndroid Build Coastguard Worker  } // end mayStore
2187*9880d681SAndroid Build Coastguard Worker
2188*9880d681SAndroid Build Coastguard Worker  // Patterns for which instructions from ISA 3.0 are a better match
2189*9880d681SAndroid Build Coastguard Worker  let Predicates = [IsLittleEndian, HasP9Vector] in {
2190*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 0))))),
2191*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
2192*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 1))))),
2193*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
2194*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 2))))),
2195*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
2196*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 3))))),
2197*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
2198*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
2199*9880d681SAndroid Build Coastguard Worker            (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
2200*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
2201*9880d681SAndroid Build Coastguard Worker            (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
2202*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
2203*9880d681SAndroid Build Coastguard Worker            (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
2204*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
2205*9880d681SAndroid Build Coastguard Worker            (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
2206*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
2207*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
2208*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
2209*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
2210*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
2211*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
2212*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
2213*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
2214*9880d681SAndroid Build Coastguard Worker  } // IsLittleEndian, HasP9Vector
2215*9880d681SAndroid Build Coastguard Worker
2216*9880d681SAndroid Build Coastguard Worker  let Predicates = [IsBigEndian, HasP9Vector] in {
2217*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 0))))),
2218*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>;
2219*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 1))))),
2220*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>;
2221*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 2))))),
2222*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>;
2223*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (PPCfcfidus (PPCmtvsrz (i32 (extractelt v4i32:$A, 3))))),
2224*9880d681SAndroid Build Coastguard Worker            (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>;
2225*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)),
2226*9880d681SAndroid Build Coastguard Worker            (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>;
2227*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)),
2228*9880d681SAndroid Build Coastguard Worker            (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>;
2229*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)),
2230*9880d681SAndroid Build Coastguard Worker            (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>;
2231*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)),
2232*9880d681SAndroid Build Coastguard Worker            (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>;
2233*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)),
2234*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>;
2235*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)),
2236*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>;
2237*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)),
2238*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>;
2239*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)),
2240*9880d681SAndroid Build Coastguard Worker            (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>;
2241*9880d681SAndroid Build Coastguard Worker  } // IsLittleEndian, HasP9Vector
2242*9880d681SAndroid Build Coastguard Worker} // end HasP9Vector, AddedComplexity
2243