xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCInstrP10.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
181ad6265SDimitry Andric//===-- PPCInstrP10.td - Power10 Instruction Set -----------*- tablegen -*-===//
281ad6265SDimitry Andric//
381ad6265SDimitry Andric//                     The LLVM Compiler Infrastructure
481ad6265SDimitry Andric//
581ad6265SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
681ad6265SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
781ad6265SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
881ad6265SDimitry Andric//
981ad6265SDimitry Andric//===----------------------------------------------------------------------===//
1081ad6265SDimitry Andric//
1181ad6265SDimitry Andric// This file describes the instructions introduced for the Power10 CPU.
1281ad6265SDimitry Andric//
1381ad6265SDimitry Andric//===----------------------------------------------------------------------===//
1481ad6265SDimitry Andric
1581ad6265SDimitry Andric//===----------------------------------------------------------------------===//
1681ad6265SDimitry Andric// Naming convention for future instruction formats
1781ad6265SDimitry Andric//
1881ad6265SDimitry Andric// <INSTR_FORM>{_<OP_TYPE><OP_LENGTH>}+
1981ad6265SDimitry Andric//
2081ad6265SDimitry Andric// Where:
2181ad6265SDimitry Andric// <INSTR_FORM> - name of instruction format as per the ISA
2281ad6265SDimitry Andric//                (X-Form, VX-Form, etc.)
2381ad6265SDimitry Andric// <OP_TYPE> - operand type
2481ad6265SDimitry Andric//             * FRT/RT/VT/XT/BT - target register
2581ad6265SDimitry Andric//                                 (FPR, GPR, VR, VSR, CR-bit respectively)
2681ad6265SDimitry Andric//                                 In some situations, the 'T' is replaced by
2781ad6265SDimitry Andric//                                 'D' when describing the target register.
2881ad6265SDimitry Andric//             * [FR|R|V|X|B][A-Z] - register source (i.e. FRA, RA, XB, etc.)
2981ad6265SDimitry Andric//             * IMM - immediate (where signedness matters,
3081ad6265SDimitry Andric//                     this is SI/UI for signed/unsigned)
3181ad6265SDimitry Andric//             * [R|X|FR]Tp - register pair target (i.e. FRTp, RTp)
3281ad6265SDimitry Andric//             * R - PC-Relative bit
3381ad6265SDimitry Andric//                   (denotes that the address is computed pc-relative)
3481ad6265SDimitry Andric//             * VRM - Masked Registers
3581ad6265SDimitry Andric//             * AT - target accumulator
3681ad6265SDimitry Andric//             * N - the Nth bit in a VSR
3781ad6265SDimitry Andric//             * Additional 1-bit operands may be required for certain
3881ad6265SDimitry Andric//               instruction formats such as: MC, P, MP
3981ad6265SDimitry Andric//             * X / Y / P - mask values. In the instruction encoding, this is
4081ad6265SDimitry Andric//                           represented as XMSK, YMSK and PMSK.
4181ad6265SDimitry Andric//             * MEM - indicates if the instruction format requires any memory
4281ad6265SDimitry Andric//                     accesses. This does not have <OP_LENGTH> attached to it.
4381ad6265SDimitry Andric// <OP_LENGTH> - the length of each operand in bits.
4481ad6265SDimitry Andric//               For operands that are 1 bit, the '1' is omitted from the name.
4581ad6265SDimitry Andric//
4681ad6265SDimitry Andric// Example: 8RR_XX4Form_IMM8_XTAB6
4781ad6265SDimitry Andric//          8RR_XX4Form is the instruction format.
4881ad6265SDimitry Andric//          The operand is an 8-bit immediate (IMM), the destination (XT)
4981ad6265SDimitry Andric//          and sources (XA, XB) that are all 6-bits. The destination and
5081ad6265SDimitry Andric//          source registers are combined if they are of the same length.
5181ad6265SDimitry Andric//          Moreover, the order of operands reflects the order of operands
5281ad6265SDimitry Andric//          in the encoding.
5381ad6265SDimitry Andric
5481ad6265SDimitry Andric//-------------------------- Predicate definitions ---------------------------//
5581ad6265SDimitry Andricdef IsPPC32 : Predicate<"!Subtarget->isPPC64()">;
5681ad6265SDimitry Andric
5781ad6265SDimitry Andric
5881ad6265SDimitry Andric//===----------------------------------------------------------------------===//
5981ad6265SDimitry Andric// PowerPC ISA 3.1 specific type constraints.
6081ad6265SDimitry Andric//
6181ad6265SDimitry Andric
6281ad6265SDimitry Andricdef SDT_PPCSplat32 : SDTypeProfile<1, 3, [ SDTCisVT<0, v2i64>,
6381ad6265SDimitry Andric  SDTCisVec<1>, SDTCisInt<2>, SDTCisInt<3>
6481ad6265SDimitry Andric]>;
6581ad6265SDimitry Andricdef SDT_PPCAccBuild : SDTypeProfile<1, 4, [
6681ad6265SDimitry Andric  SDTCisVT<0, v512i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32>,
6781ad6265SDimitry Andric                       SDTCisVT<3, v4i32>, SDTCisVT<4, v4i32>
6881ad6265SDimitry Andric]>;
6981ad6265SDimitry Andricdef SDT_PPCPairBuild : SDTypeProfile<1, 2, [
7081ad6265SDimitry Andric  SDTCisVT<0, v256i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32>
7181ad6265SDimitry Andric]>;
7281ad6265SDimitry Andricdef SDT_PPCAccExtractVsx : SDTypeProfile<1, 2, [
7381ad6265SDimitry Andric  SDTCisVT<0, v4i32>, SDTCisVT<1, v512i1>, SDTCisPtrTy<2>
7481ad6265SDimitry Andric]>;
7581ad6265SDimitry Andricdef SDT_PPCPairExtractVsx : SDTypeProfile<1, 2, [
7681ad6265SDimitry Andric  SDTCisVT<0, v4i32>, SDTCisVT<1, v256i1>, SDTCisPtrTy<2>
7781ad6265SDimitry Andric]>;
7881ad6265SDimitry Andricdef SDT_PPCxxmfacc : SDTypeProfile<1, 1, [
7981ad6265SDimitry Andric  SDTCisVT<0, v512i1>, SDTCisVT<1, v512i1>
8081ad6265SDimitry Andric]>;
8181ad6265SDimitry Andric
8281ad6265SDimitry Andric//===----------------------------------------------------------------------===//
8381ad6265SDimitry Andric// ISA 3.1 specific PPCISD nodes.
8481ad6265SDimitry Andric//
8581ad6265SDimitry Andric
8681ad6265SDimitry Andricdef PPCxxsplti32dx : SDNode<"PPCISD::XXSPLTI32DX", SDT_PPCSplat32, []>;
8781ad6265SDimitry Andricdef PPCAccBuild : SDNode<"PPCISD::ACC_BUILD", SDT_PPCAccBuild, []>;
8881ad6265SDimitry Andricdef PPCPairBuild : SDNode<"PPCISD::PAIR_BUILD", SDT_PPCPairBuild, []>;
8981ad6265SDimitry Andricdef PPCAccExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCAccExtractVsx,
9081ad6265SDimitry Andric                       []>;
9181ad6265SDimitry Andricdef PPCPairExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCPairExtractVsx,
9281ad6265SDimitry Andric                        []>;
9381ad6265SDimitry Andricdef PPCxxmfacc : SDNode<"PPCISD::XXMFACC", SDT_PPCxxmfacc, []>;
9481ad6265SDimitry Andric
9581ad6265SDimitry Andric//===----------------------------------------------------------------------===//
9681ad6265SDimitry Andric
9781ad6265SDimitry Andric// PC Relative flag (for instructions that use the address of the prefix for
9881ad6265SDimitry Andric// address computations).
9981ad6265SDimitry Andricclass isPCRel { bit PCRel = 1; }
10081ad6265SDimitry Andric
10181ad6265SDimitry Andric// PowerPC specific type constraints.
10281ad6265SDimitry Andricdef SDT_PPCLXVRZX : SDTypeProfile<1, 2, [
10381ad6265SDimitry Andric  SDTCisVT<0, v1i128>, SDTCisPtrTy<1>, SDTCisPtrTy<2>
10481ad6265SDimitry Andric]>;
10581ad6265SDimitry Andric
10681ad6265SDimitry Andric// PPC Specific DAG Nodes.
10781ad6265SDimitry Andricdef PPClxvrzx : SDNode<"PPCISD::LXVRZX", SDT_PPCLXVRZX,
10881ad6265SDimitry Andric                       [SDNPHasChain, SDNPMayLoad]>;
10981ad6265SDimitry Andric
11081ad6265SDimitry Andric// Top-level class for prefixed instructions.
11181ad6265SDimitry Andricclass PI<bits<6> pref, bits<6> opcode, dag OOL, dag IOL, string asmstr,
11281ad6265SDimitry Andric         InstrItinClass itin> : Instruction {
11381ad6265SDimitry Andric  field bits<64> Inst;
11481ad6265SDimitry Andric  field bits<64> SoftFail = 0;
11581ad6265SDimitry Andric  bit PCRel = 0; // Default value, set by isPCRel.
11681ad6265SDimitry Andric  let Size = 8;
11781ad6265SDimitry Andric
11881ad6265SDimitry Andric  let Namespace = "PPC";
11981ad6265SDimitry Andric  let OutOperandList = OOL;
12081ad6265SDimitry Andric  let InOperandList = IOL;
12181ad6265SDimitry Andric  let AsmString = asmstr;
12281ad6265SDimitry Andric  let Itinerary = itin;
12381ad6265SDimitry Andric  let Inst{0-5} = pref;
12481ad6265SDimitry Andric  let Inst{32-37} = opcode;
12581ad6265SDimitry Andric
12681ad6265SDimitry Andric  bits<1> PPC970_First = 0;
12781ad6265SDimitry Andric  bits<1> PPC970_Single = 0;
12881ad6265SDimitry Andric  bits<1> PPC970_Cracked = 0;
12981ad6265SDimitry Andric  bits<3> PPC970_Unit = 0;
13081ad6265SDimitry Andric
13181ad6265SDimitry Andric  /// These fields correspond to the fields in PPCInstrInfo.h.  Any changes to
13281ad6265SDimitry Andric  /// these must be reflected there!  See comments there for what these are.
13381ad6265SDimitry Andric  let TSFlags{0}   = PPC970_First;
13481ad6265SDimitry Andric  let TSFlags{1}   = PPC970_Single;
13581ad6265SDimitry Andric  let TSFlags{2}   = PPC970_Cracked;
13681ad6265SDimitry Andric  let TSFlags{5-3} = PPC970_Unit;
13781ad6265SDimitry Andric
13881ad6265SDimitry Andric  bits<1> Prefixed = 1;  // This is a prefixed instruction.
13981ad6265SDimitry Andric  let TSFlags{7}  = Prefixed;
14081ad6265SDimitry Andric
14181ad6265SDimitry Andric  // For cases where multiple instruction definitions really represent the
14281ad6265SDimitry Andric  // same underlying instruction but with one definition for 64-bit arguments
14381ad6265SDimitry Andric  // and one for 32-bit arguments, this bit breaks the degeneracy between
14481ad6265SDimitry Andric  // the two forms and allows TableGen to generate mapping tables.
14581ad6265SDimitry Andric  bit Interpretation64Bit = 0;
14681ad6265SDimitry Andric
14781ad6265SDimitry Andric  // Fields used for relation models.
14881ad6265SDimitry Andric  string BaseName = "";
14981ad6265SDimitry Andric}
15081ad6265SDimitry Andric
15181ad6265SDimitry Andric// VX-Form: [ PO VT R VB RC XO ]
15281ad6265SDimitry Andricclass VXForm_VTB5_RC<bits<10> xo, bits<5> R, dag OOL, dag IOL, string asmstr,
15381ad6265SDimitry Andric                      InstrItinClass itin, list<dag> pattern>
15481ad6265SDimitry Andric  : I<4, OOL, IOL, asmstr, itin> {
15581ad6265SDimitry Andric  bits<5> VT;
15681ad6265SDimitry Andric  bits<5> VB;
15781ad6265SDimitry Andric  bit RC = 0;
15881ad6265SDimitry Andric
15981ad6265SDimitry Andric  let Pattern = pattern;
16081ad6265SDimitry Andric
16181ad6265SDimitry Andric  let Inst{6-10} = VT;
16281ad6265SDimitry Andric  let Inst{11-15} = R;
16381ad6265SDimitry Andric  let Inst{16-20} = VB;
16481ad6265SDimitry Andric  let Inst{21} = RC;
16581ad6265SDimitry Andric  let Inst{22-31} = xo;
16681ad6265SDimitry Andric}
16781ad6265SDimitry Andric
16881ad6265SDimitry Andric// Multiclass definition to account for record and non-record form
16981ad6265SDimitry Andric// instructions of VXRForm.
17081ad6265SDimitry Andricmulticlass VXForm_VTB5_RCr<bits<10> xo, bits<5> R, dag OOL, dag IOL,
17181ad6265SDimitry Andric                            string asmbase, string asmstr,
17281ad6265SDimitry Andric                            InstrItinClass itin, list<dag> pattern> {
17381ad6265SDimitry Andric  let BaseName = asmbase in {
17481ad6265SDimitry Andric    def NAME : VXForm_VTB5_RC<xo, R, OOL, IOL,
17581ad6265SDimitry Andric                               !strconcat(asmbase, !strconcat(" ", asmstr)),
17681ad6265SDimitry Andric                               itin, pattern>, RecFormRel;
17781ad6265SDimitry Andric    let Defs = [CR6] in
17881ad6265SDimitry Andric    def _rec : VXForm_VTB5_RC<xo, R, OOL, IOL,
17981ad6265SDimitry Andric                               !strconcat(asmbase, !strconcat(". ", asmstr)),
18081ad6265SDimitry Andric                               itin, []>, isRecordForm, RecFormRel;
18181ad6265SDimitry Andric  }
18281ad6265SDimitry Andric}
18381ad6265SDimitry Andric
18481ad6265SDimitry Andricclass MLS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr,
18581ad6265SDimitry Andric                                InstrItinClass itin, list<dag> pattern>
18681ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
18706c3fb27SDimitry Andric  bits<5> RST;
18806c3fb27SDimitry Andric  bits<5> RA;
18906c3fb27SDimitry Andric  bits<34> D;
19081ad6265SDimitry Andric
19181ad6265SDimitry Andric  let Pattern = pattern;
19281ad6265SDimitry Andric
19381ad6265SDimitry Andric  // The prefix.
19481ad6265SDimitry Andric  let Inst{6-7} = 2;
19581ad6265SDimitry Andric  let Inst{8-10} = 0;
19681ad6265SDimitry Andric  let Inst{11} = PCRel;
19781ad6265SDimitry Andric  let Inst{12-13} = 0;
19806c3fb27SDimitry Andric  let Inst{14-31} = D{33-16}; // d0
19981ad6265SDimitry Andric
20081ad6265SDimitry Andric  // The instruction.
20106c3fb27SDimitry Andric  let Inst{38-42} = RST{4-0};
20206c3fb27SDimitry Andric  let Inst{43-47} = RA;
20306c3fb27SDimitry Andric  let Inst{48-63} = D{15-0}; // d1
20481ad6265SDimitry Andric}
20581ad6265SDimitry Andric
20681ad6265SDimitry Andricclass MLS_DForm_R_SI34_RTA5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
20781ad6265SDimitry Andric                            InstrItinClass itin, list<dag> pattern>
20881ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
20981ad6265SDimitry Andric  bits<5> RT;
21081ad6265SDimitry Andric  bits<5> RA;
21181ad6265SDimitry Andric  bits<34> SI;
21281ad6265SDimitry Andric
21381ad6265SDimitry Andric  let Pattern = pattern;
21481ad6265SDimitry Andric
21581ad6265SDimitry Andric  // The prefix.
21681ad6265SDimitry Andric  let Inst{6-7} = 2;
21781ad6265SDimitry Andric  let Inst{8-10} = 0;
21881ad6265SDimitry Andric  let Inst{11} = PCRel;
21981ad6265SDimitry Andric  let Inst{12-13} = 0;
22081ad6265SDimitry Andric  let Inst{14-31} = SI{33-16};
22181ad6265SDimitry Andric
22281ad6265SDimitry Andric  // The instruction.
22381ad6265SDimitry Andric  let Inst{38-42} = RT;
22481ad6265SDimitry Andric  let Inst{43-47} = RA;
22581ad6265SDimitry Andric  let Inst{48-63} = SI{15-0};
22681ad6265SDimitry Andric}
22781ad6265SDimitry Andric
22881ad6265SDimitry Andricclass MLS_DForm_SI34_RT5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
22981ad6265SDimitry Andric                         InstrItinClass itin, list<dag> pattern>
23081ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
23181ad6265SDimitry Andric  bits<5> RT;
23281ad6265SDimitry Andric  bits<34> SI;
23381ad6265SDimitry Andric
23481ad6265SDimitry Andric  let Pattern = pattern;
23581ad6265SDimitry Andric
23681ad6265SDimitry Andric  // The prefix.
23781ad6265SDimitry Andric  let Inst{6-7} = 2;
23881ad6265SDimitry Andric  let Inst{8-10} = 0;
23981ad6265SDimitry Andric  let Inst{11} = 0;
24081ad6265SDimitry Andric  let Inst{12-13} = 0;
24181ad6265SDimitry Andric  let Inst{14-31} = SI{33-16};
24281ad6265SDimitry Andric
24381ad6265SDimitry Andric  // The instruction.
24481ad6265SDimitry Andric  let Inst{38-42} = RT;
24581ad6265SDimitry Andric  let Inst{43-47} = 0;
24681ad6265SDimitry Andric  let Inst{48-63} = SI{15-0};
24781ad6265SDimitry Andric}
24881ad6265SDimitry Andric
24981ad6265SDimitry Andricmulticlass MLS_DForm_R_SI34_RTA5_p<bits<6> opcode, dag OOL, dag IOL,
25081ad6265SDimitry Andric                                   dag PCRel_IOL, string asmstr,
25181ad6265SDimitry Andric                                   InstrItinClass itin> {
25281ad6265SDimitry Andric  def NAME : MLS_DForm_R_SI34_RTA5<opcode, OOL, IOL,
25381ad6265SDimitry Andric                                   !strconcat(asmstr, ", 0"), itin, []>;
25481ad6265SDimitry Andric  def pc : MLS_DForm_R_SI34_RTA5<opcode, OOL, PCRel_IOL,
25581ad6265SDimitry Andric                                 !strconcat(asmstr, ", 1"), itin, []>, isPCRel;
25681ad6265SDimitry Andric}
25781ad6265SDimitry Andric
25881ad6265SDimitry Andricclass 8LS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr,
25981ad6265SDimitry Andric                                InstrItinClass itin, list<dag> pattern>
26081ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
26106c3fb27SDimitry Andric  bits<5> RST;
26206c3fb27SDimitry Andric  bits<5> RA;
26306c3fb27SDimitry Andric  bits<34> D;
26481ad6265SDimitry Andric
26581ad6265SDimitry Andric  let Pattern = pattern;
26681ad6265SDimitry Andric
26781ad6265SDimitry Andric  // The prefix.
26881ad6265SDimitry Andric  let Inst{6-10} = 0;
26981ad6265SDimitry Andric  let Inst{11} = PCRel;
27081ad6265SDimitry Andric  let Inst{12-13} = 0;
27106c3fb27SDimitry Andric  let Inst{14-31} = D{33-16}; // d0
27281ad6265SDimitry Andric
27381ad6265SDimitry Andric  // The instruction.
27406c3fb27SDimitry Andric  let Inst{38-42} = RST{4-0};
27506c3fb27SDimitry Andric  let Inst{43-47} = RA;
27606c3fb27SDimitry Andric  let Inst{48-63} = D{15-0}; // d1
27781ad6265SDimitry Andric}
27881ad6265SDimitry Andric
27981ad6265SDimitry Andric// 8LS:D-Form: [ 1 0 0 // R // d0
28081ad6265SDimitry Andric//               PO TX T RA d1 ]
28181ad6265SDimitry Andricclass 8LS_DForm_R_SI34_XT6_RA5_MEM<bits<5> opcode, dag OOL, dag IOL,
28281ad6265SDimitry Andric                                   string asmstr, InstrItinClass itin,
28381ad6265SDimitry Andric                                   list<dag> pattern>
28481ad6265SDimitry Andric  : PI<1, { opcode, ? }, OOL, IOL, asmstr, itin> {
28506c3fb27SDimitry Andric  bits<6> XST;
28606c3fb27SDimitry Andric  bits<5> RA;
28706c3fb27SDimitry Andric  bits<34> D;
28881ad6265SDimitry Andric
28981ad6265SDimitry Andric  let Pattern = pattern;
29081ad6265SDimitry Andric
29181ad6265SDimitry Andric  // The prefix.
29281ad6265SDimitry Andric  let Inst{6-7} = 0;
29381ad6265SDimitry Andric  let Inst{8} = 0;
29481ad6265SDimitry Andric  let Inst{9-10} = 0; // reserved
29581ad6265SDimitry Andric  let Inst{11} = PCRel;
29681ad6265SDimitry Andric  let Inst{12-13} = 0; // reserved
29706c3fb27SDimitry Andric  let Inst{14-31} = D{33-16}; // d0
29881ad6265SDimitry Andric
29981ad6265SDimitry Andric  // The instruction.
30006c3fb27SDimitry Andric  let Inst{37} = XST{5};
30106c3fb27SDimitry Andric  let Inst{38-42} = XST{4-0};
30206c3fb27SDimitry Andric  let Inst{43-47} = RA;
30306c3fb27SDimitry Andric  let Inst{48-63} = D{15-0}; // d1
30481ad6265SDimitry Andric}
30581ad6265SDimitry Andric
30681ad6265SDimitry Andric// X-Form: [PO T IMM VRB XO TX]
30781ad6265SDimitry Andricclass XForm_XT6_IMM5_VB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
30881ad6265SDimitry Andric                         string asmstr, InstrItinClass itin, list<dag> pattern>
30981ad6265SDimitry Andric  : I<opcode, OOL, IOL, asmstr, itin> {
31081ad6265SDimitry Andric  bits<6> XT;
31181ad6265SDimitry Andric  bits<5> VRB;
31281ad6265SDimitry Andric  bits<5> IMM;
31381ad6265SDimitry Andric
31481ad6265SDimitry Andric  let Pattern = pattern;
31581ad6265SDimitry Andric  let Inst{6-10} = XT{4-0};
31681ad6265SDimitry Andric  let Inst{11-15} = IMM;
31781ad6265SDimitry Andric  let Inst{16-20} = VRB;
31881ad6265SDimitry Andric  let Inst{21-30} = xo;
31981ad6265SDimitry Andric  let Inst{31} = XT{5};
32081ad6265SDimitry Andric}
32181ad6265SDimitry Andric
32281ad6265SDimitry Andricclass 8RR_XX4Form_IMM8_XTAB6<bits<6> opcode, bits<2> xo,
32381ad6265SDimitry Andric                             dag OOL, dag IOL, string asmstr,
32481ad6265SDimitry Andric                             InstrItinClass itin, list<dag> pattern>
32581ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
32681ad6265SDimitry Andric    bits<6> XT;
32781ad6265SDimitry Andric    bits<6> XA;
32881ad6265SDimitry Andric    bits<6> XB;
32981ad6265SDimitry Andric    bits<6> XC;
33081ad6265SDimitry Andric    bits<8> IMM;
33181ad6265SDimitry Andric
33281ad6265SDimitry Andric    let Pattern = pattern;
33381ad6265SDimitry Andric
33481ad6265SDimitry Andric    // The prefix.
33581ad6265SDimitry Andric    let Inst{6-7} = 1;
33681ad6265SDimitry Andric    let Inst{8} = 0;
33781ad6265SDimitry Andric    let Inst{9-11} = 0;
33881ad6265SDimitry Andric    let Inst{12-13} = 0;
33981ad6265SDimitry Andric    let Inst{14-23} = 0;
34081ad6265SDimitry Andric    let Inst{24-31} = IMM;
34181ad6265SDimitry Andric
34281ad6265SDimitry Andric    // The instruction.
34381ad6265SDimitry Andric    let Inst{38-42} = XT{4-0};
34481ad6265SDimitry Andric    let Inst{43-47} = XA{4-0};
34581ad6265SDimitry Andric    let Inst{48-52} = XB{4-0};
34681ad6265SDimitry Andric    let Inst{53-57} = XC{4-0};
34781ad6265SDimitry Andric    let Inst{58-59} = xo;
34881ad6265SDimitry Andric    let Inst{60} = XC{5};
34981ad6265SDimitry Andric    let Inst{61} = XA{5};
35081ad6265SDimitry Andric    let Inst{62} = XB{5};
35181ad6265SDimitry Andric    let Inst{63} = XT{5};
35281ad6265SDimitry Andric}
35381ad6265SDimitry Andric
35481ad6265SDimitry Andricclass VXForm_RD5_N3_VB5<bits<11> xo, dag OOL, dag IOL, string asmstr,
35581ad6265SDimitry Andric                        InstrItinClass itin, list<dag> pattern>
35681ad6265SDimitry Andric  : I<4, OOL, IOL, asmstr, itin> {
35781ad6265SDimitry Andric  bits<5> RD;
35881ad6265SDimitry Andric  bits<5> VB;
35981ad6265SDimitry Andric  bits<3> N;
36081ad6265SDimitry Andric
36181ad6265SDimitry Andric  let Pattern = pattern;
36281ad6265SDimitry Andric
36381ad6265SDimitry Andric  let Inst{6-10}  = RD;
36481ad6265SDimitry Andric  let Inst{11-12} = 0;
36581ad6265SDimitry Andric  let Inst{13-15} = N;
36681ad6265SDimitry Andric  let Inst{16-20} = VB;
36781ad6265SDimitry Andric  let Inst{21-31} = xo;
36881ad6265SDimitry Andric}
36981ad6265SDimitry Andric
37081ad6265SDimitry Andric
37181ad6265SDimitry Andric// VX-Form: [PO VRT RA VRB XO].
37281ad6265SDimitry Andric// Destructive (insert) forms are suffixed with _ins.
37381ad6265SDimitry Andricclass VXForm_VTB5_RA5_ins<bits<11> xo, string opc, list<dag> pattern>
37406c3fb27SDimitry Andric  : VXForm_1<xo, (outs vrrc:$VD), (ins vrrc:$VDi, gprc:$VA, vrrc:$VB),
37506c3fb27SDimitry Andric             !strconcat(opc, " $VD, $VA, $VB"), IIC_VecGeneral, pattern>,
37606c3fb27SDimitry Andric             RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
37781ad6265SDimitry Andric
37881ad6265SDimitry Andric// VX-Form: [PO VRT RA RB XO].
37981ad6265SDimitry Andric// Destructive (insert) forms are suffixed with _ins.
38081ad6265SDimitry Andricclass VXForm_VRT5_RAB5_ins<bits<11> xo, string opc, list<dag> pattern>
38106c3fb27SDimitry Andric  : VXForm_1<xo, (outs vrrc:$VD), (ins vrrc:$VDi, gprc:$VA, gprc:$VB),
38206c3fb27SDimitry Andric             !strconcat(opc, " $VD, $VA, $VB"), IIC_VecGeneral, pattern>,
38306c3fb27SDimitry Andric             RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
38481ad6265SDimitry Andric
38581ad6265SDimitry Andric// VX-Form: [ PO BF // VRA VRB XO ]
38681ad6265SDimitry Andricclass VXForm_BF3_VAB5<bits<11> xo, dag OOL, dag IOL, string asmstr,
38781ad6265SDimitry Andric                      InstrItinClass itin, list<dag> pattern>
38881ad6265SDimitry Andric  : I<4, OOL, IOL, asmstr, itin> {
38981ad6265SDimitry Andric  bits<3> BF;
39081ad6265SDimitry Andric  bits<5> VA;
39181ad6265SDimitry Andric  bits<5> VB;
39281ad6265SDimitry Andric
39381ad6265SDimitry Andric  let Pattern = pattern;
39481ad6265SDimitry Andric
39581ad6265SDimitry Andric  let Inst{6-8} = BF;
39681ad6265SDimitry Andric  let Inst{9-10} = 0;
39781ad6265SDimitry Andric  let Inst{11-15} = VA;
39881ad6265SDimitry Andric  let Inst{16-20} = VB;
39981ad6265SDimitry Andric  let Inst{21-31} = xo;
40081ad6265SDimitry Andric}
40181ad6265SDimitry Andric
40281ad6265SDimitry Andric// VN-Form: [PO VRT VRA VRB PS SD XO]
40381ad6265SDimitry Andric// SD is "Shift Direction"
40481ad6265SDimitry Andricclass VNForm_VTAB5_SD3<bits<6> xo, bits<2> ps, dag OOL, dag IOL, string asmstr,
40581ad6265SDimitry Andric                       InstrItinClass itin, list<dag> pattern>
40681ad6265SDimitry Andric    : I<4, OOL, IOL, asmstr, itin> {
40781ad6265SDimitry Andric  bits<5> VRT;
40881ad6265SDimitry Andric  bits<5> VRA;
40981ad6265SDimitry Andric  bits<5> VRB;
41081ad6265SDimitry Andric  bits<3> SD;
41181ad6265SDimitry Andric
41281ad6265SDimitry Andric  let Pattern = pattern;
41381ad6265SDimitry Andric
41481ad6265SDimitry Andric  let Inst{6-10}  = VRT;
41581ad6265SDimitry Andric  let Inst{11-15} = VRA;
41681ad6265SDimitry Andric  let Inst{16-20} = VRB;
41781ad6265SDimitry Andric  let Inst{21-22} = ps;
41881ad6265SDimitry Andric  let Inst{23-25} = SD;
41981ad6265SDimitry Andric  let Inst{26-31} = xo;
42081ad6265SDimitry Andric}
42181ad6265SDimitry Andric
42281ad6265SDimitry Andricclass VXForm_RD5_MP_VB5<bits<11> xo, bits<4> eo, dag OOL, dag IOL,
42381ad6265SDimitry Andric                        string asmstr, InstrItinClass itin, list<dag> pattern>
42481ad6265SDimitry Andric  : I<4, OOL, IOL, asmstr, itin> {
42581ad6265SDimitry Andric  bits<5> RD;
42681ad6265SDimitry Andric  bits<5> VB;
42781ad6265SDimitry Andric  bit MP;
42881ad6265SDimitry Andric
42981ad6265SDimitry Andric  let Pattern = pattern;
43081ad6265SDimitry Andric
43181ad6265SDimitry Andric  let Inst{6-10}  = RD;
43281ad6265SDimitry Andric  let Inst{11-14} = eo;
43381ad6265SDimitry Andric  let Inst{15} = MP;
43481ad6265SDimitry Andric  let Inst{16-20} = VB;
43581ad6265SDimitry Andric  let Inst{21-31} = xo;
43681ad6265SDimitry Andric}
43781ad6265SDimitry Andric
43881ad6265SDimitry Andric// 8RR:D-Form: [ 1 1 0 // // imm0
43981ad6265SDimitry Andric//               PO T XO TX imm1 ].
44081ad6265SDimitry Andricclass 8RR_DForm_IMM32_XT6<bits<6> opcode, bits<4> xo, dag OOL, dag IOL,
44181ad6265SDimitry Andric                          string asmstr, InstrItinClass itin,
44281ad6265SDimitry Andric                          list<dag> pattern>
44381ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
44481ad6265SDimitry Andric  bits<6> XT;
44581ad6265SDimitry Andric  bits<32> IMM32;
44681ad6265SDimitry Andric
44781ad6265SDimitry Andric  let Pattern = pattern;
44881ad6265SDimitry Andric
44981ad6265SDimitry Andric  // The prefix.
45081ad6265SDimitry Andric  let Inst{6-7} = 1;
45181ad6265SDimitry Andric  let Inst{8-11} = 0;
45281ad6265SDimitry Andric  let Inst{12-13} = 0; // reserved
45381ad6265SDimitry Andric  let Inst{14-15} = 0; // reserved
45481ad6265SDimitry Andric  let Inst{16-31} = IMM32{31-16};
45581ad6265SDimitry Andric
45681ad6265SDimitry Andric  // The instruction.
45781ad6265SDimitry Andric  let Inst{38-42} = XT{4-0};
45881ad6265SDimitry Andric  let Inst{43-46} = xo;
45981ad6265SDimitry Andric  let Inst{47} = XT{5};
46081ad6265SDimitry Andric  let Inst{48-63} = IMM32{15-0};
46181ad6265SDimitry Andric}
46281ad6265SDimitry Andric
46381ad6265SDimitry Andric// 8RR:D-Form: [ 1 1 0 // // imm0
46481ad6265SDimitry Andric//               PO T XO IX TX imm1 ].
46581ad6265SDimitry Andricclass 8RR_DForm_IMM32_XT6_IX<bits<6> opcode, bits<3> xo, dag OOL, dag IOL,
46681ad6265SDimitry Andric                             string asmstr, InstrItinClass itin,
46781ad6265SDimitry Andric                             list<dag> pattern>
46881ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
46981ad6265SDimitry Andric  bits<6> XT;
47081ad6265SDimitry Andric  bit IX;
47181ad6265SDimitry Andric  bits<32> IMM32;
47281ad6265SDimitry Andric
47381ad6265SDimitry Andric  let Pattern = pattern;
47481ad6265SDimitry Andric
47581ad6265SDimitry Andric  // The prefix.
47681ad6265SDimitry Andric  let Inst{6-7} = 1;
47781ad6265SDimitry Andric  let Inst{8-11} = 0;
47881ad6265SDimitry Andric  let Inst{12-13} = 0; // reserved
47981ad6265SDimitry Andric  let Inst{14-15} = 0; // reserved
48081ad6265SDimitry Andric  let Inst{16-31} = IMM32{31-16};
48181ad6265SDimitry Andric
48281ad6265SDimitry Andric  // The instruction.
48381ad6265SDimitry Andric  let Inst{38-42} = XT{4-0};
48481ad6265SDimitry Andric  let Inst{43-45} = xo;
48581ad6265SDimitry Andric  let Inst{46} = IX;
48681ad6265SDimitry Andric  let Inst{47} = XT{5};
48781ad6265SDimitry Andric  let Inst{48-63} = IMM32{15-0};
48881ad6265SDimitry Andric}
48981ad6265SDimitry Andric
49081ad6265SDimitry Andricclass 8RR_XX4Form_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL,
49181ad6265SDimitry Andric                         string asmstr, InstrItinClass itin, list<dag> pattern>
49281ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
49381ad6265SDimitry Andric  bits<6> XT;
49481ad6265SDimitry Andric  bits<6> XA;
49581ad6265SDimitry Andric  bits<6> XB;
49681ad6265SDimitry Andric  bits<6> XC;
49781ad6265SDimitry Andric
49881ad6265SDimitry Andric  let Pattern = pattern;
49981ad6265SDimitry Andric
50081ad6265SDimitry Andric  // The prefix.
50181ad6265SDimitry Andric  let Inst{6-7} = 1;
50281ad6265SDimitry Andric  let Inst{8-11} = 0;
50381ad6265SDimitry Andric  let Inst{12-13} = 0;
50481ad6265SDimitry Andric  let Inst{14-31} = 0;
50581ad6265SDimitry Andric
50681ad6265SDimitry Andric  // The instruction.
50781ad6265SDimitry Andric  let Inst{38-42} = XT{4-0};
50881ad6265SDimitry Andric  let Inst{43-47} = XA{4-0};
50981ad6265SDimitry Andric  let Inst{48-52} = XB{4-0};
51081ad6265SDimitry Andric  let Inst{53-57} = XC{4-0};
51181ad6265SDimitry Andric  let Inst{58-59} = xo;
51281ad6265SDimitry Andric  let Inst{60} = XC{5};
51381ad6265SDimitry Andric  let Inst{61} = XA{5};
51481ad6265SDimitry Andric  let Inst{62} = XB{5};
51581ad6265SDimitry Andric  let Inst{63} = XT{5};
51681ad6265SDimitry Andric}
51781ad6265SDimitry Andric
51881ad6265SDimitry Andricclass 8RR_XX4Form_IMM3_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL,
51981ad6265SDimitry Andric                              string asmstr, InstrItinClass itin,
52081ad6265SDimitry Andric                              list<dag> pattern>
52181ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
52281ad6265SDimitry Andric  bits<6> XT;
52381ad6265SDimitry Andric  bits<6> XA;
52481ad6265SDimitry Andric  bits<6> XB;
52581ad6265SDimitry Andric  bits<6> XC;
52681ad6265SDimitry Andric  bits<3> IMM;
52781ad6265SDimitry Andric
52881ad6265SDimitry Andric  let Pattern = pattern;
52981ad6265SDimitry Andric
53081ad6265SDimitry Andric  // The prefix.
53181ad6265SDimitry Andric  let Inst{6-7} = 1;
53281ad6265SDimitry Andric  let Inst{8-11} = 0;
53381ad6265SDimitry Andric  let Inst{12-13} = 0;
53481ad6265SDimitry Andric  let Inst{14-28} = 0;
53581ad6265SDimitry Andric  let Inst{29-31} = IMM;
53681ad6265SDimitry Andric
53781ad6265SDimitry Andric  // The instruction.
53881ad6265SDimitry Andric  let Inst{38-42} = XT{4-0};
53981ad6265SDimitry Andric  let Inst{43-47} = XA{4-0};
54081ad6265SDimitry Andric  let Inst{48-52} = XB{4-0};
54181ad6265SDimitry Andric  let Inst{53-57} = XC{4-0};
54281ad6265SDimitry Andric  let Inst{58-59} = xo;
54381ad6265SDimitry Andric  let Inst{60} = XC{5};
54481ad6265SDimitry Andric  let Inst{61} = XA{5};
54581ad6265SDimitry Andric  let Inst{62} = XB{5};
54681ad6265SDimitry Andric  let Inst{63} = XT{5};
54781ad6265SDimitry Andric}
54881ad6265SDimitry Andric
54981ad6265SDimitry Andric// [PO BF / XO2 B XO BX /]
55081ad6265SDimitry Andricclass XX2_BF3_XO5_XB6_XO9<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL,
55181ad6265SDimitry Andric                          dag IOL, string asmstr, InstrItinClass itin,
55281ad6265SDimitry Andric                          list<dag> pattern>
55381ad6265SDimitry Andric  : I<opcode, OOL, IOL, asmstr, itin> {
55481ad6265SDimitry Andric  bits<3> BF;
55581ad6265SDimitry Andric  bits<6> XB;
55681ad6265SDimitry Andric
55781ad6265SDimitry Andric  let Pattern = pattern;
55881ad6265SDimitry Andric
55981ad6265SDimitry Andric  let Inst{6-8}   = BF;
56081ad6265SDimitry Andric  let Inst{9-10}  = 0;
56181ad6265SDimitry Andric  let Inst{11-15} = xo2;
56281ad6265SDimitry Andric  let Inst{16-20} = XB{4-0};
56381ad6265SDimitry Andric  let Inst{21-29} = xo;
56481ad6265SDimitry Andric  let Inst{30}    = XB{5};
56581ad6265SDimitry Andric  let Inst{31}    = 0;
56681ad6265SDimitry Andric}
56781ad6265SDimitry Andric
56881ad6265SDimitry Andric// X-Form: [ PO RT BI /// XO / ]
56981ad6265SDimitry Andricclass XForm_XT5_BI5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
57081ad6265SDimitry Andric                    string asmstr, InstrItinClass itin, list<dag> pattern>
57181ad6265SDimitry Andric  : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
57206c3fb27SDimitry Andric  bits<5> BI;
57306c3fb27SDimitry Andric  let RA = BI;
57406c3fb27SDimitry Andric  let RB = 0;
57581ad6265SDimitry Andric}
57681ad6265SDimitry Andric
57781ad6265SDimitry Andricmulticlass MLS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL,
5785f757f3fSDimitry Andric                                       dag PCRel_IOL, dag PCRelOnly_IOL,
5795f757f3fSDimitry Andric                                       string asmstr, string asmstr_pcext,
58081ad6265SDimitry Andric                                       InstrItinClass itin> {
58181ad6265SDimitry Andric  def NAME : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL,
58281ad6265SDimitry Andric                                       !strconcat(asmstr, ", 0"), itin, []>;
58381ad6265SDimitry Andric  def pc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL,
58481ad6265SDimitry Andric                                     !strconcat(asmstr, ", 1"), itin, []>,
58581ad6265SDimitry Andric                                     isPCRel;
5865f757f3fSDimitry Andric  let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
5875f757f3fSDimitry Andric    def nopc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, asmstr, itin, []>;
5885f757f3fSDimitry Andric    let RA = 0 in
5895f757f3fSDimitry Andric      def onlypc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRelOnly_IOL,
5905f757f3fSDimitry Andric                                             asmstr_pcext, itin, []>, isPCRel;
5915f757f3fSDimitry Andric  }
59281ad6265SDimitry Andric}
59381ad6265SDimitry Andric
59481ad6265SDimitry Andricmulticlass 8LS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL,
5955f757f3fSDimitry Andric                                       dag PCRel_IOL, dag PCRelOnly_IOL,
5965f757f3fSDimitry Andric                                       string asmstr, string asmstr_pcext,
59781ad6265SDimitry Andric                                       InstrItinClass itin> {
59881ad6265SDimitry Andric  def NAME : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL,
59981ad6265SDimitry Andric                                       !strconcat(asmstr, ", 0"), itin, []>;
60081ad6265SDimitry Andric  def pc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL,
60181ad6265SDimitry Andric                                     !strconcat(asmstr, ", 1"), itin, []>,
60281ad6265SDimitry Andric                                     isPCRel;
6035f757f3fSDimitry Andric  let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
6045f757f3fSDimitry Andric    def nopc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, asmstr, itin, []>;
6055f757f3fSDimitry Andric    let RA = 0 in
6065f757f3fSDimitry Andric      def onlypc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRelOnly_IOL,
6075f757f3fSDimitry Andric                                             asmstr_pcext, itin, []>, isPCRel;
6085f757f3fSDimitry Andric  }
60981ad6265SDimitry Andric}
61081ad6265SDimitry Andric
61181ad6265SDimitry Andricmulticlass 8LS_DForm_R_SI34_XT6_RA5_MEM_p<bits<5> opcode, dag OOL, dag IOL,
6125f757f3fSDimitry Andric                                          dag PCRel_IOL, dag PCRelOnly_IOL,
6135f757f3fSDimitry Andric                                          string asmstr, string asmstr_pcext,
61481ad6265SDimitry Andric                                          InstrItinClass itin> {
61581ad6265SDimitry Andric  def NAME : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL,
61681ad6265SDimitry Andric                                          !strconcat(asmstr, ", 0"), itin, []>;
61781ad6265SDimitry Andric  def pc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRel_IOL,
61881ad6265SDimitry Andric                                        !strconcat(asmstr, ", 1"), itin, []>,
61981ad6265SDimitry Andric                                        isPCRel;
6205f757f3fSDimitry Andric  let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
6215f757f3fSDimitry Andric    def nopc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL, asmstr, itin, []>;
6225f757f3fSDimitry Andric    let RA = 0 in
6235f757f3fSDimitry Andric      def onlypc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRelOnly_IOL,
6245f757f3fSDimitry Andric                                                asmstr_pcext, itin, []>, isPCRel;
6255f757f3fSDimitry Andric  }
62681ad6265SDimitry Andric}
62781ad6265SDimitry Andric
62881ad6265SDimitry Andricdef PrefixInstrs : Predicate<"Subtarget->hasPrefixInstrs()">;
62981ad6265SDimitry Andricdef IsISA3_1 : Predicate<"Subtarget->isISA3_1()">;
63081ad6265SDimitry Andricdef PairedVectorMemops : Predicate<"Subtarget->pairedVectorMemops()">;
63181ad6265SDimitry Andricdef RCCp {
63281ad6265SDimitry Andric  dag AToVSRC = (COPY_TO_REGCLASS $XA, VSRC);
63381ad6265SDimitry Andric  dag BToVSRC = (COPY_TO_REGCLASS $XB, VSRC);
63481ad6265SDimitry Andric}
63581ad6265SDimitry Andric
63681ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in {
63781ad6265SDimitry Andric  let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
63881ad6265SDimitry Andric    defm PADDI8 :
6395f757f3fSDimitry Andric      MLS_DForm_R_SI34_RTA5_p<14, (outs g8rc:$RT), (ins g8rc_nox0:$RA, s34imm:$SI),
64081ad6265SDimitry Andric                              (ins immZero:$RA, s34imm_pcrel:$SI),
64181ad6265SDimitry Andric                              "paddi $RT, $RA, $SI", IIC_LdStLFD>;
64281ad6265SDimitry Andric    let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
64381ad6265SDimitry Andric      def PLI8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT),
64481ad6265SDimitry Andric                                    (ins s34imm:$SI),
64581ad6265SDimitry Andric                                    "pli $RT, $SI", IIC_IntSimple, []>;
64681ad6265SDimitry Andric    }
64781ad6265SDimitry Andric  }
64881ad6265SDimitry Andric  defm PADDI :
6495f757f3fSDimitry Andric    MLS_DForm_R_SI34_RTA5_p<14, (outs gprc:$RT), (ins gprc_nor0:$RA, s34imm:$SI),
65081ad6265SDimitry Andric                            (ins immZero:$RA, s34imm_pcrel:$SI),
65181ad6265SDimitry Andric                            "paddi $RT, $RA, $SI", IIC_LdStLFD>;
65281ad6265SDimitry Andric  let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
65381ad6265SDimitry Andric    def PLI : MLS_DForm_SI34_RT5<14, (outs gprc:$RT),
65481ad6265SDimitry Andric                                 (ins s34imm:$SI),
65581ad6265SDimitry Andric                                 "pli $RT, $SI", IIC_IntSimple, []>;
65681ad6265SDimitry Andric  }
65781ad6265SDimitry Andric
65881ad6265SDimitry Andric  let mayLoad = 1, mayStore = 0 in {
65981ad6265SDimitry Andric    let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
66081ad6265SDimitry Andric      defm PLBZ8 :
66106c3fb27SDimitry Andric        MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
6625f757f3fSDimitry Andric                                    (ins (memri34_pcrel $D, $RA):$addr),
6635f757f3fSDimitry Andric                                    (ins s34imm_pcrel:$D), "plbz $RST, $addr",
6645f757f3fSDimitry Andric                                    "plbz $RST, $D", IIC_LdStLFD>;
66581ad6265SDimitry Andric      defm PLHZ8 :
66606c3fb27SDimitry Andric        MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
6675f757f3fSDimitry Andric                                    (ins (memri34_pcrel $D, $RA):$addr),
6685f757f3fSDimitry Andric                                    (ins s34imm_pcrel:$D), "plhz $RST, $addr",
6695f757f3fSDimitry Andric                                    "plhz $RST, $D", IIC_LdStLFD>;
67081ad6265SDimitry Andric      defm PLHA8 :
67106c3fb27SDimitry Andric        MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
6725f757f3fSDimitry Andric                                    (ins (memri34_pcrel $D, $RA):$addr),
6735f757f3fSDimitry Andric                                    (ins s34imm_pcrel:$D), "plha $RST, $addr",
6745f757f3fSDimitry Andric                                    "plha $RST, $D", IIC_LdStLFD>;
67581ad6265SDimitry Andric      defm PLWA8 :
67606c3fb27SDimitry Andric        8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
67706c3fb27SDimitry Andric                                    (ins (memri34_pcrel $D, $RA):$addr),
6785f757f3fSDimitry Andric                                    (ins s34imm_pcrel:$D),
6795f757f3fSDimitry Andric                                    "plwa $RST, $addr", "plwa $RST, $D",  IIC_LdStLFD>;
68081ad6265SDimitry Andric      defm PLWZ8 :
68106c3fb27SDimitry Andric        MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
6825f757f3fSDimitry Andric                                    (ins (memri34_pcrel $D, $RA):$addr),
6835f757f3fSDimitry Andric                                    (ins s34imm_pcrel:$D), "plwz $RST, $addr",
6845f757f3fSDimitry Andric                                    "plwz $RST, $D", IIC_LdStLFD>;
68581ad6265SDimitry Andric    }
68681ad6265SDimitry Andric    defm PLBZ :
68706c3fb27SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
6885f757f3fSDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
6895f757f3fSDimitry Andric                                  (ins s34imm_pcrel:$D), "plbz $RST, $addr",
6905f757f3fSDimitry Andric                                  "plbz $RST, $D", IIC_LdStLFD>;
69181ad6265SDimitry Andric    defm PLHZ :
69206c3fb27SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
6935f757f3fSDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
6945f757f3fSDimitry Andric                                  (ins s34imm_pcrel:$D), "plhz $RST, $addr",
6955f757f3fSDimitry Andric                                  "plhz $RST, $D", IIC_LdStLFD>;
69681ad6265SDimitry Andric    defm PLHA :
69706c3fb27SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
6985f757f3fSDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
6995f757f3fSDimitry Andric                                  (ins s34imm_pcrel:$D), "plha $RST, $addr",
7005f757f3fSDimitry Andric                                  "plha $RST, $D", IIC_LdStLFD>;
70181ad6265SDimitry Andric    defm PLWZ :
70206c3fb27SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
7035f757f3fSDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
7045f757f3fSDimitry Andric                                  (ins s34imm_pcrel:$D), "plwz $RST, $addr",
7055f757f3fSDimitry Andric                                  "plwz $RST, $D", IIC_LdStLFD>;
70681ad6265SDimitry Andric    defm PLWA :
70706c3fb27SDimitry Andric      8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr),
7085f757f3fSDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
7095f757f3fSDimitry Andric                                  (ins s34imm_pcrel:$D),
7105f757f3fSDimitry Andric                                  "plwa $RST, $addr", "plwa $RST, $D",
71181ad6265SDimitry Andric                                  IIC_LdStLFD>;
71281ad6265SDimitry Andric    defm PLD :
71306c3fb27SDimitry Andric      8LS_DForm_R_SI34_RTA5_MEM_p<57, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr),
7145f757f3fSDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
7155f757f3fSDimitry Andric                                  (ins s34imm_pcrel:$D),
7165f757f3fSDimitry Andric                                  "pld $RST, $addr", "pld $RST, $D",
71781ad6265SDimitry Andric                                  IIC_LdStLFD>;
71881ad6265SDimitry Andric  }
71981ad6265SDimitry Andric
72081ad6265SDimitry Andric  let mayStore = 1, mayLoad = 0 in {
72181ad6265SDimitry Andric    let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
72281ad6265SDimitry Andric      defm PSTB8 :
72306c3fb27SDimitry Andric        MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr),
72406c3fb27SDimitry Andric                                    (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr),
7255f757f3fSDimitry Andric                                    (ins g8rc:$RST, s34imm_pcrel:$D),
7265f757f3fSDimitry Andric                                    "pstb $RST, $addr", "pstb $RST, $D", IIC_LdStLFD>;
72781ad6265SDimitry Andric      defm PSTH8 :
72806c3fb27SDimitry Andric        MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr),
72906c3fb27SDimitry Andric                                    (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr),
7305f757f3fSDimitry Andric                                    (ins g8rc:$RST, s34imm_pcrel:$D),
7315f757f3fSDimitry Andric                                    "psth $RST, $addr", "psth $RST, $D", IIC_LdStLFD>;
73281ad6265SDimitry Andric      defm PSTW8 :
73306c3fb27SDimitry Andric        MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr),
73406c3fb27SDimitry Andric                                    (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr),
7355f757f3fSDimitry Andric                                    (ins g8rc:$RST, s34imm_pcrel:$D),
7365f757f3fSDimitry Andric                                    "pstw $RST, $addr", "pstw $RST, $D", IIC_LdStLFD>;
73781ad6265SDimitry Andric    }
73881ad6265SDimitry Andric    defm PSTB :
73906c3fb27SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr),
74006c3fb27SDimitry Andric                                  (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr),
7415f757f3fSDimitry Andric                                  (ins gprc:$RST, s34imm_pcrel:$D),
7425f757f3fSDimitry Andric                                  "pstb $RST, $addr", "pstb $RST, $D", IIC_LdStLFD>;
74381ad6265SDimitry Andric    defm PSTH :
74406c3fb27SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr),
74506c3fb27SDimitry Andric                                  (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr),
7465f757f3fSDimitry Andric                                  (ins gprc:$RST, s34imm_pcrel:$D),
7475f757f3fSDimitry Andric                                  "psth $RST, $addr", "psth $RST, $D", IIC_LdStLFD>;
74881ad6265SDimitry Andric    defm PSTW :
74906c3fb27SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr),
75006c3fb27SDimitry Andric                                  (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr),
7515f757f3fSDimitry Andric                                  (ins gprc:$RST, s34imm_pcrel:$D),
7525f757f3fSDimitry Andric                                  "pstw $RST, $addr", "pstw $RST, $D", IIC_LdStLFD>;
75381ad6265SDimitry Andric    defm PSTD :
75406c3fb27SDimitry Andric      8LS_DForm_R_SI34_RTA5_MEM_p<61, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr),
75506c3fb27SDimitry Andric                                  (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr),
7565f757f3fSDimitry Andric                                  (ins g8rc:$RST, s34imm_pcrel:$D),
7575f757f3fSDimitry Andric                                  "pstd $RST, $addr", "pstd $RST, $D", IIC_LdStLFD>;
75881ad6265SDimitry Andric  }
75981ad6265SDimitry Andric}
76081ad6265SDimitry Andric
761*0fca6ea1SDimitry Andriclet Predicates = [PrefixInstrs, HasFPU] in {
762*0fca6ea1SDimitry Andric  let mayLoad = 1, mayStore = 0 in {
763*0fca6ea1SDimitry Andric    defm PLFS :
764*0fca6ea1SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<48, (outs f4rc:$RST), (ins (memri34 $D, $RA):$addr),
765*0fca6ea1SDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
766*0fca6ea1SDimitry Andric                                  (ins s34imm_pcrel:$D), "plfs $RST, $addr",
767*0fca6ea1SDimitry Andric                                  "plfs $RST, $D", IIC_LdStLFD>;
768*0fca6ea1SDimitry Andric    defm PLFD :
769*0fca6ea1SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<50, (outs f8rc:$RST), (ins (memri34 $D, $RA):$addr),
770*0fca6ea1SDimitry Andric                                  (ins  (memri34_pcrel $D, $RA):$addr),
771*0fca6ea1SDimitry Andric                                  (ins s34imm_pcrel:$D), "plfd $RST, $addr",
772*0fca6ea1SDimitry Andric                                  "plfd $RST, $D", IIC_LdStLFD>;
773*0fca6ea1SDimitry Andric  }
774*0fca6ea1SDimitry Andric  let mayStore = 1, mayLoad = 0 in {
775*0fca6ea1SDimitry Andric    defm PSTFS :
776*0fca6ea1SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<52, (outs), (ins f4rc:$RST, (memri34 $D, $RA):$addr),
777*0fca6ea1SDimitry Andric                                  (ins f4rc:$RST, (memri34_pcrel $D, $RA):$addr),
778*0fca6ea1SDimitry Andric                                  (ins f4rc:$RST, s34imm_pcrel:$D),
779*0fca6ea1SDimitry Andric                                  "pstfs $RST, $addr", "pstfs $RST, $D", IIC_LdStLFD>;
780*0fca6ea1SDimitry Andric    defm PSTFD :
781*0fca6ea1SDimitry Andric      MLS_DForm_R_SI34_RTA5_MEM_p<54, (outs), (ins f8rc:$RST, (memri34 $D, $RA):$addr),
782*0fca6ea1SDimitry Andric                                  (ins f8rc:$RST, (memri34_pcrel $D, $RA):$addr),
783*0fca6ea1SDimitry Andric                                  (ins f8rc:$RST, s34imm_pcrel:$D),
784*0fca6ea1SDimitry Andric                                  "pstfd $RST, $addr", "pstfd $RST, $D", IIC_LdStLFD>;
785*0fca6ea1SDimitry Andric  }
786*0fca6ea1SDimitry Andric}
787*0fca6ea1SDimitry Andric
788*0fca6ea1SDimitry Andriclet Predicates = [PrefixInstrs, HasP10Vector] in {
789*0fca6ea1SDimitry Andric  let mayLoad = 1, mayStore = 0 in {
790*0fca6ea1SDimitry Andric    defm PLXV :
791*0fca6ea1SDimitry Andric      8LS_DForm_R_SI34_XT6_RA5_MEM_p<25, (outs vsrc:$XST), (ins (memri34 $D, $RA):$addr),
792*0fca6ea1SDimitry Andric                                     (ins (memri34_pcrel $D, $RA):$addr),
793*0fca6ea1SDimitry Andric                                     (ins s34imm_pcrel:$D),
794*0fca6ea1SDimitry Andric                                     "plxv $XST, $addr", "plxv $XST, $D", IIC_LdStLFD>;
795*0fca6ea1SDimitry Andric    defm PLXSSP :
796*0fca6ea1SDimitry Andric      8LS_DForm_R_SI34_RTA5_MEM_p<43, (outs vfrc:$RST), (ins (memri34 $D, $RA):$addr),
797*0fca6ea1SDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
798*0fca6ea1SDimitry Andric                                  (ins s34imm_pcrel:$D),
799*0fca6ea1SDimitry Andric                                  "plxssp $RST, $addr",  "plxssp $RST, $D",
800*0fca6ea1SDimitry Andric                                  IIC_LdStLFD>;
801*0fca6ea1SDimitry Andric    defm PLXSD :
802*0fca6ea1SDimitry Andric      8LS_DForm_R_SI34_RTA5_MEM_p<42, (outs vfrc:$RST), (ins (memri34 $D, $RA):$addr),
803*0fca6ea1SDimitry Andric                                  (ins (memri34_pcrel $D, $RA):$addr),
804*0fca6ea1SDimitry Andric                                  (ins s34imm_pcrel:$D),
805*0fca6ea1SDimitry Andric                                  "plxsd $RST, $addr", "plxsd $RST, $D",
806*0fca6ea1SDimitry Andric                                  IIC_LdStLFD>;
807*0fca6ea1SDimitry Andric  }
808*0fca6ea1SDimitry Andric let mayStore = 1, mayLoad = 0 in {
809*0fca6ea1SDimitry Andric    defm PSTXV :
810*0fca6ea1SDimitry Andric      8LS_DForm_R_SI34_XT6_RA5_MEM_p<27, (outs), (ins vsrc:$XST, (memri34 $D, $RA):$addr),
811*0fca6ea1SDimitry Andric                                     (ins vsrc:$XST, (memri34_pcrel $D, $RA):$addr),
812*0fca6ea1SDimitry Andric                                     (ins vsrc:$XST, s34imm_pcrel:$D),
813*0fca6ea1SDimitry Andric                                     "pstxv $XST, $addr", "pstxv $XST, $D", IIC_LdStLFD>;
814*0fca6ea1SDimitry Andric    defm PSTXSSP :
815*0fca6ea1SDimitry Andric      8LS_DForm_R_SI34_RTA5_MEM_p<47, (outs), (ins vfrc:$RST, (memri34 $D, $RA):$addr),
816*0fca6ea1SDimitry Andric                                  (ins vfrc:$RST, (memri34_pcrel $D, $RA):$addr),
817*0fca6ea1SDimitry Andric                                  (ins vfrc:$RST, s34imm_pcrel:$D),
818*0fca6ea1SDimitry Andric                                  "pstxssp $RST, $addr", "pstxssp $RST, $D", IIC_LdStLFD>;
819*0fca6ea1SDimitry Andric    defm PSTXSD :
820*0fca6ea1SDimitry Andric      8LS_DForm_R_SI34_RTA5_MEM_p<46, (outs), (ins vfrc:$RST, (memri34 $D, $RA):$addr),
821*0fca6ea1SDimitry Andric                                  (ins vfrc:$RST, (memri34_pcrel $D, $RA):$addr),
822*0fca6ea1SDimitry Andric                                  (ins vfrc:$RST, s34imm_pcrel:$D),
823*0fca6ea1SDimitry Andric                                  "pstxsd $RST, $addr", "pstxsd $RST, $D", IIC_LdStLFD>;
824*0fca6ea1SDimitry Andric  }
825*0fca6ea1SDimitry Andric  def XXPERMX :
826*0fca6ea1SDimitry Andric    8RR_XX4Form_IMM3_XTABC6<34, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
827*0fca6ea1SDimitry Andric                            vsrc:$XC, u3imm:$IMM),
828*0fca6ea1SDimitry Andric                            "xxpermx $XT, $XA, $XB, $XC, $IMM",
829*0fca6ea1SDimitry Andric                            IIC_VecPerm, []>;
830*0fca6ea1SDimitry Andric  def XXBLENDVB :
831*0fca6ea1SDimitry Andric    8RR_XX4Form_XTABC6<33, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
832*0fca6ea1SDimitry Andric                       vsrc:$XC), "xxblendvb $XT, $XA, $XB, $XC",
833*0fca6ea1SDimitry Andric                       IIC_VecGeneral, []>;
834*0fca6ea1SDimitry Andric  def XXBLENDVH :
835*0fca6ea1SDimitry Andric    8RR_XX4Form_XTABC6<33, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
836*0fca6ea1SDimitry Andric                       vsrc:$XC), "xxblendvh $XT, $XA, $XB, $XC",
837*0fca6ea1SDimitry Andric                       IIC_VecGeneral, []>;
838*0fca6ea1SDimitry Andric  def XXBLENDVW :
839*0fca6ea1SDimitry Andric    8RR_XX4Form_XTABC6<33, 2, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
840*0fca6ea1SDimitry Andric                       vsrc:$XC), "xxblendvw $XT, $XA, $XB, $XC",
841*0fca6ea1SDimitry Andric                       IIC_VecGeneral, []>;
842*0fca6ea1SDimitry Andric  def XXBLENDVD :
843*0fca6ea1SDimitry Andric    8RR_XX4Form_XTABC6<33, 3, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
844*0fca6ea1SDimitry Andric                       vsrc:$XC), "xxblendvd $XT, $XA, $XB, $XC",
845*0fca6ea1SDimitry Andric                       IIC_VecGeneral, []>;
846*0fca6ea1SDimitry Andric}
847*0fca6ea1SDimitry Andric
84881ad6265SDimitry Andricclass DQForm_XTp5_RA17_MEM<bits<6> opcode, bits<4> xo, dag OOL, dag IOL,
84981ad6265SDimitry Andric                           string asmstr, InstrItinClass itin, list<dag> pattern>
85081ad6265SDimitry Andric  : I<opcode, OOL, IOL, asmstr, itin> {
85181ad6265SDimitry Andric  bits<5> XTp;
85206c3fb27SDimitry Andric  bits<5> RA;
85306c3fb27SDimitry Andric  bits<12> DQ;
85406c3fb27SDimitry Andric
85581ad6265SDimitry Andric  let Pattern = pattern;
85681ad6265SDimitry Andric
85781ad6265SDimitry Andric  let Inst{6-9} = XTp{3-0};
85881ad6265SDimitry Andric  let Inst{10} = XTp{4};
85906c3fb27SDimitry Andric  let Inst{11-15} = RA;
86006c3fb27SDimitry Andric  let Inst{16-27} = DQ;
86181ad6265SDimitry Andric  let Inst{28-31} = xo;
86281ad6265SDimitry Andric}
86381ad6265SDimitry Andric
86481ad6265SDimitry Andricclass XForm_XTp5_XAB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
86581ad6265SDimitry Andric                      string asmstr, InstrItinClass itin, list<dag> pattern>
86681ad6265SDimitry Andric  : I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp {
86781ad6265SDimitry Andric  bits<5> XTp;
86806c3fb27SDimitry Andric  bits<5> RA;
86906c3fb27SDimitry Andric  bits<5> RB;
87081ad6265SDimitry Andric
87181ad6265SDimitry Andric  let Pattern = pattern;
87281ad6265SDimitry Andric  let Inst{6-9} = XTp{3-0};
87381ad6265SDimitry Andric  let Inst{10} = XTp{4};
87406c3fb27SDimitry Andric  let Inst{11-15} = RA;
87506c3fb27SDimitry Andric  let Inst{16-20} = RB;
87681ad6265SDimitry Andric  let Inst{21-30} = xo;
87781ad6265SDimitry Andric  let Inst{31} = 0;
87881ad6265SDimitry Andric}
87981ad6265SDimitry Andric
88081ad6265SDimitry Andricclass 8LS_DForm_R_XTp5_SI34_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr,
88181ad6265SDimitry Andric                                InstrItinClass itin, list<dag> pattern>
88281ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
88381ad6265SDimitry Andric  bits<5> XTp;
88406c3fb27SDimitry Andric  bits<5> RA;
88506c3fb27SDimitry Andric  bits<34> D;
88681ad6265SDimitry Andric
88781ad6265SDimitry Andric  let Pattern = pattern;
88881ad6265SDimitry Andric
88981ad6265SDimitry Andric  // The prefix.
89081ad6265SDimitry Andric  let Inst{6-10} = 0;
89181ad6265SDimitry Andric  let Inst{11} = PCRel;
89281ad6265SDimitry Andric  let Inst{12-13} = 0;
89306c3fb27SDimitry Andric  let Inst{14-31} = D{33-16}; // Imm18
89481ad6265SDimitry Andric
89581ad6265SDimitry Andric  // The instruction.
89681ad6265SDimitry Andric  let Inst{38-41} = XTp{3-0};
89781ad6265SDimitry Andric  let Inst{42}    = XTp{4};
89806c3fb27SDimitry Andric  let Inst{43-47} = RA;
89906c3fb27SDimitry Andric  let Inst{48-63} = D{15-0};
90081ad6265SDimitry Andric}
90181ad6265SDimitry Andric
90281ad6265SDimitry Andricmulticlass 8LS_DForm_R_XTp5_SI34_MEM_p<bits<6> opcode, dag OOL,
9035f757f3fSDimitry Andric                                       dag IOL, dag PCRel_IOL, dag PCRelOnly_IOL,
9045f757f3fSDimitry Andric                                       string asmstr, string asmstr_pcext,
9055f757f3fSDimitry Andric                                       InstrItinClass itin> {
90681ad6265SDimitry Andric  def NAME : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL,
90781ad6265SDimitry Andric                                       !strconcat(asmstr, ", 0"), itin, []>;
90881ad6265SDimitry Andric  def pc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRel_IOL,
90981ad6265SDimitry Andric                                     !strconcat(asmstr, ", 1"), itin, []>,
91081ad6265SDimitry Andric                                     isPCRel;
9115f757f3fSDimitry Andric  let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
9125f757f3fSDimitry Andric    def nopc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL, asmstr, itin, []>;
9135f757f3fSDimitry Andric    let RA = 0 in
9145f757f3fSDimitry Andric      def onlypc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRelOnly_IOL,
9155f757f3fSDimitry Andric                                             asmstr_pcext, itin, []>, isPCRel;
9165f757f3fSDimitry Andric  }
91781ad6265SDimitry Andric}
91881ad6265SDimitry Andric
91981ad6265SDimitry Andric
92081ad6265SDimitry Andric
92181ad6265SDimitry Andric// [PO AS XO2 XO]
92281ad6265SDimitry Andricclass XForm_AT3<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL,
92381ad6265SDimitry Andric                    string asmstr, InstrItinClass itin, list<dag> pattern>
92481ad6265SDimitry Andric  : I<opcode, OOL, IOL, asmstr, itin> {
92581ad6265SDimitry Andric  bits<3> AT;
92681ad6265SDimitry Andric
92781ad6265SDimitry Andric  let Pattern = pattern;
92881ad6265SDimitry Andric
92981ad6265SDimitry Andric  let Inst{6-8}  = AT;
93081ad6265SDimitry Andric  let Inst{9-10}  = 0;
93181ad6265SDimitry Andric  let Inst{11-15} = xo2;
93281ad6265SDimitry Andric  let Inst{16-20} = 0;
93381ad6265SDimitry Andric  let Inst{21-30} = xo;
93481ad6265SDimitry Andric  let Inst{31} = 0;
93581ad6265SDimitry Andric}
93681ad6265SDimitry Andric
93781ad6265SDimitry Andric// X-Form: [ PO T EO UIM XO TX ]
93881ad6265SDimitry Andricclass XForm_XT6_IMM5<bits<6> opcode, bits<5> eo, bits<10> xo, dag OOL, dag IOL,
93981ad6265SDimitry Andric                     string asmstr, InstrItinClass itin, list<dag> pattern>
94081ad6265SDimitry Andric  : I<opcode, OOL, IOL, asmstr, itin> {
94181ad6265SDimitry Andric  bits<6> XT;
94281ad6265SDimitry Andric  bits<5> UIM;
94381ad6265SDimitry Andric
94481ad6265SDimitry Andric  let Pattern = pattern;
94581ad6265SDimitry Andric
94681ad6265SDimitry Andric  let Inst{6-10} = XT{4-0};
94781ad6265SDimitry Andric  let Inst{11-15} = eo;
94881ad6265SDimitry Andric  let Inst{16-20} = UIM;
94981ad6265SDimitry Andric  let Inst{21-30} = xo;
95081ad6265SDimitry Andric  let Inst{31} = XT{5};
95181ad6265SDimitry Andric}
95281ad6265SDimitry Andric
95381ad6265SDimitry Andricclass XX3Form_AT3_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
95481ad6265SDimitry Andric                           string asmstr, InstrItinClass itin,
95581ad6265SDimitry Andric                           list<dag> pattern>
95681ad6265SDimitry Andric  : I<opcode, OOL, IOL, asmstr, itin> {
95781ad6265SDimitry Andric  bits<3> AT;
95881ad6265SDimitry Andric  bits<6> XA;
95981ad6265SDimitry Andric  bits<6> XB;
96081ad6265SDimitry Andric
96181ad6265SDimitry Andric  let Pattern = pattern;
96281ad6265SDimitry Andric
96381ad6265SDimitry Andric  let Inst{6-8} = AT;
96481ad6265SDimitry Andric  let Inst{9-10} = 0;
96581ad6265SDimitry Andric  let Inst{11-15} = XA{4-0};
96681ad6265SDimitry Andric  let Inst{16-20} = XB{4-0};
96781ad6265SDimitry Andric  let Inst{21-28} = xo;
96881ad6265SDimitry Andric  let Inst{29}    = XA{5};
96981ad6265SDimitry Andric  let Inst{30}    = XB{5};
97081ad6265SDimitry Andric  let Inst{31} = 0;
97181ad6265SDimitry Andric}
97281ad6265SDimitry Andric
97381ad6265SDimitry Andricclass MMIRR_XX3Form_XY4P2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
97481ad6265SDimitry Andric                               string asmstr, InstrItinClass itin,
97581ad6265SDimitry Andric                               list<dag> pattern>
97681ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
97781ad6265SDimitry Andric  bits<3> AT;
97881ad6265SDimitry Andric  bits<6> XA;
97981ad6265SDimitry Andric  bits<6> XB;
98081ad6265SDimitry Andric  bits<4> XMSK;
98181ad6265SDimitry Andric  bits<4> YMSK;
98281ad6265SDimitry Andric  bits<2> PMSK;
98381ad6265SDimitry Andric
98481ad6265SDimitry Andric  let Pattern = pattern;
98581ad6265SDimitry Andric
98681ad6265SDimitry Andric  // The prefix.
98781ad6265SDimitry Andric  let Inst{6-7} = 3;
98881ad6265SDimitry Andric  let Inst{8-11} = 9;
98981ad6265SDimitry Andric  let Inst{12-15} = 0;
99081ad6265SDimitry Andric  let Inst{16-17} = PMSK;
99181ad6265SDimitry Andric  let Inst{18-23} = 0;
99281ad6265SDimitry Andric  let Inst{24-27} = XMSK;
99381ad6265SDimitry Andric  let Inst{28-31} = YMSK;
99481ad6265SDimitry Andric
99581ad6265SDimitry Andric  // The instruction.
99681ad6265SDimitry Andric  let Inst{38-40} = AT;
99781ad6265SDimitry Andric  let Inst{41-42} = 0;
99881ad6265SDimitry Andric  let Inst{43-47} = XA{4-0};
99981ad6265SDimitry Andric  let Inst{48-52} = XB{4-0};
100081ad6265SDimitry Andric  let Inst{53-60} = xo;
100181ad6265SDimitry Andric  let Inst{61} = XA{5};
100281ad6265SDimitry Andric  let Inst{62} = XB{5};
100381ad6265SDimitry Andric  let Inst{63} = 0;
100481ad6265SDimitry Andric}
100581ad6265SDimitry Andric
100681ad6265SDimitry Andricclass MMIRR_XX3Form_XY4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
100781ad6265SDimitry Andric                             string asmstr, InstrItinClass itin,
100881ad6265SDimitry Andric                             list<dag> pattern>
100981ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
101081ad6265SDimitry Andric  bits<3> AT;
101181ad6265SDimitry Andric  bits<6> XA;
101281ad6265SDimitry Andric  bits<6> XB;
101381ad6265SDimitry Andric  bits<4> XMSK;
101481ad6265SDimitry Andric  bits<4> YMSK;
101581ad6265SDimitry Andric
101681ad6265SDimitry Andric  let Pattern = pattern;
101781ad6265SDimitry Andric
101881ad6265SDimitry Andric  // The prefix.
101981ad6265SDimitry Andric  let Inst{6-7} = 3;
102081ad6265SDimitry Andric  let Inst{8-11} = 9;
102181ad6265SDimitry Andric  let Inst{12-23} = 0;
102281ad6265SDimitry Andric  let Inst{24-27} = XMSK;
102381ad6265SDimitry Andric  let Inst{28-31} = YMSK;
102481ad6265SDimitry Andric
102581ad6265SDimitry Andric  // The instruction.
102681ad6265SDimitry Andric  let Inst{38-40} = AT;
102781ad6265SDimitry Andric  let Inst{41-42} = 0;
102881ad6265SDimitry Andric  let Inst{43-47} = XA{4-0};
102981ad6265SDimitry Andric  let Inst{48-52} = XB{4-0};
103081ad6265SDimitry Andric  let Inst{53-60} = xo;
103181ad6265SDimitry Andric  let Inst{61} = XA{5};
103281ad6265SDimitry Andric  let Inst{62} = XB{5};
103381ad6265SDimitry Andric  let Inst{63} = 0;
103481ad6265SDimitry Andric}
103581ad6265SDimitry Andric
103681ad6265SDimitry Andricclass MMIRR_XX3Form_X4Y2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
103781ad6265SDimitry Andric                              string asmstr, InstrItinClass itin,
103881ad6265SDimitry Andric                              list<dag> pattern>
103981ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
104081ad6265SDimitry Andric  bits<3> AT;
104181ad6265SDimitry Andric  bits<6> XA;
104281ad6265SDimitry Andric  bits<6> XB;
104381ad6265SDimitry Andric  bits<4> XMSK;
104481ad6265SDimitry Andric  bits<2> YMSK;
104581ad6265SDimitry Andric
104681ad6265SDimitry Andric  let Pattern = pattern;
104781ad6265SDimitry Andric
104881ad6265SDimitry Andric  // The prefix.
104981ad6265SDimitry Andric  let Inst{6-7} = 3;
105081ad6265SDimitry Andric  let Inst{8-11} = 9;
105181ad6265SDimitry Andric  let Inst{12-23} = 0;
105281ad6265SDimitry Andric  let Inst{24-27} = XMSK;
105381ad6265SDimitry Andric  let Inst{28-29} = YMSK;
105481ad6265SDimitry Andric  let Inst{30-31} = 0;
105581ad6265SDimitry Andric
105681ad6265SDimitry Andric  // The instruction.
105781ad6265SDimitry Andric  let Inst{38-40} = AT;
105881ad6265SDimitry Andric  let Inst{41-42} = 0;
105981ad6265SDimitry Andric  let Inst{43-47} = XA{4-0};
106081ad6265SDimitry Andric  let Inst{48-52} = XB{4-0};
106181ad6265SDimitry Andric  let Inst{53-60} = xo;
106281ad6265SDimitry Andric  let Inst{61} = XA{5};
106381ad6265SDimitry Andric  let Inst{62} = XB{5};
106481ad6265SDimitry Andric  let Inst{63} = 0;
106581ad6265SDimitry Andric}
106681ad6265SDimitry Andric
106781ad6265SDimitry Andricclass MMIRR_XX3Form_XY4P8_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
106881ad6265SDimitry Andric                               string asmstr, InstrItinClass itin,
106981ad6265SDimitry Andric                               list<dag> pattern>
107081ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
107181ad6265SDimitry Andric  bits<3> AT;
107281ad6265SDimitry Andric  bits<6> XA;
107381ad6265SDimitry Andric  bits<6> XB;
107481ad6265SDimitry Andric  bits<4> XMSK;
107581ad6265SDimitry Andric  bits<4> YMSK;
107681ad6265SDimitry Andric  bits<8> PMSK;
107781ad6265SDimitry Andric
107881ad6265SDimitry Andric  let Pattern = pattern;
107981ad6265SDimitry Andric
108081ad6265SDimitry Andric  // The prefix.
108181ad6265SDimitry Andric  let Inst{6-7} = 3;
108281ad6265SDimitry Andric  let Inst{8-11} = 9;
108381ad6265SDimitry Andric  let Inst{12-15} = 0;
108481ad6265SDimitry Andric  let Inst{16-23} = PMSK;
108581ad6265SDimitry Andric  let Inst{24-27} = XMSK;
108681ad6265SDimitry Andric  let Inst{28-31} = YMSK;
108781ad6265SDimitry Andric
108881ad6265SDimitry Andric  // The instruction.
108981ad6265SDimitry Andric  let Inst{38-40} = AT;
109081ad6265SDimitry Andric  let Inst{41-42} = 0;
109181ad6265SDimitry Andric  let Inst{43-47} = XA{4-0};
109281ad6265SDimitry Andric  let Inst{48-52} = XB{4-0};
109381ad6265SDimitry Andric  let Inst{53-60} = xo;
109481ad6265SDimitry Andric  let Inst{61} = XA{5};
109581ad6265SDimitry Andric  let Inst{62} = XB{5};
109681ad6265SDimitry Andric  let Inst{63} = 0;
109781ad6265SDimitry Andric}
109881ad6265SDimitry Andric
109981ad6265SDimitry Andricclass MMIRR_XX3Form_XYP4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
110081ad6265SDimitry Andric                              string asmstr, InstrItinClass itin,
110181ad6265SDimitry Andric                              list<dag> pattern>
110281ad6265SDimitry Andric  : PI<1, opcode, OOL, IOL, asmstr, itin> {
110381ad6265SDimitry Andric  bits<3> AT;
110481ad6265SDimitry Andric  bits<6> XA;
110581ad6265SDimitry Andric  bits<6> XB;
110681ad6265SDimitry Andric  bits<4> XMSK;
110781ad6265SDimitry Andric  bits<4> YMSK;
110881ad6265SDimitry Andric  bits<4> PMSK;
110981ad6265SDimitry Andric
111081ad6265SDimitry Andric  let Pattern = pattern;
111181ad6265SDimitry Andric
111281ad6265SDimitry Andric  // The prefix.
111381ad6265SDimitry Andric  let Inst{6-7} = 3;
111481ad6265SDimitry Andric  let Inst{8-11} = 9;
111581ad6265SDimitry Andric  let Inst{12-15} = 0;
111681ad6265SDimitry Andric  let Inst{16-19} = PMSK;
111781ad6265SDimitry Andric  let Inst{20-23} = 0;
111881ad6265SDimitry Andric  let Inst{24-27} = XMSK;
111981ad6265SDimitry Andric  let Inst{28-31} = YMSK;
112081ad6265SDimitry Andric
112181ad6265SDimitry Andric  // The instruction.
112281ad6265SDimitry Andric  let Inst{38-40} = AT;
112381ad6265SDimitry Andric  let Inst{41-42} = 0;
112481ad6265SDimitry Andric  let Inst{43-47} = XA{4-0};
112581ad6265SDimitry Andric  let Inst{48-52} = XB{4-0};
112681ad6265SDimitry Andric  let Inst{53-60} = xo;
112781ad6265SDimitry Andric  let Inst{61} = XA{5};
112881ad6265SDimitry Andric  let Inst{62} = XB{5};
112981ad6265SDimitry Andric  let Inst{63} = 0;
113081ad6265SDimitry Andric}
113181ad6265SDimitry Andric
113281ad6265SDimitry Andric
113381ad6265SDimitry Andric
113481ad6265SDimitry Andricdef Concats {
113581ad6265SDimitry Andric  dag VecsToVecPair0 =
113681ad6265SDimitry Andric    (v256i1 (INSERT_SUBREG
113781ad6265SDimitry Andric      (INSERT_SUBREG (IMPLICIT_DEF), $vs0, sub_vsx1),
113881ad6265SDimitry Andric      $vs1, sub_vsx0));
113981ad6265SDimitry Andric  dag VecsToVecPair1 =
114081ad6265SDimitry Andric    (v256i1 (INSERT_SUBREG
114181ad6265SDimitry Andric      (INSERT_SUBREG (IMPLICIT_DEF), $vs2, sub_vsx1),
114281ad6265SDimitry Andric      $vs3, sub_vsx0));
114381ad6265SDimitry Andric}
114481ad6265SDimitry Andric
114581ad6265SDimitry Andriclet Predicates = [PairedVectorMemops] in {
114681ad6265SDimitry Andric  def : Pat<(v256i1 (PPCPairBuild v4i32:$vs1, v4i32:$vs0)),
114781ad6265SDimitry Andric            Concats.VecsToVecPair0>;
114881ad6265SDimitry Andric  def : Pat<(v256i1 (int_ppc_vsx_assemble_pair v16i8:$vs1, v16i8:$vs0)),
114981ad6265SDimitry Andric            Concats.VecsToVecPair0>;
115081ad6265SDimitry Andric  def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 0)),
115181ad6265SDimitry Andric            (v4i32 (EXTRACT_SUBREG $v, sub_vsx0))>;
115281ad6265SDimitry Andric  def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 1)),
115381ad6265SDimitry Andric            (v4i32 (EXTRACT_SUBREG $v, sub_vsx1))>;
115481ad6265SDimitry Andric
1155*0fca6ea1SDimitry Andric  let mayLoad = 1, mayStore = 0 in {
115681ad6265SDimitry Andric    def LXVP : DQForm_XTp5_RA17_MEM<6, 0, (outs vsrprc:$XTp),
115706c3fb27SDimitry Andric                                    (ins (memrix16 $DQ, $RA):$addr), "lxvp $XTp, $addr",
115881ad6265SDimitry Andric                                    IIC_LdStLFD, []>;
115906c3fb27SDimitry Andric    def LXVPX : XForm_XTp5_XAB5<31, 333, (outs vsrprc:$XTp), (ins (memrr $RA, $RB):$addr),
116006c3fb27SDimitry Andric                                "lxvpx $XTp, $addr", IIC_LdStLFD,
116181ad6265SDimitry Andric                                []>;
116281ad6265SDimitry Andric  }
116381ad6265SDimitry Andric
1164*0fca6ea1SDimitry Andric  let mayLoad = 0, mayStore = 1 in {
116581ad6265SDimitry Andric    def STXVP : DQForm_XTp5_RA17_MEM<6, 1, (outs), (ins vsrprc:$XTp,
116606c3fb27SDimitry Andric                                     (memrix16 $DQ, $RA):$addr), "stxvp $XTp, $addr",
116781ad6265SDimitry Andric                                     IIC_LdStLFD, []>;
116806c3fb27SDimitry Andric    def STXVPX : XForm_XTp5_XAB5<31, 461, (outs), (ins vsrprc:$XTp, (memrr $RA, $RB):$addr),
116906c3fb27SDimitry Andric                                 "stxvpx $XTp, $addr", IIC_LdStLFD,
117081ad6265SDimitry Andric                                 []>;
117181ad6265SDimitry Andric  }
1172*0fca6ea1SDimitry Andric}
1173*0fca6ea1SDimitry Andriclet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in {
117481ad6265SDimitry Andric  defm PLXVP :
117506c3fb27SDimitry Andric    8LS_DForm_R_XTp5_SI34_MEM_p<58, (outs vsrprc:$XTp), (ins (memri34 $D, $RA):$addr),
11765f757f3fSDimitry Andric                                (ins (memri34_pcrel $D, $RA):$addr),
11775f757f3fSDimitry Andric                                (ins s34imm_pcrel:$D),
11785f757f3fSDimitry Andric                                "plxvp $XTp, $addr", "plxvp $XTp, $D",
117981ad6265SDimitry Andric                                IIC_LdStLFD>;
118081ad6265SDimitry Andric}
118181ad6265SDimitry Andric
1182*0fca6ea1SDimitry Andriclet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in {
118381ad6265SDimitry Andric  defm PSTXVP :
118406c3fb27SDimitry Andric    8LS_DForm_R_XTp5_SI34_MEM_p<62, (outs), (ins vsrprc:$XTp, (memri34 $D, $RA):$addr),
118506c3fb27SDimitry Andric                                (ins vsrprc:$XTp, (memri34_pcrel $D, $RA):$addr),
11865f757f3fSDimitry Andric                                (ins vsrprc:$XTp, s34imm_pcrel:$D),
11875f757f3fSDimitry Andric                                "pstxvp $XTp, $addr", "pstxvp $XTp, $D", IIC_LdStLFD>;
118881ad6265SDimitry Andric}
118981ad6265SDimitry Andric
119081ad6265SDimitry Andriclet Predicates = [PairedVectorMemops] in {
119181ad6265SDimitry Andric  // Intrinsics for Paired Vector Loads.
119281ad6265SDimitry Andric  def : Pat<(v256i1 (int_ppc_vsx_lxvp DQForm:$src)), (LXVP memrix16:$src)>;
119381ad6265SDimitry Andric  def : Pat<(v256i1 (int_ppc_vsx_lxvp XForm:$src)), (LXVPX XForm:$src)>;
1194*0fca6ea1SDimitry Andric  let Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in {
119581ad6265SDimitry Andric    def : Pat<(v256i1 (int_ppc_vsx_lxvp PDForm:$src)), (PLXVP memri34:$src)>;
119681ad6265SDimitry Andric  }
119781ad6265SDimitry Andric  // Intrinsics for Paired Vector Stores.
119881ad6265SDimitry Andric  def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, DQForm:$dst),
119981ad6265SDimitry Andric            (STXVP $XSp, memrix16:$dst)>;
120081ad6265SDimitry Andric  def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, XForm:$dst),
120181ad6265SDimitry Andric            (STXVPX $XSp, XForm:$dst)>;
1202*0fca6ea1SDimitry Andric  let Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in {
120381ad6265SDimitry Andric    def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, PDForm:$dst),
120481ad6265SDimitry Andric              (PSTXVP $XSp, memri34:$dst)>;
120581ad6265SDimitry Andric  }
120681ad6265SDimitry Andric}
120781ad6265SDimitry Andric
1208bdd1243dSDimitry Andriclet Predicates = [IsISA3_1] in {
1209bdd1243dSDimitry Andric  def XSCMPEQQP : X_VT5_VA5_VB5<63, 68, "xscmpeqqp", []>;
1210bdd1243dSDimitry Andric  def XSCMPGEQP : X_VT5_VA5_VB5<63, 196, "xscmpgeqp", []>;
1211bdd1243dSDimitry Andric  def XSCMPGTQP : X_VT5_VA5_VB5<63, 228, "xscmpgtqp", []>;
1212bdd1243dSDimitry Andric}
1213bdd1243dSDimitry Andric
121481ad6265SDimitry Andriclet Predicates = [PCRelativeMemops] in {
121581ad6265SDimitry Andric  // Load i32
121681ad6265SDimitry Andric  def : Pat<(i32 (zextloadi1  (PPCmatpcreladdr PCRelForm:$ga))),
121781ad6265SDimitry Andric            (PLBZpc $ga, 0)>;
121881ad6265SDimitry Andric  def : Pat<(i32 (extloadi1  (PPCmatpcreladdr PCRelForm:$ga))),
121981ad6265SDimitry Andric            (PLBZpc $ga, 0)>;
122081ad6265SDimitry Andric  def : Pat<(i32 (zextloadi8  (PPCmatpcreladdr PCRelForm:$ga))),
122181ad6265SDimitry Andric            (PLBZpc $ga, 0)>;
122281ad6265SDimitry Andric  def : Pat<(i32 (extloadi8   (PPCmatpcreladdr PCRelForm:$ga))),
122381ad6265SDimitry Andric            (PLBZpc $ga, 0)>;
122481ad6265SDimitry Andric  def : Pat<(i32 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
122581ad6265SDimitry Andric            (PLHApc $ga, 0)>;
122681ad6265SDimitry Andric  def : Pat<(i32 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
122781ad6265SDimitry Andric            (PLHZpc $ga, 0)>;
122881ad6265SDimitry Andric  def : Pat<(i32 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
122981ad6265SDimitry Andric            (PLHZpc $ga, 0)>;
123081ad6265SDimitry Andric  def : Pat<(i32 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLWZpc $ga, 0)>;
123181ad6265SDimitry Andric
123281ad6265SDimitry Andric  // Store i32
123381ad6265SDimitry Andric  def : Pat<(truncstorei8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
123481ad6265SDimitry Andric            (PSTBpc $RS, $ga, 0)>;
123581ad6265SDimitry Andric  def : Pat<(truncstorei16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
123681ad6265SDimitry Andric            (PSTHpc $RS, $ga, 0)>;
123781ad6265SDimitry Andric  def : Pat<(store i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
123881ad6265SDimitry Andric            (PSTWpc $RS, $ga, 0)>;
123981ad6265SDimitry Andric
124081ad6265SDimitry Andric  // Load i64
124181ad6265SDimitry Andric  def : Pat<(i64 (zextloadi1  (PPCmatpcreladdr PCRelForm:$ga))),
124281ad6265SDimitry Andric            (PLBZ8pc $ga, 0)>;
124381ad6265SDimitry Andric  def : Pat<(i64 (extloadi1  (PPCmatpcreladdr PCRelForm:$ga))),
124481ad6265SDimitry Andric            (PLBZ8pc $ga, 0)>;
124581ad6265SDimitry Andric  def : Pat<(i64 (zextloadi8  (PPCmatpcreladdr PCRelForm:$ga))),
124681ad6265SDimitry Andric            (PLBZ8pc $ga, 0)>;
124781ad6265SDimitry Andric  def : Pat<(i64 (extloadi8   (PPCmatpcreladdr PCRelForm:$ga))),
124881ad6265SDimitry Andric            (PLBZ8pc $ga, 0)>;
124981ad6265SDimitry Andric  def : Pat<(i64 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
125081ad6265SDimitry Andric            (PLHA8pc $ga, 0)>;
125181ad6265SDimitry Andric  def : Pat<(i64 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
125281ad6265SDimitry Andric            (PLHZ8pc $ga, 0)>;
125381ad6265SDimitry Andric  def : Pat<(i64 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))),
125481ad6265SDimitry Andric            (PLHZ8pc $ga, 0)>;
125581ad6265SDimitry Andric  def : Pat<(i64 (zextloadi32 (PPCmatpcreladdr PCRelForm:$ga))),
125681ad6265SDimitry Andric            (PLWZ8pc $ga, 0)>;
125781ad6265SDimitry Andric  def : Pat<(i64 (sextloadi32 (PPCmatpcreladdr PCRelForm:$ga))),
125881ad6265SDimitry Andric            (PLWA8pc $ga, 0)>;
125981ad6265SDimitry Andric  def : Pat<(i64 (extloadi32 (PPCmatpcreladdr PCRelForm:$ga))),
126081ad6265SDimitry Andric            (PLWZ8pc $ga, 0)>;
126181ad6265SDimitry Andric  def : Pat<(i64 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLDpc $ga, 0)>;
126281ad6265SDimitry Andric
126381ad6265SDimitry Andric  // Store i64
126481ad6265SDimitry Andric  def : Pat<(truncstorei8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
126581ad6265SDimitry Andric            (PSTB8pc $RS, $ga, 0)>;
126681ad6265SDimitry Andric  def : Pat<(truncstorei16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
126781ad6265SDimitry Andric            (PSTH8pc $RS, $ga, 0)>;
126881ad6265SDimitry Andric  def : Pat<(truncstorei32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
126981ad6265SDimitry Andric            (PSTW8pc $RS, $ga, 0)>;
127081ad6265SDimitry Andric  def : Pat<(store i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
127181ad6265SDimitry Andric            (PSTDpc $RS, $ga, 0)>;
127281ad6265SDimitry Andric
1273*0fca6ea1SDimitry Andric  // Atomic Load
1274*0fca6ea1SDimitry Andric  def : Pat<(i32 (atomic_load_8 (PPCmatpcreladdr PCRelForm:$ga))),
1275*0fca6ea1SDimitry Andric            (PLBZpc $ga, 0)>;
1276*0fca6ea1SDimitry Andric  def : Pat<(i32 (atomic_load_16 (PPCmatpcreladdr PCRelForm:$ga))),
1277*0fca6ea1SDimitry Andric            (PLHZpc $ga, 0)>;
1278*0fca6ea1SDimitry Andric  def : Pat<(i32 (atomic_load_32 (PPCmatpcreladdr PCRelForm:$ga))),
1279*0fca6ea1SDimitry Andric            (PLWZpc $ga, 0)>;
1280*0fca6ea1SDimitry Andric  def : Pat<(i64 (atomic_load_64 (PPCmatpcreladdr PCRelForm:$ga))),
1281*0fca6ea1SDimitry Andric            (PLDpc $ga, 0)>;
1282*0fca6ea1SDimitry Andric
1283*0fca6ea1SDimitry Andric  // Atomic Store
1284*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1285*0fca6ea1SDimitry Andric            (PSTBpc $RS, $ga, 0)>;
1286*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1287*0fca6ea1SDimitry Andric            (PSTHpc $RS, $ga, 0)>;
1288*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_32 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1289*0fca6ea1SDimitry Andric            (PSTWpc $RS, $ga, 0)>;
1290*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1291*0fca6ea1SDimitry Andric            (PSTB8pc $RS, $ga, 0)>;
1292*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1293*0fca6ea1SDimitry Andric            (PSTH8pc $RS, $ga, 0)>;
1294*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1295*0fca6ea1SDimitry Andric            (PSTW8pc $RS, $ga, 0)>;
1296*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_64 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)),
1297*0fca6ea1SDimitry Andric            (PSTDpc $RS, $ga, 0)>;
1298*0fca6ea1SDimitry Andric
1299*0fca6ea1SDimitry Andric  // If the PPCmatpcreladdr node is not caught by any other pattern it should be
1300*0fca6ea1SDimitry Andric  // caught here and turned into a paddi instruction to materialize the address.
1301*0fca6ea1SDimitry Andric  def : Pat<(PPCmatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>;
1302*0fca6ea1SDimitry Andric  // PPCtlsdynamatpcreladdr node is used for TLS dynamic models to materialize
1303*0fca6ea1SDimitry Andric  // tls global address with paddi instruction.
1304*0fca6ea1SDimitry Andric  def : Pat<(PPCtlsdynamatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>;
1305*0fca6ea1SDimitry Andric  // PPCtlslocalexecmataddr node is used for TLS local exec models to
1306*0fca6ea1SDimitry Andric  // materialize tls global address with paddi instruction.
1307*0fca6ea1SDimitry Andric  def : Pat<(PPCaddTls i64:$in, (PPCtlslocalexecmataddr tglobaltlsaddr:$addr)),
1308*0fca6ea1SDimitry Andric            (PADDI8 $in, $addr)>;
1309*0fca6ea1SDimitry Andric}
1310*0fca6ea1SDimitry Andric
1311*0fca6ea1SDimitry Andriclet Predicates = [PCRelativeMemops, HasFPU] in {
131281ad6265SDimitry Andric  // Load f32
131381ad6265SDimitry Andric  def : Pat<(f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFSpc $addr, 0)>;
131481ad6265SDimitry Andric
131581ad6265SDimitry Andric  // Store f32
131681ad6265SDimitry Andric  def : Pat<(store f32:$FRS, (PPCmatpcreladdr PCRelForm:$ga)),
131781ad6265SDimitry Andric            (PSTFSpc $FRS, $ga, 0)>;
131881ad6265SDimitry Andric
131981ad6265SDimitry Andric  // Load f64
132081ad6265SDimitry Andric  def : Pat<(f64 (extloadf32 (PPCmatpcreladdr PCRelForm:$addr))),
132181ad6265SDimitry Andric            (COPY_TO_REGCLASS (PLFSpc $addr, 0), VSFRC)>;
132281ad6265SDimitry Andric  def : Pat<(f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFDpc $addr, 0)>;
132381ad6265SDimitry Andric
132481ad6265SDimitry Andric  // Store f64
132581ad6265SDimitry Andric  def : Pat<(store f64:$FRS, (PPCmatpcreladdr PCRelForm:$ga)),
132681ad6265SDimitry Andric            (PSTFDpc $FRS, $ga, 0)>;
132781ad6265SDimitry Andric
1328*0fca6ea1SDimitry Andric  def : Pat<(v4f32 (PPCldvsxlh (PPCmatpcreladdr PCRelForm:$addr))),
1329*0fca6ea1SDimitry Andric            (SUBREG_TO_REG (i64 1), (PLFDpc $addr, 0), sub_64)>;
1330*0fca6ea1SDimitry Andric}
1331*0fca6ea1SDimitry Andric
1332*0fca6ea1SDimitry Andriclet Predicates = [PCRelativeMemops, HasP10Vector] in {
133381ad6265SDimitry Andric  // Load f128
133481ad6265SDimitry Andric  def : Pat<(f128 (load (PPCmatpcreladdr PCRelForm:$addr))),
133581ad6265SDimitry Andric            (COPY_TO_REGCLASS (PLXVpc $addr, 0), VRRC)>;
133681ad6265SDimitry Andric
133781ad6265SDimitry Andric  // Store f128
133881ad6265SDimitry Andric  def : Pat<(store f128:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
133981ad6265SDimitry Andric            (PSTXVpc (COPY_TO_REGCLASS $XS, VSRC), $ga, 0)>;
134081ad6265SDimitry Andric
134181ad6265SDimitry Andric  // Load v4i32
134281ad6265SDimitry Andric  def : Pat<(v4i32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>;
134381ad6265SDimitry Andric
134481ad6265SDimitry Andric  // Store v4i32
134581ad6265SDimitry Andric  def : Pat<(store v4i32:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
134681ad6265SDimitry Andric            (PSTXVpc $XS, $ga, 0)>;
134781ad6265SDimitry Andric
134881ad6265SDimitry Andric  // Load v2i64
134981ad6265SDimitry Andric  def : Pat<(v2i64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>;
135081ad6265SDimitry Andric
135181ad6265SDimitry Andric  // Store v2i64
135281ad6265SDimitry Andric  def : Pat<(store v2i64:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
135381ad6265SDimitry Andric            (PSTXVpc $XS, $ga, 0)>;
135481ad6265SDimitry Andric
135581ad6265SDimitry Andric  // Load v4f32
135681ad6265SDimitry Andric  def : Pat<(v4f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>;
135781ad6265SDimitry Andric
135881ad6265SDimitry Andric  // Store v4f32
135981ad6265SDimitry Andric  def : Pat<(store v4f32:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
136081ad6265SDimitry Andric            (PSTXVpc $XS, $ga, 0)>;
136181ad6265SDimitry Andric
136281ad6265SDimitry Andric  // Load v2f64
136381ad6265SDimitry Andric  def : Pat<(v2f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>;
136481ad6265SDimitry Andric
136581ad6265SDimitry Andric  // Store v2f64
136681ad6265SDimitry Andric  def : Pat<(store v2f64:$XS, (PPCmatpcreladdr PCRelForm:$ga)),
136781ad6265SDimitry Andric            (PSTXVpc $XS, $ga, 0)>;
136881ad6265SDimitry Andric
136981ad6265SDimitry Andric  // Special Cases For PPCstore_scal_int_from_vsr
137006c3fb27SDimitry Andric  def : Pat<(PPCstore_scal_int_from_vsr f64:$src, (PPCmatpcreladdr PCRelForm:$dst), 8),
137106c3fb27SDimitry Andric            (PSTXSDpc $src, $dst, 0)>;
137206c3fb27SDimitry Andric  def : Pat<(PPCstore_scal_int_from_vsr f128:$src, (PPCmatpcreladdr PCRelForm:$dst), 8),
137306c3fb27SDimitry Andric            (PSTXSDpc (COPY_TO_REGCLASS $src, VFRC), $dst, 0)>;
137481ad6265SDimitry Andric}
137581ad6265SDimitry Andric
137681ad6265SDimitry Andric// XXSPLTIW/DP/32DX need extra flags to make sure the compiler does not attempt
137781ad6265SDimitry Andric// to spill part of the instruction when the values are similar.
137881ad6265SDimitry Andriclet isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1, Predicates = [PrefixInstrs] in {
137981ad6265SDimitry Andric  def XXSPLTIW : 8RR_DForm_IMM32_XT6<32, 3, (outs vsrc:$XT),
138081ad6265SDimitry Andric                                     (ins i32imm:$IMM32),
138181ad6265SDimitry Andric                                     "xxspltiw $XT, $IMM32", IIC_VecGeneral,
138281ad6265SDimitry Andric                                     []>;
138381ad6265SDimitry Andric  def XXSPLTIDP : 8RR_DForm_IMM32_XT6<32, 2, (outs vsrc:$XT),
138481ad6265SDimitry Andric                                      (ins i32imm:$IMM32),
138581ad6265SDimitry Andric                                      "xxspltidp $XT, $IMM32", IIC_VecGeneral,
138681ad6265SDimitry Andric                                      [(set v2f64:$XT,
138781ad6265SDimitry Andric                                            (PPCxxspltidp i32:$IMM32))]>;
138881ad6265SDimitry Andric  def XXSPLTI32DX :
138981ad6265SDimitry Andric      8RR_DForm_IMM32_XT6_IX<32, 0, (outs vsrc:$XT),
139081ad6265SDimitry Andric                             (ins vsrc:$XTi, u1imm:$IX, i32imm:$IMM32),
139181ad6265SDimitry Andric                             "xxsplti32dx $XT, $IX, $IMM32", IIC_VecGeneral,
139281ad6265SDimitry Andric                             [(set v2i64:$XT,
139381ad6265SDimitry Andric                                   (PPCxxsplti32dx v2i64:$XTi, i32:$IX,
139481ad6265SDimitry Andric                                                   i32:$IMM32))]>,
139581ad6265SDimitry Andric                             RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">;
139681ad6265SDimitry Andric}
139781ad6265SDimitry Andric
139881ad6265SDimitry Andriclet Predicates = [IsISA3_1] in {
139906c3fb27SDimitry Andric  def SETBC : XForm_XT5_BI5<31, 384, (outs gprc:$RST), (ins crbitrc:$BI),
140006c3fb27SDimitry Andric                            "setbc $RST, $BI", IIC_IntCompare, []>,
1401bdd1243dSDimitry Andric                            SExt32To64, ZExt32To64;
140206c3fb27SDimitry Andric  def SETBCR : XForm_XT5_BI5<31, 416, (outs gprc:$RST), (ins crbitrc:$BI),
140306c3fb27SDimitry Andric                             "setbcr $RST, $BI", IIC_IntCompare, []>,
1404bdd1243dSDimitry Andric                             SExt32To64, ZExt32To64;
140506c3fb27SDimitry Andric  def SETNBC : XForm_XT5_BI5<31, 448, (outs gprc:$RST), (ins crbitrc:$BI),
140606c3fb27SDimitry Andric                             "setnbc $RST, $BI", IIC_IntCompare, []>,
1407bdd1243dSDimitry Andric                             SExt32To64;
140806c3fb27SDimitry Andric  def SETNBCR : XForm_XT5_BI5<31, 480, (outs gprc:$RST), (ins crbitrc:$BI),
140906c3fb27SDimitry Andric                              "setnbcr $RST, $BI", IIC_IntCompare, []>,
1410bdd1243dSDimitry Andric                              SExt32To64;
141181ad6265SDimitry Andric
141281ad6265SDimitry Andric  let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
141306c3fb27SDimitry Andric    def SETBC8 : XForm_XT5_BI5<31, 384, (outs g8rc:$RST), (ins crbitrc:$BI),
141406c3fb27SDimitry Andric                               "setbc $RST, $BI", IIC_IntCompare, []>,
1415bdd1243dSDimitry Andric                               SExt32To64, ZExt32To64;
141606c3fb27SDimitry Andric    def SETBCR8 : XForm_XT5_BI5<31, 416, (outs g8rc:$RST), (ins crbitrc:$BI),
141706c3fb27SDimitry Andric                                "setbcr $RST, $BI", IIC_IntCompare, []>,
1418bdd1243dSDimitry Andric                                SExt32To64, ZExt32To64;
141906c3fb27SDimitry Andric    def SETNBC8 : XForm_XT5_BI5<31, 448, (outs g8rc:$RST), (ins crbitrc:$BI),
142006c3fb27SDimitry Andric                                "setnbc $RST, $BI", IIC_IntCompare, []>,
1421bdd1243dSDimitry Andric                                SExt32To64;
142206c3fb27SDimitry Andric    def SETNBCR8 : XForm_XT5_BI5<31, 480, (outs g8rc:$RST), (ins crbitrc:$BI),
142306c3fb27SDimitry Andric                                 "setnbcr $RST, $BI", IIC_IntCompare, []>,
1424bdd1243dSDimitry Andric                                 SExt32To64;
142581ad6265SDimitry Andric  }
142681ad6265SDimitry Andric
142781ad6265SDimitry Andric  def VSLDBI : VNForm_VTAB5_SD3<22, 0, (outs vrrc:$VRT),
142806c3fb27SDimitry Andric                                (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SD),
142906c3fb27SDimitry Andric                                "vsldbi $VRT, $VRA, $VRB, $SD",
143081ad6265SDimitry Andric                                IIC_VecGeneral,
143181ad6265SDimitry Andric                                [(set v16i8:$VRT,
143281ad6265SDimitry Andric                                      (int_ppc_altivec_vsldbi v16i8:$VRA,
143381ad6265SDimitry Andric                                                              v16i8:$VRB,
143406c3fb27SDimitry Andric                                                              timm:$SD))]>;
143581ad6265SDimitry Andric  def VSRDBI : VNForm_VTAB5_SD3<22, 1, (outs vrrc:$VRT),
143606c3fb27SDimitry Andric                                (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SD),
143706c3fb27SDimitry Andric                                "vsrdbi $VRT, $VRA, $VRB, $SD",
143881ad6265SDimitry Andric                                IIC_VecGeneral,
143981ad6265SDimitry Andric                                [(set v16i8:$VRT,
144081ad6265SDimitry Andric                                      (int_ppc_altivec_vsrdbi v16i8:$VRA,
144181ad6265SDimitry Andric                                                              v16i8:$VRB,
144206c3fb27SDimitry Andric                                                              timm:$SD))]>;
144306c3fb27SDimitry Andric  defm VSTRIBR : VXForm_VTB5_RCr<13, 1, (outs vrrc:$VT), (ins vrrc:$VB),
144406c3fb27SDimitry Andric                                 "vstribr", "$VT, $VB", IIC_VecGeneral,
144506c3fb27SDimitry Andric				 [(set v16i8:$VT,
144606c3fb27SDimitry Andric                                       (int_ppc_altivec_vstribr v16i8:$VB))]>;
144706c3fb27SDimitry Andric  defm VSTRIBL : VXForm_VTB5_RCr<13, 0, (outs vrrc:$VT), (ins vrrc:$VB),
144806c3fb27SDimitry Andric                                 "vstribl", "$VT, $VB", IIC_VecGeneral,
144906c3fb27SDimitry Andric                                 [(set v16i8:$VT,
145006c3fb27SDimitry Andric                                       (int_ppc_altivec_vstribl v16i8:$VB))]>;
145106c3fb27SDimitry Andric  defm VSTRIHR : VXForm_VTB5_RCr<13, 3, (outs vrrc:$VT), (ins vrrc:$VB),
145206c3fb27SDimitry Andric                                 "vstrihr", "$VT, $VB", IIC_VecGeneral,
145306c3fb27SDimitry Andric                                 [(set v8i16:$VT,
145406c3fb27SDimitry Andric                                       (int_ppc_altivec_vstrihr v8i16:$VB))]>;
145506c3fb27SDimitry Andric  defm VSTRIHL : VXForm_VTB5_RCr<13, 2, (outs vrrc:$VT), (ins vrrc:$VB),
145606c3fb27SDimitry Andric                                 "vstrihl", "$VT, $VB", IIC_VecGeneral,
145706c3fb27SDimitry Andric                                 [(set v8i16:$VT,
145806c3fb27SDimitry Andric                                       (int_ppc_altivec_vstrihl v8i16:$VB))]>;
145981ad6265SDimitry Andric  def VINSW :
146006c3fb27SDimitry Andric    VXForm_1<207, (outs vrrc:$VD), (ins vrrc:$VDi, u4imm:$VA, gprc:$VB),
146106c3fb27SDimitry Andric             "vinsw $VD, $VB, $VA", IIC_VecGeneral,
146206c3fb27SDimitry Andric             [(set v4i32:$VD,
146306c3fb27SDimitry Andric                   (int_ppc_altivec_vinsw v4i32:$VDi, i32:$VB, timm:$VA))]>,
146406c3fb27SDimitry Andric             RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
146581ad6265SDimitry Andric  def VINSD :
146606c3fb27SDimitry Andric    VXForm_1<463, (outs vrrc:$VD), (ins vrrc:$VDi, u4imm:$VA, g8rc:$VB),
146706c3fb27SDimitry Andric             "vinsd $VD, $VB, $VA", IIC_VecGeneral,
146806c3fb27SDimitry Andric             [(set v2i64:$VD,
146906c3fb27SDimitry Andric                   (int_ppc_altivec_vinsd v2i64:$VDi, i64:$VB, timm:$VA))]>,
147006c3fb27SDimitry Andric             RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
147181ad6265SDimitry Andric  def VINSBVLX :
147281ad6265SDimitry Andric    VXForm_VTB5_RA5_ins<15, "vinsbvlx",
147306c3fb27SDimitry Andric                        [(set v16i8:$VD,
147406c3fb27SDimitry Andric                              (int_ppc_altivec_vinsbvlx v16i8:$VDi, i32:$VA,
147506c3fb27SDimitry Andric                                                        v16i8:$VB))]>;
147681ad6265SDimitry Andric  def VINSBVRX :
147781ad6265SDimitry Andric    VXForm_VTB5_RA5_ins<271, "vinsbvrx",
147806c3fb27SDimitry Andric                        [(set v16i8:$VD,
147906c3fb27SDimitry Andric                              (int_ppc_altivec_vinsbvrx v16i8:$VDi, i32:$VA,
148006c3fb27SDimitry Andric                                                        v16i8:$VB))]>;
148181ad6265SDimitry Andric  def VINSHVLX :
148281ad6265SDimitry Andric    VXForm_VTB5_RA5_ins<79, "vinshvlx",
148306c3fb27SDimitry Andric                        [(set v8i16:$VD,
148406c3fb27SDimitry Andric                              (int_ppc_altivec_vinshvlx v8i16:$VDi, i32:$VA,
148506c3fb27SDimitry Andric                                                        v8i16:$VB))]>;
148681ad6265SDimitry Andric  def VINSHVRX :
148781ad6265SDimitry Andric    VXForm_VTB5_RA5_ins<335, "vinshvrx",
148806c3fb27SDimitry Andric                        [(set v8i16:$VD,
148906c3fb27SDimitry Andric                              (int_ppc_altivec_vinshvrx v8i16:$VDi, i32:$VA,
149006c3fb27SDimitry Andric                                                        v8i16:$VB))]>;
149181ad6265SDimitry Andric  def VINSWVLX :
149281ad6265SDimitry Andric    VXForm_VTB5_RA5_ins<143, "vinswvlx",
149306c3fb27SDimitry Andric                        [(set v4i32:$VD,
149406c3fb27SDimitry Andric                              (int_ppc_altivec_vinswvlx v4i32:$VDi, i32:$VA,
149506c3fb27SDimitry Andric                                                        v4i32:$VB))]>;
149681ad6265SDimitry Andric  def VINSWVRX :
149781ad6265SDimitry Andric    VXForm_VTB5_RA5_ins<399, "vinswvrx",
149806c3fb27SDimitry Andric                        [(set v4i32:$VD,
149906c3fb27SDimitry Andric                              (int_ppc_altivec_vinswvrx v4i32:$VDi, i32:$VA,
150006c3fb27SDimitry Andric                                                        v4i32:$VB))]>;
150181ad6265SDimitry Andric  def VINSBLX :
150281ad6265SDimitry Andric    VXForm_VRT5_RAB5_ins<527, "vinsblx",
150306c3fb27SDimitry Andric                         [(set v16i8:$VD,
150406c3fb27SDimitry Andric                               (int_ppc_altivec_vinsblx v16i8:$VDi, i32:$VA,
150506c3fb27SDimitry Andric                                                        i32:$VB))]>;
150681ad6265SDimitry Andric  def VINSBRX :
150781ad6265SDimitry Andric    VXForm_VRT5_RAB5_ins<783, "vinsbrx",
150806c3fb27SDimitry Andric                         [(set v16i8:$VD,
150906c3fb27SDimitry Andric                               (int_ppc_altivec_vinsbrx v16i8:$VDi, i32:$VA,
151006c3fb27SDimitry Andric                                                        i32:$VB))]>;
151181ad6265SDimitry Andric  def VINSHLX :
151281ad6265SDimitry Andric    VXForm_VRT5_RAB5_ins<591, "vinshlx",
151306c3fb27SDimitry Andric                         [(set v8i16:$VD,
151406c3fb27SDimitry Andric                               (int_ppc_altivec_vinshlx v8i16:$VDi, i32:$VA,
151506c3fb27SDimitry Andric                                                        i32:$VB))]>;
151681ad6265SDimitry Andric  def VINSHRX :
151781ad6265SDimitry Andric    VXForm_VRT5_RAB5_ins<847, "vinshrx",
151806c3fb27SDimitry Andric                         [(set v8i16:$VD,
151906c3fb27SDimitry Andric                               (int_ppc_altivec_vinshrx v8i16:$VDi, i32:$VA,
152006c3fb27SDimitry Andric                                                        i32:$VB))]>;
152181ad6265SDimitry Andric  def VINSWLX :
152281ad6265SDimitry Andric    VXForm_VRT5_RAB5_ins<655, "vinswlx",
152306c3fb27SDimitry Andric                         [(set v4i32:$VD,
152406c3fb27SDimitry Andric                               (int_ppc_altivec_vinswlx v4i32:$VDi, i32:$VA,
152506c3fb27SDimitry Andric                                                        i32:$VB))]>;
152681ad6265SDimitry Andric  def VINSWRX :
152781ad6265SDimitry Andric    VXForm_VRT5_RAB5_ins<911, "vinswrx",
152806c3fb27SDimitry Andric                         [(set v4i32:$VD,
152906c3fb27SDimitry Andric                               (int_ppc_altivec_vinswrx v4i32:$VDi, i32:$VA,
153006c3fb27SDimitry Andric                                                        i32:$VB))]>;
153181ad6265SDimitry Andric  def VINSDLX :
153206c3fb27SDimitry Andric    VXForm_1<719, (outs vrrc:$VD), (ins vrrc:$VDi, g8rc:$VA, g8rc:$VB),
153306c3fb27SDimitry Andric             "vinsdlx $VD, $VA, $VB", IIC_VecGeneral,
153406c3fb27SDimitry Andric              [(set v2i64:$VD,
153506c3fb27SDimitry Andric                    (int_ppc_altivec_vinsdlx v2i64:$VDi, i64:$VA, i64:$VB))]>,
153606c3fb27SDimitry Andric              RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
153781ad6265SDimitry Andric  def VINSDRX :
153806c3fb27SDimitry Andric    VXForm_1<975, (outs vrrc:$VD), (ins vrrc:$VDi, g8rc:$VA, g8rc:$VB),
153906c3fb27SDimitry Andric             "vinsdrx $VD, $VA, $VB", IIC_VecGeneral,
154006c3fb27SDimitry Andric              [(set v2i64:$VD,
154106c3fb27SDimitry Andric                    (int_ppc_altivec_vinsdrx v2i64:$VDi, i64:$VA, i64:$VB))]>,
154206c3fb27SDimitry Andric              RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
154306c3fb27SDimitry Andric  def VEXTRACTBM : VXForm_RD5_XO5_RS5<1602, 8, (outs gprc:$VD), (ins vrrc:$VB),
154406c3fb27SDimitry Andric                                      "vextractbm $VD, $VB", IIC_VecGeneral,
154506c3fb27SDimitry Andric                                      [(set i32:$VD,
154606c3fb27SDimitry Andric                                      (int_ppc_altivec_vextractbm v16i8:$VB))]>,
1547bdd1243dSDimitry Andric                                      ZExt32To64;
154806c3fb27SDimitry Andric  def VEXTRACTHM : VXForm_RD5_XO5_RS5<1602, 9, (outs gprc:$VD), (ins vrrc:$VB),
154906c3fb27SDimitry Andric                                      "vextracthm $VD, $VB", IIC_VecGeneral,
155006c3fb27SDimitry Andric                                      [(set i32:$VD,
155106c3fb27SDimitry Andric                                      (int_ppc_altivec_vextracthm v8i16:$VB))]>,
1552bdd1243dSDimitry Andric                                      ZExt32To64;
155306c3fb27SDimitry Andric  def VEXTRACTWM : VXForm_RD5_XO5_RS5<1602, 10, (outs gprc:$VD), (ins vrrc:$VB),
155406c3fb27SDimitry Andric                                      "vextractwm $VD, $VB", IIC_VecGeneral,
155506c3fb27SDimitry Andric                                      [(set i32:$VD,
155606c3fb27SDimitry Andric                                      (int_ppc_altivec_vextractwm v4i32:$VB))]>,
1557bdd1243dSDimitry Andric                                      ZExt32To64;
155806c3fb27SDimitry Andric  def VEXTRACTDM : VXForm_RD5_XO5_RS5<1602, 11, (outs gprc:$VD), (ins vrrc:$VB),
155906c3fb27SDimitry Andric                                      "vextractdm $VD, $VB", IIC_VecGeneral,
156006c3fb27SDimitry Andric                                      [(set i32:$VD,
156106c3fb27SDimitry Andric                                      (int_ppc_altivec_vextractdm v2i64:$VB))]>,
1562bdd1243dSDimitry Andric                                      ZExt32To64;
156306c3fb27SDimitry Andric  def VEXTRACTQM : VXForm_RD5_XO5_RS5<1602, 12, (outs gprc:$VD), (ins vrrc:$VB),
156406c3fb27SDimitry Andric                                      "vextractqm $VD, $VB", IIC_VecGeneral,
156506c3fb27SDimitry Andric                                      [(set i32:$VD,
156606c3fb27SDimitry Andric                                      (int_ppc_altivec_vextractqm v1i128:$VB))]>;
156706c3fb27SDimitry Andric  def VEXPANDBM : VXForm_RD5_XO5_RS5<1602, 0, (outs vrrc:$VD), (ins vrrc:$VB),
156806c3fb27SDimitry Andric                                     "vexpandbm $VD, $VB", IIC_VecGeneral,
156906c3fb27SDimitry Andric                                     [(set v16i8:$VD, (int_ppc_altivec_vexpandbm
157006c3fb27SDimitry Andric                                           v16i8:$VB))]>;
157106c3fb27SDimitry Andric  def VEXPANDHM : VXForm_RD5_XO5_RS5<1602, 1, (outs vrrc:$VD), (ins vrrc:$VB),
157206c3fb27SDimitry Andric                                     "vexpandhm $VD, $VB", IIC_VecGeneral,
157306c3fb27SDimitry Andric                                     [(set v8i16:$VD, (int_ppc_altivec_vexpandhm
157406c3fb27SDimitry Andric                                           v8i16:$VB))]>;
157506c3fb27SDimitry Andric  def VEXPANDWM : VXForm_RD5_XO5_RS5<1602, 2, (outs vrrc:$VD), (ins vrrc:$VB),
157606c3fb27SDimitry Andric                                     "vexpandwm $VD, $VB", IIC_VecGeneral,
157706c3fb27SDimitry Andric                                     [(set v4i32:$VD, (int_ppc_altivec_vexpandwm
157806c3fb27SDimitry Andric                                           v4i32:$VB))]>;
157906c3fb27SDimitry Andric  def VEXPANDDM : VXForm_RD5_XO5_RS5<1602, 3, (outs vrrc:$VD), (ins vrrc:$VB),
158006c3fb27SDimitry Andric                                     "vexpanddm $VD, $VB", IIC_VecGeneral,
158106c3fb27SDimitry Andric                                     [(set v2i64:$VD, (int_ppc_altivec_vexpanddm
158206c3fb27SDimitry Andric                                           v2i64:$VB))]>;
158306c3fb27SDimitry Andric  def VEXPANDQM : VXForm_RD5_XO5_RS5<1602, 4, (outs vrrc:$VD), (ins vrrc:$VB),
158406c3fb27SDimitry Andric                                     "vexpandqm $VD, $VB", IIC_VecGeneral,
158506c3fb27SDimitry Andric                                     [(set v1i128:$VD, (int_ppc_altivec_vexpandqm
158606c3fb27SDimitry Andric                                           v1i128:$VB))]>;
158706c3fb27SDimitry Andric  def MTVSRBM : VXForm_RD5_XO5_RS5<1602, 16, (outs vrrc:$VD), (ins g8rc:$VB),
158806c3fb27SDimitry Andric                                   "mtvsrbm $VD, $VB", IIC_VecGeneral,
158906c3fb27SDimitry Andric                                   [(set v16i8:$VD,
159006c3fb27SDimitry Andric                                         (int_ppc_altivec_mtvsrbm i64:$VB))]>;
159106c3fb27SDimitry Andric  def MTVSRHM : VXForm_RD5_XO5_RS5<1602, 17, (outs vrrc:$VD), (ins g8rc:$VB),
159206c3fb27SDimitry Andric                                   "mtvsrhm $VD, $VB", IIC_VecGeneral,
159306c3fb27SDimitry Andric                                   [(set v8i16:$VD,
159406c3fb27SDimitry Andric                                         (int_ppc_altivec_mtvsrhm i64:$VB))]>;
159506c3fb27SDimitry Andric  def MTVSRWM : VXForm_RD5_XO5_RS5<1602, 18, (outs vrrc:$VD), (ins g8rc:$VB),
159606c3fb27SDimitry Andric                                   "mtvsrwm $VD, $VB", IIC_VecGeneral,
159706c3fb27SDimitry Andric                                   [(set v4i32:$VD,
159806c3fb27SDimitry Andric                                         (int_ppc_altivec_mtvsrwm i64:$VB))]>;
159906c3fb27SDimitry Andric  def MTVSRDM : VXForm_RD5_XO5_RS5<1602, 19, (outs vrrc:$VD), (ins g8rc:$VB),
160006c3fb27SDimitry Andric                                   "mtvsrdm $VD, $VB", IIC_VecGeneral,
160106c3fb27SDimitry Andric                                   [(set v2i64:$VD,
160206c3fb27SDimitry Andric                                         (int_ppc_altivec_mtvsrdm i64:$VB))]>;
160306c3fb27SDimitry Andric  def MTVSRQM : VXForm_RD5_XO5_RS5<1602, 20, (outs vrrc:$VD), (ins g8rc:$VB),
160406c3fb27SDimitry Andric                                   "mtvsrqm $VD, $VB", IIC_VecGeneral,
160506c3fb27SDimitry Andric                                   [(set v1i128:$VD,
160606c3fb27SDimitry Andric                                         (int_ppc_altivec_mtvsrqm i64:$VB))]>;
160706c3fb27SDimitry Andric  def MTVSRBMI : DXForm<4, 10, (outs vrrc:$RT), (ins u16imm64:$D),
160806c3fb27SDimitry Andric                        "mtvsrbmi $RT, $D", IIC_VecGeneral,
160906c3fb27SDimitry Andric                        [(set v16i8:$RT,
161081ad6265SDimitry Andric                              (int_ppc_altivec_mtvsrbm imm:$D))]>;
161106c3fb27SDimitry Andric  def VCNTMBB : VXForm_RD5_MP_VB5<1602, 12, (outs g8rc:$RD),
161206c3fb27SDimitry Andric                                  (ins vrrc:$VB, u1imm:$MP),
161306c3fb27SDimitry Andric                                  "vcntmbb $RD, $VB, $MP", IIC_VecGeneral,
161406c3fb27SDimitry Andric                                  [(set i64:$RD, (int_ppc_altivec_vcntmbb
161506c3fb27SDimitry Andric                                        v16i8:$VB, timm:$MP))]>;
161606c3fb27SDimitry Andric  def VCNTMBH : VXForm_RD5_MP_VB5<1602, 13, (outs g8rc:$RD),
161706c3fb27SDimitry Andric                                  (ins vrrc:$VB, u1imm:$MP),
161806c3fb27SDimitry Andric                                  "vcntmbh $RD, $VB, $MP", IIC_VecGeneral,
161906c3fb27SDimitry Andric                                  [(set i64:$RD, (int_ppc_altivec_vcntmbh
162006c3fb27SDimitry Andric                                        v8i16:$VB, timm:$MP))]>;
162106c3fb27SDimitry Andric  def VCNTMBW : VXForm_RD5_MP_VB5<1602, 14, (outs g8rc:$RD),
162206c3fb27SDimitry Andric                                  (ins vrrc:$VB, u1imm:$MP),
162306c3fb27SDimitry Andric                                  "vcntmbw $RD, $VB, $MP", IIC_VecGeneral,
162406c3fb27SDimitry Andric                                  [(set i64:$RD, (int_ppc_altivec_vcntmbw
162506c3fb27SDimitry Andric                                        v4i32:$VB, timm:$MP))]>;
162606c3fb27SDimitry Andric  def VCNTMBD : VXForm_RD5_MP_VB5<1602, 15, (outs g8rc:$RD),
162706c3fb27SDimitry Andric                                  (ins vrrc:$VB, u1imm:$MP),
162806c3fb27SDimitry Andric                                  "vcntmbd $RD, $VB, $MP", IIC_VecGeneral,
162906c3fb27SDimitry Andric                                  [(set i64:$RD, (int_ppc_altivec_vcntmbd
163006c3fb27SDimitry Andric                                        v2i64:$VB, timm:$MP))]>;
163106c3fb27SDimitry Andric  def VEXTDUBVLX : VAForm_1a<24, (outs vrrc:$RT),
163206c3fb27SDimitry Andric                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
163306c3fb27SDimitry Andric                             "vextdubvlx $RT, $RA, $RB, $RC",
163481ad6265SDimitry Andric                             IIC_VecGeneral,
163506c3fb27SDimitry Andric                             [(set v2i64:$RT,
163606c3fb27SDimitry Andric                                   (int_ppc_altivec_vextdubvlx v16i8:$RA,
163706c3fb27SDimitry Andric                                                               v16i8:$RB,
163806c3fb27SDimitry Andric                                                               i32:$RC))]>;
163906c3fb27SDimitry Andric  def VEXTDUBVRX : VAForm_1a<25, (outs vrrc:$RT),
164006c3fb27SDimitry Andric                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
164106c3fb27SDimitry Andric                             "vextdubvrx $RT, $RA, $RB, $RC",
164281ad6265SDimitry Andric                             IIC_VecGeneral,
164306c3fb27SDimitry Andric                             [(set v2i64:$RT,
164406c3fb27SDimitry Andric                                   (int_ppc_altivec_vextdubvrx v16i8:$RA,
164506c3fb27SDimitry Andric                                                               v16i8:$RB,
164606c3fb27SDimitry Andric                                                               i32:$RC))]>;
164706c3fb27SDimitry Andric  def VEXTDUHVLX : VAForm_1a<26, (outs vrrc:$RT),
164806c3fb27SDimitry Andric                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
164906c3fb27SDimitry Andric                             "vextduhvlx $RT, $RA, $RB, $RC",
165081ad6265SDimitry Andric                             IIC_VecGeneral,
165106c3fb27SDimitry Andric                             [(set v2i64:$RT,
165206c3fb27SDimitry Andric                                   (int_ppc_altivec_vextduhvlx v8i16:$RA,
165306c3fb27SDimitry Andric                                                               v8i16:$RB,
165406c3fb27SDimitry Andric                                                               i32:$RC))]>;
165506c3fb27SDimitry Andric  def VEXTDUHVRX : VAForm_1a<27, (outs vrrc:$RT),
165606c3fb27SDimitry Andric                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
165706c3fb27SDimitry Andric                             "vextduhvrx $RT, $RA, $RB, $RC",
165881ad6265SDimitry Andric                             IIC_VecGeneral,
165906c3fb27SDimitry Andric                             [(set v2i64:$RT,
166006c3fb27SDimitry Andric                                   (int_ppc_altivec_vextduhvrx v8i16:$RA,
166106c3fb27SDimitry Andric                                                               v8i16:$RB,
166206c3fb27SDimitry Andric                                                               i32:$RC))]>;
166306c3fb27SDimitry Andric  def VEXTDUWVLX : VAForm_1a<28, (outs vrrc:$RT),
166406c3fb27SDimitry Andric                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
166506c3fb27SDimitry Andric                             "vextduwvlx $RT, $RA, $RB, $RC",
166681ad6265SDimitry Andric                             IIC_VecGeneral,
166706c3fb27SDimitry Andric                             [(set v2i64:$RT,
166806c3fb27SDimitry Andric                                   (int_ppc_altivec_vextduwvlx v4i32:$RA,
166906c3fb27SDimitry Andric                                                               v4i32:$RB,
167006c3fb27SDimitry Andric                                                               i32:$RC))]>;
167106c3fb27SDimitry Andric  def VEXTDUWVRX : VAForm_1a<29, (outs vrrc:$RT),
167206c3fb27SDimitry Andric                             (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
167306c3fb27SDimitry Andric                             "vextduwvrx $RT, $RA, $RB, $RC",
167481ad6265SDimitry Andric                             IIC_VecGeneral,
167506c3fb27SDimitry Andric                             [(set v2i64:$RT,
167606c3fb27SDimitry Andric                                   (int_ppc_altivec_vextduwvrx v4i32:$RA,
167706c3fb27SDimitry Andric                                                               v4i32:$RB,
167806c3fb27SDimitry Andric                                                               i32:$RC))]>;
167906c3fb27SDimitry Andric  def VEXTDDVLX : VAForm_1a<30, (outs vrrc:$RT),
168006c3fb27SDimitry Andric                            (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
168106c3fb27SDimitry Andric                            "vextddvlx $RT, $RA, $RB, $RC",
168281ad6265SDimitry Andric                            IIC_VecGeneral,
168306c3fb27SDimitry Andric                            [(set v2i64:$RT,
168406c3fb27SDimitry Andric                                  (int_ppc_altivec_vextddvlx v2i64:$RA,
168506c3fb27SDimitry Andric                                                             v2i64:$RB,
168606c3fb27SDimitry Andric                                                             i32:$RC))]>;
168706c3fb27SDimitry Andric  def VEXTDDVRX : VAForm_1a<31, (outs vrrc:$RT),
168806c3fb27SDimitry Andric                            (ins vrrc:$RA, vrrc:$RB, gprc:$RC),
168906c3fb27SDimitry Andric                            "vextddvrx $RT, $RA, $RB, $RC",
169081ad6265SDimitry Andric                            IIC_VecGeneral,
169106c3fb27SDimitry Andric                            [(set v2i64:$RT,
169206c3fb27SDimitry Andric                                  (int_ppc_altivec_vextddvrx v2i64:$RA,
169306c3fb27SDimitry Andric                                                             v2i64:$RB,
169406c3fb27SDimitry Andric                                                             i32:$RC))]>;
169506c3fb27SDimitry Andric   def VPDEPD : VXForm_1<1485, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
169606c3fb27SDimitry Andric                         "vpdepd $VD, $VA, $VB", IIC_VecGeneral,
169706c3fb27SDimitry Andric                         [(set v2i64:$VD,
169806c3fb27SDimitry Andric                         (int_ppc_altivec_vpdepd v2i64:$VA, v2i64:$VB))]>;
169906c3fb27SDimitry Andric   def VPEXTD : VXForm_1<1421, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
170006c3fb27SDimitry Andric                         "vpextd $VD, $VA, $VB", IIC_VecGeneral,
170106c3fb27SDimitry Andric                         [(set v2i64:$VD,
170206c3fb27SDimitry Andric                         (int_ppc_altivec_vpextd v2i64:$VA, v2i64:$VB))]>;
170306c3fb27SDimitry Andric   def PDEPD : XForm_6<31, 156, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
170406c3fb27SDimitry Andric                       "pdepd $RA, $RST, $RB", IIC_IntGeneral,
170506c3fb27SDimitry Andric                       [(set i64:$RA, (int_ppc_pdepd i64:$RST, i64:$RB))]>;
170606c3fb27SDimitry Andric   def PEXTD : XForm_6<31, 188, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
170706c3fb27SDimitry Andric                       "pextd $RA, $RST, $RB", IIC_IntGeneral,
170806c3fb27SDimitry Andric                       [(set i64:$RA, (int_ppc_pextd i64:$RST, i64:$RB))]>;
170906c3fb27SDimitry Andric   def VCFUGED : VXForm_1<1357, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
171006c3fb27SDimitry Andric                          "vcfuged $VD, $VA, $VB", IIC_VecGeneral,
171106c3fb27SDimitry Andric                          [(set v2i64:$VD,
171206c3fb27SDimitry Andric                          (int_ppc_altivec_vcfuged v2i64:$VA, v2i64:$VB))]>;
171306c3fb27SDimitry Andric   def VGNB : VXForm_RD5_N3_VB5<1228, (outs g8rc:$RD), (ins vrrc:$VB, u3imm:$N),
171406c3fb27SDimitry Andric                                "vgnb $RD, $VB, $N", IIC_VecGeneral,
171506c3fb27SDimitry Andric                                [(set i64:$RD,
171606c3fb27SDimitry Andric                                (int_ppc_altivec_vgnb v1i128:$VB, timm:$N))]>;
171706c3fb27SDimitry Andric   def CFUGED : XForm_6<31, 220, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
171806c3fb27SDimitry Andric                        "cfuged $RA, $RST, $RB", IIC_IntGeneral,
171906c3fb27SDimitry Andric                        [(set i64:$RA, (int_ppc_cfuged i64:$RST, i64:$RB))]>;
172081ad6265SDimitry Andric   def XXEVAL :
172181ad6265SDimitry Andric     8RR_XX4Form_IMM8_XTAB6<34, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB,
172281ad6265SDimitry Andric                            vsrc:$XC, u8imm:$IMM),
172381ad6265SDimitry Andric                            "xxeval $XT, $XA, $XB, $XC, $IMM", IIC_VecGeneral,
172481ad6265SDimitry Andric                            [(set v2i64:$XT, (int_ppc_vsx_xxeval v2i64:$XA,
172581ad6265SDimitry Andric                                  v2i64:$XB, v2i64:$XC, timm:$IMM))]>;
172606c3fb27SDimitry Andric   def VCLZDM : VXForm_1<1924, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
172706c3fb27SDimitry Andric                         "vclzdm $VD, $VA, $VB", IIC_VecGeneral,
172806c3fb27SDimitry Andric                         [(set v2i64:$VD,
172906c3fb27SDimitry Andric                         (int_ppc_altivec_vclzdm v2i64:$VA, v2i64:$VB))]>;
173006c3fb27SDimitry Andric   def VCTZDM : VXForm_1<1988, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
173106c3fb27SDimitry Andric                         "vctzdm $VD, $VA, $VB", IIC_VecGeneral,
173206c3fb27SDimitry Andric                         [(set v2i64:$VD,
173306c3fb27SDimitry Andric                         (int_ppc_altivec_vctzdm v2i64:$VA, v2i64:$VB))]>;
173406c3fb27SDimitry Andric   def CNTLZDM : XForm_6<31, 59, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
173506c3fb27SDimitry Andric                         "cntlzdm $RA, $RST, $RB", IIC_IntGeneral,
173606c3fb27SDimitry Andric                         [(set i64:$RA,
173706c3fb27SDimitry Andric                         (int_ppc_cntlzdm i64:$RST, i64:$RB))]>;
173806c3fb27SDimitry Andric   def CNTTZDM : XForm_6<31, 571, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB),
173906c3fb27SDimitry Andric                         "cnttzdm $RA, $RST, $RB", IIC_IntGeneral,
174006c3fb27SDimitry Andric                         [(set i64:$RA,
174106c3fb27SDimitry Andric                         (int_ppc_cnttzdm i64:$RST, i64:$RB))]>;
174281ad6265SDimitry Andric   def XXGENPCVBM :
174381ad6265SDimitry Andric     XForm_XT6_IMM5_VB5<60, 916, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM),
174481ad6265SDimitry Andric                        "xxgenpcvbm $XT, $VRB, $IMM", IIC_VecGeneral, []>;
174581ad6265SDimitry Andric   def XXGENPCVHM :
174681ad6265SDimitry Andric     XForm_XT6_IMM5_VB5<60, 917, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM),
174781ad6265SDimitry Andric                        "xxgenpcvhm $XT, $VRB, $IMM", IIC_VecGeneral, []>;
174881ad6265SDimitry Andric   def XXGENPCVWM :
174981ad6265SDimitry Andric     XForm_XT6_IMM5_VB5<60, 948, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM),
175081ad6265SDimitry Andric                        "xxgenpcvwm $XT, $VRB, $IMM", IIC_VecGeneral, []>;
175181ad6265SDimitry Andric   def XXGENPCVDM :
175281ad6265SDimitry Andric     XForm_XT6_IMM5_VB5<60, 949, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM),
175381ad6265SDimitry Andric                        "xxgenpcvdm $XT, $VRB, $IMM", IIC_VecGeneral, []>;
175406c3fb27SDimitry Andric   def VCLRLB : VXForm_1<397, (outs vrrc:$VD), (ins vrrc:$VA, gprc:$VB),
175506c3fb27SDimitry Andric                         "vclrlb $VD, $VA, $VB", IIC_VecGeneral,
175606c3fb27SDimitry Andric                         [(set v16i8:$VD,
175706c3fb27SDimitry Andric                               (int_ppc_altivec_vclrlb v16i8:$VA, i32:$VB))]>;
175806c3fb27SDimitry Andric   def VCLRRB : VXForm_1<461, (outs vrrc:$VD), (ins vrrc:$VA, gprc:$VB),
175906c3fb27SDimitry Andric                         "vclrrb $VD, $VA, $VB", IIC_VecGeneral,
176006c3fb27SDimitry Andric                         [(set v16i8:$VD,
176106c3fb27SDimitry Andric                               (int_ppc_altivec_vclrrb v16i8:$VA, i32:$VB))]>;
176206c3fb27SDimitry Andric  def VMULLD : VXForm_1<457, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
176306c3fb27SDimitry Andric                        "vmulld $VD, $VA, $VB", IIC_VecGeneral,
176406c3fb27SDimitry Andric                        [(set v2i64:$VD, (mul v2i64:$VA, v2i64:$VB))]>;
176506c3fb27SDimitry Andric  def VMULHSW : VXForm_1<905, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
176606c3fb27SDimitry Andric                         "vmulhsw $VD, $VA, $VB", IIC_VecGeneral,
176706c3fb27SDimitry Andric                         [(set v4i32:$VD, (mulhs v4i32:$VA, v4i32:$VB))]>;
176806c3fb27SDimitry Andric  def VMULHUW : VXForm_1<649, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
176906c3fb27SDimitry Andric                         "vmulhuw $VD, $VA, $VB", IIC_VecGeneral,
177006c3fb27SDimitry Andric                         [(set v4i32:$VD, (mulhu v4i32:$VA, v4i32:$VB))]>;
177106c3fb27SDimitry Andric  def VMULHSD : VXForm_1<969, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
177206c3fb27SDimitry Andric                         "vmulhsd $VD, $VA, $VB", IIC_VecGeneral,
177306c3fb27SDimitry Andric                         [(set v2i64:$VD, (mulhs v2i64:$VA, v2i64:$VB))]>;
177406c3fb27SDimitry Andric  def VMULHUD : VXForm_1<713, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
177506c3fb27SDimitry Andric                         "vmulhud $VD, $VA, $VB", IIC_VecGeneral,
177606c3fb27SDimitry Andric                         [(set v2i64:$VD, (mulhu v2i64:$VA, v2i64:$VB))]>;
177706c3fb27SDimitry Andric  def VMODSW : VXForm_1<1931, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
177806c3fb27SDimitry Andric                        "vmodsw $VD, $VA, $VB", IIC_VecGeneral,
177906c3fb27SDimitry Andric                        [(set v4i32:$VD, (srem v4i32:$VA, v4i32:$VB))]>;
178006c3fb27SDimitry Andric  def VMODUW : VXForm_1<1675, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
178106c3fb27SDimitry Andric                        "vmoduw $VD, $VA, $VB", IIC_VecGeneral,
178206c3fb27SDimitry Andric                        [(set v4i32:$VD, (urem v4i32:$VA, v4i32:$VB))]>;
178306c3fb27SDimitry Andric  def VMODSD : VXForm_1<1995, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
178406c3fb27SDimitry Andric                        "vmodsd $VD, $VA, $VB", IIC_VecGeneral,
178506c3fb27SDimitry Andric                        [(set v2i64:$VD, (srem v2i64:$VA, v2i64:$VB))]>;
178606c3fb27SDimitry Andric  def VMODUD : VXForm_1<1739, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
178706c3fb27SDimitry Andric                        "vmodud $VD, $VA, $VB", IIC_VecGeneral,
178806c3fb27SDimitry Andric                        [(set v2i64:$VD, (urem v2i64:$VA, v2i64:$VB))]>;
178906c3fb27SDimitry Andric  def VDIVSW : VXForm_1<395, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
179006c3fb27SDimitry Andric                        "vdivsw $VD, $VA, $VB", IIC_VecGeneral,
179106c3fb27SDimitry Andric                        [(set v4i32:$VD, (sdiv v4i32:$VA, v4i32:$VB))]>;
179206c3fb27SDimitry Andric  def VDIVUW : VXForm_1<139, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
179306c3fb27SDimitry Andric                        "vdivuw $VD, $VA, $VB", IIC_VecGeneral,
179406c3fb27SDimitry Andric                        [(set v4i32:$VD, (udiv v4i32:$VA, v4i32:$VB))]>;
179506c3fb27SDimitry Andric  def VDIVSD : VXForm_1<459, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
179606c3fb27SDimitry Andric                        "vdivsd $VD, $VA, $VB", IIC_VecGeneral,
179706c3fb27SDimitry Andric                        [(set v2i64:$VD, (sdiv v2i64:$VA, v2i64:$VB))]>;
179806c3fb27SDimitry Andric  def VDIVUD : VXForm_1<203, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
179906c3fb27SDimitry Andric                        "vdivud $VD, $VA, $VB", IIC_VecGeneral,
180006c3fb27SDimitry Andric                        [(set v2i64:$VD, (udiv v2i64:$VA, v2i64:$VB))]>;
180106c3fb27SDimitry Andric  def VDIVESW : VXForm_1<907, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
180206c3fb27SDimitry Andric                         "vdivesw $VD, $VA, $VB", IIC_VecGeneral,
180306c3fb27SDimitry Andric                         [(set v4i32:$VD, (int_ppc_altivec_vdivesw v4i32:$VA,
180406c3fb27SDimitry Andric                               v4i32:$VB))]>;
180506c3fb27SDimitry Andric  def VDIVEUW : VXForm_1<651, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
180606c3fb27SDimitry Andric                         "vdiveuw $VD, $VA, $VB", IIC_VecGeneral,
180706c3fb27SDimitry Andric                         [(set v4i32:$VD, (int_ppc_altivec_vdiveuw v4i32:$VA,
180806c3fb27SDimitry Andric                               v4i32:$VB))]>;
180906c3fb27SDimitry Andric  def VDIVESD : VXForm_1<971, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
181006c3fb27SDimitry Andric                         "vdivesd $VD, $VA, $VB", IIC_VecGeneral,
181106c3fb27SDimitry Andric                         [(set v2i64:$VD, (int_ppc_altivec_vdivesd v2i64:$VA,
181206c3fb27SDimitry Andric                               v2i64:$VB))]>;
181306c3fb27SDimitry Andric  def VDIVEUD : VXForm_1<715, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
181406c3fb27SDimitry Andric                         "vdiveud $VD, $VA, $VB", IIC_VecGeneral,
181506c3fb27SDimitry Andric                         [(set v2i64:$VD, (int_ppc_altivec_vdiveud v2i64:$VA,
181606c3fb27SDimitry Andric                               v2i64:$VB))]>;
181781ad6265SDimitry Andric  def XVTLSBB : XX2_BF3_XO5_XB6_XO9<60, 2, 475, (outs crrc:$BF), (ins vsrc:$XB),
181881ad6265SDimitry Andric                                    "xvtlsbb $BF, $XB", IIC_VecGeneral, []>;
181906c3fb27SDimitry Andric  def BRH : XForm_11<31, 219, (outs gprc:$RA), (ins gprc:$RST),
182006c3fb27SDimitry Andric                     "brh $RA, $RST", IIC_IntRotate, []>;
182106c3fb27SDimitry Andric  def BRW : XForm_11<31, 155, (outs gprc:$RA), (ins gprc:$RST),
182206c3fb27SDimitry Andric                     "brw $RA, $RST", IIC_IntRotate,
182306c3fb27SDimitry Andric                     [(set i32:$RA, (bswap i32:$RST))]>;
1824bdd1243dSDimitry Andric  let isCodeGenOnly = 1 in {
182506c3fb27SDimitry Andric    def BRH8 : XForm_11<31, 219, (outs g8rc:$RA), (ins g8rc:$RST),
182606c3fb27SDimitry Andric                        "brh $RA, $RST", IIC_IntRotate, []>;
182706c3fb27SDimitry Andric    def BRW8 : XForm_11<31, 155, (outs g8rc:$RA), (ins g8rc:$RST),
182806c3fb27SDimitry Andric                        "brw $RA, $RST", IIC_IntRotate, []>;
1829bdd1243dSDimitry Andric  }
183006c3fb27SDimitry Andric  def BRD : XForm_11<31, 187, (outs g8rc:$RA), (ins g8rc:$RST),
183106c3fb27SDimitry Andric                     "brd $RA, $RST", IIC_IntRotate,
183206c3fb27SDimitry Andric                     [(set i64:$RA, (bswap i64:$RST))]>;
183381ad6265SDimitry Andric
183481ad6265SDimitry Andric  // The XFormMemOp flag for the following 8 instructions is set on
183581ad6265SDimitry Andric  // the instruction format.
183681ad6265SDimitry Andric  let mayLoad = 1, mayStore = 0 in {
183781ad6265SDimitry Andric    def LXVRBX : X_XT6_RA5_RB5<31, 13, "lxvrbx", vsrc, []>;
183881ad6265SDimitry Andric    def LXVRHX : X_XT6_RA5_RB5<31, 45, "lxvrhx", vsrc, []>;
183981ad6265SDimitry Andric    def LXVRWX : X_XT6_RA5_RB5<31, 77, "lxvrwx", vsrc, []>;
184081ad6265SDimitry Andric    def LXVRDX : X_XT6_RA5_RB5<31, 109, "lxvrdx", vsrc, []>;
184181ad6265SDimitry Andric  }
184281ad6265SDimitry Andric
184381ad6265SDimitry Andric  let mayLoad = 0, mayStore = 1 in {
184481ad6265SDimitry Andric    def STXVRBX : X_XS6_RA5_RB5<31, 141, "stxvrbx", vsrc, []>;
184581ad6265SDimitry Andric    def STXVRHX : X_XS6_RA5_RB5<31, 173, "stxvrhx", vsrc, []>;
184681ad6265SDimitry Andric    def STXVRWX : X_XS6_RA5_RB5<31, 205, "stxvrwx", vsrc, []>;
184781ad6265SDimitry Andric    def STXVRDX : X_XS6_RA5_RB5<31, 237, "stxvrdx", vsrc, []>;
184881ad6265SDimitry Andric  }
184981ad6265SDimitry Andric
185006c3fb27SDimitry Andric  def VMULESD : VXForm_1<968, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
185106c3fb27SDimitry Andric                         "vmulesd $VD, $VA, $VB", IIC_VecGeneral,
185206c3fb27SDimitry Andric                         [(set v1i128:$VD, (int_ppc_altivec_vmulesd v2i64:$VA,
185306c3fb27SDimitry Andric                               v2i64:$VB))]>;
185406c3fb27SDimitry Andric  def VMULEUD : VXForm_1<712, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
185506c3fb27SDimitry Andric                         "vmuleud $VD, $VA, $VB", IIC_VecGeneral,
185606c3fb27SDimitry Andric                         [(set v1i128:$VD, (int_ppc_altivec_vmuleud v2i64:$VA,
185706c3fb27SDimitry Andric                               v2i64:$VB))]>;
185806c3fb27SDimitry Andric  def VMULOSD : VXForm_1<456, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
185906c3fb27SDimitry Andric                         "vmulosd $VD, $VA, $VB", IIC_VecGeneral,
186006c3fb27SDimitry Andric                         [(set v1i128:$VD, (int_ppc_altivec_vmulosd v2i64:$VA,
186106c3fb27SDimitry Andric                               v2i64:$VB))]>;
186206c3fb27SDimitry Andric  def VMULOUD : VXForm_1<200, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
186306c3fb27SDimitry Andric                         "vmuloud $VD, $VA, $VB", IIC_VecGeneral,
186406c3fb27SDimitry Andric                         [(set v1i128:$VD, (int_ppc_altivec_vmuloud v2i64:$VA,
186506c3fb27SDimitry Andric                               v2i64:$VB))]>;
186606c3fb27SDimitry Andric  def VMSUMCUD : VAForm_1a<23, (outs vrrc:$RT), (ins vrrc:$RA, vrrc:$RB, vrrc:$RC),
186706c3fb27SDimitry Andric                           "vmsumcud $RT, $RA, $RB, $RC", IIC_VecGeneral,
186806c3fb27SDimitry Andric                           [(set v1i128:$RT, (int_ppc_altivec_vmsumcud
186906c3fb27SDimitry Andric                                 v2i64:$RA, v2i64:$RB, v1i128:$RC))]>;
187006c3fb27SDimitry Andric  def VDIVSQ : VXForm_1<267, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
187106c3fb27SDimitry Andric                        "vdivsq $VD, $VA, $VB", IIC_VecGeneral,
187206c3fb27SDimitry Andric                        [(set v1i128:$VD, (sdiv v1i128:$VA, v1i128:$VB))]>;
187306c3fb27SDimitry Andric  def VDIVUQ : VXForm_1<11, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
187406c3fb27SDimitry Andric                        "vdivuq $VD, $VA, $VB", IIC_VecGeneral,
187506c3fb27SDimitry Andric                        [(set v1i128:$VD, (udiv v1i128:$VA, v1i128:$VB))]>;
187606c3fb27SDimitry Andric  def VDIVESQ : VXForm_1<779, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
187706c3fb27SDimitry Andric                         "vdivesq $VD, $VA, $VB", IIC_VecGeneral,
187806c3fb27SDimitry Andric                         [(set v1i128:$VD, (int_ppc_altivec_vdivesq v1i128:$VA,
187906c3fb27SDimitry Andric			       v1i128:$VB))]>;
188006c3fb27SDimitry Andric  def VDIVEUQ : VXForm_1<523, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
188106c3fb27SDimitry Andric                         "vdiveuq $VD, $VA, $VB", IIC_VecGeneral,
188206c3fb27SDimitry Andric                         [(set v1i128:$VD, (int_ppc_altivec_vdiveuq v1i128:$VA,
188306c3fb27SDimitry Andric			       v1i128:$VB))]>;
188406c3fb27SDimitry Andric  def VCMPEQUQ : VCMP <455, "vcmpequq $VD, $VA, $VB" , v1i128>;
188506c3fb27SDimitry Andric  def VCMPGTSQ : VCMP <903, "vcmpgtsq $VD, $VA, $VB" , v1i128>;
188606c3fb27SDimitry Andric  def VCMPGTUQ : VCMP <647, "vcmpgtuq $VD, $VA, $VB" , v1i128>;
188706c3fb27SDimitry Andric  def VCMPEQUQ_rec : VCMP_rec <455, "vcmpequq. $VD, $VA, $VB" , v1i128>;
188806c3fb27SDimitry Andric  def VCMPGTSQ_rec : VCMP_rec <903, "vcmpgtsq. $VD, $VA, $VB" , v1i128>;
188906c3fb27SDimitry Andric  def VCMPGTUQ_rec : VCMP_rec <647, "vcmpgtuq. $VD, $VA, $VB" , v1i128>;
189006c3fb27SDimitry Andric  def VMODSQ : VXForm_1<1803, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
189106c3fb27SDimitry Andric                        "vmodsq $VD, $VA, $VB", IIC_VecGeneral,
189206c3fb27SDimitry Andric                        [(set v1i128:$VD, (srem v1i128:$VA, v1i128:$VB))]>;
189306c3fb27SDimitry Andric  def VMODUQ : VXForm_1<1547, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB),
189406c3fb27SDimitry Andric                        "vmoduq $VD, $VA, $VB", IIC_VecGeneral,
189506c3fb27SDimitry Andric                        [(set v1i128:$VD, (urem v1i128:$VA, v1i128:$VB))]>;
189606c3fb27SDimitry Andric  def VEXTSD2Q : VXForm_RD5_XO5_RS5<1538, 27, (outs vrrc:$VD), (ins vrrc:$VB),
189706c3fb27SDimitry Andric                               "vextsd2q $VD, $VB", IIC_VecGeneral,
189806c3fb27SDimitry Andric                               [(set v1i128:$VD, (int_ppc_altivec_vextsd2q v2i64:$VB))]>;
189906c3fb27SDimitry Andric  def VCMPUQ : VXForm_BF3_VAB5<257, (outs crrc:$BF), (ins vrrc:$VA, vrrc:$VB),
190006c3fb27SDimitry Andric                               "vcmpuq $BF, $VA, $VB", IIC_VecGeneral, []>;
190106c3fb27SDimitry Andric  def VCMPSQ : VXForm_BF3_VAB5<321, (outs crrc:$BF), (ins vrrc:$VA, vrrc:$VB),
190206c3fb27SDimitry Andric                               "vcmpsq $BF, $VA, $VB", IIC_VecGeneral, []>;
190381ad6265SDimitry Andric  def VRLQNM : VX1_VT5_VA5_VB5<325, "vrlqnm",
190406c3fb27SDimitry Andric                               [(set v1i128:$VD,
190506c3fb27SDimitry Andric                                   (int_ppc_altivec_vrlqnm v1i128:$VA,
190606c3fb27SDimitry Andric                                                           v1i128:$VB))]>;
190706c3fb27SDimitry Andric  def VRLQMI : VXForm_1<69, (outs vrrc:$VD),
190806c3fb27SDimitry Andric                        (ins vrrc:$VA, vrrc:$VB, vrrc:$VDi),
190906c3fb27SDimitry Andric                        "vrlqmi $VD, $VA, $VB", IIC_VecFP,
191006c3fb27SDimitry Andric                        [(set v1i128:$VD,
191106c3fb27SDimitry Andric                          (int_ppc_altivec_vrlqmi v1i128:$VA, v1i128:$VB,
191206c3fb27SDimitry Andric                                                  v1i128:$VDi))]>,
191306c3fb27SDimitry Andric                        RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">;
191481ad6265SDimitry Andric  def VSLQ : VX1_VT5_VA5_VB5<261, "vslq", []>;
191581ad6265SDimitry Andric  def VSRAQ : VX1_VT5_VA5_VB5<773, "vsraq", []>;
191681ad6265SDimitry Andric  def VSRQ : VX1_VT5_VA5_VB5<517, "vsrq", []>;
191781ad6265SDimitry Andric  def VRLQ : VX1_VT5_VA5_VB5<5, "vrlq", []>;
191881ad6265SDimitry Andric  def XSCVQPUQZ : X_VT5_XO5_VB5<63, 0, 836, "xscvqpuqz", []>;
191981ad6265SDimitry Andric  def XSCVQPSQZ : X_VT5_XO5_VB5<63, 8, 836, "xscvqpsqz", []>;
192081ad6265SDimitry Andric  def XSCVUQQP : X_VT5_XO5_VB5<63, 3, 836, "xscvuqqp", []>;
192181ad6265SDimitry Andric  def XSCVSQQP : X_VT5_XO5_VB5<63, 11, 836, "xscvsqqp", []>;
192281ad6265SDimitry Andric  def LXVKQ : XForm_XT6_IMM5<60, 31, 360, (outs vsrc:$XT), (ins u5imm:$UIM),
192381ad6265SDimitry Andric                             "lxvkq $XT, $UIM", IIC_VecGeneral, []>;
192481ad6265SDimitry Andric}
192581ad6265SDimitry Andric
192681ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX] in {
192781ad6265SDimitry Andric  def XVCVSPBF16 : XX2_XT6_XO5_XB6<60, 17, 475, "xvcvspbf16", vsrc, []>;
192881ad6265SDimitry Andric  def XVCVBF16SPN : XX2_XT6_XO5_XB6<60, 16, 475, "xvcvbf16spn", vsrc, []>;
192981ad6265SDimitry Andric  def XSMAXCQP : X_VT5_VA5_VB5<63, 676, "xsmaxcqp",
193006c3fb27SDimitry Andric                               [(set f128:$RST, (PPCxsmaxc f128:$RA, f128:$RB))]>;
193181ad6265SDimitry Andric  def XSMINCQP : X_VT5_VA5_VB5<63, 740, "xsmincqp",
193206c3fb27SDimitry Andric                               [(set f128:$RST, (PPCxsminc f128:$RA, f128:$RB))]>;
193381ad6265SDimitry Andric}
193481ad6265SDimitry Andric
19355f757f3fSDimitry Andriclet Predicates = [IsISA3_1] in {
19365f757f3fSDimitry Andric  def WAITP10 : XForm_IMM2_IMM2<31, 30, (outs), (ins u2imm:$L, u2imm:$PL),
19375f757f3fSDimitry Andric                                "wait $L $PL", IIC_LdStLoad, []>;
19385f757f3fSDimitry Andric  def SYNCP10 : XForm_IMM3_IMM2<31, 598, (outs), (ins u3imm:$L, u2imm:$SC),
19395f757f3fSDimitry Andric                                "sync $L, $SC", IIC_LdStSync, []>;
19405f757f3fSDimitry Andric}
19415f757f3fSDimitry Andric
194281ad6265SDimitry Andric// Multiclass defining patterns for Set Boolean Extension Reverse Instructions.
194381ad6265SDimitry Andric// This is analogous to the CRNotPat multiclass but specifically for Power10
194481ad6265SDimitry Andric// and newer subtargets since the extended forms use Set Boolean instructions.
194581ad6265SDimitry Andric// The first two anonymous patterns defined are actually a duplicate of those
194681ad6265SDimitry Andric// in CRNotPat, but it is preferable to define both multiclasses as complete
194781ad6265SDimitry Andric// ones rather than pulling that small common section out.
194881ad6265SDimitry Andricmulticlass P10ReverseSetBool<dag pattern, dag result> {
194981ad6265SDimitry Andric  def : Pat<pattern, (crnot result)>;
195081ad6265SDimitry Andric  def : Pat<(not pattern), result>;
195181ad6265SDimitry Andric
195281ad6265SDimitry Andric  def : Pat<(i32 (zext pattern)),
195381ad6265SDimitry Andric            (SETBCR result)>;
195481ad6265SDimitry Andric  def : Pat<(i64 (zext pattern)),
195581ad6265SDimitry Andric            (SETBCR8 result)>;
195681ad6265SDimitry Andric
195781ad6265SDimitry Andric  def : Pat<(i32 (sext pattern)),
195881ad6265SDimitry Andric            (SETNBCR result)>;
195981ad6265SDimitry Andric  def : Pat<(i64 (sext pattern)),
196081ad6265SDimitry Andric            (SETNBCR8 result)>;
196181ad6265SDimitry Andric
196281ad6265SDimitry Andric  def : Pat<(i32 (anyext pattern)),
196381ad6265SDimitry Andric            (SETBCR result)>;
196481ad6265SDimitry Andric  def : Pat<(i64 (anyext pattern)),
196581ad6265SDimitry Andric            (SETBCR8 result)>;
196681ad6265SDimitry Andric}
196781ad6265SDimitry Andric
196881ad6265SDimitry Andricmulticlass IntSetP10RevSetBool<SDNode SetCC, ValueType Ty, PatLeaf ZExtTy,
196981ad6265SDimitry Andric                               ImmLeaf SExtTy, I Cmpi, I Cmpli,
197081ad6265SDimitry Andric                               I Cmp, I Cmpl> {
197181ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)),
197281ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_lt)>;
197381ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)),
197481ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmp $s1, $s2), sub_lt)>;
197581ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)),
197681ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_gt)>;
197781ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)),
197881ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmp $s1, $s2), sub_gt)>;
197981ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)),
198081ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmp $s1, $s2), sub_eq)>;
198181ad6265SDimitry Andric
198281ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETUGE)),
198381ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_lt)>;
198481ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETGE)),
198581ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_lt)>;
198681ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETULE)),
198781ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_gt)>;
198881ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETLE)),
198981ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_gt)>;
199081ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETNE)),
199181ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_eq)>;
199281ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETNE)),
199381ad6265SDimitry Andric                           (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_eq)>;
199481ad6265SDimitry Andric}
199581ad6265SDimitry Andric
199681ad6265SDimitry Andricmulticlass FSetP10RevSetBool<SDNode SetCC, ValueType Ty, I FCmp> {
199781ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)),
199881ad6265SDimitry Andric                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>;
199981ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)),
200081ad6265SDimitry Andric                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>;
200181ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)),
200281ad6265SDimitry Andric                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>;
200381ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)),
200481ad6265SDimitry Andric                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>;
200581ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUNE)),
200681ad6265SDimitry Andric                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>;
200781ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)),
200881ad6265SDimitry Andric                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>;
200981ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETO)),
201081ad6265SDimitry Andric                           (EXTRACT_SUBREG (FCmp $s1, $s2), sub_un)>;
201181ad6265SDimitry Andric}
201281ad6265SDimitry Andric
201381ad6265SDimitry Andriclet Predicates = [IsISA3_1] in {
201481ad6265SDimitry Andric  def : Pat<(i32 (zext i1:$in)),
201581ad6265SDimitry Andric            (SETBC $in)>;
201681ad6265SDimitry Andric  def : Pat<(i64 (zext i1:$in)),
201781ad6265SDimitry Andric            (SETBC8 $in)>;
201881ad6265SDimitry Andric  def : Pat<(i32 (sext i1:$in)),
201981ad6265SDimitry Andric            (SETNBC $in)>;
202081ad6265SDimitry Andric  def : Pat<(i64 (sext i1:$in)),
202181ad6265SDimitry Andric            (SETNBC8 $in)>;
202281ad6265SDimitry Andric  def : Pat<(i32 (anyext i1:$in)),
202381ad6265SDimitry Andric            (SETBC $in)>;
202481ad6265SDimitry Andric  def : Pat<(i64 (anyext i1:$in)),
202581ad6265SDimitry Andric            (SETBC8 $in)>;
202681ad6265SDimitry Andric
202781ad6265SDimitry Andric  // Instantiation of the set boolean reverse patterns for 32-bit integers.
202881ad6265SDimitry Andric  defm : IntSetP10RevSetBool<setcc, i32, immZExt16, imm32SExt16,
202981ad6265SDimitry Andric                             CMPWI, CMPLWI, CMPW, CMPLW>;
203081ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (setcc i32:$s1, imm:$imm, SETNE)),
203181ad6265SDimitry Andric                           (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)),
203281ad6265SDimitry Andric                                           (LO16 imm:$imm)), sub_eq)>;
203381ad6265SDimitry Andric
203481ad6265SDimitry Andric  // Instantiation of the set boolean reverse patterns for 64-bit integers.
203581ad6265SDimitry Andric  defm : IntSetP10RevSetBool<setcc, i64, immZExt16, imm64SExt16,
203681ad6265SDimitry Andric                             CMPDI, CMPLDI, CMPD, CMPLD>;
203781ad6265SDimitry Andric  defm : P10ReverseSetBool<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETNE)),
203881ad6265SDimitry Andric                           (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)),
203981ad6265SDimitry Andric                                           (LO16 imm:$imm)), sub_eq)>;
204081ad6265SDimitry Andric}
204181ad6265SDimitry Andric
204281ad6265SDimitry Andric// Instantiation of the set boolean reverse patterns for f32, f64, f128.
204381ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasFPU] in {
204481ad6265SDimitry Andric  defm : FSetP10RevSetBool<setcc, f32, FCMPUS>;
204581ad6265SDimitry Andric  defm : FSetP10RevSetBool<setcc, f64, FCMPUD>;
204681ad6265SDimitry Andric  defm : FSetP10RevSetBool<setcc, f128, XSCMPUQP>;
204781ad6265SDimitry Andric}
204881ad6265SDimitry Andric
204981ad6265SDimitry Andric//---------------------------- Anonymous Patterns ----------------------------//
205081ad6265SDimitry Andriclet Predicates = [IsISA3_1] in {
205181ad6265SDimitry Andric  // Exploit the vector multiply high instructions using intrinsics.
205281ad6265SDimitry Andric  def : Pat<(v4i32 (int_ppc_altivec_vmulhsw v4i32:$vA, v4i32:$vB)),
205381ad6265SDimitry Andric            (v4i32 (VMULHSW $vA, $vB))>;
205481ad6265SDimitry Andric  def : Pat<(v4i32 (int_ppc_altivec_vmulhuw v4i32:$vA, v4i32:$vB)),
205581ad6265SDimitry Andric            (v4i32 (VMULHUW $vA, $vB))>;
205681ad6265SDimitry Andric  def : Pat<(v2i64 (int_ppc_altivec_vmulhsd v2i64:$vA, v2i64:$vB)),
205781ad6265SDimitry Andric            (v2i64 (VMULHSD $vA, $vB))>;
205881ad6265SDimitry Andric  def : Pat<(v2i64 (int_ppc_altivec_vmulhud v2i64:$vA, v2i64:$vB)),
205981ad6265SDimitry Andric            (v2i64 (VMULHUD $vA, $vB))>;
206081ad6265SDimitry Andric  def : Pat<(v16i8 (int_ppc_vsx_xxgenpcvbm v16i8:$VRB, imm:$IMM)),
206181ad6265SDimitry Andric            (v16i8 (COPY_TO_REGCLASS (XXGENPCVBM $VRB, imm:$IMM), VRRC))>;
206281ad6265SDimitry Andric  def : Pat<(v8i16 (int_ppc_vsx_xxgenpcvhm v8i16:$VRB, imm:$IMM)),
206381ad6265SDimitry Andric            (v8i16 (COPY_TO_REGCLASS (XXGENPCVHM $VRB, imm:$IMM), VRRC))>;
206481ad6265SDimitry Andric  def : Pat<(v4i32 (int_ppc_vsx_xxgenpcvwm v4i32:$VRB, imm:$IMM)),
206581ad6265SDimitry Andric            (v4i32 (COPY_TO_REGCLASS (XXGENPCVWM $VRB, imm:$IMM), VRRC))>;
206681ad6265SDimitry Andric  def : Pat<(v2i64 (int_ppc_vsx_xxgenpcvdm v2i64:$VRB, imm:$IMM)),
206781ad6265SDimitry Andric            (v2i64 (COPY_TO_REGCLASS (XXGENPCVDM $VRB, imm:$IMM), VRRC))>;
206881ad6265SDimitry Andric  def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 1)),
206981ad6265SDimitry Andric            (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_lt)>;
207081ad6265SDimitry Andric  def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 0)),
207181ad6265SDimitry Andric            (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_eq)>;
2072bdd1243dSDimitry Andric  def : Pat<(srl (bswap i32:$RS), (i32 16)),
2073bdd1243dSDimitry Andric            (RLDICL_32 (BRH $RS), 0, 48)>;
2074bdd1243dSDimitry Andric  def : Pat<(i64 (zext (i32 (srl (bswap i32:$RS), (i32 16))))),
2075bdd1243dSDimitry Andric            (RLDICL_32_64 (BRH $RS), 0, 48)>;
207681ad6265SDimitry Andric  def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 8)),
207781ad6265SDimitry Andric             (v1i128 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VRRC))>;
207881ad6265SDimitry Andric  def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 16)),
207981ad6265SDimitry Andric             (v1i128 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VRRC))>;
208081ad6265SDimitry Andric  def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 32)),
208181ad6265SDimitry Andric             (v1i128 (COPY_TO_REGCLASS (LXVRWX ForceXForm:$src), VRRC))>;
208281ad6265SDimitry Andric  def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 64)),
208381ad6265SDimitry Andric             (v1i128 (COPY_TO_REGCLASS (LXVRDX ForceXForm:$src), VRRC))>;
208481ad6265SDimitry Andric
208581ad6265SDimitry Andric  def : Pat<(v1i128 (rotl v1i128:$vA, v1i128:$vB)),
208681ad6265SDimitry Andric            (v1i128 (VRLQ v1i128:$vA, v1i128:$vB))>;
208781ad6265SDimitry Andric
208881ad6265SDimitry Andric  def : Pat <(v2i64 (PPCxxsplti32dx v2i64:$XT, i32:$XI, i32:$IMM32)),
208981ad6265SDimitry Andric             (v2i64 (XXSPLTI32DX v2i64:$XT, i32:$XI, i32:$IMM32))>;
209081ad6265SDimitry Andric}
209181ad6265SDimitry Andric
209281ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX] in {
209381ad6265SDimitry Andric  def : Pat<(v16i8 (int_ppc_vsx_xvcvspbf16 v16i8:$XA)),
209481ad6265SDimitry Andric            (COPY_TO_REGCLASS (XVCVSPBF16 RCCp.AToVSRC), VRRC)>;
209581ad6265SDimitry Andric  def : Pat<(v16i8 (int_ppc_vsx_xvcvbf16spn v16i8:$XA)),
209681ad6265SDimitry Andric            (COPY_TO_REGCLASS (XVCVBF16SPN RCCp.AToVSRC), VRRC)>;
209781ad6265SDimitry Andric}
209881ad6265SDimitry Andric
209981ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, IsLittleEndian] in {
210081ad6265SDimitry Andric  // Store element 0 of a VSX register to memory
210181ad6265SDimitry Andric  def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$src, 0)), ForceXForm:$dst),
210281ad6265SDimitry Andric            (STXVRBX (COPY_TO_REGCLASS v16i8:$src, VSRC), ForceXForm:$dst)>;
210381ad6265SDimitry Andric  def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$src, 0)), ForceXForm:$dst),
210481ad6265SDimitry Andric            (STXVRHX (COPY_TO_REGCLASS v8i16:$src, VSRC), ForceXForm:$dst)>;
210581ad6265SDimitry Andric  def : Pat<(store (i32 (extractelt v4i32:$src, 0)), ForceXForm:$dst),
210681ad6265SDimitry Andric            (STXVRWX $src, ForceXForm:$dst)>;
210781ad6265SDimitry Andric  def : Pat<(store (f32 (extractelt v4f32:$src, 0)), ForceXForm:$dst),
210881ad6265SDimitry Andric            (STXVRWX $src, ForceXForm:$dst)>;
210981ad6265SDimitry Andric  def : Pat<(store (i64 (extractelt v2i64:$src, 0)), ForceXForm:$dst),
211081ad6265SDimitry Andric            (STXVRDX $src, ForceXForm:$dst)>;
211181ad6265SDimitry Andric  def : Pat<(store (f64 (extractelt v2f64:$src, 0)), ForceXForm:$dst),
211281ad6265SDimitry Andric            (STXVRDX $src, ForceXForm:$dst)>;
211381ad6265SDimitry Andric  // Load element 0 of a VSX register to memory
211481ad6265SDimitry Andric  def : Pat<(v8i16 (scalar_to_vector (i32 (extloadi16 ForceXForm:$src)))),
211581ad6265SDimitry Andric            (v8i16 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VSRC))>;
211681ad6265SDimitry Andric  def : Pat<(v16i8 (scalar_to_vector (i32 (extloadi8 ForceXForm:$src)))),
211781ad6265SDimitry Andric            (v16i8 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VSRC))>;
21185f757f3fSDimitry Andric  def : Pat<(store (i64 (extractelt v2i64:$A, 1)), ForceXForm:$src),
21195f757f3fSDimitry Andric            (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>;
21205f757f3fSDimitry Andric }
21215f757f3fSDimitry Andric
21225f757f3fSDimitry Andriclet Predicates = [IsISA3_1, IsBigEndian] in {
21235f757f3fSDimitry Andric  def : Pat<(store (i64 (extractelt v2i64:$A, 0)), ForceXForm:$src),
21245f757f3fSDimitry Andric            (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>;
212581ad6265SDimitry Andric}
212681ad6265SDimitry Andric
212781ad6265SDimitry Andric// FIXME: The swap is overkill when the shift amount is a constant.
212881ad6265SDimitry Andric// We should just fix the constant in the DAG.
212981ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX] in {
213081ad6265SDimitry Andric  def : Pat<(v1i128 (shl v1i128:$VRA, v1i128:$VRB)),
213181ad6265SDimitry Andric            (v1i128 (VSLQ v1i128:$VRA,
213281ad6265SDimitry Andric                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
213381ad6265SDimitry Andric                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
213481ad6265SDimitry Andric  def : Pat<(v1i128 (PPCshl v1i128:$VRA, v1i128:$VRB)),
213581ad6265SDimitry Andric            (v1i128 (VSLQ v1i128:$VRA,
213681ad6265SDimitry Andric                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
213781ad6265SDimitry Andric                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
213881ad6265SDimitry Andric  def : Pat<(v1i128 (srl v1i128:$VRA, v1i128:$VRB)),
213981ad6265SDimitry Andric            (v1i128 (VSRQ v1i128:$VRA,
214081ad6265SDimitry Andric                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
214181ad6265SDimitry Andric                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
214281ad6265SDimitry Andric  def : Pat<(v1i128 (PPCsrl v1i128:$VRA, v1i128:$VRB)),
214381ad6265SDimitry Andric            (v1i128 (VSRQ v1i128:$VRA,
214481ad6265SDimitry Andric                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
214581ad6265SDimitry Andric                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
214681ad6265SDimitry Andric  def : Pat<(v1i128 (sra v1i128:$VRA, v1i128:$VRB)),
214781ad6265SDimitry Andric            (v1i128 (VSRAQ v1i128:$VRA,
214881ad6265SDimitry Andric                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
214981ad6265SDimitry Andric                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
215081ad6265SDimitry Andric  def : Pat<(v1i128 (PPCsra v1i128:$VRA, v1i128:$VRB)),
215181ad6265SDimitry Andric            (v1i128 (VSRAQ v1i128:$VRA,
215281ad6265SDimitry Andric                     (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC),
215381ad6265SDimitry Andric                               (COPY_TO_REGCLASS $VRB, VSRC), 2)))>;
215481ad6265SDimitry Andric}
215581ad6265SDimitry Andric
215681ad6265SDimitry Andricclass xxevalPattern <dag pattern, bits<8> imm> :
215781ad6265SDimitry Andric  Pat<(v4i32 pattern), (XXEVAL $vA, $vB, $vC, imm)> {}
215881ad6265SDimitry Andric
2159*0fca6ea1SDimitry Andriclet Predicates = [PrefixInstrs, HasP10Vector] in {
2160*0fca6ea1SDimitry Andric  let AddedComplexity = 400 in {
216181ad6265SDimitry Andric    def : Pat<(v4i32 (build_vector i32immNonAllOneNonZero:$A,
216281ad6265SDimitry Andric				   i32immNonAllOneNonZero:$A,
216381ad6265SDimitry Andric                                   i32immNonAllOneNonZero:$A,
216481ad6265SDimitry Andric                                   i32immNonAllOneNonZero:$A)),
216581ad6265SDimitry Andric              (v4i32 (XXSPLTIW imm:$A))>;
216681ad6265SDimitry Andric    def : Pat<(f32 nzFPImmAsi32:$A),
216781ad6265SDimitry Andric              (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)),
216881ad6265SDimitry Andric                              VSFRC)>;
216981ad6265SDimitry Andric    def : Pat<(f64 nzFPImmAsi32:$A),
217081ad6265SDimitry Andric              (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)),
217181ad6265SDimitry Andric                              VSFRC)>;
217281ad6265SDimitry Andric
217381ad6265SDimitry Andric    // To replace constant pool with XXSPLTI32DX for scalars.
217481ad6265SDimitry Andric    def : Pat<(f32 nzFPImmAsi64:$A),
217581ad6265SDimitry Andric              (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX(IMPLICIT_DEF), 0,
217681ad6265SDimitry Andric                                             (getFPAs64BitIntHi $A)),
217781ad6265SDimitry Andric                                             1, (getFPAs64BitIntLo $A)),
217881ad6265SDimitry Andric                                VSSRC)>;
217981ad6265SDimitry Andric
218081ad6265SDimitry Andric    def : Pat<(f64 nzFPImmAsi64:$A),
218181ad6265SDimitry Andric              (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX (IMPLICIT_DEF), 0,
218281ad6265SDimitry Andric                                             (getFPAs64BitIntHi $A)),
218381ad6265SDimitry Andric                                             1, (getFPAs64BitIntLo $A)),
218481ad6265SDimitry Andric                                 VSFRC)>;
218581ad6265SDimitry Andric
218681ad6265SDimitry Andric    // Anonymous patterns for XXEVAL
218781ad6265SDimitry Andric    // AND
218881ad6265SDimitry Andric    // and(A, B, C)
218981ad6265SDimitry Andric    def : xxevalPattern<(and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 1>;
219081ad6265SDimitry Andric    // and(A, xor(B, C))
219181ad6265SDimitry Andric    def : xxevalPattern<(and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 6>;
219281ad6265SDimitry Andric    // and(A, or(B, C))
219381ad6265SDimitry Andric    def : xxevalPattern<(and v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 7>;
219481ad6265SDimitry Andric    // and(A, nor(B, C))
219581ad6265SDimitry Andric    def : xxevalPattern<(and v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 8>;
219681ad6265SDimitry Andric    // and(A, eqv(B, C))
219781ad6265SDimitry Andric    def : xxevalPattern<(and v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 9>;
219881ad6265SDimitry Andric    // and(A, nand(B, C))
219981ad6265SDimitry Andric    def : xxevalPattern<(and v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 14>;
220081ad6265SDimitry Andric
220181ad6265SDimitry Andric    // NAND
220281ad6265SDimitry Andric    // nand(A, B, C)
220381ad6265SDimitry Andric    def : xxevalPattern<(vnot (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC))),
220481ad6265SDimitry Andric                         !sub(255, 1)>;
220581ad6265SDimitry Andric    // nand(A, xor(B, C))
220681ad6265SDimitry Andric    def : xxevalPattern<(vnot (and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))),
220781ad6265SDimitry Andric                         !sub(255, 6)>;
220881ad6265SDimitry Andric    // nand(A, or(B, C))
220981ad6265SDimitry Andric    def : xxevalPattern<(vnot (and v4i32:$vA, (or v4i32:$vB, v4i32:$vC))),
221081ad6265SDimitry Andric                         !sub(255, 7)>;
221181ad6265SDimitry Andric    // nand(A, nor(B, C))
221281ad6265SDimitry Andric    def : xxevalPattern<(or (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)),
221381ad6265SDimitry Andric                         !sub(255, 8)>;
221481ad6265SDimitry Andric    // nand(A, eqv(B, C))
221581ad6265SDimitry Andric    def : xxevalPattern<(or (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)),
221681ad6265SDimitry Andric                         !sub(255, 9)>;
221781ad6265SDimitry Andric    // nand(A, nand(B, C))
221881ad6265SDimitry Andric    def : xxevalPattern<(or (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)),
221981ad6265SDimitry Andric                         !sub(255, 14)>;
222081ad6265SDimitry Andric
2221bdd1243dSDimitry Andric    // EQV
2222bdd1243dSDimitry Andric    // (eqv A, B, C)
2223bdd1243dSDimitry Andric    def : xxevalPattern<(or (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)),
2224bdd1243dSDimitry Andric                            (vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)))),
2225bdd1243dSDimitry Andric                         150>;
2226bdd1243dSDimitry Andric    // (eqv A, (and B, C))
2227bdd1243dSDimitry Andric    def : xxevalPattern<(vnot (xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 225>;
2228bdd1243dSDimitry Andric    // (eqv A, (or B, C))
2229bdd1243dSDimitry Andric    def : xxevalPattern<(vnot (xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 135>;
2230bdd1243dSDimitry Andric
2231bdd1243dSDimitry Andric    // NOR
2232bdd1243dSDimitry Andric    // (nor A, B, C)
2233bdd1243dSDimitry Andric    def : xxevalPattern<(vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 128>;
2234bdd1243dSDimitry Andric    // (nor A, (and B, C))
2235bdd1243dSDimitry Andric    def : xxevalPattern<(vnot (or v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 224>;
2236bdd1243dSDimitry Andric    // (nor A, (eqv B, C))
2237bdd1243dSDimitry Andric    def : xxevalPattern<(and (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 96>;
2238bdd1243dSDimitry Andric    // (nor A, (nand B, C))
2239bdd1243dSDimitry Andric    def : xxevalPattern<(and (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 16>;
2240bdd1243dSDimitry Andric    // (nor A, (nor B, C))
2241bdd1243dSDimitry Andric    def : xxevalPattern<(and (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 112>;
2242bdd1243dSDimitry Andric    // (nor A, (xor B, C))
2243bdd1243dSDimitry Andric    def : xxevalPattern<(vnot (or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 144>;
2244bdd1243dSDimitry Andric
2245bdd1243dSDimitry Andric    // OR
2246bdd1243dSDimitry Andric    // (or A, B, C)
2247bdd1243dSDimitry Andric    def : xxevalPattern<(or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 127>;
2248bdd1243dSDimitry Andric    // (or A, (and B, C))
2249bdd1243dSDimitry Andric    def : xxevalPattern<(or v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 31>;
2250bdd1243dSDimitry Andric    // (or A, (eqv B, C))
2251bdd1243dSDimitry Andric    def : xxevalPattern<(or v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 159>;
2252bdd1243dSDimitry Andric    // (or A, (nand B, C))
2253bdd1243dSDimitry Andric    def : xxevalPattern<(or v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 239>;
2254bdd1243dSDimitry Andric    // (or A, (nor B, C))
2255bdd1243dSDimitry Andric    def : xxevalPattern<(or v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 143>;
2256bdd1243dSDimitry Andric    // (or A, (xor B, C))
2257bdd1243dSDimitry Andric    def : xxevalPattern<(or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 111>;
2258bdd1243dSDimitry Andric
2259bdd1243dSDimitry Andric    // XOR
2260bdd1243dSDimitry Andric    // (xor A, B, C)
2261bdd1243dSDimitry Andric    def : xxevalPattern<(xor v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 105>;
2262bdd1243dSDimitry Andric    // (xor A, (and B, C))
2263bdd1243dSDimitry Andric    def : xxevalPattern<(xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 30>;
2264bdd1243dSDimitry Andric    // (xor A, (or B, C))
2265bdd1243dSDimitry Andric    def : xxevalPattern<(xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 120>;
2266bdd1243dSDimitry Andric
226781ad6265SDimitry Andric    // Anonymous patterns to select prefixed VSX loads and stores.
226881ad6265SDimitry Andric    // Load / Store f128
226981ad6265SDimitry Andric    def : Pat<(f128 (load PDForm:$src)),
227081ad6265SDimitry Andric              (COPY_TO_REGCLASS (PLXV memri34:$src), VRRC)>;
227181ad6265SDimitry Andric    def : Pat<(store f128:$XS, PDForm:$dst),
227281ad6265SDimitry Andric              (PSTXV (COPY_TO_REGCLASS $XS, VSRC), memri34:$dst)>;
227381ad6265SDimitry Andric
227481ad6265SDimitry Andric    // Load / Store v4i32
227581ad6265SDimitry Andric    def : Pat<(v4i32 (load PDForm:$src)), (PLXV memri34:$src)>;
227681ad6265SDimitry Andric    def : Pat<(store v4i32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>;
227781ad6265SDimitry Andric
227881ad6265SDimitry Andric    // Load / Store v2i64
227981ad6265SDimitry Andric    def : Pat<(v2i64 (load PDForm:$src)), (PLXV memri34:$src)>;
228081ad6265SDimitry Andric    def : Pat<(store v2i64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>;
228181ad6265SDimitry Andric
228281ad6265SDimitry Andric    // Load / Store v4f32
228381ad6265SDimitry Andric    def : Pat<(v4f32 (load PDForm:$src)), (PLXV memri34:$src)>;
228481ad6265SDimitry Andric    def : Pat<(store v4f32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>;
228581ad6265SDimitry Andric
228681ad6265SDimitry Andric    // Load / Store v2f64
228781ad6265SDimitry Andric    def : Pat<(v2f64 (load PDForm:$src)), (PLXV memri34:$src)>;
228881ad6265SDimitry Andric    def : Pat<(store v2f64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>;
228981ad6265SDimitry Andric
229081ad6265SDimitry Andric    // Cases For PPCstore_scal_int_from_vsr
229106c3fb27SDimitry Andric    def : Pat<(PPCstore_scal_int_from_vsr f64:$src, PDForm:$dst, 8),
229206c3fb27SDimitry Andric              (PSTXSD $src, PDForm:$dst)>;
229306c3fb27SDimitry Andric    def : Pat<(PPCstore_scal_int_from_vsr f128:$src, PDForm:$dst, 8),
229406c3fb27SDimitry Andric              (PSTXSD (COPY_TO_REGCLASS $src, VFRC), PDForm:$dst)>;
229581ad6265SDimitry Andric    }
229681ad6265SDimitry Andric
2297*0fca6ea1SDimitry Andric
229881ad6265SDimitry Andric  def : Pat<(i32 imm34:$imm), (PLI (getImmAs64BitInt imm:$imm))>;
229981ad6265SDimitry Andric  def : Pat<(i64 imm34:$imm), (PLI8 (getImmAs64BitInt imm:$imm))>;
230081ad6265SDimitry Andric  def : Pat<(v16i8 (int_ppc_vsx_xxpermx v16i8:$A, v16i8:$B, v16i8:$C, timm:$D)),
230181ad6265SDimitry Andric            (COPY_TO_REGCLASS (XXPERMX (COPY_TO_REGCLASS $A, VSRC),
230281ad6265SDimitry Andric                                       (COPY_TO_REGCLASS $B, VSRC),
230381ad6265SDimitry Andric                                       (COPY_TO_REGCLASS $C, VSRC), $D), VSRC)>;
230481ad6265SDimitry Andric  def : Pat<(v16i8 (int_ppc_vsx_xxblendvb v16i8:$A, v16i8:$B, v16i8:$C)),
230581ad6265SDimitry Andric            (COPY_TO_REGCLASS
230681ad6265SDimitry Andric                   (XXBLENDVB (COPY_TO_REGCLASS $A, VSRC),
230781ad6265SDimitry Andric                              (COPY_TO_REGCLASS $B, VSRC),
230881ad6265SDimitry Andric                              (COPY_TO_REGCLASS $C, VSRC)), VSRC)>;
230981ad6265SDimitry Andric  def : Pat<(v8i16 (int_ppc_vsx_xxblendvh v8i16:$A, v8i16:$B, v8i16:$C)),
231081ad6265SDimitry Andric            (COPY_TO_REGCLASS
231181ad6265SDimitry Andric                   (XXBLENDVH (COPY_TO_REGCLASS $A, VSRC),
231281ad6265SDimitry Andric                              (COPY_TO_REGCLASS $B, VSRC),
231381ad6265SDimitry Andric                              (COPY_TO_REGCLASS $C, VSRC)), VSRC)>;
231481ad6265SDimitry Andric  def : Pat<(int_ppc_vsx_xxblendvw v4i32:$A, v4i32:$B, v4i32:$C),
231581ad6265SDimitry Andric            (XXBLENDVW $A, $B, $C)>;
231681ad6265SDimitry Andric  def : Pat<(int_ppc_vsx_xxblendvd v2i64:$A, v2i64:$B, v2i64:$C),
231781ad6265SDimitry Andric            (XXBLENDVD $A, $B, $C)>;
2318*0fca6ea1SDimitry Andric}
231981ad6265SDimitry Andric
2320*0fca6ea1SDimitry Andriclet Predicates = [PrefixInstrs] in {
232181ad6265SDimitry Andric  // Anonymous patterns to select prefixed loads and stores.
232281ad6265SDimitry Andric  // Load i32
232381ad6265SDimitry Andric  def : Pat<(i32 (extloadi1 PDForm:$src)), (PLBZ memri34:$src)>;
232481ad6265SDimitry Andric  def : Pat<(i32 (zextloadi1 PDForm:$src)), (PLBZ memri34:$src)>;
232581ad6265SDimitry Andric  def : Pat<(i32 (extloadi8 PDForm:$src)), (PLBZ memri34:$src)>;
232681ad6265SDimitry Andric  def : Pat<(i32 (zextloadi8 PDForm:$src)), (PLBZ memri34:$src)>;
232781ad6265SDimitry Andric  def : Pat<(i32 (extloadi16 PDForm:$src)), (PLHZ memri34:$src)>;
232881ad6265SDimitry Andric  def : Pat<(i32 (zextloadi16 PDForm:$src)), (PLHZ memri34:$src)>;
232981ad6265SDimitry Andric  def : Pat<(i32 (sextloadi16 PDForm:$src)), (PLHA memri34:$src)>;
233081ad6265SDimitry Andric  def : Pat<(i32 (load PDForm:$src)), (PLWZ memri34:$src)>;
233181ad6265SDimitry Andric
233281ad6265SDimitry Andric  // Store i32
233381ad6265SDimitry Andric  def : Pat<(truncstorei8 i32:$rS, PDForm:$dst), (PSTB gprc:$rS, memri34:$dst)>;
233481ad6265SDimitry Andric  def : Pat<(truncstorei16 i32:$rS, PDForm:$dst), (PSTH gprc:$rS, memri34:$dst)>;
233581ad6265SDimitry Andric  def : Pat<(store i32:$rS, PDForm:$dst), (PSTW gprc:$rS, memri34:$dst)>;
233681ad6265SDimitry Andric
233781ad6265SDimitry Andric  // Load i64
233881ad6265SDimitry Andric  def : Pat<(i64 (extloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>;
233981ad6265SDimitry Andric  def : Pat<(i64 (zextloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>;
234081ad6265SDimitry Andric  def : Pat<(i64 (extloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>;
234181ad6265SDimitry Andric  def : Pat<(i64 (zextloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>;
234281ad6265SDimitry Andric  def : Pat<(i64 (extloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>;
234381ad6265SDimitry Andric  def : Pat<(i64 (zextloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>;
234481ad6265SDimitry Andric  def : Pat<(i64 (sextloadi16 PDForm:$src)), (PLHA8 memri34:$src)>;
234581ad6265SDimitry Andric  def : Pat<(i64 (extloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>;
234681ad6265SDimitry Andric  def : Pat<(i64 (zextloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>;
234781ad6265SDimitry Andric  def : Pat<(i64 (sextloadi32 PDForm:$src)), (PLWA8 memri34:$src)>;
234881ad6265SDimitry Andric  def : Pat<(i64 (load PDForm:$src)), (PLD memri34:$src)>;
234981ad6265SDimitry Andric
235081ad6265SDimitry Andric  // Store i64
235181ad6265SDimitry Andric  def : Pat<(truncstorei8 i64:$rS, PDForm:$dst), (PSTB8 g8rc:$rS, memri34:$dst)>;
235281ad6265SDimitry Andric  def : Pat<(truncstorei16 i64:$rS, PDForm:$dst), (PSTH8 g8rc:$rS, memri34:$dst)>;
235381ad6265SDimitry Andric  def : Pat<(truncstorei32 i64:$rS, PDForm:$dst), (PSTW8 g8rc:$rS, memri34:$dst)>;
235481ad6265SDimitry Andric  def : Pat<(store i64:$rS, PDForm:$dst), (PSTD g8rc:$rS, memri34:$dst)>;
235581ad6265SDimitry Andric
2356*0fca6ea1SDimitry Andric  // Atomic Load
2357*0fca6ea1SDimitry Andric  def : Pat<(i32 (atomic_load_8 PDForm:$src)), (PLBZ memri34:$src)>;
2358*0fca6ea1SDimitry Andric  def : Pat<(i32 (atomic_load_16 PDForm:$src)), (PLHZ memri34:$src)>;
2359*0fca6ea1SDimitry Andric  def : Pat<(i32 (atomic_load_32 PDForm:$src)), (PLWZ memri34:$src)>;
2360*0fca6ea1SDimitry Andric  def : Pat<(i64 (atomic_load_64 PDForm:$src)), (PLD memri34:$src)>;
2361*0fca6ea1SDimitry Andric
2362*0fca6ea1SDimitry Andric  // Atomic Store
2363*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_8 i32:$RS, PDForm:$dst), (PSTB $RS, memri34:$dst)>;
2364*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_16 i32:$RS, PDForm:$dst), (PSTH $RS, memri34:$dst)>;
2365*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_32 i32:$RS, PDForm:$dst), (PSTW $RS, memri34:$dst)>;
2366*0fca6ea1SDimitry Andric  def : Pat<(atomic_store_64 i64:$RS, PDForm:$dst), (PSTD $RS, memri34:$dst)>;
2367*0fca6ea1SDimitry Andric}
2368*0fca6ea1SDimitry Andric
2369*0fca6ea1SDimitry Andriclet Predicates = [PrefixInstrs, HasFPU] in {
237081ad6265SDimitry Andric  // Load / Store f32
237181ad6265SDimitry Andric  def : Pat<(f32 (load PDForm:$src)), (PLFS memri34:$src)>;
237281ad6265SDimitry Andric  def : Pat<(store f32:$FRS, PDForm:$dst), (PSTFS $FRS, memri34:$dst)>;
237381ad6265SDimitry Andric
237481ad6265SDimitry Andric  // Load / Store f64
237581ad6265SDimitry Andric  def : Pat<(f64 (extloadf32 PDForm:$src)),
237681ad6265SDimitry Andric            (COPY_TO_REGCLASS (PLFS memri34:$src), VSFRC)>;
237781ad6265SDimitry Andric  def : Pat<(f64 (load PDForm:$src)), (PLFD memri34:$src)>;
237881ad6265SDimitry Andric  def : Pat<(store f64:$FRS, PDForm:$dst), (PSTFD $FRS, memri34:$dst)>;
237981ad6265SDimitry Andric  // Prefixed fpext to v2f64
238081ad6265SDimitry Andric  def : Pat<(v4f32 (PPCldvsxlh PDForm:$src)),
238181ad6265SDimitry Andric            (SUBREG_TO_REG (i64 1), (PLFD PDForm:$src), sub_64)>;
2382*0fca6ea1SDimitry Andric
238381ad6265SDimitry Andric}
238481ad6265SDimitry Andric
238581ad6265SDimitry Andricdef InsertEltShift {
238681ad6265SDimitry Andric  dag Sub32 = (i32 (EXTRACT_SUBREG $rB, sub_32));
238781ad6265SDimitry Andric  dag Sub32Left1 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 1, 0, 30);
238881ad6265SDimitry Andric  dag Sub32Left2 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 2, 0, 29);
238981ad6265SDimitry Andric  dag Left1 = (RLWINM $rB, 1, 0, 30);
239081ad6265SDimitry Andric  dag Left2 = (RLWINM $rB, 2, 0, 29);
239181ad6265SDimitry Andric  dag Left3 = (RLWINM8 $rB, 3, 0, 28);
239281ad6265SDimitry Andric}
239381ad6265SDimitry Andric
239481ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsLittleEndian] in {
239581ad6265SDimitry Andric  // Indexed vector insert element
239681ad6265SDimitry Andric  def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)),
239781ad6265SDimitry Andric            (VINSBRX $vDi, InsertEltShift.Sub32, $rA)>;
239881ad6265SDimitry Andric  def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)),
239981ad6265SDimitry Andric            (VINSHRX $vDi, InsertEltShift.Sub32Left1, $rA)>;
240081ad6265SDimitry Andric  def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)),
240181ad6265SDimitry Andric            (VINSWRX $vDi, InsertEltShift.Sub32Left2, $rA)>;
240281ad6265SDimitry Andric  def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)),
240381ad6265SDimitry Andric            (VINSDRX $vDi, InsertEltShift.Left3, $rA)>;
240481ad6265SDimitry Andric
240581ad6265SDimitry Andric  def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)),
240681ad6265SDimitry Andric            (VINSWVRX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>;
240781ad6265SDimitry Andric
240881ad6265SDimitry Andric  def : Pat<(v2f64 (insertelt v2f64:$vDi,  f64:$A, i64:$rB)),
240981ad6265SDimitry Andric            (VINSDRX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>;
241081ad6265SDimitry Andric  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)),
241181ad6265SDimitry Andric            (VINSDRX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>;
241281ad6265SDimitry Andric  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)),
241381ad6265SDimitry Andric            (VINSDRX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>;
241481ad6265SDimitry Andric  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)),
241581ad6265SDimitry Andric            (VINSDRX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>;
241681ad6265SDimitry Andric  let AddedComplexity = 400 in {
241781ad6265SDimitry Andric    // Immediate vector insert element
241881ad6265SDimitry Andric    foreach Idx = [0, 1, 2, 3] in {
241981ad6265SDimitry Andric      def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, Idx)),
242081ad6265SDimitry Andric                (VINSW $vDi, !mul(!sub(3, Idx), 4), $rA)>;
242181ad6265SDimitry Andric    }
242281ad6265SDimitry Andric    foreach i = [0, 1] in
242381ad6265SDimitry Andric     def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, (i64 i))),
242481ad6265SDimitry Andric               (VINSD $vDi, !mul(!sub(1, i), 8), $rA)>;
242581ad6265SDimitry Andric  }
242681ad6265SDimitry Andric}
242781ad6265SDimitry Andric
242881ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC32] in {
242981ad6265SDimitry Andric  // Indexed vector insert element
243081ad6265SDimitry Andric  def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i32:$rB)),
243181ad6265SDimitry Andric            (VINSBLX $vDi, $rB, $rA)>;
243281ad6265SDimitry Andric  def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i32:$rB)),
243381ad6265SDimitry Andric            (VINSHLX $vDi, InsertEltShift.Left1, $rA)>;
243481ad6265SDimitry Andric  def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i32:$rB)),
243581ad6265SDimitry Andric            (VINSWLX $vDi, InsertEltShift.Left2, $rA)>;
243681ad6265SDimitry Andric
243781ad6265SDimitry Andric  def : Pat<(v4f32 (insertelt v4f32:$vDi,  f32:$rA, i32:$rB)),
243881ad6265SDimitry Andric            (VINSWVLX $vDi, InsertEltShift.Left2, (XSCVDPSPN $rA))>;
243981ad6265SDimitry Andric}
244081ad6265SDimitry Andric
244181ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC64] in {
244281ad6265SDimitry Andric  // Indexed vector insert element
244381ad6265SDimitry Andric  def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)),
244481ad6265SDimitry Andric            (VINSBLX $vDi, InsertEltShift.Sub32, $rA)>;
244581ad6265SDimitry Andric  def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)),
244681ad6265SDimitry Andric            (VINSHLX $vDi, InsertEltShift.Sub32Left1, $rA)>;
244781ad6265SDimitry Andric  def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)),
244881ad6265SDimitry Andric            (VINSWLX $vDi, InsertEltShift.Sub32Left2, $rA)>;
244981ad6265SDimitry Andric  def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)),
245081ad6265SDimitry Andric            (VINSDLX $vDi, InsertEltShift.Left3, $rA)>;
245181ad6265SDimitry Andric
245281ad6265SDimitry Andric  def : Pat<(v4f32 (insertelt v4f32:$vDi,  f32:$rA, i64:$rB)),
245381ad6265SDimitry Andric            (VINSWVLX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>;
245481ad6265SDimitry Andric
245581ad6265SDimitry Andric  def : Pat<(v2f64 (insertelt v2f64:$vDi,  f64:$A, i64:$rB)),
245681ad6265SDimitry Andric            (VINSDLX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>;
245781ad6265SDimitry Andric  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)),
245881ad6265SDimitry Andric            (VINSDLX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>;
245981ad6265SDimitry Andric  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)),
246081ad6265SDimitry Andric            (VINSDLX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>;
246181ad6265SDimitry Andric  def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)),
246281ad6265SDimitry Andric            (VINSDLX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>;
246381ad6265SDimitry Andric}
246481ad6265SDimitry Andric
246581ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX, IsBigEndian] in {
246681ad6265SDimitry Andric  // Immediate vector insert element
246781ad6265SDimitry Andric  foreach Ty = [i32, i64] in {
246881ad6265SDimitry Andric    foreach Idx = [0, 1, 2, 3] in {
246981ad6265SDimitry Andric      def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, (Ty Idx))),
247081ad6265SDimitry Andric               (VINSW $vDi, !mul(Idx, 4), $rA)>;
247181ad6265SDimitry Andric    }
247281ad6265SDimitry Andric  }
247381ad6265SDimitry Andric
247481ad6265SDimitry Andric  foreach Idx = [0, 1] in
247581ad6265SDimitry Andric    def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, Idx)),
247681ad6265SDimitry Andric              (VINSD $vDi, !mul(Idx, 8), $rA)>;
247781ad6265SDimitry Andric}
24785f757f3fSDimitry Andric
24795f757f3fSDimitry Andric
24805f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
24815f757f3fSDimitry Andric// PowerPC ISA 3.1 Extended Mnemonics.
24825f757f3fSDimitry Andric//
24835f757f3fSDimitry Andric
24845f757f3fSDimitry Andriclet Predicates = [IsISA3_1] in {
24855f757f3fSDimitry Andric  def : InstAlias<"wait", (WAITP10 0, 0)>;
24865f757f3fSDimitry Andric  def : InstAlias<"wait 0", (WAITP10 0, 0), 0>;
24875f757f3fSDimitry Andric  def : InstAlias<"wait 1", (WAITP10 1, 0), 0>;
24885f757f3fSDimitry Andric  def : InstAlias<"waitrsv", (WAITP10 1, 0)>;
24895f757f3fSDimitry Andric  def : InstAlias<"pause_short", (WAITP10 2, 0), 0>;
24905f757f3fSDimitry Andric
24915f757f3fSDimitry Andric  def : InstAlias<"sync", (SYNCP10 0, 0)>;
24925f757f3fSDimitry Andric  def : InstAlias<"hwsync", (SYNCP10 0, 0), 0>;
24935f757f3fSDimitry Andric  def : InstAlias<"wsync", (SYNCP10 1, 0), 0>;
24945f757f3fSDimitry Andric  def : InstAlias<"ptesync", (SYNCP10 2, 0)>;
24955f757f3fSDimitry Andric  def : InstAlias<"phwsync", (SYNCP10 4, 0)>;
24965f757f3fSDimitry Andric  def : InstAlias<"plwsync", (SYNCP10 5, 0)>;
24975f757f3fSDimitry Andric  def : InstAlias<"sync $L", (SYNCP10 u3imm:$L, 0)>;
24985f757f3fSDimitry Andric  def : InstAlias<"stncisync", (SYNCP10 1, 1)>;
24995f757f3fSDimitry Andric  def : InstAlias<"stcisync", (SYNCP10 0, 2)>;
25005f757f3fSDimitry Andric  def : InstAlias<"stsync", (SYNCP10 0, 3)>;
25015f757f3fSDimitry Andric
25025f757f3fSDimitry Andric  def : InstAlias<"paddi $RT, $RA, $SI", (PADDI8 g8rc:$RT, g8rc_nox0:$RA, s34imm:$SI)>;
25035f757f3fSDimitry Andric}
25045f757f3fSDimitry Andric
25055f757f3fSDimitry Andriclet Predicates = [IsISA3_1, PrefixInstrs], isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in {
25065f757f3fSDimitry Andric  let Interpretation64Bit = 1 in {
25075f757f3fSDimitry Andric    def PLA8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT),
25085f757f3fSDimitry Andric                                  (ins g8rc_nox0:$RA, s34imm:$SI),
25095f757f3fSDimitry Andric                                  "pla $RT, ${SI} ${RA}", IIC_IntSimple, []>;
25105f757f3fSDimitry Andric    def PLA8pc : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT),
25115f757f3fSDimitry Andric                                    (ins s34imm_pcrel:$SI),
25125f757f3fSDimitry Andric                                    "pla $RT, $SI", IIC_IntSimple, []>, isPCRel;
25135f757f3fSDimitry Andric  }
25145f757f3fSDimitry Andric
25155f757f3fSDimitry Andric  def PSUBI : PPCAsmPseudo<"psubi $RT, $RA, $SI",
25165f757f3fSDimitry Andric                           (ins g8rc:$RT, g8rc_nox0:$RA, s34imm:$SI)>;
25175f757f3fSDimitry Andric
25185f757f3fSDimitry Andric  def PLA : MLS_DForm_SI34_RT5<14, (outs gprc:$RT),
25195f757f3fSDimitry Andric                               (ins gprc_nor0:$RA, s34imm:$SI),
25205f757f3fSDimitry Andric                               "pla $RT, ${SI} ${RA}", IIC_IntSimple, []>;
25215f757f3fSDimitry Andric  def PLApc : MLS_DForm_SI34_RT5<14, (outs gprc:$RT),
25225f757f3fSDimitry Andric                                 (ins s34imm_pcrel:$SI),
25235f757f3fSDimitry Andric                                 "pla $RT, $SI", IIC_IntSimple, []>, isPCRel;
25245f757f3fSDimitry Andric}
2525