xref: /llvm-project/llvm/lib/Target/PowerPC/PPCInstrP10.td (revision a4751804985554815899b5dc1544e27139bacdc4)
14fbe60fdSStefan Pintilie//===-- PPCInstrP10.td - Power10 Instruction Set -----------*- tablegen -*-===//
24fbe60fdSStefan Pintilie//
34fbe60fdSStefan Pintilie//                     The LLVM Compiler Infrastructure
44fbe60fdSStefan Pintilie//
54fbe60fdSStefan Pintilie// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
64fbe60fdSStefan Pintilie// See https://llvm.org/LICENSE.txt for license information.
74fbe60fdSStefan Pintilie// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
84fbe60fdSStefan Pintilie//
94fbe60fdSStefan Pintilie//===----------------------------------------------------------------------===//
104fbe60fdSStefan Pintilie//
114fbe60fdSStefan Pintilie// This file describes the instructions introduced for the Power10 CPU.
124fbe60fdSStefan Pintilie//
134fbe60fdSStefan Pintilie//===----------------------------------------------------------------------===//
144fbe60fdSStefan Pintilie
154fbe60fdSStefan Pintilie//===----------------------------------------------------------------------===//
164fbe60fdSStefan Pintilie// Naming convention for future instruction formats
174fbe60fdSStefan Pintilie//
184fbe60fdSStefan Pintilie// <INSTR_FORM>{_<OP_TYPE><OP_LENGTH>}+
194fbe60fdSStefan Pintilie//
204fbe60fdSStefan Pintilie// Where:
214fbe60fdSStefan Pintilie// <INSTR_FORM> - name of instruction format as per the ISA
224fbe60fdSStefan Pintilie//                (X-Form, VX-Form, etc.)
234fbe60fdSStefan Pintilie// <OP_TYPE> - operand type
244fbe60fdSStefan Pintilie//             * FRT/RT/VT/XT/BT - target register
254fbe60fdSStefan Pintilie//                                 (FPR, GPR, VR, VSR, CR-bit respectively)
264fbe60fdSStefan Pintilie//                                 In some situations, the 'T' is replaced by
274fbe60fdSStefan Pintilie//                                 'D' when describing the target register.
284fbe60fdSStefan Pintilie//             * [FR|R|V|X|B][A-Z] - register source (i.e. FRA, RA, XB, etc.)
294fbe60fdSStefan Pintilie//             * IMM - immediate (where signedness matters,
304fbe60fdSStefan Pintilie//                     this is SI/UI for signed/unsigned)
314fbe60fdSStefan Pintilie//             * [R|X|FR]Tp - register pair target (i.e. FRTp, RTp)
324fbe60fdSStefan Pintilie//             * R - PC-Relative bit
334fbe60fdSStefan Pintilie//                   (denotes that the address is computed pc-relative)
344fbe60fdSStefan Pintilie//             * VRM - Masked Registers
354fbe60fdSStefan Pintilie//             * AT - target accumulator
364fbe60fdSStefan Pintilie//             * N - the Nth bit in a VSR
374fbe60fdSStefan Pintilie//             * Additional 1-bit operands may be required for certain
384fbe60fdSStefan Pintilie//               instruction formats such as: MC, P, MP
394fbe60fdSStefan Pintilie//             * X / Y / P - mask values. In the instruction encoding, this is
404fbe60fdSStefan Pintilie//                           represented as XMSK, YMSK and PMSK.
414fbe60fdSStefan Pintilie//             * MEM - indicates if the instruction format requires any memory
424fbe60fdSStefan Pintilie//                     accesses. This does not have <OP_LENGTH> attached to it.
434fbe60fdSStefan Pintilie// <OP_LENGTH> - the length of each operand in bits.
444fbe60fdSStefan Pintilie//               For operands that are 1 bit, the '1' is omitted from the name.
454fbe60fdSStefan Pintilie//
464fbe60fdSStefan Pintilie// Example: 8RR_XX4Form_IMM8_XTAB6
474fbe60fdSStefan Pintilie//          8RR_XX4Form is the instruction format.
484fbe60fdSStefan Pintilie//          The operand is an 8-bit immediate (IMM), the destination (XT)
494fbe60fdSStefan Pintilie//          and sources (XA, XB) that are all 6-bits. The destination and
504fbe60fdSStefan Pintilie//          source registers are combined if they are of the same length.
514fbe60fdSStefan Pintilie//          Moreover, the order of operands reflects the order of operands
524fbe60fdSStefan Pintilie//          in the encoding.
534fbe60fdSStefan Pintilie
545abe6c31SLei Huang//-------------------------- Predicate definitions ---------------------------//
555abe6c31SLei Huangdef IsPPC32 : Predicate<"!Subtarget->isPPC64()">;
565abe6c31SLei Huang
575abe6c31SLei Huang
585abe6c31SLei Huang//===----------------------------------------------------------------------===//
595abe6c31SLei Huang// PowerPC ISA 3.1 specific type constraints.
605abe6c31SLei Huang//
615abe6c31SLei Huang
625abe6c31SLei Huangdef SDT_PPCSplat32 : SDTypeProfile<1, 3, [ SDTCisVT<0, v2i64>,
635abe6c31SLei Huang  SDTCisVec<1>, SDTCisInt<2>, SDTCisInt<3>
645abe6c31SLei Huang]>;
655abe6c31SLei Huangdef SDT_PPCAccBuild : SDTypeProfile<1, 4, [
665abe6c31SLei Huang  SDTCisVT<0, v512i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32>,
675abe6c31SLei Huang                       SDTCisVT<3, v4i32>, SDTCisVT<4, v4i32>
685abe6c31SLei Huang]>;
695abe6c31SLei Huangdef SDT_PPCPairBuild : SDTypeProfile<1, 2, [
705abe6c31SLei Huang  SDTCisVT<0, v256i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32>
715abe6c31SLei Huang]>;
725abe6c31SLei Huangdef SDT_PPCAccExtractVsx : SDTypeProfile<1, 2, [
735abe6c31SLei Huang  SDTCisVT<0, v4i32>, SDTCisVT<1, v512i1>, SDTCisPtrTy<2>
745abe6c31SLei Huang]>;
755abe6c31SLei Huangdef SDT_PPCPairExtractVsx : SDTypeProfile<1, 2, [
765abe6c31SLei Huang  SDTCisVT<0, v4i32>, SDTCisVT<1, v256i1>, SDTCisPtrTy<2>
775abe6c31SLei Huang]>;
785abe6c31SLei Huangdef SDT_PPCxxmfacc : SDTypeProfile<1, 1, [
795abe6c31SLei Huang  SDTCisVT<0, v512i1>, SDTCisVT<1, v512i1>
805abe6c31SLei Huang]>;
815abe6c31SLei Huang
82*a4751804SRolandF77def SDT_PPCsetbc : SDTypeProfile<1, 1, [
83*a4751804SRolandF77  SDTCisInt<0>, SDTCisInt<1>
84*a4751804SRolandF77]>;
85*a4751804SRolandF77
865abe6c31SLei Huang//===----------------------------------------------------------------------===//
875abe6c31SLei Huang// ISA 3.1 specific PPCISD nodes.
885abe6c31SLei Huang//
895abe6c31SLei Huang
905abe6c31SLei Huangdef PPCxxsplti32dx : SDNode<"PPCISD::XXSPLTI32DX", SDT_PPCSplat32, []>;
915abe6c31SLei Huangdef PPCAccBuild : SDNode<"PPCISD::ACC_BUILD", SDT_PPCAccBuild, []>;
925abe6c31SLei Huangdef PPCPairBuild : SDNode<"PPCISD::PAIR_BUILD", SDT_PPCPairBuild, []>;
935abe6c31SLei Huangdef PPCAccExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCAccExtractVsx,
945abe6c31SLei Huang                       []>;
955abe6c31SLei Huangdef PPCPairExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCPairExtractVsx,
965abe6c31SLei Huang                        []>;
975abe6c31SLei Huangdef PPCxxmfacc : SDNode<"PPCISD::XXMFACC", SDT_PPCxxmfacc, []>;
98*a4751804SRolandF77def PPCsetbc  : SDNode<"PPCISD::SETBC",   SDT_PPCsetbc, []>;
99*a4751804SRolandF77def PPCsetbcr : SDNode<"PPCISD::SETBCR",  SDT_PPCsetbc, []>;
1005abe6c31SLei Huang
1015abe6c31SLei Huang//===----------------------------------------------------------------------===//
1025abe6c31SLei Huang
1035abe6c31SLei Huang// PC Relative flag (for instructions that use the address of the prefix for
1045abe6c31SLei Huang// address computations).
1055abe6c31SLei Huangclass isPCRel { bit PCRel = 1; }
1065abe6c31SLei Huang
1075abe6c31SLei Huang// PowerPC specific type constraints.
1085abe6c31SLei Huangdef SDT_PPCLXVRZX : SDTypeProfile<1, 2, [
1095abe6c31SLei Huang  SDTCisVT<0, v1i128>, SDTCisPtrTy<1>, SDTCisPtrTy<2>
1105abe6c31SLei Huang]>;
1115abe6c31SLei Huang
1125abe6c31SLei Huang// PPC Specific DAG Nodes.
1135abe6c31SLei Huangdef PPClxvrzx : SDNode<"PPCISD::LXVRZX", SDT_PPCLXVRZX,
114032014efSSergei Barannikov                       [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
1155abe6c31SLei Huang
1165abe6c31SLei Huang// Top-level class for prefixed instructions.
1175abe6c31SLei Huangclass PI<bits<6> pref, bits<6> opcode, dag OOL, dag IOL, string asmstr,
1185abe6c31SLei Huang         InstrItinClass itin> : Instruction {
1195abe6c31SLei Huang  field bits<64> Inst;
1205abe6c31SLei Huang  field bits<64> SoftFail = 0;
1215abe6c31SLei Huang  bit PCRel = 0; // Default value, set by isPCRel.
1225abe6c31SLei Huang  let Size = 8;
1235abe6c31SLei Huang
1245abe6c31SLei Huang  let Namespace = "PPC";
1255abe6c31SLei Huang  let OutOperandList = OOL;
1265abe6c31SLei Huang  let InOperandList = IOL;
1275abe6c31SLei Huang  let AsmString = asmstr;
1285abe6c31SLei Huang  let Itinerary = itin;
1295abe6c31SLei Huang  let Inst{0-5} = pref;
1305abe6c31SLei Huang  let Inst{32-37} = opcode;
1315abe6c31SLei Huang
1325abe6c31SLei Huang  bits<1> PPC970_First = 0;
1335abe6c31SLei Huang  bits<1> PPC970_Single = 0;
1345abe6c31SLei Huang  bits<1> PPC970_Cracked = 0;
1355abe6c31SLei Huang  bits<3> PPC970_Unit = 0;
1365abe6c31SLei Huang
1375abe6c31SLei Huang  /// These fields correspond to the fields in PPCInstrInfo.h.  Any changes to
1385abe6c31SLei Huang  /// these must be reflected there!  See comments there for what these are.
1395abe6c31SLei Huang  let TSFlags{0}   = PPC970_First;
1405abe6c31SLei Huang  let TSFlags{1}   = PPC970_Single;
1415abe6c31SLei Huang  let TSFlags{2}   = PPC970_Cracked;
1425abe6c31SLei Huang  let TSFlags{5-3} = PPC970_Unit;
1435abe6c31SLei Huang
1445abe6c31SLei Huang  bits<1> Prefixed = 1;  // This is a prefixed instruction.
1455abe6c31SLei Huang  let TSFlags{7}  = Prefixed;
1465abe6c31SLei Huang
14748cc4351SJake Egan  // Indicate that this instruction takes a register+immediate memory operand.
14848cc4351SJake Egan  bits<1> MemriOp = 0;
14948cc4351SJake Egan  let TSFlags{10} = MemriOp;
15048cc4351SJake Egan
1515abe6c31SLei Huang  // For cases where multiple instruction definitions really represent the
1525abe6c31SLei Huang  // same underlying instruction but with one definition for 64-bit arguments
1535abe6c31SLei Huang  // and one for 32-bit arguments, this bit breaks the degeneracy between
1545abe6c31SLei Huang  // the two forms and allows TableGen to generate mapping tables.
1555abe6c31SLei Huang  bit Interpretation64Bit = 0;
1565abe6c31SLei Huang
1575abe6c31SLei Huang  // Fields used for relation models.
1585abe6c31SLei Huang  string BaseName = "";
1595abe6c31SLei Huang}
1605abe6c31SLei Huang
1615abe6c31SLei Huang// VX-Form: [ PO VT R VB RC XO ]
1625abe6c31SLei Huangclass VXForm_VTB5_RC<bits<10> xo, bits<5> R, dag OOL, dag IOL, string asmstr,
1635abe6c31SLei Huang                      InstrItinClass itin, list<dag> pattern>
1645abe6c31SLei Huang  : I<4, OOL, IOL, asmstr, itin> {
1655abe6c31SLei Huang  bits<5> VT;
1665abe6c31SLei Huang  bits<5> VB;
1675abe6c31SLei Huang  bit RC = 0;
1685abe6c31SLei Huang
1695abe6c31SLei Huang  let Pattern = pattern;
1705abe6c31SLei Huang
1715abe6c31SLei Huang  let Inst{6-10} = VT;
1725abe6c31SLei Huang  let Inst{11-15} = R;
1735abe6c31SLei Huang  let Inst{16-20} = VB;
1745abe6c31SLei Huang  let Inst{21} = RC;
1755abe6c31SLei Huang  let Inst{22-31} = xo;
1765abe6c31SLei Huang}
1775abe6c31SLei Huang
1785abe6c31SLei Huang// Multiclass definition to account for record and non-record form
1795abe6c31SLei Huang// instructions of VXRForm.
1805abe6c31SLei Huangmulticlass VXForm_VTB5_RCr<bits<10> xo, bits<5> R, dag OOL, dag IOL,
1815abe6c31SLei Huang                            string asmbase, string asmstr,
1825abe6c31SLei Huang                            InstrItinClass itin, list<dag> pattern> {
1835abe6c31SLei Huang  let BaseName = asmbase in {
1845abe6c31SLei Huang    def NAME : VXForm_VTB5_RC<xo, R, OOL, IOL,
1855abe6c31SLei Huang                               !strconcat(asmbase, !strconcat(" ", asmstr)),
1865abe6c31SLei Huang                               itin, pattern>, RecFormRel;
1875abe6c31SLei Huang    let Defs = [CR6] in
1885abe6c31SLei Huang    def _rec : VXForm_VTB5_RC<xo, R, OOL, IOL,
1895abe6c31SLei Huang                               !strconcat(asmbase, !strconcat(". ", asmstr)),
1905abe6c31SLei Huang                               itin, []>, isRecordForm, RecFormRel;
1915abe6c31SLei Huang  }
1925abe6c31SLei Huang}
1935abe6c31SLei Huang
1945abe6c31SLei Huangclass MLS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr,
1955abe6c31SLei Huang                                InstrItinClass itin, list<dag> pattern>
19648cc4351SJake Egan  : PI<1, opcode, OOL, IOL, asmstr, itin>, MemriOp {
1974b43ef3eSJames Y Knight  bits<5> RST;
1980be684edSJames Y Knight  bits<5> RA;
1990be684edSJames Y Knight  bits<34> D;
2005abe6c31SLei Huang
2015abe6c31SLei Huang  let Pattern = pattern;
2025abe6c31SLei Huang
2035abe6c31SLei Huang  // The prefix.
2045abe6c31SLei Huang  let Inst{6-7} = 2;
2055abe6c31SLei Huang  let Inst{8-10} = 0;
2065abe6c31SLei Huang  let Inst{11} = PCRel;
2075abe6c31SLei Huang  let Inst{12-13} = 0;
2080be684edSJames Y Knight  let Inst{14-31} = D{33-16}; // d0
2095abe6c31SLei Huang
2105abe6c31SLei Huang  // The instruction.
2114b43ef3eSJames Y Knight  let Inst{38-42} = RST{4-0};
2120be684edSJames Y Knight  let Inst{43-47} = RA;
2130be684edSJames Y Knight  let Inst{48-63} = D{15-0}; // d1
2145abe6c31SLei Huang}
2155abe6c31SLei Huang
2165abe6c31SLei Huangclass MLS_DForm_R_SI34_RTA5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
2175abe6c31SLei Huang                            InstrItinClass itin, list<dag> pattern>
2185abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
2195abe6c31SLei Huang  bits<5> RT;
2205abe6c31SLei Huang  bits<5> RA;
2215abe6c31SLei Huang  bits<34> SI;
2225abe6c31SLei Huang
2235abe6c31SLei Huang  let Pattern = pattern;
2245abe6c31SLei Huang
2255abe6c31SLei Huang  // The prefix.
2265abe6c31SLei Huang  let Inst{6-7} = 2;
2275abe6c31SLei Huang  let Inst{8-10} = 0;
2285abe6c31SLei Huang  let Inst{11} = PCRel;
2295abe6c31SLei Huang  let Inst{12-13} = 0;
2305abe6c31SLei Huang  let Inst{14-31} = SI{33-16};
2315abe6c31SLei Huang
2325abe6c31SLei Huang  // The instruction.
2335abe6c31SLei Huang  let Inst{38-42} = RT;
2345abe6c31SLei Huang  let Inst{43-47} = RA;
2355abe6c31SLei Huang  let Inst{48-63} = SI{15-0};
2365abe6c31SLei Huang}
2375abe6c31SLei Huang
2385abe6c31SLei Huangclass MLS_DForm_SI34_RT5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
2395abe6c31SLei Huang                         InstrItinClass itin, list<dag> pattern>
2405abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
2415abe6c31SLei Huang  bits<5> RT;
2425abe6c31SLei Huang  bits<34> SI;
2435abe6c31SLei Huang
2445abe6c31SLei Huang  let Pattern = pattern;
2455abe6c31SLei Huang
2465abe6c31SLei Huang  // The prefix.
2475abe6c31SLei Huang  let Inst{6-7} = 2;
2485abe6c31SLei Huang  let Inst{8-10} = 0;
2495abe6c31SLei Huang  let Inst{11} = 0;
2505abe6c31SLei Huang  let Inst{12-13} = 0;
2515abe6c31SLei Huang  let Inst{14-31} = SI{33-16};
2525abe6c31SLei Huang
2535abe6c31SLei Huang  // The instruction.
2545abe6c31SLei Huang  let Inst{38-42} = RT;
2555abe6c31SLei Huang  let Inst{43-47} = 0;
2565abe6c31SLei Huang  let Inst{48-63} = SI{15-0};
2575abe6c31SLei Huang}
2585abe6c31SLei Huang
2595abe6c31SLei Huangmulticlass MLS_DForm_R_SI34_RTA5_p<bits<6> opcode, dag OOL, dag IOL,
2605abe6c31SLei Huang                                   dag PCRel_IOL, string asmstr,
2615abe6c31SLei Huang                                   InstrItinClass itin> {
2625abe6c31SLei Huang  def NAME : MLS_DForm_R_SI34_RTA5<opcode, OOL, IOL,
2635abe6c31SLei Huang                                   !strconcat(asmstr, ", 0"), itin, []>;
2645abe6c31SLei Huang  def pc : MLS_DForm_R_SI34_RTA5<opcode, OOL, PCRel_IOL,
2655abe6c31SLei Huang                                 !strconcat(asmstr, ", 1"), itin, []>, isPCRel;
2665abe6c31SLei Huang}
2675abe6c31SLei Huang
268bc9916ffSStefan Pintilieclass 8LS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr,
2695abe6c31SLei Huang                                InstrItinClass itin, list<dag> pattern>
27048cc4351SJake Egan  : PI<1, opcode, OOL, IOL, asmstr, itin>, MemriOp {
2714b43ef3eSJames Y Knight  bits<5> RST;
2720be684edSJames Y Knight  bits<5> RA;
2730be684edSJames Y Knight  bits<34> D;
2745abe6c31SLei Huang
2755abe6c31SLei Huang  let Pattern = pattern;
2765abe6c31SLei Huang
2775abe6c31SLei Huang  // The prefix.
2785abe6c31SLei Huang  let Inst{6-10} = 0;
2795abe6c31SLei Huang  let Inst{11} = PCRel;
2805abe6c31SLei Huang  let Inst{12-13} = 0;
2810be684edSJames Y Knight  let Inst{14-31} = D{33-16}; // d0
2825abe6c31SLei Huang
2835abe6c31SLei Huang  // The instruction.
2844b43ef3eSJames Y Knight  let Inst{38-42} = RST{4-0};
2850be684edSJames Y Knight  let Inst{43-47} = RA;
2860be684edSJames Y Knight  let Inst{48-63} = D{15-0}; // d1
2875abe6c31SLei Huang}
2885abe6c31SLei Huang
2895abe6c31SLei Huang// 8LS:D-Form: [ 1 0 0 // R // d0
2905abe6c31SLei Huang//               PO TX T RA d1 ]
291bc9916ffSStefan Pintilieclass 8LS_DForm_R_SI34_XT6_RA5_MEM<bits<5> opcode, dag OOL, dag IOL,
292bc9916ffSStefan Pintilie                                   string asmstr, InstrItinClass itin,
293bc9916ffSStefan Pintilie                                   list<dag> pattern>
29448cc4351SJake Egan  : PI<1, { opcode, ? }, OOL, IOL, asmstr, itin>, MemriOp {
2954b43ef3eSJames Y Knight  bits<6> XST;
2960be684edSJames Y Knight  bits<5> RA;
2970be684edSJames Y Knight  bits<34> D;
2985abe6c31SLei Huang
2995abe6c31SLei Huang  let Pattern = pattern;
3005abe6c31SLei Huang
3015abe6c31SLei Huang  // The prefix.
3025abe6c31SLei Huang  let Inst{6-7} = 0;
3035abe6c31SLei Huang  let Inst{8} = 0;
3045abe6c31SLei Huang  let Inst{9-10} = 0; // reserved
3055abe6c31SLei Huang  let Inst{11} = PCRel;
3065abe6c31SLei Huang  let Inst{12-13} = 0; // reserved
3070be684edSJames Y Knight  let Inst{14-31} = D{33-16}; // d0
3085abe6c31SLei Huang
3095abe6c31SLei Huang  // The instruction.
3104b43ef3eSJames Y Knight  let Inst{37} = XST{5};
3114b43ef3eSJames Y Knight  let Inst{38-42} = XST{4-0};
3120be684edSJames Y Knight  let Inst{43-47} = RA;
3130be684edSJames Y Knight  let Inst{48-63} = D{15-0}; // d1
3145abe6c31SLei Huang}
3155abe6c31SLei Huang
3165abe6c31SLei Huang// X-Form: [PO T IMM VRB XO TX]
3175abe6c31SLei Huangclass XForm_XT6_IMM5_VB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
3185abe6c31SLei Huang                         string asmstr, InstrItinClass itin, list<dag> pattern>
3195abe6c31SLei Huang  : I<opcode, OOL, IOL, asmstr, itin> {
3205abe6c31SLei Huang  bits<6> XT;
3215abe6c31SLei Huang  bits<5> VRB;
3225abe6c31SLei Huang  bits<5> IMM;
3235abe6c31SLei Huang
3245abe6c31SLei Huang  let Pattern = pattern;
3255abe6c31SLei Huang  let Inst{6-10} = XT{4-0};
3265abe6c31SLei Huang  let Inst{11-15} = IMM;
3275abe6c31SLei Huang  let Inst{16-20} = VRB;
3285abe6c31SLei Huang  let Inst{21-30} = xo;
3295abe6c31SLei Huang  let Inst{31} = XT{5};
3305abe6c31SLei Huang}
3315abe6c31SLei Huang
3325abe6c31SLei Huangclass 8RR_XX4Form_IMM8_XTAB6<bits<6> opcode, bits<2> xo,
3335abe6c31SLei Huang                             dag OOL, dag IOL, string asmstr,
3345abe6c31SLei Huang                             InstrItinClass itin, list<dag> pattern>
3355abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
3365abe6c31SLei Huang    bits<6> XT;
3375abe6c31SLei Huang    bits<6> XA;
3385abe6c31SLei Huang    bits<6> XB;
3395abe6c31SLei Huang    bits<6> XC;
3405abe6c31SLei Huang    bits<8> IMM;
3415abe6c31SLei Huang
3425abe6c31SLei Huang    let Pattern = pattern;
3435abe6c31SLei Huang
3445abe6c31SLei Huang    // The prefix.
3455abe6c31SLei Huang    let Inst{6-7} = 1;
3465abe6c31SLei Huang    let Inst{8} = 0;
3475abe6c31SLei Huang    let Inst{9-11} = 0;
3485abe6c31SLei Huang    let Inst{12-13} = 0;
3495abe6c31SLei Huang    let Inst{14-23} = 0;
3505abe6c31SLei Huang    let Inst{24-31} = IMM;
3515abe6c31SLei Huang
3525abe6c31SLei Huang    // The instruction.
3535abe6c31SLei Huang    let Inst{38-42} = XT{4-0};
3545abe6c31SLei Huang    let Inst{43-47} = XA{4-0};
3555abe6c31SLei Huang    let Inst{48-52} = XB{4-0};
3565abe6c31SLei Huang    let Inst{53-57} = XC{4-0};
3575abe6c31SLei Huang    let Inst{58-59} = xo;
3585abe6c31SLei Huang    let Inst{60} = XC{5};
3595abe6c31SLei Huang    let Inst{61} = XA{5};
3605abe6c31SLei Huang    let Inst{62} = XB{5};
3615abe6c31SLei Huang    let Inst{63} = XT{5};
3625abe6c31SLei Huang}
3635abe6c31SLei Huang
3645abe6c31SLei Huangclass VXForm_RD5_N3_VB5<bits<11> xo, dag OOL, dag IOL, string asmstr,
3655abe6c31SLei Huang                        InstrItinClass itin, list<dag> pattern>
3665abe6c31SLei Huang  : I<4, OOL, IOL, asmstr, itin> {
3675abe6c31SLei Huang  bits<5> RD;
3685abe6c31SLei Huang  bits<5> VB;
3695abe6c31SLei Huang  bits<3> N;
3705abe6c31SLei Huang
3715abe6c31SLei Huang  let Pattern = pattern;
3725abe6c31SLei Huang
3735abe6c31SLei Huang  let Inst{6-10}  = RD;
3745abe6c31SLei Huang  let Inst{11-12} = 0;
3755abe6c31SLei Huang  let Inst{13-15} = N;
3765abe6c31SLei Huang  let Inst{16-20} = VB;
3775abe6c31SLei Huang  let Inst{21-31} = xo;
3785abe6c31SLei Huang}
3795abe6c31SLei Huang
3805abe6c31SLei Huang
3815abe6c31SLei Huang// VX-Form: [PO VRT RA VRB XO].
3825abe6c31SLei Huang// Destructive (insert) forms are suffixed with _ins.
3835abe6c31SLei Huangclass VXForm_VTB5_RA5_ins<bits<11> xo, string opc, list<dag> pattern>
3844b43ef3eSJames Y Knight  : VXForm_1<xo, (outs vrrc:$VD), (ins vrrc:$VDi, gprc:$VA, vrrc:$VB),
3854b43ef3eSJames Y Knight             !strconcat(opc, " $VD, $VA, $VB"), IIC_VecGeneral, pattern>,
3864b43ef3eSJames Y Knight             RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
3875abe6c31SLei Huang
3885abe6c31SLei Huang// VX-Form: [PO VRT RA RB XO].
3895abe6c31SLei Huang// Destructive (insert) forms are suffixed with _ins.
3905abe6c31SLei Huangclass VXForm_VRT5_RAB5_ins<bits<11> xo, string opc, list<dag> pattern>
3914b43ef3eSJames Y Knight  : VXForm_1<xo, (outs vrrc:$VD), (ins vrrc:$VDi, gprc:$VA, gprc:$VB),
3924b43ef3eSJames Y Knight             !strconcat(opc, " $VD, $VA, $VB"), IIC_VecGeneral, pattern>,
3934b43ef3eSJames Y Knight             RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
3945abe6c31SLei Huang
3955abe6c31SLei Huang// VX-Form: [ PO BF // VRA VRB XO ]
3965abe6c31SLei Huangclass VXForm_BF3_VAB5<bits<11> xo, dag OOL, dag IOL, string asmstr,
3975abe6c31SLei Huang                      InstrItinClass itin, list<dag> pattern>
3985abe6c31SLei Huang  : I<4, OOL, IOL, asmstr, itin> {
3995abe6c31SLei Huang  bits<3> BF;
4005abe6c31SLei Huang  bits<5> VA;
4015abe6c31SLei Huang  bits<5> VB;
4025abe6c31SLei Huang
4035abe6c31SLei Huang  let Pattern = pattern;
4045abe6c31SLei Huang
4055abe6c31SLei Huang  let Inst{6-8} = BF;
4065abe6c31SLei Huang  let Inst{9-10} = 0;
4075abe6c31SLei Huang  let Inst{11-15} = VA;
4085abe6c31SLei Huang  let Inst{16-20} = VB;
4095abe6c31SLei Huang  let Inst{21-31} = xo;
4105abe6c31SLei Huang}
4115abe6c31SLei Huang
4125abe6c31SLei Huang// VN-Form: [PO VRT VRA VRB PS SD XO]
4135abe6c31SLei Huang// SD is "Shift Direction"
4145abe6c31SLei Huangclass VNForm_VTAB5_SD3<bits<6> xo, bits<2> ps, dag OOL, dag IOL, string asmstr,
4155abe6c31SLei Huang                       InstrItinClass itin, list<dag> pattern>
4165abe6c31SLei Huang    : I<4, OOL, IOL, asmstr, itin> {
4175abe6c31SLei Huang  bits<5> VRT;
4185abe6c31SLei Huang  bits<5> VRA;
4195abe6c31SLei Huang  bits<5> VRB;
4205abe6c31SLei Huang  bits<3> SD;
4215abe6c31SLei Huang
4225abe6c31SLei Huang  let Pattern = pattern;
4235abe6c31SLei Huang
4245abe6c31SLei Huang  let Inst{6-10}  = VRT;
4255abe6c31SLei Huang  let Inst{11-15} = VRA;
4265abe6c31SLei Huang  let Inst{16-20} = VRB;
4275abe6c31SLei Huang  let Inst{21-22} = ps;
4285abe6c31SLei Huang  let Inst{23-25} = SD;
4295abe6c31SLei Huang  let Inst{26-31} = xo;
4305abe6c31SLei Huang}
4315abe6c31SLei Huang
4325abe6c31SLei Huangclass VXForm_RD5_MP_VB5<bits<11> xo, bits<4> eo, dag OOL, dag IOL,
4335abe6c31SLei Huang                        string asmstr, InstrItinClass itin, list<dag> pattern>
4345abe6c31SLei Huang  : I<4, OOL, IOL, asmstr, itin> {
4355abe6c31SLei Huang  bits<5> RD;
4365abe6c31SLei Huang  bits<5> VB;
4375abe6c31SLei Huang  bit MP;
4385abe6c31SLei Huang
4395abe6c31SLei Huang  let Pattern = pattern;
4405abe6c31SLei Huang
4415abe6c31SLei Huang  let Inst{6-10}  = RD;
4425abe6c31SLei Huang  let Inst{11-14} = eo;
4435abe6c31SLei Huang  let Inst{15} = MP;
4445abe6c31SLei Huang  let Inst{16-20} = VB;
4455abe6c31SLei Huang  let Inst{21-31} = xo;
4465abe6c31SLei Huang}
4475abe6c31SLei Huang
4485abe6c31SLei Huang// 8RR:D-Form: [ 1 1 0 // // imm0
4495abe6c31SLei Huang//               PO T XO TX imm1 ].
4505abe6c31SLei Huangclass 8RR_DForm_IMM32_XT6<bits<6> opcode, bits<4> xo, dag OOL, dag IOL,
4515abe6c31SLei Huang                          string asmstr, InstrItinClass itin,
4525abe6c31SLei Huang                          list<dag> pattern>
4535abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
4545abe6c31SLei Huang  bits<6> XT;
4555abe6c31SLei Huang  bits<32> IMM32;
4565abe6c31SLei Huang
4575abe6c31SLei Huang  let Pattern = pattern;
4585abe6c31SLei Huang
4595abe6c31SLei Huang  // The prefix.
4605abe6c31SLei Huang  let Inst{6-7} = 1;
4615abe6c31SLei Huang  let Inst{8-11} = 0;
4625abe6c31SLei Huang  let Inst{12-13} = 0; // reserved
4635abe6c31SLei Huang  let Inst{14-15} = 0; // reserved
4645abe6c31SLei Huang  let Inst{16-31} = IMM32{31-16};
4655abe6c31SLei Huang
4665abe6c31SLei Huang  // The instruction.
4675abe6c31SLei Huang  let Inst{38-42} = XT{4-0};
4685abe6c31SLei Huang  let Inst{43-46} = xo;
4695abe6c31SLei Huang  let Inst{47} = XT{5};
4705abe6c31SLei Huang  let Inst{48-63} = IMM32{15-0};
4715abe6c31SLei Huang}
4725abe6c31SLei Huang
4735abe6c31SLei Huang// 8RR:D-Form: [ 1 1 0 // // imm0
4745abe6c31SLei Huang//               PO T XO IX TX imm1 ].
4755abe6c31SLei Huangclass 8RR_DForm_IMM32_XT6_IX<bits<6> opcode, bits<3> xo, dag OOL, dag IOL,
4765abe6c31SLei Huang                             string asmstr, InstrItinClass itin,
4775abe6c31SLei Huang                             list<dag> pattern>
4785abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
4795abe6c31SLei Huang  bits<6> XT;
4805abe6c31SLei Huang  bit IX;
4815abe6c31SLei Huang  bits<32> IMM32;
4825abe6c31SLei Huang
4835abe6c31SLei Huang  let Pattern = pattern;
4845abe6c31SLei Huang
4855abe6c31SLei Huang  // The prefix.
4865abe6c31SLei Huang  let Inst{6-7} = 1;
4875abe6c31SLei Huang  let Inst{8-11} = 0;
4885abe6c31SLei Huang  let Inst{12-13} = 0; // reserved
4895abe6c31SLei Huang  let Inst{14-15} = 0; // reserved
4905abe6c31SLei Huang  let Inst{16-31} = IMM32{31-16};
4915abe6c31SLei Huang
4925abe6c31SLei Huang  // The instruction.
4935abe6c31SLei Huang  let Inst{38-42} = XT{4-0};
4945abe6c31SLei Huang  let Inst{43-45} = xo;
4955abe6c31SLei Huang  let Inst{46} = IX;
4965abe6c31SLei Huang  let Inst{47} = XT{5};
4975abe6c31SLei Huang  let Inst{48-63} = IMM32{15-0};
4985abe6c31SLei Huang}
4995abe6c31SLei Huang
5005abe6c31SLei Huangclass 8RR_XX4Form_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL,
5015abe6c31SLei Huang                         string asmstr, InstrItinClass itin, list<dag> pattern>
5025abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
5035abe6c31SLei Huang  bits<6> XT;
5045abe6c31SLei Huang  bits<6> XA;
5055abe6c31SLei Huang  bits<6> XB;
5065abe6c31SLei Huang  bits<6> XC;
5075abe6c31SLei Huang
5085abe6c31SLei Huang  let Pattern = pattern;
5095abe6c31SLei Huang
5105abe6c31SLei Huang  // The prefix.
5115abe6c31SLei Huang  let Inst{6-7} = 1;
5125abe6c31SLei Huang  let Inst{8-11} = 0;
5135abe6c31SLei Huang  let Inst{12-13} = 0;
5145abe6c31SLei Huang  let Inst{14-31} = 0;
5155abe6c31SLei Huang
5165abe6c31SLei Huang  // The instruction.
5175abe6c31SLei Huang  let Inst{38-42} = XT{4-0};
5185abe6c31SLei Huang  let Inst{43-47} = XA{4-0};
5195abe6c31SLei Huang  let Inst{48-52} = XB{4-0};
5205abe6c31SLei Huang  let Inst{53-57} = XC{4-0};
5215abe6c31SLei Huang  let Inst{58-59} = xo;
5225abe6c31SLei Huang  let Inst{60} = XC{5};
5235abe6c31SLei Huang  let Inst{61} = XA{5};
5245abe6c31SLei Huang  let Inst{62} = XB{5};
5255abe6c31SLei Huang  let Inst{63} = XT{5};
5265abe6c31SLei Huang}
5275abe6c31SLei Huang
5285abe6c31SLei Huangclass 8RR_XX4Form_IMM3_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL,
5295abe6c31SLei Huang                              string asmstr, InstrItinClass itin,
5305abe6c31SLei Huang                              list<dag> pattern>
5315abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
5325abe6c31SLei Huang  bits<6> XT;
5335abe6c31SLei Huang  bits<6> XA;
5345abe6c31SLei Huang  bits<6> XB;
5355abe6c31SLei Huang  bits<6> XC;
5365abe6c31SLei Huang  bits<3> IMM;
5375abe6c31SLei Huang
5385abe6c31SLei Huang  let Pattern = pattern;
5395abe6c31SLei Huang
5405abe6c31SLei Huang  // The prefix.
5415abe6c31SLei Huang  let Inst{6-7} = 1;
5425abe6c31SLei Huang  let Inst{8-11} = 0;
5435abe6c31SLei Huang  let Inst{12-13} = 0;
5445abe6c31SLei Huang  let Inst{14-28} = 0;
5455abe6c31SLei Huang  let Inst{29-31} = IMM;
5465abe6c31SLei Huang
5475abe6c31SLei Huang  // The instruction.
5485abe6c31SLei Huang  let Inst{38-42} = XT{4-0};
5495abe6c31SLei Huang  let Inst{43-47} = XA{4-0};
5505abe6c31SLei Huang  let Inst{48-52} = XB{4-0};
5515abe6c31SLei Huang  let Inst{53-57} = XC{4-0};
5525abe6c31SLei Huang  let Inst{58-59} = xo;
5535abe6c31SLei Huang  let Inst{60} = XC{5};
5545abe6c31SLei Huang  let Inst{61} = XA{5};
5555abe6c31SLei Huang  let Inst{62} = XB{5};
5565abe6c31SLei Huang  let Inst{63} = XT{5};
5575abe6c31SLei Huang}
5585abe6c31SLei Huang
5595abe6c31SLei Huang// [PO BF / XO2 B XO BX /]
5605abe6c31SLei Huangclass XX2_BF3_XO5_XB6_XO9<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL,
5615abe6c31SLei Huang                          dag IOL, string asmstr, InstrItinClass itin,
5625abe6c31SLei Huang                          list<dag> pattern>
5635abe6c31SLei Huang  : I<opcode, OOL, IOL, asmstr, itin> {
5645abe6c31SLei Huang  bits<3> BF;
5655abe6c31SLei Huang  bits<6> XB;
5665abe6c31SLei Huang
5675abe6c31SLei Huang  let Pattern = pattern;
5685abe6c31SLei Huang
5695abe6c31SLei Huang  let Inst{6-8}   = BF;
5705abe6c31SLei Huang  let Inst{9-10}  = 0;
5715abe6c31SLei Huang  let Inst{11-15} = xo2;
5725abe6c31SLei Huang  let Inst{16-20} = XB{4-0};
5735abe6c31SLei Huang  let Inst{21-29} = xo;
5745abe6c31SLei Huang  let Inst{30}    = XB{5};
5755abe6c31SLei Huang  let Inst{31}    = 0;
5765abe6c31SLei Huang}
5775abe6c31SLei Huang
5785abe6c31SLei Huang// X-Form: [ PO RT BI /// XO / ]
5795abe6c31SLei Huangclass XForm_XT5_BI5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
5805abe6c31SLei Huang                    string asmstr, InstrItinClass itin, list<dag> pattern>
5815abe6c31SLei Huang  : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
5824b43ef3eSJames Y Knight  bits<5> BI;
5834b43ef3eSJames Y Knight  let RA = BI;
5844b43ef3eSJames Y Knight  let RB = 0;
5855abe6c31SLei Huang}
5865abe6c31SLei Huang
5875abe6c31SLei Huangmulticlass MLS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL,
588ea8b95d0SStefan Pintilie                                       dag PCRel_IOL, dag PCRelOnly_IOL,
589ea8b95d0SStefan Pintilie                                       string asmstr, string asmstr_pcext,
5905abe6c31SLei Huang                                       InstrItinClass itin> {
5915abe6c31SLei Huang  def NAME : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL,
5925abe6c31SLei Huang                                       !strconcat(asmstr, ", 0"), itin, []>;
5935abe6c31SLei Huang  def pc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL,
5945abe6c31SLei Huang                                     !strconcat(asmstr, ", 1"), itin, []>,
5955abe6c31SLei Huang                                     isPCRel;
596ea8b95d0SStefan Pintilie  let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
597ea8b95d0SStefan Pintilie    def nopc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, asmstr, itin, []>;
59848cc4351SJake Egan    let RA = 0, MemriOp = 0 in
599ea8b95d0SStefan Pintilie      def onlypc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRelOnly_IOL,
600ea8b95d0SStefan Pintilie                                             asmstr_pcext, itin, []>, isPCRel;
601ea8b95d0SStefan Pintilie  }
6025abe6c31SLei Huang}
6035abe6c31SLei Huang
604bc9916ffSStefan Pintiliemulticlass 8LS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL,
605ea8b95d0SStefan Pintilie                                       dag PCRel_IOL, dag PCRelOnly_IOL,
606ea8b95d0SStefan Pintilie                                       string asmstr, string asmstr_pcext,
6075abe6c31SLei Huang                                       InstrItinClass itin> {
608bc9916ffSStefan Pintilie  def NAME : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL,
6095abe6c31SLei Huang                                       !strconcat(asmstr, ", 0"), itin, []>;
610bc9916ffSStefan Pintilie  def pc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL,
6115abe6c31SLei Huang                                     !strconcat(asmstr, ", 1"), itin, []>,
6125abe6c31SLei Huang                                     isPCRel;
613ea8b95d0SStefan Pintilie  let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
614ea8b95d0SStefan Pintilie    def nopc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, asmstr, itin, []>;
61548cc4351SJake Egan    let RA = 0, MemriOp = 0 in
616ea8b95d0SStefan Pintilie      def onlypc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRelOnly_IOL,
617ea8b95d0SStefan Pintilie                                             asmstr_pcext, itin, []>, isPCRel;
618ea8b95d0SStefan Pintilie  }
6195abe6c31SLei Huang}
6205abe6c31SLei Huang
621bc9916ffSStefan Pintiliemulticlass 8LS_DForm_R_SI34_XT6_RA5_MEM_p<bits<5> opcode, dag OOL, dag IOL,
622ea8b95d0SStefan Pintilie                                          dag PCRel_IOL, dag PCRelOnly_IOL,
623ea8b95d0SStefan Pintilie                                          string asmstr, string asmstr_pcext,
624bc9916ffSStefan Pintilie                                          InstrItinClass itin> {
625bc9916ffSStefan Pintilie  def NAME : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL,
626bc9916ffSStefan Pintilie                                          !strconcat(asmstr, ", 0"), itin, []>;
627bc9916ffSStefan Pintilie  def pc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRel_IOL,
628bc9916ffSStefan Pintilie                                        !strconcat(asmstr, ", 1"), itin, []>,
629bc9916ffSStefan Pintilie                                        isPCRel;
630ea8b95d0SStefan Pintilie  let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
631ea8b95d0SStefan Pintilie    def nopc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL, asmstr, itin, []>;
63248cc4351SJake Egan    let RA = 0, MemriOp = 0 in
633ea8b95d0SStefan Pintilie      def onlypc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRelOnly_IOL,
634ea8b95d0SStefan Pintilie                                                asmstr_pcext, itin, []>, isPCRel;
635ea8b95d0SStefan Pintilie  }
636bc9916ffSStefan Pintilie}
637bc9916ffSStefan Pintilie
638bc9916ffSStefan Pintiliedef PrefixInstrs : Predicate<"Subtarget->hasPrefixInstrs()">;
639bc9916ffSStefan Pintiliedef IsISA3_1 : Predicate<"Subtarget->isISA3_1()">;
640bc9916ffSStefan Pintiliedef PairedVectorMemops : Predicate<"Subtarget->pairedVectorMemops()">;
641bc9916ffSStefan Pintiliedef RCCp {
642bc9916ffSStefan Pintilie  dag AToVSRC = (COPY_TO_REGCLASS $XA, VSRC);
643bc9916ffSStefan Pintilie  dag BToVSRC = (COPY_TO_REGCLASS $XB, VSRC);
644bc9916ffSStefan Pintilie}
645bc9916ffSStefan Pintilie
646bc9916ffSStefan Pintilielet Predicates = [PrefixInstrs] in {
647bc9916ffSStefan Pintilie  let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
648bc9916ffSStefan Pintilie    defm PADDI8 :
6494069299dSStefan Pintilie      MLS_DForm_R_SI34_RTA5_p<14, (outs g8rc:$RT), (ins g8rc_nox0:$RA, s34imm:$SI),
650bc9916ffSStefan Pintilie                              (ins immZero:$RA, s34imm_pcrel:$SI),
651bc9916ffSStefan Pintilie                              "paddi $RT, $RA, $SI", IIC_LdStLFD>;
652bc9916ffSStefan Pintilie    let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
653bc9916ffSStefan Pintilie      def PLI8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT),
654bc9916ffSStefan Pintilie                                    (ins s34imm:$SI),
655bc9916ffSStefan Pintilie                                    "pli $RT, $SI", IIC_IntSimple, []>;
656bc9916ffSStefan Pintilie    }
657bc9916ffSStefan Pintilie  }
658bc9916ffSStefan Pintilie  defm PADDI :
6594069299dSStefan Pintilie    MLS_DForm_R_SI34_RTA5_p<14, (outs gprc:$RT), (ins gprc_nor0:$RA, s34imm:$SI),
660bc9916ffSStefan Pintilie                            (ins immZero:$RA, s34imm_pcrel:$SI),
661bc9916ffSStefan Pintilie                            "paddi $RT, $RA, $SI", IIC_LdStLFD>;
662bc9916ffSStefan Pintilie  let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
663bc9916ffSStefan Pintilie    def PLI : MLS_DForm_SI34_RT5<14, (outs gprc:$RT),
664bc9916ffSStefan Pintilie                                 (ins s34imm:$SI),
665bc9916ffSStefan Pintilie                                 "pli $RT, $SI", IIC_IntSimple, []>;
666bc9916ffSStefan Pintilie  }
667bc9916ffSStefan Pintilie
6686127f15eSzhijian lin  let mayLoad = 1, mayStore = 0 in {
669bc9916ffSStefan Pintilie    let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
670bc9916ffSStefan Pintilie      defm PLBZ8 :
6710be684edSJames Y Knight        MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
672ea8b95d0SStefan Pintilie                                    (ins (memri34_pcrel $D, $RA):$addr),
673ea8b95d0SStefan Pintilie                                    (ins s34imm_pcrel:$D), "plbz $RST, $addr",
674ea8b95d0SStefan Pintilie                                    "plbz $RST, $D", IIC_LdStLFD>;
675bc9916ffSStefan Pintilie      defm PLHZ8 :
6760be684edSJames Y Knight        MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
677ea8b95d0SStefan Pintilie                                    (ins (memri34_pcrel $D, $RA):$addr),
678ea8b95d0SStefan Pintilie                                    (ins s34imm_pcrel:$D), "plhz $RST, $addr",
679ea8b95d0SStefan Pintilie                                    "plhz $RST, $D", IIC_LdStLFD>;
680bc9916ffSStefan Pintilie      defm PLHA8 :
6810be684edSJames Y Knight        MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
682ea8b95d0SStefan Pintilie                                    (ins (memri34_pcrel $D, $RA):$addr),
683ea8b95d0SStefan Pintilie                                    (ins s34imm_pcrel:$D), "plha $RST, $addr",
684ea8b95d0SStefan Pintilie                                    "plha $RST, $D", IIC_LdStLFD>;
685bc9916ffSStefan Pintilie      defm PLWA8 :
6860be684edSJames Y Knight        8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
6870be684edSJames Y Knight                                    (ins (memri34_pcrel $D, $RA):$addr),
688ea8b95d0SStefan Pintilie                                    (ins s34imm_pcrel:$D),
689ea8b95d0SStefan Pintilie                                    "plwa $RST, $addr", "plwa $RST, $D",  IIC_LdStLFD>;
690bc9916ffSStefan Pintilie      defm PLWZ8 :
6910be684edSJames Y Knight        MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
692ea8b95d0SStefan Pintilie                                    (ins (memri34_pcrel $D, $RA):$addr),
693ea8b95d0SStefan Pintilie                                    (ins s34imm_pcrel:$D), "plwz $RST, $addr",
694ea8b95d0SStefan Pintilie                                    "plwz $RST, $D", IIC_LdStLFD>;
695bc9916ffSStefan Pintilie    }
696bc9916ffSStefan Pintilie    defm PLBZ :
6970be684edSJames Y Knight      MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
698ea8b95d0SStefan Pintilie                                  (ins (memri34_pcrel $D, $RA):$addr),
699ea8b95d0SStefan Pintilie                                  (ins s34imm_pcrel:$D), "plbz $RST, $addr",
700ea8b95d0SStefan Pintilie                                  "plbz $RST, $D", IIC_LdStLFD>;
701bc9916ffSStefan Pintilie    defm PLHZ :
7020be684edSJames Y Knight      MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
703ea8b95d0SStefan Pintilie                                  (ins (memri34_pcrel $D, $RA):$addr),
704ea8b95d0SStefan Pintilie                                  (ins s34imm_pcrel:$D), "plhz $RST, $addr",
705ea8b95d0SStefan Pintilie                                  "plhz $RST, $D", IIC_LdStLFD>;
706bc9916ffSStefan Pintilie    defm PLHA :
7070be684edSJames Y Knight      MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
708ea8b95d0SStefan Pintilie                                  (ins (memri34_pcrel $D, $RA):$addr),
709ea8b95d0SStefan Pintilie                                  (ins s34imm_pcrel:$D), "plha $RST, $addr",
710ea8b95d0SStefan Pintilie                                  "plha $RST, $D", IIC_LdStLFD>;
711bc9916ffSStefan Pintilie    defm PLWZ :
7120be684edSJames Y Knight      MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
713ea8b95d0SStefan Pintilie                                  (ins (memri34_pcrel $D, $RA):$addr),
714ea8b95d0SStefan Pintilie                                  (ins s34imm_pcrel:$D), "plwz $RST, $addr",
715ea8b95d0SStefan Pintilie                                  "plwz $RST, $D", IIC_LdStLFD>;
716bc9916ffSStefan Pintilie    defm PLWA :
7170be684edSJames Y Knight      8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
718ea8b95d0SStefan Pintilie                                  (ins (memri34_pcrel $D, $RA):$addr),
719ea8b95d0SStefan Pintilie                                  (ins s34imm_pcrel:$D),
720ea8b95d0SStefan Pintilie                                  "plwa $RST, $addr", "plwa $RST, $D",
721bc9916ffSStefan Pintilie                                  IIC_LdStLFD>;
722bc9916ffSStefan Pintilie    defm PLD :
7230be684edSJames Y Knight      8LS_DForm_R_SI34_RTA5_MEM_p<57, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
724ea8b95d0SStefan Pintilie                                  (ins (memri34_pcrel $D, $RA):$addr),
725ea8b95d0SStefan Pintilie                                  (ins s34imm_pcrel:$D),
726ea8b95d0SStefan Pintilie                                  "pld $RST, $addr", "pld $RST, $D",
727bc9916ffSStefan Pintilie                                  IIC_LdStLFD>;
728bc9916ffSStefan Pintilie  }
729bc9916ffSStefan Pintilie
730bc9916ffSStefan Pintilie  let mayStore = 1, mayLoad = 0 in {
731bc9916ffSStefan Pintilie    let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
732bc9916ffSStefan Pintilie      defm PSTB8 :
7330be684edSJames Y Knight        MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr),
7340be684edSJames Y Knight                                    (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr),
735ea8b95d0SStefan Pintilie                                    (ins g8rc:$RST, s34imm_pcrel:$D),
736ea8b95d0SStefan Pintilie                                    "pstb $RST, $addr", "pstb $RST, $D", IIC_LdStLFD>;
737bc9916ffSStefan Pintilie      defm PSTH8 :
7380be684edSJames Y Knight        MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr),
7390be684edSJames Y Knight                                    (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr),
740ea8b95d0SStefan Pintilie                                    (ins g8rc:$RST, s34imm_pcrel:$D),
741ea8b95d0SStefan Pintilie                                    "psth $RST, $addr", "psth $RST, $D", IIC_LdStLFD>;
742bc9916ffSStefan Pintilie      defm PSTW8 :
7430be684edSJames Y Knight        MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr),
7440be684edSJames Y Knight                                    (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr),
745ea8b95d0SStefan Pintilie                                    (ins g8rc:$RST, s34imm_pcrel:$D),
746ea8b95d0SStefan Pintilie                                    "pstw $RST, $addr", "pstw $RST, $D", IIC_LdStLFD>;
747bc9916ffSStefan Pintilie    }
748bc9916ffSStefan Pintilie    defm PSTB :
7490be684edSJames Y Knight      MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr),
7500be684edSJames Y Knight                                  (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr),
751ea8b95d0SStefan Pintilie                                  (ins gprc:$RST, s34imm_pcrel:$D),
752ea8b95d0SStefan Pintilie                                  "pstb $RST, $addr", "pstb $RST, $D", IIC_LdStLFD>;
753bc9916ffSStefan Pintilie    defm PSTH :
7540be684edSJames Y Knight      MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr),
7550be684edSJames Y Knight                                  (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr),
756ea8b95d0SStefan Pintilie                                  (ins gprc:$RST, s34imm_pcrel:$D),
757ea8b95d0SStefan Pintilie                                  "psth $RST, $addr", "psth $RST, $D", IIC_LdStLFD>;
758bc9916ffSStefan Pintilie    defm PSTW :
7590be684edSJames Y Knight      MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr),
7600be684edSJames Y Knight                                  (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr),
761ea8b95d0SStefan Pintilie                                  (ins gprc:$RST, s34imm_pcrel:$D),
762ea8b95d0SStefan Pintilie                                  "pstw $RST, $addr", "pstw $RST, $D", IIC_LdStLFD>;
763bc9916ffSStefan Pintilie    defm PSTD :
7640be684edSJames Y Knight      8LS_DForm_R_SI34_RTA5_MEM_p<61, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr),
7650be684edSJames Y Knight                                  (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr),
766ea8b95d0SStefan Pintilie                                  (ins g8rc:$RST, s34imm_pcrel:$D),
767ea8b95d0SStefan Pintilie                                  "pstd $RST, $addr", "pstd $RST, $D", IIC_LdStLFD>;
768bc9916ffSStefan Pintilie  }
769bc9916ffSStefan Pintilie}
770bc9916ffSStefan Pintilie
771b41dbe60Szhijian linlet Predicates = [PrefixInstrs, HasFPU] in {
772b41dbe60Szhijian lin  let mayLoad = 1, mayStore = 0 in {
773b41dbe60Szhijian lin    defm PLFS :
774b41dbe60Szhijian lin      MLS_DForm_R_SI34_RTA5_MEM_p<48, (outs f4rc:$RST), (ins (memri34 $D, $RA):$addr),
775b41dbe60Szhijian lin                                  (ins (memri34_pcrel $D, $RA):$addr),
776b41dbe60Szhijian lin                                  (ins s34imm_pcrel:$D), "plfs $RST, $addr",
777b41dbe60Szhijian lin                                  "plfs $RST, $D", IIC_LdStLFD>;
778b41dbe60Szhijian lin    defm PLFD :
779b41dbe60Szhijian lin      MLS_DForm_R_SI34_RTA5_MEM_p<50, (outs f8rc:$RST), (ins (memri34 $D, $RA):$addr),
780b41dbe60Szhijian lin                                  (ins  (memri34_pcrel $D, $RA):$addr),
781b41dbe60Szhijian lin                                  (ins s34imm_pcrel:$D), "plfd $RST, $addr",
782b41dbe60Szhijian lin                                  "plfd $RST, $D", IIC_LdStLFD>;
783b41dbe60Szhijian lin  }
784b41dbe60Szhijian lin  let mayStore = 1, mayLoad = 0 in {
785b41dbe60Szhijian lin    defm PSTFS :
786b41dbe60Szhijian lin      MLS_DForm_R_SI34_RTA5_MEM_p<52, (outs), (ins f4rc:$RST, (memri34 $D, $RA):$addr),
787b41dbe60Szhijian lin                                  (ins f4rc:$RST, (memri34_pcrel $D, $RA):$addr),
788b41dbe60Szhijian lin                                  (ins f4rc:$RST, s34imm_pcrel:$D),
789b41dbe60Szhijian lin                                  "pstfs $RST, $addr", "pstfs $RST, $D", IIC_LdStLFD>;
790b41dbe60Szhijian lin    defm PSTFD :
791b41dbe60Szhijian lin      MLS_DForm_R_SI34_RTA5_MEM_p<54, (outs), (ins f8rc:$RST, (memri34 $D, $RA):$addr),
792b41dbe60Szhijian lin                                  (ins f8rc:$RST, (memri34_pcrel $D, $RA):$addr),
793b41dbe60Szhijian lin                                  (ins f8rc:$RST, s34imm_pcrel:$D),
794b41dbe60Szhijian lin                                  "pstfd $RST, $addr", "pstfd $RST, $D", IIC_LdStLFD>;
795b41dbe60Szhijian lin  }
796b41dbe60Szhijian lin}
797b41dbe60Szhijian lin
798b41dbe60Szhijian linlet Predicates = [PrefixInstrs, HasP10Vector] in {
799b41dbe60Szhijian lin  let mayLoad = 1, mayStore = 0 in {
800b41dbe60Szhijian lin    defm PLXV :
801b41dbe60Szhijian lin      8LS_DForm_R_SI34_XT6_RA5_MEM_p<25, (outs vsrc:$XST), (ins (memri34 $D, $RA):$addr),
802b41dbe60Szhijian lin                                     (ins (memri34_pcrel $D, $RA):$addr),
803b41dbe60Szhijian lin                                     (ins s34imm_pcrel:$D),
804b41dbe60Szhijian lin                                     "plxv $XST, $addr", "plxv $XST, $D", IIC_LdStLFD>;
805b41dbe60Szhijian lin    defm PLXSSP :
806b41dbe60Szhijian lin      8LS_DForm_R_SI34_RTA5_MEM_p<43, (outs vfrc:$RST), (ins (memri34 $D, $RA):$addr),
807b41dbe60Szhijian lin                                  (ins (memri34_pcrel $D, $RA):$addr),
808b41dbe60Szhijian lin                                  (ins s34imm_pcrel:$D),
809b41dbe60Szhijian lin                                  "plxssp $RST, $addr",  "plxssp $RST, $D",
810b41dbe60Szhijian lin                                  IIC_LdStLFD>;
811b41dbe60Szhijian lin    defm PLXSD :
812b41dbe60Szhijian lin      8LS_DForm_R_SI34_RTA5_MEM_p<42, (outs vfrc:$RST), (ins (memri34 $D, $RA):$addr),
813b41dbe60Szhijian lin                                  (ins (memri34_pcrel $D, $RA):$addr),
814b41dbe60Szhijian lin                                  (ins s34imm_pcrel:$D),
815b41dbe60Szhijian lin                                  "plxsd $RST, $addr", "plxsd $RST, $D",
816b41dbe60Szhijian lin                                  IIC_LdStLFD>;
817b41dbe60Szhijian lin  }
818b41dbe60Szhijian lin let mayStore = 1, mayLoad = 0 in {
819b41dbe60Szhijian lin    defm PSTXV :
820b41dbe60Szhijian lin      8LS_DForm_R_SI34_XT6_RA5_MEM_p<27, (outs), (ins vsrc:$XST, (memri34 $D, $RA):$addr),
821b41dbe60Szhijian lin                                     (ins vsrc:$XST, (memri34_pcrel $D, $RA):$addr),
822b41dbe60Szhijian lin                                     (ins vsrc:$XST, s34imm_pcrel:$D),
823b41dbe60Szhijian lin                                     "pstxv $XST, $addr", "pstxv $XST, $D", IIC_LdStLFD>;
824b41dbe60Szhijian lin    defm PSTXSSP :
825b41dbe60Szhijian lin      8LS_DForm_R_SI34_RTA5_MEM_p<47, (outs), (ins vfrc:$RST, (memri34 $D, $RA):$addr),
826b41dbe60Szhijian lin                                  (ins vfrc:$RST, (memri34_pcrel $D, $RA):$addr),
827b41dbe60Szhijian lin                                  (ins vfrc:$RST, s34imm_pcrel:$D),
828b41dbe60Szhijian lin                                  "pstxssp $RST, $addr", "pstxssp $RST, $D", IIC_LdStLFD>;
829b41dbe60Szhijian lin    defm PSTXSD :
830b41dbe60Szhijian lin      8LS_DForm_R_SI34_RTA5_MEM_p<46, (outs), (ins vfrc:$RST, (memri34 $D, $RA):$addr),
831b41dbe60Szhijian lin                                  (ins vfrc:$RST, (memri34_pcrel $D, $RA):$addr),
832b41dbe60Szhijian lin                                  (ins vfrc:$RST, s34imm_pcrel:$D),
833b41dbe60Szhijian lin                                  "pstxsd $RST, $addr", "pstxsd $RST, $D", IIC_LdStLFD>;
834b41dbe60Szhijian lin  }
835b41dbe60Szhijian lin  def XXPERMX :
836b41dbe60Szhijian lin    8RR_XX4Form_IMM3_XTABC6<34, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
837b41dbe60Szhijian lin                            vsrc:$XC, u3imm:$IMM),
838b41dbe60Szhijian lin                            "xxpermx $XT, $XA, $XB, $XC, $IMM",
839b41dbe60Szhijian lin                            IIC_VecPerm, []>;
840b41dbe60Szhijian lin  def XXBLENDVB :
841b41dbe60Szhijian lin    8RR_XX4Form_XTABC6<33, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
842b41dbe60Szhijian lin                       vsrc:$XC), "xxblendvb $XT, $XA, $XB, $XC",
843b41dbe60Szhijian lin                       IIC_VecGeneral, []>;
844b41dbe60Szhijian lin  def XXBLENDVH :
845b41dbe60Szhijian lin    8RR_XX4Form_XTABC6<33, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
846b41dbe60Szhijian lin                       vsrc:$XC), "xxblendvh $XT, $XA, $XB, $XC",
847b41dbe60Szhijian lin                       IIC_VecGeneral, []>;
848b41dbe60Szhijian lin  def XXBLENDVW :
849b41dbe60Szhijian lin    8RR_XX4Form_XTABC6<33, 2, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
850b41dbe60Szhijian lin                       vsrc:$XC), "xxblendvw $XT, $XA, $XB, $XC",
851b41dbe60Szhijian lin                       IIC_VecGeneral, []>;
852b41dbe60Szhijian lin  def XXBLENDVD :
853b41dbe60Szhijian lin    8RR_XX4Form_XTABC6<33, 3, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
854b41dbe60Szhijian lin                       vsrc:$XC), "xxblendvd $XT, $XA, $XB, $XC",
855b41dbe60Szhijian lin                       IIC_VecGeneral, []>;
856b41dbe60Szhijian lin}
857b41dbe60Szhijian lin
8585abe6c31SLei Huangclass DQForm_XTp5_RA17_MEM<bits<6> opcode, bits<4> xo, dag OOL, dag IOL,
8595abe6c31SLei Huang                           string asmstr, InstrItinClass itin, list<dag> pattern>
86048cc4351SJake Egan  : I<opcode, OOL, IOL, asmstr, itin>, MemriOp {
8615abe6c31SLei Huang  bits<5> XTp;
8620be684edSJames Y Knight  bits<5> RA;
8630be684edSJames Y Knight  bits<12> DQ;
8640be684edSJames Y Knight
8655abe6c31SLei Huang  let Pattern = pattern;
8665abe6c31SLei Huang
8675abe6c31SLei Huang  let Inst{6-9} = XTp{3-0};
8685abe6c31SLei Huang  let Inst{10} = XTp{4};
8690be684edSJames Y Knight  let Inst{11-15} = RA;
8700be684edSJames Y Knight  let Inst{16-27} = DQ;
8715abe6c31SLei Huang  let Inst{28-31} = xo;
8725abe6c31SLei Huang}
8735abe6c31SLei Huang
8745abe6c31SLei Huangclass XForm_XTp5_XAB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
8755abe6c31SLei Huang                      string asmstr, InstrItinClass itin, list<dag> pattern>
8765abe6c31SLei Huang  : I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp {
8775abe6c31SLei Huang  bits<5> XTp;
8784b43ef3eSJames Y Knight  bits<5> RA;
8794b43ef3eSJames Y Knight  bits<5> RB;
8805abe6c31SLei Huang
8815abe6c31SLei Huang  let Pattern = pattern;
8825abe6c31SLei Huang  let Inst{6-9} = XTp{3-0};
8835abe6c31SLei Huang  let Inst{10} = XTp{4};
8844b43ef3eSJames Y Knight  let Inst{11-15} = RA;
8854b43ef3eSJames Y Knight  let Inst{16-20} = RB;
8865abe6c31SLei Huang  let Inst{21-30} = xo;
8875abe6c31SLei Huang  let Inst{31} = 0;
8885abe6c31SLei Huang}
8895abe6c31SLei Huang
8905abe6c31SLei Huangclass 8LS_DForm_R_XTp5_SI34_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr,
8915abe6c31SLei Huang                                InstrItinClass itin, list<dag> pattern>
89248cc4351SJake Egan  : PI<1, opcode, OOL, IOL, asmstr, itin>, MemriOp {
8935abe6c31SLei Huang  bits<5> XTp;
8940be684edSJames Y Knight  bits<5> RA;
8950be684edSJames Y Knight  bits<34> D;
8965abe6c31SLei Huang
8975abe6c31SLei Huang  let Pattern = pattern;
8985abe6c31SLei Huang
8995abe6c31SLei Huang  // The prefix.
9005abe6c31SLei Huang  let Inst{6-10} = 0;
9015abe6c31SLei Huang  let Inst{11} = PCRel;
9025abe6c31SLei Huang  let Inst{12-13} = 0;
9030be684edSJames Y Knight  let Inst{14-31} = D{33-16}; // Imm18
9045abe6c31SLei Huang
9055abe6c31SLei Huang  // The instruction.
9065abe6c31SLei Huang  let Inst{38-41} = XTp{3-0};
9075abe6c31SLei Huang  let Inst{42}    = XTp{4};
9080be684edSJames Y Knight  let Inst{43-47} = RA;
9090be684edSJames Y Knight  let Inst{48-63} = D{15-0};
9105abe6c31SLei Huang}
9115abe6c31SLei Huang
9125abe6c31SLei Huangmulticlass 8LS_DForm_R_XTp5_SI34_MEM_p<bits<6> opcode, dag OOL,
913ea8b95d0SStefan Pintilie                                       dag IOL, dag PCRel_IOL, dag PCRelOnly_IOL,
914ea8b95d0SStefan Pintilie                                       string asmstr, string asmstr_pcext,
915ea8b95d0SStefan Pintilie                                       InstrItinClass itin> {
9165abe6c31SLei Huang  def NAME : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL,
9175abe6c31SLei Huang                                       !strconcat(asmstr, ", 0"), itin, []>;
9185abe6c31SLei Huang  def pc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRel_IOL,
9195abe6c31SLei Huang                                     !strconcat(asmstr, ", 1"), itin, []>,
9205abe6c31SLei Huang                                     isPCRel;
921ea8b95d0SStefan Pintilie  let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
922ea8b95d0SStefan Pintilie    def nopc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL, asmstr, itin, []>;
92348cc4351SJake Egan    let RA = 0, MemriOp = 0 in
924ea8b95d0SStefan Pintilie      def onlypc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRelOnly_IOL,
925ea8b95d0SStefan Pintilie                                             asmstr_pcext, itin, []>, isPCRel;
926ea8b95d0SStefan Pintilie  }
9275abe6c31SLei Huang}
9285abe6c31SLei Huang
9295abe6c31SLei Huang
9305abe6c31SLei Huang
9315abe6c31SLei Huang// [PO AS XO2 XO]
9325abe6c31SLei Huangclass XForm_AT3<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL,
9335abe6c31SLei Huang                    string asmstr, InstrItinClass itin, list<dag> pattern>
9345abe6c31SLei Huang  : I<opcode, OOL, IOL, asmstr, itin> {
9355abe6c31SLei Huang  bits<3> AT;
9365abe6c31SLei Huang
9375abe6c31SLei Huang  let Pattern = pattern;
9385abe6c31SLei Huang
9395abe6c31SLei Huang  let Inst{6-8}  = AT;
9405abe6c31SLei Huang  let Inst{9-10}  = 0;
9415abe6c31SLei Huang  let Inst{11-15} = xo2;
9425abe6c31SLei Huang  let Inst{16-20} = 0;
9435abe6c31SLei Huang  let Inst{21-30} = xo;
9445abe6c31SLei Huang  let Inst{31} = 0;
9455abe6c31SLei Huang}
9465abe6c31SLei Huang
947eb1c5a98SStefan Pintilie// X-Form: [ PO T EO UIM XO TX ]
948eb1c5a98SStefan Pintilieclass XForm_XT6_IMM5<bits<6> opcode, bits<5> eo, bits<10> xo, dag OOL, dag IOL,
949eb1c5a98SStefan Pintilie                     string asmstr, InstrItinClass itin, list<dag> pattern>
950eb1c5a98SStefan Pintilie  : I<opcode, OOL, IOL, asmstr, itin> {
951eb1c5a98SStefan Pintilie  bits<6> XT;
952eb1c5a98SStefan Pintilie  bits<5> UIM;
953eb1c5a98SStefan Pintilie
954eb1c5a98SStefan Pintilie  let Pattern = pattern;
955eb1c5a98SStefan Pintilie
956eb1c5a98SStefan Pintilie  let Inst{6-10} = XT{4-0};
957eb1c5a98SStefan Pintilie  let Inst{11-15} = eo;
958eb1c5a98SStefan Pintilie  let Inst{16-20} = UIM;
959eb1c5a98SStefan Pintilie  let Inst{21-30} = xo;
960eb1c5a98SStefan Pintilie  let Inst{31} = XT{5};
961eb1c5a98SStefan Pintilie}
962eb1c5a98SStefan Pintilie
9635abe6c31SLei Huangclass XX3Form_AT3_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
9645abe6c31SLei Huang                           string asmstr, InstrItinClass itin,
9655abe6c31SLei Huang                           list<dag> pattern>
9665abe6c31SLei Huang  : I<opcode, OOL, IOL, asmstr, itin> {
9675abe6c31SLei Huang  bits<3> AT;
9685abe6c31SLei Huang  bits<6> XA;
9695abe6c31SLei Huang  bits<6> XB;
9705abe6c31SLei Huang
9715abe6c31SLei Huang  let Pattern = pattern;
9725abe6c31SLei Huang
9735abe6c31SLei Huang  let Inst{6-8} = AT;
9745abe6c31SLei Huang  let Inst{9-10} = 0;
9755abe6c31SLei Huang  let Inst{11-15} = XA{4-0};
9765abe6c31SLei Huang  let Inst{16-20} = XB{4-0};
9775abe6c31SLei Huang  let Inst{21-28} = xo;
9785abe6c31SLei Huang  let Inst{29}    = XA{5};
9795abe6c31SLei Huang  let Inst{30}    = XB{5};
9805abe6c31SLei Huang  let Inst{31} = 0;
9815abe6c31SLei Huang}
9825abe6c31SLei Huang
9835abe6c31SLei Huangclass MMIRR_XX3Form_XY4P2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
9845abe6c31SLei Huang                               string asmstr, InstrItinClass itin,
9855abe6c31SLei Huang                               list<dag> pattern>
9865abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
9875abe6c31SLei Huang  bits<3> AT;
9885abe6c31SLei Huang  bits<6> XA;
9895abe6c31SLei Huang  bits<6> XB;
9905abe6c31SLei Huang  bits<4> XMSK;
9915abe6c31SLei Huang  bits<4> YMSK;
9925abe6c31SLei Huang  bits<2> PMSK;
9935abe6c31SLei Huang
9945abe6c31SLei Huang  let Pattern = pattern;
9955abe6c31SLei Huang
9965abe6c31SLei Huang  // The prefix.
9975abe6c31SLei Huang  let Inst{6-7} = 3;
9985abe6c31SLei Huang  let Inst{8-11} = 9;
9995abe6c31SLei Huang  let Inst{12-15} = 0;
10005abe6c31SLei Huang  let Inst{16-17} = PMSK;
10015abe6c31SLei Huang  let Inst{18-23} = 0;
10025abe6c31SLei Huang  let Inst{24-27} = XMSK;
10035abe6c31SLei Huang  let Inst{28-31} = YMSK;
10045abe6c31SLei Huang
10055abe6c31SLei Huang  // The instruction.
10065abe6c31SLei Huang  let Inst{38-40} = AT;
10075abe6c31SLei Huang  let Inst{41-42} = 0;
10085abe6c31SLei Huang  let Inst{43-47} = XA{4-0};
10095abe6c31SLei Huang  let Inst{48-52} = XB{4-0};
10105abe6c31SLei Huang  let Inst{53-60} = xo;
10115abe6c31SLei Huang  let Inst{61} = XA{5};
10125abe6c31SLei Huang  let Inst{62} = XB{5};
10135abe6c31SLei Huang  let Inst{63} = 0;
10145abe6c31SLei Huang}
10155abe6c31SLei Huang
10165abe6c31SLei Huangclass MMIRR_XX3Form_XY4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
10175abe6c31SLei Huang                             string asmstr, InstrItinClass itin,
10185abe6c31SLei Huang                             list<dag> pattern>
10195abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
10205abe6c31SLei Huang  bits<3> AT;
10215abe6c31SLei Huang  bits<6> XA;
10225abe6c31SLei Huang  bits<6> XB;
10235abe6c31SLei Huang  bits<4> XMSK;
10245abe6c31SLei Huang  bits<4> YMSK;
10255abe6c31SLei Huang
10265abe6c31SLei Huang  let Pattern = pattern;
10275abe6c31SLei Huang
10285abe6c31SLei Huang  // The prefix.
10295abe6c31SLei Huang  let Inst{6-7} = 3;
10305abe6c31SLei Huang  let Inst{8-11} = 9;
10315abe6c31SLei Huang  let Inst{12-23} = 0;
10325abe6c31SLei Huang  let Inst{24-27} = XMSK;
10335abe6c31SLei Huang  let Inst{28-31} = YMSK;
10345abe6c31SLei Huang
10355abe6c31SLei Huang  // The instruction.
10365abe6c31SLei Huang  let Inst{38-40} = AT;
10375abe6c31SLei Huang  let Inst{41-42} = 0;
10385abe6c31SLei Huang  let Inst{43-47} = XA{4-0};
10395abe6c31SLei Huang  let Inst{48-52} = XB{4-0};
10405abe6c31SLei Huang  let Inst{53-60} = xo;
10415abe6c31SLei Huang  let Inst{61} = XA{5};
10425abe6c31SLei Huang  let Inst{62} = XB{5};
10435abe6c31SLei Huang  let Inst{63} = 0;
10445abe6c31SLei Huang}
10455abe6c31SLei Huang
10465abe6c31SLei Huangclass MMIRR_XX3Form_X4Y2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
10475abe6c31SLei Huang                              string asmstr, InstrItinClass itin,
10485abe6c31SLei Huang                              list<dag> pattern>
10495abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
10505abe6c31SLei Huang  bits<3> AT;
10515abe6c31SLei Huang  bits<6> XA;
10525abe6c31SLei Huang  bits<6> XB;
10535abe6c31SLei Huang  bits<4> XMSK;
10545abe6c31SLei Huang  bits<2> YMSK;
10555abe6c31SLei Huang
10565abe6c31SLei Huang  let Pattern = pattern;
10575abe6c31SLei Huang
10585abe6c31SLei Huang  // The prefix.
10595abe6c31SLei Huang  let Inst{6-7} = 3;
10605abe6c31SLei Huang  let Inst{8-11} = 9;
10615abe6c31SLei Huang  let Inst{12-23} = 0;
10625abe6c31SLei Huang  let Inst{24-27} = XMSK;
10635abe6c31SLei Huang  let Inst{28-29} = YMSK;
10645abe6c31SLei Huang  let Inst{30-31} = 0;
10655abe6c31SLei Huang
10665abe6c31SLei Huang  // The instruction.
10675abe6c31SLei Huang  let Inst{38-40} = AT;
10685abe6c31SLei Huang  let Inst{41-42} = 0;
10695abe6c31SLei Huang  let Inst{43-47} = XA{4-0};
10705abe6c31SLei Huang  let Inst{48-52} = XB{4-0};
10715abe6c31SLei Huang  let Inst{53-60} = xo;
10725abe6c31SLei Huang  let Inst{61} = XA{5};
10735abe6c31SLei Huang  let Inst{62} = XB{5};
10745abe6c31SLei Huang  let Inst{63} = 0;
10755abe6c31SLei Huang}
10765abe6c31SLei Huang
10775abe6c31SLei Huangclass MMIRR_XX3Form_XY4P8_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
10785abe6c31SLei Huang                               string asmstr, InstrItinClass itin,
10795abe6c31SLei Huang                               list<dag> pattern>
10805abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
10815abe6c31SLei Huang  bits<3> AT;
10825abe6c31SLei Huang  bits<6> XA;
10835abe6c31SLei Huang  bits<6> XB;
10845abe6c31SLei Huang  bits<4> XMSK;
10855abe6c31SLei Huang  bits<4> YMSK;
10865abe6c31SLei Huang  bits<8> PMSK;
10875abe6c31SLei Huang
10885abe6c31SLei Huang  let Pattern = pattern;
10895abe6c31SLei Huang
10905abe6c31SLei Huang  // The prefix.
10915abe6c31SLei Huang  let Inst{6-7} = 3;
10925abe6c31SLei Huang  let Inst{8-11} = 9;
10935abe6c31SLei Huang  let Inst{12-15} = 0;
10945abe6c31SLei Huang  let Inst{16-23} = PMSK;
10955abe6c31SLei Huang  let Inst{24-27} = XMSK;
10965abe6c31SLei Huang  let Inst{28-31} = YMSK;
10975abe6c31SLei Huang
10985abe6c31SLei Huang  // The instruction.
10995abe6c31SLei Huang  let Inst{38-40} = AT;
11005abe6c31SLei Huang  let Inst{41-42} = 0;
11015abe6c31SLei Huang  let Inst{43-47} = XA{4-0};
11025abe6c31SLei Huang  let Inst{48-52} = XB{4-0};
11035abe6c31SLei Huang  let Inst{53-60} = xo;
11045abe6c31SLei Huang  let Inst{61} = XA{5};
11055abe6c31SLei Huang  let Inst{62} = XB{5};
11065abe6c31SLei Huang  let Inst{63} = 0;
11075abe6c31SLei Huang}
11085abe6c31SLei Huang
11095abe6c31SLei Huangclass MMIRR_XX3Form_XYP4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
11105abe6c31SLei Huang                              string asmstr, InstrItinClass itin,
11115abe6c31SLei Huang                              list<dag> pattern>
11125abe6c31SLei Huang  : PI<1, opcode, OOL, IOL, asmstr, itin> {
11135abe6c31SLei Huang  bits<3> AT;
11145abe6c31SLei Huang  bits<6> XA;
11155abe6c31SLei Huang  bits<6> XB;
11165abe6c31SLei Huang  bits<4> XMSK;
11175abe6c31SLei Huang  bits<4> YMSK;
11185abe6c31SLei Huang  bits<4> PMSK;
11195abe6c31SLei Huang
11205abe6c31SLei Huang  let Pattern = pattern;
11215abe6c31SLei Huang
11225abe6c31SLei Huang  // The prefix.
11235abe6c31SLei Huang  let Inst{6-7} = 3;
11245abe6c31SLei Huang  let Inst{8-11} = 9;
11255abe6c31SLei Huang  let Inst{12-15} = 0;
11265abe6c31SLei Huang  let Inst{16-19} = PMSK;
11275abe6c31SLei Huang  let Inst{20-23} = 0;
11285abe6c31SLei Huang  let Inst{24-27} = XMSK;
11295abe6c31SLei Huang  let Inst{28-31} = YMSK;
11305abe6c31SLei Huang
11315abe6c31SLei Huang  // The instruction.
11325abe6c31SLei Huang  let Inst{38-40} = AT;
11335abe6c31SLei Huang  let Inst{41-42} = 0;
11345abe6c31SLei Huang  let Inst{43-47} = XA{4-0};
11355abe6c31SLei Huang  let Inst{48-52} = XB{4-0};
11365abe6c31SLei Huang  let Inst{53-60} = xo;
11375abe6c31SLei Huang  let Inst{61} = XA{5};
11385abe6c31SLei Huang  let Inst{62} = XB{5};
11395abe6c31SLei Huang  let Inst{63} = 0;
11405abe6c31SLei Huang}
11415abe6c31SLei Huang
11425abe6c31SLei Huang
11435abe6c31SLei Huang
11445abe6c31SLei Huangdef Concats {
11455abe6c31SLei Huang  dag VecsToVecPair0 =
11465abe6c31SLei Huang    (v256i1 (INSERT_SUBREG
11475abe6c31SLei Huang      (INSERT_SUBREG (IMPLICIT_DEF), $vs0, sub_vsx1),
11485abe6c31SLei Huang      $vs1, sub_vsx0));
11495abe6c31SLei Huang  dag VecsToVecPair1 =
11505abe6c31SLei Huang    (v256i1 (INSERT_SUBREG
11515abe6c31SLei Huang      (INSERT_SUBREG (IMPLICIT_DEF), $vs2, sub_vsx1),
11525abe6c31SLei Huang      $vs3, sub_vsx0));
11535abe6c31SLei Huang}
11545abe6c31SLei Huang
11555abe6c31SLei Huanglet Predicates = [PairedVectorMemops] in {
11565abe6c31SLei Huang  def : Pat<(v256i1 (PPCPairBuild v4i32:$vs1, v4i32:$vs0)),
11575abe6c31SLei Huang            Concats.VecsToVecPair0>;
11585abe6c31SLei Huang  def : Pat<(v256i1 (int_ppc_vsx_assemble_pair v16i8:$vs1, v16i8:$vs0)),
11595abe6c31SLei Huang            Concats.VecsToVecPair0>;
11605abe6c31SLei Huang  def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 0)),
11615abe6c31SLei Huang            (v4i32 (EXTRACT_SUBREG $v, sub_vsx0))>;
11625abe6c31SLei Huang  def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 1)),
11635abe6c31SLei Huang            (v4i32 (EXTRACT_SUBREG $v, sub_vsx1))>;
11645abe6c31SLei Huang
1165b41dbe60Szhijian lin  let mayLoad = 1, mayStore = 0 in {
11665abe6c31SLei Huang    def LXVP : DQForm_XTp5_RA17_MEM<6, 0, (outs vsrprc:$XTp),
11670be684edSJames Y Knight                                    (ins (memrix16 $DQ, $RA):$addr), "lxvp $XTp, $addr",
11685abe6c31SLei Huang                                    IIC_LdStLFD, []>;
11694b43ef3eSJames Y Knight    def LXVPX : XForm_XTp5_XAB5<31, 333, (outs vsrprc:$XTp), (ins (memrr $RA, $RB):$addr),
11704b43ef3eSJames Y Knight                                "lxvpx $XTp, $addr", IIC_LdStLFD,
11715abe6c31SLei Huang                                []>;
11725abe6c31SLei Huang  }
11735abe6c31SLei Huang
1174b41dbe60Szhijian lin  let mayLoad = 0, mayStore = 1 in {
11755abe6c31SLei Huang    def STXVP : DQForm_XTp5_RA17_MEM<6, 1, (outs), (ins vsrprc:$XTp,
11760be684edSJames Y Knight                                     (memrix16 $DQ, $RA):$addr), "stxvp $XTp, $addr",
11775abe6c31SLei Huang                                     IIC_LdStLFD, []>;
11784b43ef3eSJames Y Knight    def STXVPX : XForm_XTp5_XAB5<31, 461, (outs), (ins vsrprc:$XTp, (memrr $RA, $RB):$addr),
11794b43ef3eSJames Y Knight                                 "stxvpx $XTp, $addr", IIC_LdStLFD,
11805abe6c31SLei Huang                                 []>;
11815abe6c31SLei Huang  }
1182b41dbe60Szhijian lin}
11836127f15eSzhijian linlet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in {
11845abe6c31SLei Huang  defm PLXVP :
11850be684edSJames Y Knight    8LS_DForm_R_XTp5_SI34_MEM_p<58, (outs vsrprc:$XTp), (ins (memri34 $D, $RA):$addr),
1186ea8b95d0SStefan Pintilie                                (ins (memri34_pcrel $D, $RA):$addr),
1187ea8b95d0SStefan Pintilie                                (ins s34imm_pcrel:$D),
1188ea8b95d0SStefan Pintilie                                "plxvp $XTp, $addr", "plxvp $XTp, $D",
11895abe6c31SLei Huang                                IIC_LdStLFD>;
11905abe6c31SLei Huang}
11915abe6c31SLei Huang
11926127f15eSzhijian linlet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in {
11935abe6c31SLei Huang  defm PSTXVP :
11940be684edSJames Y Knight    8LS_DForm_R_XTp5_SI34_MEM_p<62, (outs), (ins vsrprc:$XTp, (memri34 $D, $RA):$addr),
11950be684edSJames Y Knight                                (ins vsrprc:$XTp, (memri34_pcrel $D, $RA):$addr),
1196ea8b95d0SStefan Pintilie                                (ins vsrprc:$XTp, s34imm_pcrel:$D),
1197ea8b95d0SStefan Pintilie                                "pstxvp $XTp, $addr", "pstxvp $XTp, $D", IIC_LdStLFD>;
11985abe6c31SLei Huang}
11995abe6c31SLei Huang
12005abe6c31SLei Huanglet Predicates = [PairedVectorMemops] in {
12015abe6c31SLei Huang  // Intrinsics for Paired Vector Loads.
12025abe6c31SLei Huang  def : Pat<(v256i1 (int_ppc_vsx_lxvp DQForm:$src)), (LXVP memrix16:$src)>;
12035abe6c31SLei Huang  def : Pat<(v256i1 (int_ppc_vsx_lxvp XForm:$src)), (LXVPX XForm:$src)>;
12046127f15eSzhijian lin  let Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in {
12055abe6c31SLei Huang    def : Pat<(v256i1 (int_ppc_vsx_lxvp PDForm:$src)), (PLXVP memri34:$src)>;
12065abe6c31SLei Huang  }
12075abe6c31SLei Huang  // Intrinsics for Paired Vector Stores.
12085abe6c31SLei Huang  def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, DQForm:$dst),
12095abe6c31SLei Huang            (STXVP $XSp, memrix16:$dst)>;
12105abe6c31SLei Huang  def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, XForm:$dst),
12115abe6c31SLei Huang            (STXVPX $XSp, XForm:$dst)>;
12126127f15eSzhijian lin  let Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in {
12135abe6c31SLei Huang    def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, PDForm:$dst),
12145abe6c31SLei Huang              (PSTXVP $XSp, memri34:$dst)>;
12155abe6c31SLei Huang  }
12165abe6c31SLei Huang}
12175abe6c31SLei Huang
1218c19f905fSMaryam Moghadaslet Predicates = [IsISA3_1] in {
1219c19f905fSMaryam Moghadas  def XSCMPEQQP : X_VT5_VA5_VB5<63, 68, "xscmpeqqp", []>;
1220c19f905fSMaryam Moghadas  def XSCMPGEQP : X_VT5_VA5_VB5<63, 196, "xscmpgeqp", []>;
1221c19f905fSMaryam Moghadas  def XSCMPGTQP : X_VT5_VA5_VB5<63, 228, "xscmpgtqp", []>;
1222c19f905fSMaryam Moghadas}
1223c19f905fSMaryam Moghadas
12245abe6c31SLei Huanglet Predicates = [PCRelativeMemops] in {
12255abe6c31SLei Huang  // Load i32
12265abe6c31SLei Huang  def : Pat<(i32 (zextloadi1  (PPCmatpcreladdr PCRelForm:$ga))),
12275abe6c31SLei Huang            (PLBZpc $ga, 0)>;
12285abe6c31SLei Huang  def : Pat<(i32 (extloadi1  (PPCmatpcreladdr PCRelForm:$ga))),
12295abe6c31SLei Huang            (PLBZpc $ga, 0)>;
12305abe6c31SLei Huang  def : Pat<(i32 (zextloadi8  (PPCmatpcreladdr PCRelForm:$ga))),
12315abe6c31SLei Huang            (PLBZpc $ga, 0)>;
12325abe6c31SLei Huang  def : Pat<(i32 (extloadi8   (PPCmatpcreladdr PCRelForm:$ga))),
12335abe6c31SLei Huang            (PLBZpc $ga, 0)>;
12345abe6c31SLei Huang  def : Pat<(i32 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
12355abe6c31SLei Huang            (PLHApc $ga, 0)>;
12365abe6c31SLei Huang  def : Pat<(i32 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
12375abe6c31SLei Huang            (PLHZpc $ga, 0)>;
12385abe6c31SLei Huang  def : Pat<(i32 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
12395abe6c31SLei Huang            (PLHZpc $ga, 0)>;
12405abe6c31SLei Huang  def : Pat<(i32 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLWZpc $ga, 0)>;
12415abe6c31SLei Huang
12425abe6c31SLei Huang  // Store i32
12435abe6c31SLei Huang  def : Pat<(truncstorei8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
12445abe6c31SLei Huang            (PSTBpc $RS, $ga, 0)>;
12455abe6c31SLei Huang  def : Pat<(truncstorei16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
12465abe6c31SLei Huang            (PSTHpc $RS, $ga, 0)>;
12475abe6c31SLei Huang  def : Pat<(store i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
12485abe6c31SLei Huang            (PSTWpc $RS, $ga, 0)>;
12495abe6c31SLei Huang
12505abe6c31SLei Huang  // Load i64
12515abe6c31SLei Huang  def : Pat<(i64 (zextloadi1  (PPCmatpcreladdr PCRelForm:$ga))),
12525abe6c31SLei Huang            (PLBZ8pc $ga, 0)>;
12535abe6c31SLei Huang  def : Pat<(i64 (extloadi1  (PPCmatpcreladdr PCRelForm:$ga))),
12545abe6c31SLei Huang            (PLBZ8pc $ga, 0)>;
12555abe6c31SLei Huang  def : Pat<(i64 (zextloadi8  (PPCmatpcreladdr PCRelForm:$ga))),
12565abe6c31SLei Huang            (PLBZ8pc $ga, 0)>;
12575abe6c31SLei Huang  def : Pat<(i64 (extloadi8   (PPCmatpcreladdr PCRelForm:$ga))),
12585abe6c31SLei Huang            (PLBZ8pc $ga, 0)>;
12595abe6c31SLei Huang  def : Pat<(i64 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
12605abe6c31SLei Huang            (PLHA8pc $ga, 0)>;
12615abe6c31SLei Huang  def : Pat<(i64 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
12625abe6c31SLei Huang            (PLHZ8pc $ga, 0)>;
12635abe6c31SLei Huang  def : Pat<(i64 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
12645abe6c31SLei Huang            (PLHZ8pc $ga, 0)>;
12655abe6c31SLei Huang  def : Pat<(i64 (zextloadi32 (PPCmatpcreladdr PCRelForm:$ga))),
12665abe6c31SLei Huang            (PLWZ8pc $ga, 0)>;
12675abe6c31SLei Huang  def : Pat<(i64 (sextloadi32 (PPCmatpcreladdr PCRelForm:$ga))),
12685abe6c31SLei Huang            (PLWA8pc $ga, 0)>;
12695abe6c31SLei Huang  def : Pat<(i64 (extloadi32 (PPCmatpcreladdr PCRelForm:$ga))),
12705abe6c31SLei Huang            (PLWZ8pc $ga, 0)>;
12715abe6c31SLei Huang  def : Pat<(i64 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLDpc $ga, 0)>;
12725abe6c31SLei Huang
12735abe6c31SLei Huang  // Store i64
12745abe6c31SLei Huang  def : Pat<(truncstorei8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
12755abe6c31SLei Huang            (PSTB8pc $RS, $ga, 0)>;
12765abe6c31SLei Huang  def : Pat<(truncstorei16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
12775abe6c31SLei Huang            (PSTH8pc $RS, $ga, 0)>;
12785abe6c31SLei Huang  def : Pat<(truncstorei32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
12795abe6c31SLei Huang            (PSTW8pc $RS, $ga, 0)>;
12805abe6c31SLei Huang  def : Pat<(store i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
12815abe6c31SLei Huang            (PSTDpc $RS, $ga, 0)>;
12825abe6c31SLei Huang
1283b41dbe60Szhijian lin  // Atomic Load
1284b41dbe60Szhijian lin  def : Pat<(i32 (atomic_load_8 (PPCmatpcreladdr PCRelForm:$ga))),
1285b41dbe60Szhijian lin            (PLBZpc $ga, 0)>;
1286b41dbe60Szhijian lin  def : Pat<(i32 (atomic_load_16 (PPCmatpcreladdr PCRelForm:$ga))),
1287b41dbe60Szhijian lin            (PLHZpc $ga, 0)>;
1288b41dbe60Szhijian lin  def : Pat<(i32 (atomic_load_32 (PPCmatpcreladdr PCRelForm:$ga))),
1289b41dbe60Szhijian lin            (PLWZpc $ga, 0)>;
1290b41dbe60Szhijian lin  def : Pat<(i64 (atomic_load_64 (PPCmatpcreladdr PCRelForm:$ga))),
1291b41dbe60Szhijian lin            (PLDpc $ga, 0)>;
1292b41dbe60Szhijian lin
1293b41dbe60Szhijian lin  // Atomic Store
1294b41dbe60Szhijian lin  def : Pat<(atomic_store_8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1295b41dbe60Szhijian lin            (PSTBpc $RS, $ga, 0)>;
1296b41dbe60Szhijian lin  def : Pat<(atomic_store_16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1297b41dbe60Szhijian lin            (PSTHpc $RS, $ga, 0)>;
1298b41dbe60Szhijian lin  def : Pat<(atomic_store_32 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1299b41dbe60Szhijian lin            (PSTWpc $RS, $ga, 0)>;
1300b41dbe60Szhijian lin  def : Pat<(atomic_store_8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1301b41dbe60Szhijian lin            (PSTB8pc $RS, $ga, 0)>;
1302b41dbe60Szhijian lin  def : Pat<(atomic_store_16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1303b41dbe60Szhijian lin            (PSTH8pc $RS, $ga, 0)>;
1304b41dbe60Szhijian lin  def : Pat<(atomic_store_32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1305b41dbe60Szhijian lin            (PSTW8pc $RS, $ga, 0)>;
1306b41dbe60Szhijian lin  def : Pat<(atomic_store_64 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1307b41dbe60Szhijian lin            (PSTDpc $RS, $ga, 0)>;
1308b41dbe60Szhijian lin
1309b41dbe60Szhijian lin  // If the PPCmatpcreladdr node is not caught by any other pattern it should be
1310b41dbe60Szhijian lin  // caught here and turned into a paddi instruction to materialize the address.
1311b41dbe60Szhijian lin  def : Pat<(PPCmatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>;
1312b41dbe60Szhijian lin  // PPCtlsdynamatpcreladdr node is used for TLS dynamic models to materialize
1313b41dbe60Szhijian lin  // tls global address with paddi instruction.
1314b41dbe60Szhijian lin  def : Pat<(PPCtlsdynamatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>;
1315b41dbe60Szhijian lin  // PPCtlslocalexecmataddr node is used for TLS local exec models to
1316b41dbe60Szhijian lin  // materialize tls global address with paddi instruction.
1317b41dbe60Szhijian lin  def : Pat<(PPCaddTls i64:$in, (PPCtlslocalexecmataddr tglobaltlsaddr:$addr)),
1318b41dbe60Szhijian lin            (PADDI8 $in, $addr)>;
13196127f15eSzhijian lin}
13206127f15eSzhijian lin
13216127f15eSzhijian linlet Predicates = [PCRelativeMemops, HasFPU] in {
13225abe6c31SLei Huang  // Load f32
13235abe6c31SLei Huang  def : Pat<(f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFSpc $addr, 0)>;
13245abe6c31SLei Huang
13255abe6c31SLei Huang  // Store f32
13265abe6c31SLei Huang  def : Pat<(store f32:$FRS, (PPCmatpcreladdr PCRelForm:$ga)),
13275abe6c31SLei Huang            (PSTFSpc $FRS, $ga, 0)>;
13285abe6c31SLei Huang
13295abe6c31SLei Huang  // Load f64
13305abe6c31SLei Huang  def : Pat<(f64 (extloadf32 (PPCmatpcreladdr PCRelForm:$addr))),
13315abe6c31SLei Huang            (COPY_TO_REGCLASS (PLFSpc $addr, 0), VSFRC)>;
13325abe6c31SLei Huang  def : Pat<(f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFDpc $addr, 0)>;
13335abe6c31SLei Huang
13345abe6c31SLei Huang  // Store f64
13355abe6c31SLei Huang  def : Pat<(store f64:$FRS, (PPCmatpcreladdr PCRelForm:$ga)),
13365abe6c31SLei Huang            (PSTFDpc $FRS, $ga, 0)>;
13375abe6c31SLei Huang
13386127f15eSzhijian lin  def : Pat<(v4f32 (PPCldvsxlh (PPCmatpcreladdr PCRelForm:$addr))),
13396127f15eSzhijian lin            (SUBREG_TO_REG (i64 1), (PLFDpc $addr, 0), sub_64)>;
13406127f15eSzhijian lin}
13416127f15eSzhijian lin
13426127f15eSzhijian linlet Predicates = [PCRelativeMemops, HasP10Vector] in {
13435abe6c31SLei Huang  // Load f128
13445abe6c31SLei Huang  def : Pat<(f128 (load (PPCmatpcreladdr PCRelForm:$addr))),
13455abe6c31SLei Huang            (COPY_TO_REGCLASS (PLXVpc $addr, 0), VRRC)>;
13465abe6c31SLei Huang
13475abe6c31SLei Huang  // Store f128
13485abe6c31SLei Huang  def : Pat<(store f128:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
13495abe6c31SLei Huang            (PSTXVpc (COPY_TO_REGCLASS $XS, VSRC), $ga, 0)>;
13505abe6c31SLei Huang
13515abe6c31SLei Huang  // Load v4i32
13525abe6c31SLei Huang  def : Pat<(v4i32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>;
13535abe6c31SLei Huang
13545abe6c31SLei Huang  // Store v4i32
13555abe6c31SLei Huang  def : Pat<(store v4i32:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
13565abe6c31SLei Huang            (PSTXVpc $XS, $ga, 0)>;
13575abe6c31SLei Huang
13585abe6c31SLei Huang  // Load v2i64
13595abe6c31SLei Huang  def : Pat<(v2i64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>;
13605abe6c31SLei Huang
13615abe6c31SLei Huang  // Store v2i64
13625abe6c31SLei Huang  def : Pat<(store v2i64:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
13635abe6c31SLei Huang            (PSTXVpc $XS, $ga, 0)>;
13645abe6c31SLei Huang
13655abe6c31SLei Huang  // Load v4f32
13665abe6c31SLei Huang  def : Pat<(v4f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>;
13675abe6c31SLei Huang
13685abe6c31SLei Huang  // Store v4f32
13695abe6c31SLei Huang  def : Pat<(store v4f32:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
13705abe6c31SLei Huang            (PSTXVpc $XS, $ga, 0)>;
13715abe6c31SLei Huang
13725abe6c31SLei Huang  // Load v2f64
13735abe6c31SLei Huang  def : Pat<(v2f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>;
13745abe6c31SLei Huang
13755abe6c31SLei Huang  // Store v2f64
13765abe6c31SLei Huang  def : Pat<(store v2f64:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
13775abe6c31SLei Huang            (PSTXVpc $XS, $ga, 0)>;
13785abe6c31SLei Huang
13796127f15eSzhijian lin  // Special Cases For PPCstore_scal_int_from_vsr
13806127f15eSzhijian lin  def : Pat<(PPCstore_scal_int_from_vsr f64:$src, (PPCmatpcreladdr PCRelForm:$dst), 8),
13816127f15eSzhijian lin            (PSTXSDpc $src, $dst, 0)>;
13826127f15eSzhijian lin  def : Pat<(PPCstore_scal_int_from_vsr f128:$src, (PPCmatpcreladdr PCRelForm:$dst), 8),
13836127f15eSzhijian lin            (PSTXSDpc (COPY_TO_REGCLASS $src, VFRC), $dst, 0)>;
13846127f15eSzhijian lin}
13856127f15eSzhijian lin
13865abe6c31SLei Huang// XXSPLTIW/DP/32DX need extra flags to make sure the compiler does not attempt
13875abe6c31SLei Huang// to spill part of the instruction when the values are similar.
13885abe6c31SLei Huanglet isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1, Predicates = [PrefixInstrs] in {
13895abe6c31SLei Huang  def XXSPLTIW : 8RR_DForm_IMM32_XT6<32, 3, (outs vsrc:$XT),
13905abe6c31SLei Huang                                     (ins i32imm:$IMM32),
13915abe6c31SLei Huang                                     "xxspltiw $XT, $IMM32", IIC_VecGeneral,
13925abe6c31SLei Huang                                     []>;
13935abe6c31SLei Huang  def XXSPLTIDP : 8RR_DForm_IMM32_XT6<32, 2, (outs vsrc:$XT),
13945abe6c31SLei Huang                                      (ins i32imm:$IMM32),
13955abe6c31SLei Huang                                      "xxspltidp $XT, $IMM32", IIC_VecGeneral,
13965abe6c31SLei Huang                                      [(set v2f64:$XT,
13975abe6c31SLei Huang                                            (PPCxxspltidp i32:$IMM32))]>;
13985abe6c31SLei Huang  def XXSPLTI32DX :
13995abe6c31SLei Huang      8RR_DForm_IMM32_XT6_IX<32, 0, (outs vsrc:$XT),
14005abe6c31SLei Huang                             (ins vsrc:$XTi, u1imm:$IX, i32imm:$IMM32),
14015abe6c31SLei Huang                             "xxsplti32dx $XT, $IX, $IMM32", IIC_VecGeneral,
14025abe6c31SLei Huang                             [(set v2i64:$XT,
14035abe6c31SLei Huang                                   (PPCxxsplti32dx v2i64:$XTi, i32:$IX,
14045abe6c31SLei Huang                                                   i32:$IMM32))]>,
14055abe6c31SLei Huang                             RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
14065abe6c31SLei Huang}
14075abe6c31SLei Huang
14085abe6c31SLei Huanglet Predicates = [IsISA3_1] in {
14094b43ef3eSJames Y Knight  def SETBC : XForm_XT5_BI5<31, 384, (outs gprc:$RST), (ins crbitrc:$BI),
1410*a4751804SRolandF77                            "setbc $RST, $BI", IIC_IntCompare,
1411*a4751804SRolandF77                            [(set i32:$RST, (PPCsetbc i1:$BI))]>,
14121492c88fSStefan Pintilie                            SExt32To64, ZExt32To64;
14134b43ef3eSJames Y Knight  def SETBCR : XForm_XT5_BI5<31, 416, (outs gprc:$RST), (ins crbitrc:$BI),
1414*a4751804SRolandF77                             "setbcr $RST, $BI", IIC_IntCompare,
1415*a4751804SRolandF77                             [(set i32:$RST, (PPCsetbcr i1:$BI))]>,
14161492c88fSStefan Pintilie                             SExt32To64, ZExt32To64;
14174b43ef3eSJames Y Knight  def SETNBC : XForm_XT5_BI5<31, 448, (outs gprc:$RST), (ins crbitrc:$BI),
14184b43ef3eSJames Y Knight                             "setnbc $RST, $BI", IIC_IntCompare, []>,
14191492c88fSStefan Pintilie                             SExt32To64;
14204b43ef3eSJames Y Knight  def SETNBCR : XForm_XT5_BI5<31, 480, (outs gprc:$RST), (ins crbitrc:$BI),
14214b43ef3eSJames Y Knight                              "setnbcr $RST, $BI", IIC_IntCompare, []>,
14221492c88fSStefan Pintilie                              SExt32To64;
14235abe6c31SLei Huang
14245abe6c31SLei Huang  let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
14254b43ef3eSJames Y Knight    def SETBC8 : XForm_XT5_BI5<31, 384, (outs g8rc:$RST), (ins crbitrc:$BI),
14264b43ef3eSJames Y Knight                               "setbc $RST, $BI", IIC_IntCompare, []>,
14271492c88fSStefan Pintilie                               SExt32To64, ZExt32To64;
14284b43ef3eSJames Y Knight    def SETBCR8 : XForm_XT5_BI5<31, 416, (outs g8rc:$RST), (ins crbitrc:$BI),
14294b43ef3eSJames Y Knight                                "setbcr $RST, $BI", IIC_IntCompare, []>,
14301492c88fSStefan Pintilie                                SExt32To64, ZExt32To64;
14314b43ef3eSJames Y Knight    def SETNBC8 : XForm_XT5_BI5<31, 448, (outs g8rc:$RST), (ins crbitrc:$BI),
14324b43ef3eSJames Y Knight                                "setnbc $RST, $BI", IIC_IntCompare, []>,
14331492c88fSStefan Pintilie                                SExt32To64;
14344b43ef3eSJames Y Knight    def SETNBCR8 : XForm_XT5_BI5<31, 480, (outs g8rc:$RST), (ins crbitrc:$BI),
14354b43ef3eSJames Y Knight                                 "setnbcr $RST, $BI", IIC_IntCompare, []>,
14361492c88fSStefan Pintilie                                 SExt32To64;
14375abe6c31SLei Huang  }
14385abe6c31SLei Huang
14395abe6c31SLei Huang  def VSLDBI : VNForm_VTAB5_SD3<22, 0, (outs vrrc:$VRT),
14404b43ef3eSJames Y Knight                                (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SD),
14414b43ef3eSJames Y Knight                                "vsldbi $VRT, $VRA, $VRB, $SD",
14425abe6c31SLei Huang                                IIC_VecGeneral,
14435abe6c31SLei Huang                                [(set v16i8:$VRT,
14445abe6c31SLei Huang                                      (int_ppc_altivec_vsldbi v16i8:$VRA,
14455abe6c31SLei Huang                                                              v16i8:$VRB,
14464b43ef3eSJames Y Knight                                                              timm:$SD))]>;
14475abe6c31SLei Huang  def VSRDBI : VNForm_VTAB5_SD3<22, 1, (outs vrrc:$VRT),
14484b43ef3eSJames Y Knight                                (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SD),
14494b43ef3eSJames Y Knight                                "vsrdbi $VRT, $VRA, $VRB, $SD",
14505abe6c31SLei Huang                                IIC_VecGeneral,
14515abe6c31SLei Huang                                [(set v16i8:$VRT,
14525abe6c31SLei Huang                                      (int_ppc_altivec_vsrdbi v16i8:$VRA,
14535abe6c31SLei Huang                                                              v16i8:$VRB,
14544b43ef3eSJames Y Knight                                                              timm:$SD))]>;
14554b43ef3eSJames Y Knight  defm VSTRIBR : VXForm_VTB5_RCr<13, 1, (outs vrrc:$VT), (ins vrrc:$VB),
14564b43ef3eSJames Y Knight                                 "vstribr", "$VT, $VB", IIC_VecGeneral,
14574b43ef3eSJames Y Knight				 [(set v16i8:$VT,
14584b43ef3eSJames Y Knight                                       (int_ppc_altivec_vstribr v16i8:$VB))]>;
14594b43ef3eSJames Y Knight  defm VSTRIBL : VXForm_VTB5_RCr<13, 0, (outs vrrc:$VT), (ins vrrc:$VB),
14604b43ef3eSJames Y Knight                                 "vstribl", "$VT, $VB", IIC_VecGeneral,
14614b43ef3eSJames Y Knight                                 [(set v16i8:$VT,
14624b43ef3eSJames Y Knight                                       (int_ppc_altivec_vstribl v16i8:$VB))]>;
14634b43ef3eSJames Y Knight  defm VSTRIHR : VXForm_VTB5_RCr<13, 3, (outs vrrc:$VT), (ins vrrc:$VB),
14644b43ef3eSJames Y Knight                                 "vstrihr", "$VT, $VB", IIC_VecGeneral,
14654b43ef3eSJames Y Knight                                 [(set v8i16:$VT,
14664b43ef3eSJames Y Knight                                       (int_ppc_altivec_vstrihr v8i16:$VB))]>;
14674b43ef3eSJames Y Knight  defm VSTRIHL : VXForm_VTB5_RCr<13, 2, (outs vrrc:$VT), (ins vrrc:$VB),
14684b43ef3eSJames Y Knight                                 "vstrihl", "$VT, $VB", IIC_VecGeneral,
14694b43ef3eSJames Y Knight                                 [(set v8i16:$VT,
14704b43ef3eSJames Y Knight                                       (int_ppc_altivec_vstrihl v8i16:$VB))]>;
14715abe6c31SLei Huang  def VINSW :
14724b43ef3eSJames Y Knight    VXForm_1<207, (outs vrrc:$VD), (ins vrrc:$VDi, u4imm:$VA, gprc:$VB),
14734b43ef3eSJames Y Knight             "vinsw $VD, $VB, $VA", IIC_VecGeneral,
14744b43ef3eSJames Y Knight             [(set v4i32:$VD,
14754b43ef3eSJames Y Knight                   (int_ppc_altivec_vinsw v4i32:$VDi, i32:$VB, timm:$VA))]>,
14764b43ef3eSJames Y Knight             RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
14775abe6c31SLei Huang  def VINSD :
14784b43ef3eSJames Y Knight    VXForm_1<463, (outs vrrc:$VD), (ins vrrc:$VDi, u4imm:$VA, g8rc:$VB),
14794b43ef3eSJames Y Knight             "vinsd $VD, $VB, $VA", IIC_VecGeneral,
14804b43ef3eSJames Y Knight             [(set v2i64:$VD,
14814b43ef3eSJames Y Knight                   (int_ppc_altivec_vinsd v2i64:$VDi, i64:$VB, timm:$VA))]>,
14824b43ef3eSJames Y Knight             RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
14835abe6c31SLei Huang  def VINSBVLX :
14845abe6c31SLei Huang    VXForm_VTB5_RA5_ins<15, "vinsbvlx",
14854b43ef3eSJames Y Knight                        [(set v16i8:$VD,
14864b43ef3eSJames Y Knight                              (int_ppc_altivec_vinsbvlx v16i8:$VDi, i32:$VA,
14874b43ef3eSJames Y Knight                                                        v16i8:$VB))]>;
14885abe6c31SLei Huang  def VINSBVRX :
14895abe6c31SLei Huang    VXForm_VTB5_RA5_ins<271, "vinsbvrx",
14904b43ef3eSJames Y Knight                        [(set v16i8:$VD,
14914b43ef3eSJames Y Knight                              (int_ppc_altivec_vinsbvrx v16i8:$VDi, i32:$VA,
14924b43ef3eSJames Y Knight                                                        v16i8:$VB))]>;
14935abe6c31SLei Huang  def VINSHVLX :
14945abe6c31SLei Huang    VXForm_VTB5_RA5_ins<79, "vinshvlx",
14954b43ef3eSJames Y Knight                        [(set v8i16:$VD,
14964b43ef3eSJames Y Knight                              (int_ppc_altivec_vinshvlx v8i16:$VDi, i32:$VA,
14974b43ef3eSJames Y Knight                                                        v8i16:$VB))]>;
14985abe6c31SLei Huang  def VINSHVRX :
14995abe6c31SLei Huang    VXForm_VTB5_RA5_ins<335, "vinshvrx",
15004b43ef3eSJames Y Knight                        [(set v8i16:$VD,
15014b43ef3eSJames Y Knight                              (int_ppc_altivec_vinshvrx v8i16:$VDi, i32:$VA,
15024b43ef3eSJames Y Knight                                                        v8i16:$VB))]>;
15035abe6c31SLei Huang  def VINSWVLX :
15045abe6c31SLei Huang    VXForm_VTB5_RA5_ins<143, "vinswvlx",
15054b43ef3eSJames Y Knight                        [(set v4i32:$VD,
15064b43ef3eSJames Y Knight                              (int_ppc_altivec_vinswvlx v4i32:$VDi, i32:$VA,
15074b43ef3eSJames Y Knight                                                        v4i32:$VB))]>;
15085abe6c31SLei Huang  def VINSWVRX :
15095abe6c31SLei Huang    VXForm_VTB5_RA5_ins<399, "vinswvrx",
15104b43ef3eSJames Y Knight                        [(set v4i32:$VD,
15114b43ef3eSJames Y Knight                              (int_ppc_altivec_vinswvrx v4i32:$VDi, i32:$VA,
15124b43ef3eSJames Y Knight                                                        v4i32:$VB))]>;
15135abe6c31SLei Huang  def VINSBLX :
15145abe6c31SLei Huang    VXForm_VRT5_RAB5_ins<527, "vinsblx",
15154b43ef3eSJames Y Knight                         [(set v16i8:$VD,
15164b43ef3eSJames Y Knight                               (int_ppc_altivec_vinsblx v16i8:$VDi, i32:$VA,
15174b43ef3eSJames Y Knight                                                        i32:$VB))]>;
15185abe6c31SLei Huang  def VINSBRX :
15195abe6c31SLei Huang    VXForm_VRT5_RAB5_ins<783, "vinsbrx",
15204b43ef3eSJames Y Knight                         [(set v16i8:$VD,
15214b43ef3eSJames Y Knight                               (int_ppc_altivec_vinsbrx v16i8:$VDi, i32:$VA,
15224b43ef3eSJames Y Knight                                                        i32:$VB))]>;
15235abe6c31SLei Huang  def VINSHLX :
15245abe6c31SLei Huang    VXForm_VRT5_RAB5_ins<591, "vinshlx",
15254b43ef3eSJames Y Knight                         [(set v8i16:$VD,
15264b43ef3eSJames Y Knight                               (int_ppc_altivec_vinshlx v8i16:$VDi, i32:$VA,
15274b43ef3eSJames Y Knight                                                        i32:$VB))]>;
15285abe6c31SLei Huang  def VINSHRX :
15295abe6c31SLei Huang    VXForm_VRT5_RAB5_ins<847, "vinshrx",
15304b43ef3eSJames Y Knight                         [(set v8i16:$VD,
15314b43ef3eSJames Y Knight                               (int_ppc_altivec_vinshrx v8i16:$VDi, i32:$VA,
15324b43ef3eSJames Y Knight                                                        i32:$VB))]>;
15335abe6c31SLei Huang  def VINSWLX :
15345abe6c31SLei Huang    VXForm_VRT5_RAB5_ins<655, "vinswlx",
15354b43ef3eSJames Y Knight                         [(set v4i32:$VD,
15364b43ef3eSJames Y Knight                               (int_ppc_altivec_vinswlx v4i32:$VDi, i32:$VA,
15374b43ef3eSJames Y Knight                                                        i32:$VB))]>;
15385abe6c31SLei Huang  def VINSWRX :
15395abe6c31SLei Huang    VXForm_VRT5_RAB5_ins<911, "vinswrx",
15404b43ef3eSJames Y Knight                         [(set v4i32:$VD,
15414b43ef3eSJames Y Knight                               (int_ppc_altivec_vinswrx v4i32:$VDi, i32:$VA,
15424b43ef3eSJames Y Knight                                                        i32:$VB))]>;
15435abe6c31SLei Huang  def VINSDLX :
15444b43ef3eSJames Y Knight    VXForm_1<719, (outs vrrc:$VD), (ins vrrc:$VDi, g8rc:$VA, g8rc:$VB),
15454b43ef3eSJames Y Knight             "vinsdlx $VD, $VA, $VB", IIC_VecGeneral,
15464b43ef3eSJames Y Knight              [(set v2i64:$VD,
15474b43ef3eSJames Y Knight                    (int_ppc_altivec_vinsdlx v2i64:$VDi, i64:$VA, i64:$VB))]>,
15484b43ef3eSJames Y Knight              RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
15495abe6c31SLei Huang  def VINSDRX :
15504b43ef3eSJames Y Knight    VXForm_1<975, (outs vrrc:$VD), (ins vrrc:$VDi, g8rc:$VA, g8rc:$VB),
15514b43ef3eSJames Y Knight             "vinsdrx $VD, $VA, $VB", IIC_VecGeneral,
15524b43ef3eSJames Y Knight              [(set v2i64:$VD,
15534b43ef3eSJames Y Knight                    (int_ppc_altivec_vinsdrx v2i64:$VDi, i64:$VA, i64:$VB))]>,
15544b43ef3eSJames Y Knight              RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
15554b43ef3eSJames Y Knight  def VEXTRACTBM : VXForm_RD5_XO5_RS5<1602, 8, (outs gprc:$VD), (ins vrrc:$VB),
15564b43ef3eSJames Y Knight                                      "vextractbm $VD, $VB", IIC_VecGeneral,
15574b43ef3eSJames Y Knight                                      [(set i32:$VD,
15584b43ef3eSJames Y Knight                                      (int_ppc_altivec_vextractbm v16i8:$VB))]>,
15591492c88fSStefan Pintilie                                      ZExt32To64;
15604b43ef3eSJames Y Knight  def VEXTRACTHM : VXForm_RD5_XO5_RS5<1602, 9, (outs gprc:$VD), (ins vrrc:$VB),
15614b43ef3eSJames Y Knight                                      "vextracthm $VD, $VB", IIC_VecGeneral,
15624b43ef3eSJames Y Knight                                      [(set i32:$VD,
15634b43ef3eSJames Y Knight                                      (int_ppc_altivec_vextracthm v8i16:$VB))]>,
15641492c88fSStefan Pintilie                                      ZExt32To64;
15654b43ef3eSJames Y Knight  def VEXTRACTWM : VXForm_RD5_XO5_RS5<1602, 10, (outs gprc:$VD), (ins vrrc:$VB),
15664b43ef3eSJames Y Knight                                      "vextractwm $VD, $VB", IIC_VecGeneral,
15674b43ef3eSJames Y Knight                                      [(set i32:$VD,
15684b43ef3eSJames Y Knight                                      (int_ppc_altivec_vextractwm v4i32:$VB))]>,
15691492c88fSStefan Pintilie                                      ZExt32To64;
15704b43ef3eSJames Y Knight  def VEXTRACTDM : VXForm_RD5_XO5_RS5<1602, 11, (outs gprc:$VD), (ins vrrc:$VB),
15714b43ef3eSJames Y Knight                                      "vextractdm $VD, $VB", IIC_VecGeneral,
15724b43ef3eSJames Y Knight                                      [(set i32:$VD,
15734b43ef3eSJames Y Knight                                      (int_ppc_altivec_vextractdm v2i64:$VB))]>,
15741492c88fSStefan Pintilie                                      ZExt32To64;
15754b43ef3eSJames Y Knight  def VEXTRACTQM : VXForm_RD5_XO5_RS5<1602, 12, (outs gprc:$VD), (ins vrrc:$VB),
15764b43ef3eSJames Y Knight                                      "vextractqm $VD, $VB", IIC_VecGeneral,
15774b43ef3eSJames Y Knight                                      [(set i32:$VD,
15784b43ef3eSJames Y Knight                                      (int_ppc_altivec_vextractqm v1i128:$VB))]>;
15794b43ef3eSJames Y Knight  def VEXPANDBM : VXForm_RD5_XO5_RS5<1602, 0, (outs vrrc:$VD), (ins vrrc:$VB),
15804b43ef3eSJames Y Knight                                     "vexpandbm $VD, $VB", IIC_VecGeneral,
15814b43ef3eSJames Y Knight                                     [(set v16i8:$VD, (int_ppc_altivec_vexpandbm
15824b43ef3eSJames Y Knight                                           v16i8:$VB))]>;
15834b43ef3eSJames Y Knight  def VEXPANDHM : VXForm_RD5_XO5_RS5<1602, 1, (outs vrrc:$VD), (ins vrrc:$VB),
15844b43ef3eSJames Y Knight                                     "vexpandhm $VD, $VB", IIC_VecGeneral,
15854b43ef3eSJames Y Knight                                     [(set v8i16:$VD, (int_ppc_altivec_vexpandhm
15864b43ef3eSJames Y Knight                                           v8i16:$VB))]>;
15874b43ef3eSJames Y Knight  def VEXPANDWM : VXForm_RD5_XO5_RS5<1602, 2, (outs vrrc:$VD), (ins vrrc:$VB),
15884b43ef3eSJames Y Knight                                     "vexpandwm $VD, $VB", IIC_VecGeneral,
15894b43ef3eSJames Y Knight                                     [(set v4i32:$VD, (int_ppc_altivec_vexpandwm
15904b43ef3eSJames Y Knight                                           v4i32:$VB))]>;
15914b43ef3eSJames Y Knight  def VEXPANDDM : VXForm_RD5_XO5_RS5<1602, 3, (outs vrrc:$VD), (ins vrrc:$VB),
15924b43ef3eSJames Y Knight                                     "vexpanddm $VD, $VB", IIC_VecGeneral,
15934b43ef3eSJames Y Knight                                     [(set v2i64:$VD, (int_ppc_altivec_vexpanddm
15944b43ef3eSJames Y Knight                                           v2i64:$VB))]>;
15954b43ef3eSJames Y Knight  def VEXPANDQM : VXForm_RD5_XO5_RS5<1602, 4, (outs vrrc:$VD), (ins vrrc:$VB),
15964b43ef3eSJames Y Knight                                     "vexpandqm $VD, $VB", IIC_VecGeneral,
15974b43ef3eSJames Y Knight                                     [(set v1i128:$VD, (int_ppc_altivec_vexpandqm
15984b43ef3eSJames Y Knight                                           v1i128:$VB))]>;
15994b43ef3eSJames Y Knight  def MTVSRBM : VXForm_RD5_XO5_RS5<1602, 16, (outs vrrc:$VD), (ins g8rc:$VB),
16004b43ef3eSJames Y Knight                                   "mtvsrbm $VD, $VB", IIC_VecGeneral,
16014b43ef3eSJames Y Knight                                   [(set v16i8:$VD,
16024b43ef3eSJames Y Knight                                         (int_ppc_altivec_mtvsrbm i64:$VB))]>;
16034b43ef3eSJames Y Knight  def MTVSRHM : VXForm_RD5_XO5_RS5<1602, 17, (outs vrrc:$VD), (ins g8rc:$VB),
16044b43ef3eSJames Y Knight                                   "mtvsrhm $VD, $VB", IIC_VecGeneral,
16054b43ef3eSJames Y Knight                                   [(set v8i16:$VD,
16064b43ef3eSJames Y Knight                                         (int_ppc_altivec_mtvsrhm i64:$VB))]>;
16074b43ef3eSJames Y Knight  def MTVSRWM : VXForm_RD5_XO5_RS5<1602, 18, (outs vrrc:$VD), (ins g8rc:$VB),
16084b43ef3eSJames Y Knight                                   "mtvsrwm $VD, $VB", IIC_VecGeneral,
16094b43ef3eSJames Y Knight                                   [(set v4i32:$VD,
16104b43ef3eSJames Y Knight                                         (int_ppc_altivec_mtvsrwm i64:$VB))]>;
16114b43ef3eSJames Y Knight  def MTVSRDM : VXForm_RD5_XO5_RS5<1602, 19, (outs vrrc:$VD), (ins g8rc:$VB),
16124b43ef3eSJames Y Knight                                   "mtvsrdm $VD, $VB", IIC_VecGeneral,
16134b43ef3eSJames Y Knight                                   [(set v2i64:$VD,
16144b43ef3eSJames Y Knight                                         (int_ppc_altivec_mtvsrdm i64:$VB))]>;
16154b43ef3eSJames Y Knight  def MTVSRQM : VXForm_RD5_XO5_RS5<1602, 20, (outs vrrc:$VD), (ins g8rc:$VB),
16164b43ef3eSJames Y Knight                                   "mtvsrqm $VD, $VB", IIC_VecGeneral,
16174b43ef3eSJames Y Knight                                   [(set v1i128:$VD,
16184b43ef3eSJames Y Knight                                         (int_ppc_altivec_mtvsrqm i64:$VB))]>;
16194b43ef3eSJames Y Knight  def MTVSRBMI : DXForm<4, 10, (outs vrrc:$RT), (ins u16imm64:$D),
16204b43ef3eSJames Y Knight                        "mtvsrbmi $RT, $D", IIC_VecGeneral,
16214b43ef3eSJames Y Knight                        [(set v16i8:$RT,
16225abe6c31SLei Huang                              (int_ppc_altivec_mtvsrbm imm:$D))]>;
16234b43ef3eSJames Y Knight  def VCNTMBB : VXForm_RD5_MP_VB5<1602, 12, (outs g8rc:$RD),
16244b43ef3eSJames Y Knight                                  (ins vrrc:$VB, u1imm:$MP),
16254b43ef3eSJames Y Knight                                  "vcntmbb $RD, $VB, $MP", IIC_VecGeneral,
16264b43ef3eSJames Y Knight                                  [(set i64:$RD, (int_ppc_altivec_vcntmbb
16274b43ef3eSJames Y Knight                                        v16i8:$VB, timm:$MP))]>;
16284b43ef3eSJames Y Knight  def VCNTMBH : VXForm_RD5_MP_VB5<1602, 13, (outs g8rc:$RD),
16294b43ef3eSJames Y Knight                                  (ins vrrc:$VB, u1imm:$MP),
16304b43ef3eSJames Y Knight                                  "vcntmbh $RD, $VB, $MP", IIC_VecGeneral,
16314b43ef3eSJames Y Knight                                  [(set i64:$RD, (int_ppc_altivec_vcntmbh
16324b43ef3eSJames Y Knight                                        v8i16:$VB, timm:$MP))]>;
16334b43ef3eSJames Y Knight  def VCNTMBW : VXForm_RD5_MP_VB5<1602, 14, (outs g8rc:$RD),
16344b43ef3eSJames Y Knight                                  (ins vrrc:$VB, u1imm:$MP),
16354b43ef3eSJames Y Knight                                  "vcntmbw $RD, $VB, $MP", IIC_VecGeneral,
16364b43ef3eSJames Y Knight                                  [(set i64:$RD, (int_ppc_altivec_vcntmbw
16374b43ef3eSJames Y Knight                                        v4i32:$VB, timm:$MP))]>;
16384b43ef3eSJames Y Knight  def VCNTMBD : VXForm_RD5_MP_VB5<1602, 15, (outs g8rc:$RD),
16394b43ef3eSJames Y Knight                                  (ins vrrc:$VB, u1imm:$MP),
16404b43ef3eSJames Y Knight                                  "vcntmbd $RD, $VB, $MP", IIC_VecGeneral,
16414b43ef3eSJames Y Knight                                  [(set i64:$RD, (int_ppc_altivec_vcntmbd
16424b43ef3eSJames Y Knight                                        v2i64:$VB, timm:$MP))]>;
16434b43ef3eSJames Y Knight  def VEXTDUBVLX : VAForm_1a<24, (outs vrrc:$RT),
16444b43ef3eSJames Y Knight                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
16454b43ef3eSJames Y Knight                             "vextdubvlx $RT, $RA, $RB, $RC",
16465abe6c31SLei Huang                             IIC_VecGeneral,
16474b43ef3eSJames Y Knight                             [(set v2i64:$RT,
16484b43ef3eSJames Y Knight                                   (int_ppc_altivec_vextdubvlx v16i8:$RA,
16494b43ef3eSJames Y Knight                                                               v16i8:$RB,
16504b43ef3eSJames Y Knight                                                               i32:$RC))]>;
16514b43ef3eSJames Y Knight  def VEXTDUBVRX : VAForm_1a<25, (outs vrrc:$RT),
16524b43ef3eSJames Y Knight                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
16534b43ef3eSJames Y Knight                             "vextdubvrx $RT, $RA, $RB, $RC",
16545abe6c31SLei Huang                             IIC_VecGeneral,
16554b43ef3eSJames Y Knight                             [(set v2i64:$RT,
16564b43ef3eSJames Y Knight                                   (int_ppc_altivec_vextdubvrx v16i8:$RA,
16574b43ef3eSJames Y Knight                                                               v16i8:$RB,
16584b43ef3eSJames Y Knight                                                               i32:$RC))]>;
16594b43ef3eSJames Y Knight  def VEXTDUHVLX : VAForm_1a<26, (outs vrrc:$RT),
16604b43ef3eSJames Y Knight                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
16614b43ef3eSJames Y Knight                             "vextduhvlx $RT, $RA, $RB, $RC",
16625abe6c31SLei Huang                             IIC_VecGeneral,
16634b43ef3eSJames Y Knight                             [(set v2i64:$RT,
16644b43ef3eSJames Y Knight                                   (int_ppc_altivec_vextduhvlx v8i16:$RA,
16654b43ef3eSJames Y Knight                                                               v8i16:$RB,
16664b43ef3eSJames Y Knight                                                               i32:$RC))]>;
16674b43ef3eSJames Y Knight  def VEXTDUHVRX : VAForm_1a<27, (outs vrrc:$RT),
16684b43ef3eSJames Y Knight                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
16694b43ef3eSJames Y Knight                             "vextduhvrx $RT, $RA, $RB, $RC",
16705abe6c31SLei Huang                             IIC_VecGeneral,
16714b43ef3eSJames Y Knight                             [(set v2i64:$RT,
16724b43ef3eSJames Y Knight                                   (int_ppc_altivec_vextduhvrx v8i16:$RA,
16734b43ef3eSJames Y Knight                                                               v8i16:$RB,
16744b43ef3eSJames Y Knight                                                               i32:$RC))]>;
16754b43ef3eSJames Y Knight  def VEXTDUWVLX : VAForm_1a<28, (outs vrrc:$RT),
16764b43ef3eSJames Y Knight                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
16774b43ef3eSJames Y Knight                             "vextduwvlx $RT, $RA, $RB, $RC",
16785abe6c31SLei Huang                             IIC_VecGeneral,
16794b43ef3eSJames Y Knight                             [(set v2i64:$RT,
16804b43ef3eSJames Y Knight                                   (int_ppc_altivec_vextduwvlx v4i32:$RA,
16814b43ef3eSJames Y Knight                                                               v4i32:$RB,
16824b43ef3eSJames Y Knight                                                               i32:$RC))]>;
16834b43ef3eSJames Y Knight  def VEXTDUWVRX : VAForm_1a<29, (outs vrrc:$RT),
16844b43ef3eSJames Y Knight                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
16854b43ef3eSJames Y Knight                             "vextduwvrx $RT, $RA, $RB, $RC",
16865abe6c31SLei Huang                             IIC_VecGeneral,
16874b43ef3eSJames Y Knight                             [(set v2i64:$RT,
16884b43ef3eSJames Y Knight                                   (int_ppc_altivec_vextduwvrx v4i32:$RA,
16894b43ef3eSJames Y Knight                                                               v4i32:$RB,
16904b43ef3eSJames Y Knight                                                               i32:$RC))]>;
16914b43ef3eSJames Y Knight  def VEXTDDVLX : VAForm_1a<30, (outs vrrc:$RT),
16924b43ef3eSJames Y Knight                            (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
16934b43ef3eSJames Y Knight                            "vextddvlx $RT, $RA, $RB, $RC",
16945abe6c31SLei Huang                            IIC_VecGeneral,
16954b43ef3eSJames Y Knight                            [(set v2i64:$RT,
16964b43ef3eSJames Y Knight                                  (int_ppc_altivec_vextddvlx v2i64:$RA,
16974b43ef3eSJames Y Knight                                                             v2i64:$RB,
16984b43ef3eSJames Y Knight                                                             i32:$RC))]>;
16994b43ef3eSJames Y Knight  def VEXTDDVRX : VAForm_1a<31, (outs vrrc:$RT),
17004b43ef3eSJames Y Knight                            (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
17014b43ef3eSJames Y Knight                            "vextddvrx $RT, $RA, $RB, $RC",
17025abe6c31SLei Huang                            IIC_VecGeneral,
17034b43ef3eSJames Y Knight                            [(set v2i64:$RT,
17044b43ef3eSJames Y Knight                                  (int_ppc_altivec_vextddvrx v2i64:$RA,
17054b43ef3eSJames Y Knight                                                             v2i64:$RB,
17064b43ef3eSJames Y Knight                                                             i32:$RC))]>;
17074b43ef3eSJames Y Knight   def VPDEPD : VXForm_1<1485, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17084b43ef3eSJames Y Knight                         "vpdepd $VD, $VA, $VB", IIC_VecGeneral,
17094b43ef3eSJames Y Knight                         [(set v2i64:$VD,
17104b43ef3eSJames Y Knight                         (int_ppc_altivec_vpdepd v2i64:$VA, v2i64:$VB))]>;
17114b43ef3eSJames Y Knight   def VPEXTD : VXForm_1<1421, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17124b43ef3eSJames Y Knight                         "vpextd $VD, $VA, $VB", IIC_VecGeneral,
17134b43ef3eSJames Y Knight                         [(set v2i64:$VD,
17144b43ef3eSJames Y Knight                         (int_ppc_altivec_vpextd v2i64:$VA, v2i64:$VB))]>;
17154b43ef3eSJames Y Knight   def PDEPD : XForm_6<31, 156, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
17164b43ef3eSJames Y Knight                       "pdepd $RA, $RST, $RB", IIC_IntGeneral,
17174b43ef3eSJames Y Knight                       [(set i64:$RA, (int_ppc_pdepd i64:$RST, i64:$RB))]>;
17184b43ef3eSJames Y Knight   def PEXTD : XForm_6<31, 188, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
17194b43ef3eSJames Y Knight                       "pextd $RA, $RST, $RB", IIC_IntGeneral,
17204b43ef3eSJames Y Knight                       [(set i64:$RA, (int_ppc_pextd i64:$RST, i64:$RB))]>;
17214b43ef3eSJames Y Knight   def VCFUGED : VXForm_1<1357, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17224b43ef3eSJames Y Knight                          "vcfuged $VD, $VA, $VB", IIC_VecGeneral,
17234b43ef3eSJames Y Knight                          [(set v2i64:$VD,
17244b43ef3eSJames Y Knight                          (int_ppc_altivec_vcfuged v2i64:$VA, v2i64:$VB))]>;
17254b43ef3eSJames Y Knight   def VGNB : VXForm_RD5_N3_VB5<1228, (outs g8rc:$RD), (ins vrrc:$VB, u3imm:$N),
17264b43ef3eSJames Y Knight                                "vgnb $RD, $VB, $N", IIC_VecGeneral,
17274b43ef3eSJames Y Knight                                [(set i64:$RD,
17284b43ef3eSJames Y Knight                                (int_ppc_altivec_vgnb v1i128:$VB, timm:$N))]>;
17294b43ef3eSJames Y Knight   def CFUGED : XForm_6<31, 220, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
17304b43ef3eSJames Y Knight                        "cfuged $RA, $RST, $RB", IIC_IntGeneral,
17314b43ef3eSJames Y Knight                        [(set i64:$RA, (int_ppc_cfuged i64:$RST, i64:$RB))]>;
17325abe6c31SLei Huang   def XXEVAL :
17335abe6c31SLei Huang     8RR_XX4Form_IMM8_XTAB6<34, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
17345abe6c31SLei Huang                            vsrc:$XC, u8imm:$IMM),
17355abe6c31SLei Huang                            "xxeval $XT, $XA, $XB, $XC, $IMM", IIC_VecGeneral,
17365abe6c31SLei Huang                            [(set v2i64:$XT, (int_ppc_vsx_xxeval v2i64:$XA,
17375abe6c31SLei Huang                                  v2i64:$XB, v2i64:$XC, timm:$IMM))]>;
17384b43ef3eSJames Y Knight   def VCLZDM : VXForm_1<1924, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17394b43ef3eSJames Y Knight                         "vclzdm $VD, $VA, $VB", IIC_VecGeneral,
17404b43ef3eSJames Y Knight                         [(set v2i64:$VD,
17414b43ef3eSJames Y Knight                         (int_ppc_altivec_vclzdm v2i64:$VA, v2i64:$VB))]>;
17424b43ef3eSJames Y Knight   def VCTZDM : VXForm_1<1988, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17434b43ef3eSJames Y Knight                         "vctzdm $VD, $VA, $VB", IIC_VecGeneral,
17444b43ef3eSJames Y Knight                         [(set v2i64:$VD,
17454b43ef3eSJames Y Knight                         (int_ppc_altivec_vctzdm v2i64:$VA, v2i64:$VB))]>;
17464b43ef3eSJames Y Knight   def CNTLZDM : XForm_6<31, 59, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
17474b43ef3eSJames Y Knight                         "cntlzdm $RA, $RST, $RB", IIC_IntGeneral,
17484b43ef3eSJames Y Knight                         [(set i64:$RA,
17494b43ef3eSJames Y Knight                         (int_ppc_cntlzdm i64:$RST, i64:$RB))]>;
17504b43ef3eSJames Y Knight   def CNTTZDM : XForm_6<31, 571, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
17514b43ef3eSJames Y Knight                         "cnttzdm $RA, $RST, $RB", IIC_IntGeneral,
17524b43ef3eSJames Y Knight                         [(set i64:$RA,
17534b43ef3eSJames Y Knight                         (int_ppc_cnttzdm i64:$RST, i64:$RB))]>;
17545abe6c31SLei Huang   def XXGENPCVBM :
17555abe6c31SLei Huang     XForm_XT6_IMM5_VB5<60, 916, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM),
17565abe6c31SLei Huang                        "xxgenpcvbm $XT, $VRB, $IMM", IIC_VecGeneral, []>;
17575abe6c31SLei Huang   def XXGENPCVHM :
17585abe6c31SLei Huang     XForm_XT6_IMM5_VB5<60, 917, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM),
17595abe6c31SLei Huang                        "xxgenpcvhm $XT, $VRB, $IMM", IIC_VecGeneral, []>;
17605abe6c31SLei Huang   def XXGENPCVWM :
17615abe6c31SLei Huang     XForm_XT6_IMM5_VB5<60, 948, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM),
17625abe6c31SLei Huang                        "xxgenpcvwm $XT, $VRB, $IMM", IIC_VecGeneral, []>;
17635abe6c31SLei Huang   def XXGENPCVDM :
17645abe6c31SLei Huang     XForm_XT6_IMM5_VB5<60, 949, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM),
17655abe6c31SLei Huang                        "xxgenpcvdm $XT, $VRB, $IMM", IIC_VecGeneral, []>;
17664b43ef3eSJames Y Knight   def VCLRLB : VXForm_1<397, (outs vrrc:$VD), (ins vrrc:$VA, gprc:$VB),
17674b43ef3eSJames Y Knight                         "vclrlb $VD, $VA, $VB", IIC_VecGeneral,
17684b43ef3eSJames Y Knight                         [(set v16i8:$VD,
17694b43ef3eSJames Y Knight                               (int_ppc_altivec_vclrlb v16i8:$VA, i32:$VB))]>;
17704b43ef3eSJames Y Knight   def VCLRRB : VXForm_1<461, (outs vrrc:$VD), (ins vrrc:$VA, gprc:$VB),
17714b43ef3eSJames Y Knight                         "vclrrb $VD, $VA, $VB", IIC_VecGeneral,
17724b43ef3eSJames Y Knight                         [(set v16i8:$VD,
17734b43ef3eSJames Y Knight                               (int_ppc_altivec_vclrrb v16i8:$VA, i32:$VB))]>;
17744b43ef3eSJames Y Knight  def VMULLD : VXForm_1<457, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17754b43ef3eSJames Y Knight                        "vmulld $VD, $VA, $VB", IIC_VecGeneral,
17764b43ef3eSJames Y Knight                        [(set v2i64:$VD, (mul v2i64:$VA, v2i64:$VB))]>;
17774b43ef3eSJames Y Knight  def VMULHSW : VXForm_1<905, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17784b43ef3eSJames Y Knight                         "vmulhsw $VD, $VA, $VB", IIC_VecGeneral,
17794b43ef3eSJames Y Knight                         [(set v4i32:$VD, (mulhs v4i32:$VA, v4i32:$VB))]>;
17804b43ef3eSJames Y Knight  def VMULHUW : VXForm_1<649, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17814b43ef3eSJames Y Knight                         "vmulhuw $VD, $VA, $VB", IIC_VecGeneral,
17824b43ef3eSJames Y Knight                         [(set v4i32:$VD, (mulhu v4i32:$VA, v4i32:$VB))]>;
17834b43ef3eSJames Y Knight  def VMULHSD : VXForm_1<969, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17844b43ef3eSJames Y Knight                         "vmulhsd $VD, $VA, $VB", IIC_VecGeneral,
17854b43ef3eSJames Y Knight                         [(set v2i64:$VD, (mulhs v2i64:$VA, v2i64:$VB))]>;
17864b43ef3eSJames Y Knight  def VMULHUD : VXForm_1<713, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17874b43ef3eSJames Y Knight                         "vmulhud $VD, $VA, $VB", IIC_VecGeneral,
17884b43ef3eSJames Y Knight                         [(set v2i64:$VD, (mulhu v2i64:$VA, v2i64:$VB))]>;
17894b43ef3eSJames Y Knight  def VMODSW : VXForm_1<1931, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17904b43ef3eSJames Y Knight                        "vmodsw $VD, $VA, $VB", IIC_VecGeneral,
17914b43ef3eSJames Y Knight                        [(set v4i32:$VD, (srem v4i32:$VA, v4i32:$VB))]>;
17924b43ef3eSJames Y Knight  def VMODUW : VXForm_1<1675, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17934b43ef3eSJames Y Knight                        "vmoduw $VD, $VA, $VB", IIC_VecGeneral,
17944b43ef3eSJames Y Knight                        [(set v4i32:$VD, (urem v4i32:$VA, v4i32:$VB))]>;
17954b43ef3eSJames Y Knight  def VMODSD : VXForm_1<1995, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17964b43ef3eSJames Y Knight                        "vmodsd $VD, $VA, $VB", IIC_VecGeneral,
17974b43ef3eSJames Y Knight                        [(set v2i64:$VD, (srem v2i64:$VA, v2i64:$VB))]>;
17984b43ef3eSJames Y Knight  def VMODUD : VXForm_1<1739, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
17994b43ef3eSJames Y Knight                        "vmodud $VD, $VA, $VB", IIC_VecGeneral,
18004b43ef3eSJames Y Knight                        [(set v2i64:$VD, (urem v2i64:$VA, v2i64:$VB))]>;
18014b43ef3eSJames Y Knight  def VDIVSW : VXForm_1<395, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18024b43ef3eSJames Y Knight                        "vdivsw $VD, $VA, $VB", IIC_VecGeneral,
18034b43ef3eSJames Y Knight                        [(set v4i32:$VD, (sdiv v4i32:$VA, v4i32:$VB))]>;
18044b43ef3eSJames Y Knight  def VDIVUW : VXForm_1<139, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18054b43ef3eSJames Y Knight                        "vdivuw $VD, $VA, $VB", IIC_VecGeneral,
18064b43ef3eSJames Y Knight                        [(set v4i32:$VD, (udiv v4i32:$VA, v4i32:$VB))]>;
18074b43ef3eSJames Y Knight  def VDIVSD : VXForm_1<459, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18084b43ef3eSJames Y Knight                        "vdivsd $VD, $VA, $VB", IIC_VecGeneral,
18094b43ef3eSJames Y Knight                        [(set v2i64:$VD, (sdiv v2i64:$VA, v2i64:$VB))]>;
18104b43ef3eSJames Y Knight  def VDIVUD : VXForm_1<203, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18114b43ef3eSJames Y Knight                        "vdivud $VD, $VA, $VB", IIC_VecGeneral,
18124b43ef3eSJames Y Knight                        [(set v2i64:$VD, (udiv v2i64:$VA, v2i64:$VB))]>;
18134b43ef3eSJames Y Knight  def VDIVESW : VXForm_1<907, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18144b43ef3eSJames Y Knight                         "vdivesw $VD, $VA, $VB", IIC_VecGeneral,
18154b43ef3eSJames Y Knight                         [(set v4i32:$VD, (int_ppc_altivec_vdivesw v4i32:$VA,
18164b43ef3eSJames Y Knight                               v4i32:$VB))]>;
18174b43ef3eSJames Y Knight  def VDIVEUW : VXForm_1<651, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18184b43ef3eSJames Y Knight                         "vdiveuw $VD, $VA, $VB", IIC_VecGeneral,
18194b43ef3eSJames Y Knight                         [(set v4i32:$VD, (int_ppc_altivec_vdiveuw v4i32:$VA,
18204b43ef3eSJames Y Knight                               v4i32:$VB))]>;
18214b43ef3eSJames Y Knight  def VDIVESD : VXForm_1<971, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18224b43ef3eSJames Y Knight                         "vdivesd $VD, $VA, $VB", IIC_VecGeneral,
18234b43ef3eSJames Y Knight                         [(set v2i64:$VD, (int_ppc_altivec_vdivesd v2i64:$VA,
18244b43ef3eSJames Y Knight                               v2i64:$VB))]>;
18254b43ef3eSJames Y Knight  def VDIVEUD : VXForm_1<715, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18264b43ef3eSJames Y Knight                         "vdiveud $VD, $VA, $VB", IIC_VecGeneral,
18274b43ef3eSJames Y Knight                         [(set v2i64:$VD, (int_ppc_altivec_vdiveud v2i64:$VA,
18284b43ef3eSJames Y Knight                               v2i64:$VB))]>;
18295abe6c31SLei Huang  def XVTLSBB : XX2_BF3_XO5_XB6_XO9<60, 2, 475, (outs crrc:$BF), (ins vsrc:$XB),
18305abe6c31SLei Huang                                    "xvtlsbb $BF, $XB", IIC_VecGeneral, []>;
18314b43ef3eSJames Y Knight  def BRH : XForm_11<31, 219, (outs gprc:$RA), (ins gprc:$RST),
18324b43ef3eSJames Y Knight                     "brh $RA, $RST", IIC_IntRotate, []>;
18334b43ef3eSJames Y Knight  def BRW : XForm_11<31, 155, (outs gprc:$RA), (ins gprc:$RST),
18344b43ef3eSJames Y Knight                     "brw $RA, $RST", IIC_IntRotate,
18354b43ef3eSJames Y Knight                     [(set i32:$RA, (bswap i32:$RST))]>;
18367a7e9109SLei Huang  let isCodeGenOnly = 1 in {
18374b43ef3eSJames Y Knight    def BRH8 : XForm_11<31, 219, (outs g8rc:$RA), (ins g8rc:$RST),
18384b43ef3eSJames Y Knight                        "brh $RA, $RST", IIC_IntRotate, []>;
18394b43ef3eSJames Y Knight    def BRW8 : XForm_11<31, 155, (outs g8rc:$RA), (ins g8rc:$RST),
18404b43ef3eSJames Y Knight                        "brw $RA, $RST", IIC_IntRotate, []>;
18417a7e9109SLei Huang  }
18424b43ef3eSJames Y Knight  def BRD : XForm_11<31, 187, (outs g8rc:$RA), (ins g8rc:$RST),
18434b43ef3eSJames Y Knight                     "brd $RA, $RST", IIC_IntRotate,
18444b43ef3eSJames Y Knight                     [(set i64:$RA, (bswap i64:$RST))]>;
18455abe6c31SLei Huang
18465abe6c31SLei Huang  // The XFormMemOp flag for the following 8 instructions is set on
18475abe6c31SLei Huang  // the instruction format.
18485abe6c31SLei Huang  let mayLoad = 1, mayStore = 0 in {
18495abe6c31SLei Huang    def LXVRBX : X_XT6_RA5_RB5<31, 13, "lxvrbx", vsrc, []>;
18505abe6c31SLei Huang    def LXVRHX : X_XT6_RA5_RB5<31, 45, "lxvrhx", vsrc, []>;
18515abe6c31SLei Huang    def LXVRWX : X_XT6_RA5_RB5<31, 77, "lxvrwx", vsrc, []>;
18525abe6c31SLei Huang    def LXVRDX : X_XT6_RA5_RB5<31, 109, "lxvrdx", vsrc, []>;
18535abe6c31SLei Huang  }
18545abe6c31SLei Huang
18555abe6c31SLei Huang  let mayLoad = 0, mayStore = 1 in {
18565abe6c31SLei Huang    def STXVRBX : X_XS6_RA5_RB5<31, 141, "stxvrbx", vsrc, []>;
18575abe6c31SLei Huang    def STXVRHX : X_XS6_RA5_RB5<31, 173, "stxvrhx", vsrc, []>;
18585abe6c31SLei Huang    def STXVRWX : X_XS6_RA5_RB5<31, 205, "stxvrwx", vsrc, []>;
18595abe6c31SLei Huang    def STXVRDX : X_XS6_RA5_RB5<31, 237, "stxvrdx", vsrc, []>;
18605abe6c31SLei Huang  }
18615abe6c31SLei Huang
18624b43ef3eSJames Y Knight  def VMULESD : VXForm_1<968, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18634b43ef3eSJames Y Knight                         "vmulesd $VD, $VA, $VB", IIC_VecGeneral,
18644b43ef3eSJames Y Knight                         [(set v1i128:$VD, (int_ppc_altivec_vmulesd v2i64:$VA,
18654b43ef3eSJames Y Knight                               v2i64:$VB))]>;
18664b43ef3eSJames Y Knight  def VMULEUD : VXForm_1<712, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18674b43ef3eSJames Y Knight                         "vmuleud $VD, $VA, $VB", IIC_VecGeneral,
18684b43ef3eSJames Y Knight                         [(set v1i128:$VD, (int_ppc_altivec_vmuleud v2i64:$VA,
18694b43ef3eSJames Y Knight                               v2i64:$VB))]>;
18704b43ef3eSJames Y Knight  def VMULOSD : VXForm_1<456, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18714b43ef3eSJames Y Knight                         "vmulosd $VD, $VA, $VB", IIC_VecGeneral,
18724b43ef3eSJames Y Knight                         [(set v1i128:$VD, (int_ppc_altivec_vmulosd v2i64:$VA,
18734b43ef3eSJames Y Knight                               v2i64:$VB))]>;
18744b43ef3eSJames Y Knight  def VMULOUD : VXForm_1<200, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18754b43ef3eSJames Y Knight                         "vmuloud $VD, $VA, $VB", IIC_VecGeneral,
18764b43ef3eSJames Y Knight                         [(set v1i128:$VD, (int_ppc_altivec_vmuloud v2i64:$VA,
18774b43ef3eSJames Y Knight                               v2i64:$VB))]>;
18784b43ef3eSJames Y Knight  def VMSUMCUD : VAForm_1a<23, (outs vrrc:$RT), (ins vrrc:$RA, vrrc:$RB, vrrc:$RC),
18794b43ef3eSJames Y Knight                           "vmsumcud $RT, $RA, $RB, $RC", IIC_VecGeneral,
18804b43ef3eSJames Y Knight                           [(set v1i128:$RT, (int_ppc_altivec_vmsumcud
18814b43ef3eSJames Y Knight                                 v2i64:$RA, v2i64:$RB, v1i128:$RC))]>;
18824b43ef3eSJames Y Knight  def VDIVSQ : VXForm_1<267, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18834b43ef3eSJames Y Knight                        "vdivsq $VD, $VA, $VB", IIC_VecGeneral,
18844b43ef3eSJames Y Knight                        [(set v1i128:$VD, (sdiv v1i128:$VA, v1i128:$VB))]>;
18854b43ef3eSJames Y Knight  def VDIVUQ : VXForm_1<11, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18864b43ef3eSJames Y Knight                        "vdivuq $VD, $VA, $VB", IIC_VecGeneral,
18874b43ef3eSJames Y Knight                        [(set v1i128:$VD, (udiv v1i128:$VA, v1i128:$VB))]>;
18884b43ef3eSJames Y Knight  def VDIVESQ : VXForm_1<779, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18894b43ef3eSJames Y Knight                         "vdivesq $VD, $VA, $VB", IIC_VecGeneral,
18904b43ef3eSJames Y Knight                         [(set v1i128:$VD, (int_ppc_altivec_vdivesq v1i128:$VA,
18914b43ef3eSJames Y Knight			       v1i128:$VB))]>;
18924b43ef3eSJames Y Knight  def VDIVEUQ : VXForm_1<523, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
18934b43ef3eSJames Y Knight                         "vdiveuq $VD, $VA, $VB", IIC_VecGeneral,
18944b43ef3eSJames Y Knight                         [(set v1i128:$VD, (int_ppc_altivec_vdiveuq v1i128:$VA,
18954b43ef3eSJames Y Knight			       v1i128:$VB))]>;
18964b43ef3eSJames Y Knight  def VCMPEQUQ : VCMP <455, "vcmpequq $VD, $VA, $VB" , v1i128>;
18974b43ef3eSJames Y Knight  def VCMPGTSQ : VCMP <903, "vcmpgtsq $VD, $VA, $VB" , v1i128>;
18984b43ef3eSJames Y Knight  def VCMPGTUQ : VCMP <647, "vcmpgtuq $VD, $VA, $VB" , v1i128>;
18994b43ef3eSJames Y Knight  def VCMPEQUQ_rec : VCMP_rec <455, "vcmpequq. $VD, $VA, $VB" , v1i128>;
19004b43ef3eSJames Y Knight  def VCMPGTSQ_rec : VCMP_rec <903, "vcmpgtsq. $VD, $VA, $VB" , v1i128>;
19014b43ef3eSJames Y Knight  def VCMPGTUQ_rec : VCMP_rec <647, "vcmpgtuq. $VD, $VA, $VB" , v1i128>;
19024b43ef3eSJames Y Knight  def VMODSQ : VXForm_1<1803, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
19034b43ef3eSJames Y Knight                        "vmodsq $VD, $VA, $VB", IIC_VecGeneral,
19044b43ef3eSJames Y Knight                        [(set v1i128:$VD, (srem v1i128:$VA, v1i128:$VB))]>;
19054b43ef3eSJames Y Knight  def VMODUQ : VXForm_1<1547, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
19064b43ef3eSJames Y Knight                        "vmoduq $VD, $VA, $VB", IIC_VecGeneral,
19074b43ef3eSJames Y Knight                        [(set v1i128:$VD, (urem v1i128:$VA, v1i128:$VB))]>;
19084b43ef3eSJames Y Knight  def VEXTSD2Q : VXForm_RD5_XO5_RS5<1538, 27, (outs vrrc:$VD), (ins vrrc:$VB),
19094b43ef3eSJames Y Knight                               "vextsd2q $VD, $VB", IIC_VecGeneral,
19104b43ef3eSJames Y Knight                               [(set v1i128:$VD, (int_ppc_altivec_vextsd2q v2i64:$VB))]>;
19114b43ef3eSJames Y Knight  def VCMPUQ : VXForm_BF3_VAB5<257, (outs crrc:$BF), (ins vrrc:$VA, vrrc:$VB),
19124b43ef3eSJames Y Knight                               "vcmpuq $BF, $VA, $VB", IIC_VecGeneral, []>;
19134b43ef3eSJames Y Knight  def VCMPSQ : VXForm_BF3_VAB5<321, (outs crrc:$BF), (ins vrrc:$VA, vrrc:$VB),
19144b43ef3eSJames Y Knight                               "vcmpsq $BF, $VA, $VB", IIC_VecGeneral, []>;
19155abe6c31SLei Huang  def VRLQNM : VX1_VT5_VA5_VB5<325, "vrlqnm",
19164b43ef3eSJames Y Knight                               [(set v1i128:$VD,
19174b43ef3eSJames Y Knight                                   (int_ppc_altivec_vrlqnm v1i128:$VA,
19184b43ef3eSJames Y Knight                                                           v1i128:$VB))]>;
19194b43ef3eSJames Y Knight  def VRLQMI : VXForm_1<69, (outs vrrc:$VD),
19204b43ef3eSJames Y Knight                        (ins vrrc:$VA, vrrc:$VB, vrrc:$VDi),
19214b43ef3eSJames Y Knight                        "vrlqmi $VD, $VA, $VB", IIC_VecFP,
19224b43ef3eSJames Y Knight                        [(set v1i128:$VD,
19234b43ef3eSJames Y Knight                          (int_ppc_altivec_vrlqmi v1i128:$VA, v1i128:$VB,
19244b43ef3eSJames Y Knight                                                  v1i128:$VDi))]>,
19254b43ef3eSJames Y Knight                        RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
19265abe6c31SLei Huang  def VSLQ : VX1_VT5_VA5_VB5<261, "vslq", []>;
19275abe6c31SLei Huang  def VSRAQ : VX1_VT5_VA5_VB5<773, "vsraq", []>;
19285abe6c31SLei Huang  def VSRQ : VX1_VT5_VA5_VB5<517, "vsrq", []>;
19295abe6c31SLei Huang  def VRLQ : VX1_VT5_VA5_VB5<5, "vrlq", []>;
19305abe6c31SLei Huang  def XSCVQPUQZ : X_VT5_XO5_VB5<63, 0, 836, "xscvqpuqz", []>;
19315abe6c31SLei Huang  def XSCVQPSQZ : X_VT5_XO5_VB5<63, 8, 836, "xscvqpsqz", []>;
19325abe6c31SLei Huang  def XSCVUQQP : X_VT5_XO5_VB5<63, 3, 836, "xscvuqqp", []>;
19335abe6c31SLei Huang  def XSCVSQQP : X_VT5_XO5_VB5<63, 11, 836, "xscvsqqp", []>;
1934eb1c5a98SStefan Pintilie  def LXVKQ : XForm_XT6_IMM5<60, 31, 360, (outs vsrc:$XT), (ins u5imm:$UIM),
1935eb1c5a98SStefan Pintilie                             "lxvkq $XT, $UIM", IIC_VecGeneral, []>;
19365abe6c31SLei Huang}
19375abe6c31SLei Huang
19385abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX] in {
19395abe6c31SLei Huang  def XVCVSPBF16 : XX2_XT6_XO5_XB6<60, 17, 475, "xvcvspbf16", vsrc, []>;
19405abe6c31SLei Huang  def XVCVBF16SPN : XX2_XT6_XO5_XB6<60, 16, 475, "xvcvbf16spn", vsrc, []>;
19415abe6c31SLei Huang  def XSMAXCQP : X_VT5_VA5_VB5<63, 676, "xsmaxcqp",
19424b43ef3eSJames Y Knight                               [(set f128:$RST, (PPCxsmaxc f128:$RA, f128:$RB))]>;
19435abe6c31SLei Huang  def XSMINCQP : X_VT5_VA5_VB5<63, 740, "xsmincqp",
19444b43ef3eSJames Y Knight                               [(set f128:$RST, (PPCxsminc f128:$RA, f128:$RB))]>;
19455abe6c31SLei Huang}
19465abe6c31SLei Huang
1947ea8b95d0SStefan Pintilielet Predicates = [IsISA3_1] in {
1948ea8b95d0SStefan Pintilie  def WAITP10 : XForm_IMM2_IMM2<31, 30, (outs), (ins u2imm:$L, u2imm:$PL),
1949ea8b95d0SStefan Pintilie                                "wait $L $PL", IIC_LdStLoad, []>;
1950ea8b95d0SStefan Pintilie  def SYNCP10 : XForm_IMM3_IMM2<31, 598, (outs), (ins u3imm:$L, u2imm:$SC),
1951ea8b95d0SStefan Pintilie                                "sync $L, $SC", IIC_LdStSync, []>;
1952ea8b95d0SStefan Pintilie}
1953ea8b95d0SStefan Pintilie
19545abe6c31SLei Huang// Multiclass defining patterns for Set Boolean Extension Reverse Instructions.
19555abe6c31SLei Huang// This is analogous to the CRNotPat multiclass but specifically for Power10
19565abe6c31SLei Huang// and newer subtargets since the extended forms use Set Boolean instructions.
19575abe6c31SLei Huang// The first two anonymous patterns defined are actually a duplicate of those
19585abe6c31SLei Huang// in CRNotPat, but it is preferable to define both multiclasses as complete
19595abe6c31SLei Huang// ones rather than pulling that small common section out.
19605abe6c31SLei Huangmulticlass P10ReverseSetBool<dag pattern, dag result> {
19615abe6c31SLei Huang  def : Pat<pattern, (crnot result)>;
19625abe6c31SLei Huang  def : Pat<(not pattern), result>;
19635abe6c31SLei Huang
19645abe6c31SLei Huang  def : Pat<(i32 (zext pattern)),
19655abe6c31SLei Huang            (SETBCR result)>;
19665abe6c31SLei Huang  def : Pat<(i64 (zext pattern)),
19675abe6c31SLei Huang            (SETBCR8 result)>;
19685abe6c31SLei Huang
19695abe6c31SLei Huang  def : Pat<(i32 (sext pattern)),
19705abe6c31SLei Huang            (SETNBCR result)>;
19715abe6c31SLei Huang  def : Pat<(i64 (sext pattern)),
19725abe6c31SLei Huang            (SETNBCR8 result)>;
19735abe6c31SLei Huang
19745abe6c31SLei Huang  def : Pat<(i32 (anyext pattern)),
19755abe6c31SLei Huang            (SETBCR result)>;
19765abe6c31SLei Huang  def : Pat<(i64 (anyext pattern)),
19775abe6c31SLei Huang            (SETBCR8 result)>;
19785abe6c31SLei Huang}
19795abe6c31SLei Huang
19805abe6c31SLei Huangmulticlass IntSetP10RevSetBool<SDNode SetCC, ValueType Ty, PatLeaf ZExtTy,
19815abe6c31SLei Huang                               ImmLeaf SExtTy, I Cmpi, I Cmpli,
19825abe6c31SLei Huang                               I Cmp, I Cmpl> {
19835abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)),
19845abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_lt)>;
19855abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)),
19865abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmp $s1, $s2), sub_lt)>;
19875abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)),
19885abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_gt)>;
19895abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)),
19905abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmp $s1, $s2), sub_gt)>;
19915abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)),
19925abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmp $s1, $s2), sub_eq)>;
19935abe6c31SLei Huang
19945abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETUGE)),
19955abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_lt)>;
19965abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETGE)),
19975abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_lt)>;
19985abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETULE)),
19995abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_gt)>;
20005abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETLE)),
20015abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_gt)>;
20025abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETNE)),
20035abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_eq)>;
20045abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETNE)),
20055abe6c31SLei Huang                           (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_eq)>;
20065abe6c31SLei Huang}
20075abe6c31SLei Huang
20085abe6c31SLei Huangmulticlass FSetP10RevSetBool<SDNode SetCC, ValueType Ty, I FCmp> {
20095abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)),
20105abe6c31SLei Huang                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>;
20115abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)),
20125abe6c31SLei Huang                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>;
20135abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)),
20145abe6c31SLei Huang                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>;
20155abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)),
20165abe6c31SLei Huang                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>;
20175abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUNE)),
20185abe6c31SLei Huang                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>;
20195abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)),
20205abe6c31SLei Huang                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>;
20215abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETO)),
20225abe6c31SLei Huang                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_un)>;
20235abe6c31SLei Huang}
20245abe6c31SLei Huang
20255abe6c31SLei Huanglet Predicates = [IsISA3_1] in {
20265abe6c31SLei Huang  def : Pat<(i32 (zext i1:$in)),
20275abe6c31SLei Huang            (SETBC $in)>;
20285abe6c31SLei Huang  def : Pat<(i64 (zext i1:$in)),
20295abe6c31SLei Huang            (SETBC8 $in)>;
20305abe6c31SLei Huang  def : Pat<(i32 (sext i1:$in)),
20315abe6c31SLei Huang            (SETNBC $in)>;
20325abe6c31SLei Huang  def : Pat<(i64 (sext i1:$in)),
20335abe6c31SLei Huang            (SETNBC8 $in)>;
20345abe6c31SLei Huang  def : Pat<(i32 (anyext i1:$in)),
20355abe6c31SLei Huang            (SETBC $in)>;
20365abe6c31SLei Huang  def : Pat<(i64 (anyext i1:$in)),
20375abe6c31SLei Huang            (SETBC8 $in)>;
20385abe6c31SLei Huang
20395abe6c31SLei Huang  // Instantiation of the set boolean reverse patterns for 32-bit integers.
20405abe6c31SLei Huang  defm : IntSetP10RevSetBool<setcc, i32, immZExt16, imm32SExt16,
20415abe6c31SLei Huang                             CMPWI, CMPLWI, CMPW, CMPLW>;
20425abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (setcc i32:$s1, imm:$imm, SETNE)),
20435abe6c31SLei Huang                           (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)),
20445abe6c31SLei Huang                                           (LO16 imm:$imm)), sub_eq)>;
20455abe6c31SLei Huang
20465abe6c31SLei Huang  // Instantiation of the set boolean reverse patterns for 64-bit integers.
20475abe6c31SLei Huang  defm : IntSetP10RevSetBool<setcc, i64, immZExt16, imm64SExt16,
20485abe6c31SLei Huang                             CMPDI, CMPLDI, CMPD, CMPLD>;
20495abe6c31SLei Huang  defm : P10ReverseSetBool<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETNE)),
20505abe6c31SLei Huang                           (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)),
20515abe6c31SLei Huang                                           (LO16 imm:$imm)), sub_eq)>;
20525abe6c31SLei Huang}
20535abe6c31SLei Huang
20545abe6c31SLei Huang// Instantiation of the set boolean reverse patterns for f32, f64, f128.
20555abe6c31SLei Huanglet Predicates = [IsISA3_1, HasFPU] in {
20565abe6c31SLei Huang  defm : FSetP10RevSetBool<setcc, f32, FCMPUS>;
20575abe6c31SLei Huang  defm : FSetP10RevSetBool<setcc, f64, FCMPUD>;
20585abe6c31SLei Huang  defm : FSetP10RevSetBool<setcc, f128, XSCMPUQP>;
20595abe6c31SLei Huang}
20605abe6c31SLei Huang
20615abe6c31SLei Huang//---------------------------- Anonymous Patterns ----------------------------//
20625abe6c31SLei Huanglet Predicates = [IsISA3_1] in {
20635abe6c31SLei Huang  // Exploit the vector multiply high instructions using intrinsics.
20645abe6c31SLei Huang  def : Pat<(v4i32 (int_ppc_altivec_vmulhsw v4i32:$vA, v4i32:$vB)),
20655abe6c31SLei Huang            (v4i32 (VMULHSW $vA, $vB))>;
20665abe6c31SLei Huang  def : Pat<(v4i32 (int_ppc_altivec_vmulhuw v4i32:$vA, v4i32:$vB)),
20675abe6c31SLei Huang            (v4i32 (VMULHUW $vA, $vB))>;
20685abe6c31SLei Huang  def : Pat<(v2i64 (int_ppc_altivec_vmulhsd v2i64:$vA, v2i64:$vB)),
20695abe6c31SLei Huang            (v2i64 (VMULHSD $vA, $vB))>;
20705abe6c31SLei Huang  def : Pat<(v2i64 (int_ppc_altivec_vmulhud v2i64:$vA, v2i64:$vB)),
20715abe6c31SLei Huang            (v2i64 (VMULHUD $vA, $vB))>;
20725abe6c31SLei Huang  def : Pat<(v16i8 (int_ppc_vsx_xxgenpcvbm v16i8:$VRB, imm:$IMM)),
20735abe6c31SLei Huang            (v16i8 (COPY_TO_REGCLASS (XXGENPCVBM $VRB, imm:$IMM), VRRC))>;
20745abe6c31SLei Huang  def : Pat<(v8i16 (int_ppc_vsx_xxgenpcvhm v8i16:$VRB, imm:$IMM)),
20755abe6c31SLei Huang            (v8i16 (COPY_TO_REGCLASS (XXGENPCVHM $VRB, imm:$IMM), VRRC))>;
20765abe6c31SLei Huang  def : Pat<(v4i32 (int_ppc_vsx_xxgenpcvwm v4i32:$VRB, imm:$IMM)),
20775abe6c31SLei Huang            (v4i32 (COPY_TO_REGCLASS (XXGENPCVWM $VRB, imm:$IMM), VRRC))>;
20785abe6c31SLei Huang  def : Pat<(v2i64 (int_ppc_vsx_xxgenpcvdm v2i64:$VRB, imm:$IMM)),
20795abe6c31SLei Huang            (v2i64 (COPY_TO_REGCLASS (XXGENPCVDM $VRB, imm:$IMM), VRRC))>;
20805abe6c31SLei Huang  def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 1)),
20815abe6c31SLei Huang            (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_lt)>;
20825abe6c31SLei Huang  def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 0)),
20835abe6c31SLei Huang            (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_eq)>;
2084ee559b21SLei Huang  def : Pat<(srl (bswap i32:$RS), (i32 16)),
2085ee559b21SLei Huang            (RLDICL_32 (BRH $RS), 0, 48)>;
2086ee559b21SLei Huang  def : Pat<(i64 (zext (i32 (srl (bswap i32:$RS), (i32 16))))),
2087ee559b21SLei Huang            (RLDICL_32_64 (BRH $RS), 0, 48)>;
20885abe6c31SLei Huang  def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 8)),
20895abe6c31SLei Huang             (v1i128 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VRRC))>;
20905abe6c31SLei Huang  def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 16)),
20915abe6c31SLei Huang             (v1i128 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VRRC))>;
20925abe6c31SLei Huang  def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 32)),
20935abe6c31SLei Huang             (v1i128 (COPY_TO_REGCLASS (LXVRWX ForceXForm:$src), VRRC))>;
20945abe6c31SLei Huang  def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 64)),
20955abe6c31SLei Huang             (v1i128 (COPY_TO_REGCLASS (LXVRDX ForceXForm:$src), VRRC))>;
20965abe6c31SLei Huang
20975abe6c31SLei Huang  def : Pat<(v1i128 (rotl v1i128:$vA, v1i128:$vB)),
20985abe6c31SLei Huang            (v1i128 (VRLQ v1i128:$vA, v1i128:$vB))>;
20995abe6c31SLei Huang
21005abe6c31SLei Huang  def : Pat <(v2i64 (PPCxxsplti32dx v2i64:$XT, i32:$XI, i32:$IMM32)),
21015abe6c31SLei Huang             (v2i64 (XXSPLTI32DX v2i64:$XT, i32:$XI, i32:$IMM32))>;
21025abe6c31SLei Huang}
21035abe6c31SLei Huang
21045abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX] in {
21055abe6c31SLei Huang  def : Pat<(v16i8 (int_ppc_vsx_xvcvspbf16 v16i8:$XA)),
21065abe6c31SLei Huang            (COPY_TO_REGCLASS (XVCVSPBF16 RCCp.AToVSRC), VRRC)>;
21075abe6c31SLei Huang  def : Pat<(v16i8 (int_ppc_vsx_xvcvbf16spn v16i8:$XA)),
21085abe6c31SLei Huang            (COPY_TO_REGCLASS (XVCVBF16SPN RCCp.AToVSRC), VRRC)>;
21095abe6c31SLei Huang}
21105abe6c31SLei Huang
21115abe6c31SLei Huanglet AddedComplexity = 400, Predicates = [IsISA3_1, IsLittleEndian] in {
21125abe6c31SLei Huang  // Store element 0 of a VSX register to memory
21135abe6c31SLei Huang  def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$src, 0)), ForceXForm:$dst),
21145abe6c31SLei Huang            (STXVRBX (COPY_TO_REGCLASS v16i8:$src, VSRC), ForceXForm:$dst)>;
21155abe6c31SLei Huang  def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$src, 0)), ForceXForm:$dst),
21165abe6c31SLei Huang            (STXVRHX (COPY_TO_REGCLASS v8i16:$src, VSRC), ForceXForm:$dst)>;
21175abe6c31SLei Huang  def : Pat<(store (i32 (extractelt v4i32:$src, 0)), ForceXForm:$dst),
21185abe6c31SLei Huang            (STXVRWX $src, ForceXForm:$dst)>;
21195abe6c31SLei Huang  def : Pat<(store (f32 (extractelt v4f32:$src, 0)), ForceXForm:$dst),
21205abe6c31SLei Huang            (STXVRWX $src, ForceXForm:$dst)>;
21215abe6c31SLei Huang  def : Pat<(store (i64 (extractelt v2i64:$src, 0)), ForceXForm:$dst),
21225abe6c31SLei Huang            (STXVRDX $src, ForceXForm:$dst)>;
21235abe6c31SLei Huang  def : Pat<(store (f64 (extractelt v2f64:$src, 0)), ForceXForm:$dst),
21245abe6c31SLei Huang            (STXVRDX $src, ForceXForm:$dst)>;
21255abe6c31SLei Huang  // Load element 0 of a VSX register to memory
21265abe6c31SLei Huang  def : Pat<(v8i16 (scalar_to_vector (i32 (extloadi16 ForceXForm:$src)))),
21275abe6c31SLei Huang            (v8i16 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VSRC))>;
21285abe6c31SLei Huang  def : Pat<(v16i8 (scalar_to_vector (i32 (extloadi8 ForceXForm:$src)))),
21295abe6c31SLei Huang            (v16i8 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VSRC))>;
213071be020dSTing Wang  def : Pat<(store (i64 (extractelt v2i64:$A, 1)), ForceXForm:$src),
213171be020dSTing Wang            (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>;
213271be020dSTing Wang }
213371be020dSTing Wang
213471be020dSTing Wanglet Predicates = [IsISA3_1, IsBigEndian] in {
213571be020dSTing Wang  def : Pat<(store (i64 (extractelt v2i64:$A, 0)), ForceXForm:$src),
213671be020dSTing Wang            (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>;
21375abe6c31SLei Huang}
21385abe6c31SLei Huang
21395abe6c31SLei Huang// FIXME: The swap is overkill when the shift amount is a constant.
21405abe6c31SLei Huang// We should just fix the constant in the DAG.
21415abe6c31SLei Huanglet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX] in {
21425abe6c31SLei Huang  def : Pat<(v1i128 (shl v1i128:$VRA, v1i128:$VRB)),
21435abe6c31SLei Huang            (v1i128 (VSLQ v1i128:$VRA,
21445abe6c31SLei Huang                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
21455abe6c31SLei Huang                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
21465abe6c31SLei Huang  def : Pat<(v1i128 (PPCshl v1i128:$VRA, v1i128:$VRB)),
21475abe6c31SLei Huang            (v1i128 (VSLQ v1i128:$VRA,
21485abe6c31SLei Huang                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
21495abe6c31SLei Huang                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
21505abe6c31SLei Huang  def : Pat<(v1i128 (srl v1i128:$VRA, v1i128:$VRB)),
21515abe6c31SLei Huang            (v1i128 (VSRQ v1i128:$VRA,
21525abe6c31SLei Huang                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
21535abe6c31SLei Huang                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
21545abe6c31SLei Huang  def : Pat<(v1i128 (PPCsrl v1i128:$VRA, v1i128:$VRB)),
21555abe6c31SLei Huang            (v1i128 (VSRQ v1i128:$VRA,
21565abe6c31SLei Huang                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
21575abe6c31SLei Huang                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
21585abe6c31SLei Huang  def : Pat<(v1i128 (sra v1i128:$VRA, v1i128:$VRB)),
21595abe6c31SLei Huang            (v1i128 (VSRAQ v1i128:$VRA,
21605abe6c31SLei Huang                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
21615abe6c31SLei Huang                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
21625abe6c31SLei Huang  def : Pat<(v1i128 (PPCsra v1i128:$VRA, v1i128:$VRB)),
21635abe6c31SLei Huang            (v1i128 (VSRAQ v1i128:$VRA,
21645abe6c31SLei Huang                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
21655abe6c31SLei Huang                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
21665abe6c31SLei Huang}
21675abe6c31SLei Huang
21685abe6c31SLei Huangclass xxevalPattern <dag pattern, bits<8> imm> :
21695abe6c31SLei Huang  Pat<(v4i32 pattern), (XXEVAL $vA, $vB, $vC, imm)> {}
21705abe6c31SLei Huang
2171b41dbe60Szhijian linlet Predicates = [PrefixInstrs, HasP10Vector] in {
2172b41dbe60Szhijian lin  let AddedComplexity = 400 in {
21735abe6c31SLei Huang    def : Pat<(v4i32 (build_vector i32immNonAllOneNonZero:$A,
21745abe6c31SLei Huang				   i32immNonAllOneNonZero:$A,
21755abe6c31SLei Huang                                   i32immNonAllOneNonZero:$A,
21765abe6c31SLei Huang                                   i32immNonAllOneNonZero:$A)),
21775abe6c31SLei Huang              (v4i32 (XXSPLTIW imm:$A))>;
21785abe6c31SLei Huang    def : Pat<(f32 nzFPImmAsi32:$A),
21795abe6c31SLei Huang              (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)),
21805abe6c31SLei Huang                              VSFRC)>;
21815abe6c31SLei Huang    def : Pat<(f64 nzFPImmAsi32:$A),
21825abe6c31SLei Huang              (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)),
21835abe6c31SLei Huang                              VSFRC)>;
21845abe6c31SLei Huang
21855abe6c31SLei Huang    // To replace constant pool with XXSPLTI32DX for scalars.
21865abe6c31SLei Huang    def : Pat<(f32 nzFPImmAsi64:$A),
21875abe6c31SLei Huang              (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX(IMPLICIT_DEF), 0,
21885abe6c31SLei Huang                                             (getFPAs64BitIntHi $A)),
21895abe6c31SLei Huang                                             1, (getFPAs64BitIntLo $A)),
21905abe6c31SLei Huang                                VSSRC)>;
21915abe6c31SLei Huang
21925abe6c31SLei Huang    def : Pat<(f64 nzFPImmAsi64:$A),
21935abe6c31SLei Huang              (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX (IMPLICIT_DEF), 0,
21945abe6c31SLei Huang                                             (getFPAs64BitIntHi $A)),
21955abe6c31SLei Huang                                             1, (getFPAs64BitIntLo $A)),
21965abe6c31SLei Huang                                 VSFRC)>;
21975abe6c31SLei Huang
21985abe6c31SLei Huang    // Anonymous patterns for XXEVAL
21995abe6c31SLei Huang    // AND
22005abe6c31SLei Huang    // and(A, B, C)
22015abe6c31SLei Huang    def : xxevalPattern<(and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 1>;
22025abe6c31SLei Huang    // and(A, xor(B, C))
22035abe6c31SLei Huang    def : xxevalPattern<(and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 6>;
22045abe6c31SLei Huang    // and(A, or(B, C))
22055abe6c31SLei Huang    def : xxevalPattern<(and v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 7>;
22065abe6c31SLei Huang    // and(A, nor(B, C))
22075abe6c31SLei Huang    def : xxevalPattern<(and v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 8>;
22085abe6c31SLei Huang    // and(A, eqv(B, C))
22095abe6c31SLei Huang    def : xxevalPattern<(and v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 9>;
22105abe6c31SLei Huang    // and(A, nand(B, C))
22115abe6c31SLei Huang    def : xxevalPattern<(and v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 14>;
22125abe6c31SLei Huang
22135abe6c31SLei Huang    // NAND
22145abe6c31SLei Huang    // nand(A, B, C)
22155abe6c31SLei Huang    def : xxevalPattern<(vnot (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC))),
22165abe6c31SLei Huang                         !sub(255, 1)>;
22175abe6c31SLei Huang    // nand(A, xor(B, C))
22185abe6c31SLei Huang    def : xxevalPattern<(vnot (and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))),
22195abe6c31SLei Huang                         !sub(255, 6)>;
22205abe6c31SLei Huang    // nand(A, or(B, C))
22215abe6c31SLei Huang    def : xxevalPattern<(vnot (and v4i32:$vA, (or v4i32:$vB, v4i32:$vC))),
22225abe6c31SLei Huang                         !sub(255, 7)>;
22235abe6c31SLei Huang    // nand(A, nor(B, C))
22245abe6c31SLei Huang    def : xxevalPattern<(or (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)),
22255abe6c31SLei Huang                         !sub(255, 8)>;
22265abe6c31SLei Huang    // nand(A, eqv(B, C))
22275abe6c31SLei Huang    def : xxevalPattern<(or (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)),
22285abe6c31SLei Huang                         !sub(255, 9)>;
22295abe6c31SLei Huang    // nand(A, nand(B, C))
22305abe6c31SLei Huang    def : xxevalPattern<(or (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)),
22315abe6c31SLei Huang                         !sub(255, 14)>;
22325abe6c31SLei Huang
223312e1936fSTing Wang    // EQV
223412e1936fSTing Wang    // (eqv A, B, C)
223512e1936fSTing Wang    def : xxevalPattern<(or (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)),
223612e1936fSTing Wang                            (vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)))),
223712e1936fSTing Wang                         150>;
223812e1936fSTing Wang    // (eqv A, (and B, C))
223912e1936fSTing Wang    def : xxevalPattern<(vnot (xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 225>;
224012e1936fSTing Wang    // (eqv A, (or B, C))
224112e1936fSTing Wang    def : xxevalPattern<(vnot (xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 135>;
224212e1936fSTing Wang
224312e1936fSTing Wang    // NOR
224412e1936fSTing Wang    // (nor A, B, C)
224512e1936fSTing Wang    def : xxevalPattern<(vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 128>;
224612e1936fSTing Wang    // (nor A, (and B, C))
224712e1936fSTing Wang    def : xxevalPattern<(vnot (or v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 224>;
224812e1936fSTing Wang    // (nor A, (eqv B, C))
224912e1936fSTing Wang    def : xxevalPattern<(and (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 96>;
225012e1936fSTing Wang    // (nor A, (nand B, C))
225112e1936fSTing Wang    def : xxevalPattern<(and (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 16>;
225212e1936fSTing Wang    // (nor A, (nor B, C))
225312e1936fSTing Wang    def : xxevalPattern<(and (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 112>;
225412e1936fSTing Wang    // (nor A, (xor B, C))
225512e1936fSTing Wang    def : xxevalPattern<(vnot (or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 144>;
225612e1936fSTing Wang
225712e1936fSTing Wang    // OR
225812e1936fSTing Wang    // (or A, B, C)
225912e1936fSTing Wang    def : xxevalPattern<(or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 127>;
226012e1936fSTing Wang    // (or A, (and B, C))
226112e1936fSTing Wang    def : xxevalPattern<(or v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 31>;
226212e1936fSTing Wang    // (or A, (eqv B, C))
226312e1936fSTing Wang    def : xxevalPattern<(or v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 159>;
226412e1936fSTing Wang    // (or A, (nand B, C))
226512e1936fSTing Wang    def : xxevalPattern<(or v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 239>;
226612e1936fSTing Wang    // (or A, (nor B, C))
226712e1936fSTing Wang    def : xxevalPattern<(or v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 143>;
226812e1936fSTing Wang    // (or A, (xor B, C))
226912e1936fSTing Wang    def : xxevalPattern<(or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 111>;
227012e1936fSTing Wang
227112e1936fSTing Wang    // XOR
227212e1936fSTing Wang    // (xor A, B, C)
227312e1936fSTing Wang    def : xxevalPattern<(xor v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 105>;
227412e1936fSTing Wang    // (xor A, (and B, C))
227512e1936fSTing Wang    def : xxevalPattern<(xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 30>;
227612e1936fSTing Wang    // (xor A, (or B, C))
227712e1936fSTing Wang    def : xxevalPattern<(xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 120>;
227812e1936fSTing Wang
22795abe6c31SLei Huang    // Anonymous patterns to select prefixed VSX loads and stores.
22805abe6c31SLei Huang    // Load / Store f128
22815abe6c31SLei Huang    def : Pat<(f128 (load PDForm:$src)),
22825abe6c31SLei Huang              (COPY_TO_REGCLASS (PLXV memri34:$src), VRRC)>;
22835abe6c31SLei Huang    def : Pat<(store f128:$XS, PDForm:$dst),
22845abe6c31SLei Huang              (PSTXV (COPY_TO_REGCLASS $XS, VSRC), memri34:$dst)>;
22855abe6c31SLei Huang
22865abe6c31SLei Huang    // Load / Store v4i32
22875abe6c31SLei Huang    def : Pat<(v4i32 (load PDForm:$src)), (PLXV memri34:$src)>;
22885abe6c31SLei Huang    def : Pat<(store v4i32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>;
22895abe6c31SLei Huang
22905abe6c31SLei Huang    // Load / Store v2i64
22915abe6c31SLei Huang    def : Pat<(v2i64 (load PDForm:$src)), (PLXV memri34:$src)>;
22925abe6c31SLei Huang    def : Pat<(store v2i64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>;
22935abe6c31SLei Huang
22945abe6c31SLei Huang    // Load / Store v4f32
22955abe6c31SLei Huang    def : Pat<(v4f32 (load PDForm:$src)), (PLXV memri34:$src)>;
22965abe6c31SLei Huang    def : Pat<(store v4f32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>;
22975abe6c31SLei Huang
22985abe6c31SLei Huang    // Load / Store v2f64
22995abe6c31SLei Huang    def : Pat<(v2f64 (load PDForm:$src)), (PLXV memri34:$src)>;
23005abe6c31SLei Huang    def : Pat<(store v2f64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>;
23015abe6c31SLei Huang
23025abe6c31SLei Huang    // Cases For PPCstore_scal_int_from_vsr
230369bc8ff7SQiu Chaofan    def : Pat<(PPCstore_scal_int_from_vsr f64:$src, PDForm:$dst, 8),
230469bc8ff7SQiu Chaofan              (PSTXSD $src, PDForm:$dst)>;
230569bc8ff7SQiu Chaofan    def : Pat<(PPCstore_scal_int_from_vsr f128:$src, PDForm:$dst, 8),
230669bc8ff7SQiu Chaofan              (PSTXSD (COPY_TO_REGCLASS $src, VFRC), PDForm:$dst)>;
23075abe6c31SLei Huang    }
23085abe6c31SLei Huang
2309b41dbe60Szhijian lin
23105abe6c31SLei Huang  def : Pat<(i32 imm34:$imm), (PLI (getImmAs64BitInt imm:$imm))>;
23115abe6c31SLei Huang  def : Pat<(i64 imm34:$imm), (PLI8 (getImmAs64BitInt imm:$imm))>;
23125abe6c31SLei Huang  def : Pat<(v16i8 (int_ppc_vsx_xxpermx v16i8:$A, v16i8:$B, v16i8:$C, timm:$D)),
23135abe6c31SLei Huang            (COPY_TO_REGCLASS (XXPERMX (COPY_TO_REGCLASS $A, VSRC),
23145abe6c31SLei Huang                                       (COPY_TO_REGCLASS $B, VSRC),
23155abe6c31SLei Huang                                       (COPY_TO_REGCLASS $C, VSRC), $D), VSRC)>;
23165abe6c31SLei Huang  def : Pat<(v16i8 (int_ppc_vsx_xxblendvb v16i8:$A, v16i8:$B, v16i8:$C)),
23175abe6c31SLei Huang            (COPY_TO_REGCLASS
23185abe6c31SLei Huang                   (XXBLENDVB (COPY_TO_REGCLASS $A, VSRC),
23195abe6c31SLei Huang                              (COPY_TO_REGCLASS $B, VSRC),
23205abe6c31SLei Huang                              (COPY_TO_REGCLASS $C, VSRC)), VSRC)>;
23215abe6c31SLei Huang  def : Pat<(v8i16 (int_ppc_vsx_xxblendvh v8i16:$A, v8i16:$B, v8i16:$C)),
23225abe6c31SLei Huang            (COPY_TO_REGCLASS
23235abe6c31SLei Huang                   (XXBLENDVH (COPY_TO_REGCLASS $A, VSRC),
23245abe6c31SLei Huang                              (COPY_TO_REGCLASS $B, VSRC),
23255abe6c31SLei Huang                              (COPY_TO_REGCLASS $C, VSRC)), VSRC)>;
23265abe6c31SLei Huang  def : Pat<(int_ppc_vsx_xxblendvw v4i32:$A, v4i32:$B, v4i32:$C),
23275abe6c31SLei Huang            (XXBLENDVW $A, $B, $C)>;
23285abe6c31SLei Huang  def : Pat<(int_ppc_vsx_xxblendvd v2i64:$A, v2i64:$B, v2i64:$C),
23295abe6c31SLei Huang            (XXBLENDVD $A, $B, $C)>;
23306127f15eSzhijian lin}
23315abe6c31SLei Huang
23326127f15eSzhijian linlet Predicates = [PrefixInstrs] in {
23335abe6c31SLei Huang  // Anonymous patterns to select prefixed loads and stores.
23345abe6c31SLei Huang  // Load i32
23355abe6c31SLei Huang  def : Pat<(i32 (extloadi1 PDForm:$src)), (PLBZ memri34:$src)>;
23365abe6c31SLei Huang  def : Pat<(i32 (zextloadi1 PDForm:$src)), (PLBZ memri34:$src)>;
23375abe6c31SLei Huang  def : Pat<(i32 (extloadi8 PDForm:$src)), (PLBZ memri34:$src)>;
23385abe6c31SLei Huang  def : Pat<(i32 (zextloadi8 PDForm:$src)), (PLBZ memri34:$src)>;
23395abe6c31SLei Huang  def : Pat<(i32 (extloadi16 PDForm:$src)), (PLHZ memri34:$src)>;
23405abe6c31SLei Huang  def : Pat<(i32 (zextloadi16 PDForm:$src)), (PLHZ memri34:$src)>;
23415abe6c31SLei Huang  def : Pat<(i32 (sextloadi16 PDForm:$src)), (PLHA memri34:$src)>;
23425abe6c31SLei Huang  def : Pat<(i32 (load PDForm:$src)), (PLWZ memri34:$src)>;
23435abe6c31SLei Huang
23445abe6c31SLei Huang  // Store i32
23455abe6c31SLei Huang  def : Pat<(truncstorei8 i32:$rS, PDForm:$dst), (PSTB gprc:$rS, memri34:$dst)>;
23465abe6c31SLei Huang  def : Pat<(truncstorei16 i32:$rS, PDForm:$dst), (PSTH gprc:$rS, memri34:$dst)>;
23475abe6c31SLei Huang  def : Pat<(store i32:$rS, PDForm:$dst), (PSTW gprc:$rS, memri34:$dst)>;
23485abe6c31SLei Huang
23495abe6c31SLei Huang  // Load i64
23505abe6c31SLei Huang  def : Pat<(i64 (extloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>;
23515abe6c31SLei Huang  def : Pat<(i64 (zextloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>;
23525abe6c31SLei Huang  def : Pat<(i64 (extloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>;
23535abe6c31SLei Huang  def : Pat<(i64 (zextloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>;
23545abe6c31SLei Huang  def : Pat<(i64 (extloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>;
23555abe6c31SLei Huang  def : Pat<(i64 (zextloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>;
23565abe6c31SLei Huang  def : Pat<(i64 (sextloadi16 PDForm:$src)), (PLHA8 memri34:$src)>;
23575abe6c31SLei Huang  def : Pat<(i64 (extloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>;
23585abe6c31SLei Huang  def : Pat<(i64 (zextloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>;
23595abe6c31SLei Huang  def : Pat<(i64 (sextloadi32 PDForm:$src)), (PLWA8 memri34:$src)>;
23605abe6c31SLei Huang  def : Pat<(i64 (load PDForm:$src)), (PLD memri34:$src)>;
23615abe6c31SLei Huang
23625abe6c31SLei Huang  // Store i64
23635abe6c31SLei Huang  def : Pat<(truncstorei8 i64:$rS, PDForm:$dst), (PSTB8 g8rc:$rS, memri34:$dst)>;
23645abe6c31SLei Huang  def : Pat<(truncstorei16 i64:$rS, PDForm:$dst), (PSTH8 g8rc:$rS, memri34:$dst)>;
23655abe6c31SLei Huang  def : Pat<(truncstorei32 i64:$rS, PDForm:$dst), (PSTW8 g8rc:$rS, memri34:$dst)>;
23665abe6c31SLei Huang  def : Pat<(store i64:$rS, PDForm:$dst), (PSTD g8rc:$rS, memri34:$dst)>;
2367b41dbe60Szhijian lin
2368b41dbe60Szhijian lin  // Atomic Load
2369b41dbe60Szhijian lin  def : Pat<(i32 (atomic_load_8 PDForm:$src)), (PLBZ memri34:$src)>;
2370b41dbe60Szhijian lin  def : Pat<(i32 (atomic_load_16 PDForm:$src)), (PLHZ memri34:$src)>;
2371b41dbe60Szhijian lin  def : Pat<(i32 (atomic_load_32 PDForm:$src)), (PLWZ memri34:$src)>;
2372b41dbe60Szhijian lin  def : Pat<(i64 (atomic_load_64 PDForm:$src)), (PLD memri34:$src)>;
2373b41dbe60Szhijian lin
2374b41dbe60Szhijian lin  // Atomic Store
2375b41dbe60Szhijian lin  def : Pat<(atomic_store_8 i32:$RS, PDForm:$dst), (PSTB $RS, memri34:$dst)>;
2376b41dbe60Szhijian lin  def : Pat<(atomic_store_16 i32:$RS, PDForm:$dst), (PSTH $RS, memri34:$dst)>;
2377b41dbe60Szhijian lin  def : Pat<(atomic_store_32 i32:$RS, PDForm:$dst), (PSTW $RS, memri34:$dst)>;
2378b41dbe60Szhijian lin  def : Pat<(atomic_store_64 i64:$RS, PDForm:$dst), (PSTD $RS, memri34:$dst)>;
23796127f15eSzhijian lin}
23805abe6c31SLei Huang
23816127f15eSzhijian linlet Predicates = [PrefixInstrs, HasFPU] in {
23825abe6c31SLei Huang  // Load / Store f32
23835abe6c31SLei Huang  def : Pat<(f32 (load PDForm:$src)), (PLFS memri34:$src)>;
23845abe6c31SLei Huang  def : Pat<(store f32:$FRS, PDForm:$dst), (PSTFS $FRS, memri34:$dst)>;
23855abe6c31SLei Huang
23865abe6c31SLei Huang  // Load / Store f64
23875abe6c31SLei Huang  def : Pat<(f64 (extloadf32 PDForm:$src)),
23885abe6c31SLei Huang            (COPY_TO_REGCLASS (PLFS memri34:$src), VSFRC)>;
23895abe6c31SLei Huang  def : Pat<(f64 (load PDForm:$src)), (PLFD memri34:$src)>;
23905abe6c31SLei Huang  def : Pat<(store f64:$FRS, PDForm:$dst), (PSTFD $FRS, memri34:$dst)>;
23916127f15eSzhijian lin  // Prefixed fpext to v2f64
23926127f15eSzhijian lin  def : Pat<(v4f32 (PPCldvsxlh PDForm:$src)),
23936127f15eSzhijian lin            (SUBREG_TO_REG (i64 1), (PLFD PDForm:$src), sub_64)>;
23945abe6c31SLei Huang
23956127f15eSzhijian lin}
23966127f15eSzhijian lin
23975abe6c31SLei Huangdef InsertEltShift {
23985abe6c31SLei Huang  dag Sub32 = (i32 (EXTRACT_SUBREG $rB, sub_32));
23995abe6c31SLei Huang  dag Sub32Left1 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 1, 0, 30);
24005abe6c31SLei Huang  dag Sub32Left2 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 2, 0, 29);
24015abe6c31SLei Huang  dag Left1 = (RLWINM $rB, 1, 0, 30);
24025abe6c31SLei Huang  dag Left2 = (RLWINM $rB, 2, 0, 29);
24035abe6c31SLei Huang  dag Left3 = (RLWINM8 $rB, 3, 0, 28);
24045abe6c31SLei Huang}
24055abe6c31SLei Huang
24065abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX, IsLittleEndian] in {
24075abe6c31SLei Huang  // Indexed vector insert element
24085abe6c31SLei Huang  def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)),
24095abe6c31SLei Huang            (VINSBRX $vDi, InsertEltShift.Sub32, $rA)>;
24105abe6c31SLei Huang  def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)),
24115abe6c31SLei Huang            (VINSHRX $vDi, InsertEltShift.Sub32Left1, $rA)>;
24125abe6c31SLei Huang  def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)),
24135abe6c31SLei Huang            (VINSWRX $vDi, InsertEltShift.Sub32Left2, $rA)>;
24145abe6c31SLei Huang  def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)),
24155abe6c31SLei Huang            (VINSDRX $vDi, InsertEltShift.Left3, $rA)>;
24165abe6c31SLei Huang
24175abe6c31SLei Huang  def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)),
24185abe6c31SLei Huang            (VINSWVRX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>;
24195abe6c31SLei Huang
24205abe6c31SLei Huang  def : Pat<(v2f64 (insertelt v2f64:$vDi,  f64:$A, i64:$rB)),
24215abe6c31SLei Huang            (VINSDRX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>;
24225abe6c31SLei Huang  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)),
24235abe6c31SLei Huang            (VINSDRX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>;
24245abe6c31SLei Huang  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)),
24255abe6c31SLei Huang            (VINSDRX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>;
24265abe6c31SLei Huang  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)),
24275abe6c31SLei Huang            (VINSDRX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>;
24285abe6c31SLei Huang  let AddedComplexity = 400 in {
24295abe6c31SLei Huang    // Immediate vector insert element
24305abe6c31SLei Huang    foreach Idx = [0, 1, 2, 3] in {
24315abe6c31SLei Huang      def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, Idx)),
24325abe6c31SLei Huang                (VINSW $vDi, !mul(!sub(3, Idx), 4), $rA)>;
24335abe6c31SLei Huang    }
24345abe6c31SLei Huang    foreach i = [0, 1] in
24355abe6c31SLei Huang     def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, (i64 i))),
24365abe6c31SLei Huang               (VINSD $vDi, !mul(!sub(1, i), 8), $rA)>;
24375abe6c31SLei Huang  }
24385abe6c31SLei Huang}
24395abe6c31SLei Huang
24405abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC32] in {
24415abe6c31SLei Huang  // Indexed vector insert element
24425abe6c31SLei Huang  def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i32:$rB)),
24435abe6c31SLei Huang            (VINSBLX $vDi, $rB, $rA)>;
24445abe6c31SLei Huang  def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i32:$rB)),
24455abe6c31SLei Huang            (VINSHLX $vDi, InsertEltShift.Left1, $rA)>;
24465abe6c31SLei Huang  def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i32:$rB)),
24475abe6c31SLei Huang            (VINSWLX $vDi, InsertEltShift.Left2, $rA)>;
24485abe6c31SLei Huang
24495abe6c31SLei Huang  def : Pat<(v4f32 (insertelt v4f32:$vDi,  f32:$rA, i32:$rB)),
24505abe6c31SLei Huang            (VINSWVLX $vDi, InsertEltShift.Left2, (XSCVDPSPN $rA))>;
24515abe6c31SLei Huang}
24525abe6c31SLei Huang
24535abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC64] in {
24545abe6c31SLei Huang  // Indexed vector insert element
24555abe6c31SLei Huang  def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)),
24565abe6c31SLei Huang            (VINSBLX $vDi, InsertEltShift.Sub32, $rA)>;
24575abe6c31SLei Huang  def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)),
24585abe6c31SLei Huang            (VINSHLX $vDi, InsertEltShift.Sub32Left1, $rA)>;
24595abe6c31SLei Huang  def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)),
24605abe6c31SLei Huang            (VINSWLX $vDi, InsertEltShift.Sub32Left2, $rA)>;
24615abe6c31SLei Huang  def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)),
24625abe6c31SLei Huang            (VINSDLX $vDi, InsertEltShift.Left3, $rA)>;
24635abe6c31SLei Huang
24645abe6c31SLei Huang  def : Pat<(v4f32 (insertelt v4f32:$vDi,  f32:$rA, i64:$rB)),
24655abe6c31SLei Huang            (VINSWVLX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>;
24665abe6c31SLei Huang
24675abe6c31SLei Huang  def : Pat<(v2f64 (insertelt v2f64:$vDi,  f64:$A, i64:$rB)),
24685abe6c31SLei Huang            (VINSDLX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>;
24695abe6c31SLei Huang  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)),
24705abe6c31SLei Huang            (VINSDLX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>;
24715abe6c31SLei Huang  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)),
24725abe6c31SLei Huang            (VINSDLX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>;
24735abe6c31SLei Huang  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)),
24745abe6c31SLei Huang            (VINSDLX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>;
24755abe6c31SLei Huang}
24765abe6c31SLei Huang
24775abe6c31SLei Huanglet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX, IsBigEndian] in {
24785abe6c31SLei Huang  // Immediate vector insert element
24795abe6c31SLei Huang  foreach Ty = [i32, i64] in {
24805abe6c31SLei Huang    foreach Idx = [0, 1, 2, 3] in {
24815abe6c31SLei Huang      def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, (Ty Idx))),
24825abe6c31SLei Huang               (VINSW $vDi, !mul(Idx, 4), $rA)>;
24835abe6c31SLei Huang    }
24845abe6c31SLei Huang  }
24855abe6c31SLei Huang
24865abe6c31SLei Huang  foreach Idx = [0, 1] in
24875abe6c31SLei Huang    def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, Idx)),
24885abe6c31SLei Huang              (VINSD $vDi, !mul(Idx, 8), $rA)>;
24895abe6c31SLei Huang}
2490ea8b95d0SStefan Pintilie
2491ea8b95d0SStefan Pintilie
2492ea8b95d0SStefan Pintilie//===----------------------------------------------------------------------===//
2493ea8b95d0SStefan Pintilie// PowerPC ISA 3.1 Extended Mnemonics.
2494ea8b95d0SStefan Pintilie//
2495ea8b95d0SStefan Pintilie
2496ea8b95d0SStefan Pintilielet Predicates = [IsISA3_1] in {
2497ea8b95d0SStefan Pintilie  def : InstAlias<"wait", (WAITP10 0, 0)>;
2498ea8b95d0SStefan Pintilie  def : InstAlias<"wait 0", (WAITP10 0, 0), 0>;
2499ea8b95d0SStefan Pintilie  def : InstAlias<"wait 1", (WAITP10 1, 0), 0>;
2500ea8b95d0SStefan Pintilie  def : InstAlias<"waitrsv", (WAITP10 1, 0)>;
2501ea8b95d0SStefan Pintilie  def : InstAlias<"pause_short", (WAITP10 2, 0), 0>;
2502ea8b95d0SStefan Pintilie
2503ea8b95d0SStefan Pintilie  def : InstAlias<"sync", (SYNCP10 0, 0)>;
2504ea8b95d0SStefan Pintilie  def : InstAlias<"hwsync", (SYNCP10 0, 0), 0>;
2505ea8b95d0SStefan Pintilie  def : InstAlias<"wsync", (SYNCP10 1, 0), 0>;
2506ea8b95d0SStefan Pintilie  def : InstAlias<"ptesync", (SYNCP10 2, 0)>;
2507ea8b95d0SStefan Pintilie  def : InstAlias<"phwsync", (SYNCP10 4, 0)>;
2508ea8b95d0SStefan Pintilie  def : InstAlias<"plwsync", (SYNCP10 5, 0)>;
2509ea8b95d0SStefan Pintilie  def : InstAlias<"sync $L", (SYNCP10 u3imm:$L, 0)>;
2510ea8b95d0SStefan Pintilie  def : InstAlias<"stncisync", (SYNCP10 1, 1)>;
2511ea8b95d0SStefan Pintilie  def : InstAlias<"stcisync", (SYNCP10 0, 2)>;
2512ea8b95d0SStefan Pintilie  def : InstAlias<"stsync", (SYNCP10 0, 3)>;
2513ea8b95d0SStefan Pintilie
2514ea8b95d0SStefan Pintilie  def : InstAlias<"paddi $RT, $RA, $SI", (PADDI8 g8rc:$RT, g8rc_nox0:$RA, s34imm:$SI)>;
2515ea8b95d0SStefan Pintilie}
2516ea8b95d0SStefan Pintilie
2517ea8b95d0SStefan Pintilielet Predicates = [IsISA3_1, PrefixInstrs], isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
2518ea8b95d0SStefan Pintilie  let Interpretation64Bit = 1 in {
2519ea8b95d0SStefan Pintilie    def PLA8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT),
2520ea8b95d0SStefan Pintilie                                  (ins g8rc_nox0:$RA, s34imm:$SI),
252148cc4351SJake Egan                                  "pla $RT, ${SI} ${RA}", IIC_IntSimple, []>, MemriOp;
2522ea8b95d0SStefan Pintilie    def PLA8pc : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT),
2523ea8b95d0SStefan Pintilie                                    (ins s34imm_pcrel:$SI),
2524ea8b95d0SStefan Pintilie                                    "pla $RT, $SI", IIC_IntSimple, []>, isPCRel;
2525ea8b95d0SStefan Pintilie  }
2526ea8b95d0SStefan Pintilie
2527ea8b95d0SStefan Pintilie  def PSUBI : PPCAsmPseudo<"psubi $RT, $RA, $SI",
2528ea8b95d0SStefan Pintilie                           (ins g8rc:$RT, g8rc_nox0:$RA, s34imm:$SI)>;
2529ea8b95d0SStefan Pintilie
2530ea8b95d0SStefan Pintilie  def PLA : MLS_DForm_SI34_RT5<14, (outs gprc:$RT),
2531ea8b95d0SStefan Pintilie                               (ins gprc_nor0:$RA, s34imm:$SI),
253248cc4351SJake Egan                               "pla $RT, ${SI} ${RA}", IIC_IntSimple, []>, MemriOp;
2533ea8b95d0SStefan Pintilie  def PLApc : MLS_DForm_SI34_RT5<14, (outs gprc:$RT),
2534ea8b95d0SStefan Pintilie                                 (ins s34imm_pcrel:$SI),
2535ea8b95d0SStefan Pintilie                                 "pla $RT, $SI", IIC_IntSimple, []>, isPCRel;
2536ea8b95d0SStefan Pintilie}
2537