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