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