181ad6265SDimitry Andric//===-- PPCInstrP10.td - Power10 Instruction Set -----------*- tablegen -*-===// 281ad6265SDimitry Andric// 381ad6265SDimitry Andric// The LLVM Compiler Infrastructure 481ad6265SDimitry Andric// 581ad6265SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 681ad6265SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 781ad6265SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 881ad6265SDimitry Andric// 981ad6265SDimitry Andric//===----------------------------------------------------------------------===// 1081ad6265SDimitry Andric// 1181ad6265SDimitry Andric// This file describes the instructions introduced for the Power10 CPU. 1281ad6265SDimitry Andric// 1381ad6265SDimitry Andric//===----------------------------------------------------------------------===// 1481ad6265SDimitry Andric 1581ad6265SDimitry Andric//===----------------------------------------------------------------------===// 1681ad6265SDimitry Andric// Naming convention for future instruction formats 1781ad6265SDimitry Andric// 1881ad6265SDimitry Andric// <INSTR_FORM>{_<OP_TYPE><OP_LENGTH>}+ 1981ad6265SDimitry Andric// 2081ad6265SDimitry Andric// Where: 2181ad6265SDimitry Andric// <INSTR_FORM> - name of instruction format as per the ISA 2281ad6265SDimitry Andric// (X-Form, VX-Form, etc.) 2381ad6265SDimitry Andric// <OP_TYPE> - operand type 2481ad6265SDimitry Andric// * FRT/RT/VT/XT/BT - target register 2581ad6265SDimitry Andric// (FPR, GPR, VR, VSR, CR-bit respectively) 2681ad6265SDimitry Andric// In some situations, the 'T' is replaced by 2781ad6265SDimitry Andric// 'D' when describing the target register. 2881ad6265SDimitry Andric// * [FR|R|V|X|B][A-Z] - register source (i.e. FRA, RA, XB, etc.) 2981ad6265SDimitry Andric// * IMM - immediate (where signedness matters, 3081ad6265SDimitry Andric// this is SI/UI for signed/unsigned) 3181ad6265SDimitry Andric// * [R|X|FR]Tp - register pair target (i.e. FRTp, RTp) 3281ad6265SDimitry Andric// * R - PC-Relative bit 3381ad6265SDimitry Andric// (denotes that the address is computed pc-relative) 3481ad6265SDimitry Andric// * VRM - Masked Registers 3581ad6265SDimitry Andric// * AT - target accumulator 3681ad6265SDimitry Andric// * N - the Nth bit in a VSR 3781ad6265SDimitry Andric// * Additional 1-bit operands may be required for certain 3881ad6265SDimitry Andric// instruction formats such as: MC, P, MP 3981ad6265SDimitry Andric// * X / Y / P - mask values. In the instruction encoding, this is 4081ad6265SDimitry Andric// represented as XMSK, YMSK and PMSK. 4181ad6265SDimitry Andric// * MEM - indicates if the instruction format requires any memory 4281ad6265SDimitry Andric// accesses. This does not have <OP_LENGTH> attached to it. 4381ad6265SDimitry Andric// <OP_LENGTH> - the length of each operand in bits. 4481ad6265SDimitry Andric// For operands that are 1 bit, the '1' is omitted from the name. 4581ad6265SDimitry Andric// 4681ad6265SDimitry Andric// Example: 8RR_XX4Form_IMM8_XTAB6 4781ad6265SDimitry Andric// 8RR_XX4Form is the instruction format. 4881ad6265SDimitry Andric// The operand is an 8-bit immediate (IMM), the destination (XT) 4981ad6265SDimitry Andric// and sources (XA, XB) that are all 6-bits. The destination and 5081ad6265SDimitry Andric// source registers are combined if they are of the same length. 5181ad6265SDimitry Andric// Moreover, the order of operands reflects the order of operands 5281ad6265SDimitry Andric// in the encoding. 5381ad6265SDimitry Andric 5481ad6265SDimitry Andric//-------------------------- Predicate definitions ---------------------------// 5581ad6265SDimitry Andricdef IsPPC32 : Predicate<"!Subtarget->isPPC64()">; 5681ad6265SDimitry Andric 5781ad6265SDimitry Andric 5881ad6265SDimitry Andric//===----------------------------------------------------------------------===// 5981ad6265SDimitry Andric// PowerPC ISA 3.1 specific type constraints. 6081ad6265SDimitry Andric// 6181ad6265SDimitry Andric 6281ad6265SDimitry Andricdef SDT_PPCSplat32 : SDTypeProfile<1, 3, [ SDTCisVT<0, v2i64>, 6381ad6265SDimitry Andric SDTCisVec<1>, SDTCisInt<2>, SDTCisInt<3> 6481ad6265SDimitry Andric]>; 6581ad6265SDimitry Andricdef SDT_PPCAccBuild : SDTypeProfile<1, 4, [ 6681ad6265SDimitry Andric SDTCisVT<0, v512i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32>, 6781ad6265SDimitry Andric SDTCisVT<3, v4i32>, SDTCisVT<4, v4i32> 6881ad6265SDimitry Andric]>; 6981ad6265SDimitry Andricdef SDT_PPCPairBuild : SDTypeProfile<1, 2, [ 7081ad6265SDimitry Andric SDTCisVT<0, v256i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32> 7181ad6265SDimitry Andric]>; 7281ad6265SDimitry Andricdef SDT_PPCAccExtractVsx : SDTypeProfile<1, 2, [ 7381ad6265SDimitry Andric SDTCisVT<0, v4i32>, SDTCisVT<1, v512i1>, SDTCisPtrTy<2> 7481ad6265SDimitry Andric]>; 7581ad6265SDimitry Andricdef SDT_PPCPairExtractVsx : SDTypeProfile<1, 2, [ 7681ad6265SDimitry Andric SDTCisVT<0, v4i32>, SDTCisVT<1, v256i1>, SDTCisPtrTy<2> 7781ad6265SDimitry Andric]>; 7881ad6265SDimitry Andricdef SDT_PPCxxmfacc : SDTypeProfile<1, 1, [ 7981ad6265SDimitry Andric SDTCisVT<0, v512i1>, SDTCisVT<1, v512i1> 8081ad6265SDimitry Andric]>; 8181ad6265SDimitry Andric 8281ad6265SDimitry Andric//===----------------------------------------------------------------------===// 8381ad6265SDimitry Andric// ISA 3.1 specific PPCISD nodes. 8481ad6265SDimitry Andric// 8581ad6265SDimitry Andric 8681ad6265SDimitry Andricdef PPCxxsplti32dx : SDNode<"PPCISD::XXSPLTI32DX", SDT_PPCSplat32, []>; 8781ad6265SDimitry Andricdef PPCAccBuild : SDNode<"PPCISD::ACC_BUILD", SDT_PPCAccBuild, []>; 8881ad6265SDimitry Andricdef PPCPairBuild : SDNode<"PPCISD::PAIR_BUILD", SDT_PPCPairBuild, []>; 8981ad6265SDimitry Andricdef PPCAccExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCAccExtractVsx, 9081ad6265SDimitry Andric []>; 9181ad6265SDimitry Andricdef PPCPairExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCPairExtractVsx, 9281ad6265SDimitry Andric []>; 9381ad6265SDimitry Andricdef PPCxxmfacc : SDNode<"PPCISD::XXMFACC", SDT_PPCxxmfacc, []>; 9481ad6265SDimitry Andric 9581ad6265SDimitry Andric//===----------------------------------------------------------------------===// 9681ad6265SDimitry Andric 9781ad6265SDimitry Andric// PC Relative flag (for instructions that use the address of the prefix for 9881ad6265SDimitry Andric// address computations). 9981ad6265SDimitry Andricclass isPCRel { bit PCRel = 1; } 10081ad6265SDimitry Andric 10181ad6265SDimitry Andric// PowerPC specific type constraints. 10281ad6265SDimitry Andricdef SDT_PPCLXVRZX : SDTypeProfile<1, 2, [ 10381ad6265SDimitry Andric SDTCisVT<0, v1i128>, SDTCisPtrTy<1>, SDTCisPtrTy<2> 10481ad6265SDimitry Andric]>; 10581ad6265SDimitry Andric 10681ad6265SDimitry Andric// PPC Specific DAG Nodes. 10781ad6265SDimitry Andricdef PPClxvrzx : SDNode<"PPCISD::LXVRZX", SDT_PPCLXVRZX, 10881ad6265SDimitry Andric [SDNPHasChain, SDNPMayLoad]>; 10981ad6265SDimitry Andric 11081ad6265SDimitry Andric// Top-level class for prefixed instructions. 11181ad6265SDimitry Andricclass PI<bits<6> pref, bits<6> opcode, dag OOL, dag IOL, string asmstr, 11281ad6265SDimitry Andric InstrItinClass itin> : Instruction { 11381ad6265SDimitry Andric field bits<64> Inst; 11481ad6265SDimitry Andric field bits<64> SoftFail = 0; 11581ad6265SDimitry Andric bit PCRel = 0; // Default value, set by isPCRel. 11681ad6265SDimitry Andric let Size = 8; 11781ad6265SDimitry Andric 11881ad6265SDimitry Andric let Namespace = "PPC"; 11981ad6265SDimitry Andric let OutOperandList = OOL; 12081ad6265SDimitry Andric let InOperandList = IOL; 12181ad6265SDimitry Andric let AsmString = asmstr; 12281ad6265SDimitry Andric let Itinerary = itin; 12381ad6265SDimitry Andric let Inst{0-5} = pref; 12481ad6265SDimitry Andric let Inst{32-37} = opcode; 12581ad6265SDimitry Andric 12681ad6265SDimitry Andric bits<1> PPC970_First = 0; 12781ad6265SDimitry Andric bits<1> PPC970_Single = 0; 12881ad6265SDimitry Andric bits<1> PPC970_Cracked = 0; 12981ad6265SDimitry Andric bits<3> PPC970_Unit = 0; 13081ad6265SDimitry Andric 13181ad6265SDimitry Andric /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to 13281ad6265SDimitry Andric /// these must be reflected there! See comments there for what these are. 13381ad6265SDimitry Andric let TSFlags{0} = PPC970_First; 13481ad6265SDimitry Andric let TSFlags{1} = PPC970_Single; 13581ad6265SDimitry Andric let TSFlags{2} = PPC970_Cracked; 13681ad6265SDimitry Andric let TSFlags{5-3} = PPC970_Unit; 13781ad6265SDimitry Andric 13881ad6265SDimitry Andric bits<1> Prefixed = 1; // This is a prefixed instruction. 13981ad6265SDimitry Andric let TSFlags{7} = Prefixed; 14081ad6265SDimitry Andric 14181ad6265SDimitry Andric // For cases where multiple instruction definitions really represent the 14281ad6265SDimitry Andric // same underlying instruction but with one definition for 64-bit arguments 14381ad6265SDimitry Andric // and one for 32-bit arguments, this bit breaks the degeneracy between 14481ad6265SDimitry Andric // the two forms and allows TableGen to generate mapping tables. 14581ad6265SDimitry Andric bit Interpretation64Bit = 0; 14681ad6265SDimitry Andric 14781ad6265SDimitry Andric // Fields used for relation models. 14881ad6265SDimitry Andric string BaseName = ""; 14981ad6265SDimitry Andric} 15081ad6265SDimitry Andric 15181ad6265SDimitry Andric// VX-Form: [ PO VT R VB RC XO ] 15281ad6265SDimitry Andricclass VXForm_VTB5_RC<bits<10> xo, bits<5> R, dag OOL, dag IOL, string asmstr, 15381ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 15481ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 15581ad6265SDimitry Andric bits<5> VT; 15681ad6265SDimitry Andric bits<5> VB; 15781ad6265SDimitry Andric bit RC = 0; 15881ad6265SDimitry Andric 15981ad6265SDimitry Andric let Pattern = pattern; 16081ad6265SDimitry Andric 16181ad6265SDimitry Andric let Inst{6-10} = VT; 16281ad6265SDimitry Andric let Inst{11-15} = R; 16381ad6265SDimitry Andric let Inst{16-20} = VB; 16481ad6265SDimitry Andric let Inst{21} = RC; 16581ad6265SDimitry Andric let Inst{22-31} = xo; 16681ad6265SDimitry Andric} 16781ad6265SDimitry Andric 16881ad6265SDimitry Andric// Multiclass definition to account for record and non-record form 16981ad6265SDimitry Andric// instructions of VXRForm. 17081ad6265SDimitry Andricmulticlass VXForm_VTB5_RCr<bits<10> xo, bits<5> R, dag OOL, dag IOL, 17181ad6265SDimitry Andric string asmbase, string asmstr, 17281ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> { 17381ad6265SDimitry Andric let BaseName = asmbase in { 17481ad6265SDimitry Andric def NAME : VXForm_VTB5_RC<xo, R, OOL, IOL, 17581ad6265SDimitry Andric !strconcat(asmbase, !strconcat(" ", asmstr)), 17681ad6265SDimitry Andric itin, pattern>, RecFormRel; 17781ad6265SDimitry Andric let Defs = [CR6] in 17881ad6265SDimitry Andric def _rec : VXForm_VTB5_RC<xo, R, OOL, IOL, 17981ad6265SDimitry Andric !strconcat(asmbase, !strconcat(". ", asmstr)), 18081ad6265SDimitry Andric itin, []>, isRecordForm, RecFormRel; 18181ad6265SDimitry Andric } 18281ad6265SDimitry Andric} 18381ad6265SDimitry Andric 18481ad6265SDimitry Andricclass MLS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 18581ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 18681ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 18781ad6265SDimitry Andric bits<5> FRS; 18881ad6265SDimitry Andric bits<39> D_RA; 18981ad6265SDimitry Andric 19081ad6265SDimitry Andric let Pattern = pattern; 19181ad6265SDimitry Andric 19281ad6265SDimitry Andric // The prefix. 19381ad6265SDimitry Andric let Inst{6-7} = 2; 19481ad6265SDimitry Andric let Inst{8-10} = 0; 19581ad6265SDimitry Andric let Inst{11} = PCRel; 19681ad6265SDimitry Andric let Inst{12-13} = 0; 19781ad6265SDimitry Andric let Inst{14-31} = D_RA{33-16}; // d0 19881ad6265SDimitry Andric 19981ad6265SDimitry Andric // The instruction. 20081ad6265SDimitry Andric let Inst{38-42} = FRS{4-0}; 20181ad6265SDimitry Andric let Inst{43-47} = D_RA{38-34}; // RA 20281ad6265SDimitry Andric let Inst{48-63} = D_RA{15-0}; // d1 20381ad6265SDimitry Andric} 20481ad6265SDimitry Andric 20581ad6265SDimitry Andricclass MLS_DForm_R_SI34_RTA5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 20681ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 20781ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 20881ad6265SDimitry Andric bits<5> RT; 20981ad6265SDimitry Andric bits<5> RA; 21081ad6265SDimitry Andric bits<34> SI; 21181ad6265SDimitry Andric 21281ad6265SDimitry Andric let Pattern = pattern; 21381ad6265SDimitry Andric 21481ad6265SDimitry Andric // The prefix. 21581ad6265SDimitry Andric let Inst{6-7} = 2; 21681ad6265SDimitry Andric let Inst{8-10} = 0; 21781ad6265SDimitry Andric let Inst{11} = PCRel; 21881ad6265SDimitry Andric let Inst{12-13} = 0; 21981ad6265SDimitry Andric let Inst{14-31} = SI{33-16}; 22081ad6265SDimitry Andric 22181ad6265SDimitry Andric // The instruction. 22281ad6265SDimitry Andric let Inst{38-42} = RT; 22381ad6265SDimitry Andric let Inst{43-47} = RA; 22481ad6265SDimitry Andric let Inst{48-63} = SI{15-0}; 22581ad6265SDimitry Andric} 22681ad6265SDimitry Andric 22781ad6265SDimitry Andricclass MLS_DForm_SI34_RT5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 22881ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 22981ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 23081ad6265SDimitry Andric bits<5> RT; 23181ad6265SDimitry Andric bits<34> SI; 23281ad6265SDimitry Andric 23381ad6265SDimitry Andric let Pattern = pattern; 23481ad6265SDimitry Andric 23581ad6265SDimitry Andric // The prefix. 23681ad6265SDimitry Andric let Inst{6-7} = 2; 23781ad6265SDimitry Andric let Inst{8-10} = 0; 23881ad6265SDimitry Andric let Inst{11} = 0; 23981ad6265SDimitry Andric let Inst{12-13} = 0; 24081ad6265SDimitry Andric let Inst{14-31} = SI{33-16}; 24181ad6265SDimitry Andric 24281ad6265SDimitry Andric // The instruction. 24381ad6265SDimitry Andric let Inst{38-42} = RT; 24481ad6265SDimitry Andric let Inst{43-47} = 0; 24581ad6265SDimitry Andric let Inst{48-63} = SI{15-0}; 24681ad6265SDimitry Andric} 24781ad6265SDimitry Andric 24881ad6265SDimitry Andricmulticlass MLS_DForm_R_SI34_RTA5_p<bits<6> opcode, dag OOL, dag IOL, 24981ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 25081ad6265SDimitry Andric InstrItinClass itin> { 25181ad6265SDimitry Andric def NAME : MLS_DForm_R_SI34_RTA5<opcode, OOL, IOL, 25281ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 25381ad6265SDimitry Andric def pc : MLS_DForm_R_SI34_RTA5<opcode, OOL, PCRel_IOL, 25481ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, isPCRel; 25581ad6265SDimitry Andric} 25681ad6265SDimitry Andric 25781ad6265SDimitry Andricclass 8LS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 25881ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 25981ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 26081ad6265SDimitry Andric bits<5> RT; 26181ad6265SDimitry Andric bits<39> D_RA; 26281ad6265SDimitry Andric 26381ad6265SDimitry Andric let Pattern = pattern; 26481ad6265SDimitry Andric 26581ad6265SDimitry Andric // The prefix. 26681ad6265SDimitry Andric let Inst{6-10} = 0; 26781ad6265SDimitry Andric let Inst{11} = PCRel; 26881ad6265SDimitry Andric let Inst{12-13} = 0; 26981ad6265SDimitry Andric let Inst{14-31} = D_RA{33-16}; // d0 27081ad6265SDimitry Andric 27181ad6265SDimitry Andric // The instruction. 27281ad6265SDimitry Andric let Inst{38-42} = RT{4-0}; 27381ad6265SDimitry Andric let Inst{43-47} = D_RA{38-34}; // RA 27481ad6265SDimitry Andric let Inst{48-63} = D_RA{15-0}; // d1 27581ad6265SDimitry Andric} 27681ad6265SDimitry Andric 27781ad6265SDimitry Andric// 8LS:D-Form: [ 1 0 0 // R // d0 27881ad6265SDimitry Andric// PO TX T RA d1 ] 27981ad6265SDimitry Andricclass 8LS_DForm_R_SI34_XT6_RA5_MEM<bits<5> opcode, dag OOL, dag IOL, 28081ad6265SDimitry Andric string asmstr, InstrItinClass itin, 28181ad6265SDimitry Andric list<dag> pattern> 28281ad6265SDimitry Andric : PI<1, { opcode, ? }, OOL, IOL, asmstr, itin> { 28381ad6265SDimitry Andric bits<6> XT; 28481ad6265SDimitry Andric bits<39> D_RA; 28581ad6265SDimitry Andric 28681ad6265SDimitry Andric let Pattern = pattern; 28781ad6265SDimitry Andric 28881ad6265SDimitry Andric // The prefix. 28981ad6265SDimitry Andric let Inst{6-7} = 0; 29081ad6265SDimitry Andric let Inst{8} = 0; 29181ad6265SDimitry Andric let Inst{9-10} = 0; // reserved 29281ad6265SDimitry Andric let Inst{11} = PCRel; 29381ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 29481ad6265SDimitry Andric let Inst{14-31} = D_RA{33-16}; // d0 29581ad6265SDimitry Andric 29681ad6265SDimitry Andric // The instruction. 29781ad6265SDimitry Andric let Inst{37} = XT{5}; 29881ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 29981ad6265SDimitry Andric let Inst{43-47} = D_RA{38-34}; // RA 30081ad6265SDimitry Andric let Inst{48-63} = D_RA{15-0}; // d1 30181ad6265SDimitry Andric} 30281ad6265SDimitry Andric 30381ad6265SDimitry Andric// X-Form: [PO T IMM VRB XO TX] 30481ad6265SDimitry Andricclass XForm_XT6_IMM5_VB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 30581ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 30681ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 30781ad6265SDimitry Andric bits<6> XT; 30881ad6265SDimitry Andric bits<5> VRB; 30981ad6265SDimitry Andric bits<5> IMM; 31081ad6265SDimitry Andric 31181ad6265SDimitry Andric let Pattern = pattern; 31281ad6265SDimitry Andric let Inst{6-10} = XT{4-0}; 31381ad6265SDimitry Andric let Inst{11-15} = IMM; 31481ad6265SDimitry Andric let Inst{16-20} = VRB; 31581ad6265SDimitry Andric let Inst{21-30} = xo; 31681ad6265SDimitry Andric let Inst{31} = XT{5}; 31781ad6265SDimitry Andric} 31881ad6265SDimitry Andric 31981ad6265SDimitry Andricclass 8RR_XX4Form_IMM8_XTAB6<bits<6> opcode, bits<2> xo, 32081ad6265SDimitry Andric dag OOL, dag IOL, string asmstr, 32181ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 32281ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 32381ad6265SDimitry Andric bits<6> XT; 32481ad6265SDimitry Andric bits<6> XA; 32581ad6265SDimitry Andric bits<6> XB; 32681ad6265SDimitry Andric bits<6> XC; 32781ad6265SDimitry Andric bits<8> IMM; 32881ad6265SDimitry Andric 32981ad6265SDimitry Andric let Pattern = pattern; 33081ad6265SDimitry Andric 33181ad6265SDimitry Andric // The prefix. 33281ad6265SDimitry Andric let Inst{6-7} = 1; 33381ad6265SDimitry Andric let Inst{8} = 0; 33481ad6265SDimitry Andric let Inst{9-11} = 0; 33581ad6265SDimitry Andric let Inst{12-13} = 0; 33681ad6265SDimitry Andric let Inst{14-23} = 0; 33781ad6265SDimitry Andric let Inst{24-31} = IMM; 33881ad6265SDimitry Andric 33981ad6265SDimitry Andric // The instruction. 34081ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 34181ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 34281ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 34381ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 34481ad6265SDimitry Andric let Inst{58-59} = xo; 34581ad6265SDimitry Andric let Inst{60} = XC{5}; 34681ad6265SDimitry Andric let Inst{61} = XA{5}; 34781ad6265SDimitry Andric let Inst{62} = XB{5}; 34881ad6265SDimitry Andric let Inst{63} = XT{5}; 34981ad6265SDimitry Andric} 35081ad6265SDimitry Andric 35181ad6265SDimitry Andricclass VXForm_RD5_N3_VB5<bits<11> xo, dag OOL, dag IOL, string asmstr, 35281ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 35381ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 35481ad6265SDimitry Andric bits<5> RD; 35581ad6265SDimitry Andric bits<5> VB; 35681ad6265SDimitry Andric bits<3> N; 35781ad6265SDimitry Andric 35881ad6265SDimitry Andric let Pattern = pattern; 35981ad6265SDimitry Andric 36081ad6265SDimitry Andric let Inst{6-10} = RD; 36181ad6265SDimitry Andric let Inst{11-12} = 0; 36281ad6265SDimitry Andric let Inst{13-15} = N; 36381ad6265SDimitry Andric let Inst{16-20} = VB; 36481ad6265SDimitry Andric let Inst{21-31} = xo; 36581ad6265SDimitry Andric} 36681ad6265SDimitry Andric 36781ad6265SDimitry Andric 36881ad6265SDimitry Andric// VX-Form: [PO VRT RA VRB XO]. 36981ad6265SDimitry Andric// Destructive (insert) forms are suffixed with _ins. 37081ad6265SDimitry Andricclass VXForm_VTB5_RA5_ins<bits<11> xo, string opc, list<dag> pattern> 37181ad6265SDimitry Andric : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vDi, gprc:$rA, vrrc:$vB), 37281ad6265SDimitry Andric !strconcat(opc, " $vD, $rA, $vB"), IIC_VecGeneral, pattern>, 37381ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 37481ad6265SDimitry Andric 37581ad6265SDimitry Andric// VX-Form: [PO VRT RA RB XO]. 37681ad6265SDimitry Andric// Destructive (insert) forms are suffixed with _ins. 37781ad6265SDimitry Andricclass VXForm_VRT5_RAB5_ins<bits<11> xo, string opc, list<dag> pattern> 37881ad6265SDimitry Andric : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vDi, gprc:$rA, gprc:$rB), 37981ad6265SDimitry Andric !strconcat(opc, " $vD, $rA, $rB"), IIC_VecGeneral, pattern>, 38081ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 38181ad6265SDimitry Andric 38281ad6265SDimitry Andric// VX-Form: [ PO BF // VRA VRB XO ] 38381ad6265SDimitry Andricclass VXForm_BF3_VAB5<bits<11> xo, dag OOL, dag IOL, string asmstr, 38481ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 38581ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 38681ad6265SDimitry Andric bits<3> BF; 38781ad6265SDimitry Andric bits<5> VA; 38881ad6265SDimitry Andric bits<5> VB; 38981ad6265SDimitry Andric 39081ad6265SDimitry Andric let Pattern = pattern; 39181ad6265SDimitry Andric 39281ad6265SDimitry Andric let Inst{6-8} = BF; 39381ad6265SDimitry Andric let Inst{9-10} = 0; 39481ad6265SDimitry Andric let Inst{11-15} = VA; 39581ad6265SDimitry Andric let Inst{16-20} = VB; 39681ad6265SDimitry Andric let Inst{21-31} = xo; 39781ad6265SDimitry Andric} 39881ad6265SDimitry Andric 39981ad6265SDimitry Andric// VN-Form: [PO VRT VRA VRB PS SD XO] 40081ad6265SDimitry Andric// SD is "Shift Direction" 40181ad6265SDimitry Andricclass VNForm_VTAB5_SD3<bits<6> xo, bits<2> ps, dag OOL, dag IOL, string asmstr, 40281ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 40381ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 40481ad6265SDimitry Andric bits<5> VRT; 40581ad6265SDimitry Andric bits<5> VRA; 40681ad6265SDimitry Andric bits<5> VRB; 40781ad6265SDimitry Andric bits<3> SD; 40881ad6265SDimitry Andric 40981ad6265SDimitry Andric let Pattern = pattern; 41081ad6265SDimitry Andric 41181ad6265SDimitry Andric let Inst{6-10} = VRT; 41281ad6265SDimitry Andric let Inst{11-15} = VRA; 41381ad6265SDimitry Andric let Inst{16-20} = VRB; 41481ad6265SDimitry Andric let Inst{21-22} = ps; 41581ad6265SDimitry Andric let Inst{23-25} = SD; 41681ad6265SDimitry Andric let Inst{26-31} = xo; 41781ad6265SDimitry Andric} 41881ad6265SDimitry Andric 41981ad6265SDimitry Andricclass VXForm_RD5_MP_VB5<bits<11> xo, bits<4> eo, dag OOL, dag IOL, 42081ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 42181ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 42281ad6265SDimitry Andric bits<5> RD; 42381ad6265SDimitry Andric bits<5> VB; 42481ad6265SDimitry Andric bit MP; 42581ad6265SDimitry Andric 42681ad6265SDimitry Andric let Pattern = pattern; 42781ad6265SDimitry Andric 42881ad6265SDimitry Andric let Inst{6-10} = RD; 42981ad6265SDimitry Andric let Inst{11-14} = eo; 43081ad6265SDimitry Andric let Inst{15} = MP; 43181ad6265SDimitry Andric let Inst{16-20} = VB; 43281ad6265SDimitry Andric let Inst{21-31} = xo; 43381ad6265SDimitry Andric} 43481ad6265SDimitry Andric 43581ad6265SDimitry Andric// 8RR:D-Form: [ 1 1 0 // // imm0 43681ad6265SDimitry Andric// PO T XO TX imm1 ]. 43781ad6265SDimitry Andricclass 8RR_DForm_IMM32_XT6<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, 43881ad6265SDimitry Andric string asmstr, InstrItinClass itin, 43981ad6265SDimitry Andric list<dag> pattern> 44081ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 44181ad6265SDimitry Andric bits<6> XT; 44281ad6265SDimitry Andric bits<32> IMM32; 44381ad6265SDimitry Andric 44481ad6265SDimitry Andric let Pattern = pattern; 44581ad6265SDimitry Andric 44681ad6265SDimitry Andric // The prefix. 44781ad6265SDimitry Andric let Inst{6-7} = 1; 44881ad6265SDimitry Andric let Inst{8-11} = 0; 44981ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 45081ad6265SDimitry Andric let Inst{14-15} = 0; // reserved 45181ad6265SDimitry Andric let Inst{16-31} = IMM32{31-16}; 45281ad6265SDimitry Andric 45381ad6265SDimitry Andric // The instruction. 45481ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 45581ad6265SDimitry Andric let Inst{43-46} = xo; 45681ad6265SDimitry Andric let Inst{47} = XT{5}; 45781ad6265SDimitry Andric let Inst{48-63} = IMM32{15-0}; 45881ad6265SDimitry Andric} 45981ad6265SDimitry Andric 46081ad6265SDimitry Andric// 8RR:D-Form: [ 1 1 0 // // imm0 46181ad6265SDimitry Andric// PO T XO IX TX imm1 ]. 46281ad6265SDimitry Andricclass 8RR_DForm_IMM32_XT6_IX<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, 46381ad6265SDimitry Andric string asmstr, InstrItinClass itin, 46481ad6265SDimitry Andric list<dag> pattern> 46581ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 46681ad6265SDimitry Andric bits<6> XT; 46781ad6265SDimitry Andric bit IX; 46881ad6265SDimitry Andric bits<32> IMM32; 46981ad6265SDimitry Andric 47081ad6265SDimitry Andric let Pattern = pattern; 47181ad6265SDimitry Andric 47281ad6265SDimitry Andric // The prefix. 47381ad6265SDimitry Andric let Inst{6-7} = 1; 47481ad6265SDimitry Andric let Inst{8-11} = 0; 47581ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 47681ad6265SDimitry Andric let Inst{14-15} = 0; // reserved 47781ad6265SDimitry Andric let Inst{16-31} = IMM32{31-16}; 47881ad6265SDimitry Andric 47981ad6265SDimitry Andric // The instruction. 48081ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 48181ad6265SDimitry Andric let Inst{43-45} = xo; 48281ad6265SDimitry Andric let Inst{46} = IX; 48381ad6265SDimitry Andric let Inst{47} = XT{5}; 48481ad6265SDimitry Andric let Inst{48-63} = IMM32{15-0}; 48581ad6265SDimitry Andric} 48681ad6265SDimitry Andric 48781ad6265SDimitry Andricclass 8RR_XX4Form_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, 48881ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 48981ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 49081ad6265SDimitry Andric bits<6> XT; 49181ad6265SDimitry Andric bits<6> XA; 49281ad6265SDimitry Andric bits<6> XB; 49381ad6265SDimitry Andric bits<6> XC; 49481ad6265SDimitry Andric 49581ad6265SDimitry Andric let Pattern = pattern; 49681ad6265SDimitry Andric 49781ad6265SDimitry Andric // The prefix. 49881ad6265SDimitry Andric let Inst{6-7} = 1; 49981ad6265SDimitry Andric let Inst{8-11} = 0; 50081ad6265SDimitry Andric let Inst{12-13} = 0; 50181ad6265SDimitry Andric let Inst{14-31} = 0; 50281ad6265SDimitry Andric 50381ad6265SDimitry Andric // The instruction. 50481ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 50581ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 50681ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 50781ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 50881ad6265SDimitry Andric let Inst{58-59} = xo; 50981ad6265SDimitry Andric let Inst{60} = XC{5}; 51081ad6265SDimitry Andric let Inst{61} = XA{5}; 51181ad6265SDimitry Andric let Inst{62} = XB{5}; 51281ad6265SDimitry Andric let Inst{63} = XT{5}; 51381ad6265SDimitry Andric} 51481ad6265SDimitry Andric 51581ad6265SDimitry Andricclass 8RR_XX4Form_IMM3_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, 51681ad6265SDimitry Andric string asmstr, InstrItinClass itin, 51781ad6265SDimitry Andric list<dag> pattern> 51881ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 51981ad6265SDimitry Andric bits<6> XT; 52081ad6265SDimitry Andric bits<6> XA; 52181ad6265SDimitry Andric bits<6> XB; 52281ad6265SDimitry Andric bits<6> XC; 52381ad6265SDimitry Andric bits<3> IMM; 52481ad6265SDimitry Andric 52581ad6265SDimitry Andric let Pattern = pattern; 52681ad6265SDimitry Andric 52781ad6265SDimitry Andric // The prefix. 52881ad6265SDimitry Andric let Inst{6-7} = 1; 52981ad6265SDimitry Andric let Inst{8-11} = 0; 53081ad6265SDimitry Andric let Inst{12-13} = 0; 53181ad6265SDimitry Andric let Inst{14-28} = 0; 53281ad6265SDimitry Andric let Inst{29-31} = IMM; 53381ad6265SDimitry Andric 53481ad6265SDimitry Andric // The instruction. 53581ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 53681ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 53781ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 53881ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 53981ad6265SDimitry Andric let Inst{58-59} = xo; 54081ad6265SDimitry Andric let Inst{60} = XC{5}; 54181ad6265SDimitry Andric let Inst{61} = XA{5}; 54281ad6265SDimitry Andric let Inst{62} = XB{5}; 54381ad6265SDimitry Andric let Inst{63} = XT{5}; 54481ad6265SDimitry Andric} 54581ad6265SDimitry Andric 54681ad6265SDimitry Andric// [PO BF / XO2 B XO BX /] 54781ad6265SDimitry Andricclass XX2_BF3_XO5_XB6_XO9<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, 54881ad6265SDimitry Andric dag IOL, string asmstr, InstrItinClass itin, 54981ad6265SDimitry Andric list<dag> pattern> 55081ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 55181ad6265SDimitry Andric bits<3> BF; 55281ad6265SDimitry Andric bits<6> XB; 55381ad6265SDimitry Andric 55481ad6265SDimitry Andric let Pattern = pattern; 55581ad6265SDimitry Andric 55681ad6265SDimitry Andric let Inst{6-8} = BF; 55781ad6265SDimitry Andric let Inst{9-10} = 0; 55881ad6265SDimitry Andric let Inst{11-15} = xo2; 55981ad6265SDimitry Andric let Inst{16-20} = XB{4-0}; 56081ad6265SDimitry Andric let Inst{21-29} = xo; 56181ad6265SDimitry Andric let Inst{30} = XB{5}; 56281ad6265SDimitry Andric let Inst{31} = 0; 56381ad6265SDimitry Andric} 56481ad6265SDimitry Andric 56581ad6265SDimitry Andric// X-Form: [ PO RT BI /// XO / ] 56681ad6265SDimitry Andricclass XForm_XT5_BI5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 56781ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 56881ad6265SDimitry Andric : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 56981ad6265SDimitry Andric let B = 0; 57081ad6265SDimitry Andric} 57181ad6265SDimitry Andric 57281ad6265SDimitry Andricmulticlass MLS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL, 57381ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 57481ad6265SDimitry Andric InstrItinClass itin> { 57581ad6265SDimitry Andric def NAME : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, 57681ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 57781ad6265SDimitry Andric def pc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL, 57881ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 57981ad6265SDimitry Andric isPCRel; 58081ad6265SDimitry Andric} 58181ad6265SDimitry Andric 58281ad6265SDimitry Andricmulticlass 8LS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL, 58381ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 58481ad6265SDimitry Andric InstrItinClass itin> { 58581ad6265SDimitry Andric def NAME : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, 58681ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 58781ad6265SDimitry Andric def pc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL, 58881ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 58981ad6265SDimitry Andric isPCRel; 59081ad6265SDimitry Andric} 59181ad6265SDimitry Andric 59281ad6265SDimitry Andricmulticlass 8LS_DForm_R_SI34_XT6_RA5_MEM_p<bits<5> opcode, dag OOL, dag IOL, 59381ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 59481ad6265SDimitry Andric InstrItinClass itin> { 59581ad6265SDimitry Andric def NAME : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL, 59681ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 59781ad6265SDimitry Andric def pc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRel_IOL, 59881ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 59981ad6265SDimitry Andric isPCRel; 60081ad6265SDimitry Andric} 60181ad6265SDimitry Andric 60281ad6265SDimitry Andricdef PrefixInstrs : Predicate<"Subtarget->hasPrefixInstrs()">; 60381ad6265SDimitry Andricdef IsISA3_1 : Predicate<"Subtarget->isISA3_1()">; 60481ad6265SDimitry Andricdef PairedVectorMemops : Predicate<"Subtarget->pairedVectorMemops()">; 60581ad6265SDimitry Andricdef RCCp { 60681ad6265SDimitry Andric dag AToVSRC = (COPY_TO_REGCLASS $XA, VSRC); 60781ad6265SDimitry Andric dag BToVSRC = (COPY_TO_REGCLASS $XB, VSRC); 60881ad6265SDimitry Andric} 60981ad6265SDimitry Andric 61081ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 61181ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 61281ad6265SDimitry Andric defm PADDI8 : 61381ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_p<14, (outs g8rc:$RT), (ins g8rc:$RA, s34imm:$SI), 61481ad6265SDimitry Andric (ins immZero:$RA, s34imm_pcrel:$SI), 61581ad6265SDimitry Andric "paddi $RT, $RA, $SI", IIC_LdStLFD>; 61681ad6265SDimitry Andric let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 61781ad6265SDimitry Andric def PLI8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT), 61881ad6265SDimitry Andric (ins s34imm:$SI), 61981ad6265SDimitry Andric "pli $RT, $SI", IIC_IntSimple, []>; 62081ad6265SDimitry Andric } 62181ad6265SDimitry Andric } 62281ad6265SDimitry Andric defm PADDI : 62381ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_p<14, (outs gprc:$RT), (ins gprc:$RA, s34imm:$SI), 62481ad6265SDimitry Andric (ins immZero:$RA, s34imm_pcrel:$SI), 62581ad6265SDimitry Andric "paddi $RT, $RA, $SI", IIC_LdStLFD>; 62681ad6265SDimitry Andric let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 62781ad6265SDimitry Andric def PLI : MLS_DForm_SI34_RT5<14, (outs gprc:$RT), 62881ad6265SDimitry Andric (ins s34imm:$SI), 62981ad6265SDimitry Andric "pli $RT, $SI", IIC_IntSimple, []>; 63081ad6265SDimitry Andric } 63181ad6265SDimitry Andric 63281ad6265SDimitry Andric let mayLoad = 1, mayStore = 0 in { 63381ad6265SDimitry Andric defm PLXV : 63481ad6265SDimitry Andric 8LS_DForm_R_SI34_XT6_RA5_MEM_p<25, (outs vsrc:$XT), (ins memri34:$D_RA), 63581ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), 63681ad6265SDimitry Andric "plxv $XT, $D_RA", IIC_LdStLFD>; 63781ad6265SDimitry Andric defm PLFS : 63881ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<48, (outs f4rc:$FRT), (ins memri34:$D_RA), 63981ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plfs $FRT, $D_RA", 64081ad6265SDimitry Andric IIC_LdStLFD>; 64181ad6265SDimitry Andric defm PLFD : 64281ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<50, (outs f8rc:$FRT), (ins memri34:$D_RA), 64381ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plfd $FRT, $D_RA", 64481ad6265SDimitry Andric IIC_LdStLFD>; 64581ad6265SDimitry Andric defm PLXSSP : 64681ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<43, (outs vfrc:$VRT), (ins memri34:$D_RA), 64781ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), 64881ad6265SDimitry Andric "plxssp $VRT, $D_RA", IIC_LdStLFD>; 64981ad6265SDimitry Andric defm PLXSD : 65081ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<42, (outs vfrc:$VRT), (ins memri34:$D_RA), 65181ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), 65281ad6265SDimitry Andric "plxsd $VRT, $D_RA", IIC_LdStLFD>; 65381ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 65481ad6265SDimitry Andric defm PLBZ8 : 65581ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs g8rc:$RT), (ins memri34:$D_RA), 65681ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plbz $RT, $D_RA", 65781ad6265SDimitry Andric IIC_LdStLFD>; 65881ad6265SDimitry Andric defm PLHZ8 : 65981ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs g8rc:$RT), (ins memri34:$D_RA), 66081ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plhz $RT, $D_RA", 66181ad6265SDimitry Andric IIC_LdStLFD>; 66281ad6265SDimitry Andric defm PLHA8 : 66381ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs g8rc:$RT), (ins memri34:$D_RA), 66481ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plha $RT, $D_RA", 66581ad6265SDimitry Andric IIC_LdStLFD>; 66681ad6265SDimitry Andric defm PLWA8 : 66781ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs g8rc:$RT), (ins memri34:$D_RA), 66881ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), 66981ad6265SDimitry Andric "plwa $RT, $D_RA", IIC_LdStLFD>; 67081ad6265SDimitry Andric defm PLWZ8 : 67181ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs g8rc:$RT), (ins memri34:$D_RA), 67281ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plwz $RT, $D_RA", 67381ad6265SDimitry Andric IIC_LdStLFD>; 67481ad6265SDimitry Andric } 67581ad6265SDimitry Andric defm PLBZ : 67681ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs gprc:$RT), (ins memri34:$D_RA), 67781ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plbz $RT, $D_RA", 67881ad6265SDimitry Andric IIC_LdStLFD>; 67981ad6265SDimitry Andric defm PLHZ : 68081ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs gprc:$RT), (ins memri34:$D_RA), 68181ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plhz $RT, $D_RA", 68281ad6265SDimitry Andric IIC_LdStLFD>; 68381ad6265SDimitry Andric defm PLHA : 68481ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs gprc:$RT), (ins memri34:$D_RA), 68581ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plha $RT, $D_RA", 68681ad6265SDimitry Andric IIC_LdStLFD>; 68781ad6265SDimitry Andric defm PLWZ : 68881ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs gprc:$RT), (ins memri34:$D_RA), 68981ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plwz $RT, $D_RA", 69081ad6265SDimitry Andric IIC_LdStLFD>; 69181ad6265SDimitry Andric defm PLWA : 69281ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs gprc:$RT), (ins memri34:$D_RA), 69381ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plwa $RT, $D_RA", 69481ad6265SDimitry Andric IIC_LdStLFD>; 69581ad6265SDimitry Andric defm PLD : 69681ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<57, (outs g8rc:$RT), (ins memri34:$D_RA), 69781ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "pld $RT, $D_RA", 69881ad6265SDimitry Andric IIC_LdStLFD>; 69981ad6265SDimitry Andric } 70081ad6265SDimitry Andric 70181ad6265SDimitry Andric let mayStore = 1, mayLoad = 0 in { 70281ad6265SDimitry Andric defm PSTXV : 70381ad6265SDimitry Andric 8LS_DForm_R_SI34_XT6_RA5_MEM_p<27, (outs), (ins vsrc:$XS, memri34:$D_RA), 70481ad6265SDimitry Andric (ins vsrc:$XS, memri34_pcrel:$D_RA), 70581ad6265SDimitry Andric "pstxv $XS, $D_RA", IIC_LdStLFD>; 70681ad6265SDimitry Andric defm PSTFS : 70781ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<52, (outs), (ins f4rc:$FRS, memri34:$D_RA), 70881ad6265SDimitry Andric (ins f4rc:$FRS, memri34_pcrel:$D_RA), 70981ad6265SDimitry Andric "pstfs $FRS, $D_RA", IIC_LdStLFD>; 71081ad6265SDimitry Andric defm PSTFD : 71181ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<54, (outs), (ins f8rc:$FRS, memri34:$D_RA), 71281ad6265SDimitry Andric (ins f8rc:$FRS, memri34_pcrel:$D_RA), 71381ad6265SDimitry Andric "pstfd $FRS, $D_RA", IIC_LdStLFD>; 71481ad6265SDimitry Andric defm PSTXSSP : 71581ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<47, (outs), (ins vfrc:$VRS, memri34:$D_RA), 71681ad6265SDimitry Andric (ins vfrc:$VRS, memri34_pcrel:$D_RA), 71781ad6265SDimitry Andric "pstxssp $VRS, $D_RA", IIC_LdStLFD>; 71881ad6265SDimitry Andric defm PSTXSD : 71981ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<46, (outs), (ins vfrc:$VRS, memri34:$D_RA), 72081ad6265SDimitry Andric (ins vfrc:$VRS, memri34_pcrel:$D_RA), 72181ad6265SDimitry Andric "pstxsd $VRS, $D_RA", IIC_LdStLFD>; 72281ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 72381ad6265SDimitry Andric defm PSTB8 : 72481ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins g8rc:$RS, memri34:$D_RA), 72581ad6265SDimitry Andric (ins g8rc:$RS, memri34_pcrel:$D_RA), 72681ad6265SDimitry Andric "pstb $RS, $D_RA", IIC_LdStLFD>; 72781ad6265SDimitry Andric defm PSTH8 : 72881ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins g8rc:$RS, memri34:$D_RA), 72981ad6265SDimitry Andric (ins g8rc:$RS, memri34_pcrel:$D_RA), 73081ad6265SDimitry Andric "psth $RS, $D_RA", IIC_LdStLFD>; 73181ad6265SDimitry Andric defm PSTW8 : 73281ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins g8rc:$RS, memri34:$D_RA), 73381ad6265SDimitry Andric (ins g8rc:$RS, memri34_pcrel:$D_RA), 73481ad6265SDimitry Andric "pstw $RS, $D_RA", IIC_LdStLFD>; 73581ad6265SDimitry Andric } 73681ad6265SDimitry Andric defm PSTB : 73781ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins gprc:$RS, memri34:$D_RA), 73881ad6265SDimitry Andric (ins gprc:$RS, memri34_pcrel:$D_RA), 73981ad6265SDimitry Andric "pstb $RS, $D_RA", IIC_LdStLFD>; 74081ad6265SDimitry Andric defm PSTH : 74181ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins gprc:$RS, memri34:$D_RA), 74281ad6265SDimitry Andric (ins gprc:$RS, memri34_pcrel:$D_RA), 74381ad6265SDimitry Andric "psth $RS, $D_RA", IIC_LdStLFD>; 74481ad6265SDimitry Andric defm PSTW : 74581ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins gprc:$RS, memri34:$D_RA), 74681ad6265SDimitry Andric (ins gprc:$RS, memri34_pcrel:$D_RA), 74781ad6265SDimitry Andric "pstw $RS, $D_RA", IIC_LdStLFD>; 74881ad6265SDimitry Andric defm PSTD : 74981ad6265SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<61, (outs), (ins g8rc:$RS, memri34:$D_RA), 75081ad6265SDimitry Andric (ins g8rc:$RS, memri34_pcrel:$D_RA), 75181ad6265SDimitry Andric "pstd $RS, $D_RA", IIC_LdStLFD>; 75281ad6265SDimitry Andric } 75381ad6265SDimitry Andric} 75481ad6265SDimitry Andric 75581ad6265SDimitry Andricclass DQForm_XTp5_RA17_MEM<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, 75681ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 75781ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 75881ad6265SDimitry Andric bits<5> XTp; 75981ad6265SDimitry Andric bits<17> DQ_RA; 76081ad6265SDimitry Andric let Pattern = pattern; 76181ad6265SDimitry Andric 76281ad6265SDimitry Andric let Inst{6-9} = XTp{3-0}; 76381ad6265SDimitry Andric let Inst{10} = XTp{4}; 76481ad6265SDimitry Andric let Inst{11-15} = DQ_RA{16-12}; // Register # 76581ad6265SDimitry Andric let Inst{16-27} = DQ_RA{11-0}; // Displacement. 76681ad6265SDimitry Andric let Inst{28-31} = xo; 76781ad6265SDimitry Andric} 76881ad6265SDimitry Andric 76981ad6265SDimitry Andricclass XForm_XTp5_XAB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 77081ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 77181ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp { 77281ad6265SDimitry Andric bits<5> XTp; 77381ad6265SDimitry Andric bits<5> A; 77481ad6265SDimitry Andric bits<5> B; 77581ad6265SDimitry Andric 77681ad6265SDimitry Andric let Pattern = pattern; 77781ad6265SDimitry Andric let Inst{6-9} = XTp{3-0}; 77881ad6265SDimitry Andric let Inst{10} = XTp{4}; 77981ad6265SDimitry Andric let Inst{11-15} = A; 78081ad6265SDimitry Andric let Inst{16-20} = B; 78181ad6265SDimitry Andric let Inst{21-30} = xo; 78281ad6265SDimitry Andric let Inst{31} = 0; 78381ad6265SDimitry Andric} 78481ad6265SDimitry Andric 78581ad6265SDimitry Andricclass 8LS_DForm_R_XTp5_SI34_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 78681ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 78781ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 78881ad6265SDimitry Andric bits<5> XTp; 78981ad6265SDimitry Andric bits<39> D_RA; 79081ad6265SDimitry Andric 79181ad6265SDimitry Andric let Pattern = pattern; 79281ad6265SDimitry Andric 79381ad6265SDimitry Andric // The prefix. 79481ad6265SDimitry Andric let Inst{6-10} = 0; 79581ad6265SDimitry Andric let Inst{11} = PCRel; 79681ad6265SDimitry Andric let Inst{12-13} = 0; 79781ad6265SDimitry Andric let Inst{14-31} = D_RA{33-16}; // Imm18 79881ad6265SDimitry Andric 79981ad6265SDimitry Andric // The instruction. 80081ad6265SDimitry Andric let Inst{38-41} = XTp{3-0}; 80181ad6265SDimitry Andric let Inst{42} = XTp{4}; 80281ad6265SDimitry Andric let Inst{43-47} = D_RA{38-34}; // Register # 80381ad6265SDimitry Andric let Inst{48-63} = D_RA{15-0}; // D 80481ad6265SDimitry Andric} 80581ad6265SDimitry Andric 80681ad6265SDimitry Andricmulticlass 8LS_DForm_R_XTp5_SI34_MEM_p<bits<6> opcode, dag OOL, 80781ad6265SDimitry Andric dag IOL, dag PCRel_IOL, 80881ad6265SDimitry Andric string asmstr, InstrItinClass itin> { 80981ad6265SDimitry Andric def NAME : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL, 81081ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 81181ad6265SDimitry Andric def pc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRel_IOL, 81281ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 81381ad6265SDimitry Andric isPCRel; 81481ad6265SDimitry Andric} 81581ad6265SDimitry Andric 81681ad6265SDimitry Andric 81781ad6265SDimitry Andric 81881ad6265SDimitry Andric// [PO AS XO2 XO] 81981ad6265SDimitry Andricclass XForm_AT3<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL, 82081ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 82181ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 82281ad6265SDimitry Andric bits<3> AT; 82381ad6265SDimitry Andric 82481ad6265SDimitry Andric let Pattern = pattern; 82581ad6265SDimitry Andric 82681ad6265SDimitry Andric let Inst{6-8} = AT; 82781ad6265SDimitry Andric let Inst{9-10} = 0; 82881ad6265SDimitry Andric let Inst{11-15} = xo2; 82981ad6265SDimitry Andric let Inst{16-20} = 0; 83081ad6265SDimitry Andric let Inst{21-30} = xo; 83181ad6265SDimitry Andric let Inst{31} = 0; 83281ad6265SDimitry Andric} 83381ad6265SDimitry Andric 83481ad6265SDimitry Andric// X-Form: [ PO T EO UIM XO TX ] 83581ad6265SDimitry Andricclass XForm_XT6_IMM5<bits<6> opcode, bits<5> eo, bits<10> xo, dag OOL, dag IOL, 83681ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 83781ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 83881ad6265SDimitry Andric bits<6> XT; 83981ad6265SDimitry Andric bits<5> UIM; 84081ad6265SDimitry Andric 84181ad6265SDimitry Andric let Pattern = pattern; 84281ad6265SDimitry Andric 84381ad6265SDimitry Andric let Inst{6-10} = XT{4-0}; 84481ad6265SDimitry Andric let Inst{11-15} = eo; 84581ad6265SDimitry Andric let Inst{16-20} = UIM; 84681ad6265SDimitry Andric let Inst{21-30} = xo; 84781ad6265SDimitry Andric let Inst{31} = XT{5}; 84881ad6265SDimitry Andric} 84981ad6265SDimitry Andric 85081ad6265SDimitry Andricclass XX3Form_AT3_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 85181ad6265SDimitry Andric string asmstr, InstrItinClass itin, 85281ad6265SDimitry Andric list<dag> pattern> 85381ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 85481ad6265SDimitry Andric bits<3> AT; 85581ad6265SDimitry Andric bits<6> XA; 85681ad6265SDimitry Andric bits<6> XB; 85781ad6265SDimitry Andric 85881ad6265SDimitry Andric let Pattern = pattern; 85981ad6265SDimitry Andric 86081ad6265SDimitry Andric let Inst{6-8} = AT; 86181ad6265SDimitry Andric let Inst{9-10} = 0; 86281ad6265SDimitry Andric let Inst{11-15} = XA{4-0}; 86381ad6265SDimitry Andric let Inst{16-20} = XB{4-0}; 86481ad6265SDimitry Andric let Inst{21-28} = xo; 86581ad6265SDimitry Andric let Inst{29} = XA{5}; 86681ad6265SDimitry Andric let Inst{30} = XB{5}; 86781ad6265SDimitry Andric let Inst{31} = 0; 86881ad6265SDimitry Andric} 86981ad6265SDimitry Andric 87081ad6265SDimitry Andricclass MMIRR_XX3Form_XY4P2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 87181ad6265SDimitry Andric string asmstr, InstrItinClass itin, 87281ad6265SDimitry Andric list<dag> pattern> 87381ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 87481ad6265SDimitry Andric bits<3> AT; 87581ad6265SDimitry Andric bits<6> XA; 87681ad6265SDimitry Andric bits<6> XB; 87781ad6265SDimitry Andric bits<4> XMSK; 87881ad6265SDimitry Andric bits<4> YMSK; 87981ad6265SDimitry Andric bits<2> PMSK; 88081ad6265SDimitry Andric 88181ad6265SDimitry Andric let Pattern = pattern; 88281ad6265SDimitry Andric 88381ad6265SDimitry Andric // The prefix. 88481ad6265SDimitry Andric let Inst{6-7} = 3; 88581ad6265SDimitry Andric let Inst{8-11} = 9; 88681ad6265SDimitry Andric let Inst{12-15} = 0; 88781ad6265SDimitry Andric let Inst{16-17} = PMSK; 88881ad6265SDimitry Andric let Inst{18-23} = 0; 88981ad6265SDimitry Andric let Inst{24-27} = XMSK; 89081ad6265SDimitry Andric let Inst{28-31} = YMSK; 89181ad6265SDimitry Andric 89281ad6265SDimitry Andric // The instruction. 89381ad6265SDimitry Andric let Inst{38-40} = AT; 89481ad6265SDimitry Andric let Inst{41-42} = 0; 89581ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 89681ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 89781ad6265SDimitry Andric let Inst{53-60} = xo; 89881ad6265SDimitry Andric let Inst{61} = XA{5}; 89981ad6265SDimitry Andric let Inst{62} = XB{5}; 90081ad6265SDimitry Andric let Inst{63} = 0; 90181ad6265SDimitry Andric} 90281ad6265SDimitry Andric 90381ad6265SDimitry Andricclass MMIRR_XX3Form_XY4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 90481ad6265SDimitry Andric string asmstr, InstrItinClass itin, 90581ad6265SDimitry Andric list<dag> pattern> 90681ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 90781ad6265SDimitry Andric bits<3> AT; 90881ad6265SDimitry Andric bits<6> XA; 90981ad6265SDimitry Andric bits<6> XB; 91081ad6265SDimitry Andric bits<4> XMSK; 91181ad6265SDimitry Andric bits<4> YMSK; 91281ad6265SDimitry Andric 91381ad6265SDimitry Andric let Pattern = pattern; 91481ad6265SDimitry Andric 91581ad6265SDimitry Andric // The prefix. 91681ad6265SDimitry Andric let Inst{6-7} = 3; 91781ad6265SDimitry Andric let Inst{8-11} = 9; 91881ad6265SDimitry Andric let Inst{12-23} = 0; 91981ad6265SDimitry Andric let Inst{24-27} = XMSK; 92081ad6265SDimitry Andric let Inst{28-31} = YMSK; 92181ad6265SDimitry Andric 92281ad6265SDimitry Andric // The instruction. 92381ad6265SDimitry Andric let Inst{38-40} = AT; 92481ad6265SDimitry Andric let Inst{41-42} = 0; 92581ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 92681ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 92781ad6265SDimitry Andric let Inst{53-60} = xo; 92881ad6265SDimitry Andric let Inst{61} = XA{5}; 92981ad6265SDimitry Andric let Inst{62} = XB{5}; 93081ad6265SDimitry Andric let Inst{63} = 0; 93181ad6265SDimitry Andric} 93281ad6265SDimitry Andric 93381ad6265SDimitry Andricclass MMIRR_XX3Form_X4Y2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 93481ad6265SDimitry Andric string asmstr, InstrItinClass itin, 93581ad6265SDimitry Andric list<dag> pattern> 93681ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 93781ad6265SDimitry Andric bits<3> AT; 93881ad6265SDimitry Andric bits<6> XA; 93981ad6265SDimitry Andric bits<6> XB; 94081ad6265SDimitry Andric bits<4> XMSK; 94181ad6265SDimitry Andric bits<2> YMSK; 94281ad6265SDimitry Andric 94381ad6265SDimitry Andric let Pattern = pattern; 94481ad6265SDimitry Andric 94581ad6265SDimitry Andric // The prefix. 94681ad6265SDimitry Andric let Inst{6-7} = 3; 94781ad6265SDimitry Andric let Inst{8-11} = 9; 94881ad6265SDimitry Andric let Inst{12-23} = 0; 94981ad6265SDimitry Andric let Inst{24-27} = XMSK; 95081ad6265SDimitry Andric let Inst{28-29} = YMSK; 95181ad6265SDimitry Andric let Inst{30-31} = 0; 95281ad6265SDimitry Andric 95381ad6265SDimitry Andric // The instruction. 95481ad6265SDimitry Andric let Inst{38-40} = AT; 95581ad6265SDimitry Andric let Inst{41-42} = 0; 95681ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 95781ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 95881ad6265SDimitry Andric let Inst{53-60} = xo; 95981ad6265SDimitry Andric let Inst{61} = XA{5}; 96081ad6265SDimitry Andric let Inst{62} = XB{5}; 96181ad6265SDimitry Andric let Inst{63} = 0; 96281ad6265SDimitry Andric} 96381ad6265SDimitry Andric 96481ad6265SDimitry Andricclass MMIRR_XX3Form_XY4P8_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 96581ad6265SDimitry Andric string asmstr, InstrItinClass itin, 96681ad6265SDimitry Andric list<dag> pattern> 96781ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 96881ad6265SDimitry Andric bits<3> AT; 96981ad6265SDimitry Andric bits<6> XA; 97081ad6265SDimitry Andric bits<6> XB; 97181ad6265SDimitry Andric bits<4> XMSK; 97281ad6265SDimitry Andric bits<4> YMSK; 97381ad6265SDimitry Andric bits<8> PMSK; 97481ad6265SDimitry Andric 97581ad6265SDimitry Andric let Pattern = pattern; 97681ad6265SDimitry Andric 97781ad6265SDimitry Andric // The prefix. 97881ad6265SDimitry Andric let Inst{6-7} = 3; 97981ad6265SDimitry Andric let Inst{8-11} = 9; 98081ad6265SDimitry Andric let Inst{12-15} = 0; 98181ad6265SDimitry Andric let Inst{16-23} = PMSK; 98281ad6265SDimitry Andric let Inst{24-27} = XMSK; 98381ad6265SDimitry Andric let Inst{28-31} = YMSK; 98481ad6265SDimitry Andric 98581ad6265SDimitry Andric // The instruction. 98681ad6265SDimitry Andric let Inst{38-40} = AT; 98781ad6265SDimitry Andric let Inst{41-42} = 0; 98881ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 98981ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 99081ad6265SDimitry Andric let Inst{53-60} = xo; 99181ad6265SDimitry Andric let Inst{61} = XA{5}; 99281ad6265SDimitry Andric let Inst{62} = XB{5}; 99381ad6265SDimitry Andric let Inst{63} = 0; 99481ad6265SDimitry Andric} 99581ad6265SDimitry Andric 99681ad6265SDimitry Andricclass MMIRR_XX3Form_XYP4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 99781ad6265SDimitry Andric string asmstr, InstrItinClass itin, 99881ad6265SDimitry Andric list<dag> pattern> 99981ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 100081ad6265SDimitry Andric bits<3> AT; 100181ad6265SDimitry Andric bits<6> XA; 100281ad6265SDimitry Andric bits<6> XB; 100381ad6265SDimitry Andric bits<4> XMSK; 100481ad6265SDimitry Andric bits<4> YMSK; 100581ad6265SDimitry Andric bits<4> PMSK; 100681ad6265SDimitry Andric 100781ad6265SDimitry Andric let Pattern = pattern; 100881ad6265SDimitry Andric 100981ad6265SDimitry Andric // The prefix. 101081ad6265SDimitry Andric let Inst{6-7} = 3; 101181ad6265SDimitry Andric let Inst{8-11} = 9; 101281ad6265SDimitry Andric let Inst{12-15} = 0; 101381ad6265SDimitry Andric let Inst{16-19} = PMSK; 101481ad6265SDimitry Andric let Inst{20-23} = 0; 101581ad6265SDimitry Andric let Inst{24-27} = XMSK; 101681ad6265SDimitry Andric let Inst{28-31} = YMSK; 101781ad6265SDimitry Andric 101881ad6265SDimitry Andric // The instruction. 101981ad6265SDimitry Andric let Inst{38-40} = AT; 102081ad6265SDimitry Andric let Inst{41-42} = 0; 102181ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 102281ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 102381ad6265SDimitry Andric let Inst{53-60} = xo; 102481ad6265SDimitry Andric let Inst{61} = XA{5}; 102581ad6265SDimitry Andric let Inst{62} = XB{5}; 102681ad6265SDimitry Andric let Inst{63} = 0; 102781ad6265SDimitry Andric} 102881ad6265SDimitry Andric 102981ad6265SDimitry Andric 103081ad6265SDimitry Andric 103181ad6265SDimitry Andricdef Concats { 103281ad6265SDimitry Andric dag VecsToVecPair0 = 103381ad6265SDimitry Andric (v256i1 (INSERT_SUBREG 103481ad6265SDimitry Andric (INSERT_SUBREG (IMPLICIT_DEF), $vs0, sub_vsx1), 103581ad6265SDimitry Andric $vs1, sub_vsx0)); 103681ad6265SDimitry Andric dag VecsToVecPair1 = 103781ad6265SDimitry Andric (v256i1 (INSERT_SUBREG 103881ad6265SDimitry Andric (INSERT_SUBREG (IMPLICIT_DEF), $vs2, sub_vsx1), 103981ad6265SDimitry Andric $vs3, sub_vsx0)); 104081ad6265SDimitry Andric} 104181ad6265SDimitry Andric 104281ad6265SDimitry Andriclet Predicates = [PairedVectorMemops] in { 104381ad6265SDimitry Andric def : Pat<(v256i1 (PPCPairBuild v4i32:$vs1, v4i32:$vs0)), 104481ad6265SDimitry Andric Concats.VecsToVecPair0>; 104581ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_assemble_pair v16i8:$vs1, v16i8:$vs0)), 104681ad6265SDimitry Andric Concats.VecsToVecPair0>; 104781ad6265SDimitry Andric def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 0)), 104881ad6265SDimitry Andric (v4i32 (EXTRACT_SUBREG $v, sub_vsx0))>; 104981ad6265SDimitry Andric def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 1)), 105081ad6265SDimitry Andric (v4i32 (EXTRACT_SUBREG $v, sub_vsx1))>; 105181ad6265SDimitry Andric} 105281ad6265SDimitry Andric 105381ad6265SDimitry Andriclet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops] in { 105481ad6265SDimitry Andric def LXVP : DQForm_XTp5_RA17_MEM<6, 0, (outs vsrprc:$XTp), 105581ad6265SDimitry Andric (ins memrix16:$DQ_RA), "lxvp $XTp, $DQ_RA", 105681ad6265SDimitry Andric IIC_LdStLFD, []>; 105781ad6265SDimitry Andric def LXVPX : XForm_XTp5_XAB5<31, 333, (outs vsrprc:$XTp), (ins memrr:$src), 105881ad6265SDimitry Andric "lxvpx $XTp, $src", IIC_LdStLFD, 105981ad6265SDimitry Andric []>; 106081ad6265SDimitry Andric} 106181ad6265SDimitry Andric 106281ad6265SDimitry Andriclet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops] in { 106381ad6265SDimitry Andric def STXVP : DQForm_XTp5_RA17_MEM<6, 1, (outs), (ins vsrprc:$XTp, 106481ad6265SDimitry Andric memrix16:$DQ_RA), "stxvp $XTp, $DQ_RA", 106581ad6265SDimitry Andric IIC_LdStLFD, []>; 106681ad6265SDimitry Andric def STXVPX : XForm_XTp5_XAB5<31, 461, (outs), (ins vsrprc:$XTp, memrr:$dst), 106781ad6265SDimitry Andric "stxvpx $XTp, $dst", IIC_LdStLFD, 106881ad6265SDimitry Andric []>; 106981ad6265SDimitry Andric} 107081ad6265SDimitry Andric 107181ad6265SDimitry Andriclet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops, PrefixInstrs] in { 107281ad6265SDimitry Andric defm PLXVP : 107381ad6265SDimitry Andric 8LS_DForm_R_XTp5_SI34_MEM_p<58, (outs vsrprc:$XTp), (ins memri34:$D_RA), 107481ad6265SDimitry Andric (ins memri34_pcrel:$D_RA), "plxvp $XTp, $D_RA", 107581ad6265SDimitry Andric IIC_LdStLFD>; 107681ad6265SDimitry Andric} 107781ad6265SDimitry Andric 107881ad6265SDimitry Andriclet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops, PrefixInstrs] in { 107981ad6265SDimitry Andric defm PSTXVP : 108081ad6265SDimitry Andric 8LS_DForm_R_XTp5_SI34_MEM_p<62, (outs), (ins vsrprc:$XTp, memri34:$D_RA), 108181ad6265SDimitry Andric (ins vsrprc:$XTp, memri34_pcrel:$D_RA), 108281ad6265SDimitry Andric "pstxvp $XTp, $D_RA", IIC_LdStLFD>; 108381ad6265SDimitry Andric} 108481ad6265SDimitry Andric 108581ad6265SDimitry Andriclet Predicates = [PairedVectorMemops] in { 108681ad6265SDimitry Andric // Intrinsics for Paired Vector Loads. 108781ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp DQForm:$src)), (LXVP memrix16:$src)>; 108881ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp XForm:$src)), (LXVPX XForm:$src)>; 108981ad6265SDimitry Andric let Predicates = [PairedVectorMemops, PrefixInstrs] in { 109081ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp PDForm:$src)), (PLXVP memri34:$src)>; 109181ad6265SDimitry Andric } 109281ad6265SDimitry Andric // Intrinsics for Paired Vector Stores. 109381ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, DQForm:$dst), 109481ad6265SDimitry Andric (STXVP $XSp, memrix16:$dst)>; 109581ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, XForm:$dst), 109681ad6265SDimitry Andric (STXVPX $XSp, XForm:$dst)>; 109781ad6265SDimitry Andric let Predicates = [PairedVectorMemops, PrefixInstrs] in { 109881ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, PDForm:$dst), 109981ad6265SDimitry Andric (PSTXVP $XSp, memri34:$dst)>; 110081ad6265SDimitry Andric } 110181ad6265SDimitry Andric} 110281ad6265SDimitry Andric 1103*bdd1243dSDimitry Andriclet Predicates = [IsISA3_1] in { 1104*bdd1243dSDimitry Andric def XSCMPEQQP : X_VT5_VA5_VB5<63, 68, "xscmpeqqp", []>; 1105*bdd1243dSDimitry Andric def XSCMPGEQP : X_VT5_VA5_VB5<63, 196, "xscmpgeqp", []>; 1106*bdd1243dSDimitry Andric def XSCMPGTQP : X_VT5_VA5_VB5<63, 228, "xscmpgtqp", []>; 1107*bdd1243dSDimitry Andric} 1108*bdd1243dSDimitry Andric 110981ad6265SDimitry Andriclet Predicates = [PCRelativeMemops] in { 111081ad6265SDimitry Andric // Load i32 111181ad6265SDimitry Andric def : Pat<(i32 (zextloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 111281ad6265SDimitry Andric (PLBZpc $ga, 0)>; 111381ad6265SDimitry Andric def : Pat<(i32 (extloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 111481ad6265SDimitry Andric (PLBZpc $ga, 0)>; 111581ad6265SDimitry Andric def : Pat<(i32 (zextloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 111681ad6265SDimitry Andric (PLBZpc $ga, 0)>; 111781ad6265SDimitry Andric def : Pat<(i32 (extloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 111881ad6265SDimitry Andric (PLBZpc $ga, 0)>; 111981ad6265SDimitry Andric def : Pat<(i32 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 112081ad6265SDimitry Andric (PLHApc $ga, 0)>; 112181ad6265SDimitry Andric def : Pat<(i32 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 112281ad6265SDimitry Andric (PLHZpc $ga, 0)>; 112381ad6265SDimitry Andric def : Pat<(i32 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 112481ad6265SDimitry Andric (PLHZpc $ga, 0)>; 112581ad6265SDimitry Andric def : Pat<(i32 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLWZpc $ga, 0)>; 112681ad6265SDimitry Andric 112781ad6265SDimitry Andric // Store i32 112881ad6265SDimitry Andric def : Pat<(truncstorei8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 112981ad6265SDimitry Andric (PSTBpc $RS, $ga, 0)>; 113081ad6265SDimitry Andric def : Pat<(truncstorei16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 113181ad6265SDimitry Andric (PSTHpc $RS, $ga, 0)>; 113281ad6265SDimitry Andric def : Pat<(store i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 113381ad6265SDimitry Andric (PSTWpc $RS, $ga, 0)>; 113481ad6265SDimitry Andric 113581ad6265SDimitry Andric // Load i64 113681ad6265SDimitry Andric def : Pat<(i64 (zextloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 113781ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 113881ad6265SDimitry Andric def : Pat<(i64 (extloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 113981ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 114081ad6265SDimitry Andric def : Pat<(i64 (zextloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 114181ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 114281ad6265SDimitry Andric def : Pat<(i64 (extloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 114381ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 114481ad6265SDimitry Andric def : Pat<(i64 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 114581ad6265SDimitry Andric (PLHA8pc $ga, 0)>; 114681ad6265SDimitry Andric def : Pat<(i64 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 114781ad6265SDimitry Andric (PLHZ8pc $ga, 0)>; 114881ad6265SDimitry Andric def : Pat<(i64 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 114981ad6265SDimitry Andric (PLHZ8pc $ga, 0)>; 115081ad6265SDimitry Andric def : Pat<(i64 (zextloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 115181ad6265SDimitry Andric (PLWZ8pc $ga, 0)>; 115281ad6265SDimitry Andric def : Pat<(i64 (sextloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 115381ad6265SDimitry Andric (PLWA8pc $ga, 0)>; 115481ad6265SDimitry Andric def : Pat<(i64 (extloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 115581ad6265SDimitry Andric (PLWZ8pc $ga, 0)>; 115681ad6265SDimitry Andric def : Pat<(i64 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLDpc $ga, 0)>; 115781ad6265SDimitry Andric 115881ad6265SDimitry Andric // Store i64 115981ad6265SDimitry Andric def : Pat<(truncstorei8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 116081ad6265SDimitry Andric (PSTB8pc $RS, $ga, 0)>; 116181ad6265SDimitry Andric def : Pat<(truncstorei16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 116281ad6265SDimitry Andric (PSTH8pc $RS, $ga, 0)>; 116381ad6265SDimitry Andric def : Pat<(truncstorei32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 116481ad6265SDimitry Andric (PSTW8pc $RS, $ga, 0)>; 116581ad6265SDimitry Andric def : Pat<(store i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 116681ad6265SDimitry Andric (PSTDpc $RS, $ga, 0)>; 116781ad6265SDimitry Andric 116881ad6265SDimitry Andric // Load f32 116981ad6265SDimitry Andric def : Pat<(f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFSpc $addr, 0)>; 117081ad6265SDimitry Andric 117181ad6265SDimitry Andric // Store f32 117281ad6265SDimitry Andric def : Pat<(store f32:$FRS, (PPCmatpcreladdr PCRelForm:$ga)), 117381ad6265SDimitry Andric (PSTFSpc $FRS, $ga, 0)>; 117481ad6265SDimitry Andric 117581ad6265SDimitry Andric // Load f64 117681ad6265SDimitry Andric def : Pat<(f64 (extloadf32 (PPCmatpcreladdr PCRelForm:$addr))), 117781ad6265SDimitry Andric (COPY_TO_REGCLASS (PLFSpc $addr, 0), VSFRC)>; 117881ad6265SDimitry Andric def : Pat<(f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFDpc $addr, 0)>; 117981ad6265SDimitry Andric 118081ad6265SDimitry Andric // Store f64 118181ad6265SDimitry Andric def : Pat<(store f64:$FRS, (PPCmatpcreladdr PCRelForm:$ga)), 118281ad6265SDimitry Andric (PSTFDpc $FRS, $ga, 0)>; 118381ad6265SDimitry Andric 118481ad6265SDimitry Andric // Load f128 118581ad6265SDimitry Andric def : Pat<(f128 (load (PPCmatpcreladdr PCRelForm:$addr))), 118681ad6265SDimitry Andric (COPY_TO_REGCLASS (PLXVpc $addr, 0), VRRC)>; 118781ad6265SDimitry Andric 118881ad6265SDimitry Andric // Store f128 118981ad6265SDimitry Andric def : Pat<(store f128:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 119081ad6265SDimitry Andric (PSTXVpc (COPY_TO_REGCLASS $XS, VSRC), $ga, 0)>; 119181ad6265SDimitry Andric 119281ad6265SDimitry Andric // Load v4i32 119381ad6265SDimitry Andric def : Pat<(v4i32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 119481ad6265SDimitry Andric 119581ad6265SDimitry Andric // Store v4i32 119681ad6265SDimitry Andric def : Pat<(store v4i32:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 119781ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 119881ad6265SDimitry Andric 119981ad6265SDimitry Andric // Load v2i64 120081ad6265SDimitry Andric def : Pat<(v2i64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 120181ad6265SDimitry Andric 120281ad6265SDimitry Andric // Store v2i64 120381ad6265SDimitry Andric def : Pat<(store v2i64:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 120481ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 120581ad6265SDimitry Andric 120681ad6265SDimitry Andric // Load v4f32 120781ad6265SDimitry Andric def : Pat<(v4f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 120881ad6265SDimitry Andric 120981ad6265SDimitry Andric // Store v4f32 121081ad6265SDimitry Andric def : Pat<(store v4f32:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 121181ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 121281ad6265SDimitry Andric 121381ad6265SDimitry Andric // Load v2f64 121481ad6265SDimitry Andric def : Pat<(v2f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 121581ad6265SDimitry Andric 121681ad6265SDimitry Andric // Store v2f64 121781ad6265SDimitry Andric def : Pat<(store v2f64:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 121881ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 121981ad6265SDimitry Andric 122081ad6265SDimitry Andric // Atomic Load 122181ad6265SDimitry Andric def : Pat<(atomic_load_8 (PPCmatpcreladdr PCRelForm:$ga)), 122281ad6265SDimitry Andric (PLBZpc $ga, 0)>; 122381ad6265SDimitry Andric def : Pat<(atomic_load_16 (PPCmatpcreladdr PCRelForm:$ga)), 122481ad6265SDimitry Andric (PLHZpc $ga, 0)>; 122581ad6265SDimitry Andric def : Pat<(atomic_load_32 (PPCmatpcreladdr PCRelForm:$ga)), 122681ad6265SDimitry Andric (PLWZpc $ga, 0)>; 122781ad6265SDimitry Andric def : Pat<(atomic_load_64 (PPCmatpcreladdr PCRelForm:$ga)), 122881ad6265SDimitry Andric (PLDpc $ga, 0)>; 122981ad6265SDimitry Andric 123081ad6265SDimitry Andric // Atomic Store 123181ad6265SDimitry Andric def : Pat<(atomic_store_8 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 123281ad6265SDimitry Andric (PSTBpc $RS, $ga, 0)>; 123381ad6265SDimitry Andric def : Pat<(atomic_store_16 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 123481ad6265SDimitry Andric (PSTHpc $RS, $ga, 0)>; 123581ad6265SDimitry Andric def : Pat<(atomic_store_32 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 123681ad6265SDimitry Andric (PSTWpc $RS, $ga, 0)>; 123781ad6265SDimitry Andric def : Pat<(atomic_store_8 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 123881ad6265SDimitry Andric (PSTB8pc $RS, $ga, 0)>; 123981ad6265SDimitry Andric def : Pat<(atomic_store_16 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 124081ad6265SDimitry Andric (PSTH8pc $RS, $ga, 0)>; 124181ad6265SDimitry Andric def : Pat<(atomic_store_32 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 124281ad6265SDimitry Andric (PSTW8pc $RS, $ga, 0)>; 124381ad6265SDimitry Andric def : Pat<(atomic_store_64 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 124481ad6265SDimitry Andric (PSTDpc $RS, $ga, 0)>; 124581ad6265SDimitry Andric 124681ad6265SDimitry Andric // Special Cases For PPCstore_scal_int_from_vsr 124781ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 124881ad6265SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), 124981ad6265SDimitry Andric (PPCmatpcreladdr PCRelForm:$dst), 8), 125081ad6265SDimitry Andric (PSTXSDpc (XSCVDPSXDS f64:$src), $dst, 0)>; 125181ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 125281ad6265SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), 125381ad6265SDimitry Andric (PPCmatpcreladdr PCRelForm:$dst), 8), 125481ad6265SDimitry Andric (PSTXSDpc (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), $dst, 0)>; 125581ad6265SDimitry Andric 125681ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 125781ad6265SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), 125881ad6265SDimitry Andric (PPCmatpcreladdr PCRelForm:$dst), 8), 125981ad6265SDimitry Andric (PSTXSDpc (XSCVDPUXDS f64:$src), $dst, 0)>; 126081ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 126181ad6265SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), 126281ad6265SDimitry Andric (PPCmatpcreladdr PCRelForm:$dst), 8), 126381ad6265SDimitry Andric (PSTXSDpc (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), $dst, 0)>; 126481ad6265SDimitry Andric 126581ad6265SDimitry Andric def : Pat<(v4f32 (PPCldvsxlh (PPCmatpcreladdr PCRelForm:$addr))), 126681ad6265SDimitry Andric (SUBREG_TO_REG (i64 1), (PLFDpc $addr, 0), sub_64)>; 126781ad6265SDimitry Andric 126881ad6265SDimitry Andric // If the PPCmatpcreladdr node is not caught by any other pattern it should be 126981ad6265SDimitry Andric // caught here and turned into a paddi instruction to materialize the address. 127081ad6265SDimitry Andric def : Pat<(PPCmatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>; 127181ad6265SDimitry Andric // PPCtlsdynamatpcreladdr node is used for TLS dynamic models to materialize 127281ad6265SDimitry Andric // tls global address with paddi instruction. 127381ad6265SDimitry Andric def : Pat<(PPCtlsdynamatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>; 127481ad6265SDimitry Andric // PPCtlslocalexecmataddr node is used for TLS local exec models to 127581ad6265SDimitry Andric // materialize tls global address with paddi instruction. 127681ad6265SDimitry Andric def : Pat<(PPCaddTls i64:$in, (PPCtlslocalexecmataddr tglobaltlsaddr:$addr)), 127781ad6265SDimitry Andric (PADDI8 $in, $addr)>; 127881ad6265SDimitry Andric} 127981ad6265SDimitry Andric 128081ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 128181ad6265SDimitry Andric def XXPERMX : 128281ad6265SDimitry Andric 8RR_XX4Form_IMM3_XTABC6<34, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 128381ad6265SDimitry Andric vsrc:$XC, u3imm:$UIM), 128481ad6265SDimitry Andric "xxpermx $XT, $XA, $XB, $XC, $UIM", 128581ad6265SDimitry Andric IIC_VecPerm, []>; 128681ad6265SDimitry Andric def XXBLENDVB : 128781ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 128881ad6265SDimitry Andric vsrc:$XC), "xxblendvb $XT, $XA, $XB, $XC", 128981ad6265SDimitry Andric IIC_VecGeneral, []>; 129081ad6265SDimitry Andric def XXBLENDVH : 129181ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 129281ad6265SDimitry Andric vsrc:$XC), "xxblendvh $XT, $XA, $XB, $XC", 129381ad6265SDimitry Andric IIC_VecGeneral, []>; 129481ad6265SDimitry Andric def XXBLENDVW : 129581ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 2, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 129681ad6265SDimitry Andric vsrc:$XC), "xxblendvw $XT, $XA, $XB, $XC", 129781ad6265SDimitry Andric IIC_VecGeneral, []>; 129881ad6265SDimitry Andric def XXBLENDVD : 129981ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 3, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 130081ad6265SDimitry Andric vsrc:$XC), "xxblendvd $XT, $XA, $XB, $XC", 130181ad6265SDimitry Andric IIC_VecGeneral, []>; 130281ad6265SDimitry Andric} 130381ad6265SDimitry Andric 130481ad6265SDimitry Andric// XXSPLTIW/DP/32DX need extra flags to make sure the compiler does not attempt 130581ad6265SDimitry Andric// to spill part of the instruction when the values are similar. 130681ad6265SDimitry Andriclet isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1, Predicates = [PrefixInstrs] in { 130781ad6265SDimitry Andric def XXSPLTIW : 8RR_DForm_IMM32_XT6<32, 3, (outs vsrc:$XT), 130881ad6265SDimitry Andric (ins i32imm:$IMM32), 130981ad6265SDimitry Andric "xxspltiw $XT, $IMM32", IIC_VecGeneral, 131081ad6265SDimitry Andric []>; 131181ad6265SDimitry Andric def XXSPLTIDP : 8RR_DForm_IMM32_XT6<32, 2, (outs vsrc:$XT), 131281ad6265SDimitry Andric (ins i32imm:$IMM32), 131381ad6265SDimitry Andric "xxspltidp $XT, $IMM32", IIC_VecGeneral, 131481ad6265SDimitry Andric [(set v2f64:$XT, 131581ad6265SDimitry Andric (PPCxxspltidp i32:$IMM32))]>; 131681ad6265SDimitry Andric def XXSPLTI32DX : 131781ad6265SDimitry Andric 8RR_DForm_IMM32_XT6_IX<32, 0, (outs vsrc:$XT), 131881ad6265SDimitry Andric (ins vsrc:$XTi, u1imm:$IX, i32imm:$IMM32), 131981ad6265SDimitry Andric "xxsplti32dx $XT, $IX, $IMM32", IIC_VecGeneral, 132081ad6265SDimitry Andric [(set v2i64:$XT, 132181ad6265SDimitry Andric (PPCxxsplti32dx v2i64:$XTi, i32:$IX, 132281ad6265SDimitry Andric i32:$IMM32))]>, 132381ad6265SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">; 132481ad6265SDimitry Andric} 132581ad6265SDimitry Andric 132681ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 132781ad6265SDimitry Andric def SETBC : XForm_XT5_BI5<31, 384, (outs gprc:$RT), (ins crbitrc:$BI), 1328*bdd1243dSDimitry Andric "setbc $RT, $BI", IIC_IntCompare, []>, 1329*bdd1243dSDimitry Andric SExt32To64, ZExt32To64; 133081ad6265SDimitry Andric def SETBCR : XForm_XT5_BI5<31, 416, (outs gprc:$RT), (ins crbitrc:$BI), 1331*bdd1243dSDimitry Andric "setbcr $RT, $BI", IIC_IntCompare, []>, 1332*bdd1243dSDimitry Andric SExt32To64, ZExt32To64; 133381ad6265SDimitry Andric def SETNBC : XForm_XT5_BI5<31, 448, (outs gprc:$RT), (ins crbitrc:$BI), 1334*bdd1243dSDimitry Andric "setnbc $RT, $BI", IIC_IntCompare, []>, 1335*bdd1243dSDimitry Andric SExt32To64; 133681ad6265SDimitry Andric def SETNBCR : XForm_XT5_BI5<31, 480, (outs gprc:$RT), (ins crbitrc:$BI), 1337*bdd1243dSDimitry Andric "setnbcr $RT, $BI", IIC_IntCompare, []>, 1338*bdd1243dSDimitry Andric SExt32To64; 133981ad6265SDimitry Andric 134081ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 134181ad6265SDimitry Andric def SETBC8 : XForm_XT5_BI5<31, 384, (outs g8rc:$RT), (ins crbitrc:$BI), 1342*bdd1243dSDimitry Andric "setbc $RT, $BI", IIC_IntCompare, []>, 1343*bdd1243dSDimitry Andric SExt32To64, ZExt32To64; 134481ad6265SDimitry Andric def SETBCR8 : XForm_XT5_BI5<31, 416, (outs g8rc:$RT), (ins crbitrc:$BI), 1345*bdd1243dSDimitry Andric "setbcr $RT, $BI", IIC_IntCompare, []>, 1346*bdd1243dSDimitry Andric SExt32To64, ZExt32To64; 134781ad6265SDimitry Andric def SETNBC8 : XForm_XT5_BI5<31, 448, (outs g8rc:$RT), (ins crbitrc:$BI), 1348*bdd1243dSDimitry Andric "setnbc $RT, $BI", IIC_IntCompare, []>, 1349*bdd1243dSDimitry Andric SExt32To64; 135081ad6265SDimitry Andric def SETNBCR8 : XForm_XT5_BI5<31, 480, (outs g8rc:$RT), (ins crbitrc:$BI), 1351*bdd1243dSDimitry Andric "setnbcr $RT, $BI", IIC_IntCompare, []>, 1352*bdd1243dSDimitry Andric SExt32To64; 135381ad6265SDimitry Andric } 135481ad6265SDimitry Andric 135581ad6265SDimitry Andric def VSLDBI : VNForm_VTAB5_SD3<22, 0, (outs vrrc:$VRT), 135681ad6265SDimitry Andric (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SH), 135781ad6265SDimitry Andric "vsldbi $VRT, $VRA, $VRB, $SH", 135881ad6265SDimitry Andric IIC_VecGeneral, 135981ad6265SDimitry Andric [(set v16i8:$VRT, 136081ad6265SDimitry Andric (int_ppc_altivec_vsldbi v16i8:$VRA, 136181ad6265SDimitry Andric v16i8:$VRB, 136281ad6265SDimitry Andric timm:$SH))]>; 136381ad6265SDimitry Andric def VSRDBI : VNForm_VTAB5_SD3<22, 1, (outs vrrc:$VRT), 136481ad6265SDimitry Andric (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SH), 136581ad6265SDimitry Andric "vsrdbi $VRT, $VRA, $VRB, $SH", 136681ad6265SDimitry Andric IIC_VecGeneral, 136781ad6265SDimitry Andric [(set v16i8:$VRT, 136881ad6265SDimitry Andric (int_ppc_altivec_vsrdbi v16i8:$VRA, 136981ad6265SDimitry Andric v16i8:$VRB, 137081ad6265SDimitry Andric timm:$SH))]>; 137181ad6265SDimitry Andric defm VSTRIBR : VXForm_VTB5_RCr<13, 1, (outs vrrc:$vT), (ins vrrc:$vB), 137281ad6265SDimitry Andric "vstribr", "$vT, $vB", IIC_VecGeneral, 137381ad6265SDimitry Andric [(set v16i8:$vT, 137481ad6265SDimitry Andric (int_ppc_altivec_vstribr v16i8:$vB))]>; 137581ad6265SDimitry Andric defm VSTRIBL : VXForm_VTB5_RCr<13, 0, (outs vrrc:$vT), (ins vrrc:$vB), 137681ad6265SDimitry Andric "vstribl", "$vT, $vB", IIC_VecGeneral, 137781ad6265SDimitry Andric [(set v16i8:$vT, 137881ad6265SDimitry Andric (int_ppc_altivec_vstribl v16i8:$vB))]>; 137981ad6265SDimitry Andric defm VSTRIHR : VXForm_VTB5_RCr<13, 3, (outs vrrc:$vT), (ins vrrc:$vB), 138081ad6265SDimitry Andric "vstrihr", "$vT, $vB", IIC_VecGeneral, 138181ad6265SDimitry Andric [(set v8i16:$vT, 138281ad6265SDimitry Andric (int_ppc_altivec_vstrihr v8i16:$vB))]>; 138381ad6265SDimitry Andric defm VSTRIHL : VXForm_VTB5_RCr<13, 2, (outs vrrc:$vT), (ins vrrc:$vB), 138481ad6265SDimitry Andric "vstrihl", "$vT, $vB", IIC_VecGeneral, 138581ad6265SDimitry Andric [(set v8i16:$vT, 138681ad6265SDimitry Andric (int_ppc_altivec_vstrihl v8i16:$vB))]>; 138781ad6265SDimitry Andric def VINSW : 138881ad6265SDimitry Andric VXForm_1<207, (outs vrrc:$vD), (ins vrrc:$vDi, u4imm:$UIM, gprc:$rB), 138981ad6265SDimitry Andric "vinsw $vD, $rB, $UIM", IIC_VecGeneral, 139081ad6265SDimitry Andric [(set v4i32:$vD, 139181ad6265SDimitry Andric (int_ppc_altivec_vinsw v4i32:$vDi, i32:$rB, timm:$UIM))]>, 139281ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 139381ad6265SDimitry Andric def VINSD : 139481ad6265SDimitry Andric VXForm_1<463, (outs vrrc:$vD), (ins vrrc:$vDi, u4imm:$UIM, g8rc:$rB), 139581ad6265SDimitry Andric "vinsd $vD, $rB, $UIM", IIC_VecGeneral, 139681ad6265SDimitry Andric [(set v2i64:$vD, 139781ad6265SDimitry Andric (int_ppc_altivec_vinsd v2i64:$vDi, i64:$rB, timm:$UIM))]>, 139881ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 139981ad6265SDimitry Andric def VINSBVLX : 140081ad6265SDimitry Andric VXForm_VTB5_RA5_ins<15, "vinsbvlx", 140181ad6265SDimitry Andric [(set v16i8:$vD, 140281ad6265SDimitry Andric (int_ppc_altivec_vinsbvlx v16i8:$vDi, i32:$rA, 140381ad6265SDimitry Andric v16i8:$vB))]>; 140481ad6265SDimitry Andric def VINSBVRX : 140581ad6265SDimitry Andric VXForm_VTB5_RA5_ins<271, "vinsbvrx", 140681ad6265SDimitry Andric [(set v16i8:$vD, 140781ad6265SDimitry Andric (int_ppc_altivec_vinsbvrx v16i8:$vDi, i32:$rA, 140881ad6265SDimitry Andric v16i8:$vB))]>; 140981ad6265SDimitry Andric def VINSHVLX : 141081ad6265SDimitry Andric VXForm_VTB5_RA5_ins<79, "vinshvlx", 141181ad6265SDimitry Andric [(set v8i16:$vD, 141281ad6265SDimitry Andric (int_ppc_altivec_vinshvlx v8i16:$vDi, i32:$rA, 141381ad6265SDimitry Andric v8i16:$vB))]>; 141481ad6265SDimitry Andric def VINSHVRX : 141581ad6265SDimitry Andric VXForm_VTB5_RA5_ins<335, "vinshvrx", 141681ad6265SDimitry Andric [(set v8i16:$vD, 141781ad6265SDimitry Andric (int_ppc_altivec_vinshvrx v8i16:$vDi, i32:$rA, 141881ad6265SDimitry Andric v8i16:$vB))]>; 141981ad6265SDimitry Andric def VINSWVLX : 142081ad6265SDimitry Andric VXForm_VTB5_RA5_ins<143, "vinswvlx", 142181ad6265SDimitry Andric [(set v4i32:$vD, 142281ad6265SDimitry Andric (int_ppc_altivec_vinswvlx v4i32:$vDi, i32:$rA, 142381ad6265SDimitry Andric v4i32:$vB))]>; 142481ad6265SDimitry Andric def VINSWVRX : 142581ad6265SDimitry Andric VXForm_VTB5_RA5_ins<399, "vinswvrx", 142681ad6265SDimitry Andric [(set v4i32:$vD, 142781ad6265SDimitry Andric (int_ppc_altivec_vinswvrx v4i32:$vDi, i32:$rA, 142881ad6265SDimitry Andric v4i32:$vB))]>; 142981ad6265SDimitry Andric def VINSBLX : 143081ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<527, "vinsblx", 143181ad6265SDimitry Andric [(set v16i8:$vD, 143281ad6265SDimitry Andric (int_ppc_altivec_vinsblx v16i8:$vDi, i32:$rA, 143381ad6265SDimitry Andric i32:$rB))]>; 143481ad6265SDimitry Andric def VINSBRX : 143581ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<783, "vinsbrx", 143681ad6265SDimitry Andric [(set v16i8:$vD, 143781ad6265SDimitry Andric (int_ppc_altivec_vinsbrx v16i8:$vDi, i32:$rA, 143881ad6265SDimitry Andric i32:$rB))]>; 143981ad6265SDimitry Andric def VINSHLX : 144081ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<591, "vinshlx", 144181ad6265SDimitry Andric [(set v8i16:$vD, 144281ad6265SDimitry Andric (int_ppc_altivec_vinshlx v8i16:$vDi, i32:$rA, 144381ad6265SDimitry Andric i32:$rB))]>; 144481ad6265SDimitry Andric def VINSHRX : 144581ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<847, "vinshrx", 144681ad6265SDimitry Andric [(set v8i16:$vD, 144781ad6265SDimitry Andric (int_ppc_altivec_vinshrx v8i16:$vDi, i32:$rA, 144881ad6265SDimitry Andric i32:$rB))]>; 144981ad6265SDimitry Andric def VINSWLX : 145081ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<655, "vinswlx", 145181ad6265SDimitry Andric [(set v4i32:$vD, 145281ad6265SDimitry Andric (int_ppc_altivec_vinswlx v4i32:$vDi, i32:$rA, 145381ad6265SDimitry Andric i32:$rB))]>; 145481ad6265SDimitry Andric def VINSWRX : 145581ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<911, "vinswrx", 145681ad6265SDimitry Andric [(set v4i32:$vD, 145781ad6265SDimitry Andric (int_ppc_altivec_vinswrx v4i32:$vDi, i32:$rA, 145881ad6265SDimitry Andric i32:$rB))]>; 145981ad6265SDimitry Andric def VINSDLX : 146081ad6265SDimitry Andric VXForm_1<719, (outs vrrc:$vD), (ins vrrc:$vDi, g8rc:$rA, g8rc:$rB), 146181ad6265SDimitry Andric "vinsdlx $vD, $rA, $rB", IIC_VecGeneral, 146281ad6265SDimitry Andric [(set v2i64:$vD, 146381ad6265SDimitry Andric (int_ppc_altivec_vinsdlx v2i64:$vDi, i64:$rA, i64:$rB))]>, 146481ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 146581ad6265SDimitry Andric def VINSDRX : 146681ad6265SDimitry Andric VXForm_1<975, (outs vrrc:$vD), (ins vrrc:$vDi, g8rc:$rA, g8rc:$rB), 146781ad6265SDimitry Andric "vinsdrx $vD, $rA, $rB", IIC_VecGeneral, 146881ad6265SDimitry Andric [(set v2i64:$vD, 146981ad6265SDimitry Andric (int_ppc_altivec_vinsdrx v2i64:$vDi, i64:$rA, i64:$rB))]>, 147081ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 147181ad6265SDimitry Andric def VEXTRACTBM : VXForm_RD5_XO5_RS5<1602, 8, (outs gprc:$rD), (ins vrrc:$vB), 147281ad6265SDimitry Andric "vextractbm $rD, $vB", IIC_VecGeneral, 147381ad6265SDimitry Andric [(set i32:$rD, 1474*bdd1243dSDimitry Andric (int_ppc_altivec_vextractbm v16i8:$vB))]>, 1475*bdd1243dSDimitry Andric ZExt32To64; 147681ad6265SDimitry Andric def VEXTRACTHM : VXForm_RD5_XO5_RS5<1602, 9, (outs gprc:$rD), (ins vrrc:$vB), 147781ad6265SDimitry Andric "vextracthm $rD, $vB", IIC_VecGeneral, 147881ad6265SDimitry Andric [(set i32:$rD, 1479*bdd1243dSDimitry Andric (int_ppc_altivec_vextracthm v8i16:$vB))]>, 1480*bdd1243dSDimitry Andric ZExt32To64; 148181ad6265SDimitry Andric def VEXTRACTWM : VXForm_RD5_XO5_RS5<1602, 10, (outs gprc:$rD), (ins vrrc:$vB), 148281ad6265SDimitry Andric "vextractwm $rD, $vB", IIC_VecGeneral, 148381ad6265SDimitry Andric [(set i32:$rD, 1484*bdd1243dSDimitry Andric (int_ppc_altivec_vextractwm v4i32:$vB))]>, 1485*bdd1243dSDimitry Andric ZExt32To64; 148681ad6265SDimitry Andric def VEXTRACTDM : VXForm_RD5_XO5_RS5<1602, 11, (outs gprc:$rD), (ins vrrc:$vB), 148781ad6265SDimitry Andric "vextractdm $rD, $vB", IIC_VecGeneral, 148881ad6265SDimitry Andric [(set i32:$rD, 1489*bdd1243dSDimitry Andric (int_ppc_altivec_vextractdm v2i64:$vB))]>, 1490*bdd1243dSDimitry Andric ZExt32To64; 149181ad6265SDimitry Andric def VEXTRACTQM : VXForm_RD5_XO5_RS5<1602, 12, (outs gprc:$rD), (ins vrrc:$vB), 149281ad6265SDimitry Andric "vextractqm $rD, $vB", IIC_VecGeneral, 149381ad6265SDimitry Andric [(set i32:$rD, 149481ad6265SDimitry Andric (int_ppc_altivec_vextractqm v1i128:$vB))]>; 149581ad6265SDimitry Andric def VEXPANDBM : VXForm_RD5_XO5_RS5<1602, 0, (outs vrrc:$vD), (ins vrrc:$vB), 149681ad6265SDimitry Andric "vexpandbm $vD, $vB", IIC_VecGeneral, 149781ad6265SDimitry Andric [(set v16i8:$vD, (int_ppc_altivec_vexpandbm 149881ad6265SDimitry Andric v16i8:$vB))]>; 149981ad6265SDimitry Andric def VEXPANDHM : VXForm_RD5_XO5_RS5<1602, 1, (outs vrrc:$vD), (ins vrrc:$vB), 150081ad6265SDimitry Andric "vexpandhm $vD, $vB", IIC_VecGeneral, 150181ad6265SDimitry Andric [(set v8i16:$vD, (int_ppc_altivec_vexpandhm 150281ad6265SDimitry Andric v8i16:$vB))]>; 150381ad6265SDimitry Andric def VEXPANDWM : VXForm_RD5_XO5_RS5<1602, 2, (outs vrrc:$vD), (ins vrrc:$vB), 150481ad6265SDimitry Andric "vexpandwm $vD, $vB", IIC_VecGeneral, 150581ad6265SDimitry Andric [(set v4i32:$vD, (int_ppc_altivec_vexpandwm 150681ad6265SDimitry Andric v4i32:$vB))]>; 150781ad6265SDimitry Andric def VEXPANDDM : VXForm_RD5_XO5_RS5<1602, 3, (outs vrrc:$vD), (ins vrrc:$vB), 150881ad6265SDimitry Andric "vexpanddm $vD, $vB", IIC_VecGeneral, 150981ad6265SDimitry Andric [(set v2i64:$vD, (int_ppc_altivec_vexpanddm 151081ad6265SDimitry Andric v2i64:$vB))]>; 151181ad6265SDimitry Andric def VEXPANDQM : VXForm_RD5_XO5_RS5<1602, 4, (outs vrrc:$vD), (ins vrrc:$vB), 151281ad6265SDimitry Andric "vexpandqm $vD, $vB", IIC_VecGeneral, 151381ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vexpandqm 151481ad6265SDimitry Andric v1i128:$vB))]>; 151581ad6265SDimitry Andric def MTVSRBM : VXForm_RD5_XO5_RS5<1602, 16, (outs vrrc:$vD), (ins g8rc:$rB), 151681ad6265SDimitry Andric "mtvsrbm $vD, $rB", IIC_VecGeneral, 151781ad6265SDimitry Andric [(set v16i8:$vD, 151881ad6265SDimitry Andric (int_ppc_altivec_mtvsrbm i64:$rB))]>; 151981ad6265SDimitry Andric def MTVSRHM : VXForm_RD5_XO5_RS5<1602, 17, (outs vrrc:$vD), (ins g8rc:$rB), 152081ad6265SDimitry Andric "mtvsrhm $vD, $rB", IIC_VecGeneral, 152181ad6265SDimitry Andric [(set v8i16:$vD, 152281ad6265SDimitry Andric (int_ppc_altivec_mtvsrhm i64:$rB))]>; 152381ad6265SDimitry Andric def MTVSRWM : VXForm_RD5_XO5_RS5<1602, 18, (outs vrrc:$vD), (ins g8rc:$rB), 152481ad6265SDimitry Andric "mtvsrwm $vD, $rB", IIC_VecGeneral, 152581ad6265SDimitry Andric [(set v4i32:$vD, 152681ad6265SDimitry Andric (int_ppc_altivec_mtvsrwm i64:$rB))]>; 152781ad6265SDimitry Andric def MTVSRDM : VXForm_RD5_XO5_RS5<1602, 19, (outs vrrc:$vD), (ins g8rc:$rB), 152881ad6265SDimitry Andric "mtvsrdm $vD, $rB", IIC_VecGeneral, 152981ad6265SDimitry Andric [(set v2i64:$vD, 153081ad6265SDimitry Andric (int_ppc_altivec_mtvsrdm i64:$rB))]>; 153181ad6265SDimitry Andric def MTVSRQM : VXForm_RD5_XO5_RS5<1602, 20, (outs vrrc:$vD), (ins g8rc:$rB), 153281ad6265SDimitry Andric "mtvsrqm $vD, $rB", IIC_VecGeneral, 153381ad6265SDimitry Andric [(set v1i128:$vD, 153481ad6265SDimitry Andric (int_ppc_altivec_mtvsrqm i64:$rB))]>; 153581ad6265SDimitry Andric def MTVSRBMI : DXForm<4, 10, (outs vrrc:$vD), (ins u16imm64:$D), 153681ad6265SDimitry Andric "mtvsrbmi $vD, $D", IIC_VecGeneral, 153781ad6265SDimitry Andric [(set v16i8:$vD, 153881ad6265SDimitry Andric (int_ppc_altivec_mtvsrbm imm:$D))]>; 153981ad6265SDimitry Andric def VCNTMBB : VXForm_RD5_MP_VB5<1602, 12, (outs g8rc:$rD), 154081ad6265SDimitry Andric (ins vrrc:$vB, u1imm:$MP), 154181ad6265SDimitry Andric "vcntmbb $rD, $vB, $MP", IIC_VecGeneral, 154281ad6265SDimitry Andric [(set i64:$rD, (int_ppc_altivec_vcntmbb 154381ad6265SDimitry Andric v16i8:$vB, timm:$MP))]>; 154481ad6265SDimitry Andric def VCNTMBH : VXForm_RD5_MP_VB5<1602, 13, (outs g8rc:$rD), 154581ad6265SDimitry Andric (ins vrrc:$vB, u1imm:$MP), 154681ad6265SDimitry Andric "vcntmbh $rD, $vB, $MP", IIC_VecGeneral, 154781ad6265SDimitry Andric [(set i64:$rD, (int_ppc_altivec_vcntmbh 154881ad6265SDimitry Andric v8i16:$vB, timm:$MP))]>; 154981ad6265SDimitry Andric def VCNTMBW : VXForm_RD5_MP_VB5<1602, 14, (outs g8rc:$rD), 155081ad6265SDimitry Andric (ins vrrc:$vB, u1imm:$MP), 155181ad6265SDimitry Andric "vcntmbw $rD, $vB, $MP", IIC_VecGeneral, 155281ad6265SDimitry Andric [(set i64:$rD, (int_ppc_altivec_vcntmbw 155381ad6265SDimitry Andric v4i32:$vB, timm:$MP))]>; 155481ad6265SDimitry Andric def VCNTMBD : VXForm_RD5_MP_VB5<1602, 15, (outs g8rc:$rD), 155581ad6265SDimitry Andric (ins vrrc:$vB, u1imm:$MP), 155681ad6265SDimitry Andric "vcntmbd $rD, $vB, $MP", IIC_VecGeneral, 155781ad6265SDimitry Andric [(set i64:$rD, (int_ppc_altivec_vcntmbd 155881ad6265SDimitry Andric v2i64:$vB, timm:$MP))]>; 155981ad6265SDimitry Andric def VEXTDUBVLX : VAForm_1a<24, (outs vrrc:$vD), 156081ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 156181ad6265SDimitry Andric "vextdubvlx $vD, $vA, $vB, $rC", 156281ad6265SDimitry Andric IIC_VecGeneral, 156381ad6265SDimitry Andric [(set v2i64:$vD, 156481ad6265SDimitry Andric (int_ppc_altivec_vextdubvlx v16i8:$vA, 156581ad6265SDimitry Andric v16i8:$vB, 156681ad6265SDimitry Andric i32:$rC))]>; 156781ad6265SDimitry Andric def VEXTDUBVRX : VAForm_1a<25, (outs vrrc:$vD), 156881ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 156981ad6265SDimitry Andric "vextdubvrx $vD, $vA, $vB, $rC", 157081ad6265SDimitry Andric IIC_VecGeneral, 157181ad6265SDimitry Andric [(set v2i64:$vD, 157281ad6265SDimitry Andric (int_ppc_altivec_vextdubvrx v16i8:$vA, 157381ad6265SDimitry Andric v16i8:$vB, 157481ad6265SDimitry Andric i32:$rC))]>; 157581ad6265SDimitry Andric def VEXTDUHVLX : VAForm_1a<26, (outs vrrc:$vD), 157681ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 157781ad6265SDimitry Andric "vextduhvlx $vD, $vA, $vB, $rC", 157881ad6265SDimitry Andric IIC_VecGeneral, 157981ad6265SDimitry Andric [(set v2i64:$vD, 158081ad6265SDimitry Andric (int_ppc_altivec_vextduhvlx v8i16:$vA, 158181ad6265SDimitry Andric v8i16:$vB, 158281ad6265SDimitry Andric i32:$rC))]>; 158381ad6265SDimitry Andric def VEXTDUHVRX : VAForm_1a<27, (outs vrrc:$vD), 158481ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 158581ad6265SDimitry Andric "vextduhvrx $vD, $vA, $vB, $rC", 158681ad6265SDimitry Andric IIC_VecGeneral, 158781ad6265SDimitry Andric [(set v2i64:$vD, 158881ad6265SDimitry Andric (int_ppc_altivec_vextduhvrx v8i16:$vA, 158981ad6265SDimitry Andric v8i16:$vB, 159081ad6265SDimitry Andric i32:$rC))]>; 159181ad6265SDimitry Andric def VEXTDUWVLX : VAForm_1a<28, (outs vrrc:$vD), 159281ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 159381ad6265SDimitry Andric "vextduwvlx $vD, $vA, $vB, $rC", 159481ad6265SDimitry Andric IIC_VecGeneral, 159581ad6265SDimitry Andric [(set v2i64:$vD, 159681ad6265SDimitry Andric (int_ppc_altivec_vextduwvlx v4i32:$vA, 159781ad6265SDimitry Andric v4i32:$vB, 159881ad6265SDimitry Andric i32:$rC))]>; 159981ad6265SDimitry Andric def VEXTDUWVRX : VAForm_1a<29, (outs vrrc:$vD), 160081ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 160181ad6265SDimitry Andric "vextduwvrx $vD, $vA, $vB, $rC", 160281ad6265SDimitry Andric IIC_VecGeneral, 160381ad6265SDimitry Andric [(set v2i64:$vD, 160481ad6265SDimitry Andric (int_ppc_altivec_vextduwvrx v4i32:$vA, 160581ad6265SDimitry Andric v4i32:$vB, 160681ad6265SDimitry Andric i32:$rC))]>; 160781ad6265SDimitry Andric def VEXTDDVLX : VAForm_1a<30, (outs vrrc:$vD), 160881ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 160981ad6265SDimitry Andric "vextddvlx $vD, $vA, $vB, $rC", 161081ad6265SDimitry Andric IIC_VecGeneral, 161181ad6265SDimitry Andric [(set v2i64:$vD, 161281ad6265SDimitry Andric (int_ppc_altivec_vextddvlx v2i64:$vA, 161381ad6265SDimitry Andric v2i64:$vB, 161481ad6265SDimitry Andric i32:$rC))]>; 161581ad6265SDimitry Andric def VEXTDDVRX : VAForm_1a<31, (outs vrrc:$vD), 161681ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, gprc:$rC), 161781ad6265SDimitry Andric "vextddvrx $vD, $vA, $vB, $rC", 161881ad6265SDimitry Andric IIC_VecGeneral, 161981ad6265SDimitry Andric [(set v2i64:$vD, 162081ad6265SDimitry Andric (int_ppc_altivec_vextddvrx v2i64:$vA, 162181ad6265SDimitry Andric v2i64:$vB, 162281ad6265SDimitry Andric i32:$rC))]>; 162381ad6265SDimitry Andric def VPDEPD : VXForm_1<1485, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 162481ad6265SDimitry Andric "vpdepd $vD, $vA, $vB", IIC_VecGeneral, 162581ad6265SDimitry Andric [(set v2i64:$vD, 162681ad6265SDimitry Andric (int_ppc_altivec_vpdepd v2i64:$vA, v2i64:$vB))]>; 162781ad6265SDimitry Andric def VPEXTD : VXForm_1<1421, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 162881ad6265SDimitry Andric "vpextd $vD, $vA, $vB", IIC_VecGeneral, 162981ad6265SDimitry Andric [(set v2i64:$vD, 163081ad6265SDimitry Andric (int_ppc_altivec_vpextd v2i64:$vA, v2i64:$vB))]>; 163181ad6265SDimitry Andric def PDEPD : XForm_6<31, 156, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 163281ad6265SDimitry Andric "pdepd $rA, $rS, $rB", IIC_IntGeneral, 163381ad6265SDimitry Andric [(set i64:$rA, (int_ppc_pdepd i64:$rS, i64:$rB))]>; 163481ad6265SDimitry Andric def PEXTD : XForm_6<31, 188, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 163581ad6265SDimitry Andric "pextd $rA, $rS, $rB", IIC_IntGeneral, 163681ad6265SDimitry Andric [(set i64:$rA, (int_ppc_pextd i64:$rS, i64:$rB))]>; 163781ad6265SDimitry Andric def VCFUGED : VXForm_1<1357, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 163881ad6265SDimitry Andric "vcfuged $vD, $vA, $vB", IIC_VecGeneral, 163981ad6265SDimitry Andric [(set v2i64:$vD, 164081ad6265SDimitry Andric (int_ppc_altivec_vcfuged v2i64:$vA, v2i64:$vB))]>; 164181ad6265SDimitry Andric def VGNB : VXForm_RD5_N3_VB5<1228, (outs g8rc:$rD), (ins vrrc:$vB, u3imm:$N), 164281ad6265SDimitry Andric "vgnb $rD, $vB, $N", IIC_VecGeneral, 164381ad6265SDimitry Andric [(set i64:$rD, 164481ad6265SDimitry Andric (int_ppc_altivec_vgnb v1i128:$vB, timm:$N))]>; 164581ad6265SDimitry Andric def CFUGED : XForm_6<31, 220, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 164681ad6265SDimitry Andric "cfuged $rA, $rS, $rB", IIC_IntGeneral, 164781ad6265SDimitry Andric [(set i64:$rA, (int_ppc_cfuged i64:$rS, i64:$rB))]>; 164881ad6265SDimitry Andric def XXEVAL : 164981ad6265SDimitry Andric 8RR_XX4Form_IMM8_XTAB6<34, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 165081ad6265SDimitry Andric vsrc:$XC, u8imm:$IMM), 165181ad6265SDimitry Andric "xxeval $XT, $XA, $XB, $XC, $IMM", IIC_VecGeneral, 165281ad6265SDimitry Andric [(set v2i64:$XT, (int_ppc_vsx_xxeval v2i64:$XA, 165381ad6265SDimitry Andric v2i64:$XB, v2i64:$XC, timm:$IMM))]>; 165481ad6265SDimitry Andric def VCLZDM : VXForm_1<1924, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 165581ad6265SDimitry Andric "vclzdm $vD, $vA, $vB", IIC_VecGeneral, 165681ad6265SDimitry Andric [(set v2i64:$vD, 165781ad6265SDimitry Andric (int_ppc_altivec_vclzdm v2i64:$vA, v2i64:$vB))]>; 165881ad6265SDimitry Andric def VCTZDM : VXForm_1<1988, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 165981ad6265SDimitry Andric "vctzdm $vD, $vA, $vB", IIC_VecGeneral, 166081ad6265SDimitry Andric [(set v2i64:$vD, 166181ad6265SDimitry Andric (int_ppc_altivec_vctzdm v2i64:$vA, v2i64:$vB))]>; 166281ad6265SDimitry Andric def CNTLZDM : XForm_6<31, 59, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 166381ad6265SDimitry Andric "cntlzdm $rA, $rS, $rB", IIC_IntGeneral, 166481ad6265SDimitry Andric [(set i64:$rA, 166581ad6265SDimitry Andric (int_ppc_cntlzdm i64:$rS, i64:$rB))]>; 166681ad6265SDimitry Andric def CNTTZDM : XForm_6<31, 571, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB), 166781ad6265SDimitry Andric "cnttzdm $rA, $rS, $rB", IIC_IntGeneral, 166881ad6265SDimitry Andric [(set i64:$rA, 166981ad6265SDimitry Andric (int_ppc_cnttzdm i64:$rS, i64:$rB))]>; 167081ad6265SDimitry Andric def XXGENPCVBM : 167181ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 916, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 167281ad6265SDimitry Andric "xxgenpcvbm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 167381ad6265SDimitry Andric def XXGENPCVHM : 167481ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 917, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 167581ad6265SDimitry Andric "xxgenpcvhm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 167681ad6265SDimitry Andric def XXGENPCVWM : 167781ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 948, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 167881ad6265SDimitry Andric "xxgenpcvwm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 167981ad6265SDimitry Andric def XXGENPCVDM : 168081ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 949, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 168181ad6265SDimitry Andric "xxgenpcvdm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 168281ad6265SDimitry Andric def VCLRLB : VXForm_1<397, (outs vrrc:$vD), (ins vrrc:$vA, gprc:$rB), 168381ad6265SDimitry Andric "vclrlb $vD, $vA, $rB", IIC_VecGeneral, 168481ad6265SDimitry Andric [(set v16i8:$vD, 168581ad6265SDimitry Andric (int_ppc_altivec_vclrlb v16i8:$vA, i32:$rB))]>; 168681ad6265SDimitry Andric def VCLRRB : VXForm_1<461, (outs vrrc:$vD), (ins vrrc:$vA, gprc:$rB), 168781ad6265SDimitry Andric "vclrrb $vD, $vA, $rB", IIC_VecGeneral, 168881ad6265SDimitry Andric [(set v16i8:$vD, 168981ad6265SDimitry Andric (int_ppc_altivec_vclrrb v16i8:$vA, i32:$rB))]>; 169081ad6265SDimitry Andric def VMULLD : VXForm_1<457, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 169181ad6265SDimitry Andric "vmulld $vD, $vA, $vB", IIC_VecGeneral, 169281ad6265SDimitry Andric [(set v2i64:$vD, (mul v2i64:$vA, v2i64:$vB))]>; 169381ad6265SDimitry Andric def VMULHSW : VXForm_1<905, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 169481ad6265SDimitry Andric "vmulhsw $vD, $vA, $vB", IIC_VecGeneral, 169581ad6265SDimitry Andric [(set v4i32:$vD, (mulhs v4i32:$vA, v4i32:$vB))]>; 169681ad6265SDimitry Andric def VMULHUW : VXForm_1<649, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 169781ad6265SDimitry Andric "vmulhuw $vD, $vA, $vB", IIC_VecGeneral, 169881ad6265SDimitry Andric [(set v4i32:$vD, (mulhu v4i32:$vA, v4i32:$vB))]>; 169981ad6265SDimitry Andric def VMULHSD : VXForm_1<969, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 170081ad6265SDimitry Andric "vmulhsd $vD, $vA, $vB", IIC_VecGeneral, 170181ad6265SDimitry Andric [(set v2i64:$vD, (mulhs v2i64:$vA, v2i64:$vB))]>; 170281ad6265SDimitry Andric def VMULHUD : VXForm_1<713, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 170381ad6265SDimitry Andric "vmulhud $vD, $vA, $vB", IIC_VecGeneral, 170481ad6265SDimitry Andric [(set v2i64:$vD, (mulhu v2i64:$vA, v2i64:$vB))]>; 170581ad6265SDimitry Andric def VMODSW : VXForm_1<1931, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 170681ad6265SDimitry Andric "vmodsw $vD, $vA, $vB", IIC_VecGeneral, 170781ad6265SDimitry Andric [(set v4i32:$vD, (srem v4i32:$vA, v4i32:$vB))]>; 170881ad6265SDimitry Andric def VMODUW : VXForm_1<1675, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 170981ad6265SDimitry Andric "vmoduw $vD, $vA, $vB", IIC_VecGeneral, 171081ad6265SDimitry Andric [(set v4i32:$vD, (urem v4i32:$vA, v4i32:$vB))]>; 171181ad6265SDimitry Andric def VMODSD : VXForm_1<1995, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 171281ad6265SDimitry Andric "vmodsd $vD, $vA, $vB", IIC_VecGeneral, 171381ad6265SDimitry Andric [(set v2i64:$vD, (srem v2i64:$vA, v2i64:$vB))]>; 171481ad6265SDimitry Andric def VMODUD : VXForm_1<1739, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 171581ad6265SDimitry Andric "vmodud $vD, $vA, $vB", IIC_VecGeneral, 171681ad6265SDimitry Andric [(set v2i64:$vD, (urem v2i64:$vA, v2i64:$vB))]>; 171781ad6265SDimitry Andric def VDIVSW : VXForm_1<395, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 171881ad6265SDimitry Andric "vdivsw $vD, $vA, $vB", IIC_VecGeneral, 171981ad6265SDimitry Andric [(set v4i32:$vD, (sdiv v4i32:$vA, v4i32:$vB))]>; 172081ad6265SDimitry Andric def VDIVUW : VXForm_1<139, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 172181ad6265SDimitry Andric "vdivuw $vD, $vA, $vB", IIC_VecGeneral, 172281ad6265SDimitry Andric [(set v4i32:$vD, (udiv v4i32:$vA, v4i32:$vB))]>; 172381ad6265SDimitry Andric def VDIVSD : VXForm_1<459, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 172481ad6265SDimitry Andric "vdivsd $vD, $vA, $vB", IIC_VecGeneral, 172581ad6265SDimitry Andric [(set v2i64:$vD, (sdiv v2i64:$vA, v2i64:$vB))]>; 172681ad6265SDimitry Andric def VDIVUD : VXForm_1<203, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 172781ad6265SDimitry Andric "vdivud $vD, $vA, $vB", IIC_VecGeneral, 172881ad6265SDimitry Andric [(set v2i64:$vD, (udiv v2i64:$vA, v2i64:$vB))]>; 172981ad6265SDimitry Andric def VDIVESW : VXForm_1<907, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 173081ad6265SDimitry Andric "vdivesw $vD, $vA, $vB", IIC_VecGeneral, 173181ad6265SDimitry Andric [(set v4i32:$vD, (int_ppc_altivec_vdivesw v4i32:$vA, 173281ad6265SDimitry Andric v4i32:$vB))]>; 173381ad6265SDimitry Andric def VDIVEUW : VXForm_1<651, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 173481ad6265SDimitry Andric "vdiveuw $vD, $vA, $vB", IIC_VecGeneral, 173581ad6265SDimitry Andric [(set v4i32:$vD, (int_ppc_altivec_vdiveuw v4i32:$vA, 173681ad6265SDimitry Andric v4i32:$vB))]>; 173781ad6265SDimitry Andric def VDIVESD : VXForm_1<971, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 173881ad6265SDimitry Andric "vdivesd $vD, $vA, $vB", IIC_VecGeneral, 173981ad6265SDimitry Andric [(set v2i64:$vD, (int_ppc_altivec_vdivesd v2i64:$vA, 174081ad6265SDimitry Andric v2i64:$vB))]>; 174181ad6265SDimitry Andric def VDIVEUD : VXForm_1<715, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 174281ad6265SDimitry Andric "vdiveud $vD, $vA, $vB", IIC_VecGeneral, 174381ad6265SDimitry Andric [(set v2i64:$vD, (int_ppc_altivec_vdiveud v2i64:$vA, 174481ad6265SDimitry Andric v2i64:$vB))]>; 174581ad6265SDimitry Andric def XVTLSBB : XX2_BF3_XO5_XB6_XO9<60, 2, 475, (outs crrc:$BF), (ins vsrc:$XB), 174681ad6265SDimitry Andric "xvtlsbb $BF, $XB", IIC_VecGeneral, []>; 1747*bdd1243dSDimitry Andric def BRH : XForm_11<31, 219, (outs gprc:$RA), (ins gprc:$RS), 1748*bdd1243dSDimitry Andric "brh $RA, $RS", IIC_IntRotate, []>; 1749*bdd1243dSDimitry Andric def BRW : XForm_11<31, 155, (outs gprc:$RA), (ins gprc:$RS), 1750*bdd1243dSDimitry Andric "brw $RA, $RS", IIC_IntRotate, 1751*bdd1243dSDimitry Andric [(set i32:$RA, (bswap i32:$RS))]>; 1752*bdd1243dSDimitry Andric let isCodeGenOnly = 1 in { 1753*bdd1243dSDimitry Andric def BRH8 : XForm_11<31, 219, (outs g8rc:$RA), (ins g8rc:$RS), 1754*bdd1243dSDimitry Andric "brh $RA, $RS", IIC_IntRotate, []>; 1755*bdd1243dSDimitry Andric def BRW8 : XForm_11<31, 155, (outs g8rc:$RA), (ins g8rc:$RS), 1756*bdd1243dSDimitry Andric "brw $RA, $RS", IIC_IntRotate, []>; 1757*bdd1243dSDimitry Andric } 1758*bdd1243dSDimitry Andric def BRD : XForm_11<31, 187, (outs g8rc:$RA), (ins g8rc:$RS), 1759*bdd1243dSDimitry Andric "brd $RA, $RS", IIC_IntRotate, 1760*bdd1243dSDimitry Andric [(set i64:$RA, (bswap i64:$RS))]>; 176181ad6265SDimitry Andric 176281ad6265SDimitry Andric // The XFormMemOp flag for the following 8 instructions is set on 176381ad6265SDimitry Andric // the instruction format. 176481ad6265SDimitry Andric let mayLoad = 1, mayStore = 0 in { 176581ad6265SDimitry Andric def LXVRBX : X_XT6_RA5_RB5<31, 13, "lxvrbx", vsrc, []>; 176681ad6265SDimitry Andric def LXVRHX : X_XT6_RA5_RB5<31, 45, "lxvrhx", vsrc, []>; 176781ad6265SDimitry Andric def LXVRWX : X_XT6_RA5_RB5<31, 77, "lxvrwx", vsrc, []>; 176881ad6265SDimitry Andric def LXVRDX : X_XT6_RA5_RB5<31, 109, "lxvrdx", vsrc, []>; 176981ad6265SDimitry Andric } 177081ad6265SDimitry Andric 177181ad6265SDimitry Andric let mayLoad = 0, mayStore = 1 in { 177281ad6265SDimitry Andric def STXVRBX : X_XS6_RA5_RB5<31, 141, "stxvrbx", vsrc, []>; 177381ad6265SDimitry Andric def STXVRHX : X_XS6_RA5_RB5<31, 173, "stxvrhx", vsrc, []>; 177481ad6265SDimitry Andric def STXVRWX : X_XS6_RA5_RB5<31, 205, "stxvrwx", vsrc, []>; 177581ad6265SDimitry Andric def STXVRDX : X_XS6_RA5_RB5<31, 237, "stxvrdx", vsrc, []>; 177681ad6265SDimitry Andric } 177781ad6265SDimitry Andric 177881ad6265SDimitry Andric def VMULESD : VXForm_1<968, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 177981ad6265SDimitry Andric "vmulesd $vD, $vA, $vB", IIC_VecGeneral, 178081ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmulesd v2i64:$vA, 178181ad6265SDimitry Andric v2i64:$vB))]>; 178281ad6265SDimitry Andric def VMULEUD : VXForm_1<712, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 178381ad6265SDimitry Andric "vmuleud $vD, $vA, $vB", IIC_VecGeneral, 178481ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmuleud v2i64:$vA, 178581ad6265SDimitry Andric v2i64:$vB))]>; 178681ad6265SDimitry Andric def VMULOSD : VXForm_1<456, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 178781ad6265SDimitry Andric "vmulosd $vD, $vA, $vB", IIC_VecGeneral, 178881ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmulosd v2i64:$vA, 178981ad6265SDimitry Andric v2i64:$vB))]>; 179081ad6265SDimitry Andric def VMULOUD : VXForm_1<200, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 179181ad6265SDimitry Andric "vmuloud $vD, $vA, $vB", IIC_VecGeneral, 179281ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmuloud v2i64:$vA, 179381ad6265SDimitry Andric v2i64:$vB))]>; 179481ad6265SDimitry Andric def VMSUMCUD : VAForm_1a<23, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, vrrc:$vC), 179581ad6265SDimitry Andric "vmsumcud $vD, $vA, $vB, $vC", IIC_VecGeneral, 179681ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vmsumcud 179781ad6265SDimitry Andric v2i64:$vA, v2i64:$vB, v1i128:$vC))]>; 179881ad6265SDimitry Andric def VDIVSQ : VXForm_1<267, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 179981ad6265SDimitry Andric "vdivsq $vD, $vA, $vB", IIC_VecGeneral, 180081ad6265SDimitry Andric [(set v1i128:$vD, (sdiv v1i128:$vA, v1i128:$vB))]>; 180181ad6265SDimitry Andric def VDIVUQ : VXForm_1<11, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 180281ad6265SDimitry Andric "vdivuq $vD, $vA, $vB", IIC_VecGeneral, 180381ad6265SDimitry Andric [(set v1i128:$vD, (udiv v1i128:$vA, v1i128:$vB))]>; 180481ad6265SDimitry Andric def VDIVESQ : VXForm_1<779, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 180581ad6265SDimitry Andric "vdivesq $vD, $vA, $vB", IIC_VecGeneral, 180681ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vdivesq v1i128:$vA, 180781ad6265SDimitry Andric v1i128:$vB))]>; 180881ad6265SDimitry Andric def VDIVEUQ : VXForm_1<523, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 180981ad6265SDimitry Andric "vdiveuq $vD, $vA, $vB", IIC_VecGeneral, 181081ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vdiveuq v1i128:$vA, 181181ad6265SDimitry Andric v1i128:$vB))]>; 181281ad6265SDimitry Andric def VCMPEQUQ : VCMP <455, "vcmpequq $vD, $vA, $vB" , v1i128>; 181381ad6265SDimitry Andric def VCMPGTSQ : VCMP <903, "vcmpgtsq $vD, $vA, $vB" , v1i128>; 181481ad6265SDimitry Andric def VCMPGTUQ : VCMP <647, "vcmpgtuq $vD, $vA, $vB" , v1i128>; 181581ad6265SDimitry Andric def VCMPEQUQ_rec : VCMP_rec <455, "vcmpequq. $vD, $vA, $vB" , v1i128>; 181681ad6265SDimitry Andric def VCMPGTSQ_rec : VCMP_rec <903, "vcmpgtsq. $vD, $vA, $vB" , v1i128>; 181781ad6265SDimitry Andric def VCMPGTUQ_rec : VCMP_rec <647, "vcmpgtuq. $vD, $vA, $vB" , v1i128>; 181881ad6265SDimitry Andric def VMODSQ : VXForm_1<1803, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 181981ad6265SDimitry Andric "vmodsq $vD, $vA, $vB", IIC_VecGeneral, 182081ad6265SDimitry Andric [(set v1i128:$vD, (srem v1i128:$vA, v1i128:$vB))]>; 182181ad6265SDimitry Andric def VMODUQ : VXForm_1<1547, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), 182281ad6265SDimitry Andric "vmoduq $vD, $vA, $vB", IIC_VecGeneral, 182381ad6265SDimitry Andric [(set v1i128:$vD, (urem v1i128:$vA, v1i128:$vB))]>; 182481ad6265SDimitry Andric def VEXTSD2Q : VXForm_RD5_XO5_RS5<1538, 27, (outs vrrc:$vD), (ins vrrc:$vB), 182581ad6265SDimitry Andric "vextsd2q $vD, $vB", IIC_VecGeneral, 182681ad6265SDimitry Andric [(set v1i128:$vD, (int_ppc_altivec_vextsd2q v2i64:$vB))]>; 182781ad6265SDimitry Andric def VCMPUQ : VXForm_BF3_VAB5<257, (outs crrc:$BF), (ins vrrc:$vA, vrrc:$vB), 182881ad6265SDimitry Andric "vcmpuq $BF, $vA, $vB", IIC_VecGeneral, []>; 182981ad6265SDimitry Andric def VCMPSQ : VXForm_BF3_VAB5<321, (outs crrc:$BF), (ins vrrc:$vA, vrrc:$vB), 183081ad6265SDimitry Andric "vcmpsq $BF, $vA, $vB", IIC_VecGeneral, []>; 183181ad6265SDimitry Andric def VRLQNM : VX1_VT5_VA5_VB5<325, "vrlqnm", 183281ad6265SDimitry Andric [(set v1i128:$vD, 183381ad6265SDimitry Andric (int_ppc_altivec_vrlqnm v1i128:$vA, 183481ad6265SDimitry Andric v1i128:$vB))]>; 183581ad6265SDimitry Andric def VRLQMI : VXForm_1<69, (outs vrrc:$vD), 183681ad6265SDimitry Andric (ins vrrc:$vA, vrrc:$vB, vrrc:$vDi), 183781ad6265SDimitry Andric "vrlqmi $vD, $vA, $vB", IIC_VecFP, 183881ad6265SDimitry Andric [(set v1i128:$vD, 183981ad6265SDimitry Andric (int_ppc_altivec_vrlqmi v1i128:$vA, v1i128:$vB, 184081ad6265SDimitry Andric v1i128:$vDi))]>, 184181ad6265SDimitry Andric RegConstraint<"$vDi = $vD">, NoEncode<"$vDi">; 184281ad6265SDimitry Andric def VSLQ : VX1_VT5_VA5_VB5<261, "vslq", []>; 184381ad6265SDimitry Andric def VSRAQ : VX1_VT5_VA5_VB5<773, "vsraq", []>; 184481ad6265SDimitry Andric def VSRQ : VX1_VT5_VA5_VB5<517, "vsrq", []>; 184581ad6265SDimitry Andric def VRLQ : VX1_VT5_VA5_VB5<5, "vrlq", []>; 184681ad6265SDimitry Andric def XSCVQPUQZ : X_VT5_XO5_VB5<63, 0, 836, "xscvqpuqz", []>; 184781ad6265SDimitry Andric def XSCVQPSQZ : X_VT5_XO5_VB5<63, 8, 836, "xscvqpsqz", []>; 184881ad6265SDimitry Andric def XSCVUQQP : X_VT5_XO5_VB5<63, 3, 836, "xscvuqqp", []>; 184981ad6265SDimitry Andric def XSCVSQQP : X_VT5_XO5_VB5<63, 11, 836, "xscvsqqp", []>; 185081ad6265SDimitry Andric def LXVKQ : XForm_XT6_IMM5<60, 31, 360, (outs vsrc:$XT), (ins u5imm:$UIM), 185181ad6265SDimitry Andric "lxvkq $XT, $UIM", IIC_VecGeneral, []>; 185281ad6265SDimitry Andric} 185381ad6265SDimitry Andric 185481ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX] in { 185581ad6265SDimitry Andric def XVCVSPBF16 : XX2_XT6_XO5_XB6<60, 17, 475, "xvcvspbf16", vsrc, []>; 185681ad6265SDimitry Andric def XVCVBF16SPN : XX2_XT6_XO5_XB6<60, 16, 475, "xvcvbf16spn", vsrc, []>; 185781ad6265SDimitry Andric def XSMAXCQP : X_VT5_VA5_VB5<63, 676, "xsmaxcqp", 185881ad6265SDimitry Andric [(set f128:$vT, (PPCxsmaxc f128:$vA, f128:$vB))]>; 185981ad6265SDimitry Andric def XSMINCQP : X_VT5_VA5_VB5<63, 740, "xsmincqp", 186081ad6265SDimitry Andric [(set f128:$vT, (PPCxsminc f128:$vA, f128:$vB))]>; 186181ad6265SDimitry Andric} 186281ad6265SDimitry Andric 186381ad6265SDimitry Andric// Multiclass defining patterns for Set Boolean Extension Reverse Instructions. 186481ad6265SDimitry Andric// This is analogous to the CRNotPat multiclass but specifically for Power10 186581ad6265SDimitry Andric// and newer subtargets since the extended forms use Set Boolean instructions. 186681ad6265SDimitry Andric// The first two anonymous patterns defined are actually a duplicate of those 186781ad6265SDimitry Andric// in CRNotPat, but it is preferable to define both multiclasses as complete 186881ad6265SDimitry Andric// ones rather than pulling that small common section out. 186981ad6265SDimitry Andricmulticlass P10ReverseSetBool<dag pattern, dag result> { 187081ad6265SDimitry Andric def : Pat<pattern, (crnot result)>; 187181ad6265SDimitry Andric def : Pat<(not pattern), result>; 187281ad6265SDimitry Andric 187381ad6265SDimitry Andric def : Pat<(i32 (zext pattern)), 187481ad6265SDimitry Andric (SETBCR result)>; 187581ad6265SDimitry Andric def : Pat<(i64 (zext pattern)), 187681ad6265SDimitry Andric (SETBCR8 result)>; 187781ad6265SDimitry Andric 187881ad6265SDimitry Andric def : Pat<(i32 (sext pattern)), 187981ad6265SDimitry Andric (SETNBCR result)>; 188081ad6265SDimitry Andric def : Pat<(i64 (sext pattern)), 188181ad6265SDimitry Andric (SETNBCR8 result)>; 188281ad6265SDimitry Andric 188381ad6265SDimitry Andric def : Pat<(i32 (anyext pattern)), 188481ad6265SDimitry Andric (SETBCR result)>; 188581ad6265SDimitry Andric def : Pat<(i64 (anyext pattern)), 188681ad6265SDimitry Andric (SETBCR8 result)>; 188781ad6265SDimitry Andric} 188881ad6265SDimitry Andric 188981ad6265SDimitry Andricmulticlass IntSetP10RevSetBool<SDNode SetCC, ValueType Ty, PatLeaf ZExtTy, 189081ad6265SDimitry Andric ImmLeaf SExtTy, I Cmpi, I Cmpli, 189181ad6265SDimitry Andric I Cmp, I Cmpl> { 189281ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)), 189381ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_lt)>; 189481ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)), 189581ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_lt)>; 189681ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)), 189781ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_gt)>; 189881ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)), 189981ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_gt)>; 190081ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)), 190181ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_eq)>; 190281ad6265SDimitry Andric 190381ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETUGE)), 190481ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_lt)>; 190581ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETGE)), 190681ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_lt)>; 190781ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETULE)), 190881ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_gt)>; 190981ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETLE)), 191081ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_gt)>; 191181ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETNE)), 191281ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_eq)>; 191381ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETNE)), 191481ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_eq)>; 191581ad6265SDimitry Andric} 191681ad6265SDimitry Andric 191781ad6265SDimitry Andricmulticlass FSetP10RevSetBool<SDNode SetCC, ValueType Ty, I FCmp> { 191881ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)), 191981ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>; 192081ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)), 192181ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>; 192281ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)), 192381ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>; 192481ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)), 192581ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>; 192681ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUNE)), 192781ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>; 192881ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)), 192981ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>; 193081ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETO)), 193181ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_un)>; 193281ad6265SDimitry Andric} 193381ad6265SDimitry Andric 193481ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 193581ad6265SDimitry Andric def : Pat<(i32 (zext i1:$in)), 193681ad6265SDimitry Andric (SETBC $in)>; 193781ad6265SDimitry Andric def : Pat<(i64 (zext i1:$in)), 193881ad6265SDimitry Andric (SETBC8 $in)>; 193981ad6265SDimitry Andric def : Pat<(i32 (sext i1:$in)), 194081ad6265SDimitry Andric (SETNBC $in)>; 194181ad6265SDimitry Andric def : Pat<(i64 (sext i1:$in)), 194281ad6265SDimitry Andric (SETNBC8 $in)>; 194381ad6265SDimitry Andric def : Pat<(i32 (anyext i1:$in)), 194481ad6265SDimitry Andric (SETBC $in)>; 194581ad6265SDimitry Andric def : Pat<(i64 (anyext i1:$in)), 194681ad6265SDimitry Andric (SETBC8 $in)>; 194781ad6265SDimitry Andric 194881ad6265SDimitry Andric // Instantiation of the set boolean reverse patterns for 32-bit integers. 194981ad6265SDimitry Andric defm : IntSetP10RevSetBool<setcc, i32, immZExt16, imm32SExt16, 195081ad6265SDimitry Andric CMPWI, CMPLWI, CMPW, CMPLW>; 195181ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (setcc i32:$s1, imm:$imm, SETNE)), 195281ad6265SDimitry Andric (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)), 195381ad6265SDimitry Andric (LO16 imm:$imm)), sub_eq)>; 195481ad6265SDimitry Andric 195581ad6265SDimitry Andric // Instantiation of the set boolean reverse patterns for 64-bit integers. 195681ad6265SDimitry Andric defm : IntSetP10RevSetBool<setcc, i64, immZExt16, imm64SExt16, 195781ad6265SDimitry Andric CMPDI, CMPLDI, CMPD, CMPLD>; 195881ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETNE)), 195981ad6265SDimitry Andric (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)), 196081ad6265SDimitry Andric (LO16 imm:$imm)), sub_eq)>; 196181ad6265SDimitry Andric} 196281ad6265SDimitry Andric 196381ad6265SDimitry Andric// Instantiation of the set boolean reverse patterns for f32, f64, f128. 196481ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasFPU] in { 196581ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f32, FCMPUS>; 196681ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f64, FCMPUD>; 196781ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f128, XSCMPUQP>; 196881ad6265SDimitry Andric} 196981ad6265SDimitry Andric 197081ad6265SDimitry Andric//---------------------------- Anonymous Patterns ----------------------------// 197181ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 197281ad6265SDimitry Andric // Exploit the vector multiply high instructions using intrinsics. 197381ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_altivec_vmulhsw v4i32:$vA, v4i32:$vB)), 197481ad6265SDimitry Andric (v4i32 (VMULHSW $vA, $vB))>; 197581ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_altivec_vmulhuw v4i32:$vA, v4i32:$vB)), 197681ad6265SDimitry Andric (v4i32 (VMULHUW $vA, $vB))>; 197781ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_altivec_vmulhsd v2i64:$vA, v2i64:$vB)), 197881ad6265SDimitry Andric (v2i64 (VMULHSD $vA, $vB))>; 197981ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_altivec_vmulhud v2i64:$vA, v2i64:$vB)), 198081ad6265SDimitry Andric (v2i64 (VMULHUD $vA, $vB))>; 198181ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxgenpcvbm v16i8:$VRB, imm:$IMM)), 198281ad6265SDimitry Andric (v16i8 (COPY_TO_REGCLASS (XXGENPCVBM $VRB, imm:$IMM), VRRC))>; 198381ad6265SDimitry Andric def : Pat<(v8i16 (int_ppc_vsx_xxgenpcvhm v8i16:$VRB, imm:$IMM)), 198481ad6265SDimitry Andric (v8i16 (COPY_TO_REGCLASS (XXGENPCVHM $VRB, imm:$IMM), VRRC))>; 198581ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_vsx_xxgenpcvwm v4i32:$VRB, imm:$IMM)), 198681ad6265SDimitry Andric (v4i32 (COPY_TO_REGCLASS (XXGENPCVWM $VRB, imm:$IMM), VRRC))>; 198781ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_vsx_xxgenpcvdm v2i64:$VRB, imm:$IMM)), 198881ad6265SDimitry Andric (v2i64 (COPY_TO_REGCLASS (XXGENPCVDM $VRB, imm:$IMM), VRRC))>; 198981ad6265SDimitry Andric def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 1)), 199081ad6265SDimitry Andric (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_lt)>; 199181ad6265SDimitry Andric def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 0)), 199281ad6265SDimitry Andric (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_eq)>; 1993*bdd1243dSDimitry Andric def : Pat<(srl (bswap i32:$RS), (i32 16)), 1994*bdd1243dSDimitry Andric (RLDICL_32 (BRH $RS), 0, 48)>; 1995*bdd1243dSDimitry Andric def : Pat<(i64 (zext (i32 (srl (bswap i32:$RS), (i32 16))))), 1996*bdd1243dSDimitry Andric (RLDICL_32_64 (BRH $RS), 0, 48)>; 199781ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 8)), 199881ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VRRC))>; 199981ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 16)), 200081ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VRRC))>; 200181ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 32)), 200281ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRWX ForceXForm:$src), VRRC))>; 200381ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 64)), 200481ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRDX ForceXForm:$src), VRRC))>; 200581ad6265SDimitry Andric 200681ad6265SDimitry Andric def : Pat<(v1i128 (rotl v1i128:$vA, v1i128:$vB)), 200781ad6265SDimitry Andric (v1i128 (VRLQ v1i128:$vA, v1i128:$vB))>; 200881ad6265SDimitry Andric 200981ad6265SDimitry Andric def : Pat <(v2i64 (PPCxxsplti32dx v2i64:$XT, i32:$XI, i32:$IMM32)), 201081ad6265SDimitry Andric (v2i64 (XXSPLTI32DX v2i64:$XT, i32:$XI, i32:$IMM32))>; 201181ad6265SDimitry Andric} 201281ad6265SDimitry Andric 201381ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX] in { 201481ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xvcvspbf16 v16i8:$XA)), 201581ad6265SDimitry Andric (COPY_TO_REGCLASS (XVCVSPBF16 RCCp.AToVSRC), VRRC)>; 201681ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xvcvbf16spn v16i8:$XA)), 201781ad6265SDimitry Andric (COPY_TO_REGCLASS (XVCVBF16SPN RCCp.AToVSRC), VRRC)>; 201881ad6265SDimitry Andric} 201981ad6265SDimitry Andric 202081ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, IsLittleEndian] in { 202181ad6265SDimitry Andric // Store element 0 of a VSX register to memory 202281ad6265SDimitry Andric def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$src, 0)), ForceXForm:$dst), 202381ad6265SDimitry Andric (STXVRBX (COPY_TO_REGCLASS v16i8:$src, VSRC), ForceXForm:$dst)>; 202481ad6265SDimitry Andric def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$src, 0)), ForceXForm:$dst), 202581ad6265SDimitry Andric (STXVRHX (COPY_TO_REGCLASS v8i16:$src, VSRC), ForceXForm:$dst)>; 202681ad6265SDimitry Andric def : Pat<(store (i32 (extractelt v4i32:$src, 0)), ForceXForm:$dst), 202781ad6265SDimitry Andric (STXVRWX $src, ForceXForm:$dst)>; 202881ad6265SDimitry Andric def : Pat<(store (f32 (extractelt v4f32:$src, 0)), ForceXForm:$dst), 202981ad6265SDimitry Andric (STXVRWX $src, ForceXForm:$dst)>; 203081ad6265SDimitry Andric def : Pat<(store (i64 (extractelt v2i64:$src, 0)), ForceXForm:$dst), 203181ad6265SDimitry Andric (STXVRDX $src, ForceXForm:$dst)>; 203281ad6265SDimitry Andric def : Pat<(store (f64 (extractelt v2f64:$src, 0)), ForceXForm:$dst), 203381ad6265SDimitry Andric (STXVRDX $src, ForceXForm:$dst)>; 203481ad6265SDimitry Andric // Load element 0 of a VSX register to memory 203581ad6265SDimitry Andric def : Pat<(v8i16 (scalar_to_vector (i32 (extloadi16 ForceXForm:$src)))), 203681ad6265SDimitry Andric (v8i16 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VSRC))>; 203781ad6265SDimitry Andric def : Pat<(v16i8 (scalar_to_vector (i32 (extloadi8 ForceXForm:$src)))), 203881ad6265SDimitry Andric (v16i8 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VSRC))>; 203981ad6265SDimitry Andric } 204081ad6265SDimitry Andric 204181ad6265SDimitry Andric// FIXME: The swap is overkill when the shift amount is a constant. 204281ad6265SDimitry Andric// We should just fix the constant in the DAG. 204381ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX] in { 204481ad6265SDimitry Andric def : Pat<(v1i128 (shl v1i128:$VRA, v1i128:$VRB)), 204581ad6265SDimitry Andric (v1i128 (VSLQ v1i128:$VRA, 204681ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 204781ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 204881ad6265SDimitry Andric def : Pat<(v1i128 (PPCshl v1i128:$VRA, v1i128:$VRB)), 204981ad6265SDimitry Andric (v1i128 (VSLQ v1i128:$VRA, 205081ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 205181ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 205281ad6265SDimitry Andric def : Pat<(v1i128 (srl v1i128:$VRA, v1i128:$VRB)), 205381ad6265SDimitry Andric (v1i128 (VSRQ v1i128:$VRA, 205481ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 205581ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 205681ad6265SDimitry Andric def : Pat<(v1i128 (PPCsrl v1i128:$VRA, v1i128:$VRB)), 205781ad6265SDimitry Andric (v1i128 (VSRQ v1i128:$VRA, 205881ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 205981ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 206081ad6265SDimitry Andric def : Pat<(v1i128 (sra v1i128:$VRA, v1i128:$VRB)), 206181ad6265SDimitry Andric (v1i128 (VSRAQ v1i128:$VRA, 206281ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 206381ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 206481ad6265SDimitry Andric def : Pat<(v1i128 (PPCsra v1i128:$VRA, v1i128:$VRB)), 206581ad6265SDimitry Andric (v1i128 (VSRAQ v1i128:$VRA, 206681ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 206781ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 206881ad6265SDimitry Andric} 206981ad6265SDimitry Andric 207081ad6265SDimitry Andricclass xxevalPattern <dag pattern, bits<8> imm> : 207181ad6265SDimitry Andric Pat<(v4i32 pattern), (XXEVAL $vA, $vB, $vC, imm)> {} 207281ad6265SDimitry Andric 207381ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [PrefixInstrs] in { 207481ad6265SDimitry Andric def : Pat<(v4i32 (build_vector i32immNonAllOneNonZero:$A, 207581ad6265SDimitry Andric i32immNonAllOneNonZero:$A, 207681ad6265SDimitry Andric i32immNonAllOneNonZero:$A, 207781ad6265SDimitry Andric i32immNonAllOneNonZero:$A)), 207881ad6265SDimitry Andric (v4i32 (XXSPLTIW imm:$A))>; 207981ad6265SDimitry Andric def : Pat<(f32 nzFPImmAsi32:$A), 208081ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)), 208181ad6265SDimitry Andric VSFRC)>; 208281ad6265SDimitry Andric def : Pat<(f64 nzFPImmAsi32:$A), 208381ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)), 208481ad6265SDimitry Andric VSFRC)>; 208581ad6265SDimitry Andric 208681ad6265SDimitry Andric// To replace constant pool with XXSPLTI32DX for scalars. 208781ad6265SDimitry Andricdef : Pat<(f32 nzFPImmAsi64:$A), 208881ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX(IMPLICIT_DEF), 0, 208981ad6265SDimitry Andric (getFPAs64BitIntHi $A)), 209081ad6265SDimitry Andric 1, (getFPAs64BitIntLo $A)), 209181ad6265SDimitry Andric VSSRC)>; 209281ad6265SDimitry Andric 209381ad6265SDimitry Andricdef : Pat<(f64 nzFPImmAsi64:$A), 209481ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX (IMPLICIT_DEF), 0, 209581ad6265SDimitry Andric (getFPAs64BitIntHi $A)), 209681ad6265SDimitry Andric 1, (getFPAs64BitIntLo $A)), 209781ad6265SDimitry Andric VSFRC)>; 209881ad6265SDimitry Andric 209981ad6265SDimitry Andric // Anonymous patterns for XXEVAL 210081ad6265SDimitry Andric // AND 210181ad6265SDimitry Andric // and(A, B, C) 210281ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 1>; 210381ad6265SDimitry Andric // and(A, xor(B, C)) 210481ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 6>; 210581ad6265SDimitry Andric // and(A, or(B, C)) 210681ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 7>; 210781ad6265SDimitry Andric // and(A, nor(B, C)) 210881ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 8>; 210981ad6265SDimitry Andric // and(A, eqv(B, C)) 211081ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 9>; 211181ad6265SDimitry Andric // and(A, nand(B, C)) 211281ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 14>; 211381ad6265SDimitry Andric 211481ad6265SDimitry Andric // NAND 211581ad6265SDimitry Andric // nand(A, B, C) 211681ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 211781ad6265SDimitry Andric !sub(255, 1)>; 211881ad6265SDimitry Andric // nand(A, xor(B, C)) 211981ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 212081ad6265SDimitry Andric !sub(255, 6)>; 212181ad6265SDimitry Andric // nand(A, or(B, C)) 212281ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 212381ad6265SDimitry Andric !sub(255, 7)>; 212481ad6265SDimitry Andric // nand(A, nor(B, C)) 212581ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 212681ad6265SDimitry Andric !sub(255, 8)>; 212781ad6265SDimitry Andric // nand(A, eqv(B, C)) 212881ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 212981ad6265SDimitry Andric !sub(255, 9)>; 213081ad6265SDimitry Andric // nand(A, nand(B, C)) 213181ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 213281ad6265SDimitry Andric !sub(255, 14)>; 213381ad6265SDimitry Andric 2134*bdd1243dSDimitry Andric // EQV 2135*bdd1243dSDimitry Andric // (eqv A, B, C) 2136*bdd1243dSDimitry Andric def : xxevalPattern<(or (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 2137*bdd1243dSDimitry Andric (vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)))), 2138*bdd1243dSDimitry Andric 150>; 2139*bdd1243dSDimitry Andric // (eqv A, (and B, C)) 2140*bdd1243dSDimitry Andric def : xxevalPattern<(vnot (xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 225>; 2141*bdd1243dSDimitry Andric // (eqv A, (or B, C)) 2142*bdd1243dSDimitry Andric def : xxevalPattern<(vnot (xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 135>; 2143*bdd1243dSDimitry Andric 2144*bdd1243dSDimitry Andric // NOR 2145*bdd1243dSDimitry Andric // (nor A, B, C) 2146*bdd1243dSDimitry Andric def : xxevalPattern<(vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 128>; 2147*bdd1243dSDimitry Andric // (nor A, (and B, C)) 2148*bdd1243dSDimitry Andric def : xxevalPattern<(vnot (or v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 224>; 2149*bdd1243dSDimitry Andric // (nor A, (eqv B, C)) 2150*bdd1243dSDimitry Andric def : xxevalPattern<(and (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 96>; 2151*bdd1243dSDimitry Andric // (nor A, (nand B, C)) 2152*bdd1243dSDimitry Andric def : xxevalPattern<(and (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 16>; 2153*bdd1243dSDimitry Andric // (nor A, (nor B, C)) 2154*bdd1243dSDimitry Andric def : xxevalPattern<(and (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 112>; 2155*bdd1243dSDimitry Andric // (nor A, (xor B, C)) 2156*bdd1243dSDimitry Andric def : xxevalPattern<(vnot (or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 144>; 2157*bdd1243dSDimitry Andric 2158*bdd1243dSDimitry Andric // OR 2159*bdd1243dSDimitry Andric // (or A, B, C) 2160*bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 127>; 2161*bdd1243dSDimitry Andric // (or A, (and B, C)) 2162*bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 31>; 2163*bdd1243dSDimitry Andric // (or A, (eqv B, C)) 2164*bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 159>; 2165*bdd1243dSDimitry Andric // (or A, (nand B, C)) 2166*bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 239>; 2167*bdd1243dSDimitry Andric // (or A, (nor B, C)) 2168*bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 143>; 2169*bdd1243dSDimitry Andric // (or A, (xor B, C)) 2170*bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 111>; 2171*bdd1243dSDimitry Andric 2172*bdd1243dSDimitry Andric // XOR 2173*bdd1243dSDimitry Andric // (xor A, B, C) 2174*bdd1243dSDimitry Andric def : xxevalPattern<(xor v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 105>; 2175*bdd1243dSDimitry Andric // (xor A, (and B, C)) 2176*bdd1243dSDimitry Andric def : xxevalPattern<(xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 30>; 2177*bdd1243dSDimitry Andric // (xor A, (or B, C)) 2178*bdd1243dSDimitry Andric def : xxevalPattern<(xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 120>; 2179*bdd1243dSDimitry Andric 218081ad6265SDimitry Andric // Anonymous patterns to select prefixed VSX loads and stores. 218181ad6265SDimitry Andric // Load / Store f128 218281ad6265SDimitry Andric def : Pat<(f128 (load PDForm:$src)), 218381ad6265SDimitry Andric (COPY_TO_REGCLASS (PLXV memri34:$src), VRRC)>; 218481ad6265SDimitry Andric def : Pat<(store f128:$XS, PDForm:$dst), 218581ad6265SDimitry Andric (PSTXV (COPY_TO_REGCLASS $XS, VSRC), memri34:$dst)>; 218681ad6265SDimitry Andric 218781ad6265SDimitry Andric // Load / Store v4i32 218881ad6265SDimitry Andric def : Pat<(v4i32 (load PDForm:$src)), (PLXV memri34:$src)>; 218981ad6265SDimitry Andric def : Pat<(store v4i32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 219081ad6265SDimitry Andric 219181ad6265SDimitry Andric // Load / Store v2i64 219281ad6265SDimitry Andric def : Pat<(v2i64 (load PDForm:$src)), (PLXV memri34:$src)>; 219381ad6265SDimitry Andric def : Pat<(store v2i64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 219481ad6265SDimitry Andric 219581ad6265SDimitry Andric // Load / Store v4f32 219681ad6265SDimitry Andric def : Pat<(v4f32 (load PDForm:$src)), (PLXV memri34:$src)>; 219781ad6265SDimitry Andric def : Pat<(store v4f32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 219881ad6265SDimitry Andric 219981ad6265SDimitry Andric // Load / Store v2f64 220081ad6265SDimitry Andric def : Pat<(v2f64 (load PDForm:$src)), (PLXV memri34:$src)>; 220181ad6265SDimitry Andric def : Pat<(store v2f64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 220281ad6265SDimitry Andric 220381ad6265SDimitry Andric // Cases For PPCstore_scal_int_from_vsr 220481ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 220581ad6265SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), PDForm:$dst, 8), 220681ad6265SDimitry Andric (PSTXSD (XSCVDPUXDS f64:$src), PDForm:$dst)>; 220781ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 220881ad6265SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), PDForm:$dst, 8), 220981ad6265SDimitry Andric (PSTXSD (XSCVDPSXDS f64:$src), PDForm:$dst)>; 221081ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 221181ad6265SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), PDForm:$dst, 8), 221281ad6265SDimitry Andric (PSTXSD (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), 221381ad6265SDimitry Andric PDForm:$dst)>; 221481ad6265SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr 221581ad6265SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), PDForm:$dst, 8), 221681ad6265SDimitry Andric (PSTXSD (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), 221781ad6265SDimitry Andric PDForm:$dst)>; 221881ad6265SDimitry Andric} 221981ad6265SDimitry Andric 222081ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 222181ad6265SDimitry Andric def : Pat<(i32 imm34:$imm), (PLI (getImmAs64BitInt imm:$imm))>; 222281ad6265SDimitry Andric def : Pat<(i64 imm34:$imm), (PLI8 (getImmAs64BitInt imm:$imm))>; 222381ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxpermx v16i8:$A, v16i8:$B, v16i8:$C, timm:$D)), 222481ad6265SDimitry Andric (COPY_TO_REGCLASS (XXPERMX (COPY_TO_REGCLASS $A, VSRC), 222581ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 222681ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC), $D), VSRC)>; 222781ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxblendvb v16i8:$A, v16i8:$B, v16i8:$C)), 222881ad6265SDimitry Andric (COPY_TO_REGCLASS 222981ad6265SDimitry Andric (XXBLENDVB (COPY_TO_REGCLASS $A, VSRC), 223081ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 223181ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC)), VSRC)>; 223281ad6265SDimitry Andric def : Pat<(v8i16 (int_ppc_vsx_xxblendvh v8i16:$A, v8i16:$B, v8i16:$C)), 223381ad6265SDimitry Andric (COPY_TO_REGCLASS 223481ad6265SDimitry Andric (XXBLENDVH (COPY_TO_REGCLASS $A, VSRC), 223581ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 223681ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC)), VSRC)>; 223781ad6265SDimitry Andric def : Pat<(int_ppc_vsx_xxblendvw v4i32:$A, v4i32:$B, v4i32:$C), 223881ad6265SDimitry Andric (XXBLENDVW $A, $B, $C)>; 223981ad6265SDimitry Andric def : Pat<(int_ppc_vsx_xxblendvd v2i64:$A, v2i64:$B, v2i64:$C), 224081ad6265SDimitry Andric (XXBLENDVD $A, $B, $C)>; 224181ad6265SDimitry Andric 224281ad6265SDimitry Andric // Anonymous patterns to select prefixed loads and stores. 224381ad6265SDimitry Andric // Load i32 224481ad6265SDimitry Andric def : Pat<(i32 (extloadi1 PDForm:$src)), (PLBZ memri34:$src)>; 224581ad6265SDimitry Andric def : Pat<(i32 (zextloadi1 PDForm:$src)), (PLBZ memri34:$src)>; 224681ad6265SDimitry Andric def : Pat<(i32 (extloadi8 PDForm:$src)), (PLBZ memri34:$src)>; 224781ad6265SDimitry Andric def : Pat<(i32 (zextloadi8 PDForm:$src)), (PLBZ memri34:$src)>; 224881ad6265SDimitry Andric def : Pat<(i32 (extloadi16 PDForm:$src)), (PLHZ memri34:$src)>; 224981ad6265SDimitry Andric def : Pat<(i32 (zextloadi16 PDForm:$src)), (PLHZ memri34:$src)>; 225081ad6265SDimitry Andric def : Pat<(i32 (sextloadi16 PDForm:$src)), (PLHA memri34:$src)>; 225181ad6265SDimitry Andric def : Pat<(i32 (load PDForm:$src)), (PLWZ memri34:$src)>; 225281ad6265SDimitry Andric 225381ad6265SDimitry Andric // Store i32 225481ad6265SDimitry Andric def : Pat<(truncstorei8 i32:$rS, PDForm:$dst), (PSTB gprc:$rS, memri34:$dst)>; 225581ad6265SDimitry Andric def : Pat<(truncstorei16 i32:$rS, PDForm:$dst), (PSTH gprc:$rS, memri34:$dst)>; 225681ad6265SDimitry Andric def : Pat<(store i32:$rS, PDForm:$dst), (PSTW gprc:$rS, memri34:$dst)>; 225781ad6265SDimitry Andric 225881ad6265SDimitry Andric // Load i64 225981ad6265SDimitry Andric def : Pat<(i64 (extloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>; 226081ad6265SDimitry Andric def : Pat<(i64 (zextloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>; 226181ad6265SDimitry Andric def : Pat<(i64 (extloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>; 226281ad6265SDimitry Andric def : Pat<(i64 (zextloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>; 226381ad6265SDimitry Andric def : Pat<(i64 (extloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>; 226481ad6265SDimitry Andric def : Pat<(i64 (zextloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>; 226581ad6265SDimitry Andric def : Pat<(i64 (sextloadi16 PDForm:$src)), (PLHA8 memri34:$src)>; 226681ad6265SDimitry Andric def : Pat<(i64 (extloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>; 226781ad6265SDimitry Andric def : Pat<(i64 (zextloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>; 226881ad6265SDimitry Andric def : Pat<(i64 (sextloadi32 PDForm:$src)), (PLWA8 memri34:$src)>; 226981ad6265SDimitry Andric def : Pat<(i64 (load PDForm:$src)), (PLD memri34:$src)>; 227081ad6265SDimitry Andric 227181ad6265SDimitry Andric // Store i64 227281ad6265SDimitry Andric def : Pat<(truncstorei8 i64:$rS, PDForm:$dst), (PSTB8 g8rc:$rS, memri34:$dst)>; 227381ad6265SDimitry Andric def : Pat<(truncstorei16 i64:$rS, PDForm:$dst), (PSTH8 g8rc:$rS, memri34:$dst)>; 227481ad6265SDimitry Andric def : Pat<(truncstorei32 i64:$rS, PDForm:$dst), (PSTW8 g8rc:$rS, memri34:$dst)>; 227581ad6265SDimitry Andric def : Pat<(store i64:$rS, PDForm:$dst), (PSTD g8rc:$rS, memri34:$dst)>; 227681ad6265SDimitry Andric 227781ad6265SDimitry Andric // Load / Store f32 227881ad6265SDimitry Andric def : Pat<(f32 (load PDForm:$src)), (PLFS memri34:$src)>; 227981ad6265SDimitry Andric def : Pat<(store f32:$FRS, PDForm:$dst), (PSTFS $FRS, memri34:$dst)>; 228081ad6265SDimitry Andric 228181ad6265SDimitry Andric // Load / Store f64 228281ad6265SDimitry Andric def : Pat<(f64 (extloadf32 PDForm:$src)), 228381ad6265SDimitry Andric (COPY_TO_REGCLASS (PLFS memri34:$src), VSFRC)>; 228481ad6265SDimitry Andric def : Pat<(f64 (load PDForm:$src)), (PLFD memri34:$src)>; 228581ad6265SDimitry Andric def : Pat<(store f64:$FRS, PDForm:$dst), (PSTFD $FRS, memri34:$dst)>; 228681ad6265SDimitry Andric 228781ad6265SDimitry Andric // Atomic Load 228881ad6265SDimitry Andric def : Pat<(atomic_load_8 PDForm:$src), (PLBZ memri34:$src)>; 228981ad6265SDimitry Andric def : Pat<(atomic_load_16 PDForm:$src), (PLHZ memri34:$src)>; 229081ad6265SDimitry Andric def : Pat<(atomic_load_32 PDForm:$src), (PLWZ memri34:$src)>; 229181ad6265SDimitry Andric def : Pat<(atomic_load_64 PDForm:$src), (PLD memri34:$src)>; 229281ad6265SDimitry Andric 229381ad6265SDimitry Andric // Atomic Store 229481ad6265SDimitry Andric def : Pat<(atomic_store_8 PDForm:$dst, i32:$RS), (PSTB $RS, memri34:$dst)>; 229581ad6265SDimitry Andric def : Pat<(atomic_store_16 PDForm:$dst, i32:$RS), (PSTH $RS, memri34:$dst)>; 229681ad6265SDimitry Andric def : Pat<(atomic_store_32 PDForm:$dst, i32:$RS), (PSTW $RS, memri34:$dst)>; 229781ad6265SDimitry Andric def : Pat<(atomic_store_64 PDForm:$dst, i64:$RS), (PSTD $RS, memri34:$dst)>; 229881ad6265SDimitry Andric 229981ad6265SDimitry Andric // Prefixed fpext to v2f64 230081ad6265SDimitry Andric def : Pat<(v4f32 (PPCldvsxlh PDForm:$src)), 230181ad6265SDimitry Andric (SUBREG_TO_REG (i64 1), (PLFD PDForm:$src), sub_64)>; 230281ad6265SDimitry Andric} 230381ad6265SDimitry Andric 230481ad6265SDimitry Andricdef InsertEltShift { 230581ad6265SDimitry Andric dag Sub32 = (i32 (EXTRACT_SUBREG $rB, sub_32)); 230681ad6265SDimitry Andric dag Sub32Left1 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 1, 0, 30); 230781ad6265SDimitry Andric dag Sub32Left2 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 2, 0, 29); 230881ad6265SDimitry Andric dag Left1 = (RLWINM $rB, 1, 0, 30); 230981ad6265SDimitry Andric dag Left2 = (RLWINM $rB, 2, 0, 29); 231081ad6265SDimitry Andric dag Left3 = (RLWINM8 $rB, 3, 0, 28); 231181ad6265SDimitry Andric} 231281ad6265SDimitry Andric 231381ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsLittleEndian] in { 231481ad6265SDimitry Andric // Indexed vector insert element 231581ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)), 231681ad6265SDimitry Andric (VINSBRX $vDi, InsertEltShift.Sub32, $rA)>; 231781ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)), 231881ad6265SDimitry Andric (VINSHRX $vDi, InsertEltShift.Sub32Left1, $rA)>; 231981ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)), 232081ad6265SDimitry Andric (VINSWRX $vDi, InsertEltShift.Sub32Left2, $rA)>; 232181ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)), 232281ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, $rA)>; 232381ad6265SDimitry Andric 232481ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)), 232581ad6265SDimitry Andric (VINSWVRX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>; 232681ad6265SDimitry Andric 232781ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, f64:$A, i64:$rB)), 232881ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>; 232981ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)), 233081ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>; 233181ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)), 233281ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>; 233381ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)), 233481ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>; 233581ad6265SDimitry Andric let AddedComplexity = 400 in { 233681ad6265SDimitry Andric // Immediate vector insert element 233781ad6265SDimitry Andric foreach Idx = [0, 1, 2, 3] in { 233881ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, Idx)), 233981ad6265SDimitry Andric (VINSW $vDi, !mul(!sub(3, Idx), 4), $rA)>; 234081ad6265SDimitry Andric } 234181ad6265SDimitry Andric foreach i = [0, 1] in 234281ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, (i64 i))), 234381ad6265SDimitry Andric (VINSD $vDi, !mul(!sub(1, i), 8), $rA)>; 234481ad6265SDimitry Andric } 234581ad6265SDimitry Andric} 234681ad6265SDimitry Andric 234781ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC32] in { 234881ad6265SDimitry Andric // Indexed vector insert element 234981ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i32:$rB)), 235081ad6265SDimitry Andric (VINSBLX $vDi, $rB, $rA)>; 235181ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i32:$rB)), 235281ad6265SDimitry Andric (VINSHLX $vDi, InsertEltShift.Left1, $rA)>; 235381ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i32:$rB)), 235481ad6265SDimitry Andric (VINSWLX $vDi, InsertEltShift.Left2, $rA)>; 235581ad6265SDimitry Andric 235681ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i32:$rB)), 235781ad6265SDimitry Andric (VINSWVLX $vDi, InsertEltShift.Left2, (XSCVDPSPN $rA))>; 235881ad6265SDimitry Andric} 235981ad6265SDimitry Andric 236081ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC64] in { 236181ad6265SDimitry Andric // Indexed vector insert element 236281ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)), 236381ad6265SDimitry Andric (VINSBLX $vDi, InsertEltShift.Sub32, $rA)>; 236481ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)), 236581ad6265SDimitry Andric (VINSHLX $vDi, InsertEltShift.Sub32Left1, $rA)>; 236681ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)), 236781ad6265SDimitry Andric (VINSWLX $vDi, InsertEltShift.Sub32Left2, $rA)>; 236881ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)), 236981ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, $rA)>; 237081ad6265SDimitry Andric 237181ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)), 237281ad6265SDimitry Andric (VINSWVLX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>; 237381ad6265SDimitry Andric 237481ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, f64:$A, i64:$rB)), 237581ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>; 237681ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)), 237781ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>; 237881ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)), 237981ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>; 238081ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)), 238181ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>; 238281ad6265SDimitry Andric} 238381ad6265SDimitry Andric 238481ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX, IsBigEndian] in { 238581ad6265SDimitry Andric // Immediate vector insert element 238681ad6265SDimitry Andric foreach Ty = [i32, i64] in { 238781ad6265SDimitry Andric foreach Idx = [0, 1, 2, 3] in { 238881ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, (Ty Idx))), 238981ad6265SDimitry Andric (VINSW $vDi, !mul(Idx, 4), $rA)>; 239081ad6265SDimitry Andric } 239181ad6265SDimitry Andric } 239281ad6265SDimitry Andric 239381ad6265SDimitry Andric foreach Idx = [0, 1] in 239481ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, Idx)), 239581ad6265SDimitry Andric (VINSD $vDi, !mul(Idx, 8), $rA)>; 239681ad6265SDimitry Andric} 2397