1*81ad6265SDimitry Andric//===-- PPCInstrP10.td - Power10 Instruction Set -----------*- tablegen -*-===// 2*81ad6265SDimitry Andric// 3*81ad6265SDimitry Andric// The LLVM Compiler Infrastructure 4*81ad6265SDimitry Andric// 5*81ad6265SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 6*81ad6265SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 7*81ad6265SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 8*81ad6265SDimitry Andric// 9*81ad6265SDimitry Andric//===----------------------------------------------------------------------===// 10*81ad6265SDimitry Andric// 11*81ad6265SDimitry Andric// This file describes the instructions introduced for the Power10 CPU. 12*81ad6265SDimitry Andric// 13*81ad6265SDimitry Andric//===----------------------------------------------------------------------===// 14*81ad6265SDimitry Andric 15*81ad6265SDimitry Andric//===----------------------------------------------------------------------===// 16*81ad6265SDimitry Andric// Naming convention for future instruction formats 17*81ad6265SDimitry Andric// 18*81ad6265SDimitry Andric// <INSTR_FORM>{_<OP_TYPE><OP_LENGTH>}+ 19*81ad6265SDimitry Andric// 20*81ad6265SDimitry Andric// Where: 21*81ad6265SDimitry Andric// <INSTR_FORM> - name of instruction format as per the ISA 22*81ad6265SDimitry Andric// (X-Form, VX-Form, etc.) 23*81ad6265SDimitry Andric// <OP_TYPE> - operand type 24*81ad6265SDimitry Andric// * FRT/RT/VT/XT/BT - target register 25*81ad6265SDimitry Andric// (FPR, GPR, VR, VSR, CR-bit respectively) 26*81ad6265SDimitry Andric// In some situations, the 'T' is replaced by 27*81ad6265SDimitry Andric// 'D' when describing the target register. 28*81ad6265SDimitry Andric// * [FR|R|V|X|B][A-Z] - register source (i.e. FRA, RA, XB, etc.) 29*81ad6265SDimitry Andric// * IMM - immediate (where signedness matters, 30*81ad6265SDimitry Andric// this is SI/UI for signed/unsigned) 31*81ad6265SDimitry Andric// * [R|X|FR]Tp - register pair target (i.e. FRTp, RTp) 32*81ad6265SDimitry Andric// * R - PC-Relative bit 33*81ad6265SDimitry Andric// (denotes that the address is computed pc-relative) 34*81ad6265SDimitry Andric// * VRM - Masked Registers 35*81ad6265SDimitry Andric// * AT - target accumulator 36*81ad6265SDimitry Andric// * N - the Nth bit in a VSR 37*81ad6265SDimitry Andric// * Additional 1-bit operands may be required for certain 38*81ad6265SDimitry Andric// instruction formats such as: MC, P, MP 39*81ad6265SDimitry Andric// * X / Y / P - mask values. In the instruction encoding, this is 40*81ad6265SDimitry Andric// represented as XMSK, YMSK and PMSK. 41*81ad6265SDimitry Andric// * MEM - indicates if the instruction format requires any memory 42*81ad6265SDimitry Andric// accesses. This does not have <OP_LENGTH> attached to it. 43*81ad6265SDimitry Andric// <OP_LENGTH> - the length of each operand in bits. 44*81ad6265SDimitry Andric// For operands that are 1 bit, the '1' is omitted from the name. 45*81ad6265SDimitry Andric// 46*81ad6265SDimitry Andric// Example: 8RR_XX4Form_IMM8_XTAB6 47*81ad6265SDimitry Andric// 8RR_XX4Form is the instruction format. 48*81ad6265SDimitry Andric// The operand is an 8-bit immediate (IMM), the destination (XT) 49*81ad6265SDimitry Andric// and sources (XA, XB) that are all 6-bits. The destination and 50*81ad6265SDimitry Andric// source registers are combined if they are of the same length. 51*81ad6265SDimitry Andric// Moreover, the order of operands reflects the order of operands 52*81ad6265SDimitry Andric// in the encoding. 53*81ad6265SDimitry Andric 54*81ad6265SDimitry Andric//-------------------------- Predicate definitions ---------------------------// 55*81ad6265SDimitry Andricdef IsPPC32 : Predicate<"!Subtarget->isPPC64()">; 56*81ad6265SDimitry Andric 57*81ad6265SDimitry Andric 58*81ad6265SDimitry Andric//===----------------------------------------------------------------------===// 59*81ad6265SDimitry Andric// PowerPC ISA 3.1 specific type constraints. 60*81ad6265SDimitry Andric// 61*81ad6265SDimitry Andric 62*81ad6265SDimitry Andricdef SDT_PPCSplat32 : SDTypeProfile<1, 3, [ SDTCisVT<0, v2i64>, 63*81ad6265SDimitry Andric SDTCisVec<1>, SDTCisInt<2>, SDTCisInt<3> 64*81ad6265SDimitry Andric]>; 65*81ad6265SDimitry Andricdef SDT_PPCAccBuild : SDTypeProfile<1, 4, [ 66*81ad6265SDimitry Andric SDTCisVT<0, v512i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32>, 67*81ad6265SDimitry Andric SDTCisVT<3, v4i32>, SDTCisVT<4, v4i32> 68*81ad6265SDimitry Andric]>; 69*81ad6265SDimitry Andricdef SDT_PPCPairBuild : SDTypeProfile<1, 2, [ 70*81ad6265SDimitry Andric SDTCisVT<0, v256i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32> 71*81ad6265SDimitry Andric]>; 72*81ad6265SDimitry Andricdef SDT_PPCAccExtractVsx : SDTypeProfile<1, 2, [ 73*81ad6265SDimitry Andric SDTCisVT<0, v4i32>, SDTCisVT<1, v512i1>, SDTCisPtrTy<2> 74*81ad6265SDimitry Andric]>; 75*81ad6265SDimitry Andricdef SDT_PPCPairExtractVsx : SDTypeProfile<1, 2, [ 76*81ad6265SDimitry Andric SDTCisVT<0, v4i32>, SDTCisVT<1, v256i1>, SDTCisPtrTy<2> 77*81ad6265SDimitry Andric]>; 78*81ad6265SDimitry Andricdef SDT_PPCxxmfacc : SDTypeProfile<1, 1, [ 79*81ad6265SDimitry Andric SDTCisVT<0, v512i1>, SDTCisVT<1, v512i1> 80*81ad6265SDimitry Andric]>; 81*81ad6265SDimitry Andric 82*81ad6265SDimitry Andric//===----------------------------------------------------------------------===// 83*81ad6265SDimitry Andric// ISA 3.1 specific PPCISD nodes. 84*81ad6265SDimitry Andric// 85*81ad6265SDimitry Andric 86*81ad6265SDimitry Andricdef PPCxxsplti32dx : SDNode<"PPCISD::XXSPLTI32DX", SDT_PPCSplat32, []>; 87*81ad6265SDimitry Andricdef PPCAccBuild : SDNode<"PPCISD::ACC_BUILD", SDT_PPCAccBuild, []>; 88*81ad6265SDimitry Andricdef PPCPairBuild : SDNode<"PPCISD::PAIR_BUILD", SDT_PPCPairBuild, []>; 89*81ad6265SDimitry Andricdef PPCAccExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCAccExtractVsx, 90*81ad6265SDimitry Andric []>; 91*81ad6265SDimitry Andricdef PPCPairExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCPairExtractVsx, 92*81ad6265SDimitry Andric []>; 93*81ad6265SDimitry Andricdef PPCxxmfacc : SDNode<"PPCISD::XXMFACC", SDT_PPCxxmfacc, []>; 94*81ad6265SDimitry Andric 95*81ad6265SDimitry Andric//===----------------------------------------------------------------------===// 96*81ad6265SDimitry Andric 97*81ad6265SDimitry Andric// PC Relative flag (for instructions that use the address of the prefix for 98*81ad6265SDimitry Andric// address computations). 99*81ad6265SDimitry Andricclass isPCRel { bit PCRel = 1; } 100*81ad6265SDimitry Andric 101*81ad6265SDimitry Andric// PowerPC specific type constraints. 102*81ad6265SDimitry Andricdef SDT_PPCLXVRZX : SDTypeProfile<1, 2, [ 103*81ad6265SDimitry Andric SDTCisVT<0, v1i128>, SDTCisPtrTy<1>, SDTCisPtrTy<2> 104*81ad6265SDimitry Andric]>; 105*81ad6265SDimitry Andric 106*81ad6265SDimitry Andric// PPC Specific DAG Nodes. 107*81ad6265SDimitry Andricdef PPClxvrzx : SDNode<"PPCISD::LXVRZX", SDT_PPCLXVRZX, 108*81ad6265SDimitry Andric [SDNPHasChain, SDNPMayLoad]>; 109*81ad6265SDimitry Andric 110*81ad6265SDimitry Andric// Top-level class for prefixed instructions. 111*81ad6265SDimitry Andricclass PI<bits<6> pref, bits<6> opcode, dag OOL, dag IOL, string asmstr, 112*81ad6265SDimitry Andric InstrItinClass itin> : Instruction { 113*81ad6265SDimitry Andric field bits<64> Inst; 114*81ad6265SDimitry Andric field bits<64> SoftFail = 0; 115*81ad6265SDimitry Andric bit PCRel = 0; // Default value, set by isPCRel. 116*81ad6265SDimitry Andric let Size = 8; 117*81ad6265SDimitry Andric 118*81ad6265SDimitry Andric let Namespace = "PPC"; 119*81ad6265SDimitry Andric let OutOperandList = OOL; 120*81ad6265SDimitry Andric let InOperandList = IOL; 121*81ad6265SDimitry Andric let AsmString = asmstr; 122*81ad6265SDimitry Andric let Itinerary = itin; 123*81ad6265SDimitry Andric let Inst{0-5} = pref; 124*81ad6265SDimitry Andric let Inst{32-37} = opcode; 125*81ad6265SDimitry Andric 126*81ad6265SDimitry Andric bits<1> PPC970_First = 0; 127*81ad6265SDimitry Andric bits<1> PPC970_Single = 0; 128*81ad6265SDimitry Andric bits<1> PPC970_Cracked = 0; 129*81ad6265SDimitry Andric bits<3> PPC970_Unit = 0; 130*81ad6265SDimitry Andric 131*81ad6265SDimitry Andric /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to 132*81ad6265SDimitry Andric /// these must be reflected there! See comments there for what these are. 133*81ad6265SDimitry Andric let TSFlags{0} = PPC970_First; 134*81ad6265SDimitry Andric let TSFlags{1} = PPC970_Single; 135*81ad6265SDimitry Andric let TSFlags{2} = PPC970_Cracked; 136*81ad6265SDimitry Andric let TSFlags{5-3} = PPC970_Unit; 137*81ad6265SDimitry Andric 138*81ad6265SDimitry Andric bits<1> Prefixed = 1; // This is a prefixed instruction. 139*81ad6265SDimitry Andric let TSFlags{7} = Prefixed; 140*81ad6265SDimitry Andric 141*81ad6265SDimitry Andric // For cases where multiple instruction definitions really represent the 142*81ad6265SDimitry Andric // same underlying instruction but with one definition for 64-bit arguments 143*81ad6265SDimitry Andric // and one for 32-bit arguments, this bit breaks the degeneracy between 144*81ad6265SDimitry Andric // the two forms and allows TableGen to generate mapping tables. 145*81ad6265SDimitry Andric bit Interpretation64Bit = 0; 146*81ad6265SDimitry Andric 147*81ad6265SDimitry Andric // Fields used for relation models. 148*81ad6265SDimitry Andric string BaseName = ""; 149*81ad6265SDimitry Andric} 150*81ad6265SDimitry Andric 151*81ad6265SDimitry Andric// VX-Form: [ PO VT R VB RC XO ] 152*81ad6265SDimitry Andricclass VXForm_VTB5_RC<bits<10> xo, bits<5> R, dag OOL, dag IOL, string asmstr, 153*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 154*81ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 155*81ad6265SDimitry Andric bits<5> VT; 156*81ad6265SDimitry Andric bits<5> VB; 157*81ad6265SDimitry Andric bit RC = 0; 158*81ad6265SDimitry Andric 159*81ad6265SDimitry Andric let Pattern = pattern; 160*81ad6265SDimitry Andric 161*81ad6265SDimitry Andric let Inst{6-10} = VT; 162*81ad6265SDimitry Andric let Inst{11-15} = R; 163*81ad6265SDimitry Andric let Inst{16-20} = VB; 164*81ad6265SDimitry Andric let Inst{21} = RC; 165*81ad6265SDimitry Andric let Inst{22-31} = xo; 166*81ad6265SDimitry Andric} 167*81ad6265SDimitry Andric 168*81ad6265SDimitry Andric// Multiclass definition to account for record and non-record form 169*81ad6265SDimitry Andric// instructions of VXRForm. 170*81ad6265SDimitry Andricmulticlass VXForm_VTB5_RCr<bits<10> xo, bits<5> R, dag OOL, dag IOL, 171*81ad6265SDimitry Andric string asmbase, string asmstr, 172*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> { 173*81ad6265SDimitry Andric let BaseName = asmbase in { 174*81ad6265SDimitry Andric def NAME : VXForm_VTB5_RC<xo, R, OOL, IOL, 175*81ad6265SDimitry Andric !strconcat(asmbase, !strconcat(" ", asmstr)), 176*81ad6265SDimitry Andric itin, pattern>, RecFormRel; 177*81ad6265SDimitry Andric let Defs = [CR6] in 178*81ad6265SDimitry Andric def _rec : VXForm_VTB5_RC<xo, R, OOL, IOL, 179*81ad6265SDimitry Andric !strconcat(asmbase, !strconcat(". ", asmstr)), 180*81ad6265SDimitry Andric itin, []>, isRecordForm, RecFormRel; 181*81ad6265SDimitry Andric } 182*81ad6265SDimitry Andric} 183*81ad6265SDimitry Andric 184*81ad6265SDimitry Andricclass MLS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 185*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 186*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 187*81ad6265SDimitry Andric bits<5> FRS; 188*81ad6265SDimitry Andric bits<39> D_RA; 189*81ad6265SDimitry Andric 190*81ad6265SDimitry Andric let Pattern = pattern; 191*81ad6265SDimitry Andric 192*81ad6265SDimitry Andric // The prefix. 193*81ad6265SDimitry Andric let Inst{6-7} = 2; 194*81ad6265SDimitry Andric let Inst{8-10} = 0; 195*81ad6265SDimitry Andric let Inst{11} = PCRel; 196*81ad6265SDimitry Andric let Inst{12-13} = 0; 197*81ad6265SDimitry Andric let Inst{14-31} = D_RA{33-16}; // d0 198*81ad6265SDimitry Andric 199*81ad6265SDimitry Andric // The instruction. 200*81ad6265SDimitry Andric let Inst{38-42} = FRS{4-0}; 201*81ad6265SDimitry Andric let Inst{43-47} = D_RA{38-34}; // RA 202*81ad6265SDimitry Andric let Inst{48-63} = D_RA{15-0}; // d1 203*81ad6265SDimitry Andric} 204*81ad6265SDimitry Andric 205*81ad6265SDimitry Andricclass MLS_DForm_R_SI34_RTA5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 206*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 207*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 208*81ad6265SDimitry Andric bits<5> RT; 209*81ad6265SDimitry Andric bits<5> RA; 210*81ad6265SDimitry Andric bits<34> SI; 211*81ad6265SDimitry Andric 212*81ad6265SDimitry Andric let Pattern = pattern; 213*81ad6265SDimitry Andric 214*81ad6265SDimitry Andric // The prefix. 215*81ad6265SDimitry Andric let Inst{6-7} = 2; 216*81ad6265SDimitry Andric let Inst{8-10} = 0; 217*81ad6265SDimitry Andric let Inst{11} = PCRel; 218*81ad6265SDimitry Andric let Inst{12-13} = 0; 219*81ad6265SDimitry Andric let Inst{14-31} = SI{33-16}; 220*81ad6265SDimitry Andric 221*81ad6265SDimitry Andric // The instruction. 222*81ad6265SDimitry Andric let Inst{38-42} = RT; 223*81ad6265SDimitry Andric let Inst{43-47} = RA; 224*81ad6265SDimitry Andric let Inst{48-63} = SI{15-0}; 225*81ad6265SDimitry Andric} 226*81ad6265SDimitry Andric 227*81ad6265SDimitry Andricclass MLS_DForm_SI34_RT5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 228*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 229*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 230*81ad6265SDimitry Andric bits<5> RT; 231*81ad6265SDimitry Andric bits<34> SI; 232*81ad6265SDimitry Andric 233*81ad6265SDimitry Andric let Pattern = pattern; 234*81ad6265SDimitry Andric 235*81ad6265SDimitry Andric // The prefix. 236*81ad6265SDimitry Andric let Inst{6-7} = 2; 237*81ad6265SDimitry Andric let Inst{8-10} = 0; 238*81ad6265SDimitry Andric let Inst{11} = 0; 239*81ad6265SDimitry Andric let Inst{12-13} = 0; 240*81ad6265SDimitry Andric let Inst{14-31} = SI{33-16}; 241*81ad6265SDimitry Andric 242*81ad6265SDimitry Andric // The instruction. 243*81ad6265SDimitry Andric let Inst{38-42} = RT; 244*81ad6265SDimitry Andric let Inst{43-47} = 0; 245*81ad6265SDimitry Andric let Inst{48-63} = SI{15-0}; 246*81ad6265SDimitry Andric} 247*81ad6265SDimitry Andric 248*81ad6265SDimitry Andricmulticlass MLS_DForm_R_SI34_RTA5_p<bits<6> opcode, dag OOL, dag IOL, 249*81ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 250*81ad6265SDimitry Andric InstrItinClass itin> { 251*81ad6265SDimitry Andric def NAME : MLS_DForm_R_SI34_RTA5<opcode, OOL, IOL, 252*81ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 253*81ad6265SDimitry Andric def pc : MLS_DForm_R_SI34_RTA5<opcode, OOL, PCRel_IOL, 254*81ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, isPCRel; 255*81ad6265SDimitry Andric} 256*81ad6265SDimitry Andric 257*81ad6265SDimitry Andricclass 8LS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 258*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 259*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 260*81ad6265SDimitry Andric bits<5> RT; 261*81ad6265SDimitry Andric bits<39> D_RA; 262*81ad6265SDimitry Andric 263*81ad6265SDimitry Andric let Pattern = pattern; 264*81ad6265SDimitry Andric 265*81ad6265SDimitry Andric // The prefix. 266*81ad6265SDimitry Andric let Inst{6-10} = 0; 267*81ad6265SDimitry Andric let Inst{11} = PCRel; 268*81ad6265SDimitry Andric let Inst{12-13} = 0; 269*81ad6265SDimitry Andric let Inst{14-31} = D_RA{33-16}; // d0 270*81ad6265SDimitry Andric 271*81ad6265SDimitry Andric // The instruction. 272*81ad6265SDimitry Andric let Inst{38-42} = RT{4-0}; 273*81ad6265SDimitry Andric let Inst{43-47} = D_RA{38-34}; // RA 274*81ad6265SDimitry Andric let Inst{48-63} = D_RA{15-0}; // d1 275*81ad6265SDimitry Andric} 276*81ad6265SDimitry Andric 277*81ad6265SDimitry Andric// 8LS:D-Form: [ 1 0 0 // R // d0 278*81ad6265SDimitry Andric// PO TX T RA d1 ] 279*81ad6265SDimitry Andricclass 8LS_DForm_R_SI34_XT6_RA5_MEM<bits<5> opcode, dag OOL, dag IOL, 280*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 281*81ad6265SDimitry Andric list<dag> pattern> 282*81ad6265SDimitry Andric : PI<1, { opcode, ? }, OOL, IOL, asmstr, itin> { 283*81ad6265SDimitry Andric bits<6> XT; 284*81ad6265SDimitry Andric bits<39> D_RA; 285*81ad6265SDimitry Andric 286*81ad6265SDimitry Andric let Pattern = pattern; 287*81ad6265SDimitry Andric 288*81ad6265SDimitry Andric // The prefix. 289*81ad6265SDimitry Andric let Inst{6-7} = 0; 290*81ad6265SDimitry Andric let Inst{8} = 0; 291*81ad6265SDimitry Andric let Inst{9-10} = 0; // reserved 292*81ad6265SDimitry Andric let Inst{11} = PCRel; 293*81ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 294*81ad6265SDimitry Andric let Inst{14-31} = D_RA{33-16}; // d0 295*81ad6265SDimitry Andric 296*81ad6265SDimitry Andric // The instruction. 297*81ad6265SDimitry Andric let Inst{37} = XT{5}; 298*81ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 299*81ad6265SDimitry Andric let Inst{43-47} = D_RA{38-34}; // RA 300*81ad6265SDimitry Andric let Inst{48-63} = D_RA{15-0}; // d1 301*81ad6265SDimitry Andric} 302*81ad6265SDimitry Andric 303*81ad6265SDimitry Andric// X-Form: [PO T IMM VRB XO TX] 304*81ad6265SDimitry Andricclass XForm_XT6_IMM5_VB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 305*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 306*81ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 307*81ad6265SDimitry Andric bits<6> XT; 308*81ad6265SDimitry Andric bits<5> VRB; 309*81ad6265SDimitry Andric bits<5> IMM; 310*81ad6265SDimitry Andric 311*81ad6265SDimitry Andric let Pattern = pattern; 312*81ad6265SDimitry Andric let Inst{6-10} = XT{4-0}; 313*81ad6265SDimitry Andric let Inst{11-15} = IMM; 314*81ad6265SDimitry Andric let Inst{16-20} = VRB; 315*81ad6265SDimitry Andric let Inst{21-30} = xo; 316*81ad6265SDimitry Andric let Inst{31} = XT{5}; 317*81ad6265SDimitry Andric} 318*81ad6265SDimitry Andric 319*81ad6265SDimitry Andricclass 8RR_XX4Form_IMM8_XTAB6<bits<6> opcode, bits<2> xo, 320*81ad6265SDimitry Andric dag OOL, dag IOL, string asmstr, 321*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 322*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 323*81ad6265SDimitry Andric bits<6> XT; 324*81ad6265SDimitry Andric bits<6> XA; 325*81ad6265SDimitry Andric bits<6> XB; 326*81ad6265SDimitry Andric bits<6> XC; 327*81ad6265SDimitry Andric bits<8> IMM; 328*81ad6265SDimitry Andric 329*81ad6265SDimitry Andric let Pattern = pattern; 330*81ad6265SDimitry Andric 331*81ad6265SDimitry Andric // The prefix. 332*81ad6265SDimitry Andric let Inst{6-7} = 1; 333*81ad6265SDimitry Andric let Inst{8} = 0; 334*81ad6265SDimitry Andric let Inst{9-11} = 0; 335*81ad6265SDimitry Andric let Inst{12-13} = 0; 336*81ad6265SDimitry Andric let Inst{14-23} = 0; 337*81ad6265SDimitry Andric let Inst{24-31} = IMM; 338*81ad6265SDimitry Andric 339*81ad6265SDimitry Andric // The instruction. 340*81ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 341*81ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 342*81ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 343*81ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 344*81ad6265SDimitry Andric let Inst{58-59} = xo; 345*81ad6265SDimitry Andric let Inst{60} = XC{5}; 346*81ad6265SDimitry Andric let Inst{61} = XA{5}; 347*81ad6265SDimitry Andric let Inst{62} = XB{5}; 348*81ad6265SDimitry Andric let Inst{63} = XT{5}; 349*81ad6265SDimitry Andric} 350*81ad6265SDimitry Andric 351*81ad6265SDimitry Andricclass VXForm_RD5_N3_VB5<bits<11> xo, dag OOL, dag IOL, string asmstr, 352*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 353*81ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 354*81ad6265SDimitry Andric bits<5> RD; 355*81ad6265SDimitry Andric bits<5> VB; 356*81ad6265SDimitry Andric bits<3> N; 357*81ad6265SDimitry Andric 358*81ad6265SDimitry Andric let Pattern = pattern; 359*81ad6265SDimitry Andric 360*81ad6265SDimitry Andric let Inst{6-10} = RD; 361*81ad6265SDimitry Andric let Inst{11-12} = 0; 362*81ad6265SDimitry Andric let Inst{13-15} = N; 363*81ad6265SDimitry Andric let Inst{16-20} = VB; 364*81ad6265SDimitry Andric let Inst{21-31} = xo; 365*81ad6265SDimitry Andric} 366*81ad6265SDimitry Andric 367*81ad6265SDimitry Andric 368*81ad6265SDimitry Andric// VX-Form: [PO VRT RA VRB XO]. 369*81ad6265SDimitry Andric// Destructive (insert) forms are suffixed with _ins. 370*81ad6265SDimitry Andricclass VXForm_VTB5_RA5_ins<bits<11> xo, string opc, list<dag> pattern> 371*81ad6265SDimitry Andric : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vDi, gprc:$rA, vrrc:$vB), 372*81ad6265SDimitry Andric !strconcat(opc, " $vD, $rA, $vB"), IIC_VecGeneral, pattern>, 373*81ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 374*81ad6265SDimitry Andric 375*81ad6265SDimitry Andric// VX-Form: [PO VRT RA RB XO]. 376*81ad6265SDimitry Andric// Destructive (insert) forms are suffixed with _ins. 377*81ad6265SDimitry Andricclass VXForm_VRT5_RAB5_ins<bits<11> xo, string opc, list<dag> pattern> 378*81ad6265SDimitry Andric : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vDi, gprc:$rA, gprc:$rB), 379*81ad6265SDimitry Andric !strconcat(opc, " $vD, $rA, $rB"), IIC_VecGeneral, pattern>, 380*81ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 381*81ad6265SDimitry Andric 382*81ad6265SDimitry Andric// VX-Form: [ PO BF // VRA VRB XO ] 383*81ad6265SDimitry Andricclass VXForm_BF3_VAB5<bits<11> xo, dag OOL, dag IOL, string asmstr, 384*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 385*81ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 386*81ad6265SDimitry Andric bits<3> BF; 387*81ad6265SDimitry Andric bits<5> VA; 388*81ad6265SDimitry Andric bits<5> VB; 389*81ad6265SDimitry Andric 390*81ad6265SDimitry Andric let Pattern = pattern; 391*81ad6265SDimitry Andric 392*81ad6265SDimitry Andric let Inst{6-8} = BF; 393*81ad6265SDimitry Andric let Inst{9-10} = 0; 394*81ad6265SDimitry Andric let Inst{11-15} = VA; 395*81ad6265SDimitry Andric let Inst{16-20} = VB; 396*81ad6265SDimitry Andric let Inst{21-31} = xo; 397*81ad6265SDimitry Andric} 398*81ad6265SDimitry Andric 399*81ad6265SDimitry Andric// VN-Form: [PO VRT VRA VRB PS SD XO] 400*81ad6265SDimitry Andric// SD is "Shift Direction" 401*81ad6265SDimitry Andricclass VNForm_VTAB5_SD3<bits<6> xo, bits<2> ps, dag OOL, dag IOL, string asmstr, 402*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 403*81ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 404*81ad6265SDimitry Andric bits<5> VRT; 405*81ad6265SDimitry Andric bits<5> VRA; 406*81ad6265SDimitry Andric bits<5> VRB; 407*81ad6265SDimitry Andric bits<3> SD; 408*81ad6265SDimitry Andric 409*81ad6265SDimitry Andric let Pattern = pattern; 410*81ad6265SDimitry Andric 411*81ad6265SDimitry Andric let Inst{6-10} = VRT; 412*81ad6265SDimitry Andric let Inst{11-15} = VRA; 413*81ad6265SDimitry Andric let Inst{16-20} = VRB; 414*81ad6265SDimitry Andric let Inst{21-22} = ps; 415*81ad6265SDimitry Andric let Inst{23-25} = SD; 416*81ad6265SDimitry Andric let Inst{26-31} = xo; 417*81ad6265SDimitry Andric} 418*81ad6265SDimitry Andric 419*81ad6265SDimitry Andricclass VXForm_RD5_MP_VB5<bits<11> xo, bits<4> eo, dag OOL, dag IOL, 420*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 421*81ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 422*81ad6265SDimitry Andric bits<5> RD; 423*81ad6265SDimitry Andric bits<5> VB; 424*81ad6265SDimitry Andric bit MP; 425*81ad6265SDimitry Andric 426*81ad6265SDimitry Andric let Pattern = pattern; 427*81ad6265SDimitry Andric 428*81ad6265SDimitry Andric let Inst{6-10} = RD; 429*81ad6265SDimitry Andric let Inst{11-14} = eo; 430*81ad6265SDimitry Andric let Inst{15} = MP; 431*81ad6265SDimitry Andric let Inst{16-20} = VB; 432*81ad6265SDimitry Andric let Inst{21-31} = xo; 433*81ad6265SDimitry Andric} 434*81ad6265SDimitry Andric 435*81ad6265SDimitry Andric// 8RR:D-Form: [ 1 1 0 // // imm0 436*81ad6265SDimitry Andric// PO T XO TX imm1 ]. 437*81ad6265SDimitry Andricclass 8RR_DForm_IMM32_XT6<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, 438*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 439*81ad6265SDimitry Andric list<dag> pattern> 440*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 441*81ad6265SDimitry Andric bits<6> XT; 442*81ad6265SDimitry Andric bits<32> IMM32; 443*81ad6265SDimitry Andric 444*81ad6265SDimitry Andric let Pattern = pattern; 445*81ad6265SDimitry Andric 446*81ad6265SDimitry Andric // The prefix. 447*81ad6265SDimitry Andric let Inst{6-7} = 1; 448*81ad6265SDimitry Andric let Inst{8-11} = 0; 449*81ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 450*81ad6265SDimitry Andric let Inst{14-15} = 0; // reserved 451*81ad6265SDimitry Andric let Inst{16-31} = IMM32{31-16}; 452*81ad6265SDimitry Andric 453*81ad6265SDimitry Andric // The instruction. 454*81ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 455*81ad6265SDimitry Andric let Inst{43-46} = xo; 456*81ad6265SDimitry Andric let Inst{47} = XT{5}; 457*81ad6265SDimitry Andric let Inst{48-63} = IMM32{15-0}; 458*81ad6265SDimitry Andric} 459*81ad6265SDimitry Andric 460*81ad6265SDimitry Andric// 8RR:D-Form: [ 1 1 0 // // imm0 461*81ad6265SDimitry Andric// PO T XO IX TX imm1 ]. 462*81ad6265SDimitry Andricclass 8RR_DForm_IMM32_XT6_IX<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, 463*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 464*81ad6265SDimitry Andric list<dag> pattern> 465*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 466*81ad6265SDimitry Andric bits<6> XT; 467*81ad6265SDimitry Andric bit IX; 468*81ad6265SDimitry Andric bits<32> IMM32; 469*81ad6265SDimitry Andric 470*81ad6265SDimitry Andric let Pattern = pattern; 471*81ad6265SDimitry Andric 472*81ad6265SDimitry Andric // The prefix. 473*81ad6265SDimitry Andric let Inst{6-7} = 1; 474*81ad6265SDimitry Andric let Inst{8-11} = 0; 475*81ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 476*81ad6265SDimitry Andric let Inst{14-15} = 0; // reserved 477*81ad6265SDimitry Andric let Inst{16-31} = IMM32{31-16}; 478*81ad6265SDimitry Andric 479*81ad6265SDimitry Andric // The instruction. 480*81ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 481*81ad6265SDimitry Andric let Inst{43-45} = xo; 482*81ad6265SDimitry Andric let Inst{46} = IX; 483*81ad6265SDimitry Andric let Inst{47} = XT{5}; 484*81ad6265SDimitry Andric let Inst{48-63} = IMM32{15-0}; 485*81ad6265SDimitry Andric} 486*81ad6265SDimitry Andric 487*81ad6265SDimitry Andricclass 8RR_XX4Form_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, 488*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 489*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 490*81ad6265SDimitry Andric bits<6> XT; 491*81ad6265SDimitry Andric bits<6> XA; 492*81ad6265SDimitry Andric bits<6> XB; 493*81ad6265SDimitry Andric bits<6> XC; 494*81ad6265SDimitry Andric 495*81ad6265SDimitry Andric let Pattern = pattern; 496*81ad6265SDimitry Andric 497*81ad6265SDimitry Andric // The prefix. 498*81ad6265SDimitry Andric let Inst{6-7} = 1; 499*81ad6265SDimitry Andric let Inst{8-11} = 0; 500*81ad6265SDimitry Andric let Inst{12-13} = 0; 501*81ad6265SDimitry Andric let Inst{14-31} = 0; 502*81ad6265SDimitry Andric 503*81ad6265SDimitry Andric // The instruction. 504*81ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 505*81ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 506*81ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 507*81ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 508*81ad6265SDimitry Andric let Inst{58-59} = xo; 509*81ad6265SDimitry Andric let Inst{60} = XC{5}; 510*81ad6265SDimitry Andric let Inst{61} = XA{5}; 511*81ad6265SDimitry Andric let Inst{62} = XB{5}; 512*81ad6265SDimitry Andric let Inst{63} = XT{5}; 513*81ad6265SDimitry Andric} 514*81ad6265SDimitry Andric 515*81ad6265SDimitry Andricclass 8RR_XX4Form_IMM3_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, 516*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 517*81ad6265SDimitry Andric list<dag> pattern> 518*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 519*81ad6265SDimitry Andric bits<6> XT; 520*81ad6265SDimitry Andric bits<6> XA; 521*81ad6265SDimitry Andric bits<6> XB; 522*81ad6265SDimitry Andric bits<6> XC; 523*81ad6265SDimitry Andric bits<3> IMM; 524*81ad6265SDimitry Andric 525*81ad6265SDimitry Andric let Pattern = pattern; 526*81ad6265SDimitry Andric 527*81ad6265SDimitry Andric // The prefix. 528*81ad6265SDimitry Andric let Inst{6-7} = 1; 529*81ad6265SDimitry Andric let Inst{8-11} = 0; 530*81ad6265SDimitry Andric let Inst{12-13} = 0; 531*81ad6265SDimitry Andric let Inst{14-28} = 0; 532*81ad6265SDimitry Andric let Inst{29-31} = IMM; 533*81ad6265SDimitry Andric 534*81ad6265SDimitry Andric // The instruction. 535*81ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 536*81ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 537*81ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 538*81ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 539*81ad6265SDimitry Andric let Inst{58-59} = xo; 540*81ad6265SDimitry Andric let Inst{60} = XC{5}; 541*81ad6265SDimitry Andric let Inst{61} = XA{5}; 542*81ad6265SDimitry Andric let Inst{62} = XB{5}; 543*81ad6265SDimitry Andric let Inst{63} = XT{5}; 544*81ad6265SDimitry Andric} 545*81ad6265SDimitry Andric 546*81ad6265SDimitry Andric// [PO BF / XO2 B XO BX /] 547*81ad6265SDimitry Andricclass XX2_BF3_XO5_XB6_XO9<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, 548*81ad6265SDimitry Andric dag IOL, string asmstr, InstrItinClass itin, 549*81ad6265SDimitry Andric list<dag> pattern> 550*81ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 551*81ad6265SDimitry Andric bits<3> BF; 552*81ad6265SDimitry Andric bits<6> XB; 553*81ad6265SDimitry Andric 554*81ad6265SDimitry Andric let Pattern = pattern; 555*81ad6265SDimitry Andric 556*81ad6265SDimitry Andric let Inst{6-8} = BF; 557*81ad6265SDimitry Andric let Inst{9-10} = 0; 558*81ad6265SDimitry Andric let Inst{11-15} = xo2; 559*81ad6265SDimitry Andric let Inst{16-20} = XB{4-0}; 560*81ad6265SDimitry Andric let Inst{21-29} = xo; 561*81ad6265SDimitry Andric let Inst{30} = XB{5}; 562*81ad6265SDimitry Andric let Inst{31} = 0; 563*81ad6265SDimitry Andric} 564*81ad6265SDimitry Andric 565*81ad6265SDimitry Andric// X-Form: [ PO RT BI /// XO / ] 566*81ad6265SDimitry Andricclass XForm_XT5_BI5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 567*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 568*81ad6265SDimitry Andric : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 569*81ad6265SDimitry Andric let B = 0; 570*81ad6265SDimitry Andric} 571*81ad6265SDimitry Andric 572*81ad6265SDimitry Andricmulticlass MLS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL, 573*81ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 574*81ad6265SDimitry Andric InstrItinClass itin> { 575*81ad6265SDimitry Andric def NAME : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, 576*81ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 577*81ad6265SDimitry Andric def pc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL, 578*81ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 579*81ad6265SDimitry Andric isPCRel; 580*81ad6265SDimitry Andric} 581*81ad6265SDimitry Andric 582*81ad6265SDimitry Andricmulticlass 8LS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL, 583*81ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 584*81ad6265SDimitry Andric InstrItinClass itin> { 585*81ad6265SDimitry Andric def NAME : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, 586*81ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 587*81ad6265SDimitry Andric def pc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL, 588*81ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 589*81ad6265SDimitry Andric isPCRel; 590*81ad6265SDimitry Andric} 591*81ad6265SDimitry Andric 592*81ad6265SDimitry Andricmulticlass 8LS_DForm_R_SI34_XT6_RA5_MEM_p<bits<5> opcode, dag OOL, dag IOL, 593*81ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 594*81ad6265SDimitry Andric InstrItinClass itin> { 595*81ad6265SDimitry Andric def NAME : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL, 596*81ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 597*81ad6265SDimitry Andric def pc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRel_IOL, 598*81ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 599*81ad6265SDimitry Andric isPCRel; 600*81ad6265SDimitry Andric} 601*81ad6265SDimitry Andric 602*81ad6265SDimitry Andricdef PrefixInstrs : Predicate<"Subtarget->hasPrefixInstrs()">; 603*81ad6265SDimitry Andricdef IsISA3_1 : Predicate<"Subtarget->isISA3_1()">; 604*81ad6265SDimitry Andricdef PairedVectorMemops : Predicate<"Subtarget->pairedVectorMemops()">; 605*81ad6265SDimitry Andricdef RCCp { 606*81ad6265SDimitry Andric dag AToVSRC = (COPY_TO_REGCLASS $XA, VSRC); 607*81ad6265SDimitry Andric dag BToVSRC = (COPY_TO_REGCLASS $XB, VSRC); 608*81ad6265SDimitry Andric} 609*81ad6265SDimitry Andric 610*81ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 611*81ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 612*81ad6265SDimitry Andric defm PADDI8 : 613*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_p<14, (outs g8rc:$RT), (ins g8rc:$RA, s34imm:$SI), 614*81ad6265SDimitry Andric (ins immZero:$RA, s34imm_pcrel:$SI), 615*81ad6265SDimitry Andric "paddi $RT, $RA, $SI", IIC_LdStLFD>; 616*81ad6265SDimitry Andric let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 617*81ad6265SDimitry Andric def PLI8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT), 618*81ad6265SDimitry Andric (ins s34imm:$SI), 619*81ad6265SDimitry Andric "pli $RT, $SI", IIC_IntSimple, []>; 620*81ad6265SDimitry Andric } 621*81ad6265SDimitry Andric } 622*81ad6265SDimitry Andric defm PADDI : 623*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_p<14, (outs gprc:$RT), (ins gprc:$RA, s34imm:$SI), 624*81ad6265SDimitry Andric (ins immZero:$RA, s34imm_pcrel:$SI), 625*81ad6265SDimitry Andric "paddi $RT, $RA, $SI", IIC_LdStLFD>; 626*81ad6265SDimitry Andric let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 627*81ad6265SDimitry Andric def PLI : MLS_DForm_SI34_RT5<14, (outs gprc:$RT), 628*81ad6265SDimitry Andric (ins s34imm:$SI), 629*81ad6265SDimitry Andric "pli $RT, $SI", IIC_IntSimple, []>; 630*81ad6265SDimitry Andric } 631*81ad6265SDimitry Andric 632*81ad6265SDimitry Andric let mayLoad = 1, mayStore = 0 in { 633*81ad6265SDimitry Andric defm PLXV : 634*81ad6265SDimitry Andric 8LS_DForm_R_SI34_XT6_RA5_MEM_p<25, (outs vsrc:$XT), (ins memri34:$D_RA), 635*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), 636*81ad6265SDimitry Andric "plxv $XT, $D_RA", IIC_LdStLFD>; 637*81ad6265SDimitry Andric defm PLFS : 638*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<48, (outs f4rc:$FRT), (ins memri34:$D_RA), 639*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plfs $FRT, $D_RA", 640*81ad6265SDimitry Andric IIC_LdStLFD>; 641*81ad6265SDimitry Andric defm PLFD : 642*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<50, (outs f8rc:$FRT), (ins memri34:$D_RA), 643*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plfd $FRT, $D_RA", 644*81ad6265SDimitry Andric IIC_LdStLFD>; 645*81ad6265SDimitry Andric defm PLXSSP : 646*81ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<43, (outs vfrc:$VRT), (ins memri34:$D_RA), 647*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), 648*81ad6265SDimitry Andric "plxssp $VRT, $D_RA", IIC_LdStLFD>; 649*81ad6265SDimitry Andric defm PLXSD : 650*81ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<42, (outs vfrc:$VRT), (ins memri34:$D_RA), 651*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), 652*81ad6265SDimitry Andric "plxsd $VRT, $D_RA", IIC_LdStLFD>; 653*81ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 654*81ad6265SDimitry Andric defm PLBZ8 : 655*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs g8rc:$RT), (ins memri34:$D_RA), 656*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plbz $RT, $D_RA", 657*81ad6265SDimitry Andric IIC_LdStLFD>; 658*81ad6265SDimitry Andric defm PLHZ8 : 659*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs g8rc:$RT), (ins memri34:$D_RA), 660*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plhz $RT, $D_RA", 661*81ad6265SDimitry Andric IIC_LdStLFD>; 662*81ad6265SDimitry Andric defm PLHA8 : 663*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs g8rc:$RT), (ins memri34:$D_RA), 664*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plha $RT, $D_RA", 665*81ad6265SDimitry Andric IIC_LdStLFD>; 666*81ad6265SDimitry Andric defm PLWA8 : 667*81ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs g8rc:$RT), (ins memri34:$D_RA), 668*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), 669*81ad6265SDimitry Andric "plwa $RT, $D_RA", IIC_LdStLFD>; 670*81ad6265SDimitry Andric defm PLWZ8 : 671*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs g8rc:$RT), (ins memri34:$D_RA), 672*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plwz $RT, $D_RA", 673*81ad6265SDimitry Andric IIC_LdStLFD>; 674*81ad6265SDimitry Andric } 675*81ad6265SDimitry Andric defm PLBZ : 676*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs gprc:$RT), (ins memri34:$D_RA), 677*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plbz $RT, $D_RA", 678*81ad6265SDimitry Andric IIC_LdStLFD>; 679*81ad6265SDimitry Andric defm PLHZ : 680*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs gprc:$RT), (ins memri34:$D_RA), 681*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plhz $RT, $D_RA", 682*81ad6265SDimitry Andric IIC_LdStLFD>; 683*81ad6265SDimitry Andric defm PLHA : 684*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs gprc:$RT), (ins memri34:$D_RA), 685*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plha $RT, $D_RA", 686*81ad6265SDimitry Andric IIC_LdStLFD>; 687*81ad6265SDimitry Andric defm PLWZ : 688*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs gprc:$RT), (ins memri34:$D_RA), 689*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plwz $RT, $D_RA", 690*81ad6265SDimitry Andric IIC_LdStLFD>; 691*81ad6265SDimitry Andric defm PLWA : 692*81ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs gprc:$RT), (ins memri34:$D_RA), 693*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plwa $RT, $D_RA", 694*81ad6265SDimitry Andric IIC_LdStLFD>; 695*81ad6265SDimitry Andric defm PLD : 696*81ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<57, (outs g8rc:$RT), (ins memri34:$D_RA), 697*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "pld $RT, $D_RA", 698*81ad6265SDimitry Andric IIC_LdStLFD>; 699*81ad6265SDimitry Andric } 700*81ad6265SDimitry Andric 701*81ad6265SDimitry Andric let mayStore = 1, mayLoad = 0 in { 702*81ad6265SDimitry Andric defm PSTXV : 703*81ad6265SDimitry Andric 8LS_DForm_R_SI34_XT6_RA5_MEM_p<27, (outs), (ins vsrc:$XS, memri34:$D_RA), 704*81ad6265SDimitry Andric (ins vsrc:$XS, memri34_pcrel:$D_RA), 705*81ad6265SDimitry Andric "pstxv $XS, $D_RA", IIC_LdStLFD>; 706*81ad6265SDimitry Andric defm PSTFS : 707*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<52, (outs), (ins f4rc:$FRS, memri34:$D_RA), 708*81ad6265SDimitry Andric (ins f4rc:$FRS, memri34_pcrel:$D_RA), 709*81ad6265SDimitry Andric "pstfs $FRS, $D_RA", IIC_LdStLFD>; 710*81ad6265SDimitry Andric defm PSTFD : 711*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<54, (outs), (ins f8rc:$FRS, memri34:$D_RA), 712*81ad6265SDimitry Andric (ins f8rc:$FRS, memri34_pcrel:$D_RA), 713*81ad6265SDimitry Andric "pstfd $FRS, $D_RA", IIC_LdStLFD>; 714*81ad6265SDimitry Andric defm PSTXSSP : 715*81ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<47, (outs), (ins vfrc:$VRS, memri34:$D_RA), 716*81ad6265SDimitry Andric (ins vfrc:$VRS, memri34_pcrel:$D_RA), 717*81ad6265SDimitry Andric "pstxssp $VRS, $D_RA", IIC_LdStLFD>; 718*81ad6265SDimitry Andric defm PSTXSD : 719*81ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<46, (outs), (ins vfrc:$VRS, memri34:$D_RA), 720*81ad6265SDimitry Andric (ins vfrc:$VRS, memri34_pcrel:$D_RA), 721*81ad6265SDimitry Andric "pstxsd $VRS, $D_RA", IIC_LdStLFD>; 722*81ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 723*81ad6265SDimitry Andric defm PSTB8 : 724*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins g8rc:$RS, memri34:$D_RA), 725*81ad6265SDimitry Andric (ins g8rc:$RS, memri34_pcrel:$D_RA), 726*81ad6265SDimitry Andric "pstb $RS, $D_RA", IIC_LdStLFD>; 727*81ad6265SDimitry Andric defm PSTH8 : 728*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins g8rc:$RS, memri34:$D_RA), 729*81ad6265SDimitry Andric (ins g8rc:$RS, memri34_pcrel:$D_RA), 730*81ad6265SDimitry Andric "psth $RS, $D_RA", IIC_LdStLFD>; 731*81ad6265SDimitry Andric defm PSTW8 : 732*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins g8rc:$RS, memri34:$D_RA), 733*81ad6265SDimitry Andric (ins g8rc:$RS, memri34_pcrel:$D_RA), 734*81ad6265SDimitry Andric "pstw $RS, $D_RA", IIC_LdStLFD>; 735*81ad6265SDimitry Andric } 736*81ad6265SDimitry Andric defm PSTB : 737*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins gprc:$RS, memri34:$D_RA), 738*81ad6265SDimitry Andric (ins gprc:$RS, memri34_pcrel:$D_RA), 739*81ad6265SDimitry Andric "pstb $RS, $D_RA", IIC_LdStLFD>; 740*81ad6265SDimitry Andric defm PSTH : 741*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins gprc:$RS, memri34:$D_RA), 742*81ad6265SDimitry Andric (ins gprc:$RS, memri34_pcrel:$D_RA), 743*81ad6265SDimitry Andric "psth $RS, $D_RA", IIC_LdStLFD>; 744*81ad6265SDimitry Andric defm PSTW : 745*81ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins gprc:$RS, memri34:$D_RA), 746*81ad6265SDimitry Andric (ins gprc:$RS, memri34_pcrel:$D_RA), 747*81ad6265SDimitry Andric "pstw $RS, $D_RA", IIC_LdStLFD>; 748*81ad6265SDimitry Andric defm PSTD : 749*81ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<61, (outs), (ins g8rc:$RS, memri34:$D_RA), 750*81ad6265SDimitry Andric (ins g8rc:$RS, memri34_pcrel:$D_RA), 751*81ad6265SDimitry Andric "pstd $RS, $D_RA", IIC_LdStLFD>; 752*81ad6265SDimitry Andric } 753*81ad6265SDimitry Andric} 754*81ad6265SDimitry Andric 755*81ad6265SDimitry Andricclass DQForm_XTp5_RA17_MEM<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, 756*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 757*81ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 758*81ad6265SDimitry Andric bits<5> XTp; 759*81ad6265SDimitry Andric bits<17> DQ_RA; 760*81ad6265SDimitry Andric let Pattern = pattern; 761*81ad6265SDimitry Andric 762*81ad6265SDimitry Andric let Inst{6-9} = XTp{3-0}; 763*81ad6265SDimitry Andric let Inst{10} = XTp{4}; 764*81ad6265SDimitry Andric let Inst{11-15} = DQ_RA{16-12}; // Register # 765*81ad6265SDimitry Andric let Inst{16-27} = DQ_RA{11-0}; // Displacement. 766*81ad6265SDimitry Andric let Inst{28-31} = xo; 767*81ad6265SDimitry Andric} 768*81ad6265SDimitry Andric 769*81ad6265SDimitry Andricclass XForm_XTp5_XAB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 770*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 771*81ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp { 772*81ad6265SDimitry Andric bits<5> XTp; 773*81ad6265SDimitry Andric bits<5> A; 774*81ad6265SDimitry Andric bits<5> B; 775*81ad6265SDimitry Andric 776*81ad6265SDimitry Andric let Pattern = pattern; 777*81ad6265SDimitry Andric let Inst{6-9} = XTp{3-0}; 778*81ad6265SDimitry Andric let Inst{10} = XTp{4}; 779*81ad6265SDimitry Andric let Inst{11-15} = A; 780*81ad6265SDimitry Andric let Inst{16-20} = B; 781*81ad6265SDimitry Andric let Inst{21-30} = xo; 782*81ad6265SDimitry Andric let Inst{31} = 0; 783*81ad6265SDimitry Andric} 784*81ad6265SDimitry Andric 785*81ad6265SDimitry Andricclass 8LS_DForm_R_XTp5_SI34_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 786*81ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 787*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 788*81ad6265SDimitry Andric bits<5> XTp; 789*81ad6265SDimitry Andric bits<39> D_RA; 790*81ad6265SDimitry Andric 791*81ad6265SDimitry Andric let Pattern = pattern; 792*81ad6265SDimitry Andric 793*81ad6265SDimitry Andric // The prefix. 794*81ad6265SDimitry Andric let Inst{6-10} = 0; 795*81ad6265SDimitry Andric let Inst{11} = PCRel; 796*81ad6265SDimitry Andric let Inst{12-13} = 0; 797*81ad6265SDimitry Andric let Inst{14-31} = D_RA{33-16}; // Imm18 798*81ad6265SDimitry Andric 799*81ad6265SDimitry Andric // The instruction. 800*81ad6265SDimitry Andric let Inst{38-41} = XTp{3-0}; 801*81ad6265SDimitry Andric let Inst{42} = XTp{4}; 802*81ad6265SDimitry Andric let Inst{43-47} = D_RA{38-34}; // Register # 803*81ad6265SDimitry Andric let Inst{48-63} = D_RA{15-0}; // D 804*81ad6265SDimitry Andric} 805*81ad6265SDimitry Andric 806*81ad6265SDimitry Andricmulticlass 8LS_DForm_R_XTp5_SI34_MEM_p<bits<6> opcode, dag OOL, 807*81ad6265SDimitry Andric dag IOL, dag PCRel_IOL, 808*81ad6265SDimitry Andric string asmstr, InstrItinClass itin> { 809*81ad6265SDimitry Andric def NAME : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL, 810*81ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 811*81ad6265SDimitry Andric def pc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRel_IOL, 812*81ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 813*81ad6265SDimitry Andric isPCRel; 814*81ad6265SDimitry Andric} 815*81ad6265SDimitry Andric 816*81ad6265SDimitry Andric 817*81ad6265SDimitry Andric 818*81ad6265SDimitry Andric// [PO AS XO2 XO] 819*81ad6265SDimitry Andricclass XForm_AT3<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL, 820*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 821*81ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 822*81ad6265SDimitry Andric bits<3> AT; 823*81ad6265SDimitry Andric 824*81ad6265SDimitry Andric let Pattern = pattern; 825*81ad6265SDimitry Andric 826*81ad6265SDimitry Andric let Inst{6-8} = AT; 827*81ad6265SDimitry Andric let Inst{9-10} = 0; 828*81ad6265SDimitry Andric let Inst{11-15} = xo2; 829*81ad6265SDimitry Andric let Inst{16-20} = 0; 830*81ad6265SDimitry Andric let Inst{21-30} = xo; 831*81ad6265SDimitry Andric let Inst{31} = 0; 832*81ad6265SDimitry Andric} 833*81ad6265SDimitry Andric 834*81ad6265SDimitry Andric// X-Form: [ PO T EO UIM XO TX ] 835*81ad6265SDimitry Andricclass XForm_XT6_IMM5<bits<6> opcode, bits<5> eo, bits<10> xo, dag OOL, dag IOL, 836*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 837*81ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 838*81ad6265SDimitry Andric bits<6> XT; 839*81ad6265SDimitry Andric bits<5> UIM; 840*81ad6265SDimitry Andric 841*81ad6265SDimitry Andric let Pattern = pattern; 842*81ad6265SDimitry Andric 843*81ad6265SDimitry Andric let Inst{6-10} = XT{4-0}; 844*81ad6265SDimitry Andric let Inst{11-15} = eo; 845*81ad6265SDimitry Andric let Inst{16-20} = UIM; 846*81ad6265SDimitry Andric let Inst{21-30} = xo; 847*81ad6265SDimitry Andric let Inst{31} = XT{5}; 848*81ad6265SDimitry Andric} 849*81ad6265SDimitry Andric 850*81ad6265SDimitry Andricclass XX3Form_AT3_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 851*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 852*81ad6265SDimitry Andric list<dag> pattern> 853*81ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 854*81ad6265SDimitry Andric bits<3> AT; 855*81ad6265SDimitry Andric bits<6> XA; 856*81ad6265SDimitry Andric bits<6> XB; 857*81ad6265SDimitry Andric 858*81ad6265SDimitry Andric let Pattern = pattern; 859*81ad6265SDimitry Andric 860*81ad6265SDimitry Andric let Inst{6-8} = AT; 861*81ad6265SDimitry Andric let Inst{9-10} = 0; 862*81ad6265SDimitry Andric let Inst{11-15} = XA{4-0}; 863*81ad6265SDimitry Andric let Inst{16-20} = XB{4-0}; 864*81ad6265SDimitry Andric let Inst{21-28} = xo; 865*81ad6265SDimitry Andric let Inst{29} = XA{5}; 866*81ad6265SDimitry Andric let Inst{30} = XB{5}; 867*81ad6265SDimitry Andric let Inst{31} = 0; 868*81ad6265SDimitry Andric} 869*81ad6265SDimitry Andric 870*81ad6265SDimitry Andricclass MMIRR_XX3Form_XY4P2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 871*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 872*81ad6265SDimitry Andric list<dag> pattern> 873*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 874*81ad6265SDimitry Andric bits<3> AT; 875*81ad6265SDimitry Andric bits<6> XA; 876*81ad6265SDimitry Andric bits<6> XB; 877*81ad6265SDimitry Andric bits<4> XMSK; 878*81ad6265SDimitry Andric bits<4> YMSK; 879*81ad6265SDimitry Andric bits<2> PMSK; 880*81ad6265SDimitry Andric 881*81ad6265SDimitry Andric let Pattern = pattern; 882*81ad6265SDimitry Andric 883*81ad6265SDimitry Andric // The prefix. 884*81ad6265SDimitry Andric let Inst{6-7} = 3; 885*81ad6265SDimitry Andric let Inst{8-11} = 9; 886*81ad6265SDimitry Andric let Inst{12-15} = 0; 887*81ad6265SDimitry Andric let Inst{16-17} = PMSK; 888*81ad6265SDimitry Andric let Inst{18-23} = 0; 889*81ad6265SDimitry Andric let Inst{24-27} = XMSK; 890*81ad6265SDimitry Andric let Inst{28-31} = YMSK; 891*81ad6265SDimitry Andric 892*81ad6265SDimitry Andric // The instruction. 893*81ad6265SDimitry Andric let Inst{38-40} = AT; 894*81ad6265SDimitry Andric let Inst{41-42} = 0; 895*81ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 896*81ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 897*81ad6265SDimitry Andric let Inst{53-60} = xo; 898*81ad6265SDimitry Andric let Inst{61} = XA{5}; 899*81ad6265SDimitry Andric let Inst{62} = XB{5}; 900*81ad6265SDimitry Andric let Inst{63} = 0; 901*81ad6265SDimitry Andric} 902*81ad6265SDimitry Andric 903*81ad6265SDimitry Andricclass MMIRR_XX3Form_XY4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 904*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 905*81ad6265SDimitry Andric list<dag> pattern> 906*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 907*81ad6265SDimitry Andric bits<3> AT; 908*81ad6265SDimitry Andric bits<6> XA; 909*81ad6265SDimitry Andric bits<6> XB; 910*81ad6265SDimitry Andric bits<4> XMSK; 911*81ad6265SDimitry Andric bits<4> YMSK; 912*81ad6265SDimitry Andric 913*81ad6265SDimitry Andric let Pattern = pattern; 914*81ad6265SDimitry Andric 915*81ad6265SDimitry Andric // The prefix. 916*81ad6265SDimitry Andric let Inst{6-7} = 3; 917*81ad6265SDimitry Andric let Inst{8-11} = 9; 918*81ad6265SDimitry Andric let Inst{12-23} = 0; 919*81ad6265SDimitry Andric let Inst{24-27} = XMSK; 920*81ad6265SDimitry Andric let Inst{28-31} = YMSK; 921*81ad6265SDimitry Andric 922*81ad6265SDimitry Andric // The instruction. 923*81ad6265SDimitry Andric let Inst{38-40} = AT; 924*81ad6265SDimitry Andric let Inst{41-42} = 0; 925*81ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 926*81ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 927*81ad6265SDimitry Andric let Inst{53-60} = xo; 928*81ad6265SDimitry Andric let Inst{61} = XA{5}; 929*81ad6265SDimitry Andric let Inst{62} = XB{5}; 930*81ad6265SDimitry Andric let Inst{63} = 0; 931*81ad6265SDimitry Andric} 932*81ad6265SDimitry Andric 933*81ad6265SDimitry Andricclass MMIRR_XX3Form_X4Y2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 934*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 935*81ad6265SDimitry Andric list<dag> pattern> 936*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 937*81ad6265SDimitry Andric bits<3> AT; 938*81ad6265SDimitry Andric bits<6> XA; 939*81ad6265SDimitry Andric bits<6> XB; 940*81ad6265SDimitry Andric bits<4> XMSK; 941*81ad6265SDimitry Andric bits<2> YMSK; 942*81ad6265SDimitry Andric 943*81ad6265SDimitry Andric let Pattern = pattern; 944*81ad6265SDimitry Andric 945*81ad6265SDimitry Andric // The prefix. 946*81ad6265SDimitry Andric let Inst{6-7} = 3; 947*81ad6265SDimitry Andric let Inst{8-11} = 9; 948*81ad6265SDimitry Andric let Inst{12-23} = 0; 949*81ad6265SDimitry Andric let Inst{24-27} = XMSK; 950*81ad6265SDimitry Andric let Inst{28-29} = YMSK; 951*81ad6265SDimitry Andric let Inst{30-31} = 0; 952*81ad6265SDimitry Andric 953*81ad6265SDimitry Andric // The instruction. 954*81ad6265SDimitry Andric let Inst{38-40} = AT; 955*81ad6265SDimitry Andric let Inst{41-42} = 0; 956*81ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 957*81ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 958*81ad6265SDimitry Andric let Inst{53-60} = xo; 959*81ad6265SDimitry Andric let Inst{61} = XA{5}; 960*81ad6265SDimitry Andric let Inst{62} = XB{5}; 961*81ad6265SDimitry Andric let Inst{63} = 0; 962*81ad6265SDimitry Andric} 963*81ad6265SDimitry Andric 964*81ad6265SDimitry Andricclass MMIRR_XX3Form_XY4P8_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 965*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 966*81ad6265SDimitry Andric list<dag> pattern> 967*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 968*81ad6265SDimitry Andric bits<3> AT; 969*81ad6265SDimitry Andric bits<6> XA; 970*81ad6265SDimitry Andric bits<6> XB; 971*81ad6265SDimitry Andric bits<4> XMSK; 972*81ad6265SDimitry Andric bits<4> YMSK; 973*81ad6265SDimitry Andric bits<8> PMSK; 974*81ad6265SDimitry Andric 975*81ad6265SDimitry Andric let Pattern = pattern; 976*81ad6265SDimitry Andric 977*81ad6265SDimitry Andric // The prefix. 978*81ad6265SDimitry Andric let Inst{6-7} = 3; 979*81ad6265SDimitry Andric let Inst{8-11} = 9; 980*81ad6265SDimitry Andric let Inst{12-15} = 0; 981*81ad6265SDimitry Andric let Inst{16-23} = PMSK; 982*81ad6265SDimitry Andric let Inst{24-27} = XMSK; 983*81ad6265SDimitry Andric let Inst{28-31} = YMSK; 984*81ad6265SDimitry Andric 985*81ad6265SDimitry Andric // The instruction. 986*81ad6265SDimitry Andric let Inst{38-40} = AT; 987*81ad6265SDimitry Andric let Inst{41-42} = 0; 988*81ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 989*81ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 990*81ad6265SDimitry Andric let Inst{53-60} = xo; 991*81ad6265SDimitry Andric let Inst{61} = XA{5}; 992*81ad6265SDimitry Andric let Inst{62} = XB{5}; 993*81ad6265SDimitry Andric let Inst{63} = 0; 994*81ad6265SDimitry Andric} 995*81ad6265SDimitry Andric 996*81ad6265SDimitry Andricclass MMIRR_XX3Form_XYP4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 997*81ad6265SDimitry Andric string asmstr, InstrItinClass itin, 998*81ad6265SDimitry Andric list<dag> pattern> 999*81ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 1000*81ad6265SDimitry Andric bits<3> AT; 1001*81ad6265SDimitry Andric bits<6> XA; 1002*81ad6265SDimitry Andric bits<6> XB; 1003*81ad6265SDimitry Andric bits<4> XMSK; 1004*81ad6265SDimitry Andric bits<4> YMSK; 1005*81ad6265SDimitry Andric bits<4> PMSK; 1006*81ad6265SDimitry Andric 1007*81ad6265SDimitry Andric let Pattern = pattern; 1008*81ad6265SDimitry Andric 1009*81ad6265SDimitry Andric // The prefix. 1010*81ad6265SDimitry Andric let Inst{6-7} = 3; 1011*81ad6265SDimitry Andric let Inst{8-11} = 9; 1012*81ad6265SDimitry Andric let Inst{12-15} = 0; 1013*81ad6265SDimitry Andric let Inst{16-19} = PMSK; 1014*81ad6265SDimitry Andric let Inst{20-23} = 0; 1015*81ad6265SDimitry Andric let Inst{24-27} = XMSK; 1016*81ad6265SDimitry Andric let Inst{28-31} = YMSK; 1017*81ad6265SDimitry Andric 1018*81ad6265SDimitry Andric // The instruction. 1019*81ad6265SDimitry Andric let Inst{38-40} = AT; 1020*81ad6265SDimitry Andric let Inst{41-42} = 0; 1021*81ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 1022*81ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 1023*81ad6265SDimitry Andric let Inst{53-60} = xo; 1024*81ad6265SDimitry Andric let Inst{61} = XA{5}; 1025*81ad6265SDimitry Andric let Inst{62} = XB{5}; 1026*81ad6265SDimitry Andric let Inst{63} = 0; 1027*81ad6265SDimitry Andric} 1028*81ad6265SDimitry Andric 1029*81ad6265SDimitry Andric 1030*81ad6265SDimitry Andric 1031*81ad6265SDimitry Andricdef Concats { 1032*81ad6265SDimitry Andric dag VecsToVecPair0 = 1033*81ad6265SDimitry Andric (v256i1 (INSERT_SUBREG 1034*81ad6265SDimitry Andric (INSERT_SUBREG (IMPLICIT_DEF), $vs0, sub_vsx1), 1035*81ad6265SDimitry Andric $vs1, sub_vsx0)); 1036*81ad6265SDimitry Andric dag VecsToVecPair1 = 1037*81ad6265SDimitry Andric (v256i1 (INSERT_SUBREG 1038*81ad6265SDimitry Andric (INSERT_SUBREG (IMPLICIT_DEF), $vs2, sub_vsx1), 1039*81ad6265SDimitry Andric $vs3, sub_vsx0)); 1040*81ad6265SDimitry Andric} 1041*81ad6265SDimitry Andric 1042*81ad6265SDimitry Andriclet Predicates = [PairedVectorMemops] in { 1043*81ad6265SDimitry Andric def : Pat<(v256i1 (PPCPairBuild v4i32:$vs1, v4i32:$vs0)), 1044*81ad6265SDimitry Andric Concats.VecsToVecPair0>; 1045*81ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_assemble_pair v16i8:$vs1, v16i8:$vs0)), 1046*81ad6265SDimitry Andric Concats.VecsToVecPair0>; 1047*81ad6265SDimitry Andric def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 0)), 1048*81ad6265SDimitry Andric (v4i32 (EXTRACT_SUBREG $v, sub_vsx0))>; 1049*81ad6265SDimitry Andric def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 1)), 1050*81ad6265SDimitry Andric (v4i32 (EXTRACT_SUBREG $v, sub_vsx1))>; 1051*81ad6265SDimitry Andric} 1052*81ad6265SDimitry Andric 1053*81ad6265SDimitry Andriclet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops] in { 1054*81ad6265SDimitry Andric def LXVP : DQForm_XTp5_RA17_MEM<6, 0, (outs vsrprc:$XTp), 1055*81ad6265SDimitry Andric (ins memrix16:$DQ_RA), "lxvp $XTp, $DQ_RA", 1056*81ad6265SDimitry Andric IIC_LdStLFD, []>; 1057*81ad6265SDimitry Andric def LXVPX : XForm_XTp5_XAB5<31, 333, (outs vsrprc:$XTp), (ins memrr:$src), 1058*81ad6265SDimitry Andric "lxvpx $XTp, $src", IIC_LdStLFD, 1059*81ad6265SDimitry Andric []>; 1060*81ad6265SDimitry Andric} 1061*81ad6265SDimitry Andric 1062*81ad6265SDimitry Andriclet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops] in { 1063*81ad6265SDimitry Andric def STXVP : DQForm_XTp5_RA17_MEM<6, 1, (outs), (ins vsrprc:$XTp, 1064*81ad6265SDimitry Andric memrix16:$DQ_RA), "stxvp $XTp, $DQ_RA", 1065*81ad6265SDimitry Andric IIC_LdStLFD, []>; 1066*81ad6265SDimitry Andric def STXVPX : XForm_XTp5_XAB5<31, 461, (outs), (ins vsrprc:$XTp, memrr:$dst), 1067*81ad6265SDimitry Andric "stxvpx $XTp, $dst", IIC_LdStLFD, 1068*81ad6265SDimitry Andric []>; 1069*81ad6265SDimitry Andric} 1070*81ad6265SDimitry Andric 1071*81ad6265SDimitry Andriclet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops, PrefixInstrs] in { 1072*81ad6265SDimitry Andric defm PLXVP : 1073*81ad6265SDimitry Andric 8LS_DForm_R_XTp5_SI34_MEM_p<58, (outs vsrprc:$XTp), (ins memri34:$D_RA), 1074*81ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plxvp $XTp, $D_RA", 1075*81ad6265SDimitry Andric IIC_LdStLFD>; 1076*81ad6265SDimitry Andric} 1077*81ad6265SDimitry Andric 1078*81ad6265SDimitry Andriclet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops, PrefixInstrs] in { 1079*81ad6265SDimitry Andric defm PSTXVP : 1080*81ad6265SDimitry Andric 8LS_DForm_R_XTp5_SI34_MEM_p<62, (outs), (ins vsrprc:$XTp, memri34:$D_RA), 1081*81ad6265SDimitry Andric (ins vsrprc:$XTp, memri34_pcrel:$D_RA), 1082*81ad6265SDimitry Andric "pstxvp $XTp, $D_RA", IIC_LdStLFD>; 1083*81ad6265SDimitry Andric} 1084*81ad6265SDimitry Andric 1085*81ad6265SDimitry Andriclet Predicates = [PairedVectorMemops] in { 1086*81ad6265SDimitry Andric // Intrinsics for Paired Vector Loads. 1087*81ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp DQForm:$src)), (LXVP memrix16:$src)>; 1088*81ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp XForm:$src)), (LXVPX XForm:$src)>; 1089*81ad6265SDimitry Andric let Predicates = [PairedVectorMemops, PrefixInstrs] in { 1090*81ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp PDForm:$src)), (PLXVP memri34:$src)>; 1091*81ad6265SDimitry Andric } 1092*81ad6265SDimitry Andric // Intrinsics for Paired Vector Stores. 1093*81ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, DQForm:$dst), 1094*81ad6265SDimitry Andric (STXVP $XSp, memrix16:$dst)>; 1095*81ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, XForm:$dst), 1096*81ad6265SDimitry Andric (STXVPX $XSp, XForm:$dst)>; 1097*81ad6265SDimitry Andric let Predicates = [PairedVectorMemops, PrefixInstrs] in { 1098*81ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, PDForm:$dst), 1099*81ad6265SDimitry Andric (PSTXVP $XSp, memri34:$dst)>; 1100*81ad6265SDimitry Andric } 1101*81ad6265SDimitry Andric} 1102*81ad6265SDimitry Andric 1103*81ad6265SDimitry Andriclet Predicates = [PCRelativeMemops] in { 1104*81ad6265SDimitry Andric // Load i32 1105*81ad6265SDimitry Andric def : Pat<(i32 (zextloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 1106*81ad6265SDimitry Andric (PLBZpc $ga, 0)>; 1107*81ad6265SDimitry Andric def : Pat<(i32 (extloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 1108*81ad6265SDimitry Andric (PLBZpc $ga, 0)>; 1109*81ad6265SDimitry Andric def : Pat<(i32 (zextloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 1110*81ad6265SDimitry Andric (PLBZpc $ga, 0)>; 1111*81ad6265SDimitry Andric def : Pat<(i32 (extloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 1112*81ad6265SDimitry Andric (PLBZpc $ga, 0)>; 1113*81ad6265SDimitry Andric def : Pat<(i32 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 1114*81ad6265SDimitry Andric (PLHApc $ga, 0)>; 1115*81ad6265SDimitry Andric def : Pat<(i32 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 1116*81ad6265SDimitry Andric (PLHZpc $ga, 0)>; 1117*81ad6265SDimitry Andric def : Pat<(i32 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 1118*81ad6265SDimitry Andric (PLHZpc $ga, 0)>; 1119*81ad6265SDimitry Andric def : Pat<(i32 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLWZpc $ga, 0)>; 1120*81ad6265SDimitry Andric 1121*81ad6265SDimitry Andric // Store i32 1122*81ad6265SDimitry Andric def : Pat<(truncstorei8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1123*81ad6265SDimitry Andric (PSTBpc $RS, $ga, 0)>; 1124*81ad6265SDimitry Andric def : Pat<(truncstorei16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1125*81ad6265SDimitry Andric (PSTHpc $RS, $ga, 0)>; 1126*81ad6265SDimitry Andric def : Pat<(store i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1127*81ad6265SDimitry Andric (PSTWpc $RS, $ga, 0)>; 1128*81ad6265SDimitry Andric 1129*81ad6265SDimitry Andric // Load i64 1130*81ad6265SDimitry Andric def : Pat<(i64 (zextloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 1131*81ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 1132*81ad6265SDimitry Andric def : Pat<(i64 (extloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 1133*81ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 1134*81ad6265SDimitry Andric def : Pat<(i64 (zextloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 1135*81ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 1136*81ad6265SDimitry Andric def : Pat<(i64 (extloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 1137*81ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 1138*81ad6265SDimitry Andric def : Pat<(i64 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 1139*81ad6265SDimitry Andric (PLHA8pc $ga, 0)>; 1140*81ad6265SDimitry Andric def : Pat<(i64 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 1141*81ad6265SDimitry Andric (PLHZ8pc $ga, 0)>; 1142*81ad6265SDimitry Andric def : Pat<(i64 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 1143*81ad6265SDimitry Andric (PLHZ8pc $ga, 0)>; 1144*81ad6265SDimitry Andric def : Pat<(i64 (zextloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 1145*81ad6265SDimitry Andric (PLWZ8pc $ga, 0)>; 1146*81ad6265SDimitry Andric def : Pat<(i64 (sextloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 1147*81ad6265SDimitry Andric (PLWA8pc $ga, 0)>; 1148*81ad6265SDimitry Andric def : Pat<(i64 (extloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 1149*81ad6265SDimitry Andric (PLWZ8pc $ga, 0)>; 1150*81ad6265SDimitry Andric def : Pat<(i64 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLDpc $ga, 0)>; 1151*81ad6265SDimitry Andric 1152*81ad6265SDimitry Andric // Store i64 1153*81ad6265SDimitry Andric def : Pat<(truncstorei8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1154*81ad6265SDimitry Andric (PSTB8pc $RS, $ga, 0)>; 1155*81ad6265SDimitry Andric def : Pat<(truncstorei16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1156*81ad6265SDimitry Andric (PSTH8pc $RS, $ga, 0)>; 1157*81ad6265SDimitry Andric def : Pat<(truncstorei32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1158*81ad6265SDimitry Andric (PSTW8pc $RS, $ga, 0)>; 1159*81ad6265SDimitry Andric def : Pat<(store i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1160*81ad6265SDimitry Andric (PSTDpc $RS, $ga, 0)>; 1161*81ad6265SDimitry Andric 1162*81ad6265SDimitry Andric // Load f32 1163*81ad6265SDimitry Andric def : Pat<(f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFSpc $addr, 0)>; 1164*81ad6265SDimitry Andric 1165*81ad6265SDimitry Andric // Store f32 1166*81ad6265SDimitry Andric def : Pat<(store f32:$FRS, (PPCmatpcreladdr PCRelForm:$ga)), 1167*81ad6265SDimitry Andric (PSTFSpc $FRS, $ga, 0)>; 1168*81ad6265SDimitry Andric 1169*81ad6265SDimitry Andric // Load f64 1170*81ad6265SDimitry Andric def : Pat<(f64 (extloadf32 (PPCmatpcreladdr PCRelForm:$addr))), 1171*81ad6265SDimitry Andric (COPY_TO_REGCLASS (PLFSpc $addr, 0), VSFRC)>; 1172*81ad6265SDimitry Andric def : Pat<(f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFDpc $addr, 0)>; 1173*81ad6265SDimitry Andric 1174*81ad6265SDimitry Andric // Store f64 1175*81ad6265SDimitry Andric def : Pat<(store f64:$FRS, (PPCmatpcreladdr PCRelForm:$ga)), 1176*81ad6265SDimitry Andric (PSTFDpc $FRS, $ga, 0)>; 1177*81ad6265SDimitry Andric 1178*81ad6265SDimitry Andric // Load f128 1179*81ad6265SDimitry Andric def : Pat<(f128 (load (PPCmatpcreladdr PCRelForm:$addr))), 1180*81ad6265SDimitry Andric (COPY_TO_REGCLASS (PLXVpc $addr, 0), VRRC)>; 1181*81ad6265SDimitry Andric 1182*81ad6265SDimitry Andric // Store f128 1183*81ad6265SDimitry Andric def : Pat<(store f128:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 1184*81ad6265SDimitry Andric (PSTXVpc (COPY_TO_REGCLASS $XS, VSRC), $ga, 0)>; 1185*81ad6265SDimitry Andric 1186*81ad6265SDimitry Andric // Load v4i32 1187*81ad6265SDimitry Andric def : Pat<(v4i32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 1188*81ad6265SDimitry Andric 1189*81ad6265SDimitry Andric // Store v4i32 1190*81ad6265SDimitry Andric def : Pat<(store v4i32:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 1191*81ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 1192*81ad6265SDimitry Andric 1193*81ad6265SDimitry Andric // Load v2i64 1194*81ad6265SDimitry Andric def : Pat<(v2i64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 1195*81ad6265SDimitry Andric 1196*81ad6265SDimitry Andric // Store v2i64 1197*81ad6265SDimitry Andric def : Pat<(store v2i64:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 1198*81ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 1199*81ad6265SDimitry Andric 1200*81ad6265SDimitry Andric // Load v4f32 1201*81ad6265SDimitry Andric def : Pat<(v4f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 1202*81ad6265SDimitry Andric 1203*81ad6265SDimitry Andric // Store v4f32 1204*81ad6265SDimitry Andric def : Pat<(store v4f32:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 1205*81ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 1206*81ad6265SDimitry Andric 1207*81ad6265SDimitry Andric // Load v2f64 1208*81ad6265SDimitry Andric def : Pat<(v2f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 1209*81ad6265SDimitry Andric 1210*81ad6265SDimitry Andric // Store v2f64 1211*81ad6265SDimitry Andric def : Pat<(store v2f64:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 1212*81ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 1213*81ad6265SDimitry Andric 1214*81ad6265SDimitry Andric // Atomic Load 1215*81ad6265SDimitry Andric def : Pat<(atomic_load_8 (PPCmatpcreladdr PCRelForm:$ga)), 1216*81ad6265SDimitry Andric (PLBZpc $ga, 0)>; 1217*81ad6265SDimitry Andric def : Pat<(atomic_load_16 (PPCmatpcreladdr PCRelForm:$ga)), 1218*81ad6265SDimitry Andric (PLHZpc $ga, 0)>; 1219*81ad6265SDimitry Andric def : Pat<(atomic_load_32 (PPCmatpcreladdr PCRelForm:$ga)), 1220*81ad6265SDimitry Andric (PLWZpc $ga, 0)>; 1221*81ad6265SDimitry Andric def : Pat<(atomic_load_64 (PPCmatpcreladdr PCRelForm:$ga)), 1222*81ad6265SDimitry Andric (PLDpc $ga, 0)>; 1223*81ad6265SDimitry Andric 1224*81ad6265SDimitry Andric // Atomic Store 1225*81ad6265SDimitry Andric def : Pat<(atomic_store_8 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 1226*81ad6265SDimitry Andric (PSTBpc $RS, $ga, 0)>; 1227*81ad6265SDimitry Andric def : Pat<(atomic_store_16 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 1228*81ad6265SDimitry Andric (PSTHpc $RS, $ga, 0)>; 1229*81ad6265SDimitry Andric def : Pat<(atomic_store_32 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 1230*81ad6265SDimitry Andric (PSTWpc $RS, $ga, 0)>; 1231*81ad6265SDimitry Andric def : Pat<(atomic_store_8 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 1232*81ad6265SDimitry Andric (PSTB8pc $RS, $ga, 0)>; 1233*81ad6265SDimitry Andric def : Pat<(atomic_store_16 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 1234*81ad6265SDimitry Andric (PSTH8pc $RS, $ga, 0)>; 1235*81ad6265SDimitry Andric def : Pat<(atomic_store_32 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 1236*81ad6265SDimitry Andric (PSTW8pc $RS, $ga, 0)>; 1237*81ad6265SDimitry Andric def : Pat<(atomic_store_64 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 1238*81ad6265SDimitry Andric (PSTDpc $RS, $ga, 0)>; 1239*81ad6265SDimitry Andric 1240*81ad6265SDimitry Andric // Special Cases For PPCstore_scal_int_from_vsr 1241*81ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 1242*81ad6265SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), 1243*81ad6265SDimitry Andric (PPCmatpcreladdr PCRelForm:$dst), 8), 1244*81ad6265SDimitry Andric (PSTXSDpc (XSCVDPSXDS f64:$src), $dst, 0)>; 1245*81ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 1246*81ad6265SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), 1247*81ad6265SDimitry Andric (PPCmatpcreladdr PCRelForm:$dst), 8), 1248*81ad6265SDimitry Andric (PSTXSDpc (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), $dst, 0)>; 1249*81ad6265SDimitry Andric 1250*81ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 1251*81ad6265SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), 1252*81ad6265SDimitry Andric (PPCmatpcreladdr PCRelForm:$dst), 8), 1253*81ad6265SDimitry Andric (PSTXSDpc (XSCVDPUXDS f64:$src), $dst, 0)>; 1254*81ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 1255*81ad6265SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), 1256*81ad6265SDimitry Andric (PPCmatpcreladdr PCRelForm:$dst), 8), 1257*81ad6265SDimitry Andric (PSTXSDpc (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), $dst, 0)>; 1258*81ad6265SDimitry Andric 1259*81ad6265SDimitry Andric def : Pat<(v4f32 (PPCldvsxlh (PPCmatpcreladdr PCRelForm:$addr))), 1260*81ad6265SDimitry Andric (SUBREG_TO_REG (i64 1), (PLFDpc $addr, 0), sub_64)>; 1261*81ad6265SDimitry Andric 1262*81ad6265SDimitry Andric // If the PPCmatpcreladdr node is not caught by any other pattern it should be 1263*81ad6265SDimitry Andric // caught here and turned into a paddi instruction to materialize the address. 1264*81ad6265SDimitry Andric def : Pat<(PPCmatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>; 1265*81ad6265SDimitry Andric // PPCtlsdynamatpcreladdr node is used for TLS dynamic models to materialize 1266*81ad6265SDimitry Andric // tls global address with paddi instruction. 1267*81ad6265SDimitry Andric def : Pat<(PPCtlsdynamatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>; 1268*81ad6265SDimitry Andric // PPCtlslocalexecmataddr node is used for TLS local exec models to 1269*81ad6265SDimitry Andric // materialize tls global address with paddi instruction. 1270*81ad6265SDimitry Andric def : Pat<(PPCaddTls i64:$in, (PPCtlslocalexecmataddr tglobaltlsaddr:$addr)), 1271*81ad6265SDimitry Andric (PADDI8 $in, $addr)>; 1272*81ad6265SDimitry Andric} 1273*81ad6265SDimitry Andric 1274*81ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 1275*81ad6265SDimitry Andric def XXPERMX : 1276*81ad6265SDimitry Andric 8RR_XX4Form_IMM3_XTABC6<34, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 1277*81ad6265SDimitry Andric vsrc:$XC, u3imm:$UIM), 1278*81ad6265SDimitry Andric "xxpermx $XT, $XA, $XB, $XC, $UIM", 1279*81ad6265SDimitry Andric IIC_VecPerm, []>; 1280*81ad6265SDimitry Andric def XXBLENDVB : 1281*81ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 1282*81ad6265SDimitry Andric vsrc:$XC), "xxblendvb $XT, $XA, $XB, $XC", 1283*81ad6265SDimitry Andric IIC_VecGeneral, []>; 1284*81ad6265SDimitry Andric def XXBLENDVH : 1285*81ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 1286*81ad6265SDimitry Andric vsrc:$XC), "xxblendvh $XT, $XA, $XB, $XC", 1287*81ad6265SDimitry Andric IIC_VecGeneral, []>; 1288*81ad6265SDimitry Andric def XXBLENDVW : 1289*81ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 2, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 1290*81ad6265SDimitry Andric vsrc:$XC), "xxblendvw $XT, $XA, $XB, $XC", 1291*81ad6265SDimitry Andric IIC_VecGeneral, []>; 1292*81ad6265SDimitry Andric def XXBLENDVD : 1293*81ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 3, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 1294*81ad6265SDimitry Andric vsrc:$XC), "xxblendvd $XT, $XA, $XB, $XC", 1295*81ad6265SDimitry Andric IIC_VecGeneral, []>; 1296*81ad6265SDimitry Andric} 1297*81ad6265SDimitry Andric 1298*81ad6265SDimitry Andric// XXSPLTIW/DP/32DX need extra flags to make sure the compiler does not attempt 1299*81ad6265SDimitry Andric// to spill part of the instruction when the values are similar. 1300*81ad6265SDimitry Andriclet isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1, Predicates = [PrefixInstrs] in { 1301*81ad6265SDimitry Andric def XXSPLTIW : 8RR_DForm_IMM32_XT6<32, 3, (outs vsrc:$XT), 1302*81ad6265SDimitry Andric (ins i32imm:$IMM32), 1303*81ad6265SDimitry Andric "xxspltiw $XT, $IMM32", IIC_VecGeneral, 1304*81ad6265SDimitry Andric []>; 1305*81ad6265SDimitry Andric def XXSPLTIDP : 8RR_DForm_IMM32_XT6<32, 2, (outs vsrc:$XT), 1306*81ad6265SDimitry Andric (ins i32imm:$IMM32), 1307*81ad6265SDimitry Andric "xxspltidp $XT, $IMM32", IIC_VecGeneral, 1308*81ad6265SDimitry Andric [(set v2f64:$XT, 1309*81ad6265SDimitry Andric (PPCxxspltidp i32:$IMM32))]>; 1310*81ad6265SDimitry Andric def XXSPLTI32DX : 1311*81ad6265SDimitry Andric 8RR_DForm_IMM32_XT6_IX<32, 0, (outs vsrc:$XT), 1312*81ad6265SDimitry Andric (ins vsrc:$XTi, u1imm:$IX, i32imm:$IMM32), 1313*81ad6265SDimitry Andric "xxsplti32dx $XT, $IX, $IMM32", IIC_VecGeneral, 1314*81ad6265SDimitry Andric [(set v2i64:$XT, 1315*81ad6265SDimitry Andric (PPCxxsplti32dx v2i64:$XTi, i32:$IX, 1316*81ad6265SDimitry Andric i32:$IMM32))]>, 1317*81ad6265SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">; 1318*81ad6265SDimitry Andric} 1319*81ad6265SDimitry Andric 1320*81ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 1321*81ad6265SDimitry Andric def SETBC : XForm_XT5_BI5<31, 384, (outs gprc:$RT), (ins crbitrc:$BI), 1322*81ad6265SDimitry Andric "setbc $RT, $BI", IIC_IntCompare, []>; 1323*81ad6265SDimitry Andric def SETBCR : XForm_XT5_BI5<31, 416, (outs gprc:$RT), (ins crbitrc:$BI), 1324*81ad6265SDimitry Andric "setbcr $RT, $BI", IIC_IntCompare, []>; 1325*81ad6265SDimitry Andric def SETNBC : XForm_XT5_BI5<31, 448, (outs gprc:$RT), (ins crbitrc:$BI), 1326*81ad6265SDimitry Andric "setnbc $RT, $BI", IIC_IntCompare, []>; 1327*81ad6265SDimitry Andric def SETNBCR : XForm_XT5_BI5<31, 480, (outs gprc:$RT), (ins crbitrc:$BI), 1328*81ad6265SDimitry Andric "setnbcr $RT, $BI", IIC_IntCompare, []>; 1329*81ad6265SDimitry Andric 1330*81ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 1331*81ad6265SDimitry Andric def SETBC8 : XForm_XT5_BI5<31, 384, (outs g8rc:$RT), (ins crbitrc:$BI), 1332*81ad6265SDimitry Andric "setbc $RT, $BI", IIC_IntCompare, []>; 1333*81ad6265SDimitry Andric def SETBCR8 : XForm_XT5_BI5<31, 416, (outs g8rc:$RT), (ins crbitrc:$BI), 1334*81ad6265SDimitry Andric "setbcr $RT, $BI", IIC_IntCompare, []>; 1335*81ad6265SDimitry Andric def SETNBC8 : XForm_XT5_BI5<31, 448, (outs g8rc:$RT), (ins crbitrc:$BI), 1336*81ad6265SDimitry Andric "setnbc $RT, $BI", IIC_IntCompare, []>; 1337*81ad6265SDimitry Andric def SETNBCR8 : XForm_XT5_BI5<31, 480, (outs g8rc:$RT), (ins crbitrc:$BI), 1338*81ad6265SDimitry Andric "setnbcr $RT, $BI", IIC_IntCompare, []>; 1339*81ad6265SDimitry Andric } 1340*81ad6265SDimitry Andric 1341*81ad6265SDimitry Andric def VSLDBI : VNForm_VTAB5_SD3<22, 0, (outs vrrc:$VRT), 1342*81ad6265SDimitry Andric (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SH), 1343*81ad6265SDimitry Andric "vsldbi $VRT, $VRA, $VRB, $SH", 1344*81ad6265SDimitry Andric IIC_VecGeneral, 1345*81ad6265SDimitry Andric [(set v16i8:$VRT, 1346*81ad6265SDimitry Andric (int_ppc_altivec_vsldbi v16i8:$VRA, 1347*81ad6265SDimitry Andric v16i8:$VRB, 1348*81ad6265SDimitry Andric timm:$SH))]>; 1349*81ad6265SDimitry Andric def VSRDBI : VNForm_VTAB5_SD3<22, 1, (outs vrrc:$VRT), 1350*81ad6265SDimitry Andric (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SH), 1351*81ad6265SDimitry Andric "vsrdbi $VRT, $VRA, $VRB, $SH", 1352*81ad6265SDimitry Andric IIC_VecGeneral, 1353*81ad6265SDimitry Andric [(set v16i8:$VRT, 1354*81ad6265SDimitry Andric (int_ppc_altivec_vsrdbi v16i8:$VRA, 1355*81ad6265SDimitry Andric v16i8:$VRB, 1356*81ad6265SDimitry Andric timm:$SH))]>; 1357*81ad6265SDimitry Andric defm VSTRIBR : VXForm_VTB5_RCr<13, 1, (outs vrrc:$vT), (ins vrrc:$vB), 1358*81ad6265SDimitry Andric "vstribr", "$vT, $vB", IIC_VecGeneral, 1359*81ad6265SDimitry Andric [(set v16i8:$vT, 1360*81ad6265SDimitry Andric (int_ppc_altivec_vstribr v16i8:$vB))]>; 1361*81ad6265SDimitry Andric defm VSTRIBL : VXForm_VTB5_RCr<13, 0, (outs vrrc:$vT), (ins vrrc:$vB), 1362*81ad6265SDimitry Andric "vstribl", "$vT, $vB", IIC_VecGeneral, 1363*81ad6265SDimitry Andric [(set v16i8:$vT, 1364*81ad6265SDimitry Andric (int_ppc_altivec_vstribl v16i8:$vB))]>; 1365*81ad6265SDimitry Andric defm VSTRIHR : VXForm_VTB5_RCr<13, 3, (outs vrrc:$vT), (ins vrrc:$vB), 1366*81ad6265SDimitry Andric "vstrihr", "$vT, $vB", IIC_VecGeneral, 1367*81ad6265SDimitry Andric [(set v8i16:$vT, 1368*81ad6265SDimitry Andric (int_ppc_altivec_vstrihr v8i16:$vB))]>; 1369*81ad6265SDimitry Andric defm VSTRIHL : VXForm_VTB5_RCr<13, 2, (outs vrrc:$vT), (ins vrrc:$vB), 1370*81ad6265SDimitry Andric "vstrihl", "$vT, $vB", IIC_VecGeneral, 1371*81ad6265SDimitry Andric [(set v8i16:$vT, 1372*81ad6265SDimitry Andric (int_ppc_altivec_vstrihl v8i16:$vB))]>; 1373*81ad6265SDimitry Andric def VINSW : 1374*81ad6265SDimitry Andric VXForm_1<207, (outs vrrc:$vD), (ins vrrc:$vDi, u4imm:$UIM, gprc:$rB), 1375*81ad6265SDimitry Andric "vinsw $vD, $rB, $UIM", IIC_VecGeneral, 1376*81ad6265SDimitry Andric [(set v4i32:$vD, 1377*81ad6265SDimitry Andric (int_ppc_altivec_vinsw v4i32:$vDi, i32:$rB, timm:$UIM))]>, 1378*81ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 1379*81ad6265SDimitry Andric def VINSD : 1380*81ad6265SDimitry Andric VXForm_1<463, (outs vrrc:$vD), (ins vrrc:$vDi, u4imm:$UIM, g8rc:$rB), 1381*81ad6265SDimitry Andric "vinsd $vD, $rB, $UIM", IIC_VecGeneral, 1382*81ad6265SDimitry Andric [(set v2i64:$vD, 1383*81ad6265SDimitry Andric (int_ppc_altivec_vinsd v2i64:$vDi, i64:$rB, timm:$UIM))]>, 1384*81ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 1385*81ad6265SDimitry Andric def VINSBVLX : 1386*81ad6265SDimitry Andric VXForm_VTB5_RA5_ins<15, "vinsbvlx", 1387*81ad6265SDimitry Andric [(set v16i8:$vD, 1388*81ad6265SDimitry Andric (int_ppc_altivec_vinsbvlx v16i8:$vDi, i32:$rA, 1389*81ad6265SDimitry Andric v16i8:$vB))]>; 1390*81ad6265SDimitry Andric def VINSBVRX : 1391*81ad6265SDimitry Andric VXForm_VTB5_RA5_ins<271, "vinsbvrx", 1392*81ad6265SDimitry Andric [(set v16i8:$vD, 1393*81ad6265SDimitry Andric (int_ppc_altivec_vinsbvrx v16i8:$vDi, i32:$rA, 1394*81ad6265SDimitry Andric v16i8:$vB))]>; 1395*81ad6265SDimitry Andric def VINSHVLX : 1396*81ad6265SDimitry Andric VXForm_VTB5_RA5_ins<79, "vinshvlx", 1397*81ad6265SDimitry Andric [(set v8i16:$vD, 1398*81ad6265SDimitry Andric (int_ppc_altivec_vinshvlx v8i16:$vDi, i32:$rA, 1399*81ad6265SDimitry Andric v8i16:$vB))]>; 1400*81ad6265SDimitry Andric def VINSHVRX : 1401*81ad6265SDimitry Andric VXForm_VTB5_RA5_ins<335, "vinshvrx", 1402*81ad6265SDimitry Andric [(set v8i16:$vD, 1403*81ad6265SDimitry Andric (int_ppc_altivec_vinshvrx v8i16:$vDi, i32:$rA, 1404*81ad6265SDimitry Andric v8i16:$vB))]>; 1405*81ad6265SDimitry Andric def VINSWVLX : 1406*81ad6265SDimitry Andric VXForm_VTB5_RA5_ins<143, "vinswvlx", 1407*81ad6265SDimitry Andric [(set v4i32:$vD, 1408*81ad6265SDimitry Andric (int_ppc_altivec_vinswvlx v4i32:$vDi, i32:$rA, 1409*81ad6265SDimitry Andric v4i32:$vB))]>; 1410*81ad6265SDimitry Andric def VINSWVRX : 1411*81ad6265SDimitry Andric VXForm_VTB5_RA5_ins<399, "vinswvrx", 1412*81ad6265SDimitry Andric [(set v4i32:$vD, 1413*81ad6265SDimitry Andric (int_ppc_altivec_vinswvrx v4i32:$vDi, i32:$rA, 1414*81ad6265SDimitry Andric v4i32:$vB))]>; 1415*81ad6265SDimitry Andric def VINSBLX : 1416*81ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<527, "vinsblx", 1417*81ad6265SDimitry Andric [(set v16i8:$vD, 1418*81ad6265SDimitry Andric (int_ppc_altivec_vinsblx v16i8:$vDi, i32:$rA, 1419*81ad6265SDimitry Andric i32:$rB))]>; 1420*81ad6265SDimitry Andric def VINSBRX : 1421*81ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<783, "vinsbrx", 1422*81ad6265SDimitry Andric [(set v16i8:$vD, 1423*81ad6265SDimitry Andric (int_ppc_altivec_vinsbrx v16i8:$vDi, i32:$rA, 1424*81ad6265SDimitry Andric i32:$rB))]>; 1425*81ad6265SDimitry Andric def VINSHLX : 1426*81ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<591, "vinshlx", 1427*81ad6265SDimitry Andric [(set v8i16:$vD, 1428*81ad6265SDimitry Andric (int_ppc_altivec_vinshlx v8i16:$vDi, i32:$rA, 1429*81ad6265SDimitry Andric i32:$rB))]>; 1430*81ad6265SDimitry Andric def VINSHRX : 1431*81ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<847, "vinshrx", 1432*81ad6265SDimitry Andric [(set v8i16:$vD, 1433*81ad6265SDimitry Andric (int_ppc_altivec_vinshrx v8i16:$vDi, i32:$rA, 1434*81ad6265SDimitry Andric i32:$rB))]>; 1435*81ad6265SDimitry Andric def VINSWLX : 1436*81ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<655, "vinswlx", 1437*81ad6265SDimitry Andric [(set v4i32:$vD, 1438*81ad6265SDimitry Andric (int_ppc_altivec_vinswlx v4i32:$vDi, i32:$rA, 1439*81ad6265SDimitry Andric i32:$rB))]>; 1440*81ad6265SDimitry Andric def VINSWRX : 1441*81ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<911, "vinswrx", 1442*81ad6265SDimitry Andric [(set v4i32:$vD, 1443*81ad6265SDimitry Andric (int_ppc_altivec_vinswrx v4i32:$vDi, i32:$rA, 1444*81ad6265SDimitry Andric i32:$rB))]>; 1445*81ad6265SDimitry Andric def VINSDLX : 1446*81ad6265SDimitry Andric VXForm_1<719, (outs vrrc:$vD), (ins vrrc:$vDi, g8rc:$rA, g8rc:$rB), 1447*81ad6265SDimitry Andric "vinsdlx $vD, $rA, $rB", IIC_VecGeneral, 1448*81ad6265SDimitry Andric [(set v2i64:$vD, 1449*81ad6265SDimitry Andric (int_ppc_altivec_vinsdlx v2i64:$vDi, i64:$rA, i64:$rB))]>, 1450*81ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 1451*81ad6265SDimitry Andric def VINSDRX : 1452*81ad6265SDimitry Andric VXForm_1<975, (outs vrrc:$vD), (ins vrrc:$vDi, g8rc:$rA, g8rc:$rB), 1453*81ad6265SDimitry Andric "vinsdrx $vD, $rA, $rB", IIC_VecGeneral, 1454*81ad6265SDimitry Andric [(set v2i64:$vD, 1455*81ad6265SDimitry Andric (int_ppc_altivec_vinsdrx v2i64:$vDi, i64:$rA, i64:$rB))]>, 1456*81ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 1457*81ad6265SDimitry Andric def VEXTRACTBM : VXForm_RD5_XO5_RS5<1602, 8, (outs gprc:$rD), (ins vrrc:$vB), 1458*81ad6265SDimitry Andric "vextractbm $rD, $vB", IIC_VecGeneral, 1459*81ad6265SDimitry Andric [(set i32:$rD, 1460*81ad6265SDimitry Andric (int_ppc_altivec_vextractbm v16i8:$vB))]>; 1461*81ad6265SDimitry Andric def VEXTRACTHM : VXForm_RD5_XO5_RS5<1602, 9, (outs gprc:$rD), (ins vrrc:$vB), 1462*81ad6265SDimitry Andric "vextracthm $rD, $vB", IIC_VecGeneral, 1463*81ad6265SDimitry Andric [(set i32:$rD, 1464*81ad6265SDimitry Andric (int_ppc_altivec_vextracthm v8i16:$vB))]>; 1465*81ad6265SDimitry Andric def VEXTRACTWM : VXForm_RD5_XO5_RS5<1602, 10, (outs gprc:$rD), (ins vrrc:$vB), 1466*81ad6265SDimitry Andric "vextractwm $rD, $vB", IIC_VecGeneral, 1467*81ad6265SDimitry Andric [(set i32:$rD, 1468*81ad6265SDimitry Andric (int_ppc_altivec_vextractwm v4i32:$vB))]>; 1469*81ad6265SDimitry Andric def VEXTRACTDM : VXForm_RD5_XO5_RS5<1602, 11, (outs gprc:$rD), (ins vrrc:$vB), 1470*81ad6265SDimitry Andric "vextractdm $rD, $vB", IIC_VecGeneral, 1471*81ad6265SDimitry Andric [(set i32:$rD, 1472*81ad6265SDimitry Andric (int_ppc_altivec_vextractdm v2i64:$vB))]>; 1473*81ad6265SDimitry Andric def VEXTRACTQM : VXForm_RD5_XO5_RS5<1602, 12, (outs gprc:$rD), (ins vrrc:$vB), 1474*81ad6265SDimitry Andric "vextractqm $rD, $vB", IIC_VecGeneral, 1475*81ad6265SDimitry Andric [(set i32:$rD, 1476*81ad6265SDimitry Andric (int_ppc_altivec_vextractqm v1i128:$vB))]>; 1477*81ad6265SDimitry Andric def VEXPANDBM : VXForm_RD5_XO5_RS5<1602, 0, (outs vrrc:$vD), (ins vrrc:$vB), 1478*81ad6265SDimitry Andric "vexpandbm $vD, $vB", IIC_VecGeneral, 1479*81ad6265SDimitry Andric [(set v16i8:$vD, (int_ppc_altivec_vexpandbm 1480*81ad6265SDimitry Andric v16i8:$vB))]>; 1481*81ad6265SDimitry Andric def VEXPANDHM : VXForm_RD5_XO5_RS5<1602, 1, (outs vrrc:$vD), (ins vrrc:$vB), 1482*81ad6265SDimitry Andric "vexpandhm $vD, $vB", IIC_VecGeneral, 1483*81ad6265SDimitry Andric [(set v8i16:$vD, (int_ppc_altivec_vexpandhm 1484*81ad6265SDimitry Andric v8i16:$vB))]>; 1485*81ad6265SDimitry Andric def VEXPANDWM : VXForm_RD5_XO5_RS5<1602, 2, (outs vrrc:$vD), (ins vrrc:$vB), 1486*81ad6265SDimitry Andric "vexpandwm $vD, $vB", IIC_VecGeneral, 1487*81ad6265SDimitry Andric [(set v4i32:$vD, (int_ppc_altivec_vexpandwm 1488*81ad6265SDimitry Andric v4i32:$vB))]>; 1489*81ad6265SDimitry Andric def VEXPANDDM : VXForm_RD5_XO5_RS5<1602, 3, (outs vrrc:$vD), (ins vrrc:$vB), 1490*81ad6265SDimitry Andric "vexpanddm $vD, $vB", IIC_VecGeneral, 1491*81ad6265SDimitry Andric [(set v2i64:$vD, (int_ppc_altivec_vexpanddm 1492*81ad6265SDimitry Andric v2i64:$vB))]>; 1493*81ad6265SDimitry Andric def VEXPANDQM : VXForm_RD5_XO5_RS5<1602, 4, (outs vrrc:$vD), (ins vrrc:$vB), 1494*81ad6265SDimitry Andric "vexpandqm $vD, $vB", IIC_VecGeneral, 1495*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vexpandqm 1496*81ad6265SDimitry Andric v1i128:$vB))]>; 1497*81ad6265SDimitry Andric def MTVSRBM : VXForm_RD5_XO5_RS5<1602, 16, (outs vrrc:$vD), (ins g8rc:$rB), 1498*81ad6265SDimitry Andric "mtvsrbm $vD, $rB", IIC_VecGeneral, 1499*81ad6265SDimitry Andric [(set v16i8:$vD, 1500*81ad6265SDimitry Andric (int_ppc_altivec_mtvsrbm i64:$rB))]>; 1501*81ad6265SDimitry Andric def MTVSRHM : VXForm_RD5_XO5_RS5<1602, 17, (outs vrrc:$vD), (ins g8rc:$rB), 1502*81ad6265SDimitry Andric "mtvsrhm $vD, $rB", IIC_VecGeneral, 1503*81ad6265SDimitry Andric [(set v8i16:$vD, 1504*81ad6265SDimitry Andric (int_ppc_altivec_mtvsrhm i64:$rB))]>; 1505*81ad6265SDimitry Andric def MTVSRWM : VXForm_RD5_XO5_RS5<1602, 18, (outs vrrc:$vD), (ins g8rc:$rB), 1506*81ad6265SDimitry Andric "mtvsrwm $vD, $rB", IIC_VecGeneral, 1507*81ad6265SDimitry Andric [(set v4i32:$vD, 1508*81ad6265SDimitry Andric (int_ppc_altivec_mtvsrwm i64:$rB))]>; 1509*81ad6265SDimitry Andric def MTVSRDM : VXForm_RD5_XO5_RS5<1602, 19, (outs vrrc:$vD), (ins g8rc:$rB), 1510*81ad6265SDimitry Andric "mtvsrdm $vD, $rB", IIC_VecGeneral, 1511*81ad6265SDimitry Andric [(set v2i64:$vD, 1512*81ad6265SDimitry Andric (int_ppc_altivec_mtvsrdm i64:$rB))]>; 1513*81ad6265SDimitry Andric def MTVSRQM : VXForm_RD5_XO5_RS5<1602, 20, (outs vrrc:$vD), (ins g8rc:$rB), 1514*81ad6265SDimitry Andric "mtvsrqm $vD, $rB", IIC_VecGeneral, 1515*81ad6265SDimitry Andric [(set v1i128:$vD, 1516*81ad6265SDimitry Andric (int_ppc_altivec_mtvsrqm i64:$rB))]>; 1517*81ad6265SDimitry Andric def MTVSRBMI : DXForm<4, 10, (outs vrrc:$vD), (ins u16imm64:$D), 1518*81ad6265SDimitry Andric "mtvsrbmi $vD, $D", IIC_VecGeneral, 1519*81ad6265SDimitry Andric [(set v16i8:$vD, 1520*81ad6265SDimitry Andric (int_ppc_altivec_mtvsrbm imm:$D))]>; 1521*81ad6265SDimitry Andric def VCNTMBB : VXForm_RD5_MP_VB5<1602, 12, (outs g8rc:$rD), 1522*81ad6265SDimitry Andric (ins vrrc:$vB, u1imm:$MP), 1523*81ad6265SDimitry Andric "vcntmbb $rD, $vB, $MP", IIC_VecGeneral, 1524*81ad6265SDimitry Andric [(set i64:$rD, (int_ppc_altivec_vcntmbb 1525*81ad6265SDimitry Andric v16i8:$vB, timm:$MP))]>; 1526*81ad6265SDimitry Andric def VCNTMBH : VXForm_RD5_MP_VB5<1602, 13, (outs g8rc:$rD), 1527*81ad6265SDimitry Andric (ins vrrc:$vB, u1imm:$MP), 1528*81ad6265SDimitry Andric "vcntmbh $rD, $vB, $MP", IIC_VecGeneral, 1529*81ad6265SDimitry Andric [(set i64:$rD, (int_ppc_altivec_vcntmbh 1530*81ad6265SDimitry Andric v8i16:$vB, timm:$MP))]>; 1531*81ad6265SDimitry Andric def VCNTMBW : VXForm_RD5_MP_VB5<1602, 14, (outs g8rc:$rD), 1532*81ad6265SDimitry Andric (ins vrrc:$vB, u1imm:$MP), 1533*81ad6265SDimitry Andric "vcntmbw $rD, $vB, $MP", IIC_VecGeneral, 1534*81ad6265SDimitry Andric [(set i64:$rD, (int_ppc_altivec_vcntmbw 1535*81ad6265SDimitry Andric v4i32:$vB, timm:$MP))]>; 1536*81ad6265SDimitry Andric def VCNTMBD : VXForm_RD5_MP_VB5<1602, 15, (outs g8rc:$rD), 1537*81ad6265SDimitry Andric (ins vrrc:$vB, u1imm:$MP), 1538*81ad6265SDimitry Andric "vcntmbd $rD, $vB, $MP", IIC_VecGeneral, 1539*81ad6265SDimitry Andric [(set i64:$rD, (int_ppc_altivec_vcntmbd 1540*81ad6265SDimitry Andric v2i64:$vB, timm:$MP))]>; 1541*81ad6265SDimitry Andric def VEXTDUBVLX : VAForm_1a<24, (outs vrrc:$vD), 1542*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 1543*81ad6265SDimitry Andric "vextdubvlx $vD, $vA, $vB, $rC", 1544*81ad6265SDimitry Andric IIC_VecGeneral, 1545*81ad6265SDimitry Andric [(set v2i64:$vD, 1546*81ad6265SDimitry Andric (int_ppc_altivec_vextdubvlx v16i8:$vA, 1547*81ad6265SDimitry Andric v16i8:$vB, 1548*81ad6265SDimitry Andric i32:$rC))]>; 1549*81ad6265SDimitry Andric def VEXTDUBVRX : VAForm_1a<25, (outs vrrc:$vD), 1550*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 1551*81ad6265SDimitry Andric "vextdubvrx $vD, $vA, $vB, $rC", 1552*81ad6265SDimitry Andric IIC_VecGeneral, 1553*81ad6265SDimitry Andric [(set v2i64:$vD, 1554*81ad6265SDimitry Andric (int_ppc_altivec_vextdubvrx v16i8:$vA, 1555*81ad6265SDimitry Andric v16i8:$vB, 1556*81ad6265SDimitry Andric i32:$rC))]>; 1557*81ad6265SDimitry Andric def VEXTDUHVLX : VAForm_1a<26, (outs vrrc:$vD), 1558*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 1559*81ad6265SDimitry Andric "vextduhvlx $vD, $vA, $vB, $rC", 1560*81ad6265SDimitry Andric IIC_VecGeneral, 1561*81ad6265SDimitry Andric [(set v2i64:$vD, 1562*81ad6265SDimitry Andric (int_ppc_altivec_vextduhvlx v8i16:$vA, 1563*81ad6265SDimitry Andric v8i16:$vB, 1564*81ad6265SDimitry Andric i32:$rC))]>; 1565*81ad6265SDimitry Andric def VEXTDUHVRX : VAForm_1a<27, (outs vrrc:$vD), 1566*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 1567*81ad6265SDimitry Andric "vextduhvrx $vD, $vA, $vB, $rC", 1568*81ad6265SDimitry Andric IIC_VecGeneral, 1569*81ad6265SDimitry Andric [(set v2i64:$vD, 1570*81ad6265SDimitry Andric (int_ppc_altivec_vextduhvrx v8i16:$vA, 1571*81ad6265SDimitry Andric v8i16:$vB, 1572*81ad6265SDimitry Andric i32:$rC))]>; 1573*81ad6265SDimitry Andric def VEXTDUWVLX : VAForm_1a<28, (outs vrrc:$vD), 1574*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 1575*81ad6265SDimitry Andric "vextduwvlx $vD, $vA, $vB, $rC", 1576*81ad6265SDimitry Andric IIC_VecGeneral, 1577*81ad6265SDimitry Andric [(set v2i64:$vD, 1578*81ad6265SDimitry Andric (int_ppc_altivec_vextduwvlx v4i32:$vA, 1579*81ad6265SDimitry Andric v4i32:$vB, 1580*81ad6265SDimitry Andric i32:$rC))]>; 1581*81ad6265SDimitry Andric def VEXTDUWVRX : VAForm_1a<29, (outs vrrc:$vD), 1582*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 1583*81ad6265SDimitry Andric "vextduwvrx $vD, $vA, $vB, $rC", 1584*81ad6265SDimitry Andric IIC_VecGeneral, 1585*81ad6265SDimitry Andric [(set v2i64:$vD, 1586*81ad6265SDimitry Andric (int_ppc_altivec_vextduwvrx v4i32:$vA, 1587*81ad6265SDimitry Andric v4i32:$vB, 1588*81ad6265SDimitry Andric i32:$rC))]>; 1589*81ad6265SDimitry Andric def VEXTDDVLX : VAForm_1a<30, (outs vrrc:$vD), 1590*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 1591*81ad6265SDimitry Andric "vextddvlx $vD, $vA, $vB, $rC", 1592*81ad6265SDimitry Andric IIC_VecGeneral, 1593*81ad6265SDimitry Andric [(set v2i64:$vD, 1594*81ad6265SDimitry Andric (int_ppc_altivec_vextddvlx v2i64:$vA, 1595*81ad6265SDimitry Andric v2i64:$vB, 1596*81ad6265SDimitry Andric i32:$rC))]>; 1597*81ad6265SDimitry Andric def VEXTDDVRX : VAForm_1a<31, (outs vrrc:$vD), 1598*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 1599*81ad6265SDimitry Andric "vextddvrx $vD, $vA, $vB, $rC", 1600*81ad6265SDimitry Andric IIC_VecGeneral, 1601*81ad6265SDimitry Andric [(set v2i64:$vD, 1602*81ad6265SDimitry Andric (int_ppc_altivec_vextddvrx v2i64:$vA, 1603*81ad6265SDimitry Andric v2i64:$vB, 1604*81ad6265SDimitry Andric i32:$rC))]>; 1605*81ad6265SDimitry Andric def VPDEPD : VXForm_1<1485, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1606*81ad6265SDimitry Andric "vpdepd $vD, $vA, $vB", IIC_VecGeneral, 1607*81ad6265SDimitry Andric [(set v2i64:$vD, 1608*81ad6265SDimitry Andric (int_ppc_altivec_vpdepd v2i64:$vA, v2i64:$vB))]>; 1609*81ad6265SDimitry Andric def VPEXTD : VXForm_1<1421, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1610*81ad6265SDimitry Andric "vpextd $vD, $vA, $vB", IIC_VecGeneral, 1611*81ad6265SDimitry Andric [(set v2i64:$vD, 1612*81ad6265SDimitry Andric (int_ppc_altivec_vpextd v2i64:$vA, v2i64:$vB))]>; 1613*81ad6265SDimitry Andric def PDEPD : XForm_6<31, 156, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 1614*81ad6265SDimitry Andric "pdepd $rA, $rS, $rB", IIC_IntGeneral, 1615*81ad6265SDimitry Andric [(set i64:$rA, (int_ppc_pdepd i64:$rS, i64:$rB))]>; 1616*81ad6265SDimitry Andric def PEXTD : XForm_6<31, 188, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 1617*81ad6265SDimitry Andric "pextd $rA, $rS, $rB", IIC_IntGeneral, 1618*81ad6265SDimitry Andric [(set i64:$rA, (int_ppc_pextd i64:$rS, i64:$rB))]>; 1619*81ad6265SDimitry Andric def VCFUGED : VXForm_1<1357, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1620*81ad6265SDimitry Andric "vcfuged $vD, $vA, $vB", IIC_VecGeneral, 1621*81ad6265SDimitry Andric [(set v2i64:$vD, 1622*81ad6265SDimitry Andric (int_ppc_altivec_vcfuged v2i64:$vA, v2i64:$vB))]>; 1623*81ad6265SDimitry Andric def VGNB : VXForm_RD5_N3_VB5<1228, (outs g8rc:$rD), (ins vrrc:$vB, u3imm:$N), 1624*81ad6265SDimitry Andric "vgnb $rD, $vB, $N", IIC_VecGeneral, 1625*81ad6265SDimitry Andric [(set i64:$rD, 1626*81ad6265SDimitry Andric (int_ppc_altivec_vgnb v1i128:$vB, timm:$N))]>; 1627*81ad6265SDimitry Andric def CFUGED : XForm_6<31, 220, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 1628*81ad6265SDimitry Andric "cfuged $rA, $rS, $rB", IIC_IntGeneral, 1629*81ad6265SDimitry Andric [(set i64:$rA, (int_ppc_cfuged i64:$rS, i64:$rB))]>; 1630*81ad6265SDimitry Andric def XXEVAL : 1631*81ad6265SDimitry Andric 8RR_XX4Form_IMM8_XTAB6<34, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 1632*81ad6265SDimitry Andric vsrc:$XC, u8imm:$IMM), 1633*81ad6265SDimitry Andric "xxeval $XT, $XA, $XB, $XC, $IMM", IIC_VecGeneral, 1634*81ad6265SDimitry Andric [(set v2i64:$XT, (int_ppc_vsx_xxeval v2i64:$XA, 1635*81ad6265SDimitry Andric v2i64:$XB, v2i64:$XC, timm:$IMM))]>; 1636*81ad6265SDimitry Andric def VCLZDM : VXForm_1<1924, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1637*81ad6265SDimitry Andric "vclzdm $vD, $vA, $vB", IIC_VecGeneral, 1638*81ad6265SDimitry Andric [(set v2i64:$vD, 1639*81ad6265SDimitry Andric (int_ppc_altivec_vclzdm v2i64:$vA, v2i64:$vB))]>; 1640*81ad6265SDimitry Andric def VCTZDM : VXForm_1<1988, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1641*81ad6265SDimitry Andric "vctzdm $vD, $vA, $vB", IIC_VecGeneral, 1642*81ad6265SDimitry Andric [(set v2i64:$vD, 1643*81ad6265SDimitry Andric (int_ppc_altivec_vctzdm v2i64:$vA, v2i64:$vB))]>; 1644*81ad6265SDimitry Andric def CNTLZDM : XForm_6<31, 59, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 1645*81ad6265SDimitry Andric "cntlzdm $rA, $rS, $rB", IIC_IntGeneral, 1646*81ad6265SDimitry Andric [(set i64:$rA, 1647*81ad6265SDimitry Andric (int_ppc_cntlzdm i64:$rS, i64:$rB))]>; 1648*81ad6265SDimitry Andric def CNTTZDM : XForm_6<31, 571, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 1649*81ad6265SDimitry Andric "cnttzdm $rA, $rS, $rB", IIC_IntGeneral, 1650*81ad6265SDimitry Andric [(set i64:$rA, 1651*81ad6265SDimitry Andric (int_ppc_cnttzdm i64:$rS, i64:$rB))]>; 1652*81ad6265SDimitry Andric def XXGENPCVBM : 1653*81ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 916, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 1654*81ad6265SDimitry Andric "xxgenpcvbm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 1655*81ad6265SDimitry Andric def XXGENPCVHM : 1656*81ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 917, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 1657*81ad6265SDimitry Andric "xxgenpcvhm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 1658*81ad6265SDimitry Andric def XXGENPCVWM : 1659*81ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 948, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 1660*81ad6265SDimitry Andric "xxgenpcvwm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 1661*81ad6265SDimitry Andric def XXGENPCVDM : 1662*81ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 949, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 1663*81ad6265SDimitry Andric "xxgenpcvdm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 1664*81ad6265SDimitry Andric def VCLRLB : VXForm_1<397, (outs vrrc:$vD), (ins vrrc:$vA, gprc:$rB), 1665*81ad6265SDimitry Andric "vclrlb $vD, $vA, $rB", IIC_VecGeneral, 1666*81ad6265SDimitry Andric [(set v16i8:$vD, 1667*81ad6265SDimitry Andric (int_ppc_altivec_vclrlb v16i8:$vA, i32:$rB))]>; 1668*81ad6265SDimitry Andric def VCLRRB : VXForm_1<461, (outs vrrc:$vD), (ins vrrc:$vA, gprc:$rB), 1669*81ad6265SDimitry Andric "vclrrb $vD, $vA, $rB", IIC_VecGeneral, 1670*81ad6265SDimitry Andric [(set v16i8:$vD, 1671*81ad6265SDimitry Andric (int_ppc_altivec_vclrrb v16i8:$vA, i32:$rB))]>; 1672*81ad6265SDimitry Andric def VMULLD : VXForm_1<457, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1673*81ad6265SDimitry Andric "vmulld $vD, $vA, $vB", IIC_VecGeneral, 1674*81ad6265SDimitry Andric [(set v2i64:$vD, (mul v2i64:$vA, v2i64:$vB))]>; 1675*81ad6265SDimitry Andric def VMULHSW : VXForm_1<905, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1676*81ad6265SDimitry Andric "vmulhsw $vD, $vA, $vB", IIC_VecGeneral, 1677*81ad6265SDimitry Andric [(set v4i32:$vD, (mulhs v4i32:$vA, v4i32:$vB))]>; 1678*81ad6265SDimitry Andric def VMULHUW : VXForm_1<649, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1679*81ad6265SDimitry Andric "vmulhuw $vD, $vA, $vB", IIC_VecGeneral, 1680*81ad6265SDimitry Andric [(set v4i32:$vD, (mulhu v4i32:$vA, v4i32:$vB))]>; 1681*81ad6265SDimitry Andric def VMULHSD : VXForm_1<969, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1682*81ad6265SDimitry Andric "vmulhsd $vD, $vA, $vB", IIC_VecGeneral, 1683*81ad6265SDimitry Andric [(set v2i64:$vD, (mulhs v2i64:$vA, v2i64:$vB))]>; 1684*81ad6265SDimitry Andric def VMULHUD : VXForm_1<713, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1685*81ad6265SDimitry Andric "vmulhud $vD, $vA, $vB", IIC_VecGeneral, 1686*81ad6265SDimitry Andric [(set v2i64:$vD, (mulhu v2i64:$vA, v2i64:$vB))]>; 1687*81ad6265SDimitry Andric def VMODSW : VXForm_1<1931, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1688*81ad6265SDimitry Andric "vmodsw $vD, $vA, $vB", IIC_VecGeneral, 1689*81ad6265SDimitry Andric [(set v4i32:$vD, (srem v4i32:$vA, v4i32:$vB))]>; 1690*81ad6265SDimitry Andric def VMODUW : VXForm_1<1675, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1691*81ad6265SDimitry Andric "vmoduw $vD, $vA, $vB", IIC_VecGeneral, 1692*81ad6265SDimitry Andric [(set v4i32:$vD, (urem v4i32:$vA, v4i32:$vB))]>; 1693*81ad6265SDimitry Andric def VMODSD : VXForm_1<1995, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1694*81ad6265SDimitry Andric "vmodsd $vD, $vA, $vB", IIC_VecGeneral, 1695*81ad6265SDimitry Andric [(set v2i64:$vD, (srem v2i64:$vA, v2i64:$vB))]>; 1696*81ad6265SDimitry Andric def VMODUD : VXForm_1<1739, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1697*81ad6265SDimitry Andric "vmodud $vD, $vA, $vB", IIC_VecGeneral, 1698*81ad6265SDimitry Andric [(set v2i64:$vD, (urem v2i64:$vA, v2i64:$vB))]>; 1699*81ad6265SDimitry Andric def VDIVSW : VXForm_1<395, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1700*81ad6265SDimitry Andric "vdivsw $vD, $vA, $vB", IIC_VecGeneral, 1701*81ad6265SDimitry Andric [(set v4i32:$vD, (sdiv v4i32:$vA, v4i32:$vB))]>; 1702*81ad6265SDimitry Andric def VDIVUW : VXForm_1<139, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1703*81ad6265SDimitry Andric "vdivuw $vD, $vA, $vB", IIC_VecGeneral, 1704*81ad6265SDimitry Andric [(set v4i32:$vD, (udiv v4i32:$vA, v4i32:$vB))]>; 1705*81ad6265SDimitry Andric def VDIVSD : VXForm_1<459, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1706*81ad6265SDimitry Andric "vdivsd $vD, $vA, $vB", IIC_VecGeneral, 1707*81ad6265SDimitry Andric [(set v2i64:$vD, (sdiv v2i64:$vA, v2i64:$vB))]>; 1708*81ad6265SDimitry Andric def VDIVUD : VXForm_1<203, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1709*81ad6265SDimitry Andric "vdivud $vD, $vA, $vB", IIC_VecGeneral, 1710*81ad6265SDimitry Andric [(set v2i64:$vD, (udiv v2i64:$vA, v2i64:$vB))]>; 1711*81ad6265SDimitry Andric def VDIVESW : VXForm_1<907, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1712*81ad6265SDimitry Andric "vdivesw $vD, $vA, $vB", IIC_VecGeneral, 1713*81ad6265SDimitry Andric [(set v4i32:$vD, (int_ppc_altivec_vdivesw v4i32:$vA, 1714*81ad6265SDimitry Andric v4i32:$vB))]>; 1715*81ad6265SDimitry Andric def VDIVEUW : VXForm_1<651, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1716*81ad6265SDimitry Andric "vdiveuw $vD, $vA, $vB", IIC_VecGeneral, 1717*81ad6265SDimitry Andric [(set v4i32:$vD, (int_ppc_altivec_vdiveuw v4i32:$vA, 1718*81ad6265SDimitry Andric v4i32:$vB))]>; 1719*81ad6265SDimitry Andric def VDIVESD : VXForm_1<971, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1720*81ad6265SDimitry Andric "vdivesd $vD, $vA, $vB", IIC_VecGeneral, 1721*81ad6265SDimitry Andric [(set v2i64:$vD, (int_ppc_altivec_vdivesd v2i64:$vA, 1722*81ad6265SDimitry Andric v2i64:$vB))]>; 1723*81ad6265SDimitry Andric def VDIVEUD : VXForm_1<715, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1724*81ad6265SDimitry Andric "vdiveud $vD, $vA, $vB", IIC_VecGeneral, 1725*81ad6265SDimitry Andric [(set v2i64:$vD, (int_ppc_altivec_vdiveud v2i64:$vA, 1726*81ad6265SDimitry Andric v2i64:$vB))]>; 1727*81ad6265SDimitry Andric def XVTLSBB : XX2_BF3_XO5_XB6_XO9<60, 2, 475, (outs crrc:$BF), (ins vsrc:$XB), 1728*81ad6265SDimitry Andric "xvtlsbb $BF, $XB", IIC_VecGeneral, []>; 1729*81ad6265SDimitry Andric 1730*81ad6265SDimitry Andric // The XFormMemOp flag for the following 8 instructions is set on 1731*81ad6265SDimitry Andric // the instruction format. 1732*81ad6265SDimitry Andric let mayLoad = 1, mayStore = 0 in { 1733*81ad6265SDimitry Andric def LXVRBX : X_XT6_RA5_RB5<31, 13, "lxvrbx", vsrc, []>; 1734*81ad6265SDimitry Andric def LXVRHX : X_XT6_RA5_RB5<31, 45, "lxvrhx", vsrc, []>; 1735*81ad6265SDimitry Andric def LXVRWX : X_XT6_RA5_RB5<31, 77, "lxvrwx", vsrc, []>; 1736*81ad6265SDimitry Andric def LXVRDX : X_XT6_RA5_RB5<31, 109, "lxvrdx", vsrc, []>; 1737*81ad6265SDimitry Andric } 1738*81ad6265SDimitry Andric 1739*81ad6265SDimitry Andric let mayLoad = 0, mayStore = 1 in { 1740*81ad6265SDimitry Andric def STXVRBX : X_XS6_RA5_RB5<31, 141, "stxvrbx", vsrc, []>; 1741*81ad6265SDimitry Andric def STXVRHX : X_XS6_RA5_RB5<31, 173, "stxvrhx", vsrc, []>; 1742*81ad6265SDimitry Andric def STXVRWX : X_XS6_RA5_RB5<31, 205, "stxvrwx", vsrc, []>; 1743*81ad6265SDimitry Andric def STXVRDX : X_XS6_RA5_RB5<31, 237, "stxvrdx", vsrc, []>; 1744*81ad6265SDimitry Andric } 1745*81ad6265SDimitry Andric 1746*81ad6265SDimitry Andric def VMULESD : VXForm_1<968, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1747*81ad6265SDimitry Andric "vmulesd $vD, $vA, $vB", IIC_VecGeneral, 1748*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmulesd v2i64:$vA, 1749*81ad6265SDimitry Andric v2i64:$vB))]>; 1750*81ad6265SDimitry Andric def VMULEUD : VXForm_1<712, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1751*81ad6265SDimitry Andric "vmuleud $vD, $vA, $vB", IIC_VecGeneral, 1752*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmuleud v2i64:$vA, 1753*81ad6265SDimitry Andric v2i64:$vB))]>; 1754*81ad6265SDimitry Andric def VMULOSD : VXForm_1<456, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1755*81ad6265SDimitry Andric "vmulosd $vD, $vA, $vB", IIC_VecGeneral, 1756*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmulosd v2i64:$vA, 1757*81ad6265SDimitry Andric v2i64:$vB))]>; 1758*81ad6265SDimitry Andric def VMULOUD : VXForm_1<200, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1759*81ad6265SDimitry Andric "vmuloud $vD, $vA, $vB", IIC_VecGeneral, 1760*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmuloud v2i64:$vA, 1761*81ad6265SDimitry Andric v2i64:$vB))]>; 1762*81ad6265SDimitry Andric def VMSUMCUD : VAForm_1a<23, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, vrrc:$vC), 1763*81ad6265SDimitry Andric "vmsumcud $vD, $vA, $vB, $vC", IIC_VecGeneral, 1764*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmsumcud 1765*81ad6265SDimitry Andric v2i64:$vA, v2i64:$vB, v1i128:$vC))]>; 1766*81ad6265SDimitry Andric def VDIVSQ : VXForm_1<267, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1767*81ad6265SDimitry Andric "vdivsq $vD, $vA, $vB", IIC_VecGeneral, 1768*81ad6265SDimitry Andric [(set v1i128:$vD, (sdiv v1i128:$vA, v1i128:$vB))]>; 1769*81ad6265SDimitry Andric def VDIVUQ : VXForm_1<11, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1770*81ad6265SDimitry Andric "vdivuq $vD, $vA, $vB", IIC_VecGeneral, 1771*81ad6265SDimitry Andric [(set v1i128:$vD, (udiv v1i128:$vA, v1i128:$vB))]>; 1772*81ad6265SDimitry Andric def VDIVESQ : VXForm_1<779, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1773*81ad6265SDimitry Andric "vdivesq $vD, $vA, $vB", IIC_VecGeneral, 1774*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vdivesq v1i128:$vA, 1775*81ad6265SDimitry Andric v1i128:$vB))]>; 1776*81ad6265SDimitry Andric def VDIVEUQ : VXForm_1<523, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1777*81ad6265SDimitry Andric "vdiveuq $vD, $vA, $vB", IIC_VecGeneral, 1778*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vdiveuq v1i128:$vA, 1779*81ad6265SDimitry Andric v1i128:$vB))]>; 1780*81ad6265SDimitry Andric def VCMPEQUQ : VCMP <455, "vcmpequq $vD, $vA, $vB" , v1i128>; 1781*81ad6265SDimitry Andric def VCMPGTSQ : VCMP <903, "vcmpgtsq $vD, $vA, $vB" , v1i128>; 1782*81ad6265SDimitry Andric def VCMPGTUQ : VCMP <647, "vcmpgtuq $vD, $vA, $vB" , v1i128>; 1783*81ad6265SDimitry Andric def VCMPEQUQ_rec : VCMP_rec <455, "vcmpequq. $vD, $vA, $vB" , v1i128>; 1784*81ad6265SDimitry Andric def VCMPGTSQ_rec : VCMP_rec <903, "vcmpgtsq. $vD, $vA, $vB" , v1i128>; 1785*81ad6265SDimitry Andric def VCMPGTUQ_rec : VCMP_rec <647, "vcmpgtuq. $vD, $vA, $vB" , v1i128>; 1786*81ad6265SDimitry Andric def VMODSQ : VXForm_1<1803, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1787*81ad6265SDimitry Andric "vmodsq $vD, $vA, $vB", IIC_VecGeneral, 1788*81ad6265SDimitry Andric [(set v1i128:$vD, (srem v1i128:$vA, v1i128:$vB))]>; 1789*81ad6265SDimitry Andric def VMODUQ : VXForm_1<1547, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 1790*81ad6265SDimitry Andric "vmoduq $vD, $vA, $vB", IIC_VecGeneral, 1791*81ad6265SDimitry Andric [(set v1i128:$vD, (urem v1i128:$vA, v1i128:$vB))]>; 1792*81ad6265SDimitry Andric def VEXTSD2Q : VXForm_RD5_XO5_RS5<1538, 27, (outs vrrc:$vD), (ins vrrc:$vB), 1793*81ad6265SDimitry Andric "vextsd2q $vD, $vB", IIC_VecGeneral, 1794*81ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vextsd2q v2i64:$vB))]>; 1795*81ad6265SDimitry Andric def VCMPUQ : VXForm_BF3_VAB5<257, (outs crrc:$BF), (ins vrrc:$vA, vrrc:$vB), 1796*81ad6265SDimitry Andric "vcmpuq $BF, $vA, $vB", IIC_VecGeneral, []>; 1797*81ad6265SDimitry Andric def VCMPSQ : VXForm_BF3_VAB5<321, (outs crrc:$BF), (ins vrrc:$vA, vrrc:$vB), 1798*81ad6265SDimitry Andric "vcmpsq $BF, $vA, $vB", IIC_VecGeneral, []>; 1799*81ad6265SDimitry Andric def VRLQNM : VX1_VT5_VA5_VB5<325, "vrlqnm", 1800*81ad6265SDimitry Andric [(set v1i128:$vD, 1801*81ad6265SDimitry Andric (int_ppc_altivec_vrlqnm v1i128:$vA, 1802*81ad6265SDimitry Andric v1i128:$vB))]>; 1803*81ad6265SDimitry Andric def VRLQMI : VXForm_1<69, (outs vrrc:$vD), 1804*81ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, vrrc:$vDi), 1805*81ad6265SDimitry Andric "vrlqmi $vD, $vA, $vB", IIC_VecFP, 1806*81ad6265SDimitry Andric [(set v1i128:$vD, 1807*81ad6265SDimitry Andric (int_ppc_altivec_vrlqmi v1i128:$vA, v1i128:$vB, 1808*81ad6265SDimitry Andric v1i128:$vDi))]>, 1809*81ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 1810*81ad6265SDimitry Andric def VSLQ : VX1_VT5_VA5_VB5<261, "vslq", []>; 1811*81ad6265SDimitry Andric def VSRAQ : VX1_VT5_VA5_VB5<773, "vsraq", []>; 1812*81ad6265SDimitry Andric def VSRQ : VX1_VT5_VA5_VB5<517, "vsrq", []>; 1813*81ad6265SDimitry Andric def VRLQ : VX1_VT5_VA5_VB5<5, "vrlq", []>; 1814*81ad6265SDimitry Andric def XSCVQPUQZ : X_VT5_XO5_VB5<63, 0, 836, "xscvqpuqz", []>; 1815*81ad6265SDimitry Andric def XSCVQPSQZ : X_VT5_XO5_VB5<63, 8, 836, "xscvqpsqz", []>; 1816*81ad6265SDimitry Andric def XSCVUQQP : X_VT5_XO5_VB5<63, 3, 836, "xscvuqqp", []>; 1817*81ad6265SDimitry Andric def XSCVSQQP : X_VT5_XO5_VB5<63, 11, 836, "xscvsqqp", []>; 1818*81ad6265SDimitry Andric def LXVKQ : XForm_XT6_IMM5<60, 31, 360, (outs vsrc:$XT), (ins u5imm:$UIM), 1819*81ad6265SDimitry Andric "lxvkq $XT, $UIM", IIC_VecGeneral, []>; 1820*81ad6265SDimitry Andric} 1821*81ad6265SDimitry Andric 1822*81ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX] in { 1823*81ad6265SDimitry Andric def XVCVSPBF16 : XX2_XT6_XO5_XB6<60, 17, 475, "xvcvspbf16", vsrc, []>; 1824*81ad6265SDimitry Andric def XVCVBF16SPN : XX2_XT6_XO5_XB6<60, 16, 475, "xvcvbf16spn", vsrc, []>; 1825*81ad6265SDimitry Andric def XSMAXCQP : X_VT5_VA5_VB5<63, 676, "xsmaxcqp", 1826*81ad6265SDimitry Andric [(set f128:$vT, (PPCxsmaxc f128:$vA, f128:$vB))]>; 1827*81ad6265SDimitry Andric def XSMINCQP : X_VT5_VA5_VB5<63, 740, "xsmincqp", 1828*81ad6265SDimitry Andric [(set f128:$vT, (PPCxsminc f128:$vA, f128:$vB))]>; 1829*81ad6265SDimitry Andric} 1830*81ad6265SDimitry Andric 1831*81ad6265SDimitry Andric// Multiclass defining patterns for Set Boolean Extension Reverse Instructions. 1832*81ad6265SDimitry Andric// This is analogous to the CRNotPat multiclass but specifically for Power10 1833*81ad6265SDimitry Andric// and newer subtargets since the extended forms use Set Boolean instructions. 1834*81ad6265SDimitry Andric// The first two anonymous patterns defined are actually a duplicate of those 1835*81ad6265SDimitry Andric// in CRNotPat, but it is preferable to define both multiclasses as complete 1836*81ad6265SDimitry Andric// ones rather than pulling that small common section out. 1837*81ad6265SDimitry Andricmulticlass P10ReverseSetBool<dag pattern, dag result> { 1838*81ad6265SDimitry Andric def : Pat<pattern, (crnot result)>; 1839*81ad6265SDimitry Andric def : Pat<(not pattern), result>; 1840*81ad6265SDimitry Andric 1841*81ad6265SDimitry Andric def : Pat<(i32 (zext pattern)), 1842*81ad6265SDimitry Andric (SETBCR result)>; 1843*81ad6265SDimitry Andric def : Pat<(i64 (zext pattern)), 1844*81ad6265SDimitry Andric (SETBCR8 result)>; 1845*81ad6265SDimitry Andric 1846*81ad6265SDimitry Andric def : Pat<(i32 (sext pattern)), 1847*81ad6265SDimitry Andric (SETNBCR result)>; 1848*81ad6265SDimitry Andric def : Pat<(i64 (sext pattern)), 1849*81ad6265SDimitry Andric (SETNBCR8 result)>; 1850*81ad6265SDimitry Andric 1851*81ad6265SDimitry Andric def : Pat<(i32 (anyext pattern)), 1852*81ad6265SDimitry Andric (SETBCR result)>; 1853*81ad6265SDimitry Andric def : Pat<(i64 (anyext pattern)), 1854*81ad6265SDimitry Andric (SETBCR8 result)>; 1855*81ad6265SDimitry Andric} 1856*81ad6265SDimitry Andric 1857*81ad6265SDimitry Andricmulticlass IntSetP10RevSetBool<SDNode SetCC, ValueType Ty, PatLeaf ZExtTy, 1858*81ad6265SDimitry Andric ImmLeaf SExtTy, I Cmpi, I Cmpli, 1859*81ad6265SDimitry Andric I Cmp, I Cmpl> { 1860*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)), 1861*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_lt)>; 1862*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)), 1863*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_lt)>; 1864*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)), 1865*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_gt)>; 1866*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)), 1867*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_gt)>; 1868*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)), 1869*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_eq)>; 1870*81ad6265SDimitry Andric 1871*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETUGE)), 1872*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_lt)>; 1873*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETGE)), 1874*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_lt)>; 1875*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETULE)), 1876*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_gt)>; 1877*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETLE)), 1878*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_gt)>; 1879*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETNE)), 1880*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_eq)>; 1881*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETNE)), 1882*81ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_eq)>; 1883*81ad6265SDimitry Andric} 1884*81ad6265SDimitry Andric 1885*81ad6265SDimitry Andricmulticlass FSetP10RevSetBool<SDNode SetCC, ValueType Ty, I FCmp> { 1886*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)), 1887*81ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>; 1888*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)), 1889*81ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>; 1890*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)), 1891*81ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>; 1892*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)), 1893*81ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>; 1894*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUNE)), 1895*81ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>; 1896*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)), 1897*81ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>; 1898*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETO)), 1899*81ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_un)>; 1900*81ad6265SDimitry Andric} 1901*81ad6265SDimitry Andric 1902*81ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 1903*81ad6265SDimitry Andric def : Pat<(i32 (zext i1:$in)), 1904*81ad6265SDimitry Andric (SETBC $in)>; 1905*81ad6265SDimitry Andric def : Pat<(i64 (zext i1:$in)), 1906*81ad6265SDimitry Andric (SETBC8 $in)>; 1907*81ad6265SDimitry Andric def : Pat<(i32 (sext i1:$in)), 1908*81ad6265SDimitry Andric (SETNBC $in)>; 1909*81ad6265SDimitry Andric def : Pat<(i64 (sext i1:$in)), 1910*81ad6265SDimitry Andric (SETNBC8 $in)>; 1911*81ad6265SDimitry Andric def : Pat<(i32 (anyext i1:$in)), 1912*81ad6265SDimitry Andric (SETBC $in)>; 1913*81ad6265SDimitry Andric def : Pat<(i64 (anyext i1:$in)), 1914*81ad6265SDimitry Andric (SETBC8 $in)>; 1915*81ad6265SDimitry Andric 1916*81ad6265SDimitry Andric // Instantiation of the set boolean reverse patterns for 32-bit integers. 1917*81ad6265SDimitry Andric defm : IntSetP10RevSetBool<setcc, i32, immZExt16, imm32SExt16, 1918*81ad6265SDimitry Andric CMPWI, CMPLWI, CMPW, CMPLW>; 1919*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (setcc i32:$s1, imm:$imm, SETNE)), 1920*81ad6265SDimitry Andric (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)), 1921*81ad6265SDimitry Andric (LO16 imm:$imm)), sub_eq)>; 1922*81ad6265SDimitry Andric 1923*81ad6265SDimitry Andric // Instantiation of the set boolean reverse patterns for 64-bit integers. 1924*81ad6265SDimitry Andric defm : IntSetP10RevSetBool<setcc, i64, immZExt16, imm64SExt16, 1925*81ad6265SDimitry Andric CMPDI, CMPLDI, CMPD, CMPLD>; 1926*81ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETNE)), 1927*81ad6265SDimitry Andric (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)), 1928*81ad6265SDimitry Andric (LO16 imm:$imm)), sub_eq)>; 1929*81ad6265SDimitry Andric} 1930*81ad6265SDimitry Andric 1931*81ad6265SDimitry Andric// Instantiation of the set boolean reverse patterns for f32, f64, f128. 1932*81ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasFPU] in { 1933*81ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f32, FCMPUS>; 1934*81ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f64, FCMPUD>; 1935*81ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f128, XSCMPUQP>; 1936*81ad6265SDimitry Andric} 1937*81ad6265SDimitry Andric 1938*81ad6265SDimitry Andric//---------------------------- Anonymous Patterns ----------------------------// 1939*81ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 1940*81ad6265SDimitry Andric // Exploit the vector multiply high instructions using intrinsics. 1941*81ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_altivec_vmulhsw v4i32:$vA, v4i32:$vB)), 1942*81ad6265SDimitry Andric (v4i32 (VMULHSW $vA, $vB))>; 1943*81ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_altivec_vmulhuw v4i32:$vA, v4i32:$vB)), 1944*81ad6265SDimitry Andric (v4i32 (VMULHUW $vA, $vB))>; 1945*81ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_altivec_vmulhsd v2i64:$vA, v2i64:$vB)), 1946*81ad6265SDimitry Andric (v2i64 (VMULHSD $vA, $vB))>; 1947*81ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_altivec_vmulhud v2i64:$vA, v2i64:$vB)), 1948*81ad6265SDimitry Andric (v2i64 (VMULHUD $vA, $vB))>; 1949*81ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxgenpcvbm v16i8:$VRB, imm:$IMM)), 1950*81ad6265SDimitry Andric (v16i8 (COPY_TO_REGCLASS (XXGENPCVBM $VRB, imm:$IMM), VRRC))>; 1951*81ad6265SDimitry Andric def : Pat<(v8i16 (int_ppc_vsx_xxgenpcvhm v8i16:$VRB, imm:$IMM)), 1952*81ad6265SDimitry Andric (v8i16 (COPY_TO_REGCLASS (XXGENPCVHM $VRB, imm:$IMM), VRRC))>; 1953*81ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_vsx_xxgenpcvwm v4i32:$VRB, imm:$IMM)), 1954*81ad6265SDimitry Andric (v4i32 (COPY_TO_REGCLASS (XXGENPCVWM $VRB, imm:$IMM), VRRC))>; 1955*81ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_vsx_xxgenpcvdm v2i64:$VRB, imm:$IMM)), 1956*81ad6265SDimitry Andric (v2i64 (COPY_TO_REGCLASS (XXGENPCVDM $VRB, imm:$IMM), VRRC))>; 1957*81ad6265SDimitry Andric def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 1)), 1958*81ad6265SDimitry Andric (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_lt)>; 1959*81ad6265SDimitry Andric def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 0)), 1960*81ad6265SDimitry Andric (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_eq)>; 1961*81ad6265SDimitry Andric 1962*81ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 8)), 1963*81ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VRRC))>; 1964*81ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 16)), 1965*81ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VRRC))>; 1966*81ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 32)), 1967*81ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRWX ForceXForm:$src), VRRC))>; 1968*81ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 64)), 1969*81ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRDX ForceXForm:$src), VRRC))>; 1970*81ad6265SDimitry Andric 1971*81ad6265SDimitry Andric def : Pat<(v1i128 (rotl v1i128:$vA, v1i128:$vB)), 1972*81ad6265SDimitry Andric (v1i128 (VRLQ v1i128:$vA, v1i128:$vB))>; 1973*81ad6265SDimitry Andric 1974*81ad6265SDimitry Andric def : Pat <(v2i64 (PPCxxsplti32dx v2i64:$XT, i32:$XI, i32:$IMM32)), 1975*81ad6265SDimitry Andric (v2i64 (XXSPLTI32DX v2i64:$XT, i32:$XI, i32:$IMM32))>; 1976*81ad6265SDimitry Andric} 1977*81ad6265SDimitry Andric 1978*81ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX] in { 1979*81ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xvcvspbf16 v16i8:$XA)), 1980*81ad6265SDimitry Andric (COPY_TO_REGCLASS (XVCVSPBF16 RCCp.AToVSRC), VRRC)>; 1981*81ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xvcvbf16spn v16i8:$XA)), 1982*81ad6265SDimitry Andric (COPY_TO_REGCLASS (XVCVBF16SPN RCCp.AToVSRC), VRRC)>; 1983*81ad6265SDimitry Andric} 1984*81ad6265SDimitry Andric 1985*81ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, IsLittleEndian] in { 1986*81ad6265SDimitry Andric // Store element 0 of a VSX register to memory 1987*81ad6265SDimitry Andric def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$src, 0)), ForceXForm:$dst), 1988*81ad6265SDimitry Andric (STXVRBX (COPY_TO_REGCLASS v16i8:$src, VSRC), ForceXForm:$dst)>; 1989*81ad6265SDimitry Andric def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$src, 0)), ForceXForm:$dst), 1990*81ad6265SDimitry Andric (STXVRHX (COPY_TO_REGCLASS v8i16:$src, VSRC), ForceXForm:$dst)>; 1991*81ad6265SDimitry Andric def : Pat<(store (i32 (extractelt v4i32:$src, 0)), ForceXForm:$dst), 1992*81ad6265SDimitry Andric (STXVRWX $src, ForceXForm:$dst)>; 1993*81ad6265SDimitry Andric def : Pat<(store (f32 (extractelt v4f32:$src, 0)), ForceXForm:$dst), 1994*81ad6265SDimitry Andric (STXVRWX $src, ForceXForm:$dst)>; 1995*81ad6265SDimitry Andric def : Pat<(store (i64 (extractelt v2i64:$src, 0)), ForceXForm:$dst), 1996*81ad6265SDimitry Andric (STXVRDX $src, ForceXForm:$dst)>; 1997*81ad6265SDimitry Andric def : Pat<(store (f64 (extractelt v2f64:$src, 0)), ForceXForm:$dst), 1998*81ad6265SDimitry Andric (STXVRDX $src, ForceXForm:$dst)>; 1999*81ad6265SDimitry Andric // Load element 0 of a VSX register to memory 2000*81ad6265SDimitry Andric def : Pat<(v8i16 (scalar_to_vector (i32 (extloadi16 ForceXForm:$src)))), 2001*81ad6265SDimitry Andric (v8i16 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VSRC))>; 2002*81ad6265SDimitry Andric def : Pat<(v16i8 (scalar_to_vector (i32 (extloadi8 ForceXForm:$src)))), 2003*81ad6265SDimitry Andric (v16i8 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VSRC))>; 2004*81ad6265SDimitry Andric } 2005*81ad6265SDimitry Andric 2006*81ad6265SDimitry Andric// FIXME: The swap is overkill when the shift amount is a constant. 2007*81ad6265SDimitry Andric// We should just fix the constant in the DAG. 2008*81ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX] in { 2009*81ad6265SDimitry Andric def : Pat<(v1i128 (shl v1i128:$VRA, v1i128:$VRB)), 2010*81ad6265SDimitry Andric (v1i128 (VSLQ v1i128:$VRA, 2011*81ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 2012*81ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 2013*81ad6265SDimitry Andric def : Pat<(v1i128 (PPCshl v1i128:$VRA, v1i128:$VRB)), 2014*81ad6265SDimitry Andric (v1i128 (VSLQ v1i128:$VRA, 2015*81ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 2016*81ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 2017*81ad6265SDimitry Andric def : Pat<(v1i128 (srl v1i128:$VRA, v1i128:$VRB)), 2018*81ad6265SDimitry Andric (v1i128 (VSRQ v1i128:$VRA, 2019*81ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 2020*81ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 2021*81ad6265SDimitry Andric def : Pat<(v1i128 (PPCsrl v1i128:$VRA, v1i128:$VRB)), 2022*81ad6265SDimitry Andric (v1i128 (VSRQ v1i128:$VRA, 2023*81ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 2024*81ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 2025*81ad6265SDimitry Andric def : Pat<(v1i128 (sra v1i128:$VRA, v1i128:$VRB)), 2026*81ad6265SDimitry Andric (v1i128 (VSRAQ v1i128:$VRA, 2027*81ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 2028*81ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 2029*81ad6265SDimitry Andric def : Pat<(v1i128 (PPCsra v1i128:$VRA, v1i128:$VRB)), 2030*81ad6265SDimitry Andric (v1i128 (VSRAQ v1i128:$VRA, 2031*81ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 2032*81ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 2033*81ad6265SDimitry Andric} 2034*81ad6265SDimitry Andric 2035*81ad6265SDimitry Andricclass xxevalPattern <dag pattern, bits<8> imm> : 2036*81ad6265SDimitry Andric Pat<(v4i32 pattern), (XXEVAL $vA, $vB, $vC, imm)> {} 2037*81ad6265SDimitry Andric 2038*81ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [PrefixInstrs] in { 2039*81ad6265SDimitry Andric def : Pat<(v4i32 (build_vector i32immNonAllOneNonZero:$A, 2040*81ad6265SDimitry Andric i32immNonAllOneNonZero:$A, 2041*81ad6265SDimitry Andric i32immNonAllOneNonZero:$A, 2042*81ad6265SDimitry Andric i32immNonAllOneNonZero:$A)), 2043*81ad6265SDimitry Andric (v4i32 (XXSPLTIW imm:$A))>; 2044*81ad6265SDimitry Andric def : Pat<(f32 nzFPImmAsi32:$A), 2045*81ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)), 2046*81ad6265SDimitry Andric VSFRC)>; 2047*81ad6265SDimitry Andric def : Pat<(f64 nzFPImmAsi32:$A), 2048*81ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)), 2049*81ad6265SDimitry Andric VSFRC)>; 2050*81ad6265SDimitry Andric 2051*81ad6265SDimitry Andric// To replace constant pool with XXSPLTI32DX for scalars. 2052*81ad6265SDimitry Andricdef : Pat<(f32 nzFPImmAsi64:$A), 2053*81ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX(IMPLICIT_DEF), 0, 2054*81ad6265SDimitry Andric (getFPAs64BitIntHi $A)), 2055*81ad6265SDimitry Andric 1, (getFPAs64BitIntLo $A)), 2056*81ad6265SDimitry Andric VSSRC)>; 2057*81ad6265SDimitry Andric 2058*81ad6265SDimitry Andricdef : Pat<(f64 nzFPImmAsi64:$A), 2059*81ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX (IMPLICIT_DEF), 0, 2060*81ad6265SDimitry Andric (getFPAs64BitIntHi $A)), 2061*81ad6265SDimitry Andric 1, (getFPAs64BitIntLo $A)), 2062*81ad6265SDimitry Andric VSFRC)>; 2063*81ad6265SDimitry Andric 2064*81ad6265SDimitry Andric // Anonymous patterns for XXEVAL 2065*81ad6265SDimitry Andric // AND 2066*81ad6265SDimitry Andric // and(A, B, C) 2067*81ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 1>; 2068*81ad6265SDimitry Andric // and(A, xor(B, C)) 2069*81ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 6>; 2070*81ad6265SDimitry Andric // and(A, or(B, C)) 2071*81ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 7>; 2072*81ad6265SDimitry Andric // and(A, nor(B, C)) 2073*81ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 8>; 2074*81ad6265SDimitry Andric // and(A, eqv(B, C)) 2075*81ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 9>; 2076*81ad6265SDimitry Andric // and(A, nand(B, C)) 2077*81ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 14>; 2078*81ad6265SDimitry Andric 2079*81ad6265SDimitry Andric // NAND 2080*81ad6265SDimitry Andric // nand(A, B, C) 2081*81ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 2082*81ad6265SDimitry Andric !sub(255, 1)>; 2083*81ad6265SDimitry Andric // nand(A, xor(B, C)) 2084*81ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 2085*81ad6265SDimitry Andric !sub(255, 6)>; 2086*81ad6265SDimitry Andric // nand(A, or(B, C)) 2087*81ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 2088*81ad6265SDimitry Andric !sub(255, 7)>; 2089*81ad6265SDimitry Andric // nand(A, nor(B, C)) 2090*81ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 2091*81ad6265SDimitry Andric !sub(255, 8)>; 2092*81ad6265SDimitry Andric // nand(A, eqv(B, C)) 2093*81ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 2094*81ad6265SDimitry Andric !sub(255, 9)>; 2095*81ad6265SDimitry Andric // nand(A, nand(B, C)) 2096*81ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 2097*81ad6265SDimitry Andric !sub(255, 14)>; 2098*81ad6265SDimitry Andric 2099*81ad6265SDimitry Andric // Anonymous patterns to select prefixed VSX loads and stores. 2100*81ad6265SDimitry Andric // Load / Store f128 2101*81ad6265SDimitry Andric def : Pat<(f128 (load PDForm:$src)), 2102*81ad6265SDimitry Andric (COPY_TO_REGCLASS (PLXV memri34:$src), VRRC)>; 2103*81ad6265SDimitry Andric def : Pat<(store f128:$XS, PDForm:$dst), 2104*81ad6265SDimitry Andric (PSTXV (COPY_TO_REGCLASS $XS, VSRC), memri34:$dst)>; 2105*81ad6265SDimitry Andric 2106*81ad6265SDimitry Andric // Load / Store v4i32 2107*81ad6265SDimitry Andric def : Pat<(v4i32 (load PDForm:$src)), (PLXV memri34:$src)>; 2108*81ad6265SDimitry Andric def : Pat<(store v4i32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 2109*81ad6265SDimitry Andric 2110*81ad6265SDimitry Andric // Load / Store v2i64 2111*81ad6265SDimitry Andric def : Pat<(v2i64 (load PDForm:$src)), (PLXV memri34:$src)>; 2112*81ad6265SDimitry Andric def : Pat<(store v2i64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 2113*81ad6265SDimitry Andric 2114*81ad6265SDimitry Andric // Load / Store v4f32 2115*81ad6265SDimitry Andric def : Pat<(v4f32 (load PDForm:$src)), (PLXV memri34:$src)>; 2116*81ad6265SDimitry Andric def : Pat<(store v4f32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 2117*81ad6265SDimitry Andric 2118*81ad6265SDimitry Andric // Load / Store v2f64 2119*81ad6265SDimitry Andric def : Pat<(v2f64 (load PDForm:$src)), (PLXV memri34:$src)>; 2120*81ad6265SDimitry Andric def : Pat<(store v2f64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 2121*81ad6265SDimitry Andric 2122*81ad6265SDimitry Andric // Cases For PPCstore_scal_int_from_vsr 2123*81ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 2124*81ad6265SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), PDForm:$dst, 8), 2125*81ad6265SDimitry Andric (PSTXSD (XSCVDPUXDS f64:$src), PDForm:$dst)>; 2126*81ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 2127*81ad6265SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), PDForm:$dst, 8), 2128*81ad6265SDimitry Andric (PSTXSD (XSCVDPSXDS f64:$src), PDForm:$dst)>; 2129*81ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 2130*81ad6265SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), PDForm:$dst, 8), 2131*81ad6265SDimitry Andric (PSTXSD (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), 2132*81ad6265SDimitry Andric PDForm:$dst)>; 2133*81ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 2134*81ad6265SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), PDForm:$dst, 8), 2135*81ad6265SDimitry Andric (PSTXSD (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), 2136*81ad6265SDimitry Andric PDForm:$dst)>; 2137*81ad6265SDimitry Andric} 2138*81ad6265SDimitry Andric 2139*81ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 2140*81ad6265SDimitry Andric def : Pat<(i32 imm34:$imm), (PLI (getImmAs64BitInt imm:$imm))>; 2141*81ad6265SDimitry Andric def : Pat<(i64 imm34:$imm), (PLI8 (getImmAs64BitInt imm:$imm))>; 2142*81ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxpermx v16i8:$A, v16i8:$B, v16i8:$C, timm:$D)), 2143*81ad6265SDimitry Andric (COPY_TO_REGCLASS (XXPERMX (COPY_TO_REGCLASS $A, VSRC), 2144*81ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 2145*81ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC), $D), VSRC)>; 2146*81ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxblendvb v16i8:$A, v16i8:$B, v16i8:$C)), 2147*81ad6265SDimitry Andric (COPY_TO_REGCLASS 2148*81ad6265SDimitry Andric (XXBLENDVB (COPY_TO_REGCLASS $A, VSRC), 2149*81ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 2150*81ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC)), VSRC)>; 2151*81ad6265SDimitry Andric def : Pat<(v8i16 (int_ppc_vsx_xxblendvh v8i16:$A, v8i16:$B, v8i16:$C)), 2152*81ad6265SDimitry Andric (COPY_TO_REGCLASS 2153*81ad6265SDimitry Andric (XXBLENDVH (COPY_TO_REGCLASS $A, VSRC), 2154*81ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 2155*81ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC)), VSRC)>; 2156*81ad6265SDimitry Andric def : Pat<(int_ppc_vsx_xxblendvw v4i32:$A, v4i32:$B, v4i32:$C), 2157*81ad6265SDimitry Andric (XXBLENDVW $A, $B, $C)>; 2158*81ad6265SDimitry Andric def : Pat<(int_ppc_vsx_xxblendvd v2i64:$A, v2i64:$B, v2i64:$C), 2159*81ad6265SDimitry Andric (XXBLENDVD $A, $B, $C)>; 2160*81ad6265SDimitry Andric 2161*81ad6265SDimitry Andric // Anonymous patterns to select prefixed loads and stores. 2162*81ad6265SDimitry Andric // Load i32 2163*81ad6265SDimitry Andric def : Pat<(i32 (extloadi1 PDForm:$src)), (PLBZ memri34:$src)>; 2164*81ad6265SDimitry Andric def : Pat<(i32 (zextloadi1 PDForm:$src)), (PLBZ memri34:$src)>; 2165*81ad6265SDimitry Andric def : Pat<(i32 (extloadi8 PDForm:$src)), (PLBZ memri34:$src)>; 2166*81ad6265SDimitry Andric def : Pat<(i32 (zextloadi8 PDForm:$src)), (PLBZ memri34:$src)>; 2167*81ad6265SDimitry Andric def : Pat<(i32 (extloadi16 PDForm:$src)), (PLHZ memri34:$src)>; 2168*81ad6265SDimitry Andric def : Pat<(i32 (zextloadi16 PDForm:$src)), (PLHZ memri34:$src)>; 2169*81ad6265SDimitry Andric def : Pat<(i32 (sextloadi16 PDForm:$src)), (PLHA memri34:$src)>; 2170*81ad6265SDimitry Andric def : Pat<(i32 (load PDForm:$src)), (PLWZ memri34:$src)>; 2171*81ad6265SDimitry Andric 2172*81ad6265SDimitry Andric // Store i32 2173*81ad6265SDimitry Andric def : Pat<(truncstorei8 i32:$rS, PDForm:$dst), (PSTB gprc:$rS, memri34:$dst)>; 2174*81ad6265SDimitry Andric def : Pat<(truncstorei16 i32:$rS, PDForm:$dst), (PSTH gprc:$rS, memri34:$dst)>; 2175*81ad6265SDimitry Andric def : Pat<(store i32:$rS, PDForm:$dst), (PSTW gprc:$rS, memri34:$dst)>; 2176*81ad6265SDimitry Andric 2177*81ad6265SDimitry Andric // Load i64 2178*81ad6265SDimitry Andric def : Pat<(i64 (extloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>; 2179*81ad6265SDimitry Andric def : Pat<(i64 (zextloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>; 2180*81ad6265SDimitry Andric def : Pat<(i64 (extloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>; 2181*81ad6265SDimitry Andric def : Pat<(i64 (zextloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>; 2182*81ad6265SDimitry Andric def : Pat<(i64 (extloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>; 2183*81ad6265SDimitry Andric def : Pat<(i64 (zextloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>; 2184*81ad6265SDimitry Andric def : Pat<(i64 (sextloadi16 PDForm:$src)), (PLHA8 memri34:$src)>; 2185*81ad6265SDimitry Andric def : Pat<(i64 (extloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>; 2186*81ad6265SDimitry Andric def : Pat<(i64 (zextloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>; 2187*81ad6265SDimitry Andric def : Pat<(i64 (sextloadi32 PDForm:$src)), (PLWA8 memri34:$src)>; 2188*81ad6265SDimitry Andric def : Pat<(i64 (load PDForm:$src)), (PLD memri34:$src)>; 2189*81ad6265SDimitry Andric 2190*81ad6265SDimitry Andric // Store i64 2191*81ad6265SDimitry Andric def : Pat<(truncstorei8 i64:$rS, PDForm:$dst), (PSTB8 g8rc:$rS, memri34:$dst)>; 2192*81ad6265SDimitry Andric def : Pat<(truncstorei16 i64:$rS, PDForm:$dst), (PSTH8 g8rc:$rS, memri34:$dst)>; 2193*81ad6265SDimitry Andric def : Pat<(truncstorei32 i64:$rS, PDForm:$dst), (PSTW8 g8rc:$rS, memri34:$dst)>; 2194*81ad6265SDimitry Andric def : Pat<(store i64:$rS, PDForm:$dst), (PSTD g8rc:$rS, memri34:$dst)>; 2195*81ad6265SDimitry Andric 2196*81ad6265SDimitry Andric // Load / Store f32 2197*81ad6265SDimitry Andric def : Pat<(f32 (load PDForm:$src)), (PLFS memri34:$src)>; 2198*81ad6265SDimitry Andric def : Pat<(store f32:$FRS, PDForm:$dst), (PSTFS $FRS, memri34:$dst)>; 2199*81ad6265SDimitry Andric 2200*81ad6265SDimitry Andric // Load / Store f64 2201*81ad6265SDimitry Andric def : Pat<(f64 (extloadf32 PDForm:$src)), 2202*81ad6265SDimitry Andric (COPY_TO_REGCLASS (PLFS memri34:$src), VSFRC)>; 2203*81ad6265SDimitry Andric def : Pat<(f64 (load PDForm:$src)), (PLFD memri34:$src)>; 2204*81ad6265SDimitry Andric def : Pat<(store f64:$FRS, PDForm:$dst), (PSTFD $FRS, memri34:$dst)>; 2205*81ad6265SDimitry Andric 2206*81ad6265SDimitry Andric // Atomic Load 2207*81ad6265SDimitry Andric def : Pat<(atomic_load_8 PDForm:$src), (PLBZ memri34:$src)>; 2208*81ad6265SDimitry Andric def : Pat<(atomic_load_16 PDForm:$src), (PLHZ memri34:$src)>; 2209*81ad6265SDimitry Andric def : Pat<(atomic_load_32 PDForm:$src), (PLWZ memri34:$src)>; 2210*81ad6265SDimitry Andric def : Pat<(atomic_load_64 PDForm:$src), (PLD memri34:$src)>; 2211*81ad6265SDimitry Andric 2212*81ad6265SDimitry Andric // Atomic Store 2213*81ad6265SDimitry Andric def : Pat<(atomic_store_8 PDForm:$dst, i32:$RS), (PSTB $RS, memri34:$dst)>; 2214*81ad6265SDimitry Andric def : Pat<(atomic_store_16 PDForm:$dst, i32:$RS), (PSTH $RS, memri34:$dst)>; 2215*81ad6265SDimitry Andric def : Pat<(atomic_store_32 PDForm:$dst, i32:$RS), (PSTW $RS, memri34:$dst)>; 2216*81ad6265SDimitry Andric def : Pat<(atomic_store_64 PDForm:$dst, i64:$RS), (PSTD $RS, memri34:$dst)>; 2217*81ad6265SDimitry Andric 2218*81ad6265SDimitry Andric // Prefixed fpext to v2f64 2219*81ad6265SDimitry Andric def : Pat<(v4f32 (PPCldvsxlh PDForm:$src)), 2220*81ad6265SDimitry Andric (SUBREG_TO_REG (i64 1), (PLFD PDForm:$src), sub_64)>; 2221*81ad6265SDimitry Andric} 2222*81ad6265SDimitry Andric 2223*81ad6265SDimitry Andricdef InsertEltShift { 2224*81ad6265SDimitry Andric dag Sub32 = (i32 (EXTRACT_SUBREG $rB, sub_32)); 2225*81ad6265SDimitry Andric dag Sub32Left1 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 1, 0, 30); 2226*81ad6265SDimitry Andric dag Sub32Left2 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 2, 0, 29); 2227*81ad6265SDimitry Andric dag Left1 = (RLWINM $rB, 1, 0, 30); 2228*81ad6265SDimitry Andric dag Left2 = (RLWINM $rB, 2, 0, 29); 2229*81ad6265SDimitry Andric dag Left3 = (RLWINM8 $rB, 3, 0, 28); 2230*81ad6265SDimitry Andric} 2231*81ad6265SDimitry Andric 2232*81ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsLittleEndian] in { 2233*81ad6265SDimitry Andric // Indexed vector insert element 2234*81ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)), 2235*81ad6265SDimitry Andric (VINSBRX $vDi, InsertEltShift.Sub32, $rA)>; 2236*81ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)), 2237*81ad6265SDimitry Andric (VINSHRX $vDi, InsertEltShift.Sub32Left1, $rA)>; 2238*81ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)), 2239*81ad6265SDimitry Andric (VINSWRX $vDi, InsertEltShift.Sub32Left2, $rA)>; 2240*81ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)), 2241*81ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, $rA)>; 2242*81ad6265SDimitry Andric 2243*81ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)), 2244*81ad6265SDimitry Andric (VINSWVRX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>; 2245*81ad6265SDimitry Andric 2246*81ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, f64:$A, i64:$rB)), 2247*81ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>; 2248*81ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)), 2249*81ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>; 2250*81ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)), 2251*81ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>; 2252*81ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)), 2253*81ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>; 2254*81ad6265SDimitry Andric let AddedComplexity = 400 in { 2255*81ad6265SDimitry Andric // Immediate vector insert element 2256*81ad6265SDimitry Andric foreach Idx = [0, 1, 2, 3] in { 2257*81ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, Idx)), 2258*81ad6265SDimitry Andric (VINSW $vDi, !mul(!sub(3, Idx), 4), $rA)>; 2259*81ad6265SDimitry Andric } 2260*81ad6265SDimitry Andric foreach i = [0, 1] in 2261*81ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, (i64 i))), 2262*81ad6265SDimitry Andric (VINSD $vDi, !mul(!sub(1, i), 8), $rA)>; 2263*81ad6265SDimitry Andric } 2264*81ad6265SDimitry Andric} 2265*81ad6265SDimitry Andric 2266*81ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC32] in { 2267*81ad6265SDimitry Andric // Indexed vector insert element 2268*81ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i32:$rB)), 2269*81ad6265SDimitry Andric (VINSBLX $vDi, $rB, $rA)>; 2270*81ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i32:$rB)), 2271*81ad6265SDimitry Andric (VINSHLX $vDi, InsertEltShift.Left1, $rA)>; 2272*81ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i32:$rB)), 2273*81ad6265SDimitry Andric (VINSWLX $vDi, InsertEltShift.Left2, $rA)>; 2274*81ad6265SDimitry Andric 2275*81ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i32:$rB)), 2276*81ad6265SDimitry Andric (VINSWVLX $vDi, InsertEltShift.Left2, (XSCVDPSPN $rA))>; 2277*81ad6265SDimitry Andric} 2278*81ad6265SDimitry Andric 2279*81ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC64] in { 2280*81ad6265SDimitry Andric // Indexed vector insert element 2281*81ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)), 2282*81ad6265SDimitry Andric (VINSBLX $vDi, InsertEltShift.Sub32, $rA)>; 2283*81ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)), 2284*81ad6265SDimitry Andric (VINSHLX $vDi, InsertEltShift.Sub32Left1, $rA)>; 2285*81ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)), 2286*81ad6265SDimitry Andric (VINSWLX $vDi, InsertEltShift.Sub32Left2, $rA)>; 2287*81ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)), 2288*81ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, $rA)>; 2289*81ad6265SDimitry Andric 2290*81ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)), 2291*81ad6265SDimitry Andric (VINSWVLX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>; 2292*81ad6265SDimitry Andric 2293*81ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, f64:$A, i64:$rB)), 2294*81ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>; 2295*81ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)), 2296*81ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>; 2297*81ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)), 2298*81ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>; 2299*81ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)), 2300*81ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>; 2301*81ad6265SDimitry Andric} 2302*81ad6265SDimitry Andric 2303*81ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX, IsBigEndian] in { 2304*81ad6265SDimitry Andric // Immediate vector insert element 2305*81ad6265SDimitry Andric foreach Ty = [i32, i64] in { 2306*81ad6265SDimitry Andric foreach Idx = [0, 1, 2, 3] in { 2307*81ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, (Ty Idx))), 2308*81ad6265SDimitry Andric (VINSW $vDi, !mul(Idx, 4), $rA)>; 2309*81ad6265SDimitry Andric } 2310*81ad6265SDimitry Andric } 2311*81ad6265SDimitry Andric 2312*81ad6265SDimitry Andric foreach Idx = [0, 1] in 2313*81ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, Idx)), 2314*81ad6265SDimitry Andric (VINSD $vDi, !mul(Idx, 8), $rA)>; 2315*81ad6265SDimitry Andric} 2316