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> { 187*06c3fb27SDimitry Andric bits<5> RST; 188*06c3fb27SDimitry Andric bits<5> RA; 189*06c3fb27SDimitry Andric bits<34> D; 19081ad6265SDimitry Andric 19181ad6265SDimitry Andric let Pattern = pattern; 19281ad6265SDimitry Andric 19381ad6265SDimitry Andric // The prefix. 19481ad6265SDimitry Andric let Inst{6-7} = 2; 19581ad6265SDimitry Andric let Inst{8-10} = 0; 19681ad6265SDimitry Andric let Inst{11} = PCRel; 19781ad6265SDimitry Andric let Inst{12-13} = 0; 198*06c3fb27SDimitry Andric let Inst{14-31} = D{33-16}; // d0 19981ad6265SDimitry Andric 20081ad6265SDimitry Andric // The instruction. 201*06c3fb27SDimitry Andric let Inst{38-42} = RST{4-0}; 202*06c3fb27SDimitry Andric let Inst{43-47} = RA; 203*06c3fb27SDimitry Andric let Inst{48-63} = D{15-0}; // d1 20481ad6265SDimitry Andric} 20581ad6265SDimitry Andric 20681ad6265SDimitry Andricclass MLS_DForm_R_SI34_RTA5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 20781ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 20881ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 20981ad6265SDimitry Andric bits<5> RT; 21081ad6265SDimitry Andric bits<5> RA; 21181ad6265SDimitry Andric bits<34> SI; 21281ad6265SDimitry Andric 21381ad6265SDimitry Andric let Pattern = pattern; 21481ad6265SDimitry Andric 21581ad6265SDimitry Andric // The prefix. 21681ad6265SDimitry Andric let Inst{6-7} = 2; 21781ad6265SDimitry Andric let Inst{8-10} = 0; 21881ad6265SDimitry Andric let Inst{11} = PCRel; 21981ad6265SDimitry Andric let Inst{12-13} = 0; 22081ad6265SDimitry Andric let Inst{14-31} = SI{33-16}; 22181ad6265SDimitry Andric 22281ad6265SDimitry Andric // The instruction. 22381ad6265SDimitry Andric let Inst{38-42} = RT; 22481ad6265SDimitry Andric let Inst{43-47} = RA; 22581ad6265SDimitry Andric let Inst{48-63} = SI{15-0}; 22681ad6265SDimitry Andric} 22781ad6265SDimitry Andric 22881ad6265SDimitry Andricclass MLS_DForm_SI34_RT5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 22981ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 23081ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 23181ad6265SDimitry Andric bits<5> RT; 23281ad6265SDimitry Andric bits<34> SI; 23381ad6265SDimitry Andric 23481ad6265SDimitry Andric let Pattern = pattern; 23581ad6265SDimitry Andric 23681ad6265SDimitry Andric // The prefix. 23781ad6265SDimitry Andric let Inst{6-7} = 2; 23881ad6265SDimitry Andric let Inst{8-10} = 0; 23981ad6265SDimitry Andric let Inst{11} = 0; 24081ad6265SDimitry Andric let Inst{12-13} = 0; 24181ad6265SDimitry Andric let Inst{14-31} = SI{33-16}; 24281ad6265SDimitry Andric 24381ad6265SDimitry Andric // The instruction. 24481ad6265SDimitry Andric let Inst{38-42} = RT; 24581ad6265SDimitry Andric let Inst{43-47} = 0; 24681ad6265SDimitry Andric let Inst{48-63} = SI{15-0}; 24781ad6265SDimitry Andric} 24881ad6265SDimitry Andric 24981ad6265SDimitry Andricmulticlass MLS_DForm_R_SI34_RTA5_p<bits<6> opcode, dag OOL, dag IOL, 25081ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 25181ad6265SDimitry Andric InstrItinClass itin> { 25281ad6265SDimitry Andric def NAME : MLS_DForm_R_SI34_RTA5<opcode, OOL, IOL, 25381ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 25481ad6265SDimitry Andric def pc : MLS_DForm_R_SI34_RTA5<opcode, OOL, PCRel_IOL, 25581ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, isPCRel; 25681ad6265SDimitry Andric} 25781ad6265SDimitry Andric 25881ad6265SDimitry Andricclass 8LS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 25981ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 26081ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 261*06c3fb27SDimitry Andric bits<5> RST; 262*06c3fb27SDimitry Andric bits<5> RA; 263*06c3fb27SDimitry Andric bits<34> D; 26481ad6265SDimitry Andric 26581ad6265SDimitry Andric let Pattern = pattern; 26681ad6265SDimitry Andric 26781ad6265SDimitry Andric // The prefix. 26881ad6265SDimitry Andric let Inst{6-10} = 0; 26981ad6265SDimitry Andric let Inst{11} = PCRel; 27081ad6265SDimitry Andric let Inst{12-13} = 0; 271*06c3fb27SDimitry Andric let Inst{14-31} = D{33-16}; // d0 27281ad6265SDimitry Andric 27381ad6265SDimitry Andric // The instruction. 274*06c3fb27SDimitry Andric let Inst{38-42} = RST{4-0}; 275*06c3fb27SDimitry Andric let Inst{43-47} = RA; 276*06c3fb27SDimitry Andric let Inst{48-63} = D{15-0}; // d1 27781ad6265SDimitry Andric} 27881ad6265SDimitry Andric 27981ad6265SDimitry Andric// 8LS:D-Form: [ 1 0 0 // R // d0 28081ad6265SDimitry Andric// PO TX T RA d1 ] 28181ad6265SDimitry Andricclass 8LS_DForm_R_SI34_XT6_RA5_MEM<bits<5> opcode, dag OOL, dag IOL, 28281ad6265SDimitry Andric string asmstr, InstrItinClass itin, 28381ad6265SDimitry Andric list<dag> pattern> 28481ad6265SDimitry Andric : PI<1, { opcode, ? }, OOL, IOL, asmstr, itin> { 285*06c3fb27SDimitry Andric bits<6> XST; 286*06c3fb27SDimitry Andric bits<5> RA; 287*06c3fb27SDimitry Andric bits<34> D; 28881ad6265SDimitry Andric 28981ad6265SDimitry Andric let Pattern = pattern; 29081ad6265SDimitry Andric 29181ad6265SDimitry Andric // The prefix. 29281ad6265SDimitry Andric let Inst{6-7} = 0; 29381ad6265SDimitry Andric let Inst{8} = 0; 29481ad6265SDimitry Andric let Inst{9-10} = 0; // reserved 29581ad6265SDimitry Andric let Inst{11} = PCRel; 29681ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 297*06c3fb27SDimitry Andric let Inst{14-31} = D{33-16}; // d0 29881ad6265SDimitry Andric 29981ad6265SDimitry Andric // The instruction. 300*06c3fb27SDimitry Andric let Inst{37} = XST{5}; 301*06c3fb27SDimitry Andric let Inst{38-42} = XST{4-0}; 302*06c3fb27SDimitry Andric let Inst{43-47} = RA; 303*06c3fb27SDimitry Andric let Inst{48-63} = D{15-0}; // d1 30481ad6265SDimitry Andric} 30581ad6265SDimitry Andric 30681ad6265SDimitry Andric// X-Form: [PO T IMM VRB XO TX] 30781ad6265SDimitry Andricclass XForm_XT6_IMM5_VB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 30881ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 30981ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 31081ad6265SDimitry Andric bits<6> XT; 31181ad6265SDimitry Andric bits<5> VRB; 31281ad6265SDimitry Andric bits<5> IMM; 31381ad6265SDimitry Andric 31481ad6265SDimitry Andric let Pattern = pattern; 31581ad6265SDimitry Andric let Inst{6-10} = XT{4-0}; 31681ad6265SDimitry Andric let Inst{11-15} = IMM; 31781ad6265SDimitry Andric let Inst{16-20} = VRB; 31881ad6265SDimitry Andric let Inst{21-30} = xo; 31981ad6265SDimitry Andric let Inst{31} = XT{5}; 32081ad6265SDimitry Andric} 32181ad6265SDimitry Andric 32281ad6265SDimitry Andricclass 8RR_XX4Form_IMM8_XTAB6<bits<6> opcode, bits<2> xo, 32381ad6265SDimitry Andric dag OOL, dag IOL, string asmstr, 32481ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 32581ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 32681ad6265SDimitry Andric bits<6> XT; 32781ad6265SDimitry Andric bits<6> XA; 32881ad6265SDimitry Andric bits<6> XB; 32981ad6265SDimitry Andric bits<6> XC; 33081ad6265SDimitry Andric bits<8> IMM; 33181ad6265SDimitry Andric 33281ad6265SDimitry Andric let Pattern = pattern; 33381ad6265SDimitry Andric 33481ad6265SDimitry Andric // The prefix. 33581ad6265SDimitry Andric let Inst{6-7} = 1; 33681ad6265SDimitry Andric let Inst{8} = 0; 33781ad6265SDimitry Andric let Inst{9-11} = 0; 33881ad6265SDimitry Andric let Inst{12-13} = 0; 33981ad6265SDimitry Andric let Inst{14-23} = 0; 34081ad6265SDimitry Andric let Inst{24-31} = IMM; 34181ad6265SDimitry Andric 34281ad6265SDimitry Andric // The instruction. 34381ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 34481ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 34581ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 34681ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 34781ad6265SDimitry Andric let Inst{58-59} = xo; 34881ad6265SDimitry Andric let Inst{60} = XC{5}; 34981ad6265SDimitry Andric let Inst{61} = XA{5}; 35081ad6265SDimitry Andric let Inst{62} = XB{5}; 35181ad6265SDimitry Andric let Inst{63} = XT{5}; 35281ad6265SDimitry Andric} 35381ad6265SDimitry Andric 35481ad6265SDimitry Andricclass VXForm_RD5_N3_VB5<bits<11> xo, dag OOL, dag IOL, string asmstr, 35581ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 35681ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 35781ad6265SDimitry Andric bits<5> RD; 35881ad6265SDimitry Andric bits<5> VB; 35981ad6265SDimitry Andric bits<3> N; 36081ad6265SDimitry Andric 36181ad6265SDimitry Andric let Pattern = pattern; 36281ad6265SDimitry Andric 36381ad6265SDimitry Andric let Inst{6-10} = RD; 36481ad6265SDimitry Andric let Inst{11-12} = 0; 36581ad6265SDimitry Andric let Inst{13-15} = N; 36681ad6265SDimitry Andric let Inst{16-20} = VB; 36781ad6265SDimitry Andric let Inst{21-31} = xo; 36881ad6265SDimitry Andric} 36981ad6265SDimitry Andric 37081ad6265SDimitry Andric 37181ad6265SDimitry Andric// VX-Form: [PO VRT RA VRB XO]. 37281ad6265SDimitry Andric// Destructive (insert) forms are suffixed with _ins. 37381ad6265SDimitry Andricclass VXForm_VTB5_RA5_ins<bits<11> xo, string opc, list<dag> pattern> 374*06c3fb27SDimitry Andric : VXForm_1<xo, (outs vrrc:$VD), (ins vrrc:$VDi, gprc:$VA, vrrc:$VB), 375*06c3fb27SDimitry Andric !strconcat(opc, " $VD, $VA, $VB"), IIC_VecGeneral, pattern>, 376*06c3fb27SDimitry Andric RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 37781ad6265SDimitry Andric 37881ad6265SDimitry Andric// VX-Form: [PO VRT RA RB XO]. 37981ad6265SDimitry Andric// Destructive (insert) forms are suffixed with _ins. 38081ad6265SDimitry Andricclass VXForm_VRT5_RAB5_ins<bits<11> xo, string opc, list<dag> pattern> 381*06c3fb27SDimitry Andric : VXForm_1<xo, (outs vrrc:$VD), (ins vrrc:$VDi, gprc:$VA, gprc:$VB), 382*06c3fb27SDimitry Andric !strconcat(opc, " $VD, $VA, $VB"), IIC_VecGeneral, pattern>, 383*06c3fb27SDimitry Andric RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 38481ad6265SDimitry Andric 38581ad6265SDimitry Andric// VX-Form: [ PO BF // VRA VRB XO ] 38681ad6265SDimitry Andricclass VXForm_BF3_VAB5<bits<11> xo, dag OOL, dag IOL, string asmstr, 38781ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 38881ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 38981ad6265SDimitry Andric bits<3> BF; 39081ad6265SDimitry Andric bits<5> VA; 39181ad6265SDimitry Andric bits<5> VB; 39281ad6265SDimitry Andric 39381ad6265SDimitry Andric let Pattern = pattern; 39481ad6265SDimitry Andric 39581ad6265SDimitry Andric let Inst{6-8} = BF; 39681ad6265SDimitry Andric let Inst{9-10} = 0; 39781ad6265SDimitry Andric let Inst{11-15} = VA; 39881ad6265SDimitry Andric let Inst{16-20} = VB; 39981ad6265SDimitry Andric let Inst{21-31} = xo; 40081ad6265SDimitry Andric} 40181ad6265SDimitry Andric 40281ad6265SDimitry Andric// VN-Form: [PO VRT VRA VRB PS SD XO] 40381ad6265SDimitry Andric// SD is "Shift Direction" 40481ad6265SDimitry Andricclass VNForm_VTAB5_SD3<bits<6> xo, bits<2> ps, dag OOL, dag IOL, string asmstr, 40581ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 40681ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 40781ad6265SDimitry Andric bits<5> VRT; 40881ad6265SDimitry Andric bits<5> VRA; 40981ad6265SDimitry Andric bits<5> VRB; 41081ad6265SDimitry Andric bits<3> SD; 41181ad6265SDimitry Andric 41281ad6265SDimitry Andric let Pattern = pattern; 41381ad6265SDimitry Andric 41481ad6265SDimitry Andric let Inst{6-10} = VRT; 41581ad6265SDimitry Andric let Inst{11-15} = VRA; 41681ad6265SDimitry Andric let Inst{16-20} = VRB; 41781ad6265SDimitry Andric let Inst{21-22} = ps; 41881ad6265SDimitry Andric let Inst{23-25} = SD; 41981ad6265SDimitry Andric let Inst{26-31} = xo; 42081ad6265SDimitry Andric} 42181ad6265SDimitry Andric 42281ad6265SDimitry Andricclass VXForm_RD5_MP_VB5<bits<11> xo, bits<4> eo, dag OOL, dag IOL, 42381ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 42481ad6265SDimitry Andric : I<4, OOL, IOL, asmstr, itin> { 42581ad6265SDimitry Andric bits<5> RD; 42681ad6265SDimitry Andric bits<5> VB; 42781ad6265SDimitry Andric bit MP; 42881ad6265SDimitry Andric 42981ad6265SDimitry Andric let Pattern = pattern; 43081ad6265SDimitry Andric 43181ad6265SDimitry Andric let Inst{6-10} = RD; 43281ad6265SDimitry Andric let Inst{11-14} = eo; 43381ad6265SDimitry Andric let Inst{15} = MP; 43481ad6265SDimitry Andric let Inst{16-20} = VB; 43581ad6265SDimitry Andric let Inst{21-31} = xo; 43681ad6265SDimitry Andric} 43781ad6265SDimitry Andric 43881ad6265SDimitry Andric// 8RR:D-Form: [ 1 1 0 // // imm0 43981ad6265SDimitry Andric// PO T XO TX imm1 ]. 44081ad6265SDimitry Andricclass 8RR_DForm_IMM32_XT6<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, 44181ad6265SDimitry Andric string asmstr, InstrItinClass itin, 44281ad6265SDimitry Andric list<dag> pattern> 44381ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 44481ad6265SDimitry Andric bits<6> XT; 44581ad6265SDimitry Andric bits<32> IMM32; 44681ad6265SDimitry Andric 44781ad6265SDimitry Andric let Pattern = pattern; 44881ad6265SDimitry Andric 44981ad6265SDimitry Andric // The prefix. 45081ad6265SDimitry Andric let Inst{6-7} = 1; 45181ad6265SDimitry Andric let Inst{8-11} = 0; 45281ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 45381ad6265SDimitry Andric let Inst{14-15} = 0; // reserved 45481ad6265SDimitry Andric let Inst{16-31} = IMM32{31-16}; 45581ad6265SDimitry Andric 45681ad6265SDimitry Andric // The instruction. 45781ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 45881ad6265SDimitry Andric let Inst{43-46} = xo; 45981ad6265SDimitry Andric let Inst{47} = XT{5}; 46081ad6265SDimitry Andric let Inst{48-63} = IMM32{15-0}; 46181ad6265SDimitry Andric} 46281ad6265SDimitry Andric 46381ad6265SDimitry Andric// 8RR:D-Form: [ 1 1 0 // // imm0 46481ad6265SDimitry Andric// PO T XO IX TX imm1 ]. 46581ad6265SDimitry Andricclass 8RR_DForm_IMM32_XT6_IX<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, 46681ad6265SDimitry Andric string asmstr, InstrItinClass itin, 46781ad6265SDimitry Andric list<dag> pattern> 46881ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 46981ad6265SDimitry Andric bits<6> XT; 47081ad6265SDimitry Andric bit IX; 47181ad6265SDimitry Andric bits<32> IMM32; 47281ad6265SDimitry Andric 47381ad6265SDimitry Andric let Pattern = pattern; 47481ad6265SDimitry Andric 47581ad6265SDimitry Andric // The prefix. 47681ad6265SDimitry Andric let Inst{6-7} = 1; 47781ad6265SDimitry Andric let Inst{8-11} = 0; 47881ad6265SDimitry Andric let Inst{12-13} = 0; // reserved 47981ad6265SDimitry Andric let Inst{14-15} = 0; // reserved 48081ad6265SDimitry Andric let Inst{16-31} = IMM32{31-16}; 48181ad6265SDimitry Andric 48281ad6265SDimitry Andric // The instruction. 48381ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 48481ad6265SDimitry Andric let Inst{43-45} = xo; 48581ad6265SDimitry Andric let Inst{46} = IX; 48681ad6265SDimitry Andric let Inst{47} = XT{5}; 48781ad6265SDimitry Andric let Inst{48-63} = IMM32{15-0}; 48881ad6265SDimitry Andric} 48981ad6265SDimitry Andric 49081ad6265SDimitry Andricclass 8RR_XX4Form_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, 49181ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 49281ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 49381ad6265SDimitry Andric bits<6> XT; 49481ad6265SDimitry Andric bits<6> XA; 49581ad6265SDimitry Andric bits<6> XB; 49681ad6265SDimitry Andric bits<6> XC; 49781ad6265SDimitry Andric 49881ad6265SDimitry Andric let Pattern = pattern; 49981ad6265SDimitry Andric 50081ad6265SDimitry Andric // The prefix. 50181ad6265SDimitry Andric let Inst{6-7} = 1; 50281ad6265SDimitry Andric let Inst{8-11} = 0; 50381ad6265SDimitry Andric let Inst{12-13} = 0; 50481ad6265SDimitry Andric let Inst{14-31} = 0; 50581ad6265SDimitry Andric 50681ad6265SDimitry Andric // The instruction. 50781ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 50881ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 50981ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 51081ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 51181ad6265SDimitry Andric let Inst{58-59} = xo; 51281ad6265SDimitry Andric let Inst{60} = XC{5}; 51381ad6265SDimitry Andric let Inst{61} = XA{5}; 51481ad6265SDimitry Andric let Inst{62} = XB{5}; 51581ad6265SDimitry Andric let Inst{63} = XT{5}; 51681ad6265SDimitry Andric} 51781ad6265SDimitry Andric 51881ad6265SDimitry Andricclass 8RR_XX4Form_IMM3_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, 51981ad6265SDimitry Andric string asmstr, InstrItinClass itin, 52081ad6265SDimitry Andric list<dag> pattern> 52181ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 52281ad6265SDimitry Andric bits<6> XT; 52381ad6265SDimitry Andric bits<6> XA; 52481ad6265SDimitry Andric bits<6> XB; 52581ad6265SDimitry Andric bits<6> XC; 52681ad6265SDimitry Andric bits<3> IMM; 52781ad6265SDimitry Andric 52881ad6265SDimitry Andric let Pattern = pattern; 52981ad6265SDimitry Andric 53081ad6265SDimitry Andric // The prefix. 53181ad6265SDimitry Andric let Inst{6-7} = 1; 53281ad6265SDimitry Andric let Inst{8-11} = 0; 53381ad6265SDimitry Andric let Inst{12-13} = 0; 53481ad6265SDimitry Andric let Inst{14-28} = 0; 53581ad6265SDimitry Andric let Inst{29-31} = IMM; 53681ad6265SDimitry Andric 53781ad6265SDimitry Andric // The instruction. 53881ad6265SDimitry Andric let Inst{38-42} = XT{4-0}; 53981ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 54081ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 54181ad6265SDimitry Andric let Inst{53-57} = XC{4-0}; 54281ad6265SDimitry Andric let Inst{58-59} = xo; 54381ad6265SDimitry Andric let Inst{60} = XC{5}; 54481ad6265SDimitry Andric let Inst{61} = XA{5}; 54581ad6265SDimitry Andric let Inst{62} = XB{5}; 54681ad6265SDimitry Andric let Inst{63} = XT{5}; 54781ad6265SDimitry Andric} 54881ad6265SDimitry Andric 54981ad6265SDimitry Andric// [PO BF / XO2 B XO BX /] 55081ad6265SDimitry Andricclass XX2_BF3_XO5_XB6_XO9<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, 55181ad6265SDimitry Andric dag IOL, string asmstr, InstrItinClass itin, 55281ad6265SDimitry Andric list<dag> pattern> 55381ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 55481ad6265SDimitry Andric bits<3> BF; 55581ad6265SDimitry Andric bits<6> XB; 55681ad6265SDimitry Andric 55781ad6265SDimitry Andric let Pattern = pattern; 55881ad6265SDimitry Andric 55981ad6265SDimitry Andric let Inst{6-8} = BF; 56081ad6265SDimitry Andric let Inst{9-10} = 0; 56181ad6265SDimitry Andric let Inst{11-15} = xo2; 56281ad6265SDimitry Andric let Inst{16-20} = XB{4-0}; 56381ad6265SDimitry Andric let Inst{21-29} = xo; 56481ad6265SDimitry Andric let Inst{30} = XB{5}; 56581ad6265SDimitry Andric let Inst{31} = 0; 56681ad6265SDimitry Andric} 56781ad6265SDimitry Andric 56881ad6265SDimitry Andric// X-Form: [ PO RT BI /// XO / ] 56981ad6265SDimitry Andricclass XForm_XT5_BI5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 57081ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 57181ad6265SDimitry Andric : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 572*06c3fb27SDimitry Andric bits<5> BI; 573*06c3fb27SDimitry Andric let RA = BI; 574*06c3fb27SDimitry Andric let RB = 0; 57581ad6265SDimitry Andric} 57681ad6265SDimitry Andric 57781ad6265SDimitry Andricmulticlass MLS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL, 57881ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 57981ad6265SDimitry Andric InstrItinClass itin> { 58081ad6265SDimitry Andric def NAME : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, 58181ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 58281ad6265SDimitry Andric def pc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL, 58381ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 58481ad6265SDimitry Andric isPCRel; 58581ad6265SDimitry Andric} 58681ad6265SDimitry Andric 58781ad6265SDimitry Andricmulticlass 8LS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL, 58881ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 58981ad6265SDimitry Andric InstrItinClass itin> { 59081ad6265SDimitry Andric def NAME : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, 59181ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 59281ad6265SDimitry Andric def pc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL, 59381ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 59481ad6265SDimitry Andric isPCRel; 59581ad6265SDimitry Andric} 59681ad6265SDimitry Andric 59781ad6265SDimitry Andricmulticlass 8LS_DForm_R_SI34_XT6_RA5_MEM_p<bits<5> opcode, dag OOL, dag IOL, 59881ad6265SDimitry Andric dag PCRel_IOL, string asmstr, 59981ad6265SDimitry Andric InstrItinClass itin> { 60081ad6265SDimitry Andric def NAME : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL, 60181ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 60281ad6265SDimitry Andric def pc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRel_IOL, 60381ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 60481ad6265SDimitry Andric isPCRel; 60581ad6265SDimitry Andric} 60681ad6265SDimitry Andric 60781ad6265SDimitry Andricdef PrefixInstrs : Predicate<"Subtarget->hasPrefixInstrs()">; 60881ad6265SDimitry Andricdef IsISA3_1 : Predicate<"Subtarget->isISA3_1()">; 60981ad6265SDimitry Andricdef PairedVectorMemops : Predicate<"Subtarget->pairedVectorMemops()">; 61081ad6265SDimitry Andricdef RCCp { 61181ad6265SDimitry Andric dag AToVSRC = (COPY_TO_REGCLASS $XA, VSRC); 61281ad6265SDimitry Andric dag BToVSRC = (COPY_TO_REGCLASS $XB, VSRC); 61381ad6265SDimitry Andric} 61481ad6265SDimitry Andric 61581ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 61681ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 61781ad6265SDimitry Andric defm PADDI8 : 61881ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_p<14, (outs g8rc:$RT), (ins g8rc:$RA, s34imm:$SI), 61981ad6265SDimitry Andric (ins immZero:$RA, s34imm_pcrel:$SI), 62081ad6265SDimitry Andric "paddi $RT, $RA, $SI", IIC_LdStLFD>; 62181ad6265SDimitry Andric let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 62281ad6265SDimitry Andric def PLI8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT), 62381ad6265SDimitry Andric (ins s34imm:$SI), 62481ad6265SDimitry Andric "pli $RT, $SI", IIC_IntSimple, []>; 62581ad6265SDimitry Andric } 62681ad6265SDimitry Andric } 62781ad6265SDimitry Andric defm PADDI : 62881ad6265SDimitry Andric MLS_DForm_R_SI34_RTA5_p<14, (outs gprc:$RT), (ins gprc:$RA, s34imm:$SI), 62981ad6265SDimitry Andric (ins immZero:$RA, s34imm_pcrel:$SI), 63081ad6265SDimitry Andric "paddi $RT, $RA, $SI", IIC_LdStLFD>; 63181ad6265SDimitry Andric let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 63281ad6265SDimitry Andric def PLI : MLS_DForm_SI34_RT5<14, (outs gprc:$RT), 63381ad6265SDimitry Andric (ins s34imm:$SI), 63481ad6265SDimitry Andric "pli $RT, $SI", IIC_IntSimple, []>; 63581ad6265SDimitry Andric } 63681ad6265SDimitry Andric 63781ad6265SDimitry Andric let mayLoad = 1, mayStore = 0 in { 63881ad6265SDimitry Andric defm PLXV : 639*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_XT6_RA5_MEM_p<25, (outs vsrc:$XST), (ins (memri34 $D, $RA):$addr), 640*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), 641*06c3fb27SDimitry Andric "plxv $XST, $addr", IIC_LdStLFD>; 64281ad6265SDimitry Andric defm PLFS : 643*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<48, (outs f4rc:$RST), (ins (memri34 $D, $RA):$addr), 644*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plfs $RST, $addr", 64581ad6265SDimitry Andric IIC_LdStLFD>; 64681ad6265SDimitry Andric defm PLFD : 647*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<50, (outs f8rc:$RST), (ins (memri34 $D, $RA):$addr), 648*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plfd $RST, $addr", 64981ad6265SDimitry Andric IIC_LdStLFD>; 65081ad6265SDimitry Andric defm PLXSSP : 651*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<43, (outs vfrc:$RST), (ins (memri34 $D, $RA):$addr), 652*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), 653*06c3fb27SDimitry Andric "plxssp $RST, $addr", IIC_LdStLFD>; 65481ad6265SDimitry Andric defm PLXSD : 655*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<42, (outs vfrc:$RST), (ins (memri34 $D, $RA):$addr), 656*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), 657*06c3fb27SDimitry Andric "plxsd $RST, $addr", IIC_LdStLFD>; 65881ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 65981ad6265SDimitry Andric defm PLBZ8 : 660*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 661*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plbz $RST, $addr", 66281ad6265SDimitry Andric IIC_LdStLFD>; 66381ad6265SDimitry Andric defm PLHZ8 : 664*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 665*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plhz $RST, $addr", 66681ad6265SDimitry Andric IIC_LdStLFD>; 66781ad6265SDimitry Andric defm PLHA8 : 668*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 669*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plha $RST, $addr", 67081ad6265SDimitry Andric IIC_LdStLFD>; 67181ad6265SDimitry Andric defm PLWA8 : 672*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 673*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), 674*06c3fb27SDimitry Andric "plwa $RST, $addr", IIC_LdStLFD>; 67581ad6265SDimitry Andric defm PLWZ8 : 676*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 677*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plwz $RST, $addr", 67881ad6265SDimitry Andric IIC_LdStLFD>; 67981ad6265SDimitry Andric } 68081ad6265SDimitry Andric defm PLBZ : 681*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 682*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plbz $RST, $addr", 68381ad6265SDimitry Andric IIC_LdStLFD>; 68481ad6265SDimitry Andric defm PLHZ : 685*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 686*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plhz $RST, $addr", 68781ad6265SDimitry Andric IIC_LdStLFD>; 68881ad6265SDimitry Andric defm PLHA : 689*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 690*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plha $RST, $addr", 69181ad6265SDimitry Andric IIC_LdStLFD>; 69281ad6265SDimitry Andric defm PLWZ : 693*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 694*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plwz $RST, $addr", 69581ad6265SDimitry Andric IIC_LdStLFD>; 69681ad6265SDimitry Andric defm PLWA : 697*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 698*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plwa $RST, $addr", 69981ad6265SDimitry Andric IIC_LdStLFD>; 70081ad6265SDimitry Andric defm PLD : 701*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<57, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 702*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "pld $RST, $addr", 70381ad6265SDimitry Andric IIC_LdStLFD>; 70481ad6265SDimitry Andric } 70581ad6265SDimitry Andric 70681ad6265SDimitry Andric let mayStore = 1, mayLoad = 0 in { 70781ad6265SDimitry Andric defm PSTXV : 708*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_XT6_RA5_MEM_p<27, (outs), (ins vsrc:$XST, (memri34 $D, $RA):$addr), 709*06c3fb27SDimitry Andric (ins vsrc:$XST, (memri34_pcrel $D, $RA):$addr), 710*06c3fb27SDimitry Andric "pstxv $XST, $addr", IIC_LdStLFD>; 71181ad6265SDimitry Andric defm PSTFS : 712*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<52, (outs), (ins f4rc:$RST, (memri34 $D, $RA):$addr), 713*06c3fb27SDimitry Andric (ins f4rc:$RST, (memri34_pcrel $D, $RA):$addr), 714*06c3fb27SDimitry Andric "pstfs $RST, $addr", IIC_LdStLFD>; 71581ad6265SDimitry Andric defm PSTFD : 716*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<54, (outs), (ins f8rc:$RST, (memri34 $D, $RA):$addr), 717*06c3fb27SDimitry Andric (ins f8rc:$RST, (memri34_pcrel $D, $RA):$addr), 718*06c3fb27SDimitry Andric "pstfd $RST, $addr", IIC_LdStLFD>; 71981ad6265SDimitry Andric defm PSTXSSP : 720*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<47, (outs), (ins vfrc:$RST, (memri34 $D, $RA):$addr), 721*06c3fb27SDimitry Andric (ins vfrc:$RST, (memri34_pcrel $D, $RA):$addr), 722*06c3fb27SDimitry Andric "pstxssp $RST, $addr", IIC_LdStLFD>; 72381ad6265SDimitry Andric defm PSTXSD : 724*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<46, (outs), (ins vfrc:$RST, (memri34 $D, $RA):$addr), 725*06c3fb27SDimitry Andric (ins vfrc:$RST, (memri34_pcrel $D, $RA):$addr), 726*06c3fb27SDimitry Andric "pstxsd $RST, $addr", IIC_LdStLFD>; 72781ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 72881ad6265SDimitry Andric defm PSTB8 : 729*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr), 730*06c3fb27SDimitry Andric (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr), 731*06c3fb27SDimitry Andric "pstb $RST, $addr", IIC_LdStLFD>; 73281ad6265SDimitry Andric defm PSTH8 : 733*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr), 734*06c3fb27SDimitry Andric (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr), 735*06c3fb27SDimitry Andric "psth $RST, $addr", IIC_LdStLFD>; 73681ad6265SDimitry Andric defm PSTW8 : 737*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr), 738*06c3fb27SDimitry Andric (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr), 739*06c3fb27SDimitry Andric "pstw $RST, $addr", IIC_LdStLFD>; 74081ad6265SDimitry Andric } 74181ad6265SDimitry Andric defm PSTB : 742*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr), 743*06c3fb27SDimitry Andric (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr), 744*06c3fb27SDimitry Andric "pstb $RST, $addr", IIC_LdStLFD>; 74581ad6265SDimitry Andric defm PSTH : 746*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr), 747*06c3fb27SDimitry Andric (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr), 748*06c3fb27SDimitry Andric "psth $RST, $addr", IIC_LdStLFD>; 74981ad6265SDimitry Andric defm PSTW : 750*06c3fb27SDimitry Andric MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr), 751*06c3fb27SDimitry Andric (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr), 752*06c3fb27SDimitry Andric "pstw $RST, $addr", IIC_LdStLFD>; 75381ad6265SDimitry Andric defm PSTD : 754*06c3fb27SDimitry Andric 8LS_DForm_R_SI34_RTA5_MEM_p<61, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr), 755*06c3fb27SDimitry Andric (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr), 756*06c3fb27SDimitry Andric "pstd $RST, $addr", IIC_LdStLFD>; 75781ad6265SDimitry Andric } 75881ad6265SDimitry Andric} 75981ad6265SDimitry Andric 76081ad6265SDimitry Andricclass DQForm_XTp5_RA17_MEM<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, 76181ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 76281ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 76381ad6265SDimitry Andric bits<5> XTp; 764*06c3fb27SDimitry Andric bits<5> RA; 765*06c3fb27SDimitry Andric bits<12> DQ; 766*06c3fb27SDimitry Andric 76781ad6265SDimitry Andric let Pattern = pattern; 76881ad6265SDimitry Andric 76981ad6265SDimitry Andric let Inst{6-9} = XTp{3-0}; 77081ad6265SDimitry Andric let Inst{10} = XTp{4}; 771*06c3fb27SDimitry Andric let Inst{11-15} = RA; 772*06c3fb27SDimitry Andric let Inst{16-27} = DQ; 77381ad6265SDimitry Andric let Inst{28-31} = xo; 77481ad6265SDimitry Andric} 77581ad6265SDimitry Andric 77681ad6265SDimitry Andricclass XForm_XTp5_XAB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 77781ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 77881ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp { 77981ad6265SDimitry Andric bits<5> XTp; 780*06c3fb27SDimitry Andric bits<5> RA; 781*06c3fb27SDimitry Andric bits<5> RB; 78281ad6265SDimitry Andric 78381ad6265SDimitry Andric let Pattern = pattern; 78481ad6265SDimitry Andric let Inst{6-9} = XTp{3-0}; 78581ad6265SDimitry Andric let Inst{10} = XTp{4}; 786*06c3fb27SDimitry Andric let Inst{11-15} = RA; 787*06c3fb27SDimitry Andric let Inst{16-20} = RB; 78881ad6265SDimitry Andric let Inst{21-30} = xo; 78981ad6265SDimitry Andric let Inst{31} = 0; 79081ad6265SDimitry Andric} 79181ad6265SDimitry Andric 79281ad6265SDimitry Andricclass 8LS_DForm_R_XTp5_SI34_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 79381ad6265SDimitry Andric InstrItinClass itin, list<dag> pattern> 79481ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 79581ad6265SDimitry Andric bits<5> XTp; 796*06c3fb27SDimitry Andric bits<5> RA; 797*06c3fb27SDimitry Andric bits<34> D; 79881ad6265SDimitry Andric 79981ad6265SDimitry Andric let Pattern = pattern; 80081ad6265SDimitry Andric 80181ad6265SDimitry Andric // The prefix. 80281ad6265SDimitry Andric let Inst{6-10} = 0; 80381ad6265SDimitry Andric let Inst{11} = PCRel; 80481ad6265SDimitry Andric let Inst{12-13} = 0; 805*06c3fb27SDimitry Andric let Inst{14-31} = D{33-16}; // Imm18 80681ad6265SDimitry Andric 80781ad6265SDimitry Andric // The instruction. 80881ad6265SDimitry Andric let Inst{38-41} = XTp{3-0}; 80981ad6265SDimitry Andric let Inst{42} = XTp{4}; 810*06c3fb27SDimitry Andric let Inst{43-47} = RA; 811*06c3fb27SDimitry Andric let Inst{48-63} = D{15-0}; 81281ad6265SDimitry Andric} 81381ad6265SDimitry Andric 81481ad6265SDimitry Andricmulticlass 8LS_DForm_R_XTp5_SI34_MEM_p<bits<6> opcode, dag OOL, 81581ad6265SDimitry Andric dag IOL, dag PCRel_IOL, 81681ad6265SDimitry Andric string asmstr, InstrItinClass itin> { 81781ad6265SDimitry Andric def NAME : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL, 81881ad6265SDimitry Andric !strconcat(asmstr, ", 0"), itin, []>; 81981ad6265SDimitry Andric def pc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRel_IOL, 82081ad6265SDimitry Andric !strconcat(asmstr, ", 1"), itin, []>, 82181ad6265SDimitry Andric isPCRel; 82281ad6265SDimitry Andric} 82381ad6265SDimitry Andric 82481ad6265SDimitry Andric 82581ad6265SDimitry Andric 82681ad6265SDimitry Andric// [PO AS XO2 XO] 82781ad6265SDimitry Andricclass XForm_AT3<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL, 82881ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 82981ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 83081ad6265SDimitry Andric bits<3> AT; 83181ad6265SDimitry Andric 83281ad6265SDimitry Andric let Pattern = pattern; 83381ad6265SDimitry Andric 83481ad6265SDimitry Andric let Inst{6-8} = AT; 83581ad6265SDimitry Andric let Inst{9-10} = 0; 83681ad6265SDimitry Andric let Inst{11-15} = xo2; 83781ad6265SDimitry Andric let Inst{16-20} = 0; 83881ad6265SDimitry Andric let Inst{21-30} = xo; 83981ad6265SDimitry Andric let Inst{31} = 0; 84081ad6265SDimitry Andric} 84181ad6265SDimitry Andric 84281ad6265SDimitry Andric// X-Form: [ PO T EO UIM XO TX ] 84381ad6265SDimitry Andricclass XForm_XT6_IMM5<bits<6> opcode, bits<5> eo, bits<10> xo, dag OOL, dag IOL, 84481ad6265SDimitry Andric string asmstr, InstrItinClass itin, list<dag> pattern> 84581ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 84681ad6265SDimitry Andric bits<6> XT; 84781ad6265SDimitry Andric bits<5> UIM; 84881ad6265SDimitry Andric 84981ad6265SDimitry Andric let Pattern = pattern; 85081ad6265SDimitry Andric 85181ad6265SDimitry Andric let Inst{6-10} = XT{4-0}; 85281ad6265SDimitry Andric let Inst{11-15} = eo; 85381ad6265SDimitry Andric let Inst{16-20} = UIM; 85481ad6265SDimitry Andric let Inst{21-30} = xo; 85581ad6265SDimitry Andric let Inst{31} = XT{5}; 85681ad6265SDimitry Andric} 85781ad6265SDimitry Andric 85881ad6265SDimitry Andricclass XX3Form_AT3_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 85981ad6265SDimitry Andric string asmstr, InstrItinClass itin, 86081ad6265SDimitry Andric list<dag> pattern> 86181ad6265SDimitry Andric : I<opcode, OOL, IOL, asmstr, itin> { 86281ad6265SDimitry Andric bits<3> AT; 86381ad6265SDimitry Andric bits<6> XA; 86481ad6265SDimitry Andric bits<6> XB; 86581ad6265SDimitry Andric 86681ad6265SDimitry Andric let Pattern = pattern; 86781ad6265SDimitry Andric 86881ad6265SDimitry Andric let Inst{6-8} = AT; 86981ad6265SDimitry Andric let Inst{9-10} = 0; 87081ad6265SDimitry Andric let Inst{11-15} = XA{4-0}; 87181ad6265SDimitry Andric let Inst{16-20} = XB{4-0}; 87281ad6265SDimitry Andric let Inst{21-28} = xo; 87381ad6265SDimitry Andric let Inst{29} = XA{5}; 87481ad6265SDimitry Andric let Inst{30} = XB{5}; 87581ad6265SDimitry Andric let Inst{31} = 0; 87681ad6265SDimitry Andric} 87781ad6265SDimitry Andric 87881ad6265SDimitry Andricclass MMIRR_XX3Form_XY4P2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 87981ad6265SDimitry Andric string asmstr, InstrItinClass itin, 88081ad6265SDimitry Andric list<dag> pattern> 88181ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 88281ad6265SDimitry Andric bits<3> AT; 88381ad6265SDimitry Andric bits<6> XA; 88481ad6265SDimitry Andric bits<6> XB; 88581ad6265SDimitry Andric bits<4> XMSK; 88681ad6265SDimitry Andric bits<4> YMSK; 88781ad6265SDimitry Andric bits<2> PMSK; 88881ad6265SDimitry Andric 88981ad6265SDimitry Andric let Pattern = pattern; 89081ad6265SDimitry Andric 89181ad6265SDimitry Andric // The prefix. 89281ad6265SDimitry Andric let Inst{6-7} = 3; 89381ad6265SDimitry Andric let Inst{8-11} = 9; 89481ad6265SDimitry Andric let Inst{12-15} = 0; 89581ad6265SDimitry Andric let Inst{16-17} = PMSK; 89681ad6265SDimitry Andric let Inst{18-23} = 0; 89781ad6265SDimitry Andric let Inst{24-27} = XMSK; 89881ad6265SDimitry Andric let Inst{28-31} = YMSK; 89981ad6265SDimitry Andric 90081ad6265SDimitry Andric // The instruction. 90181ad6265SDimitry Andric let Inst{38-40} = AT; 90281ad6265SDimitry Andric let Inst{41-42} = 0; 90381ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 90481ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 90581ad6265SDimitry Andric let Inst{53-60} = xo; 90681ad6265SDimitry Andric let Inst{61} = XA{5}; 90781ad6265SDimitry Andric let Inst{62} = XB{5}; 90881ad6265SDimitry Andric let Inst{63} = 0; 90981ad6265SDimitry Andric} 91081ad6265SDimitry Andric 91181ad6265SDimitry Andricclass MMIRR_XX3Form_XY4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 91281ad6265SDimitry Andric string asmstr, InstrItinClass itin, 91381ad6265SDimitry Andric list<dag> pattern> 91481ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 91581ad6265SDimitry Andric bits<3> AT; 91681ad6265SDimitry Andric bits<6> XA; 91781ad6265SDimitry Andric bits<6> XB; 91881ad6265SDimitry Andric bits<4> XMSK; 91981ad6265SDimitry Andric bits<4> YMSK; 92081ad6265SDimitry Andric 92181ad6265SDimitry Andric let Pattern = pattern; 92281ad6265SDimitry Andric 92381ad6265SDimitry Andric // The prefix. 92481ad6265SDimitry Andric let Inst{6-7} = 3; 92581ad6265SDimitry Andric let Inst{8-11} = 9; 92681ad6265SDimitry Andric let Inst{12-23} = 0; 92781ad6265SDimitry Andric let Inst{24-27} = XMSK; 92881ad6265SDimitry Andric let Inst{28-31} = YMSK; 92981ad6265SDimitry Andric 93081ad6265SDimitry Andric // The instruction. 93181ad6265SDimitry Andric let Inst{38-40} = AT; 93281ad6265SDimitry Andric let Inst{41-42} = 0; 93381ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 93481ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 93581ad6265SDimitry Andric let Inst{53-60} = xo; 93681ad6265SDimitry Andric let Inst{61} = XA{5}; 93781ad6265SDimitry Andric let Inst{62} = XB{5}; 93881ad6265SDimitry Andric let Inst{63} = 0; 93981ad6265SDimitry Andric} 94081ad6265SDimitry Andric 94181ad6265SDimitry Andricclass MMIRR_XX3Form_X4Y2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 94281ad6265SDimitry Andric string asmstr, InstrItinClass itin, 94381ad6265SDimitry Andric list<dag> pattern> 94481ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 94581ad6265SDimitry Andric bits<3> AT; 94681ad6265SDimitry Andric bits<6> XA; 94781ad6265SDimitry Andric bits<6> XB; 94881ad6265SDimitry Andric bits<4> XMSK; 94981ad6265SDimitry Andric bits<2> YMSK; 95081ad6265SDimitry Andric 95181ad6265SDimitry Andric let Pattern = pattern; 95281ad6265SDimitry Andric 95381ad6265SDimitry Andric // The prefix. 95481ad6265SDimitry Andric let Inst{6-7} = 3; 95581ad6265SDimitry Andric let Inst{8-11} = 9; 95681ad6265SDimitry Andric let Inst{12-23} = 0; 95781ad6265SDimitry Andric let Inst{24-27} = XMSK; 95881ad6265SDimitry Andric let Inst{28-29} = YMSK; 95981ad6265SDimitry Andric let Inst{30-31} = 0; 96081ad6265SDimitry Andric 96181ad6265SDimitry Andric // The instruction. 96281ad6265SDimitry Andric let Inst{38-40} = AT; 96381ad6265SDimitry Andric let Inst{41-42} = 0; 96481ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 96581ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 96681ad6265SDimitry Andric let Inst{53-60} = xo; 96781ad6265SDimitry Andric let Inst{61} = XA{5}; 96881ad6265SDimitry Andric let Inst{62} = XB{5}; 96981ad6265SDimitry Andric let Inst{63} = 0; 97081ad6265SDimitry Andric} 97181ad6265SDimitry Andric 97281ad6265SDimitry Andricclass MMIRR_XX3Form_XY4P8_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 97381ad6265SDimitry Andric string asmstr, InstrItinClass itin, 97481ad6265SDimitry Andric list<dag> pattern> 97581ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 97681ad6265SDimitry Andric bits<3> AT; 97781ad6265SDimitry Andric bits<6> XA; 97881ad6265SDimitry Andric bits<6> XB; 97981ad6265SDimitry Andric bits<4> XMSK; 98081ad6265SDimitry Andric bits<4> YMSK; 98181ad6265SDimitry Andric bits<8> PMSK; 98281ad6265SDimitry Andric 98381ad6265SDimitry Andric let Pattern = pattern; 98481ad6265SDimitry Andric 98581ad6265SDimitry Andric // The prefix. 98681ad6265SDimitry Andric let Inst{6-7} = 3; 98781ad6265SDimitry Andric let Inst{8-11} = 9; 98881ad6265SDimitry Andric let Inst{12-15} = 0; 98981ad6265SDimitry Andric let Inst{16-23} = PMSK; 99081ad6265SDimitry Andric let Inst{24-27} = XMSK; 99181ad6265SDimitry Andric let Inst{28-31} = YMSK; 99281ad6265SDimitry Andric 99381ad6265SDimitry Andric // The instruction. 99481ad6265SDimitry Andric let Inst{38-40} = AT; 99581ad6265SDimitry Andric let Inst{41-42} = 0; 99681ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 99781ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 99881ad6265SDimitry Andric let Inst{53-60} = xo; 99981ad6265SDimitry Andric let Inst{61} = XA{5}; 100081ad6265SDimitry Andric let Inst{62} = XB{5}; 100181ad6265SDimitry Andric let Inst{63} = 0; 100281ad6265SDimitry Andric} 100381ad6265SDimitry Andric 100481ad6265SDimitry Andricclass MMIRR_XX3Form_XYP4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 100581ad6265SDimitry Andric string asmstr, InstrItinClass itin, 100681ad6265SDimitry Andric list<dag> pattern> 100781ad6265SDimitry Andric : PI<1, opcode, OOL, IOL, asmstr, itin> { 100881ad6265SDimitry Andric bits<3> AT; 100981ad6265SDimitry Andric bits<6> XA; 101081ad6265SDimitry Andric bits<6> XB; 101181ad6265SDimitry Andric bits<4> XMSK; 101281ad6265SDimitry Andric bits<4> YMSK; 101381ad6265SDimitry Andric bits<4> PMSK; 101481ad6265SDimitry Andric 101581ad6265SDimitry Andric let Pattern = pattern; 101681ad6265SDimitry Andric 101781ad6265SDimitry Andric // The prefix. 101881ad6265SDimitry Andric let Inst{6-7} = 3; 101981ad6265SDimitry Andric let Inst{8-11} = 9; 102081ad6265SDimitry Andric let Inst{12-15} = 0; 102181ad6265SDimitry Andric let Inst{16-19} = PMSK; 102281ad6265SDimitry Andric let Inst{20-23} = 0; 102381ad6265SDimitry Andric let Inst{24-27} = XMSK; 102481ad6265SDimitry Andric let Inst{28-31} = YMSK; 102581ad6265SDimitry Andric 102681ad6265SDimitry Andric // The instruction. 102781ad6265SDimitry Andric let Inst{38-40} = AT; 102881ad6265SDimitry Andric let Inst{41-42} = 0; 102981ad6265SDimitry Andric let Inst{43-47} = XA{4-0}; 103081ad6265SDimitry Andric let Inst{48-52} = XB{4-0}; 103181ad6265SDimitry Andric let Inst{53-60} = xo; 103281ad6265SDimitry Andric let Inst{61} = XA{5}; 103381ad6265SDimitry Andric let Inst{62} = XB{5}; 103481ad6265SDimitry Andric let Inst{63} = 0; 103581ad6265SDimitry Andric} 103681ad6265SDimitry Andric 103781ad6265SDimitry Andric 103881ad6265SDimitry Andric 103981ad6265SDimitry Andricdef Concats { 104081ad6265SDimitry Andric dag VecsToVecPair0 = 104181ad6265SDimitry Andric (v256i1 (INSERT_SUBREG 104281ad6265SDimitry Andric (INSERT_SUBREG (IMPLICIT_DEF), $vs0, sub_vsx1), 104381ad6265SDimitry Andric $vs1, sub_vsx0)); 104481ad6265SDimitry Andric dag VecsToVecPair1 = 104581ad6265SDimitry Andric (v256i1 (INSERT_SUBREG 104681ad6265SDimitry Andric (INSERT_SUBREG (IMPLICIT_DEF), $vs2, sub_vsx1), 104781ad6265SDimitry Andric $vs3, sub_vsx0)); 104881ad6265SDimitry Andric} 104981ad6265SDimitry Andric 105081ad6265SDimitry Andriclet Predicates = [PairedVectorMemops] in { 105181ad6265SDimitry Andric def : Pat<(v256i1 (PPCPairBuild v4i32:$vs1, v4i32:$vs0)), 105281ad6265SDimitry Andric Concats.VecsToVecPair0>; 105381ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_assemble_pair v16i8:$vs1, v16i8:$vs0)), 105481ad6265SDimitry Andric Concats.VecsToVecPair0>; 105581ad6265SDimitry Andric def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 0)), 105681ad6265SDimitry Andric (v4i32 (EXTRACT_SUBREG $v, sub_vsx0))>; 105781ad6265SDimitry Andric def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 1)), 105881ad6265SDimitry Andric (v4i32 (EXTRACT_SUBREG $v, sub_vsx1))>; 105981ad6265SDimitry Andric} 106081ad6265SDimitry Andric 106181ad6265SDimitry Andriclet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops] in { 106281ad6265SDimitry Andric def LXVP : DQForm_XTp5_RA17_MEM<6, 0, (outs vsrprc:$XTp), 1063*06c3fb27SDimitry Andric (ins (memrix16 $DQ, $RA):$addr), "lxvp $XTp, $addr", 106481ad6265SDimitry Andric IIC_LdStLFD, []>; 1065*06c3fb27SDimitry Andric def LXVPX : XForm_XTp5_XAB5<31, 333, (outs vsrprc:$XTp), (ins (memrr $RA, $RB):$addr), 1066*06c3fb27SDimitry Andric "lxvpx $XTp, $addr", IIC_LdStLFD, 106781ad6265SDimitry Andric []>; 106881ad6265SDimitry Andric} 106981ad6265SDimitry Andric 107081ad6265SDimitry Andriclet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops] in { 107181ad6265SDimitry Andric def STXVP : DQForm_XTp5_RA17_MEM<6, 1, (outs), (ins vsrprc:$XTp, 1072*06c3fb27SDimitry Andric (memrix16 $DQ, $RA):$addr), "stxvp $XTp, $addr", 107381ad6265SDimitry Andric IIC_LdStLFD, []>; 1074*06c3fb27SDimitry Andric def STXVPX : XForm_XTp5_XAB5<31, 461, (outs), (ins vsrprc:$XTp, (memrr $RA, $RB):$addr), 1075*06c3fb27SDimitry Andric "stxvpx $XTp, $addr", IIC_LdStLFD, 107681ad6265SDimitry Andric []>; 107781ad6265SDimitry Andric} 107881ad6265SDimitry Andric 107981ad6265SDimitry Andriclet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops, PrefixInstrs] in { 108081ad6265SDimitry Andric defm PLXVP : 1081*06c3fb27SDimitry Andric 8LS_DForm_R_XTp5_SI34_MEM_p<58, (outs vsrprc:$XTp), (ins (memri34 $D, $RA):$addr), 1082*06c3fb27SDimitry Andric (ins (memri34_pcrel $D, $RA):$addr), "plxvp $XTp, $addr", 108381ad6265SDimitry Andric IIC_LdStLFD>; 108481ad6265SDimitry Andric} 108581ad6265SDimitry Andric 108681ad6265SDimitry Andriclet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops, PrefixInstrs] in { 108781ad6265SDimitry Andric defm PSTXVP : 1088*06c3fb27SDimitry Andric 8LS_DForm_R_XTp5_SI34_MEM_p<62, (outs), (ins vsrprc:$XTp, (memri34 $D, $RA):$addr), 1089*06c3fb27SDimitry Andric (ins vsrprc:$XTp, (memri34_pcrel $D, $RA):$addr), 1090*06c3fb27SDimitry Andric "pstxvp $XTp, $addr", IIC_LdStLFD>; 109181ad6265SDimitry Andric} 109281ad6265SDimitry Andric 109381ad6265SDimitry Andriclet Predicates = [PairedVectorMemops] in { 109481ad6265SDimitry Andric // Intrinsics for Paired Vector Loads. 109581ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp DQForm:$src)), (LXVP memrix16:$src)>; 109681ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp XForm:$src)), (LXVPX XForm:$src)>; 109781ad6265SDimitry Andric let Predicates = [PairedVectorMemops, PrefixInstrs] in { 109881ad6265SDimitry Andric def : Pat<(v256i1 (int_ppc_vsx_lxvp PDForm:$src)), (PLXVP memri34:$src)>; 109981ad6265SDimitry Andric } 110081ad6265SDimitry Andric // Intrinsics for Paired Vector Stores. 110181ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, DQForm:$dst), 110281ad6265SDimitry Andric (STXVP $XSp, memrix16:$dst)>; 110381ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, XForm:$dst), 110481ad6265SDimitry Andric (STXVPX $XSp, XForm:$dst)>; 110581ad6265SDimitry Andric let Predicates = [PairedVectorMemops, PrefixInstrs] in { 110681ad6265SDimitry Andric def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, PDForm:$dst), 110781ad6265SDimitry Andric (PSTXVP $XSp, memri34:$dst)>; 110881ad6265SDimitry Andric } 110981ad6265SDimitry Andric} 111081ad6265SDimitry Andric 1111bdd1243dSDimitry Andriclet Predicates = [IsISA3_1] in { 1112bdd1243dSDimitry Andric def XSCMPEQQP : X_VT5_VA5_VB5<63, 68, "xscmpeqqp", []>; 1113bdd1243dSDimitry Andric def XSCMPGEQP : X_VT5_VA5_VB5<63, 196, "xscmpgeqp", []>; 1114bdd1243dSDimitry Andric def XSCMPGTQP : X_VT5_VA5_VB5<63, 228, "xscmpgtqp", []>; 1115bdd1243dSDimitry Andric} 1116bdd1243dSDimitry Andric 111781ad6265SDimitry Andriclet Predicates = [PCRelativeMemops] in { 111881ad6265SDimitry Andric // Load i32 111981ad6265SDimitry Andric def : Pat<(i32 (zextloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 112081ad6265SDimitry Andric (PLBZpc $ga, 0)>; 112181ad6265SDimitry Andric def : Pat<(i32 (extloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 112281ad6265SDimitry Andric (PLBZpc $ga, 0)>; 112381ad6265SDimitry Andric def : Pat<(i32 (zextloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 112481ad6265SDimitry Andric (PLBZpc $ga, 0)>; 112581ad6265SDimitry Andric def : Pat<(i32 (extloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 112681ad6265SDimitry Andric (PLBZpc $ga, 0)>; 112781ad6265SDimitry Andric def : Pat<(i32 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 112881ad6265SDimitry Andric (PLHApc $ga, 0)>; 112981ad6265SDimitry Andric def : Pat<(i32 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 113081ad6265SDimitry Andric (PLHZpc $ga, 0)>; 113181ad6265SDimitry Andric def : Pat<(i32 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 113281ad6265SDimitry Andric (PLHZpc $ga, 0)>; 113381ad6265SDimitry Andric def : Pat<(i32 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLWZpc $ga, 0)>; 113481ad6265SDimitry Andric 113581ad6265SDimitry Andric // Store i32 113681ad6265SDimitry Andric def : Pat<(truncstorei8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 113781ad6265SDimitry Andric (PSTBpc $RS, $ga, 0)>; 113881ad6265SDimitry Andric def : Pat<(truncstorei16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 113981ad6265SDimitry Andric (PSTHpc $RS, $ga, 0)>; 114081ad6265SDimitry Andric def : Pat<(store i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 114181ad6265SDimitry Andric (PSTWpc $RS, $ga, 0)>; 114281ad6265SDimitry Andric 114381ad6265SDimitry Andric // Load i64 114481ad6265SDimitry Andric def : Pat<(i64 (zextloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 114581ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 114681ad6265SDimitry Andric def : Pat<(i64 (extloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 114781ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 114881ad6265SDimitry Andric def : Pat<(i64 (zextloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 114981ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 115081ad6265SDimitry Andric def : Pat<(i64 (extloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 115181ad6265SDimitry Andric (PLBZ8pc $ga, 0)>; 115281ad6265SDimitry Andric def : Pat<(i64 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 115381ad6265SDimitry Andric (PLHA8pc $ga, 0)>; 115481ad6265SDimitry Andric def : Pat<(i64 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 115581ad6265SDimitry Andric (PLHZ8pc $ga, 0)>; 115681ad6265SDimitry Andric def : Pat<(i64 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 115781ad6265SDimitry Andric (PLHZ8pc $ga, 0)>; 115881ad6265SDimitry Andric def : Pat<(i64 (zextloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 115981ad6265SDimitry Andric (PLWZ8pc $ga, 0)>; 116081ad6265SDimitry Andric def : Pat<(i64 (sextloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 116181ad6265SDimitry Andric (PLWA8pc $ga, 0)>; 116281ad6265SDimitry Andric def : Pat<(i64 (extloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 116381ad6265SDimitry Andric (PLWZ8pc $ga, 0)>; 116481ad6265SDimitry Andric def : Pat<(i64 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLDpc $ga, 0)>; 116581ad6265SDimitry Andric 116681ad6265SDimitry Andric // Store i64 116781ad6265SDimitry Andric def : Pat<(truncstorei8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 116881ad6265SDimitry Andric (PSTB8pc $RS, $ga, 0)>; 116981ad6265SDimitry Andric def : Pat<(truncstorei16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 117081ad6265SDimitry Andric (PSTH8pc $RS, $ga, 0)>; 117181ad6265SDimitry Andric def : Pat<(truncstorei32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 117281ad6265SDimitry Andric (PSTW8pc $RS, $ga, 0)>; 117381ad6265SDimitry Andric def : Pat<(store i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 117481ad6265SDimitry Andric (PSTDpc $RS, $ga, 0)>; 117581ad6265SDimitry Andric 117681ad6265SDimitry Andric // Load f32 117781ad6265SDimitry Andric def : Pat<(f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFSpc $addr, 0)>; 117881ad6265SDimitry Andric 117981ad6265SDimitry Andric // Store f32 118081ad6265SDimitry Andric def : Pat<(store f32:$FRS, (PPCmatpcreladdr PCRelForm:$ga)), 118181ad6265SDimitry Andric (PSTFSpc $FRS, $ga, 0)>; 118281ad6265SDimitry Andric 118381ad6265SDimitry Andric // Load f64 118481ad6265SDimitry Andric def : Pat<(f64 (extloadf32 (PPCmatpcreladdr PCRelForm:$addr))), 118581ad6265SDimitry Andric (COPY_TO_REGCLASS (PLFSpc $addr, 0), VSFRC)>; 118681ad6265SDimitry Andric def : Pat<(f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFDpc $addr, 0)>; 118781ad6265SDimitry Andric 118881ad6265SDimitry Andric // Store f64 118981ad6265SDimitry Andric def : Pat<(store f64:$FRS, (PPCmatpcreladdr PCRelForm:$ga)), 119081ad6265SDimitry Andric (PSTFDpc $FRS, $ga, 0)>; 119181ad6265SDimitry Andric 119281ad6265SDimitry Andric // Load f128 119381ad6265SDimitry Andric def : Pat<(f128 (load (PPCmatpcreladdr PCRelForm:$addr))), 119481ad6265SDimitry Andric (COPY_TO_REGCLASS (PLXVpc $addr, 0), VRRC)>; 119581ad6265SDimitry Andric 119681ad6265SDimitry Andric // Store f128 119781ad6265SDimitry Andric def : Pat<(store f128:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 119881ad6265SDimitry Andric (PSTXVpc (COPY_TO_REGCLASS $XS, VSRC), $ga, 0)>; 119981ad6265SDimitry Andric 120081ad6265SDimitry Andric // Load v4i32 120181ad6265SDimitry Andric def : Pat<(v4i32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 120281ad6265SDimitry Andric 120381ad6265SDimitry Andric // Store v4i32 120481ad6265SDimitry Andric def : Pat<(store v4i32:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 120581ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 120681ad6265SDimitry Andric 120781ad6265SDimitry Andric // Load v2i64 120881ad6265SDimitry Andric def : Pat<(v2i64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 120981ad6265SDimitry Andric 121081ad6265SDimitry Andric // Store v2i64 121181ad6265SDimitry Andric def : Pat<(store v2i64:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 121281ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 121381ad6265SDimitry Andric 121481ad6265SDimitry Andric // Load v4f32 121581ad6265SDimitry Andric def : Pat<(v4f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 121681ad6265SDimitry Andric 121781ad6265SDimitry Andric // Store v4f32 121881ad6265SDimitry Andric def : Pat<(store v4f32:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 121981ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 122081ad6265SDimitry Andric 122181ad6265SDimitry Andric // Load v2f64 122281ad6265SDimitry Andric def : Pat<(v2f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 122381ad6265SDimitry Andric 122481ad6265SDimitry Andric // Store v2f64 122581ad6265SDimitry Andric def : Pat<(store v2f64:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 122681ad6265SDimitry Andric (PSTXVpc $XS, $ga, 0)>; 122781ad6265SDimitry Andric 122881ad6265SDimitry Andric // Atomic Load 122981ad6265SDimitry Andric def : Pat<(atomic_load_8 (PPCmatpcreladdr PCRelForm:$ga)), 123081ad6265SDimitry Andric (PLBZpc $ga, 0)>; 123181ad6265SDimitry Andric def : Pat<(atomic_load_16 (PPCmatpcreladdr PCRelForm:$ga)), 123281ad6265SDimitry Andric (PLHZpc $ga, 0)>; 123381ad6265SDimitry Andric def : Pat<(atomic_load_32 (PPCmatpcreladdr PCRelForm:$ga)), 123481ad6265SDimitry Andric (PLWZpc $ga, 0)>; 123581ad6265SDimitry Andric def : Pat<(atomic_load_64 (PPCmatpcreladdr PCRelForm:$ga)), 123681ad6265SDimitry Andric (PLDpc $ga, 0)>; 123781ad6265SDimitry Andric 123881ad6265SDimitry Andric // Atomic Store 123981ad6265SDimitry Andric def : Pat<(atomic_store_8 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 124081ad6265SDimitry Andric (PSTBpc $RS, $ga, 0)>; 124181ad6265SDimitry Andric def : Pat<(atomic_store_16 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 124281ad6265SDimitry Andric (PSTHpc $RS, $ga, 0)>; 124381ad6265SDimitry Andric def : Pat<(atomic_store_32 (PPCmatpcreladdr PCRelForm:$ga), i32:$RS), 124481ad6265SDimitry Andric (PSTWpc $RS, $ga, 0)>; 124581ad6265SDimitry Andric def : Pat<(atomic_store_8 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 124681ad6265SDimitry Andric (PSTB8pc $RS, $ga, 0)>; 124781ad6265SDimitry Andric def : Pat<(atomic_store_16 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 124881ad6265SDimitry Andric (PSTH8pc $RS, $ga, 0)>; 124981ad6265SDimitry Andric def : Pat<(atomic_store_32 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 125081ad6265SDimitry Andric (PSTW8pc $RS, $ga, 0)>; 125181ad6265SDimitry Andric def : Pat<(atomic_store_64 (PPCmatpcreladdr PCRelForm:$ga), i64:$RS), 125281ad6265SDimitry Andric (PSTDpc $RS, $ga, 0)>; 125381ad6265SDimitry Andric 125481ad6265SDimitry Andric // Special Cases For PPCstore_scal_int_from_vsr 1255*06c3fb27SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr f64:$src, (PPCmatpcreladdr PCRelForm:$dst), 8), 1256*06c3fb27SDimitry Andric (PSTXSDpc $src, $dst, 0)>; 1257*06c3fb27SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr f128:$src, (PPCmatpcreladdr PCRelForm:$dst), 8), 1258*06c3fb27SDimitry Andric (PSTXSDpc (COPY_TO_REGCLASS $src, VFRC), $dst, 0)>; 125981ad6265SDimitry Andric 126081ad6265SDimitry Andric def : Pat<(v4f32 (PPCldvsxlh (PPCmatpcreladdr PCRelForm:$addr))), 126181ad6265SDimitry Andric (SUBREG_TO_REG (i64 1), (PLFDpc $addr, 0), sub_64)>; 126281ad6265SDimitry Andric 126381ad6265SDimitry Andric // If the PPCmatpcreladdr node is not caught by any other pattern it should be 126481ad6265SDimitry Andric // caught here and turned into a paddi instruction to materialize the address. 126581ad6265SDimitry Andric def : Pat<(PPCmatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>; 126681ad6265SDimitry Andric // PPCtlsdynamatpcreladdr node is used for TLS dynamic models to materialize 126781ad6265SDimitry Andric // tls global address with paddi instruction. 126881ad6265SDimitry Andric def : Pat<(PPCtlsdynamatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>; 126981ad6265SDimitry Andric // PPCtlslocalexecmataddr node is used for TLS local exec models to 127081ad6265SDimitry Andric // materialize tls global address with paddi instruction. 127181ad6265SDimitry Andric def : Pat<(PPCaddTls i64:$in, (PPCtlslocalexecmataddr tglobaltlsaddr:$addr)), 127281ad6265SDimitry Andric (PADDI8 $in, $addr)>; 127381ad6265SDimitry Andric} 127481ad6265SDimitry Andric 127581ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 127681ad6265SDimitry Andric def XXPERMX : 127781ad6265SDimitry Andric 8RR_XX4Form_IMM3_XTABC6<34, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 1278*06c3fb27SDimitry Andric vsrc:$XC, u3imm:$IMM), 1279*06c3fb27SDimitry Andric "xxpermx $XT, $XA, $XB, $XC, $IMM", 128081ad6265SDimitry Andric IIC_VecPerm, []>; 128181ad6265SDimitry Andric def XXBLENDVB : 128281ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 128381ad6265SDimitry Andric vsrc:$XC), "xxblendvb $XT, $XA, $XB, $XC", 128481ad6265SDimitry Andric IIC_VecGeneral, []>; 128581ad6265SDimitry Andric def XXBLENDVH : 128681ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 128781ad6265SDimitry Andric vsrc:$XC), "xxblendvh $XT, $XA, $XB, $XC", 128881ad6265SDimitry Andric IIC_VecGeneral, []>; 128981ad6265SDimitry Andric def XXBLENDVW : 129081ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 2, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 129181ad6265SDimitry Andric vsrc:$XC), "xxblendvw $XT, $XA, $XB, $XC", 129281ad6265SDimitry Andric IIC_VecGeneral, []>; 129381ad6265SDimitry Andric def XXBLENDVD : 129481ad6265SDimitry Andric 8RR_XX4Form_XTABC6<33, 3, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 129581ad6265SDimitry Andric vsrc:$XC), "xxblendvd $XT, $XA, $XB, $XC", 129681ad6265SDimitry Andric IIC_VecGeneral, []>; 129781ad6265SDimitry Andric} 129881ad6265SDimitry Andric 129981ad6265SDimitry Andric// XXSPLTIW/DP/32DX need extra flags to make sure the compiler does not attempt 130081ad6265SDimitry Andric// to spill part of the instruction when the values are similar. 130181ad6265SDimitry Andriclet isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1, Predicates = [PrefixInstrs] in { 130281ad6265SDimitry Andric def XXSPLTIW : 8RR_DForm_IMM32_XT6<32, 3, (outs vsrc:$XT), 130381ad6265SDimitry Andric (ins i32imm:$IMM32), 130481ad6265SDimitry Andric "xxspltiw $XT, $IMM32", IIC_VecGeneral, 130581ad6265SDimitry Andric []>; 130681ad6265SDimitry Andric def XXSPLTIDP : 8RR_DForm_IMM32_XT6<32, 2, (outs vsrc:$XT), 130781ad6265SDimitry Andric (ins i32imm:$IMM32), 130881ad6265SDimitry Andric "xxspltidp $XT, $IMM32", IIC_VecGeneral, 130981ad6265SDimitry Andric [(set v2f64:$XT, 131081ad6265SDimitry Andric (PPCxxspltidp i32:$IMM32))]>; 131181ad6265SDimitry Andric def XXSPLTI32DX : 131281ad6265SDimitry Andric 8RR_DForm_IMM32_XT6_IX<32, 0, (outs vsrc:$XT), 131381ad6265SDimitry Andric (ins vsrc:$XTi, u1imm:$IX, i32imm:$IMM32), 131481ad6265SDimitry Andric "xxsplti32dx $XT, $IX, $IMM32", IIC_VecGeneral, 131581ad6265SDimitry Andric [(set v2i64:$XT, 131681ad6265SDimitry Andric (PPCxxsplti32dx v2i64:$XTi, i32:$IX, 131781ad6265SDimitry Andric i32:$IMM32))]>, 131881ad6265SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">; 131981ad6265SDimitry Andric} 132081ad6265SDimitry Andric 132181ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 1322*06c3fb27SDimitry Andric def SETBC : XForm_XT5_BI5<31, 384, (outs gprc:$RST), (ins crbitrc:$BI), 1323*06c3fb27SDimitry Andric "setbc $RST, $BI", IIC_IntCompare, []>, 1324bdd1243dSDimitry Andric SExt32To64, ZExt32To64; 1325*06c3fb27SDimitry Andric def SETBCR : XForm_XT5_BI5<31, 416, (outs gprc:$RST), (ins crbitrc:$BI), 1326*06c3fb27SDimitry Andric "setbcr $RST, $BI", IIC_IntCompare, []>, 1327bdd1243dSDimitry Andric SExt32To64, ZExt32To64; 1328*06c3fb27SDimitry Andric def SETNBC : XForm_XT5_BI5<31, 448, (outs gprc:$RST), (ins crbitrc:$BI), 1329*06c3fb27SDimitry Andric "setnbc $RST, $BI", IIC_IntCompare, []>, 1330bdd1243dSDimitry Andric SExt32To64; 1331*06c3fb27SDimitry Andric def SETNBCR : XForm_XT5_BI5<31, 480, (outs gprc:$RST), (ins crbitrc:$BI), 1332*06c3fb27SDimitry Andric "setnbcr $RST, $BI", IIC_IntCompare, []>, 1333bdd1243dSDimitry Andric SExt32To64; 133481ad6265SDimitry Andric 133581ad6265SDimitry Andric let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 1336*06c3fb27SDimitry Andric def SETBC8 : XForm_XT5_BI5<31, 384, (outs g8rc:$RST), (ins crbitrc:$BI), 1337*06c3fb27SDimitry Andric "setbc $RST, $BI", IIC_IntCompare, []>, 1338bdd1243dSDimitry Andric SExt32To64, ZExt32To64; 1339*06c3fb27SDimitry Andric def SETBCR8 : XForm_XT5_BI5<31, 416, (outs g8rc:$RST), (ins crbitrc:$BI), 1340*06c3fb27SDimitry Andric "setbcr $RST, $BI", IIC_IntCompare, []>, 1341bdd1243dSDimitry Andric SExt32To64, ZExt32To64; 1342*06c3fb27SDimitry Andric def SETNBC8 : XForm_XT5_BI5<31, 448, (outs g8rc:$RST), (ins crbitrc:$BI), 1343*06c3fb27SDimitry Andric "setnbc $RST, $BI", IIC_IntCompare, []>, 1344bdd1243dSDimitry Andric SExt32To64; 1345*06c3fb27SDimitry Andric def SETNBCR8 : XForm_XT5_BI5<31, 480, (outs g8rc:$RST), (ins crbitrc:$BI), 1346*06c3fb27SDimitry Andric "setnbcr $RST, $BI", IIC_IntCompare, []>, 1347bdd1243dSDimitry Andric SExt32To64; 134881ad6265SDimitry Andric } 134981ad6265SDimitry Andric 135081ad6265SDimitry Andric def VSLDBI : VNForm_VTAB5_SD3<22, 0, (outs vrrc:$VRT), 1351*06c3fb27SDimitry Andric (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SD), 1352*06c3fb27SDimitry Andric "vsldbi $VRT, $VRA, $VRB, $SD", 135381ad6265SDimitry Andric IIC_VecGeneral, 135481ad6265SDimitry Andric [(set v16i8:$VRT, 135581ad6265SDimitry Andric (int_ppc_altivec_vsldbi v16i8:$VRA, 135681ad6265SDimitry Andric v16i8:$VRB, 1357*06c3fb27SDimitry Andric timm:$SD))]>; 135881ad6265SDimitry Andric def VSRDBI : VNForm_VTAB5_SD3<22, 1, (outs vrrc:$VRT), 1359*06c3fb27SDimitry Andric (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SD), 1360*06c3fb27SDimitry Andric "vsrdbi $VRT, $VRA, $VRB, $SD", 136181ad6265SDimitry Andric IIC_VecGeneral, 136281ad6265SDimitry Andric [(set v16i8:$VRT, 136381ad6265SDimitry Andric (int_ppc_altivec_vsrdbi v16i8:$VRA, 136481ad6265SDimitry Andric v16i8:$VRB, 1365*06c3fb27SDimitry Andric timm:$SD))]>; 1366*06c3fb27SDimitry Andric defm VSTRIBR : VXForm_VTB5_RCr<13, 1, (outs vrrc:$VT), (ins vrrc:$VB), 1367*06c3fb27SDimitry Andric "vstribr", "$VT, $VB", IIC_VecGeneral, 1368*06c3fb27SDimitry Andric [(set v16i8:$VT, 1369*06c3fb27SDimitry Andric (int_ppc_altivec_vstribr v16i8:$VB))]>; 1370*06c3fb27SDimitry Andric defm VSTRIBL : VXForm_VTB5_RCr<13, 0, (outs vrrc:$VT), (ins vrrc:$VB), 1371*06c3fb27SDimitry Andric "vstribl", "$VT, $VB", IIC_VecGeneral, 1372*06c3fb27SDimitry Andric [(set v16i8:$VT, 1373*06c3fb27SDimitry Andric (int_ppc_altivec_vstribl v16i8:$VB))]>; 1374*06c3fb27SDimitry Andric defm VSTRIHR : VXForm_VTB5_RCr<13, 3, (outs vrrc:$VT), (ins vrrc:$VB), 1375*06c3fb27SDimitry Andric "vstrihr", "$VT, $VB", IIC_VecGeneral, 1376*06c3fb27SDimitry Andric [(set v8i16:$VT, 1377*06c3fb27SDimitry Andric (int_ppc_altivec_vstrihr v8i16:$VB))]>; 1378*06c3fb27SDimitry Andric defm VSTRIHL : VXForm_VTB5_RCr<13, 2, (outs vrrc:$VT), (ins vrrc:$VB), 1379*06c3fb27SDimitry Andric "vstrihl", "$VT, $VB", IIC_VecGeneral, 1380*06c3fb27SDimitry Andric [(set v8i16:$VT, 1381*06c3fb27SDimitry Andric (int_ppc_altivec_vstrihl v8i16:$VB))]>; 138281ad6265SDimitry Andric def VINSW : 1383*06c3fb27SDimitry Andric VXForm_1<207, (outs vrrc:$VD), (ins vrrc:$VDi, u4imm:$VA, gprc:$VB), 1384*06c3fb27SDimitry Andric "vinsw $VD, $VB, $VA", IIC_VecGeneral, 1385*06c3fb27SDimitry Andric [(set v4i32:$VD, 1386*06c3fb27SDimitry Andric (int_ppc_altivec_vinsw v4i32:$VDi, i32:$VB, timm:$VA))]>, 1387*06c3fb27SDimitry Andric RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 138881ad6265SDimitry Andric def VINSD : 1389*06c3fb27SDimitry Andric VXForm_1<463, (outs vrrc:$VD), (ins vrrc:$VDi, u4imm:$VA, g8rc:$VB), 1390*06c3fb27SDimitry Andric "vinsd $VD, $VB, $VA", IIC_VecGeneral, 1391*06c3fb27SDimitry Andric [(set v2i64:$VD, 1392*06c3fb27SDimitry Andric (int_ppc_altivec_vinsd v2i64:$VDi, i64:$VB, timm:$VA))]>, 1393*06c3fb27SDimitry Andric RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 139481ad6265SDimitry Andric def VINSBVLX : 139581ad6265SDimitry Andric VXForm_VTB5_RA5_ins<15, "vinsbvlx", 1396*06c3fb27SDimitry Andric [(set v16i8:$VD, 1397*06c3fb27SDimitry Andric (int_ppc_altivec_vinsbvlx v16i8:$VDi, i32:$VA, 1398*06c3fb27SDimitry Andric v16i8:$VB))]>; 139981ad6265SDimitry Andric def VINSBVRX : 140081ad6265SDimitry Andric VXForm_VTB5_RA5_ins<271, "vinsbvrx", 1401*06c3fb27SDimitry Andric [(set v16i8:$VD, 1402*06c3fb27SDimitry Andric (int_ppc_altivec_vinsbvrx v16i8:$VDi, i32:$VA, 1403*06c3fb27SDimitry Andric v16i8:$VB))]>; 140481ad6265SDimitry Andric def VINSHVLX : 140581ad6265SDimitry Andric VXForm_VTB5_RA5_ins<79, "vinshvlx", 1406*06c3fb27SDimitry Andric [(set v8i16:$VD, 1407*06c3fb27SDimitry Andric (int_ppc_altivec_vinshvlx v8i16:$VDi, i32:$VA, 1408*06c3fb27SDimitry Andric v8i16:$VB))]>; 140981ad6265SDimitry Andric def VINSHVRX : 141081ad6265SDimitry Andric VXForm_VTB5_RA5_ins<335, "vinshvrx", 1411*06c3fb27SDimitry Andric [(set v8i16:$VD, 1412*06c3fb27SDimitry Andric (int_ppc_altivec_vinshvrx v8i16:$VDi, i32:$VA, 1413*06c3fb27SDimitry Andric v8i16:$VB))]>; 141481ad6265SDimitry Andric def VINSWVLX : 141581ad6265SDimitry Andric VXForm_VTB5_RA5_ins<143, "vinswvlx", 1416*06c3fb27SDimitry Andric [(set v4i32:$VD, 1417*06c3fb27SDimitry Andric (int_ppc_altivec_vinswvlx v4i32:$VDi, i32:$VA, 1418*06c3fb27SDimitry Andric v4i32:$VB))]>; 141981ad6265SDimitry Andric def VINSWVRX : 142081ad6265SDimitry Andric VXForm_VTB5_RA5_ins<399, "vinswvrx", 1421*06c3fb27SDimitry Andric [(set v4i32:$VD, 1422*06c3fb27SDimitry Andric (int_ppc_altivec_vinswvrx v4i32:$VDi, i32:$VA, 1423*06c3fb27SDimitry Andric v4i32:$VB))]>; 142481ad6265SDimitry Andric def VINSBLX : 142581ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<527, "vinsblx", 1426*06c3fb27SDimitry Andric [(set v16i8:$VD, 1427*06c3fb27SDimitry Andric (int_ppc_altivec_vinsblx v16i8:$VDi, i32:$VA, 1428*06c3fb27SDimitry Andric i32:$VB))]>; 142981ad6265SDimitry Andric def VINSBRX : 143081ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<783, "vinsbrx", 1431*06c3fb27SDimitry Andric [(set v16i8:$VD, 1432*06c3fb27SDimitry Andric (int_ppc_altivec_vinsbrx v16i8:$VDi, i32:$VA, 1433*06c3fb27SDimitry Andric i32:$VB))]>; 143481ad6265SDimitry Andric def VINSHLX : 143581ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<591, "vinshlx", 1436*06c3fb27SDimitry Andric [(set v8i16:$VD, 1437*06c3fb27SDimitry Andric (int_ppc_altivec_vinshlx v8i16:$VDi, i32:$VA, 1438*06c3fb27SDimitry Andric i32:$VB))]>; 143981ad6265SDimitry Andric def VINSHRX : 144081ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<847, "vinshrx", 1441*06c3fb27SDimitry Andric [(set v8i16:$VD, 1442*06c3fb27SDimitry Andric (int_ppc_altivec_vinshrx v8i16:$VDi, i32:$VA, 1443*06c3fb27SDimitry Andric i32:$VB))]>; 144481ad6265SDimitry Andric def VINSWLX : 144581ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<655, "vinswlx", 1446*06c3fb27SDimitry Andric [(set v4i32:$VD, 1447*06c3fb27SDimitry Andric (int_ppc_altivec_vinswlx v4i32:$VDi, i32:$VA, 1448*06c3fb27SDimitry Andric i32:$VB))]>; 144981ad6265SDimitry Andric def VINSWRX : 145081ad6265SDimitry Andric VXForm_VRT5_RAB5_ins<911, "vinswrx", 1451*06c3fb27SDimitry Andric [(set v4i32:$VD, 1452*06c3fb27SDimitry Andric (int_ppc_altivec_vinswrx v4i32:$VDi, i32:$VA, 1453*06c3fb27SDimitry Andric i32:$VB))]>; 145481ad6265SDimitry Andric def VINSDLX : 1455*06c3fb27SDimitry Andric VXForm_1<719, (outs vrrc:$VD), (ins vrrc:$VDi, g8rc:$VA, g8rc:$VB), 1456*06c3fb27SDimitry Andric "vinsdlx $VD, $VA, $VB", IIC_VecGeneral, 1457*06c3fb27SDimitry Andric [(set v2i64:$VD, 1458*06c3fb27SDimitry Andric (int_ppc_altivec_vinsdlx v2i64:$VDi, i64:$VA, i64:$VB))]>, 1459*06c3fb27SDimitry Andric RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 146081ad6265SDimitry Andric def VINSDRX : 1461*06c3fb27SDimitry Andric VXForm_1<975, (outs vrrc:$VD), (ins vrrc:$VDi, g8rc:$VA, g8rc:$VB), 1462*06c3fb27SDimitry Andric "vinsdrx $VD, $VA, $VB", IIC_VecGeneral, 1463*06c3fb27SDimitry Andric [(set v2i64:$VD, 1464*06c3fb27SDimitry Andric (int_ppc_altivec_vinsdrx v2i64:$VDi, i64:$VA, i64:$VB))]>, 1465*06c3fb27SDimitry Andric RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 1466*06c3fb27SDimitry Andric def VEXTRACTBM : VXForm_RD5_XO5_RS5<1602, 8, (outs gprc:$VD), (ins vrrc:$VB), 1467*06c3fb27SDimitry Andric "vextractbm $VD, $VB", IIC_VecGeneral, 1468*06c3fb27SDimitry Andric [(set i32:$VD, 1469*06c3fb27SDimitry Andric (int_ppc_altivec_vextractbm v16i8:$VB))]>, 1470bdd1243dSDimitry Andric ZExt32To64; 1471*06c3fb27SDimitry Andric def VEXTRACTHM : VXForm_RD5_XO5_RS5<1602, 9, (outs gprc:$VD), (ins vrrc:$VB), 1472*06c3fb27SDimitry Andric "vextracthm $VD, $VB", IIC_VecGeneral, 1473*06c3fb27SDimitry Andric [(set i32:$VD, 1474*06c3fb27SDimitry Andric (int_ppc_altivec_vextracthm v8i16:$VB))]>, 1475bdd1243dSDimitry Andric ZExt32To64; 1476*06c3fb27SDimitry Andric def VEXTRACTWM : VXForm_RD5_XO5_RS5<1602, 10, (outs gprc:$VD), (ins vrrc:$VB), 1477*06c3fb27SDimitry Andric "vextractwm $VD, $VB", IIC_VecGeneral, 1478*06c3fb27SDimitry Andric [(set i32:$VD, 1479*06c3fb27SDimitry Andric (int_ppc_altivec_vextractwm v4i32:$VB))]>, 1480bdd1243dSDimitry Andric ZExt32To64; 1481*06c3fb27SDimitry Andric def VEXTRACTDM : VXForm_RD5_XO5_RS5<1602, 11, (outs gprc:$VD), (ins vrrc:$VB), 1482*06c3fb27SDimitry Andric "vextractdm $VD, $VB", IIC_VecGeneral, 1483*06c3fb27SDimitry Andric [(set i32:$VD, 1484*06c3fb27SDimitry Andric (int_ppc_altivec_vextractdm v2i64:$VB))]>, 1485bdd1243dSDimitry Andric ZExt32To64; 1486*06c3fb27SDimitry Andric def VEXTRACTQM : VXForm_RD5_XO5_RS5<1602, 12, (outs gprc:$VD), (ins vrrc:$VB), 1487*06c3fb27SDimitry Andric "vextractqm $VD, $VB", IIC_VecGeneral, 1488*06c3fb27SDimitry Andric [(set i32:$VD, 1489*06c3fb27SDimitry Andric (int_ppc_altivec_vextractqm v1i128:$VB))]>; 1490*06c3fb27SDimitry Andric def VEXPANDBM : VXForm_RD5_XO5_RS5<1602, 0, (outs vrrc:$VD), (ins vrrc:$VB), 1491*06c3fb27SDimitry Andric "vexpandbm $VD, $VB", IIC_VecGeneral, 1492*06c3fb27SDimitry Andric [(set v16i8:$VD, (int_ppc_altivec_vexpandbm 1493*06c3fb27SDimitry Andric v16i8:$VB))]>; 1494*06c3fb27SDimitry Andric def VEXPANDHM : VXForm_RD5_XO5_RS5<1602, 1, (outs vrrc:$VD), (ins vrrc:$VB), 1495*06c3fb27SDimitry Andric "vexpandhm $VD, $VB", IIC_VecGeneral, 1496*06c3fb27SDimitry Andric [(set v8i16:$VD, (int_ppc_altivec_vexpandhm 1497*06c3fb27SDimitry Andric v8i16:$VB))]>; 1498*06c3fb27SDimitry Andric def VEXPANDWM : VXForm_RD5_XO5_RS5<1602, 2, (outs vrrc:$VD), (ins vrrc:$VB), 1499*06c3fb27SDimitry Andric "vexpandwm $VD, $VB", IIC_VecGeneral, 1500*06c3fb27SDimitry Andric [(set v4i32:$VD, (int_ppc_altivec_vexpandwm 1501*06c3fb27SDimitry Andric v4i32:$VB))]>; 1502*06c3fb27SDimitry Andric def VEXPANDDM : VXForm_RD5_XO5_RS5<1602, 3, (outs vrrc:$VD), (ins vrrc:$VB), 1503*06c3fb27SDimitry Andric "vexpanddm $VD, $VB", IIC_VecGeneral, 1504*06c3fb27SDimitry Andric [(set v2i64:$VD, (int_ppc_altivec_vexpanddm 1505*06c3fb27SDimitry Andric v2i64:$VB))]>; 1506*06c3fb27SDimitry Andric def VEXPANDQM : VXForm_RD5_XO5_RS5<1602, 4, (outs vrrc:$VD), (ins vrrc:$VB), 1507*06c3fb27SDimitry Andric "vexpandqm $VD, $VB", IIC_VecGeneral, 1508*06c3fb27SDimitry Andric [(set v1i128:$VD, (int_ppc_altivec_vexpandqm 1509*06c3fb27SDimitry Andric v1i128:$VB))]>; 1510*06c3fb27SDimitry Andric def MTVSRBM : VXForm_RD5_XO5_RS5<1602, 16, (outs vrrc:$VD), (ins g8rc:$VB), 1511*06c3fb27SDimitry Andric "mtvsrbm $VD, $VB", IIC_VecGeneral, 1512*06c3fb27SDimitry Andric [(set v16i8:$VD, 1513*06c3fb27SDimitry Andric (int_ppc_altivec_mtvsrbm i64:$VB))]>; 1514*06c3fb27SDimitry Andric def MTVSRHM : VXForm_RD5_XO5_RS5<1602, 17, (outs vrrc:$VD), (ins g8rc:$VB), 1515*06c3fb27SDimitry Andric "mtvsrhm $VD, $VB", IIC_VecGeneral, 1516*06c3fb27SDimitry Andric [(set v8i16:$VD, 1517*06c3fb27SDimitry Andric (int_ppc_altivec_mtvsrhm i64:$VB))]>; 1518*06c3fb27SDimitry Andric def MTVSRWM : VXForm_RD5_XO5_RS5<1602, 18, (outs vrrc:$VD), (ins g8rc:$VB), 1519*06c3fb27SDimitry Andric "mtvsrwm $VD, $VB", IIC_VecGeneral, 1520*06c3fb27SDimitry Andric [(set v4i32:$VD, 1521*06c3fb27SDimitry Andric (int_ppc_altivec_mtvsrwm i64:$VB))]>; 1522*06c3fb27SDimitry Andric def MTVSRDM : VXForm_RD5_XO5_RS5<1602, 19, (outs vrrc:$VD), (ins g8rc:$VB), 1523*06c3fb27SDimitry Andric "mtvsrdm $VD, $VB", IIC_VecGeneral, 1524*06c3fb27SDimitry Andric [(set v2i64:$VD, 1525*06c3fb27SDimitry Andric (int_ppc_altivec_mtvsrdm i64:$VB))]>; 1526*06c3fb27SDimitry Andric def MTVSRQM : VXForm_RD5_XO5_RS5<1602, 20, (outs vrrc:$VD), (ins g8rc:$VB), 1527*06c3fb27SDimitry Andric "mtvsrqm $VD, $VB", IIC_VecGeneral, 1528*06c3fb27SDimitry Andric [(set v1i128:$VD, 1529*06c3fb27SDimitry Andric (int_ppc_altivec_mtvsrqm i64:$VB))]>; 1530*06c3fb27SDimitry Andric def MTVSRBMI : DXForm<4, 10, (outs vrrc:$RT), (ins u16imm64:$D), 1531*06c3fb27SDimitry Andric "mtvsrbmi $RT, $D", IIC_VecGeneral, 1532*06c3fb27SDimitry Andric [(set v16i8:$RT, 153381ad6265SDimitry Andric (int_ppc_altivec_mtvsrbm imm:$D))]>; 1534*06c3fb27SDimitry Andric def VCNTMBB : VXForm_RD5_MP_VB5<1602, 12, (outs g8rc:$RD), 1535*06c3fb27SDimitry Andric (ins vrrc:$VB, u1imm:$MP), 1536*06c3fb27SDimitry Andric "vcntmbb $RD, $VB, $MP", IIC_VecGeneral, 1537*06c3fb27SDimitry Andric [(set i64:$RD, (int_ppc_altivec_vcntmbb 1538*06c3fb27SDimitry Andric v16i8:$VB, timm:$MP))]>; 1539*06c3fb27SDimitry Andric def VCNTMBH : VXForm_RD5_MP_VB5<1602, 13, (outs g8rc:$RD), 1540*06c3fb27SDimitry Andric (ins vrrc:$VB, u1imm:$MP), 1541*06c3fb27SDimitry Andric "vcntmbh $RD, $VB, $MP", IIC_VecGeneral, 1542*06c3fb27SDimitry Andric [(set i64:$RD, (int_ppc_altivec_vcntmbh 1543*06c3fb27SDimitry Andric v8i16:$VB, timm:$MP))]>; 1544*06c3fb27SDimitry Andric def VCNTMBW : VXForm_RD5_MP_VB5<1602, 14, (outs g8rc:$RD), 1545*06c3fb27SDimitry Andric (ins vrrc:$VB, u1imm:$MP), 1546*06c3fb27SDimitry Andric "vcntmbw $RD, $VB, $MP", IIC_VecGeneral, 1547*06c3fb27SDimitry Andric [(set i64:$RD, (int_ppc_altivec_vcntmbw 1548*06c3fb27SDimitry Andric v4i32:$VB, timm:$MP))]>; 1549*06c3fb27SDimitry Andric def VCNTMBD : VXForm_RD5_MP_VB5<1602, 15, (outs g8rc:$RD), 1550*06c3fb27SDimitry Andric (ins vrrc:$VB, u1imm:$MP), 1551*06c3fb27SDimitry Andric "vcntmbd $RD, $VB, $MP", IIC_VecGeneral, 1552*06c3fb27SDimitry Andric [(set i64:$RD, (int_ppc_altivec_vcntmbd 1553*06c3fb27SDimitry Andric v2i64:$VB, timm:$MP))]>; 1554*06c3fb27SDimitry Andric def VEXTDUBVLX : VAForm_1a<24, (outs vrrc:$RT), 1555*06c3fb27SDimitry Andric (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 1556*06c3fb27SDimitry Andric "vextdubvlx $RT, $RA, $RB, $RC", 155781ad6265SDimitry Andric IIC_VecGeneral, 1558*06c3fb27SDimitry Andric [(set v2i64:$RT, 1559*06c3fb27SDimitry Andric (int_ppc_altivec_vextdubvlx v16i8:$RA, 1560*06c3fb27SDimitry Andric v16i8:$RB, 1561*06c3fb27SDimitry Andric i32:$RC))]>; 1562*06c3fb27SDimitry Andric def VEXTDUBVRX : VAForm_1a<25, (outs vrrc:$RT), 1563*06c3fb27SDimitry Andric (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 1564*06c3fb27SDimitry Andric "vextdubvrx $RT, $RA, $RB, $RC", 156581ad6265SDimitry Andric IIC_VecGeneral, 1566*06c3fb27SDimitry Andric [(set v2i64:$RT, 1567*06c3fb27SDimitry Andric (int_ppc_altivec_vextdubvrx v16i8:$RA, 1568*06c3fb27SDimitry Andric v16i8:$RB, 1569*06c3fb27SDimitry Andric i32:$RC))]>; 1570*06c3fb27SDimitry Andric def VEXTDUHVLX : VAForm_1a<26, (outs vrrc:$RT), 1571*06c3fb27SDimitry Andric (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 1572*06c3fb27SDimitry Andric "vextduhvlx $RT, $RA, $RB, $RC", 157381ad6265SDimitry Andric IIC_VecGeneral, 1574*06c3fb27SDimitry Andric [(set v2i64:$RT, 1575*06c3fb27SDimitry Andric (int_ppc_altivec_vextduhvlx v8i16:$RA, 1576*06c3fb27SDimitry Andric v8i16:$RB, 1577*06c3fb27SDimitry Andric i32:$RC))]>; 1578*06c3fb27SDimitry Andric def VEXTDUHVRX : VAForm_1a<27, (outs vrrc:$RT), 1579*06c3fb27SDimitry Andric (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 1580*06c3fb27SDimitry Andric "vextduhvrx $RT, $RA, $RB, $RC", 158181ad6265SDimitry Andric IIC_VecGeneral, 1582*06c3fb27SDimitry Andric [(set v2i64:$RT, 1583*06c3fb27SDimitry Andric (int_ppc_altivec_vextduhvrx v8i16:$RA, 1584*06c3fb27SDimitry Andric v8i16:$RB, 1585*06c3fb27SDimitry Andric i32:$RC))]>; 1586*06c3fb27SDimitry Andric def VEXTDUWVLX : VAForm_1a<28, (outs vrrc:$RT), 1587*06c3fb27SDimitry Andric (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 1588*06c3fb27SDimitry Andric "vextduwvlx $RT, $RA, $RB, $RC", 158981ad6265SDimitry Andric IIC_VecGeneral, 1590*06c3fb27SDimitry Andric [(set v2i64:$RT, 1591*06c3fb27SDimitry Andric (int_ppc_altivec_vextduwvlx v4i32:$RA, 1592*06c3fb27SDimitry Andric v4i32:$RB, 1593*06c3fb27SDimitry Andric i32:$RC))]>; 1594*06c3fb27SDimitry Andric def VEXTDUWVRX : VAForm_1a<29, (outs vrrc:$RT), 1595*06c3fb27SDimitry Andric (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 1596*06c3fb27SDimitry Andric "vextduwvrx $RT, $RA, $RB, $RC", 159781ad6265SDimitry Andric IIC_VecGeneral, 1598*06c3fb27SDimitry Andric [(set v2i64:$RT, 1599*06c3fb27SDimitry Andric (int_ppc_altivec_vextduwvrx v4i32:$RA, 1600*06c3fb27SDimitry Andric v4i32:$RB, 1601*06c3fb27SDimitry Andric i32:$RC))]>; 1602*06c3fb27SDimitry Andric def VEXTDDVLX : VAForm_1a<30, (outs vrrc:$RT), 1603*06c3fb27SDimitry Andric (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 1604*06c3fb27SDimitry Andric "vextddvlx $RT, $RA, $RB, $RC", 160581ad6265SDimitry Andric IIC_VecGeneral, 1606*06c3fb27SDimitry Andric [(set v2i64:$RT, 1607*06c3fb27SDimitry Andric (int_ppc_altivec_vextddvlx v2i64:$RA, 1608*06c3fb27SDimitry Andric v2i64:$RB, 1609*06c3fb27SDimitry Andric i32:$RC))]>; 1610*06c3fb27SDimitry Andric def VEXTDDVRX : VAForm_1a<31, (outs vrrc:$RT), 1611*06c3fb27SDimitry Andric (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 1612*06c3fb27SDimitry Andric "vextddvrx $RT, $RA, $RB, $RC", 161381ad6265SDimitry Andric IIC_VecGeneral, 1614*06c3fb27SDimitry Andric [(set v2i64:$RT, 1615*06c3fb27SDimitry Andric (int_ppc_altivec_vextddvrx v2i64:$RA, 1616*06c3fb27SDimitry Andric v2i64:$RB, 1617*06c3fb27SDimitry Andric i32:$RC))]>; 1618*06c3fb27SDimitry Andric def VPDEPD : VXForm_1<1485, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1619*06c3fb27SDimitry Andric "vpdepd $VD, $VA, $VB", IIC_VecGeneral, 1620*06c3fb27SDimitry Andric [(set v2i64:$VD, 1621*06c3fb27SDimitry Andric (int_ppc_altivec_vpdepd v2i64:$VA, v2i64:$VB))]>; 1622*06c3fb27SDimitry Andric def VPEXTD : VXForm_1<1421, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1623*06c3fb27SDimitry Andric "vpextd $VD, $VA, $VB", IIC_VecGeneral, 1624*06c3fb27SDimitry Andric [(set v2i64:$VD, 1625*06c3fb27SDimitry Andric (int_ppc_altivec_vpextd v2i64:$VA, v2i64:$VB))]>; 1626*06c3fb27SDimitry Andric def PDEPD : XForm_6<31, 156, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 1627*06c3fb27SDimitry Andric "pdepd $RA, $RST, $RB", IIC_IntGeneral, 1628*06c3fb27SDimitry Andric [(set i64:$RA, (int_ppc_pdepd i64:$RST, i64:$RB))]>; 1629*06c3fb27SDimitry Andric def PEXTD : XForm_6<31, 188, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 1630*06c3fb27SDimitry Andric "pextd $RA, $RST, $RB", IIC_IntGeneral, 1631*06c3fb27SDimitry Andric [(set i64:$RA, (int_ppc_pextd i64:$RST, i64:$RB))]>; 1632*06c3fb27SDimitry Andric def VCFUGED : VXForm_1<1357, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1633*06c3fb27SDimitry Andric "vcfuged $VD, $VA, $VB", IIC_VecGeneral, 1634*06c3fb27SDimitry Andric [(set v2i64:$VD, 1635*06c3fb27SDimitry Andric (int_ppc_altivec_vcfuged v2i64:$VA, v2i64:$VB))]>; 1636*06c3fb27SDimitry Andric def VGNB : VXForm_RD5_N3_VB5<1228, (outs g8rc:$RD), (ins vrrc:$VB, u3imm:$N), 1637*06c3fb27SDimitry Andric "vgnb $RD, $VB, $N", IIC_VecGeneral, 1638*06c3fb27SDimitry Andric [(set i64:$RD, 1639*06c3fb27SDimitry Andric (int_ppc_altivec_vgnb v1i128:$VB, timm:$N))]>; 1640*06c3fb27SDimitry Andric def CFUGED : XForm_6<31, 220, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 1641*06c3fb27SDimitry Andric "cfuged $RA, $RST, $RB", IIC_IntGeneral, 1642*06c3fb27SDimitry Andric [(set i64:$RA, (int_ppc_cfuged i64:$RST, i64:$RB))]>; 164381ad6265SDimitry Andric def XXEVAL : 164481ad6265SDimitry Andric 8RR_XX4Form_IMM8_XTAB6<34, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 164581ad6265SDimitry Andric vsrc:$XC, u8imm:$IMM), 164681ad6265SDimitry Andric "xxeval $XT, $XA, $XB, $XC, $IMM", IIC_VecGeneral, 164781ad6265SDimitry Andric [(set v2i64:$XT, (int_ppc_vsx_xxeval v2i64:$XA, 164881ad6265SDimitry Andric v2i64:$XB, v2i64:$XC, timm:$IMM))]>; 1649*06c3fb27SDimitry Andric def VCLZDM : VXForm_1<1924, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1650*06c3fb27SDimitry Andric "vclzdm $VD, $VA, $VB", IIC_VecGeneral, 1651*06c3fb27SDimitry Andric [(set v2i64:$VD, 1652*06c3fb27SDimitry Andric (int_ppc_altivec_vclzdm v2i64:$VA, v2i64:$VB))]>; 1653*06c3fb27SDimitry Andric def VCTZDM : VXForm_1<1988, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1654*06c3fb27SDimitry Andric "vctzdm $VD, $VA, $VB", IIC_VecGeneral, 1655*06c3fb27SDimitry Andric [(set v2i64:$VD, 1656*06c3fb27SDimitry Andric (int_ppc_altivec_vctzdm v2i64:$VA, v2i64:$VB))]>; 1657*06c3fb27SDimitry Andric def CNTLZDM : XForm_6<31, 59, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 1658*06c3fb27SDimitry Andric "cntlzdm $RA, $RST, $RB", IIC_IntGeneral, 1659*06c3fb27SDimitry Andric [(set i64:$RA, 1660*06c3fb27SDimitry Andric (int_ppc_cntlzdm i64:$RST, i64:$RB))]>; 1661*06c3fb27SDimitry Andric def CNTTZDM : XForm_6<31, 571, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 1662*06c3fb27SDimitry Andric "cnttzdm $RA, $RST, $RB", IIC_IntGeneral, 1663*06c3fb27SDimitry Andric [(set i64:$RA, 1664*06c3fb27SDimitry Andric (int_ppc_cnttzdm i64:$RST, i64:$RB))]>; 166581ad6265SDimitry Andric def XXGENPCVBM : 166681ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 916, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 166781ad6265SDimitry Andric "xxgenpcvbm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 166881ad6265SDimitry Andric def XXGENPCVHM : 166981ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 917, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 167081ad6265SDimitry Andric "xxgenpcvhm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 167181ad6265SDimitry Andric def XXGENPCVWM : 167281ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 948, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 167381ad6265SDimitry Andric "xxgenpcvwm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 167481ad6265SDimitry Andric def XXGENPCVDM : 167581ad6265SDimitry Andric XForm_XT6_IMM5_VB5<60, 949, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 167681ad6265SDimitry Andric "xxgenpcvdm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 1677*06c3fb27SDimitry Andric def VCLRLB : VXForm_1<397, (outs vrrc:$VD), (ins vrrc:$VA, gprc:$VB), 1678*06c3fb27SDimitry Andric "vclrlb $VD, $VA, $VB", IIC_VecGeneral, 1679*06c3fb27SDimitry Andric [(set v16i8:$VD, 1680*06c3fb27SDimitry Andric (int_ppc_altivec_vclrlb v16i8:$VA, i32:$VB))]>; 1681*06c3fb27SDimitry Andric def VCLRRB : VXForm_1<461, (outs vrrc:$VD), (ins vrrc:$VA, gprc:$VB), 1682*06c3fb27SDimitry Andric "vclrrb $VD, $VA, $VB", IIC_VecGeneral, 1683*06c3fb27SDimitry Andric [(set v16i8:$VD, 1684*06c3fb27SDimitry Andric (int_ppc_altivec_vclrrb v16i8:$VA, i32:$VB))]>; 1685*06c3fb27SDimitry Andric def VMULLD : VXForm_1<457, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1686*06c3fb27SDimitry Andric "vmulld $VD, $VA, $VB", IIC_VecGeneral, 1687*06c3fb27SDimitry Andric [(set v2i64:$VD, (mul v2i64:$VA, v2i64:$VB))]>; 1688*06c3fb27SDimitry Andric def VMULHSW : VXForm_1<905, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1689*06c3fb27SDimitry Andric "vmulhsw $VD, $VA, $VB", IIC_VecGeneral, 1690*06c3fb27SDimitry Andric [(set v4i32:$VD, (mulhs v4i32:$VA, v4i32:$VB))]>; 1691*06c3fb27SDimitry Andric def VMULHUW : VXForm_1<649, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1692*06c3fb27SDimitry Andric "vmulhuw $VD, $VA, $VB", IIC_VecGeneral, 1693*06c3fb27SDimitry Andric [(set v4i32:$VD, (mulhu v4i32:$VA, v4i32:$VB))]>; 1694*06c3fb27SDimitry Andric def VMULHSD : VXForm_1<969, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1695*06c3fb27SDimitry Andric "vmulhsd $VD, $VA, $VB", IIC_VecGeneral, 1696*06c3fb27SDimitry Andric [(set v2i64:$VD, (mulhs v2i64:$VA, v2i64:$VB))]>; 1697*06c3fb27SDimitry Andric def VMULHUD : VXForm_1<713, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1698*06c3fb27SDimitry Andric "vmulhud $VD, $VA, $VB", IIC_VecGeneral, 1699*06c3fb27SDimitry Andric [(set v2i64:$VD, (mulhu v2i64:$VA, v2i64:$VB))]>; 1700*06c3fb27SDimitry Andric def VMODSW : VXForm_1<1931, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1701*06c3fb27SDimitry Andric "vmodsw $VD, $VA, $VB", IIC_VecGeneral, 1702*06c3fb27SDimitry Andric [(set v4i32:$VD, (srem v4i32:$VA, v4i32:$VB))]>; 1703*06c3fb27SDimitry Andric def VMODUW : VXForm_1<1675, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1704*06c3fb27SDimitry Andric "vmoduw $VD, $VA, $VB", IIC_VecGeneral, 1705*06c3fb27SDimitry Andric [(set v4i32:$VD, (urem v4i32:$VA, v4i32:$VB))]>; 1706*06c3fb27SDimitry Andric def VMODSD : VXForm_1<1995, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1707*06c3fb27SDimitry Andric "vmodsd $VD, $VA, $VB", IIC_VecGeneral, 1708*06c3fb27SDimitry Andric [(set v2i64:$VD, (srem v2i64:$VA, v2i64:$VB))]>; 1709*06c3fb27SDimitry Andric def VMODUD : VXForm_1<1739, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1710*06c3fb27SDimitry Andric "vmodud $VD, $VA, $VB", IIC_VecGeneral, 1711*06c3fb27SDimitry Andric [(set v2i64:$VD, (urem v2i64:$VA, v2i64:$VB))]>; 1712*06c3fb27SDimitry Andric def VDIVSW : VXForm_1<395, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1713*06c3fb27SDimitry Andric "vdivsw $VD, $VA, $VB", IIC_VecGeneral, 1714*06c3fb27SDimitry Andric [(set v4i32:$VD, (sdiv v4i32:$VA, v4i32:$VB))]>; 1715*06c3fb27SDimitry Andric def VDIVUW : VXForm_1<139, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1716*06c3fb27SDimitry Andric "vdivuw $VD, $VA, $VB", IIC_VecGeneral, 1717*06c3fb27SDimitry Andric [(set v4i32:$VD, (udiv v4i32:$VA, v4i32:$VB))]>; 1718*06c3fb27SDimitry Andric def VDIVSD : VXForm_1<459, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1719*06c3fb27SDimitry Andric "vdivsd $VD, $VA, $VB", IIC_VecGeneral, 1720*06c3fb27SDimitry Andric [(set v2i64:$VD, (sdiv v2i64:$VA, v2i64:$VB))]>; 1721*06c3fb27SDimitry Andric def VDIVUD : VXForm_1<203, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1722*06c3fb27SDimitry Andric "vdivud $VD, $VA, $VB", IIC_VecGeneral, 1723*06c3fb27SDimitry Andric [(set v2i64:$VD, (udiv v2i64:$VA, v2i64:$VB))]>; 1724*06c3fb27SDimitry Andric def VDIVESW : VXForm_1<907, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1725*06c3fb27SDimitry Andric "vdivesw $VD, $VA, $VB", IIC_VecGeneral, 1726*06c3fb27SDimitry Andric [(set v4i32:$VD, (int_ppc_altivec_vdivesw v4i32:$VA, 1727*06c3fb27SDimitry Andric v4i32:$VB))]>; 1728*06c3fb27SDimitry Andric def VDIVEUW : VXForm_1<651, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1729*06c3fb27SDimitry Andric "vdiveuw $VD, $VA, $VB", IIC_VecGeneral, 1730*06c3fb27SDimitry Andric [(set v4i32:$VD, (int_ppc_altivec_vdiveuw v4i32:$VA, 1731*06c3fb27SDimitry Andric v4i32:$VB))]>; 1732*06c3fb27SDimitry Andric def VDIVESD : VXForm_1<971, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1733*06c3fb27SDimitry Andric "vdivesd $VD, $VA, $VB", IIC_VecGeneral, 1734*06c3fb27SDimitry Andric [(set v2i64:$VD, (int_ppc_altivec_vdivesd v2i64:$VA, 1735*06c3fb27SDimitry Andric v2i64:$VB))]>; 1736*06c3fb27SDimitry Andric def VDIVEUD : VXForm_1<715, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1737*06c3fb27SDimitry Andric "vdiveud $VD, $VA, $VB", IIC_VecGeneral, 1738*06c3fb27SDimitry Andric [(set v2i64:$VD, (int_ppc_altivec_vdiveud v2i64:$VA, 1739*06c3fb27SDimitry Andric v2i64:$VB))]>; 174081ad6265SDimitry Andric def XVTLSBB : XX2_BF3_XO5_XB6_XO9<60, 2, 475, (outs crrc:$BF), (ins vsrc:$XB), 174181ad6265SDimitry Andric "xvtlsbb $BF, $XB", IIC_VecGeneral, []>; 1742*06c3fb27SDimitry Andric def BRH : XForm_11<31, 219, (outs gprc:$RA), (ins gprc:$RST), 1743*06c3fb27SDimitry Andric "brh $RA, $RST", IIC_IntRotate, []>; 1744*06c3fb27SDimitry Andric def BRW : XForm_11<31, 155, (outs gprc:$RA), (ins gprc:$RST), 1745*06c3fb27SDimitry Andric "brw $RA, $RST", IIC_IntRotate, 1746*06c3fb27SDimitry Andric [(set i32:$RA, (bswap i32:$RST))]>; 1747bdd1243dSDimitry Andric let isCodeGenOnly = 1 in { 1748*06c3fb27SDimitry Andric def BRH8 : XForm_11<31, 219, (outs g8rc:$RA), (ins g8rc:$RST), 1749*06c3fb27SDimitry Andric "brh $RA, $RST", IIC_IntRotate, []>; 1750*06c3fb27SDimitry Andric def BRW8 : XForm_11<31, 155, (outs g8rc:$RA), (ins g8rc:$RST), 1751*06c3fb27SDimitry Andric "brw $RA, $RST", IIC_IntRotate, []>; 1752bdd1243dSDimitry Andric } 1753*06c3fb27SDimitry Andric def BRD : XForm_11<31, 187, (outs g8rc:$RA), (ins g8rc:$RST), 1754*06c3fb27SDimitry Andric "brd $RA, $RST", IIC_IntRotate, 1755*06c3fb27SDimitry Andric [(set i64:$RA, (bswap i64:$RST))]>; 175681ad6265SDimitry Andric 175781ad6265SDimitry Andric // The XFormMemOp flag for the following 8 instructions is set on 175881ad6265SDimitry Andric // the instruction format. 175981ad6265SDimitry Andric let mayLoad = 1, mayStore = 0 in { 176081ad6265SDimitry Andric def LXVRBX : X_XT6_RA5_RB5<31, 13, "lxvrbx", vsrc, []>; 176181ad6265SDimitry Andric def LXVRHX : X_XT6_RA5_RB5<31, 45, "lxvrhx", vsrc, []>; 176281ad6265SDimitry Andric def LXVRWX : X_XT6_RA5_RB5<31, 77, "lxvrwx", vsrc, []>; 176381ad6265SDimitry Andric def LXVRDX : X_XT6_RA5_RB5<31, 109, "lxvrdx", vsrc, []>; 176481ad6265SDimitry Andric } 176581ad6265SDimitry Andric 176681ad6265SDimitry Andric let mayLoad = 0, mayStore = 1 in { 176781ad6265SDimitry Andric def STXVRBX : X_XS6_RA5_RB5<31, 141, "stxvrbx", vsrc, []>; 176881ad6265SDimitry Andric def STXVRHX : X_XS6_RA5_RB5<31, 173, "stxvrhx", vsrc, []>; 176981ad6265SDimitry Andric def STXVRWX : X_XS6_RA5_RB5<31, 205, "stxvrwx", vsrc, []>; 177081ad6265SDimitry Andric def STXVRDX : X_XS6_RA5_RB5<31, 237, "stxvrdx", vsrc, []>; 177181ad6265SDimitry Andric } 177281ad6265SDimitry Andric 1773*06c3fb27SDimitry Andric def VMULESD : VXForm_1<968, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1774*06c3fb27SDimitry Andric "vmulesd $VD, $VA, $VB", IIC_VecGeneral, 1775*06c3fb27SDimitry Andric [(set v1i128:$VD, (int_ppc_altivec_vmulesd v2i64:$VA, 1776*06c3fb27SDimitry Andric v2i64:$VB))]>; 1777*06c3fb27SDimitry Andric def VMULEUD : VXForm_1<712, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1778*06c3fb27SDimitry Andric "vmuleud $VD, $VA, $VB", IIC_VecGeneral, 1779*06c3fb27SDimitry Andric [(set v1i128:$VD, (int_ppc_altivec_vmuleud v2i64:$VA, 1780*06c3fb27SDimitry Andric v2i64:$VB))]>; 1781*06c3fb27SDimitry Andric def VMULOSD : VXForm_1<456, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1782*06c3fb27SDimitry Andric "vmulosd $VD, $VA, $VB", IIC_VecGeneral, 1783*06c3fb27SDimitry Andric [(set v1i128:$VD, (int_ppc_altivec_vmulosd v2i64:$VA, 1784*06c3fb27SDimitry Andric v2i64:$VB))]>; 1785*06c3fb27SDimitry Andric def VMULOUD : VXForm_1<200, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1786*06c3fb27SDimitry Andric "vmuloud $VD, $VA, $VB", IIC_VecGeneral, 1787*06c3fb27SDimitry Andric [(set v1i128:$VD, (int_ppc_altivec_vmuloud v2i64:$VA, 1788*06c3fb27SDimitry Andric v2i64:$VB))]>; 1789*06c3fb27SDimitry Andric def VMSUMCUD : VAForm_1a<23, (outs vrrc:$RT), (ins vrrc:$RA, vrrc:$RB, vrrc:$RC), 1790*06c3fb27SDimitry Andric "vmsumcud $RT, $RA, $RB, $RC", IIC_VecGeneral, 1791*06c3fb27SDimitry Andric [(set v1i128:$RT, (int_ppc_altivec_vmsumcud 1792*06c3fb27SDimitry Andric v2i64:$RA, v2i64:$RB, v1i128:$RC))]>; 1793*06c3fb27SDimitry Andric def VDIVSQ : VXForm_1<267, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1794*06c3fb27SDimitry Andric "vdivsq $VD, $VA, $VB", IIC_VecGeneral, 1795*06c3fb27SDimitry Andric [(set v1i128:$VD, (sdiv v1i128:$VA, v1i128:$VB))]>; 1796*06c3fb27SDimitry Andric def VDIVUQ : VXForm_1<11, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1797*06c3fb27SDimitry Andric "vdivuq $VD, $VA, $VB", IIC_VecGeneral, 1798*06c3fb27SDimitry Andric [(set v1i128:$VD, (udiv v1i128:$VA, v1i128:$VB))]>; 1799*06c3fb27SDimitry Andric def VDIVESQ : VXForm_1<779, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1800*06c3fb27SDimitry Andric "vdivesq $VD, $VA, $VB", IIC_VecGeneral, 1801*06c3fb27SDimitry Andric [(set v1i128:$VD, (int_ppc_altivec_vdivesq v1i128:$VA, 1802*06c3fb27SDimitry Andric v1i128:$VB))]>; 1803*06c3fb27SDimitry Andric def VDIVEUQ : VXForm_1<523, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1804*06c3fb27SDimitry Andric "vdiveuq $VD, $VA, $VB", IIC_VecGeneral, 1805*06c3fb27SDimitry Andric [(set v1i128:$VD, (int_ppc_altivec_vdiveuq v1i128:$VA, 1806*06c3fb27SDimitry Andric v1i128:$VB))]>; 1807*06c3fb27SDimitry Andric def VCMPEQUQ : VCMP <455, "vcmpequq $VD, $VA, $VB" , v1i128>; 1808*06c3fb27SDimitry Andric def VCMPGTSQ : VCMP <903, "vcmpgtsq $VD, $VA, $VB" , v1i128>; 1809*06c3fb27SDimitry Andric def VCMPGTUQ : VCMP <647, "vcmpgtuq $VD, $VA, $VB" , v1i128>; 1810*06c3fb27SDimitry Andric def VCMPEQUQ_rec : VCMP_rec <455, "vcmpequq. $VD, $VA, $VB" , v1i128>; 1811*06c3fb27SDimitry Andric def VCMPGTSQ_rec : VCMP_rec <903, "vcmpgtsq. $VD, $VA, $VB" , v1i128>; 1812*06c3fb27SDimitry Andric def VCMPGTUQ_rec : VCMP_rec <647, "vcmpgtuq. $VD, $VA, $VB" , v1i128>; 1813*06c3fb27SDimitry Andric def VMODSQ : VXForm_1<1803, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1814*06c3fb27SDimitry Andric "vmodsq $VD, $VA, $VB", IIC_VecGeneral, 1815*06c3fb27SDimitry Andric [(set v1i128:$VD, (srem v1i128:$VA, v1i128:$VB))]>; 1816*06c3fb27SDimitry Andric def VMODUQ : VXForm_1<1547, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 1817*06c3fb27SDimitry Andric "vmoduq $VD, $VA, $VB", IIC_VecGeneral, 1818*06c3fb27SDimitry Andric [(set v1i128:$VD, (urem v1i128:$VA, v1i128:$VB))]>; 1819*06c3fb27SDimitry Andric def VEXTSD2Q : VXForm_RD5_XO5_RS5<1538, 27, (outs vrrc:$VD), (ins vrrc:$VB), 1820*06c3fb27SDimitry Andric "vextsd2q $VD, $VB", IIC_VecGeneral, 1821*06c3fb27SDimitry Andric [(set v1i128:$VD, (int_ppc_altivec_vextsd2q v2i64:$VB))]>; 1822*06c3fb27SDimitry Andric def VCMPUQ : VXForm_BF3_VAB5<257, (outs crrc:$BF), (ins vrrc:$VA, vrrc:$VB), 1823*06c3fb27SDimitry Andric "vcmpuq $BF, $VA, $VB", IIC_VecGeneral, []>; 1824*06c3fb27SDimitry Andric def VCMPSQ : VXForm_BF3_VAB5<321, (outs crrc:$BF), (ins vrrc:$VA, vrrc:$VB), 1825*06c3fb27SDimitry Andric "vcmpsq $BF, $VA, $VB", IIC_VecGeneral, []>; 182681ad6265SDimitry Andric def VRLQNM : VX1_VT5_VA5_VB5<325, "vrlqnm", 1827*06c3fb27SDimitry Andric [(set v1i128:$VD, 1828*06c3fb27SDimitry Andric (int_ppc_altivec_vrlqnm v1i128:$VA, 1829*06c3fb27SDimitry Andric v1i128:$VB))]>; 1830*06c3fb27SDimitry Andric def VRLQMI : VXForm_1<69, (outs vrrc:$VD), 1831*06c3fb27SDimitry Andric (ins vrrc:$VA, vrrc:$VB, vrrc:$VDi), 1832*06c3fb27SDimitry Andric "vrlqmi $VD, $VA, $VB", IIC_VecFP, 1833*06c3fb27SDimitry Andric [(set v1i128:$VD, 1834*06c3fb27SDimitry Andric (int_ppc_altivec_vrlqmi v1i128:$VA, v1i128:$VB, 1835*06c3fb27SDimitry Andric v1i128:$VDi))]>, 1836*06c3fb27SDimitry Andric RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 183781ad6265SDimitry Andric def VSLQ : VX1_VT5_VA5_VB5<261, "vslq", []>; 183881ad6265SDimitry Andric def VSRAQ : VX1_VT5_VA5_VB5<773, "vsraq", []>; 183981ad6265SDimitry Andric def VSRQ : VX1_VT5_VA5_VB5<517, "vsrq", []>; 184081ad6265SDimitry Andric def VRLQ : VX1_VT5_VA5_VB5<5, "vrlq", []>; 184181ad6265SDimitry Andric def XSCVQPUQZ : X_VT5_XO5_VB5<63, 0, 836, "xscvqpuqz", []>; 184281ad6265SDimitry Andric def XSCVQPSQZ : X_VT5_XO5_VB5<63, 8, 836, "xscvqpsqz", []>; 184381ad6265SDimitry Andric def XSCVUQQP : X_VT5_XO5_VB5<63, 3, 836, "xscvuqqp", []>; 184481ad6265SDimitry Andric def XSCVSQQP : X_VT5_XO5_VB5<63, 11, 836, "xscvsqqp", []>; 184581ad6265SDimitry Andric def LXVKQ : XForm_XT6_IMM5<60, 31, 360, (outs vsrc:$XT), (ins u5imm:$UIM), 184681ad6265SDimitry Andric "lxvkq $XT, $UIM", IIC_VecGeneral, []>; 184781ad6265SDimitry Andric} 184881ad6265SDimitry Andric 184981ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX] in { 185081ad6265SDimitry Andric def XVCVSPBF16 : XX2_XT6_XO5_XB6<60, 17, 475, "xvcvspbf16", vsrc, []>; 185181ad6265SDimitry Andric def XVCVBF16SPN : XX2_XT6_XO5_XB6<60, 16, 475, "xvcvbf16spn", vsrc, []>; 185281ad6265SDimitry Andric def XSMAXCQP : X_VT5_VA5_VB5<63, 676, "xsmaxcqp", 1853*06c3fb27SDimitry Andric [(set f128:$RST, (PPCxsmaxc f128:$RA, f128:$RB))]>; 185481ad6265SDimitry Andric def XSMINCQP : X_VT5_VA5_VB5<63, 740, "xsmincqp", 1855*06c3fb27SDimitry Andric [(set f128:$RST, (PPCxsminc f128:$RA, f128:$RB))]>; 185681ad6265SDimitry Andric} 185781ad6265SDimitry Andric 185881ad6265SDimitry Andric// Multiclass defining patterns for Set Boolean Extension Reverse Instructions. 185981ad6265SDimitry Andric// This is analogous to the CRNotPat multiclass but specifically for Power10 186081ad6265SDimitry Andric// and newer subtargets since the extended forms use Set Boolean instructions. 186181ad6265SDimitry Andric// The first two anonymous patterns defined are actually a duplicate of those 186281ad6265SDimitry Andric// in CRNotPat, but it is preferable to define both multiclasses as complete 186381ad6265SDimitry Andric// ones rather than pulling that small common section out. 186481ad6265SDimitry Andricmulticlass P10ReverseSetBool<dag pattern, dag result> { 186581ad6265SDimitry Andric def : Pat<pattern, (crnot result)>; 186681ad6265SDimitry Andric def : Pat<(not pattern), result>; 186781ad6265SDimitry Andric 186881ad6265SDimitry Andric def : Pat<(i32 (zext pattern)), 186981ad6265SDimitry Andric (SETBCR result)>; 187081ad6265SDimitry Andric def : Pat<(i64 (zext pattern)), 187181ad6265SDimitry Andric (SETBCR8 result)>; 187281ad6265SDimitry Andric 187381ad6265SDimitry Andric def : Pat<(i32 (sext pattern)), 187481ad6265SDimitry Andric (SETNBCR result)>; 187581ad6265SDimitry Andric def : Pat<(i64 (sext pattern)), 187681ad6265SDimitry Andric (SETNBCR8 result)>; 187781ad6265SDimitry Andric 187881ad6265SDimitry Andric def : Pat<(i32 (anyext pattern)), 187981ad6265SDimitry Andric (SETBCR result)>; 188081ad6265SDimitry Andric def : Pat<(i64 (anyext pattern)), 188181ad6265SDimitry Andric (SETBCR8 result)>; 188281ad6265SDimitry Andric} 188381ad6265SDimitry Andric 188481ad6265SDimitry Andricmulticlass IntSetP10RevSetBool<SDNode SetCC, ValueType Ty, PatLeaf ZExtTy, 188581ad6265SDimitry Andric ImmLeaf SExtTy, I Cmpi, I Cmpli, 188681ad6265SDimitry Andric I Cmp, I Cmpl> { 188781ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)), 188881ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_lt)>; 188981ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)), 189081ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_lt)>; 189181ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)), 189281ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_gt)>; 189381ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)), 189481ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_gt)>; 189581ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)), 189681ad6265SDimitry Andric (EXTRACT_SUBREG (Cmp $s1, $s2), sub_eq)>; 189781ad6265SDimitry Andric 189881ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETUGE)), 189981ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_lt)>; 190081ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETGE)), 190181ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_lt)>; 190281ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETULE)), 190381ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_gt)>; 190481ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETLE)), 190581ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_gt)>; 190681ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETNE)), 190781ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_eq)>; 190881ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETNE)), 190981ad6265SDimitry Andric (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_eq)>; 191081ad6265SDimitry Andric} 191181ad6265SDimitry Andric 191281ad6265SDimitry Andricmulticlass FSetP10RevSetBool<SDNode SetCC, ValueType Ty, I FCmp> { 191381ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)), 191481ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>; 191581ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)), 191681ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>; 191781ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)), 191881ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>; 191981ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)), 192081ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>; 192181ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUNE)), 192281ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>; 192381ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)), 192481ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>; 192581ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETO)), 192681ad6265SDimitry Andric (EXTRACT_SUBREG (FCmp $s1, $s2), sub_un)>; 192781ad6265SDimitry Andric} 192881ad6265SDimitry Andric 192981ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 193081ad6265SDimitry Andric def : Pat<(i32 (zext i1:$in)), 193181ad6265SDimitry Andric (SETBC $in)>; 193281ad6265SDimitry Andric def : Pat<(i64 (zext i1:$in)), 193381ad6265SDimitry Andric (SETBC8 $in)>; 193481ad6265SDimitry Andric def : Pat<(i32 (sext i1:$in)), 193581ad6265SDimitry Andric (SETNBC $in)>; 193681ad6265SDimitry Andric def : Pat<(i64 (sext i1:$in)), 193781ad6265SDimitry Andric (SETNBC8 $in)>; 193881ad6265SDimitry Andric def : Pat<(i32 (anyext i1:$in)), 193981ad6265SDimitry Andric (SETBC $in)>; 194081ad6265SDimitry Andric def : Pat<(i64 (anyext i1:$in)), 194181ad6265SDimitry Andric (SETBC8 $in)>; 194281ad6265SDimitry Andric 194381ad6265SDimitry Andric // Instantiation of the set boolean reverse patterns for 32-bit integers. 194481ad6265SDimitry Andric defm : IntSetP10RevSetBool<setcc, i32, immZExt16, imm32SExt16, 194581ad6265SDimitry Andric CMPWI, CMPLWI, CMPW, CMPLW>; 194681ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (setcc i32:$s1, imm:$imm, SETNE)), 194781ad6265SDimitry Andric (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)), 194881ad6265SDimitry Andric (LO16 imm:$imm)), sub_eq)>; 194981ad6265SDimitry Andric 195081ad6265SDimitry Andric // Instantiation of the set boolean reverse patterns for 64-bit integers. 195181ad6265SDimitry Andric defm : IntSetP10RevSetBool<setcc, i64, immZExt16, imm64SExt16, 195281ad6265SDimitry Andric CMPDI, CMPLDI, CMPD, CMPLD>; 195381ad6265SDimitry Andric defm : P10ReverseSetBool<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETNE)), 195481ad6265SDimitry Andric (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)), 195581ad6265SDimitry Andric (LO16 imm:$imm)), sub_eq)>; 195681ad6265SDimitry Andric} 195781ad6265SDimitry Andric 195881ad6265SDimitry Andric// Instantiation of the set boolean reverse patterns for f32, f64, f128. 195981ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasFPU] in { 196081ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f32, FCMPUS>; 196181ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f64, FCMPUD>; 196281ad6265SDimitry Andric defm : FSetP10RevSetBool<setcc, f128, XSCMPUQP>; 196381ad6265SDimitry Andric} 196481ad6265SDimitry Andric 196581ad6265SDimitry Andric//---------------------------- Anonymous Patterns ----------------------------// 196681ad6265SDimitry Andriclet Predicates = [IsISA3_1] in { 196781ad6265SDimitry Andric // Exploit the vector multiply high instructions using intrinsics. 196881ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_altivec_vmulhsw v4i32:$vA, v4i32:$vB)), 196981ad6265SDimitry Andric (v4i32 (VMULHSW $vA, $vB))>; 197081ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_altivec_vmulhuw v4i32:$vA, v4i32:$vB)), 197181ad6265SDimitry Andric (v4i32 (VMULHUW $vA, $vB))>; 197281ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_altivec_vmulhsd v2i64:$vA, v2i64:$vB)), 197381ad6265SDimitry Andric (v2i64 (VMULHSD $vA, $vB))>; 197481ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_altivec_vmulhud v2i64:$vA, v2i64:$vB)), 197581ad6265SDimitry Andric (v2i64 (VMULHUD $vA, $vB))>; 197681ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxgenpcvbm v16i8:$VRB, imm:$IMM)), 197781ad6265SDimitry Andric (v16i8 (COPY_TO_REGCLASS (XXGENPCVBM $VRB, imm:$IMM), VRRC))>; 197881ad6265SDimitry Andric def : Pat<(v8i16 (int_ppc_vsx_xxgenpcvhm v8i16:$VRB, imm:$IMM)), 197981ad6265SDimitry Andric (v8i16 (COPY_TO_REGCLASS (XXGENPCVHM $VRB, imm:$IMM), VRRC))>; 198081ad6265SDimitry Andric def : Pat<(v4i32 (int_ppc_vsx_xxgenpcvwm v4i32:$VRB, imm:$IMM)), 198181ad6265SDimitry Andric (v4i32 (COPY_TO_REGCLASS (XXGENPCVWM $VRB, imm:$IMM), VRRC))>; 198281ad6265SDimitry Andric def : Pat<(v2i64 (int_ppc_vsx_xxgenpcvdm v2i64:$VRB, imm:$IMM)), 198381ad6265SDimitry Andric (v2i64 (COPY_TO_REGCLASS (XXGENPCVDM $VRB, imm:$IMM), VRRC))>; 198481ad6265SDimitry Andric def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 1)), 198581ad6265SDimitry Andric (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_lt)>; 198681ad6265SDimitry Andric def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 0)), 198781ad6265SDimitry Andric (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_eq)>; 1988bdd1243dSDimitry Andric def : Pat<(srl (bswap i32:$RS), (i32 16)), 1989bdd1243dSDimitry Andric (RLDICL_32 (BRH $RS), 0, 48)>; 1990bdd1243dSDimitry Andric def : Pat<(i64 (zext (i32 (srl (bswap i32:$RS), (i32 16))))), 1991bdd1243dSDimitry Andric (RLDICL_32_64 (BRH $RS), 0, 48)>; 199281ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 8)), 199381ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VRRC))>; 199481ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 16)), 199581ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VRRC))>; 199681ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 32)), 199781ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRWX ForceXForm:$src), VRRC))>; 199881ad6265SDimitry Andric def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 64)), 199981ad6265SDimitry Andric (v1i128 (COPY_TO_REGCLASS (LXVRDX ForceXForm:$src), VRRC))>; 200081ad6265SDimitry Andric 200181ad6265SDimitry Andric def : Pat<(v1i128 (rotl v1i128:$vA, v1i128:$vB)), 200281ad6265SDimitry Andric (v1i128 (VRLQ v1i128:$vA, v1i128:$vB))>; 200381ad6265SDimitry Andric 200481ad6265SDimitry Andric def : Pat <(v2i64 (PPCxxsplti32dx v2i64:$XT, i32:$XI, i32:$IMM32)), 200581ad6265SDimitry Andric (v2i64 (XXSPLTI32DX v2i64:$XT, i32:$XI, i32:$IMM32))>; 200681ad6265SDimitry Andric} 200781ad6265SDimitry Andric 200881ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX] in { 200981ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xvcvspbf16 v16i8:$XA)), 201081ad6265SDimitry Andric (COPY_TO_REGCLASS (XVCVSPBF16 RCCp.AToVSRC), VRRC)>; 201181ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xvcvbf16spn v16i8:$XA)), 201281ad6265SDimitry Andric (COPY_TO_REGCLASS (XVCVBF16SPN RCCp.AToVSRC), VRRC)>; 201381ad6265SDimitry Andric} 201481ad6265SDimitry Andric 201581ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, IsLittleEndian] in { 201681ad6265SDimitry Andric // Store element 0 of a VSX register to memory 201781ad6265SDimitry Andric def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$src, 0)), ForceXForm:$dst), 201881ad6265SDimitry Andric (STXVRBX (COPY_TO_REGCLASS v16i8:$src, VSRC), ForceXForm:$dst)>; 201981ad6265SDimitry Andric def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$src, 0)), ForceXForm:$dst), 202081ad6265SDimitry Andric (STXVRHX (COPY_TO_REGCLASS v8i16:$src, VSRC), ForceXForm:$dst)>; 202181ad6265SDimitry Andric def : Pat<(store (i32 (extractelt v4i32:$src, 0)), ForceXForm:$dst), 202281ad6265SDimitry Andric (STXVRWX $src, ForceXForm:$dst)>; 202381ad6265SDimitry Andric def : Pat<(store (f32 (extractelt v4f32:$src, 0)), ForceXForm:$dst), 202481ad6265SDimitry Andric (STXVRWX $src, ForceXForm:$dst)>; 202581ad6265SDimitry Andric def : Pat<(store (i64 (extractelt v2i64:$src, 0)), ForceXForm:$dst), 202681ad6265SDimitry Andric (STXVRDX $src, ForceXForm:$dst)>; 202781ad6265SDimitry Andric def : Pat<(store (f64 (extractelt v2f64:$src, 0)), ForceXForm:$dst), 202881ad6265SDimitry Andric (STXVRDX $src, ForceXForm:$dst)>; 202981ad6265SDimitry Andric // Load element 0 of a VSX register to memory 203081ad6265SDimitry Andric def : Pat<(v8i16 (scalar_to_vector (i32 (extloadi16 ForceXForm:$src)))), 203181ad6265SDimitry Andric (v8i16 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VSRC))>; 203281ad6265SDimitry Andric def : Pat<(v16i8 (scalar_to_vector (i32 (extloadi8 ForceXForm:$src)))), 203381ad6265SDimitry Andric (v16i8 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VSRC))>; 203481ad6265SDimitry Andric } 203581ad6265SDimitry Andric 203681ad6265SDimitry Andric// FIXME: The swap is overkill when the shift amount is a constant. 203781ad6265SDimitry Andric// We should just fix the constant in the DAG. 203881ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX] in { 203981ad6265SDimitry Andric def : Pat<(v1i128 (shl v1i128:$VRA, v1i128:$VRB)), 204081ad6265SDimitry Andric (v1i128 (VSLQ v1i128:$VRA, 204181ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 204281ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 204381ad6265SDimitry Andric def : Pat<(v1i128 (PPCshl v1i128:$VRA, v1i128:$VRB)), 204481ad6265SDimitry Andric (v1i128 (VSLQ v1i128:$VRA, 204581ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 204681ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 204781ad6265SDimitry Andric def : Pat<(v1i128 (srl v1i128:$VRA, v1i128:$VRB)), 204881ad6265SDimitry Andric (v1i128 (VSRQ v1i128:$VRA, 204981ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 205081ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 205181ad6265SDimitry Andric def : Pat<(v1i128 (PPCsrl v1i128:$VRA, v1i128:$VRB)), 205281ad6265SDimitry Andric (v1i128 (VSRQ v1i128:$VRA, 205381ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 205481ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 205581ad6265SDimitry Andric def : Pat<(v1i128 (sra v1i128:$VRA, v1i128:$VRB)), 205681ad6265SDimitry Andric (v1i128 (VSRAQ v1i128:$VRA, 205781ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 205881ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 205981ad6265SDimitry Andric def : Pat<(v1i128 (PPCsra v1i128:$VRA, v1i128:$VRB)), 206081ad6265SDimitry Andric (v1i128 (VSRAQ v1i128:$VRA, 206181ad6265SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 206281ad6265SDimitry Andric (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 206381ad6265SDimitry Andric} 206481ad6265SDimitry Andric 206581ad6265SDimitry Andricclass xxevalPattern <dag pattern, bits<8> imm> : 206681ad6265SDimitry Andric Pat<(v4i32 pattern), (XXEVAL $vA, $vB, $vC, imm)> {} 206781ad6265SDimitry Andric 206881ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [PrefixInstrs] in { 206981ad6265SDimitry Andric def : Pat<(v4i32 (build_vector i32immNonAllOneNonZero:$A, 207081ad6265SDimitry Andric i32immNonAllOneNonZero:$A, 207181ad6265SDimitry Andric i32immNonAllOneNonZero:$A, 207281ad6265SDimitry Andric i32immNonAllOneNonZero:$A)), 207381ad6265SDimitry Andric (v4i32 (XXSPLTIW imm:$A))>; 207481ad6265SDimitry Andric def : Pat<(f32 nzFPImmAsi32:$A), 207581ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)), 207681ad6265SDimitry Andric VSFRC)>; 207781ad6265SDimitry Andric def : Pat<(f64 nzFPImmAsi32:$A), 207881ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)), 207981ad6265SDimitry Andric VSFRC)>; 208081ad6265SDimitry Andric 208181ad6265SDimitry Andric// To replace constant pool with XXSPLTI32DX for scalars. 208281ad6265SDimitry Andricdef : Pat<(f32 nzFPImmAsi64:$A), 208381ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX(IMPLICIT_DEF), 0, 208481ad6265SDimitry Andric (getFPAs64BitIntHi $A)), 208581ad6265SDimitry Andric 1, (getFPAs64BitIntLo $A)), 208681ad6265SDimitry Andric VSSRC)>; 208781ad6265SDimitry Andric 208881ad6265SDimitry Andricdef : Pat<(f64 nzFPImmAsi64:$A), 208981ad6265SDimitry Andric (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX (IMPLICIT_DEF), 0, 209081ad6265SDimitry Andric (getFPAs64BitIntHi $A)), 209181ad6265SDimitry Andric 1, (getFPAs64BitIntLo $A)), 209281ad6265SDimitry Andric VSFRC)>; 209381ad6265SDimitry Andric 209481ad6265SDimitry Andric // Anonymous patterns for XXEVAL 209581ad6265SDimitry Andric // AND 209681ad6265SDimitry Andric // and(A, B, C) 209781ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 1>; 209881ad6265SDimitry Andric // and(A, xor(B, C)) 209981ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 6>; 210081ad6265SDimitry Andric // and(A, or(B, C)) 210181ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 7>; 210281ad6265SDimitry Andric // and(A, nor(B, C)) 210381ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 8>; 210481ad6265SDimitry Andric // and(A, eqv(B, C)) 210581ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 9>; 210681ad6265SDimitry Andric // and(A, nand(B, C)) 210781ad6265SDimitry Andric def : xxevalPattern<(and v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 14>; 210881ad6265SDimitry Andric 210981ad6265SDimitry Andric // NAND 211081ad6265SDimitry Andric // nand(A, B, C) 211181ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 211281ad6265SDimitry Andric !sub(255, 1)>; 211381ad6265SDimitry Andric // nand(A, xor(B, C)) 211481ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 211581ad6265SDimitry Andric !sub(255, 6)>; 211681ad6265SDimitry Andric // nand(A, or(B, C)) 211781ad6265SDimitry Andric def : xxevalPattern<(vnot (and v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 211881ad6265SDimitry Andric !sub(255, 7)>; 211981ad6265SDimitry Andric // nand(A, nor(B, C)) 212081ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 212181ad6265SDimitry Andric !sub(255, 8)>; 212281ad6265SDimitry Andric // nand(A, eqv(B, C)) 212381ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 212481ad6265SDimitry Andric !sub(255, 9)>; 212581ad6265SDimitry Andric // nand(A, nand(B, C)) 212681ad6265SDimitry Andric def : xxevalPattern<(or (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 212781ad6265SDimitry Andric !sub(255, 14)>; 212881ad6265SDimitry Andric 2129bdd1243dSDimitry Andric // EQV 2130bdd1243dSDimitry Andric // (eqv A, B, C) 2131bdd1243dSDimitry Andric def : xxevalPattern<(or (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 2132bdd1243dSDimitry Andric (vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)))), 2133bdd1243dSDimitry Andric 150>; 2134bdd1243dSDimitry Andric // (eqv A, (and B, C)) 2135bdd1243dSDimitry Andric def : xxevalPattern<(vnot (xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 225>; 2136bdd1243dSDimitry Andric // (eqv A, (or B, C)) 2137bdd1243dSDimitry Andric def : xxevalPattern<(vnot (xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 135>; 2138bdd1243dSDimitry Andric 2139bdd1243dSDimitry Andric // NOR 2140bdd1243dSDimitry Andric // (nor A, B, C) 2141bdd1243dSDimitry Andric def : xxevalPattern<(vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 128>; 2142bdd1243dSDimitry Andric // (nor A, (and B, C)) 2143bdd1243dSDimitry Andric def : xxevalPattern<(vnot (or v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 224>; 2144bdd1243dSDimitry Andric // (nor A, (eqv B, C)) 2145bdd1243dSDimitry Andric def : xxevalPattern<(and (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 96>; 2146bdd1243dSDimitry Andric // (nor A, (nand B, C)) 2147bdd1243dSDimitry Andric def : xxevalPattern<(and (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 16>; 2148bdd1243dSDimitry Andric // (nor A, (nor B, C)) 2149bdd1243dSDimitry Andric def : xxevalPattern<(and (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 112>; 2150bdd1243dSDimitry Andric // (nor A, (xor B, C)) 2151bdd1243dSDimitry Andric def : xxevalPattern<(vnot (or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 144>; 2152bdd1243dSDimitry Andric 2153bdd1243dSDimitry Andric // OR 2154bdd1243dSDimitry Andric // (or A, B, C) 2155bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 127>; 2156bdd1243dSDimitry Andric // (or A, (and B, C)) 2157bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 31>; 2158bdd1243dSDimitry Andric // (or A, (eqv B, C)) 2159bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 159>; 2160bdd1243dSDimitry Andric // (or A, (nand B, C)) 2161bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 239>; 2162bdd1243dSDimitry Andric // (or A, (nor B, C)) 2163bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 143>; 2164bdd1243dSDimitry Andric // (or A, (xor B, C)) 2165bdd1243dSDimitry Andric def : xxevalPattern<(or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 111>; 2166bdd1243dSDimitry Andric 2167bdd1243dSDimitry Andric // XOR 2168bdd1243dSDimitry Andric // (xor A, B, C) 2169bdd1243dSDimitry Andric def : xxevalPattern<(xor v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 105>; 2170bdd1243dSDimitry Andric // (xor A, (and B, C)) 2171bdd1243dSDimitry Andric def : xxevalPattern<(xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 30>; 2172bdd1243dSDimitry Andric // (xor A, (or B, C)) 2173bdd1243dSDimitry Andric def : xxevalPattern<(xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 120>; 2174bdd1243dSDimitry Andric 217581ad6265SDimitry Andric // Anonymous patterns to select prefixed VSX loads and stores. 217681ad6265SDimitry Andric // Load / Store f128 217781ad6265SDimitry Andric def : Pat<(f128 (load PDForm:$src)), 217881ad6265SDimitry Andric (COPY_TO_REGCLASS (PLXV memri34:$src), VRRC)>; 217981ad6265SDimitry Andric def : Pat<(store f128:$XS, PDForm:$dst), 218081ad6265SDimitry Andric (PSTXV (COPY_TO_REGCLASS $XS, VSRC), memri34:$dst)>; 218181ad6265SDimitry Andric 218281ad6265SDimitry Andric // Load / Store v4i32 218381ad6265SDimitry Andric def : Pat<(v4i32 (load PDForm:$src)), (PLXV memri34:$src)>; 218481ad6265SDimitry Andric def : Pat<(store v4i32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 218581ad6265SDimitry Andric 218681ad6265SDimitry Andric // Load / Store v2i64 218781ad6265SDimitry Andric def : Pat<(v2i64 (load PDForm:$src)), (PLXV memri34:$src)>; 218881ad6265SDimitry Andric def : Pat<(store v2i64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 218981ad6265SDimitry Andric 219081ad6265SDimitry Andric // Load / Store v4f32 219181ad6265SDimitry Andric def : Pat<(v4f32 (load PDForm:$src)), (PLXV memri34:$src)>; 219281ad6265SDimitry Andric def : Pat<(store v4f32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 219381ad6265SDimitry Andric 219481ad6265SDimitry Andric // Load / Store v2f64 219581ad6265SDimitry Andric def : Pat<(v2f64 (load PDForm:$src)), (PLXV memri34:$src)>; 219681ad6265SDimitry Andric def : Pat<(store v2f64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 219781ad6265SDimitry Andric 219881ad6265SDimitry Andric // Cases For PPCstore_scal_int_from_vsr 2199*06c3fb27SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr f64:$src, PDForm:$dst, 8), 2200*06c3fb27SDimitry Andric (PSTXSD $src, PDForm:$dst)>; 2201*06c3fb27SDimitry Andric def : Pat<(PPCstore_scal_int_from_vsr f128:$src, PDForm:$dst, 8), 2202*06c3fb27SDimitry Andric (PSTXSD (COPY_TO_REGCLASS $src, VFRC), PDForm:$dst)>; 220381ad6265SDimitry Andric} 220481ad6265SDimitry Andric 220581ad6265SDimitry Andriclet Predicates = [PrefixInstrs] in { 220681ad6265SDimitry Andric def : Pat<(i32 imm34:$imm), (PLI (getImmAs64BitInt imm:$imm))>; 220781ad6265SDimitry Andric def : Pat<(i64 imm34:$imm), (PLI8 (getImmAs64BitInt imm:$imm))>; 220881ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxpermx v16i8:$A, v16i8:$B, v16i8:$C, timm:$D)), 220981ad6265SDimitry Andric (COPY_TO_REGCLASS (XXPERMX (COPY_TO_REGCLASS $A, VSRC), 221081ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 221181ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC), $D), VSRC)>; 221281ad6265SDimitry Andric def : Pat<(v16i8 (int_ppc_vsx_xxblendvb v16i8:$A, v16i8:$B, v16i8:$C)), 221381ad6265SDimitry Andric (COPY_TO_REGCLASS 221481ad6265SDimitry Andric (XXBLENDVB (COPY_TO_REGCLASS $A, VSRC), 221581ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 221681ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC)), VSRC)>; 221781ad6265SDimitry Andric def : Pat<(v8i16 (int_ppc_vsx_xxblendvh v8i16:$A, v8i16:$B, v8i16:$C)), 221881ad6265SDimitry Andric (COPY_TO_REGCLASS 221981ad6265SDimitry Andric (XXBLENDVH (COPY_TO_REGCLASS $A, VSRC), 222081ad6265SDimitry Andric (COPY_TO_REGCLASS $B, VSRC), 222181ad6265SDimitry Andric (COPY_TO_REGCLASS $C, VSRC)), VSRC)>; 222281ad6265SDimitry Andric def : Pat<(int_ppc_vsx_xxblendvw v4i32:$A, v4i32:$B, v4i32:$C), 222381ad6265SDimitry Andric (XXBLENDVW $A, $B, $C)>; 222481ad6265SDimitry Andric def : Pat<(int_ppc_vsx_xxblendvd v2i64:$A, v2i64:$B, v2i64:$C), 222581ad6265SDimitry Andric (XXBLENDVD $A, $B, $C)>; 222681ad6265SDimitry Andric 222781ad6265SDimitry Andric // Anonymous patterns to select prefixed loads and stores. 222881ad6265SDimitry Andric // Load i32 222981ad6265SDimitry Andric def : Pat<(i32 (extloadi1 PDForm:$src)), (PLBZ memri34:$src)>; 223081ad6265SDimitry Andric def : Pat<(i32 (zextloadi1 PDForm:$src)), (PLBZ memri34:$src)>; 223181ad6265SDimitry Andric def : Pat<(i32 (extloadi8 PDForm:$src)), (PLBZ memri34:$src)>; 223281ad6265SDimitry Andric def : Pat<(i32 (zextloadi8 PDForm:$src)), (PLBZ memri34:$src)>; 223381ad6265SDimitry Andric def : Pat<(i32 (extloadi16 PDForm:$src)), (PLHZ memri34:$src)>; 223481ad6265SDimitry Andric def : Pat<(i32 (zextloadi16 PDForm:$src)), (PLHZ memri34:$src)>; 223581ad6265SDimitry Andric def : Pat<(i32 (sextloadi16 PDForm:$src)), (PLHA memri34:$src)>; 223681ad6265SDimitry Andric def : Pat<(i32 (load PDForm:$src)), (PLWZ memri34:$src)>; 223781ad6265SDimitry Andric 223881ad6265SDimitry Andric // Store i32 223981ad6265SDimitry Andric def : Pat<(truncstorei8 i32:$rS, PDForm:$dst), (PSTB gprc:$rS, memri34:$dst)>; 224081ad6265SDimitry Andric def : Pat<(truncstorei16 i32:$rS, PDForm:$dst), (PSTH gprc:$rS, memri34:$dst)>; 224181ad6265SDimitry Andric def : Pat<(store i32:$rS, PDForm:$dst), (PSTW gprc:$rS, memri34:$dst)>; 224281ad6265SDimitry Andric 224381ad6265SDimitry Andric // Load i64 224481ad6265SDimitry Andric def : Pat<(i64 (extloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>; 224581ad6265SDimitry Andric def : Pat<(i64 (zextloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>; 224681ad6265SDimitry Andric def : Pat<(i64 (extloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>; 224781ad6265SDimitry Andric def : Pat<(i64 (zextloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>; 224881ad6265SDimitry Andric def : Pat<(i64 (extloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>; 224981ad6265SDimitry Andric def : Pat<(i64 (zextloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>; 225081ad6265SDimitry Andric def : Pat<(i64 (sextloadi16 PDForm:$src)), (PLHA8 memri34:$src)>; 225181ad6265SDimitry Andric def : Pat<(i64 (extloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>; 225281ad6265SDimitry Andric def : Pat<(i64 (zextloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>; 225381ad6265SDimitry Andric def : Pat<(i64 (sextloadi32 PDForm:$src)), (PLWA8 memri34:$src)>; 225481ad6265SDimitry Andric def : Pat<(i64 (load PDForm:$src)), (PLD memri34:$src)>; 225581ad6265SDimitry Andric 225681ad6265SDimitry Andric // Store i64 225781ad6265SDimitry Andric def : Pat<(truncstorei8 i64:$rS, PDForm:$dst), (PSTB8 g8rc:$rS, memri34:$dst)>; 225881ad6265SDimitry Andric def : Pat<(truncstorei16 i64:$rS, PDForm:$dst), (PSTH8 g8rc:$rS, memri34:$dst)>; 225981ad6265SDimitry Andric def : Pat<(truncstorei32 i64:$rS, PDForm:$dst), (PSTW8 g8rc:$rS, memri34:$dst)>; 226081ad6265SDimitry Andric def : Pat<(store i64:$rS, PDForm:$dst), (PSTD g8rc:$rS, memri34:$dst)>; 226181ad6265SDimitry Andric 226281ad6265SDimitry Andric // Load / Store f32 226381ad6265SDimitry Andric def : Pat<(f32 (load PDForm:$src)), (PLFS memri34:$src)>; 226481ad6265SDimitry Andric def : Pat<(store f32:$FRS, PDForm:$dst), (PSTFS $FRS, memri34:$dst)>; 226581ad6265SDimitry Andric 226681ad6265SDimitry Andric // Load / Store f64 226781ad6265SDimitry Andric def : Pat<(f64 (extloadf32 PDForm:$src)), 226881ad6265SDimitry Andric (COPY_TO_REGCLASS (PLFS memri34:$src), VSFRC)>; 226981ad6265SDimitry Andric def : Pat<(f64 (load PDForm:$src)), (PLFD memri34:$src)>; 227081ad6265SDimitry Andric def : Pat<(store f64:$FRS, PDForm:$dst), (PSTFD $FRS, memri34:$dst)>; 227181ad6265SDimitry Andric 227281ad6265SDimitry Andric // Atomic Load 227381ad6265SDimitry Andric def : Pat<(atomic_load_8 PDForm:$src), (PLBZ memri34:$src)>; 227481ad6265SDimitry Andric def : Pat<(atomic_load_16 PDForm:$src), (PLHZ memri34:$src)>; 227581ad6265SDimitry Andric def : Pat<(atomic_load_32 PDForm:$src), (PLWZ memri34:$src)>; 227681ad6265SDimitry Andric def : Pat<(atomic_load_64 PDForm:$src), (PLD memri34:$src)>; 227781ad6265SDimitry Andric 227881ad6265SDimitry Andric // Atomic Store 227981ad6265SDimitry Andric def : Pat<(atomic_store_8 PDForm:$dst, i32:$RS), (PSTB $RS, memri34:$dst)>; 228081ad6265SDimitry Andric def : Pat<(atomic_store_16 PDForm:$dst, i32:$RS), (PSTH $RS, memri34:$dst)>; 228181ad6265SDimitry Andric def : Pat<(atomic_store_32 PDForm:$dst, i32:$RS), (PSTW $RS, memri34:$dst)>; 228281ad6265SDimitry Andric def : Pat<(atomic_store_64 PDForm:$dst, i64:$RS), (PSTD $RS, memri34:$dst)>; 228381ad6265SDimitry Andric 228481ad6265SDimitry Andric // Prefixed fpext to v2f64 228581ad6265SDimitry Andric def : Pat<(v4f32 (PPCldvsxlh PDForm:$src)), 228681ad6265SDimitry Andric (SUBREG_TO_REG (i64 1), (PLFD PDForm:$src), sub_64)>; 228781ad6265SDimitry Andric} 228881ad6265SDimitry Andric 228981ad6265SDimitry Andricdef InsertEltShift { 229081ad6265SDimitry Andric dag Sub32 = (i32 (EXTRACT_SUBREG $rB, sub_32)); 229181ad6265SDimitry Andric dag Sub32Left1 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 1, 0, 30); 229281ad6265SDimitry Andric dag Sub32Left2 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 2, 0, 29); 229381ad6265SDimitry Andric dag Left1 = (RLWINM $rB, 1, 0, 30); 229481ad6265SDimitry Andric dag Left2 = (RLWINM $rB, 2, 0, 29); 229581ad6265SDimitry Andric dag Left3 = (RLWINM8 $rB, 3, 0, 28); 229681ad6265SDimitry Andric} 229781ad6265SDimitry Andric 229881ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsLittleEndian] in { 229981ad6265SDimitry Andric // Indexed vector insert element 230081ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)), 230181ad6265SDimitry Andric (VINSBRX $vDi, InsertEltShift.Sub32, $rA)>; 230281ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)), 230381ad6265SDimitry Andric (VINSHRX $vDi, InsertEltShift.Sub32Left1, $rA)>; 230481ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)), 230581ad6265SDimitry Andric (VINSWRX $vDi, InsertEltShift.Sub32Left2, $rA)>; 230681ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)), 230781ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, $rA)>; 230881ad6265SDimitry Andric 230981ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)), 231081ad6265SDimitry Andric (VINSWVRX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>; 231181ad6265SDimitry Andric 231281ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, f64:$A, i64:$rB)), 231381ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>; 231481ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)), 231581ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>; 231681ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)), 231781ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>; 231881ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)), 231981ad6265SDimitry Andric (VINSDRX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>; 232081ad6265SDimitry Andric let AddedComplexity = 400 in { 232181ad6265SDimitry Andric // Immediate vector insert element 232281ad6265SDimitry Andric foreach Idx = [0, 1, 2, 3] in { 232381ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, Idx)), 232481ad6265SDimitry Andric (VINSW $vDi, !mul(!sub(3, Idx), 4), $rA)>; 232581ad6265SDimitry Andric } 232681ad6265SDimitry Andric foreach i = [0, 1] in 232781ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, (i64 i))), 232881ad6265SDimitry Andric (VINSD $vDi, !mul(!sub(1, i), 8), $rA)>; 232981ad6265SDimitry Andric } 233081ad6265SDimitry Andric} 233181ad6265SDimitry Andric 233281ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC32] in { 233381ad6265SDimitry Andric // Indexed vector insert element 233481ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i32:$rB)), 233581ad6265SDimitry Andric (VINSBLX $vDi, $rB, $rA)>; 233681ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i32:$rB)), 233781ad6265SDimitry Andric (VINSHLX $vDi, InsertEltShift.Left1, $rA)>; 233881ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i32:$rB)), 233981ad6265SDimitry Andric (VINSWLX $vDi, InsertEltShift.Left2, $rA)>; 234081ad6265SDimitry Andric 234181ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i32:$rB)), 234281ad6265SDimitry Andric (VINSWVLX $vDi, InsertEltShift.Left2, (XSCVDPSPN $rA))>; 234381ad6265SDimitry Andric} 234481ad6265SDimitry Andric 234581ad6265SDimitry Andriclet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC64] in { 234681ad6265SDimitry Andric // Indexed vector insert element 234781ad6265SDimitry Andric def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)), 234881ad6265SDimitry Andric (VINSBLX $vDi, InsertEltShift.Sub32, $rA)>; 234981ad6265SDimitry Andric def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)), 235081ad6265SDimitry Andric (VINSHLX $vDi, InsertEltShift.Sub32Left1, $rA)>; 235181ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)), 235281ad6265SDimitry Andric (VINSWLX $vDi, InsertEltShift.Sub32Left2, $rA)>; 235381ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)), 235481ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, $rA)>; 235581ad6265SDimitry Andric 235681ad6265SDimitry Andric def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)), 235781ad6265SDimitry Andric (VINSWVLX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>; 235881ad6265SDimitry Andric 235981ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, f64:$A, i64:$rB)), 236081ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>; 236181ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)), 236281ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>; 236381ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)), 236481ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>; 236581ad6265SDimitry Andric def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)), 236681ad6265SDimitry Andric (VINSDLX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>; 236781ad6265SDimitry Andric} 236881ad6265SDimitry Andric 236981ad6265SDimitry Andriclet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX, IsBigEndian] in { 237081ad6265SDimitry Andric // Immediate vector insert element 237181ad6265SDimitry Andric foreach Ty = [i32, i64] in { 237281ad6265SDimitry Andric foreach Idx = [0, 1, 2, 3] in { 237381ad6265SDimitry Andric def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, (Ty Idx))), 237481ad6265SDimitry Andric (VINSW $vDi, !mul(Idx, 4), $rA)>; 237581ad6265SDimitry Andric } 237681ad6265SDimitry Andric } 237781ad6265SDimitry Andric 237881ad6265SDimitry Andric foreach Idx = [0, 1] in 237981ad6265SDimitry Andric def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, Idx)), 238081ad6265SDimitry Andric (VINSD $vDi, !mul(Idx, 8), $rA)>; 238181ad6265SDimitry Andric} 2382