Home | History | Annotate | Download | only in PowerPC
      1 //===- PPCInstrVSX.td - The PowerPC VSX Extension --*- tablegen -*-===//
      2 // 
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 // 
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file describes the VSX extension to the PowerPC instruction set.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 // *********************************** NOTE ***********************************
     15 // ** For POWER8 Little Endian, the VSX swap optimization relies on knowing  **
     16 // ** which VMX and VSX instructions are lane-sensitive and which are not.   **
     17 // ** A lane-sensitive instruction relies, implicitly or explicitly, on      **
     18 // ** whether lanes are numbered from left to right.  An instruction like    **
     19 // ** VADDFP is not lane-sensitive, because each lane of the result vector   **
     20 // ** relies only on the corresponding lane of the source vectors.  However, **
     21 // ** an instruction like VMULESB is lane-sensitive, because "even" and      **
     22 // ** "odd" lanes are different for big-endian and little-endian numbering.  **
     23 // **                                                                        **
     24 // ** When adding new VMX and VSX instructions, please consider whether they **
     25 // ** are lane-sensitive.  If so, they must be added to a switch statement   **
     26 // ** in PPCVSXSwapRemoval::gatherVectorInstructions().                      **
     27 // ****************************************************************************
     28 
     29 def PPCRegVSRCAsmOperand : AsmOperandClass {
     30   let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber";
     31 }
     32 def vsrc : RegisterOperand<VSRC> {
     33   let ParserMatchClass = PPCRegVSRCAsmOperand;
     34 }
     35 
     36 def PPCRegVSFRCAsmOperand : AsmOperandClass {
     37   let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber";
     38 }
     39 def vsfrc : RegisterOperand<VSFRC> {
     40   let ParserMatchClass = PPCRegVSFRCAsmOperand;
     41 }
     42 
     43 def PPCRegVSSRCAsmOperand : AsmOperandClass {
     44   let Name = "RegVSSRC"; let PredicateMethod = "isVSRegNumber";
     45 }
     46 def vssrc : RegisterOperand<VSSRC> {
     47   let ParserMatchClass = PPCRegVSSRCAsmOperand;
     48 }
     49 
     50 // Little-endian-specific nodes.
     51 def SDT_PPClxvd2x : SDTypeProfile<1, 1, [
     52   SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
     53 ]>;
     54 def SDT_PPCstxvd2x : SDTypeProfile<0, 2, [
     55   SDTCisVT<0, v2f64>, SDTCisPtrTy<1>
     56 ]>;
     57 def SDT_PPCxxswapd : SDTypeProfile<1, 1, [
     58   SDTCisSameAs<0, 1>
     59 ]>;
     60 
     61 def PPClxvd2x  : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x,
     62                         [SDNPHasChain, SDNPMayLoad]>;
     63 def PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x,
     64                         [SDNPHasChain, SDNPMayStore]>;
     65 def PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>;
     66 def PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>;
     67 def PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>;
     68 def PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>;
     69 
     70 multiclass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase,
     71                     string asmstr, InstrItinClass itin, Intrinsic Int,
     72                     ValueType OutTy, ValueType InTy> {
     73   let BaseName = asmbase in {
     74     def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
     75                        !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
     76                        [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>;
     77     let Defs = [CR6] in
     78     def o    : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
     79                        !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
     80                        [(set InTy:$XT,
     81                                 (InTy (PPCvcmp_o InTy:$XA, InTy:$XB, xo)))]>,
     82                        isDOT;
     83   }
     84 }
     85 
     86 def HasVSX : Predicate<"PPCSubTarget->hasVSX()">;
     87 def IsLittleEndian : Predicate<"PPCSubTarget->isLittleEndian()">;
     88 def IsBigEndian : Predicate<"!PPCSubTarget->isLittleEndian()">;
     89 
     90 let Predicates = [HasVSX] in {
     91 let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
     92 let hasSideEffects = 0 in { // VSX instructions don't have side effects.
     93 let Uses = [RM] in {
     94 
     95   // Load indexed instructions
     96   let mayLoad = 1 in {
     97     def LXSDX : XX1Form<31, 588,
     98                         (outs vsfrc:$XT), (ins memrr:$src),
     99                         "lxsdx $XT, $src", IIC_LdStLFD,
    100                         [(set f64:$XT, (load xoaddr:$src))]>;
    101 
    102     def LXVD2X : XX1Form<31, 844,
    103                          (outs vsrc:$XT), (ins memrr:$src),
    104                          "lxvd2x $XT, $src", IIC_LdStLFD,
    105                          [(set v2f64:$XT, (int_ppc_vsx_lxvd2x xoaddr:$src))]>;
    106 
    107     def LXVDSX : XX1Form<31, 332,
    108                          (outs vsrc:$XT), (ins memrr:$src),
    109                          "lxvdsx $XT, $src", IIC_LdStLFD, []>;
    110 
    111     def LXVW4X : XX1Form<31, 780,
    112                          (outs vsrc:$XT), (ins memrr:$src),
    113                          "lxvw4x $XT, $src", IIC_LdStLFD,
    114                          [(set v4i32:$XT, (int_ppc_vsx_lxvw4x xoaddr:$src))]>;
    115   } // mayLoad
    116 
    117   // Store indexed instructions
    118   let mayStore = 1 in {
    119     def STXSDX : XX1Form<31, 716,
    120                         (outs), (ins vsfrc:$XT, memrr:$dst),
    121                         "stxsdx $XT, $dst", IIC_LdStSTFD,
    122                         [(store f64:$XT, xoaddr:$dst)]>;
    123 
    124     def STXVD2X : XX1Form<31, 972,
    125                          (outs), (ins vsrc:$XT, memrr:$dst),
    126                          "stxvd2x $XT, $dst", IIC_LdStSTFD,
    127                          [(store v2f64:$XT, xoaddr:$dst)]>;
    128 
    129     def STXVW4X : XX1Form<31, 908,
    130                          (outs), (ins vsrc:$XT, memrr:$dst),
    131                          "stxvw4x $XT, $dst", IIC_LdStSTFD,
    132                          [(store v4i32:$XT, xoaddr:$dst)]>;
    133 
    134   } // mayStore
    135 
    136   // Add/Mul Instructions
    137   let isCommutable = 1 in {
    138     def XSADDDP : XX3Form<60, 32,
    139                           (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
    140                           "xsadddp $XT, $XA, $XB", IIC_VecFP,
    141                           [(set f64:$XT, (fadd f64:$XA, f64:$XB))]>;
    142     def XSMULDP : XX3Form<60, 48,
    143                           (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
    144                           "xsmuldp $XT, $XA, $XB", IIC_VecFP,
    145                           [(set f64:$XT, (fmul f64:$XA, f64:$XB))]>;
    146 
    147     def XVADDDP : XX3Form<60, 96,
    148                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    149                           "xvadddp $XT, $XA, $XB", IIC_VecFP,
    150                           [(set v2f64:$XT, (fadd v2f64:$XA, v2f64:$XB))]>;
    151 
    152     def XVADDSP : XX3Form<60, 64,
    153                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    154                           "xvaddsp $XT, $XA, $XB", IIC_VecFP,
    155                           [(set v4f32:$XT, (fadd v4f32:$XA, v4f32:$XB))]>;
    156 
    157     def XVMULDP : XX3Form<60, 112,
    158                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    159                           "xvmuldp $XT, $XA, $XB", IIC_VecFP,
    160                           [(set v2f64:$XT, (fmul v2f64:$XA, v2f64:$XB))]>;
    161 
    162     def XVMULSP : XX3Form<60, 80,
    163                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    164                           "xvmulsp $XT, $XA, $XB", IIC_VecFP,
    165                           [(set v4f32:$XT, (fmul v4f32:$XA, v4f32:$XB))]>;
    166   }
    167 
    168   // Subtract Instructions
    169   def XSSUBDP : XX3Form<60, 40,
    170                         (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
    171                         "xssubdp $XT, $XA, $XB", IIC_VecFP,
    172                         [(set f64:$XT, (fsub f64:$XA, f64:$XB))]>;
    173 
    174   def XVSUBDP : XX3Form<60, 104,
    175                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    176                         "xvsubdp $XT, $XA, $XB", IIC_VecFP,
    177                         [(set v2f64:$XT, (fsub v2f64:$XA, v2f64:$XB))]>;
    178   def XVSUBSP : XX3Form<60, 72,
    179                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    180                         "xvsubsp $XT, $XA, $XB", IIC_VecFP,
    181                         [(set v4f32:$XT, (fsub v4f32:$XA, v4f32:$XB))]>;
    182 
    183   // FMA Instructions
    184   let BaseName = "XSMADDADP" in {
    185   let isCommutable = 1 in
    186   def XSMADDADP : XX3Form<60, 33,
    187                           (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
    188                           "xsmaddadp $XT, $XA, $XB", IIC_VecFP,
    189                           [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,
    190                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    191                           AltVSXFMARel;
    192   let IsVSXFMAAlt = 1 in
    193   def XSMADDMDP : XX3Form<60, 41,
    194                           (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
    195                           "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
    196                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    197                           AltVSXFMARel;
    198   }
    199 
    200   let BaseName = "XSMSUBADP" in {
    201   let isCommutable = 1 in
    202   def XSMSUBADP : XX3Form<60, 49,
    203                           (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
    204                           "xsmsubadp $XT, $XA, $XB", IIC_VecFP,
    205                           [(set f64:$XT, (fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>,
    206                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    207                           AltVSXFMARel;
    208   let IsVSXFMAAlt = 1 in
    209   def XSMSUBMDP : XX3Form<60, 57,
    210                           (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
    211                           "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
    212                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    213                           AltVSXFMARel;
    214   }
    215 
    216   let BaseName = "XSNMADDADP" in {
    217   let isCommutable = 1 in
    218   def XSNMADDADP : XX3Form<60, 161,
    219                           (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
    220                           "xsnmaddadp $XT, $XA, $XB", IIC_VecFP,
    221                           [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, f64:$XTi)))]>,
    222                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    223                           AltVSXFMARel;
    224   let IsVSXFMAAlt = 1 in
    225   def XSNMADDMDP : XX3Form<60, 169,
    226                           (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
    227                           "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
    228                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    229                           AltVSXFMARel;
    230   }
    231 
    232   let BaseName = "XSNMSUBADP" in {
    233   let isCommutable = 1 in
    234   def XSNMSUBADP : XX3Form<60, 177,
    235                           (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
    236                           "xsnmsubadp $XT, $XA, $XB", IIC_VecFP,
    237                           [(set f64:$XT, (fneg (fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>,
    238                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    239                           AltVSXFMARel;
    240   let IsVSXFMAAlt = 1 in
    241   def XSNMSUBMDP : XX3Form<60, 185,
    242                           (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),
    243                           "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
    244                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    245                           AltVSXFMARel;
    246   }
    247 
    248   let BaseName = "XVMADDADP" in {
    249   let isCommutable = 1 in
    250   def XVMADDADP : XX3Form<60, 97,
    251                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    252                           "xvmaddadp $XT, $XA, $XB", IIC_VecFP,
    253                           [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>,
    254                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    255                           AltVSXFMARel;
    256   let IsVSXFMAAlt = 1 in
    257   def XVMADDMDP : XX3Form<60, 105,
    258                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    259                           "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
    260                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    261                           AltVSXFMARel;
    262   }
    263 
    264   let BaseName = "XVMADDASP" in {
    265   let isCommutable = 1 in
    266   def XVMADDASP : XX3Form<60, 65,
    267                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    268                           "xvmaddasp $XT, $XA, $XB", IIC_VecFP,
    269                           [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>,
    270                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    271                           AltVSXFMARel;
    272   let IsVSXFMAAlt = 1 in
    273   def XVMADDMSP : XX3Form<60, 73,
    274                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    275                           "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
    276                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    277                           AltVSXFMARel;
    278   }
    279 
    280   let BaseName = "XVMSUBADP" in {
    281   let isCommutable = 1 in
    282   def XVMSUBADP : XX3Form<60, 113,
    283                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    284                           "xvmsubadp $XT, $XA, $XB", IIC_VecFP,
    285                           [(set v2f64:$XT, (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>,
    286                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    287                           AltVSXFMARel;
    288   let IsVSXFMAAlt = 1 in
    289   def XVMSUBMDP : XX3Form<60, 121,
    290                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    291                           "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
    292                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    293                           AltVSXFMARel;
    294   }
    295 
    296   let BaseName = "XVMSUBASP" in {
    297   let isCommutable = 1 in
    298   def XVMSUBASP : XX3Form<60, 81,
    299                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    300                           "xvmsubasp $XT, $XA, $XB", IIC_VecFP,
    301                           [(set v4f32:$XT, (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>,
    302                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    303                           AltVSXFMARel;
    304   let IsVSXFMAAlt = 1 in
    305   def XVMSUBMSP : XX3Form<60, 89,
    306                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    307                           "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
    308                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    309                           AltVSXFMARel;
    310   }
    311 
    312   let BaseName = "XVNMADDADP" in {
    313   let isCommutable = 1 in
    314   def XVNMADDADP : XX3Form<60, 225,
    315                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    316                           "xvnmaddadp $XT, $XA, $XB", IIC_VecFP,
    317                           [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>,
    318                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    319                           AltVSXFMARel;
    320   let IsVSXFMAAlt = 1 in
    321   def XVNMADDMDP : XX3Form<60, 233,
    322                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    323                           "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>,
    324                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    325                           AltVSXFMARel;
    326   }
    327 
    328   let BaseName = "XVNMADDASP" in {
    329   let isCommutable = 1 in
    330   def XVNMADDASP : XX3Form<60, 193,
    331                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    332                           "xvnmaddasp $XT, $XA, $XB", IIC_VecFP,
    333                           [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>,
    334                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    335                           AltVSXFMARel;
    336   let IsVSXFMAAlt = 1 in
    337   def XVNMADDMSP : XX3Form<60, 201,
    338                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    339                           "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
    340                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    341                           AltVSXFMARel;
    342   }
    343 
    344   let BaseName = "XVNMSUBADP" in {
    345   let isCommutable = 1 in
    346   def XVNMSUBADP : XX3Form<60, 241,
    347                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    348                           "xvnmsubadp $XT, $XA, $XB", IIC_VecFP,
    349                           [(set v2f64:$XT, (fneg (fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>,
    350                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    351                           AltVSXFMARel;
    352   let IsVSXFMAAlt = 1 in
    353   def XVNMSUBMDP : XX3Form<60, 249,
    354                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    355                           "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>,
    356                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    357                           AltVSXFMARel;
    358   }
    359 
    360   let BaseName = "XVNMSUBASP" in {
    361   let isCommutable = 1 in
    362   def XVNMSUBASP : XX3Form<60, 209,
    363                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    364                           "xvnmsubasp $XT, $XA, $XB", IIC_VecFP,
    365                           [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>,
    366                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    367                           AltVSXFMARel;
    368   let IsVSXFMAAlt = 1 in
    369   def XVNMSUBMSP : XX3Form<60, 217,
    370                           (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB),
    371                           "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
    372                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
    373                           AltVSXFMARel;
    374   }
    375 
    376   // Division Instructions
    377   def XSDIVDP : XX3Form<60, 56,
    378                         (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
    379                         "xsdivdp $XT, $XA, $XB", IIC_FPDivD,
    380                         [(set f64:$XT, (fdiv f64:$XA, f64:$XB))]>;
    381   def XSSQRTDP : XX2Form<60, 75,
    382                         (outs vsfrc:$XT), (ins vsfrc:$XB),
    383                         "xssqrtdp $XT, $XB", IIC_FPSqrtD,
    384                         [(set f64:$XT, (fsqrt f64:$XB))]>;
    385 
    386   def XSREDP : XX2Form<60, 90,
    387                         (outs vsfrc:$XT), (ins vsfrc:$XB),
    388                         "xsredp $XT, $XB", IIC_VecFP,
    389                         [(set f64:$XT, (PPCfre f64:$XB))]>;
    390   def XSRSQRTEDP : XX2Form<60, 74,
    391                            (outs vsfrc:$XT), (ins vsfrc:$XB),
    392                            "xsrsqrtedp $XT, $XB", IIC_VecFP,
    393                            [(set f64:$XT, (PPCfrsqrte f64:$XB))]>;
    394 
    395   def XSTDIVDP : XX3Form_1<60, 61,
    396                          (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
    397                          "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
    398   def XSTSQRTDP : XX2Form_1<60, 106,
    399                           (outs crrc:$crD), (ins vsfrc:$XB),
    400                           "xstsqrtdp $crD, $XB", IIC_FPCompare, []>;
    401 
    402   def XVDIVDP : XX3Form<60, 120,
    403                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    404                         "xvdivdp $XT, $XA, $XB", IIC_FPDivD,
    405                         [(set v2f64:$XT, (fdiv v2f64:$XA, v2f64:$XB))]>;
    406   def XVDIVSP : XX3Form<60, 88,
    407                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    408                         "xvdivsp $XT, $XA, $XB", IIC_FPDivS,
    409                         [(set v4f32:$XT, (fdiv v4f32:$XA, v4f32:$XB))]>;
    410 
    411   def XVSQRTDP : XX2Form<60, 203,
    412                         (outs vsrc:$XT), (ins vsrc:$XB),
    413                         "xvsqrtdp $XT, $XB", IIC_FPSqrtD,
    414                         [(set v2f64:$XT, (fsqrt v2f64:$XB))]>;
    415   def XVSQRTSP : XX2Form<60, 139,
    416                         (outs vsrc:$XT), (ins vsrc:$XB),
    417                         "xvsqrtsp $XT, $XB", IIC_FPSqrtS,
    418                         [(set v4f32:$XT, (fsqrt v4f32:$XB))]>;
    419 
    420   def XVTDIVDP : XX3Form_1<60, 125,
    421                          (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
    422                          "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>;
    423   def XVTDIVSP : XX3Form_1<60, 93,
    424                          (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB),
    425                          "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>;
    426 
    427   def XVTSQRTDP : XX2Form_1<60, 234,
    428                           (outs crrc:$crD), (ins vsrc:$XB),
    429                           "xvtsqrtdp $crD, $XB", IIC_FPCompare, []>;
    430   def XVTSQRTSP : XX2Form_1<60, 170,
    431                           (outs crrc:$crD), (ins vsrc:$XB),
    432                           "xvtsqrtsp $crD, $XB", IIC_FPCompare, []>;
    433 
    434   def XVREDP : XX2Form<60, 218,
    435                         (outs vsrc:$XT), (ins vsrc:$XB),
    436                         "xvredp $XT, $XB", IIC_VecFP,
    437                         [(set v2f64:$XT, (PPCfre v2f64:$XB))]>;
    438   def XVRESP : XX2Form<60, 154,
    439                         (outs vsrc:$XT), (ins vsrc:$XB),
    440                         "xvresp $XT, $XB", IIC_VecFP,
    441                         [(set v4f32:$XT, (PPCfre v4f32:$XB))]>;
    442 
    443   def XVRSQRTEDP : XX2Form<60, 202,
    444                            (outs vsrc:$XT), (ins vsrc:$XB),
    445                            "xvrsqrtedp $XT, $XB", IIC_VecFP,
    446                            [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>;
    447   def XVRSQRTESP : XX2Form<60, 138,
    448                            (outs vsrc:$XT), (ins vsrc:$XB),
    449                            "xvrsqrtesp $XT, $XB", IIC_VecFP,
    450                            [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>;
    451 
    452   // Compare Instructions
    453   def XSCMPODP : XX3Form_1<60, 43,
    454                            (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
    455                            "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>;
    456   def XSCMPUDP : XX3Form_1<60, 35,
    457                            (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB),
    458                            "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>;
    459 
    460   defm XVCMPEQDP : XX3Form_Rcr<60, 99,
    461                              "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare,
    462                              int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>;
    463   defm XVCMPEQSP : XX3Form_Rcr<60, 67,
    464                              "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare,
    465                              int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>;
    466   defm XVCMPGEDP : XX3Form_Rcr<60, 115,
    467                              "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare,
    468                              int_ppc_vsx_xvcmpgedp, v2i64, v2f64>;
    469   defm XVCMPGESP : XX3Form_Rcr<60, 83,
    470                              "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare,
    471                              int_ppc_vsx_xvcmpgesp, v4i32, v4f32>;
    472   defm XVCMPGTDP : XX3Form_Rcr<60, 107,
    473                              "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare,
    474                              int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>;
    475   defm XVCMPGTSP : XX3Form_Rcr<60, 75,
    476                              "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare,
    477                              int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>;
    478 
    479   // Move Instructions
    480   def XSABSDP : XX2Form<60, 345,
    481                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    482                       "xsabsdp $XT, $XB", IIC_VecFP,
    483                       [(set f64:$XT, (fabs f64:$XB))]>;
    484   def XSNABSDP : XX2Form<60, 361,
    485                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    486                       "xsnabsdp $XT, $XB", IIC_VecFP,
    487                       [(set f64:$XT, (fneg (fabs f64:$XB)))]>;
    488   def XSNEGDP : XX2Form<60, 377,
    489                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    490                       "xsnegdp $XT, $XB", IIC_VecFP,
    491                       [(set f64:$XT, (fneg f64:$XB))]>;
    492   def XSCPSGNDP : XX3Form<60, 176,
    493                       (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
    494                       "xscpsgndp $XT, $XA, $XB", IIC_VecFP,
    495                       [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>;
    496 
    497   def XVABSDP : XX2Form<60, 473,
    498                       (outs vsrc:$XT), (ins vsrc:$XB),
    499                       "xvabsdp $XT, $XB", IIC_VecFP,
    500                       [(set v2f64:$XT, (fabs v2f64:$XB))]>;
    501 
    502   def XVABSSP : XX2Form<60, 409,
    503                       (outs vsrc:$XT), (ins vsrc:$XB),
    504                       "xvabssp $XT, $XB", IIC_VecFP,
    505                       [(set v4f32:$XT, (fabs v4f32:$XB))]>;
    506 
    507   def XVCPSGNDP : XX3Form<60, 240,
    508                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    509                       "xvcpsgndp $XT, $XA, $XB", IIC_VecFP,
    510                       [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>;
    511   def XVCPSGNSP : XX3Form<60, 208,
    512                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    513                       "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP,
    514                       [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>;
    515 
    516   def XVNABSDP : XX2Form<60, 489,
    517                       (outs vsrc:$XT), (ins vsrc:$XB),
    518                       "xvnabsdp $XT, $XB", IIC_VecFP,
    519                       [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>;
    520   def XVNABSSP : XX2Form<60, 425,
    521                       (outs vsrc:$XT), (ins vsrc:$XB),
    522                       "xvnabssp $XT, $XB", IIC_VecFP,
    523                       [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>;
    524 
    525   def XVNEGDP : XX2Form<60, 505,
    526                       (outs vsrc:$XT), (ins vsrc:$XB),
    527                       "xvnegdp $XT, $XB", IIC_VecFP,
    528                       [(set v2f64:$XT, (fneg v2f64:$XB))]>;
    529   def XVNEGSP : XX2Form<60, 441,
    530                       (outs vsrc:$XT), (ins vsrc:$XB),
    531                       "xvnegsp $XT, $XB", IIC_VecFP,
    532                       [(set v4f32:$XT, (fneg v4f32:$XB))]>;
    533 
    534   // Conversion Instructions
    535   def XSCVDPSP : XX2Form<60, 265,
    536                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    537                       "xscvdpsp $XT, $XB", IIC_VecFP, []>;
    538   def XSCVDPSXDS : XX2Form<60, 344,
    539                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    540                       "xscvdpsxds $XT, $XB", IIC_VecFP,
    541                       [(set f64:$XT, (PPCfctidz f64:$XB))]>;
    542   def XSCVDPSXWS : XX2Form<60, 88,
    543                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    544                       "xscvdpsxws $XT, $XB", IIC_VecFP,
    545                       [(set f64:$XT, (PPCfctiwz f64:$XB))]>;
    546   def XSCVDPUXDS : XX2Form<60, 328,
    547                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    548                       "xscvdpuxds $XT, $XB", IIC_VecFP,
    549                       [(set f64:$XT, (PPCfctiduz f64:$XB))]>;
    550   def XSCVDPUXWS : XX2Form<60, 72,
    551                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    552                       "xscvdpuxws $XT, $XB", IIC_VecFP,
    553                       [(set f64:$XT, (PPCfctiwuz f64:$XB))]>;
    554   def XSCVSPDP : XX2Form<60, 329,
    555                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    556                       "xscvspdp $XT, $XB", IIC_VecFP, []>;
    557   def XSCVSXDDP : XX2Form<60, 376,
    558                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    559                       "xscvsxddp $XT, $XB", IIC_VecFP,
    560                       [(set f64:$XT, (PPCfcfid f64:$XB))]>;
    561   def XSCVUXDDP : XX2Form<60, 360,
    562                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    563                       "xscvuxddp $XT, $XB", IIC_VecFP,
    564                       [(set f64:$XT, (PPCfcfidu f64:$XB))]>;
    565 
    566   def XVCVDPSP : XX2Form<60, 393,
    567                       (outs vsrc:$XT), (ins vsrc:$XB),
    568                       "xvcvdpsp $XT, $XB", IIC_VecFP, []>;
    569   def XVCVDPSXDS : XX2Form<60, 472,
    570                       (outs vsrc:$XT), (ins vsrc:$XB),
    571                       "xvcvdpsxds $XT, $XB", IIC_VecFP,
    572                       [(set v2i64:$XT, (fp_to_sint v2f64:$XB))]>;
    573   def XVCVDPSXWS : XX2Form<60, 216,
    574                       (outs vsrc:$XT), (ins vsrc:$XB),
    575                       "xvcvdpsxws $XT, $XB", IIC_VecFP, []>;
    576   def XVCVDPUXDS : XX2Form<60, 456,
    577                       (outs vsrc:$XT), (ins vsrc:$XB),
    578                       "xvcvdpuxds $XT, $XB", IIC_VecFP,
    579                       [(set v2i64:$XT, (fp_to_uint v2f64:$XB))]>;
    580   def XVCVDPUXWS : XX2Form<60, 200,
    581                       (outs vsrc:$XT), (ins vsrc:$XB),
    582                       "xvcvdpuxws $XT, $XB", IIC_VecFP, []>;
    583 
    584   def XVCVSPDP : XX2Form<60, 457,
    585                       (outs vsrc:$XT), (ins vsrc:$XB),
    586                       "xvcvspdp $XT, $XB", IIC_VecFP, []>;
    587   def XVCVSPSXDS : XX2Form<60, 408,
    588                       (outs vsrc:$XT), (ins vsrc:$XB),
    589                       "xvcvspsxds $XT, $XB", IIC_VecFP, []>;
    590   def XVCVSPSXWS : XX2Form<60, 152,
    591                       (outs vsrc:$XT), (ins vsrc:$XB),
    592                       "xvcvspsxws $XT, $XB", IIC_VecFP, []>;
    593   def XVCVSPUXDS : XX2Form<60, 392,
    594                       (outs vsrc:$XT), (ins vsrc:$XB),
    595                       "xvcvspuxds $XT, $XB", IIC_VecFP, []>;
    596   def XVCVSPUXWS : XX2Form<60, 136,
    597                       (outs vsrc:$XT), (ins vsrc:$XB),
    598                       "xvcvspuxws $XT, $XB", IIC_VecFP, []>;
    599   def XVCVSXDDP : XX2Form<60, 504,
    600                       (outs vsrc:$XT), (ins vsrc:$XB),
    601                       "xvcvsxddp $XT, $XB", IIC_VecFP,
    602                       [(set v2f64:$XT, (sint_to_fp v2i64:$XB))]>;
    603   def XVCVSXDSP : XX2Form<60, 440,
    604                       (outs vsrc:$XT), (ins vsrc:$XB),
    605                       "xvcvsxdsp $XT, $XB", IIC_VecFP, []>;
    606   def XVCVSXWDP : XX2Form<60, 248,
    607                       (outs vsrc:$XT), (ins vsrc:$XB),
    608                       "xvcvsxwdp $XT, $XB", IIC_VecFP, []>;
    609   def XVCVSXWSP : XX2Form<60, 184,
    610                       (outs vsrc:$XT), (ins vsrc:$XB),
    611                       "xvcvsxwsp $XT, $XB", IIC_VecFP, []>;
    612   def XVCVUXDDP : XX2Form<60, 488,
    613                       (outs vsrc:$XT), (ins vsrc:$XB),
    614                       "xvcvuxddp $XT, $XB", IIC_VecFP,
    615                       [(set v2f64:$XT, (uint_to_fp v2i64:$XB))]>;
    616   def XVCVUXDSP : XX2Form<60, 424,
    617                       (outs vsrc:$XT), (ins vsrc:$XB),
    618                       "xvcvuxdsp $XT, $XB", IIC_VecFP, []>;
    619   def XVCVUXWDP : XX2Form<60, 232,
    620                       (outs vsrc:$XT), (ins vsrc:$XB),
    621                       "xvcvuxwdp $XT, $XB", IIC_VecFP, []>;
    622   def XVCVUXWSP : XX2Form<60, 168,
    623                       (outs vsrc:$XT), (ins vsrc:$XB),
    624                       "xvcvuxwsp $XT, $XB", IIC_VecFP, []>;
    625 
    626   // Rounding Instructions
    627   def XSRDPI : XX2Form<60, 73,
    628                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    629                       "xsrdpi $XT, $XB", IIC_VecFP,
    630                       [(set f64:$XT, (frnd f64:$XB))]>;
    631   def XSRDPIC : XX2Form<60, 107,
    632                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    633                       "xsrdpic $XT, $XB", IIC_VecFP,
    634                       [(set f64:$XT, (fnearbyint f64:$XB))]>;
    635   def XSRDPIM : XX2Form<60, 121,
    636                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    637                       "xsrdpim $XT, $XB", IIC_VecFP,
    638                       [(set f64:$XT, (ffloor f64:$XB))]>;
    639   def XSRDPIP : XX2Form<60, 105,
    640                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    641                       "xsrdpip $XT, $XB", IIC_VecFP,
    642                       [(set f64:$XT, (fceil f64:$XB))]>;
    643   def XSRDPIZ : XX2Form<60, 89,
    644                       (outs vsfrc:$XT), (ins vsfrc:$XB),
    645                       "xsrdpiz $XT, $XB", IIC_VecFP,
    646                       [(set f64:$XT, (ftrunc f64:$XB))]>;
    647 
    648   def XVRDPI : XX2Form<60, 201,
    649                       (outs vsrc:$XT), (ins vsrc:$XB),
    650                       "xvrdpi $XT, $XB", IIC_VecFP,
    651                       [(set v2f64:$XT, (frnd v2f64:$XB))]>;
    652   def XVRDPIC : XX2Form<60, 235,
    653                       (outs vsrc:$XT), (ins vsrc:$XB),
    654                       "xvrdpic $XT, $XB", IIC_VecFP,
    655                       [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>;
    656   def XVRDPIM : XX2Form<60, 249,
    657                       (outs vsrc:$XT), (ins vsrc:$XB),
    658                       "xvrdpim $XT, $XB", IIC_VecFP,
    659                       [(set v2f64:$XT, (ffloor v2f64:$XB))]>;
    660   def XVRDPIP : XX2Form<60, 233,
    661                       (outs vsrc:$XT), (ins vsrc:$XB),
    662                       "xvrdpip $XT, $XB", IIC_VecFP,
    663                       [(set v2f64:$XT, (fceil v2f64:$XB))]>;
    664   def XVRDPIZ : XX2Form<60, 217,
    665                       (outs vsrc:$XT), (ins vsrc:$XB),
    666                       "xvrdpiz $XT, $XB", IIC_VecFP,
    667                       [(set v2f64:$XT, (ftrunc v2f64:$XB))]>;
    668 
    669   def XVRSPI : XX2Form<60, 137,
    670                       (outs vsrc:$XT), (ins vsrc:$XB),
    671                       "xvrspi $XT, $XB", IIC_VecFP,
    672                       [(set v4f32:$XT, (frnd v4f32:$XB))]>;
    673   def XVRSPIC : XX2Form<60, 171,
    674                       (outs vsrc:$XT), (ins vsrc:$XB),
    675                       "xvrspic $XT, $XB", IIC_VecFP,
    676                       [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>;
    677   def XVRSPIM : XX2Form<60, 185,
    678                       (outs vsrc:$XT), (ins vsrc:$XB),
    679                       "xvrspim $XT, $XB", IIC_VecFP,
    680                       [(set v4f32:$XT, (ffloor v4f32:$XB))]>;
    681   def XVRSPIP : XX2Form<60, 169,
    682                       (outs vsrc:$XT), (ins vsrc:$XB),
    683                       "xvrspip $XT, $XB", IIC_VecFP,
    684                       [(set v4f32:$XT, (fceil v4f32:$XB))]>;
    685   def XVRSPIZ : XX2Form<60, 153,
    686                       (outs vsrc:$XT), (ins vsrc:$XB),
    687                       "xvrspiz $XT, $XB", IIC_VecFP,
    688                       [(set v4f32:$XT, (ftrunc v4f32:$XB))]>;
    689 
    690   // Max/Min Instructions
    691   let isCommutable = 1 in {
    692   def XSMAXDP : XX3Form<60, 160,
    693                         (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
    694                         "xsmaxdp $XT, $XA, $XB", IIC_VecFP,
    695                         [(set vsfrc:$XT,
    696                               (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>;
    697   def XSMINDP : XX3Form<60, 168,
    698                         (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
    699                         "xsmindp $XT, $XA, $XB", IIC_VecFP,
    700                         [(set vsfrc:$XT,
    701                               (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>;
    702 
    703   def XVMAXDP : XX3Form<60, 224,
    704                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    705                         "xvmaxdp $XT, $XA, $XB", IIC_VecFP,
    706                         [(set vsrc:$XT,
    707                               (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>;
    708   def XVMINDP : XX3Form<60, 232,
    709                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    710                         "xvmindp $XT, $XA, $XB", IIC_VecFP,
    711                         [(set vsrc:$XT,
    712                               (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>;
    713 
    714   def XVMAXSP : XX3Form<60, 192,
    715                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    716                         "xvmaxsp $XT, $XA, $XB", IIC_VecFP,
    717                         [(set vsrc:$XT,
    718                               (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>;
    719   def XVMINSP : XX3Form<60, 200,
    720                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    721                         "xvminsp $XT, $XA, $XB", IIC_VecFP,
    722                         [(set vsrc:$XT,
    723                               (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>;
    724   } // isCommutable
    725 } // Uses = [RM]
    726 
    727   // Logical Instructions
    728   let isCommutable = 1 in
    729   def XXLAND : XX3Form<60, 130,
    730                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    731                        "xxland $XT, $XA, $XB", IIC_VecGeneral,
    732                        [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>;
    733   def XXLANDC : XX3Form<60, 138,
    734                         (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    735                         "xxlandc $XT, $XA, $XB", IIC_VecGeneral,
    736                         [(set v4i32:$XT, (and v4i32:$XA,
    737                                               (vnot_ppc v4i32:$XB)))]>;
    738   let isCommutable = 1 in {
    739   def XXLNOR : XX3Form<60, 162,
    740                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    741                        "xxlnor $XT, $XA, $XB", IIC_VecGeneral,
    742                        [(set v4i32:$XT, (vnot_ppc (or v4i32:$XA,
    743                                                    v4i32:$XB)))]>;
    744   def XXLOR : XX3Form<60, 146,
    745                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    746                       "xxlor $XT, $XA, $XB", IIC_VecGeneral,
    747                       [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>;
    748   let isCodeGenOnly = 1 in
    749   def XXLORf: XX3Form<60, 146,
    750                       (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB),
    751                       "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>;
    752   def XXLXOR : XX3Form<60, 154,
    753                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    754                        "xxlxor $XT, $XA, $XB", IIC_VecGeneral,
    755                        [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>;
    756   } // isCommutable
    757 
    758   // Permutation Instructions
    759   def XXMRGHW : XX3Form<60, 18,
    760                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    761                        "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>;
    762   def XXMRGLW : XX3Form<60, 50,
    763                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
    764                        "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>;
    765 
    766   def XXPERMDI : XX3Form_2<60, 10,
    767                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM),
    768                        "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, []>;
    769   def XXSEL : XX4Form<60, 3,
    770                       (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC),
    771                       "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>;
    772 
    773   def XXSLDWI : XX3Form_2<60, 2,
    774                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW),
    775                        "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, []>;
    776   def XXSPLTW : XX2Form_2<60, 164,
    777                        (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM),
    778                        "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>;
    779 } // hasSideEffects
    780 
    781 // SELECT_CC_* - Used to implement the SELECT_CC DAG operation.  Expanded after
    782 // instruction selection into a branch sequence.
    783 let usesCustomInserter = 1,    // Expanded after instruction selection.
    784     PPC970_Single = 1 in {
    785 
    786   def SELECT_CC_VSRC: Pseudo<(outs vsrc:$dst),
    787                              (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC),
    788                              "#SELECT_CC_VSRC",
    789                              []>;
    790   def SELECT_VSRC: Pseudo<(outs vsrc:$dst),
    791                           (ins crbitrc:$cond, vsrc:$T, vsrc:$F),
    792                           "#SELECT_VSRC",
    793                           [(set v2f64:$dst,
    794                                 (select i1:$cond, v2f64:$T, v2f64:$F))]>;
    795   def SELECT_CC_VSFRC: Pseudo<(outs f8rc:$dst),
    796                               (ins crrc:$cond, f8rc:$T, f8rc:$F,
    797                                i32imm:$BROPC), "#SELECT_CC_VSFRC",
    798                               []>;
    799   def SELECT_VSFRC: Pseudo<(outs f8rc:$dst),
    800                            (ins crbitrc:$cond, f8rc:$T, f8rc:$F),
    801                            "#SELECT_VSFRC",
    802                            [(set f64:$dst,
    803                                  (select i1:$cond, f64:$T, f64:$F))]>;
    804   def SELECT_CC_VSSRC: Pseudo<(outs f4rc:$dst),
    805                               (ins crrc:$cond, f4rc:$T, f4rc:$F,
    806                                i32imm:$BROPC), "#SELECT_CC_VSSRC",
    807                               []>;
    808   def SELECT_VSSRC: Pseudo<(outs f4rc:$dst),
    809                            (ins crbitrc:$cond, f4rc:$T, f4rc:$F),
    810                            "#SELECT_VSSRC",
    811                            [(set f32:$dst,
    812                                  (select i1:$cond, f32:$T, f32:$F))]>;
    813 } // usesCustomInserter
    814 } // AddedComplexity
    815 
    816 def : InstAlias<"xvmovdp $XT, $XB",
    817                 (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
    818 def : InstAlias<"xvmovsp $XT, $XB",
    819                 (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>;
    820 
    821 def : InstAlias<"xxspltd $XT, $XB, 0",
    822                 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>;
    823 def : InstAlias<"xxspltd $XT, $XB, 1",
    824                 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>;
    825 def : InstAlias<"xxmrghd $XT, $XA, $XB",
    826                 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>;
    827 def : InstAlias<"xxmrgld $XT, $XA, $XB",
    828                 (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>;
    829 def : InstAlias<"xxswapd $XT, $XB",
    830                 (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>;
    831 
    832 let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
    833 
    834 let Predicates = [IsBigEndian] in {
    835 def : Pat<(v2f64 (scalar_to_vector f64:$A)),
    836           (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
    837 
    838 def : Pat<(f64 (extractelt v2f64:$S, 0)),
    839           (f64 (EXTRACT_SUBREG $S, sub_64))>;
    840 def : Pat<(f64 (extractelt v2f64:$S, 1)),
    841           (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
    842 }
    843 
    844 let Predicates = [IsLittleEndian] in {
    845 def : Pat<(v2f64 (scalar_to_vector f64:$A)),
    846           (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
    847                            (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
    848 
    849 def : Pat<(f64 (extractelt v2f64:$S, 0)),
    850           (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
    851 def : Pat<(f64 (extractelt v2f64:$S, 1)),
    852           (f64 (EXTRACT_SUBREG $S, sub_64))>;
    853 }
    854 
    855 // Additional fnmsub patterns: -a*c + b == -(a*c - b)
    856 def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
    857           (XSNMSUBADP $B, $C, $A)>;
    858 def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
    859           (XSNMSUBADP $B, $C, $A)>;
    860 
    861 def : Pat<(fma (fneg v2f64:$A), v2f64:$C, v2f64:$B),
    862           (XVNMSUBADP $B, $C, $A)>;
    863 def : Pat<(fma v2f64:$A, (fneg v2f64:$C), v2f64:$B),
    864           (XVNMSUBADP $B, $C, $A)>;
    865 
    866 def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
    867           (XVNMSUBASP $B, $C, $A)>;
    868 def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
    869           (XVNMSUBASP $B, $C, $A)>;
    870 
    871 def : Pat<(v2f64 (bitconvert v4f32:$A)),
    872           (COPY_TO_REGCLASS $A, VSRC)>;
    873 def : Pat<(v2f64 (bitconvert v4i32:$A)),
    874           (COPY_TO_REGCLASS $A, VSRC)>;
    875 def : Pat<(v2f64 (bitconvert v8i16:$A)),
    876           (COPY_TO_REGCLASS $A, VSRC)>;
    877 def : Pat<(v2f64 (bitconvert v16i8:$A)),
    878           (COPY_TO_REGCLASS $A, VSRC)>;
    879 
    880 def : Pat<(v4f32 (bitconvert v2f64:$A)),
    881           (COPY_TO_REGCLASS $A, VRRC)>;
    882 def : Pat<(v4i32 (bitconvert v2f64:$A)),
    883           (COPY_TO_REGCLASS $A, VRRC)>;
    884 def : Pat<(v8i16 (bitconvert v2f64:$A)),
    885           (COPY_TO_REGCLASS $A, VRRC)>;
    886 def : Pat<(v16i8 (bitconvert v2f64:$A)),
    887           (COPY_TO_REGCLASS $A, VRRC)>;
    888 
    889 def : Pat<(v2i64 (bitconvert v4f32:$A)),
    890           (COPY_TO_REGCLASS $A, VSRC)>;
    891 def : Pat<(v2i64 (bitconvert v4i32:$A)),
    892           (COPY_TO_REGCLASS $A, VSRC)>;
    893 def : Pat<(v2i64 (bitconvert v8i16:$A)),
    894           (COPY_TO_REGCLASS $A, VSRC)>;
    895 def : Pat<(v2i64 (bitconvert v16i8:$A)),
    896           (COPY_TO_REGCLASS $A, VSRC)>;
    897 
    898 def : Pat<(v4f32 (bitconvert v2i64:$A)),
    899           (COPY_TO_REGCLASS $A, VRRC)>;
    900 def : Pat<(v4i32 (bitconvert v2i64:$A)),
    901           (COPY_TO_REGCLASS $A, VRRC)>;
    902 def : Pat<(v8i16 (bitconvert v2i64:$A)),
    903           (COPY_TO_REGCLASS $A, VRRC)>;
    904 def : Pat<(v16i8 (bitconvert v2i64:$A)),
    905           (COPY_TO_REGCLASS $A, VRRC)>;
    906 
    907 def : Pat<(v2f64 (bitconvert v2i64:$A)),
    908           (COPY_TO_REGCLASS $A, VRRC)>;
    909 def : Pat<(v2i64 (bitconvert v2f64:$A)),
    910           (COPY_TO_REGCLASS $A, VRRC)>;
    911 
    912 def : Pat<(v2f64 (bitconvert v1i128:$A)),
    913           (COPY_TO_REGCLASS $A, VRRC)>;
    914 def : Pat<(v1i128 (bitconvert v2f64:$A)),
    915           (COPY_TO_REGCLASS $A, VRRC)>;
    916 
    917 // sign extension patterns
    918 // To extend "in place" from v2i32 to v2i64, we have input data like:
    919 // | undef | i32 | undef | i32 |
    920 // but xvcvsxwdp expects the input in big-Endian format:
    921 // | i32 | undef | i32 | undef |
    922 // so we need to shift everything to the left by one i32 (word) before
    923 // the conversion.
    924 def : Pat<(sext_inreg v2i64:$C, v2i32),
    925           (XVCVDPSXDS (XVCVSXWDP (XXSLDWI $C, $C, 1)))>;
    926 def : Pat<(v2f64 (sint_to_fp (sext_inreg v2i64:$C, v2i32))),
    927           (XVCVSXWDP (XXSLDWI $C, $C, 1))>;
    928 
    929 // Loads.
    930 def : Pat<(v2f64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
    931 def : Pat<(v2i64 (load xoaddr:$src)), (LXVD2X xoaddr:$src)>;
    932 def : Pat<(v4i32 (load xoaddr:$src)), (LXVW4X xoaddr:$src)>;
    933 def : Pat<(v2f64 (PPClxvd2x xoaddr:$src)), (LXVD2X xoaddr:$src)>;
    934 
    935 // Stores.
    936 def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, xoaddr:$dst),
    937           (STXVD2X $rS, xoaddr:$dst)>;
    938 def : Pat<(store v2i64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
    939 def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, xoaddr:$dst),
    940           (STXVW4X $rS, xoaddr:$dst)>;
    941 def : Pat<(PPCstxvd2x v2f64:$rS, xoaddr:$dst), (STXVD2X $rS, xoaddr:$dst)>;
    942 
    943 // Permutes.
    944 def : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>;
    945 def : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>;
    946 def : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>;
    947 def : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>;
    948 
    949 // Selects.
    950 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)),
    951           (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
    952 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)),
    953           (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
    954 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)),
    955           (SELECT_VSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
    956 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)),
    957           (SELECT_VSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
    958 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)),
    959           (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>;
    960 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)),
    961           (SELECT_VSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
    962 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)),
    963           (SELECT_VSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
    964 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)),
    965           (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
    966 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)),
    967           (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
    968 def : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)),
    969           (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
    970 
    971 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
    972           (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
    973 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
    974           (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
    975 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
    976           (SELECT_VSFRC (CRORC  $lhs, $rhs), $tval, $fval)>;
    977 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
    978           (SELECT_VSFRC (CRORC  $rhs, $lhs), $tval, $fval)>;
    979 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
    980           (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>;
    981 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
    982           (SELECT_VSFRC (CRORC  $rhs, $lhs), $tval, $fval)>;
    983 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
    984           (SELECT_VSFRC (CRORC  $lhs, $rhs), $tval, $fval)>;
    985 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
    986           (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
    987 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
    988           (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
    989 def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
    990           (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
    991 
    992 // Divides.
    993 def : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B),
    994           (XVDIVSP $A, $B)>;
    995 def : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B),
    996           (XVDIVDP $A, $B)>;
    997 
    998 // Reciprocal estimate
    999 def : Pat<(int_ppc_vsx_xvresp v4f32:$A),
   1000           (XVRESP $A)>;
   1001 def : Pat<(int_ppc_vsx_xvredp v2f64:$A),
   1002           (XVREDP $A)>;
   1003 
   1004 // Recip. square root estimate
   1005 def : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A),
   1006           (XVRSQRTESP $A)>;
   1007 def : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A),
   1008           (XVRSQRTEDP $A)>;
   1009 
   1010 } // AddedComplexity
   1011 } // HasVSX
   1012 
   1013 // The following VSX instructions were introduced in Power ISA 2.07
   1014 /* FIXME: if the operands are v2i64, these patterns will not match.
   1015    we should define new patterns or otherwise match the same patterns
   1016    when the elements are larger than i32.
   1017 */
   1018 def HasP8Vector : Predicate<"PPCSubTarget->hasP8Vector()">;
   1019 def HasDirectMove : Predicate<"PPCSubTarget->hasDirectMove()">;
   1020 let Predicates = [HasP8Vector] in {
   1021 let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns.
   1022   let isCommutable = 1 in {
   1023     def XXLEQV : XX3Form<60, 186,
   1024                          (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
   1025                          "xxleqv $XT, $XA, $XB", IIC_VecGeneral,
   1026                          [(set v4i32:$XT, (vnot_ppc (xor v4i32:$XA, v4i32:$XB)))]>;
   1027     def XXLNAND : XX3Form<60, 178,
   1028                           (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
   1029                           "xxlnand $XT, $XA, $XB", IIC_VecGeneral,
   1030                           [(set v4i32:$XT, (vnot_ppc (and v4i32:$XA,
   1031                                                     v4i32:$XB)))]>;
   1032   } // isCommutable
   1033 
   1034   def : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B),
   1035             (XXLEQV $A, $B)>;
   1036 
   1037   def XXLORC : XX3Form<60, 170,
   1038                        (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB),
   1039                        "xxlorc $XT, $XA, $XB", IIC_VecGeneral,
   1040                        [(set v4i32:$XT, (or v4i32:$XA, (vnot_ppc v4i32:$XB)))]>;
   1041 
   1042   // VSX scalar loads introduced in ISA 2.07
   1043   let mayLoad = 1 in {
   1044     def LXSSPX : XX1Form<31, 524, (outs vssrc:$XT), (ins memrr:$src),
   1045                          "lxsspx $XT, $src", IIC_LdStLFD,
   1046                          [(set f32:$XT, (load xoaddr:$src))]>;
   1047     def LXSIWAX : XX1Form<31, 76, (outs vsfrc:$XT), (ins memrr:$src),
   1048                           "lxsiwax $XT, $src", IIC_LdStLFD,
   1049                           [(set f64:$XT, (PPClfiwax xoaddr:$src))]>;
   1050     def LXSIWZX : XX1Form<31, 12, (outs vsfrc:$XT), (ins memrr:$src),
   1051                           "lxsiwzx $XT, $src", IIC_LdStLFD,
   1052                           [(set f64:$XT, (PPClfiwzx xoaddr:$src))]>;
   1053   } // mayLoad
   1054 
   1055   // VSX scalar stores introduced in ISA 2.07
   1056   let mayStore = 1 in {
   1057     def STXSSPX : XX1Form<31, 652, (outs), (ins vssrc:$XT, memrr:$dst),
   1058                           "stxsspx $XT, $dst", IIC_LdStSTFD,
   1059                           [(store f32:$XT, xoaddr:$dst)]>;
   1060     def STXSIWX : XX1Form<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst),
   1061                           "stxsiwx $XT, $dst", IIC_LdStSTFD,
   1062                           [(PPCstfiwx f64:$XT, xoaddr:$dst)]>;
   1063   } // mayStore
   1064 
   1065   def : Pat<(f64 (extloadf32 xoaddr:$src)),
   1066             (COPY_TO_REGCLASS (LXSSPX xoaddr:$src), VSFRC)>;
   1067   def : Pat<(f64 (fextend f32:$src)),
   1068             (COPY_TO_REGCLASS $src, VSFRC)>;
   1069 
   1070   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
   1071             (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
   1072   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
   1073             (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
   1074   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
   1075             (SELECT_VSSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
   1076   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
   1077             (SELECT_VSSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
   1078   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
   1079             (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>;
   1080   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
   1081             (SELECT_VSSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
   1082   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
   1083             (SELECT_VSSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
   1084   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
   1085             (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
   1086   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
   1087             (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
   1088   def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
   1089             (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
   1090 
   1091   // VSX Elementary Scalar FP arithmetic (SP)
   1092   let isCommutable = 1 in {
   1093     def XSADDSP : XX3Form<60, 0,
   1094                           (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
   1095                           "xsaddsp $XT, $XA, $XB", IIC_VecFP,
   1096                           [(set f32:$XT, (fadd f32:$XA, f32:$XB))]>;
   1097     def XSMULSP : XX3Form<60, 16,
   1098                           (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
   1099                           "xsmulsp $XT, $XA, $XB", IIC_VecFP,
   1100                           [(set f32:$XT, (fmul f32:$XA, f32:$XB))]>;
   1101   } // isCommutable
   1102 
   1103   def XSDIVSP : XX3Form<60, 24,
   1104                         (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
   1105                         "xsdivsp $XT, $XA, $XB", IIC_FPDivS,
   1106                         [(set f32:$XT, (fdiv f32:$XA, f32:$XB))]>;
   1107   def XSRESP : XX2Form<60, 26,
   1108                         (outs vssrc:$XT), (ins vssrc:$XB),
   1109                         "xsresp $XT, $XB", IIC_VecFP,
   1110                         [(set f32:$XT, (PPCfre f32:$XB))]>;
   1111   def XSSQRTSP : XX2Form<60, 11,
   1112                         (outs vssrc:$XT), (ins vssrc:$XB),
   1113                         "xssqrtsp $XT, $XB", IIC_FPSqrtS,
   1114                         [(set f32:$XT, (fsqrt f32:$XB))]>;
   1115   def XSRSQRTESP : XX2Form<60, 10,
   1116                            (outs vssrc:$XT), (ins vssrc:$XB),
   1117                            "xsrsqrtesp $XT, $XB", IIC_VecFP,
   1118                            [(set f32:$XT, (PPCfrsqrte f32:$XB))]>;
   1119   def XSSUBSP : XX3Form<60, 8,
   1120                         (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB),
   1121                         "xssubsp $XT, $XA, $XB", IIC_VecFP,
   1122                         [(set f32:$XT, (fsub f32:$XA, f32:$XB))]>;
   1123 
   1124   // FMA Instructions
   1125   let BaseName = "XSMADDASP" in {
   1126   let isCommutable = 1 in
   1127   def XSMADDASP : XX3Form<60, 1,
   1128                           (outs vssrc:$XT),
   1129                           (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
   1130                           "xsmaddasp $XT, $XA, $XB", IIC_VecFP,
   1131                           [(set f32:$XT, (fma f32:$XA, f32:$XB, f32:$XTi))]>,
   1132                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
   1133                           AltVSXFMARel;
   1134   let IsVSXFMAAlt = 1 in
   1135   def XSMADDMSP : XX3Form<60, 9,
   1136                           (outs vssrc:$XT),
   1137                           (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
   1138                           "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
   1139                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
   1140                           AltVSXFMARel;
   1141   }
   1142 
   1143   let BaseName = "XSMSUBASP" in {
   1144   let isCommutable = 1 in
   1145   def XSMSUBASP : XX3Form<60, 17,
   1146                           (outs vssrc:$XT),
   1147                           (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
   1148                           "xsmsubasp $XT, $XA, $XB", IIC_VecFP,
   1149                           [(set f32:$XT, (fma f32:$XA, f32:$XB,
   1150                                               (fneg f32:$XTi)))]>,
   1151                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
   1152                           AltVSXFMARel;
   1153   let IsVSXFMAAlt = 1 in
   1154   def XSMSUBMSP : XX3Form<60, 25,
   1155                           (outs vssrc:$XT),
   1156                           (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
   1157                           "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
   1158                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
   1159                           AltVSXFMARel;
   1160   }
   1161 
   1162   let BaseName = "XSNMADDASP" in {
   1163   let isCommutable = 1 in
   1164   def XSNMADDASP : XX3Form<60, 129,
   1165                           (outs vssrc:$XT),
   1166                           (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
   1167                           "xsnmaddasp $XT, $XA, $XB", IIC_VecFP,
   1168                           [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
   1169                                                     f32:$XTi)))]>,
   1170                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
   1171                           AltVSXFMARel;
   1172   let IsVSXFMAAlt = 1 in
   1173   def XSNMADDMSP : XX3Form<60, 137,
   1174                           (outs vssrc:$XT),
   1175                           (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
   1176                           "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>,
   1177                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
   1178                           AltVSXFMARel;
   1179   }
   1180 
   1181   let BaseName = "XSNMSUBASP" in {
   1182   let isCommutable = 1 in
   1183   def XSNMSUBASP : XX3Form<60, 145,
   1184                           (outs vssrc:$XT),
   1185                           (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
   1186                           "xsnmsubasp $XT, $XA, $XB", IIC_VecFP,
   1187                           [(set f32:$XT, (fneg (fma f32:$XA, f32:$XB,
   1188                                                     (fneg f32:$XTi))))]>,
   1189                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
   1190                           AltVSXFMARel;
   1191   let IsVSXFMAAlt = 1 in
   1192   def XSNMSUBMSP : XX3Form<60, 153,
   1193                           (outs vssrc:$XT),
   1194                           (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB),
   1195                           "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>,
   1196                           RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,
   1197                           AltVSXFMARel;
   1198   }
   1199 
   1200   // Single Precision Conversions (FP <-> INT)
   1201   def XSCVSXDSP : XX2Form<60, 312,
   1202                       (outs vssrc:$XT), (ins vsfrc:$XB),
   1203                       "xscvsxdsp $XT, $XB", IIC_VecFP,
   1204                       [(set f32:$XT, (PPCfcfids f64:$XB))]>;
   1205   def XSCVUXDSP : XX2Form<60, 296,
   1206                       (outs vssrc:$XT), (ins vsfrc:$XB),
   1207                       "xscvuxdsp $XT, $XB", IIC_VecFP,
   1208                       [(set f32:$XT, (PPCfcfidus f64:$XB))]>;
   1209 
   1210   // Conversions between vector and scalar single precision
   1211   def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB),
   1212                           "xscvdpspn $XT, $XB", IIC_VecFP, []>;
   1213   def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB),
   1214                           "xscvspdpn $XT, $XB", IIC_VecFP, []>;
   1215 
   1216 } // AddedComplexity = 400
   1217 } // HasP8Vector
   1218 
   1219 let Predicates = [HasDirectMove, HasVSX] in {
   1220   // VSX direct move instructions
   1221   def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT),
   1222                               "mfvsrd $rA, $XT", IIC_VecGeneral,
   1223                               [(set i64:$rA, (PPCmfvsr f64:$XT))]>,
   1224       Requires<[In64BitMode]>;
   1225   def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT),
   1226                                "mfvsrwz $rA, $XT", IIC_VecGeneral,
   1227                                [(set i32:$rA, (PPCmfvsr f64:$XT))]>;
   1228   def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA),
   1229                               "mtvsrd $XT, $rA", IIC_VecGeneral,
   1230                               [(set f64:$XT, (PPCmtvsra i64:$rA))]>,
   1231       Requires<[In64BitMode]>;
   1232   def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA),
   1233                                "mtvsrwa $XT, $rA", IIC_VecGeneral,
   1234                                [(set f64:$XT, (PPCmtvsra i32:$rA))]>;
   1235   def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA),
   1236                                "mtvsrwz $XT, $rA", IIC_VecGeneral,
   1237                                [(set f64:$XT, (PPCmtvsrz i32:$rA))]>;
   1238 } // HasDirectMove, HasVSX
   1239 
   1240 /*  Direct moves of various widths from GPR's into VSR's. Each move lines
   1241     the value up into element 0 (both BE and LE). Namely, entities smaller than
   1242     a doubleword are shifted left and moved for BE. For LE, they're moved, then
   1243     swapped to go into the least significant element of the VSR.
   1244 */
   1245 def MovesToVSR {
   1246   dag BE_BYTE_0 =
   1247     (MTVSRD
   1248       (RLDICR
   1249         (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7));
   1250   dag BE_HALF_0 =
   1251     (MTVSRD
   1252       (RLDICR
   1253         (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15));
   1254   dag BE_WORD_0 =
   1255     (MTVSRD
   1256       (RLDICR
   1257         (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31));
   1258   dag BE_DWORD_0 = (MTVSRD $A);
   1259 
   1260   dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32));
   1261   dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
   1262                                         LE_MTVSRW, sub_64));
   1263   dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2);
   1264   dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
   1265                                          BE_DWORD_0, sub_64));
   1266   dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2);
   1267 }
   1268 
   1269 /*  Patterns for extracting elements out of vectors. Integer elements are
   1270     extracted using direct move operations. Patterns for extracting elements
   1271     whose indices are not available at compile time are also provided with
   1272     various _VARIABLE_ patterns.
   1273     The numbering for the DAG's is for LE, but when used on BE, the correct
   1274     LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13).
   1275 */
   1276 def VectorExtractions {
   1277   // Doubleword extraction
   1278   dag LE_DWORD_0 =
   1279     (MFVSRD
   1280       (EXTRACT_SUBREG
   1281         (XXPERMDI (COPY_TO_REGCLASS $S, VSRC),
   1282                   (COPY_TO_REGCLASS $S, VSRC), 2), sub_64));
   1283   dag LE_DWORD_1 = (MFVSRD
   1284                      (EXTRACT_SUBREG
   1285                        (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
   1286 
   1287   // Word extraction
   1288   dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 2), sub_64));
   1289   dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64));
   1290   dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG
   1291                              (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64));
   1292   dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64));
   1293 
   1294   // Halfword extraction
   1295   dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32));
   1296   dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32));
   1297   dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32));
   1298   dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32));
   1299   dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32));
   1300   dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32));
   1301   dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32));
   1302   dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32));
   1303 
   1304   // Byte extraction
   1305   dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32));
   1306   dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32));
   1307   dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32));
   1308   dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32));
   1309   dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32));
   1310   dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32));
   1311   dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32));
   1312   dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32));
   1313   dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32));
   1314   dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32));
   1315   dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32));
   1316   dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32));
   1317   dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32));
   1318   dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32));
   1319   dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32));
   1320   dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32));
   1321 
   1322   /* Variable element number (BE and LE patterns must be specified separately)
   1323      This is a rather involved process.
   1324 
   1325      Conceptually, this is how the move is accomplished:
   1326      1. Identify which doubleword contains the element
   1327      2. Shift in the VMX register so that the correct doubleword is correctly
   1328         lined up for the MFVSRD
   1329      3. Perform the move so that the element (along with some extra stuff)
   1330         is in the GPR
   1331      4. Right shift within the GPR so that the element is right-justified
   1332 
   1333      Of course, the index is an element number which has a different meaning
   1334      on LE/BE so the patterns have to be specified separately.
   1335 
   1336      Note: The final result will be the element right-justified with high
   1337            order bits being arbitrarily defined (namely, whatever was in the
   1338            vector register to the left of the value originally).
   1339   */
   1340 
   1341   /*  LE variable byte
   1342       Number 1. above:
   1343       - For elements 0-7, we shift left by 8 bytes since they're on the right
   1344       - For elements 8-15, we need not shift (shift left by zero bytes)
   1345       This is accomplished by inverting the bits of the index and AND-ing
   1346       with 0x8 (i.e. clearing all bits of the index and inverting bit 60).
   1347   */
   1348   dag LE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDC8 (LI8 8), $Idx));
   1349 
   1350   //  Number 2. above:
   1351   //  - Now that we set up the shift amount, we shift in the VMX register
   1352   dag LE_VBYTE_PERMUTE = (VPERM $S, $S, LE_VBYTE_PERM_VEC);
   1353 
   1354   //  Number 3. above:
   1355   //  - The doubleword containing our element is moved to a GPR
   1356   dag LE_MV_VBYTE = (MFVSRD
   1357                       (EXTRACT_SUBREG
   1358                         (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)),
   1359                         sub_64));
   1360 
   1361   /*  Number 4. above:
   1362       - Truncate the element number to the range 0-7 (8-15 are symmetrical
   1363         and out of range values are truncated accordingly)
   1364       - Multiply by 8 as we need to shift right by the number of bits, not bytes
   1365       - Shift right in the GPR by the calculated value
   1366   */
   1367   dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60),
   1368                                        sub_32);
   1369   dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT),
   1370                                          sub_32);
   1371 
   1372   /*  LE variable halfword
   1373       Number 1. above:
   1374       - For elements 0-3, we shift left by 8 since they're on the right
   1375       - For elements 4-7, we need not shift (shift left by zero bytes)
   1376       Similarly to the byte pattern, we invert the bits of the index, but we
   1377       AND with 0x4 (i.e. clear all bits of the index and invert bit 61).
   1378       Of course, the shift is still by 8 bytes, so we must multiply by 2.
   1379   */
   1380   dag LE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62));
   1381 
   1382   //  Number 2. above:
   1383   //  - Now that we set up the shift amount, we shift in the VMX register
   1384   dag LE_VHALF_PERMUTE = (VPERM $S, $S, LE_VHALF_PERM_VEC);
   1385 
   1386   //  Number 3. above:
   1387   //  - The doubleword containing our element is moved to a GPR
   1388   dag LE_MV_VHALF = (MFVSRD
   1389                       (EXTRACT_SUBREG
   1390                         (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)),
   1391                         sub_64));
   1392 
   1393   /*  Number 4. above:
   1394       - Truncate the element number to the range 0-3 (4-7 are symmetrical
   1395         and out of range values are truncated accordingly)
   1396       - Multiply by 16 as we need to shift right by the number of bits
   1397       - Shift right in the GPR by the calculated value
   1398   */
   1399   dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59),
   1400                                        sub_32);
   1401   dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT),
   1402                                          sub_32);
   1403 
   1404   /*  LE variable word
   1405       Number 1. above:
   1406       - For elements 0-1, we shift left by 8 since they're on the right
   1407       - For elements 2-3, we need not shift
   1408   */
   1409   dag LE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61));
   1410 
   1411   //  Number 2. above:
   1412   //  - Now that we set up the shift amount, we shift in the VMX register
   1413   dag LE_VWORD_PERMUTE = (VPERM $S, $S, LE_VWORD_PERM_VEC);
   1414 
   1415   //  Number 3. above:
   1416   //  - The doubleword containing our element is moved to a GPR
   1417   dag LE_MV_VWORD = (MFVSRD
   1418                       (EXTRACT_SUBREG
   1419                         (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)),
   1420                         sub_64));
   1421 
   1422   /*  Number 4. above:
   1423       - Truncate the element number to the range 0-1 (2-3 are symmetrical
   1424         and out of range values are truncated accordingly)
   1425       - Multiply by 32 as we need to shift right by the number of bits
   1426       - Shift right in the GPR by the calculated value
   1427   */
   1428   dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58),
   1429                                        sub_32);
   1430   dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT),
   1431                                          sub_32);
   1432 
   1433   /*  LE variable doubleword
   1434       Number 1. above:
   1435       - For element 0, we shift left by 8 since it's on the right
   1436       - For element 1, we need not shift
   1437   */
   1438   dag LE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60));
   1439 
   1440   //  Number 2. above:
   1441   //  - Now that we set up the shift amount, we shift in the VMX register
   1442   dag LE_VDWORD_PERMUTE = (VPERM $S, $S, LE_VDWORD_PERM_VEC);
   1443 
   1444   // Number 3. above:
   1445   //  - The doubleword containing our element is moved to a GPR
   1446   //  - Number 4. is not needed for the doubleword as the value is 64-bits
   1447   dag LE_VARIABLE_DWORD =
   1448         (MFVSRD (EXTRACT_SUBREG
   1449                   (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)),
   1450                   sub_64));
   1451 
   1452   /*  LE variable float
   1453       - Shift the vector to line up the desired element to BE Word 0
   1454       - Convert 32-bit float to a 64-bit single precision float
   1455   */
   1456   dag LE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR (XOR8 (LI8 3), $Idx), 2, 61));
   1457   dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC);
   1458   dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE);
   1459 
   1460   /*  LE variable double
   1461       Same as the LE doubleword except there is no move.
   1462   */
   1463   dag LE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
   1464                                   (COPY_TO_REGCLASS $S, VRRC),
   1465                                   LE_VDWORD_PERM_VEC);
   1466   dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC);
   1467 
   1468   /*  BE variable byte
   1469       The algorithm here is the same as the LE variable byte except:
   1470       - The shift in the VMX register is by 0/8 for opposite element numbers so
   1471         we simply AND the element number with 0x8
   1472       - The order of elements after the move to GPR is reversed, so we invert
   1473         the bits of the index prior to truncating to the range 0-7
   1474   */
   1475   dag BE_VBYTE_PERM_VEC = (LVSL ZERO8, (ANDIo8 $Idx, 8));
   1476   dag BE_VBYTE_PERMUTE = (VPERM $S, $S, BE_VBYTE_PERM_VEC);
   1477   dag BE_MV_VBYTE = (MFVSRD
   1478                       (EXTRACT_SUBREG
   1479                         (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)),
   1480                         sub_64));
   1481   dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60),
   1482                                        sub_32);
   1483   dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT),
   1484                                          sub_32);
   1485 
   1486   /*  BE variable halfword
   1487       The algorithm here is the same as the LE variable halfword except:
   1488       - The shift in the VMX register is by 0/8 for opposite element numbers so
   1489         we simply AND the element number with 0x4 and multiply by 2
   1490       - The order of elements after the move to GPR is reversed, so we invert
   1491         the bits of the index prior to truncating to the range 0-3
   1492   */
   1493   dag BE_VHALF_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 4), 1, 62));
   1494   dag BE_VHALF_PERMUTE = (VPERM $S, $S, BE_VHALF_PERM_VEC);
   1495   dag BE_MV_VHALF = (MFVSRD
   1496                       (EXTRACT_SUBREG
   1497                         (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)),
   1498                         sub_64));
   1499   dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59),
   1500                                        sub_32);
   1501   dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT),
   1502                                          sub_32);
   1503 
   1504   /*  BE variable word
   1505       The algorithm is the same as the LE variable word except:
   1506       - The shift in the VMX register happens for opposite element numbers
   1507       - The order of elements after the move to GPR is reversed, so we invert
   1508         the bits of the index prior to truncating to the range 0-1
   1509   */
   1510   dag BE_VWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 2), 2, 61));
   1511   dag BE_VWORD_PERMUTE = (VPERM $S, $S, BE_VWORD_PERM_VEC);
   1512   dag BE_MV_VWORD = (MFVSRD
   1513                       (EXTRACT_SUBREG
   1514                         (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)),
   1515                         sub_64));
   1516   dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58),
   1517                                        sub_32);
   1518   dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT),
   1519                                          sub_32);
   1520 
   1521   /*  BE variable doubleword
   1522       Same as the LE doubleword except we shift in the VMX register for opposite
   1523       element indices.
   1524   */
   1525   dag BE_VDWORD_PERM_VEC = (LVSL ZERO8, (RLDICR (ANDIo8 $Idx, 1), 3, 60));
   1526   dag BE_VDWORD_PERMUTE = (VPERM $S, $S, BE_VDWORD_PERM_VEC);
   1527   dag BE_VARIABLE_DWORD =
   1528         (MFVSRD (EXTRACT_SUBREG
   1529                   (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)),
   1530                   sub_64));
   1531 
   1532   /*  BE variable float
   1533       - Shift the vector to line up the desired element to BE Word 0
   1534       - Convert 32-bit float to a 64-bit single precision float
   1535   */
   1536   dag BE_VFLOAT_PERM_VEC = (LVSL ZERO8, (RLDICR $Idx, 2, 61));
   1537   dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC);
   1538   dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE);
   1539 
   1540   /* BE variable double
   1541       Same as the BE doubleword except there is no move.
   1542   */
   1543   dag BE_VDOUBLE_PERMUTE = (VPERM (COPY_TO_REGCLASS $S, VRRC),
   1544                                   (COPY_TO_REGCLASS $S, VRRC),
   1545                                   BE_VDWORD_PERM_VEC);
   1546   dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC);
   1547 }
   1548 
   1549 // v4f32 scalar <-> vector conversions (BE)
   1550 let Predicates = [IsBigEndian, HasP8Vector] in {
   1551   def : Pat<(v4f32 (scalar_to_vector f32:$A)),
   1552             (v4f32 (XSCVDPSPN $A))>;
   1553   def : Pat<(f32 (vector_extract v4f32:$S, 0)),
   1554             (f32 (XSCVSPDPN $S))>;
   1555   def : Pat<(f32 (vector_extract v4f32:$S, 1)),
   1556             (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
   1557   def : Pat<(f32 (vector_extract v4f32:$S, 2)),
   1558             (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
   1559   def : Pat<(f32 (vector_extract v4f32:$S, 3)),
   1560             (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
   1561   def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
   1562             (f32 VectorExtractions.BE_VARIABLE_FLOAT)>;
   1563 } // IsBigEndian, HasP8Vector
   1564 
   1565 // Variable index vector_extract for v2f64 does not require P8Vector
   1566 let Predicates = [IsBigEndian, HasVSX] in
   1567   def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
   1568             (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>;
   1569 
   1570 let Predicates = [IsBigEndian, HasDirectMove] in {
   1571   // v16i8 scalar <-> vector conversions (BE)
   1572   def : Pat<(v16i8 (scalar_to_vector i32:$A)),
   1573             (v16i8 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64))>;
   1574   def : Pat<(v8i16 (scalar_to_vector i32:$A)),
   1575             (v8i16 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_HALF_0, sub_64))>;
   1576   def : Pat<(v4i32 (scalar_to_vector i32:$A)),
   1577             (v4i32 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64))>;
   1578   def : Pat<(v2i64 (scalar_to_vector i64:$A)),
   1579             (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>;
   1580   def : Pat<(i32 (vector_extract v16i8:$S, 0)),
   1581             (i32 VectorExtractions.LE_BYTE_15)>;
   1582   def : Pat<(i32 (vector_extract v16i8:$S, 1)),
   1583             (i32 VectorExtractions.LE_BYTE_14)>;
   1584   def : Pat<(i32 (vector_extract v16i8:$S, 2)),
   1585             (i32 VectorExtractions.LE_BYTE_13)>;
   1586   def : Pat<(i32 (vector_extract v16i8:$S, 3)),
   1587             (i32 VectorExtractions.LE_BYTE_12)>;
   1588   def : Pat<(i32 (vector_extract v16i8:$S, 4)),
   1589             (i32 VectorExtractions.LE_BYTE_11)>;
   1590   def : Pat<(i32 (vector_extract v16i8:$S, 5)),
   1591             (i32 VectorExtractions.LE_BYTE_10)>;
   1592   def : Pat<(i32 (vector_extract v16i8:$S, 6)),
   1593             (i32 VectorExtractions.LE_BYTE_9)>;
   1594   def : Pat<(i32 (vector_extract v16i8:$S, 7)),
   1595             (i32 VectorExtractions.LE_BYTE_8)>;
   1596   def : Pat<(i32 (vector_extract v16i8:$S, 8)),
   1597             (i32 VectorExtractions.LE_BYTE_7)>;
   1598   def : Pat<(i32 (vector_extract v16i8:$S, 9)),
   1599             (i32 VectorExtractions.LE_BYTE_6)>;
   1600   def : Pat<(i32 (vector_extract v16i8:$S, 10)),
   1601             (i32 VectorExtractions.LE_BYTE_5)>;
   1602   def : Pat<(i32 (vector_extract v16i8:$S, 11)),
   1603             (i32 VectorExtractions.LE_BYTE_4)>;
   1604   def : Pat<(i32 (vector_extract v16i8:$S, 12)),
   1605             (i32 VectorExtractions.LE_BYTE_3)>;
   1606   def : Pat<(i32 (vector_extract v16i8:$S, 13)),
   1607             (i32 VectorExtractions.LE_BYTE_2)>;
   1608   def : Pat<(i32 (vector_extract v16i8:$S, 14)),
   1609             (i32 VectorExtractions.LE_BYTE_1)>;
   1610   def : Pat<(i32 (vector_extract v16i8:$S, 15)),
   1611             (i32 VectorExtractions.LE_BYTE_0)>;
   1612   def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
   1613             (i32 VectorExtractions.BE_VARIABLE_BYTE)>;
   1614 
   1615   // v8i16 scalar <-> vector conversions (BE)
   1616   def : Pat<(i32 (vector_extract v8i16:$S, 0)),
   1617             (i32 VectorExtractions.LE_HALF_7)>;
   1618   def : Pat<(i32 (vector_extract v8i16:$S, 1)),
   1619             (i32 VectorExtractions.LE_HALF_6)>;
   1620   def : Pat<(i32 (vector_extract v8i16:$S, 2)),
   1621             (i32 VectorExtractions.LE_HALF_5)>;
   1622   def : Pat<(i32 (vector_extract v8i16:$S, 3)),
   1623             (i32 VectorExtractions.LE_HALF_4)>;
   1624   def : Pat<(i32 (vector_extract v8i16:$S, 4)),
   1625             (i32 VectorExtractions.LE_HALF_3)>;
   1626   def : Pat<(i32 (vector_extract v8i16:$S, 5)),
   1627             (i32 VectorExtractions.LE_HALF_2)>;
   1628   def : Pat<(i32 (vector_extract v8i16:$S, 6)),
   1629             (i32 VectorExtractions.LE_HALF_1)>;
   1630   def : Pat<(i32 (vector_extract v8i16:$S, 7)),
   1631             (i32 VectorExtractions.LE_HALF_0)>;
   1632   def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
   1633             (i32 VectorExtractions.BE_VARIABLE_HALF)>;
   1634 
   1635   // v4i32 scalar <-> vector conversions (BE)
   1636   def : Pat<(i32 (vector_extract v4i32:$S, 0)),
   1637             (i32 VectorExtractions.LE_WORD_3)>;
   1638   def : Pat<(i32 (vector_extract v4i32:$S, 1)),
   1639             (i32 VectorExtractions.LE_WORD_2)>;
   1640   def : Pat<(i32 (vector_extract v4i32:$S, 2)),
   1641             (i32 VectorExtractions.LE_WORD_1)>;
   1642   def : Pat<(i32 (vector_extract v4i32:$S, 3)),
   1643             (i32 VectorExtractions.LE_WORD_0)>;
   1644   def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
   1645             (i32 VectorExtractions.BE_VARIABLE_WORD)>;
   1646 
   1647   // v2i64 scalar <-> vector conversions (BE)
   1648   def : Pat<(i64 (vector_extract v2i64:$S, 0)),
   1649             (i64 VectorExtractions.LE_DWORD_1)>;
   1650   def : Pat<(i64 (vector_extract v2i64:$S, 1)),
   1651             (i64 VectorExtractions.LE_DWORD_0)>;
   1652   def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
   1653             (i64 VectorExtractions.BE_VARIABLE_DWORD)>;
   1654 } // IsBigEndian, HasDirectMove
   1655 
   1656 // v4f32 scalar <-> vector conversions (LE)
   1657 let Predicates = [IsLittleEndian, HasP8Vector] in {
   1658   def : Pat<(v4f32 (scalar_to_vector f32:$A)),
   1659             (v4f32 (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1))>;
   1660   def : Pat<(f32 (vector_extract v4f32:$S, 0)),
   1661             (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>;
   1662   def : Pat<(f32 (vector_extract v4f32:$S, 1)),
   1663             (f32 (XSCVSPDPN (XXSLDWI $S, $S, 2)))>;
   1664   def : Pat<(f32 (vector_extract v4f32:$S, 2)),
   1665             (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>;
   1666   def : Pat<(f32 (vector_extract v4f32:$S, 3)),
   1667             (f32 (XSCVSPDPN $S))>;
   1668   def : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)),
   1669             (f32 VectorExtractions.LE_VARIABLE_FLOAT)>;
   1670 } // IsLittleEndian, HasP8Vector
   1671 
   1672 // Variable index vector_extract for v2f64 does not require P8Vector
   1673 let Predicates = [IsLittleEndian, HasVSX] in
   1674   def : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)),
   1675             (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>;
   1676 
   1677 let Predicates = [IsLittleEndian, HasDirectMove] in {
   1678   // v16i8 scalar <-> vector conversions (LE)
   1679   def : Pat<(v16i8 (scalar_to_vector i32:$A)),
   1680             (v16i8 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
   1681   def : Pat<(v8i16 (scalar_to_vector i32:$A)),
   1682             (v8i16 (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC))>;
   1683   def : Pat<(v4i32 (scalar_to_vector i32:$A)),
   1684             (v4i32 MovesToVSR.LE_WORD_0)>;
   1685   def : Pat<(v2i64 (scalar_to_vector i64:$A)),
   1686             (v2i64 MovesToVSR.LE_DWORD_0)>;
   1687   def : Pat<(i32 (vector_extract v16i8:$S, 0)),
   1688             (i32 VectorExtractions.LE_BYTE_0)>;
   1689   def : Pat<(i32 (vector_extract v16i8:$S, 1)),
   1690             (i32 VectorExtractions.LE_BYTE_1)>;
   1691   def : Pat<(i32 (vector_extract v16i8:$S, 2)),
   1692             (i32 VectorExtractions.LE_BYTE_2)>;
   1693   def : Pat<(i32 (vector_extract v16i8:$S, 3)),
   1694             (i32 VectorExtractions.LE_BYTE_3)>;
   1695   def : Pat<(i32 (vector_extract v16i8:$S, 4)),
   1696             (i32 VectorExtractions.LE_BYTE_4)>;
   1697   def : Pat<(i32 (vector_extract v16i8:$S, 5)),
   1698             (i32 VectorExtractions.LE_BYTE_5)>;
   1699   def : Pat<(i32 (vector_extract v16i8:$S, 6)),
   1700             (i32 VectorExtractions.LE_BYTE_6)>;
   1701   def : Pat<(i32 (vector_extract v16i8:$S, 7)),
   1702             (i32 VectorExtractions.LE_BYTE_7)>;
   1703   def : Pat<(i32 (vector_extract v16i8:$S, 8)),
   1704             (i32 VectorExtractions.LE_BYTE_8)>;
   1705   def : Pat<(i32 (vector_extract v16i8:$S, 9)),
   1706             (i32 VectorExtractions.LE_BYTE_9)>;
   1707   def : Pat<(i32 (vector_extract v16i8:$S, 10)),
   1708             (i32 VectorExtractions.LE_BYTE_10)>;
   1709   def : Pat<(i32 (vector_extract v16i8:$S, 11)),
   1710             (i32 VectorExtractions.LE_BYTE_11)>;
   1711   def : Pat<(i32 (vector_extract v16i8:$S, 12)),
   1712             (i32 VectorExtractions.LE_BYTE_12)>;
   1713   def : Pat<(i32 (vector_extract v16i8:$S, 13)),
   1714             (i32 VectorExtractions.LE_BYTE_13)>;
   1715   def : Pat<(i32 (vector_extract v16i8:$S, 14)),
   1716             (i32 VectorExtractions.LE_BYTE_14)>;
   1717   def : Pat<(i32 (vector_extract v16i8:$S, 15)),
   1718             (i32 VectorExtractions.LE_BYTE_15)>;
   1719   def : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)),
   1720             (i32 VectorExtractions.LE_VARIABLE_BYTE)>;
   1721 
   1722   // v8i16 scalar <-> vector conversions (LE)
   1723   def : Pat<(i32 (vector_extract v8i16:$S, 0)),
   1724             (i32 VectorExtractions.LE_HALF_0)>;
   1725   def : Pat<(i32 (vector_extract v8i16:$S, 1)),
   1726             (i32 VectorExtractions.LE_HALF_1)>;
   1727   def : Pat<(i32 (vector_extract v8i16:$S, 2)),
   1728             (i32 VectorExtractions.LE_HALF_2)>;
   1729   def : Pat<(i32 (vector_extract v8i16:$S, 3)),
   1730             (i32 VectorExtractions.LE_HALF_3)>;
   1731   def : Pat<(i32 (vector_extract v8i16:$S, 4)),
   1732             (i32 VectorExtractions.LE_HALF_4)>;
   1733   def : Pat<(i32 (vector_extract v8i16:$S, 5)),
   1734             (i32 VectorExtractions.LE_HALF_5)>;
   1735   def : Pat<(i32 (vector_extract v8i16:$S, 6)),
   1736             (i32 VectorExtractions.LE_HALF_6)>;
   1737   def : Pat<(i32 (vector_extract v8i16:$S, 7)),
   1738             (i32 VectorExtractions.LE_HALF_7)>;
   1739   def : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)),
   1740             (i32 VectorExtractions.LE_VARIABLE_HALF)>;
   1741 
   1742   // v4i32 scalar <-> vector conversions (LE)
   1743   def : Pat<(i32 (vector_extract v4i32:$S, 0)),
   1744             (i32 VectorExtractions.LE_WORD_0)>;
   1745   def : Pat<(i32 (vector_extract v4i32:$S, 1)),
   1746             (i32 VectorExtractions.LE_WORD_1)>;
   1747   def : Pat<(i32 (vector_extract v4i32:$S, 2)),
   1748             (i32 VectorExtractions.LE_WORD_2)>;
   1749   def : Pat<(i32 (vector_extract v4i32:$S, 3)),
   1750             (i32 VectorExtractions.LE_WORD_3)>;
   1751   def : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)),
   1752             (i32 VectorExtractions.LE_VARIABLE_WORD)>;
   1753 
   1754   // v2i64 scalar <-> vector conversions (LE)
   1755   def : Pat<(i64 (vector_extract v2i64:$S, 0)),
   1756             (i64 VectorExtractions.LE_DWORD_0)>;
   1757   def : Pat<(i64 (vector_extract v2i64:$S, 1)),
   1758             (i64 VectorExtractions.LE_DWORD_1)>;
   1759   def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)),
   1760             (i64 VectorExtractions.LE_VARIABLE_DWORD)>;
   1761 } // IsLittleEndian, HasDirectMove
   1762 
   1763 let Predicates = [HasDirectMove, HasVSX] in {
   1764 // bitconvert f32 -> i32
   1765 // (convert to 32-bit fp single, shift right 1 word, move to GPR)
   1766 def : Pat<(i32 (bitconvert f32:$S)),
   1767           (i32 (MFVSRWZ (EXTRACT_SUBREG
   1768                           (XXSLDWI (XSCVDPSPN $S),(XSCVDPSPN $S), 3),
   1769                           sub_64)))>;
   1770 // bitconvert i32 -> f32
   1771 // (move to FPR, shift left 1 word, convert to 64-bit fp single)
   1772 def : Pat<(f32 (bitconvert i32:$A)),
   1773           (f32 (XSCVSPDPN
   1774                  (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>;
   1775 
   1776 // bitconvert f64 -> i64
   1777 // (move to GPR, nothing else needed)
   1778 def : Pat<(i64 (bitconvert f64:$S)),
   1779           (i64 (MFVSRD $S))>;
   1780 
   1781 // bitconvert i64 -> f64
   1782 // (move to FPR, nothing else needed)
   1783 def : Pat<(f64 (bitconvert i64:$S)),
   1784           (f64 (MTVSRD $S))>;
   1785 }
   1786