14fbe60fdSStefan Pintilie//===-- PPCInstrP10.td - Power10 Instruction Set -----------*- tablegen -*-===// 24fbe60fdSStefan Pintilie// 34fbe60fdSStefan Pintilie// The LLVM Compiler Infrastructure 44fbe60fdSStefan Pintilie// 54fbe60fdSStefan Pintilie// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 64fbe60fdSStefan Pintilie// See https://llvm.org/LICENSE.txt for license information. 74fbe60fdSStefan Pintilie// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 84fbe60fdSStefan Pintilie// 94fbe60fdSStefan Pintilie//===----------------------------------------------------------------------===// 104fbe60fdSStefan Pintilie// 114fbe60fdSStefan Pintilie// This file describes the instructions introduced for the Power10 CPU. 124fbe60fdSStefan Pintilie// 134fbe60fdSStefan Pintilie//===----------------------------------------------------------------------===// 144fbe60fdSStefan Pintilie 154fbe60fdSStefan Pintilie//===----------------------------------------------------------------------===// 164fbe60fdSStefan Pintilie// Naming convention for future instruction formats 174fbe60fdSStefan Pintilie// 184fbe60fdSStefan Pintilie// <INSTR_FORM>{_<OP_TYPE><OP_LENGTH>}+ 194fbe60fdSStefan Pintilie// 204fbe60fdSStefan Pintilie// Where: 214fbe60fdSStefan Pintilie// <INSTR_FORM> - name of instruction format as per the ISA 224fbe60fdSStefan Pintilie// (X-Form, VX-Form, etc.) 234fbe60fdSStefan Pintilie// <OP_TYPE> - operand type 244fbe60fdSStefan Pintilie// * FRT/RT/VT/XT/BT - target register 254fbe60fdSStefan Pintilie// (FPR, GPR, VR, VSR, CR-bit respectively) 264fbe60fdSStefan Pintilie// In some situations, the 'T' is replaced by 274fbe60fdSStefan Pintilie// 'D' when describing the target register. 284fbe60fdSStefan Pintilie// * [FR|R|V|X|B][A-Z] - register source (i.e. FRA, RA, XB, etc.) 294fbe60fdSStefan Pintilie// * IMM - immediate (where signedness matters, 304fbe60fdSStefan Pintilie// this is SI/UI for signed/unsigned) 314fbe60fdSStefan Pintilie// * [R|X|FR]Tp - register pair target (i.e. FRTp, RTp) 324fbe60fdSStefan Pintilie// * R - PC-Relative bit 334fbe60fdSStefan Pintilie// (denotes that the address is computed pc-relative) 344fbe60fdSStefan Pintilie// * VRM - Masked Registers 354fbe60fdSStefan Pintilie// * AT - target accumulator 364fbe60fdSStefan Pintilie// * N - the Nth bit in a VSR 374fbe60fdSStefan Pintilie// * Additional 1-bit operands may be required for certain 384fbe60fdSStefan Pintilie// instruction formats such as: MC, P, MP 394fbe60fdSStefan Pintilie// * X / Y / P - mask values. In the instruction encoding, this is 404fbe60fdSStefan Pintilie// represented as XMSK, YMSK and PMSK. 414fbe60fdSStefan Pintilie// * MEM - indicates if the instruction format requires any memory 424fbe60fdSStefan Pintilie// accesses. This does not have <OP_LENGTH> attached to it. 434fbe60fdSStefan Pintilie// <OP_LENGTH> - the length of each operand in bits. 444fbe60fdSStefan Pintilie// For operands that are 1 bit, the '1' is omitted from the name. 454fbe60fdSStefan Pintilie// 464fbe60fdSStefan Pintilie// Example: 8RR_XX4Form_IMM8_XTAB6 474fbe60fdSStefan Pintilie// 8RR_XX4Form is the instruction format. 484fbe60fdSStefan Pintilie// The operand is an 8-bit immediate (IMM), the destination (XT) 494fbe60fdSStefan Pintilie// and sources (XA, XB) that are all 6-bits. The destination and 504fbe60fdSStefan Pintilie// source registers are combined if they are of the same length. 514fbe60fdSStefan Pintilie// Moreover, the order of operands reflects the order of operands 524fbe60fdSStefan Pintilie// in the encoding. 534fbe60fdSStefan Pintilie 545abe6c31SLei Huang//-------------------------- Predicate definitions ---------------------------// 555abe6c31SLei Huangdef IsPPC32 : Predicate<"!Subtarget->isPPC64()">; 565abe6c31SLei Huang 575abe6c31SLei Huang 585abe6c31SLei Huang//===----------------------------------------------------------------------===// 595abe6c31SLei Huang// PowerPC ISA 3.1 specific type constraints. 605abe6c31SLei Huang// 615abe6c31SLei Huang 625abe6c31SLei Huangdef SDT_PPCSplat32 : SDTypeProfile<1, 3, [ SDTCisVT<0, v2i64>, 635abe6c31SLei Huang SDTCisVec<1>, SDTCisInt<2>, SDTCisInt<3> 645abe6c31SLei Huang]>; 655abe6c31SLei Huangdef SDT_PPCAccBuild : SDTypeProfile<1, 4, [ 665abe6c31SLei Huang SDTCisVT<0, v512i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32>, 675abe6c31SLei Huang SDTCisVT<3, v4i32>, SDTCisVT<4, v4i32> 685abe6c31SLei Huang]>; 695abe6c31SLei Huangdef SDT_PPCPairBuild : SDTypeProfile<1, 2, [ 705abe6c31SLei Huang SDTCisVT<0, v256i1>, SDTCisVT<1, v4i32>, SDTCisVT<2, v4i32> 715abe6c31SLei Huang]>; 725abe6c31SLei Huangdef SDT_PPCAccExtractVsx : SDTypeProfile<1, 2, [ 735abe6c31SLei Huang SDTCisVT<0, v4i32>, SDTCisVT<1, v512i1>, SDTCisPtrTy<2> 745abe6c31SLei Huang]>; 755abe6c31SLei Huangdef SDT_PPCPairExtractVsx : SDTypeProfile<1, 2, [ 765abe6c31SLei Huang SDTCisVT<0, v4i32>, SDTCisVT<1, v256i1>, SDTCisPtrTy<2> 775abe6c31SLei Huang]>; 785abe6c31SLei Huangdef SDT_PPCxxmfacc : SDTypeProfile<1, 1, [ 795abe6c31SLei Huang SDTCisVT<0, v512i1>, SDTCisVT<1, v512i1> 805abe6c31SLei Huang]>; 815abe6c31SLei Huang 82*a4751804SRolandF77def SDT_PPCsetbc : SDTypeProfile<1, 1, [ 83*a4751804SRolandF77 SDTCisInt<0>, SDTCisInt<1> 84*a4751804SRolandF77]>; 85*a4751804SRolandF77 865abe6c31SLei Huang//===----------------------------------------------------------------------===// 875abe6c31SLei Huang// ISA 3.1 specific PPCISD nodes. 885abe6c31SLei Huang// 895abe6c31SLei Huang 905abe6c31SLei Huangdef PPCxxsplti32dx : SDNode<"PPCISD::XXSPLTI32DX", SDT_PPCSplat32, []>; 915abe6c31SLei Huangdef PPCAccBuild : SDNode<"PPCISD::ACC_BUILD", SDT_PPCAccBuild, []>; 925abe6c31SLei Huangdef PPCPairBuild : SDNode<"PPCISD::PAIR_BUILD", SDT_PPCPairBuild, []>; 935abe6c31SLei Huangdef PPCAccExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCAccExtractVsx, 945abe6c31SLei Huang []>; 955abe6c31SLei Huangdef PPCPairExtractVsx : SDNode<"PPCISD::EXTRACT_VSX_REG", SDT_PPCPairExtractVsx, 965abe6c31SLei Huang []>; 975abe6c31SLei Huangdef PPCxxmfacc : SDNode<"PPCISD::XXMFACC", SDT_PPCxxmfacc, []>; 98*a4751804SRolandF77def PPCsetbc : SDNode<"PPCISD::SETBC", SDT_PPCsetbc, []>; 99*a4751804SRolandF77def PPCsetbcr : SDNode<"PPCISD::SETBCR", SDT_PPCsetbc, []>; 1005abe6c31SLei Huang 1015abe6c31SLei Huang//===----------------------------------------------------------------------===// 1025abe6c31SLei Huang 1035abe6c31SLei Huang// PC Relative flag (for instructions that use the address of the prefix for 1045abe6c31SLei Huang// address computations). 1055abe6c31SLei Huangclass isPCRel { bit PCRel = 1; } 1065abe6c31SLei Huang 1075abe6c31SLei Huang// PowerPC specific type constraints. 1085abe6c31SLei Huangdef SDT_PPCLXVRZX : SDTypeProfile<1, 2, [ 1095abe6c31SLei Huang SDTCisVT<0, v1i128>, SDTCisPtrTy<1>, SDTCisPtrTy<2> 1105abe6c31SLei Huang]>; 1115abe6c31SLei Huang 1125abe6c31SLei Huang// PPC Specific DAG Nodes. 1135abe6c31SLei Huangdef PPClxvrzx : SDNode<"PPCISD::LXVRZX", SDT_PPCLXVRZX, 114032014efSSergei Barannikov [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1155abe6c31SLei Huang 1165abe6c31SLei Huang// Top-level class for prefixed instructions. 1175abe6c31SLei Huangclass PI<bits<6> pref, bits<6> opcode, dag OOL, dag IOL, string asmstr, 1185abe6c31SLei Huang InstrItinClass itin> : Instruction { 1195abe6c31SLei Huang field bits<64> Inst; 1205abe6c31SLei Huang field bits<64> SoftFail = 0; 1215abe6c31SLei Huang bit PCRel = 0; // Default value, set by isPCRel. 1225abe6c31SLei Huang let Size = 8; 1235abe6c31SLei Huang 1245abe6c31SLei Huang let Namespace = "PPC"; 1255abe6c31SLei Huang let OutOperandList = OOL; 1265abe6c31SLei Huang let InOperandList = IOL; 1275abe6c31SLei Huang let AsmString = asmstr; 1285abe6c31SLei Huang let Itinerary = itin; 1295abe6c31SLei Huang let Inst{0-5} = pref; 1305abe6c31SLei Huang let Inst{32-37} = opcode; 1315abe6c31SLei Huang 1325abe6c31SLei Huang bits<1> PPC970_First = 0; 1335abe6c31SLei Huang bits<1> PPC970_Single = 0; 1345abe6c31SLei Huang bits<1> PPC970_Cracked = 0; 1355abe6c31SLei Huang bits<3> PPC970_Unit = 0; 1365abe6c31SLei Huang 1375abe6c31SLei Huang /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to 1385abe6c31SLei Huang /// these must be reflected there! See comments there for what these are. 1395abe6c31SLei Huang let TSFlags{0} = PPC970_First; 1405abe6c31SLei Huang let TSFlags{1} = PPC970_Single; 1415abe6c31SLei Huang let TSFlags{2} = PPC970_Cracked; 1425abe6c31SLei Huang let TSFlags{5-3} = PPC970_Unit; 1435abe6c31SLei Huang 1445abe6c31SLei Huang bits<1> Prefixed = 1; // This is a prefixed instruction. 1455abe6c31SLei Huang let TSFlags{7} = Prefixed; 1465abe6c31SLei Huang 14748cc4351SJake Egan // Indicate that this instruction takes a register+immediate memory operand. 14848cc4351SJake Egan bits<1> MemriOp = 0; 14948cc4351SJake Egan let TSFlags{10} = MemriOp; 15048cc4351SJake Egan 1515abe6c31SLei Huang // For cases where multiple instruction definitions really represent the 1525abe6c31SLei Huang // same underlying instruction but with one definition for 64-bit arguments 1535abe6c31SLei Huang // and one for 32-bit arguments, this bit breaks the degeneracy between 1545abe6c31SLei Huang // the two forms and allows TableGen to generate mapping tables. 1555abe6c31SLei Huang bit Interpretation64Bit = 0; 1565abe6c31SLei Huang 1575abe6c31SLei Huang // Fields used for relation models. 1585abe6c31SLei Huang string BaseName = ""; 1595abe6c31SLei Huang} 1605abe6c31SLei Huang 1615abe6c31SLei Huang// VX-Form: [ PO VT R VB RC XO ] 1625abe6c31SLei Huangclass VXForm_VTB5_RC<bits<10> xo, bits<5> R, dag OOL, dag IOL, string asmstr, 1635abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 1645abe6c31SLei Huang : I<4, OOL, IOL, asmstr, itin> { 1655abe6c31SLei Huang bits<5> VT; 1665abe6c31SLei Huang bits<5> VB; 1675abe6c31SLei Huang bit RC = 0; 1685abe6c31SLei Huang 1695abe6c31SLei Huang let Pattern = pattern; 1705abe6c31SLei Huang 1715abe6c31SLei Huang let Inst{6-10} = VT; 1725abe6c31SLei Huang let Inst{11-15} = R; 1735abe6c31SLei Huang let Inst{16-20} = VB; 1745abe6c31SLei Huang let Inst{21} = RC; 1755abe6c31SLei Huang let Inst{22-31} = xo; 1765abe6c31SLei Huang} 1775abe6c31SLei Huang 1785abe6c31SLei Huang// Multiclass definition to account for record and non-record form 1795abe6c31SLei Huang// instructions of VXRForm. 1805abe6c31SLei Huangmulticlass VXForm_VTB5_RCr<bits<10> xo, bits<5> R, dag OOL, dag IOL, 1815abe6c31SLei Huang string asmbase, string asmstr, 1825abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> { 1835abe6c31SLei Huang let BaseName = asmbase in { 1845abe6c31SLei Huang def NAME : VXForm_VTB5_RC<xo, R, OOL, IOL, 1855abe6c31SLei Huang !strconcat(asmbase, !strconcat(" ", asmstr)), 1865abe6c31SLei Huang itin, pattern>, RecFormRel; 1875abe6c31SLei Huang let Defs = [CR6] in 1885abe6c31SLei Huang def _rec : VXForm_VTB5_RC<xo, R, OOL, IOL, 1895abe6c31SLei Huang !strconcat(asmbase, !strconcat(". ", asmstr)), 1905abe6c31SLei Huang itin, []>, isRecordForm, RecFormRel; 1915abe6c31SLei Huang } 1925abe6c31SLei Huang} 1935abe6c31SLei Huang 1945abe6c31SLei Huangclass MLS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 1955abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 19648cc4351SJake Egan : PI<1, opcode, OOL, IOL, asmstr, itin>, MemriOp { 1974b43ef3eSJames Y Knight bits<5> RST; 1980be684edSJames Y Knight bits<5> RA; 1990be684edSJames Y Knight bits<34> D; 2005abe6c31SLei Huang 2015abe6c31SLei Huang let Pattern = pattern; 2025abe6c31SLei Huang 2035abe6c31SLei Huang // The prefix. 2045abe6c31SLei Huang let Inst{6-7} = 2; 2055abe6c31SLei Huang let Inst{8-10} = 0; 2065abe6c31SLei Huang let Inst{11} = PCRel; 2075abe6c31SLei Huang let Inst{12-13} = 0; 2080be684edSJames Y Knight let Inst{14-31} = D{33-16}; // d0 2095abe6c31SLei Huang 2105abe6c31SLei Huang // The instruction. 2114b43ef3eSJames Y Knight let Inst{38-42} = RST{4-0}; 2120be684edSJames Y Knight let Inst{43-47} = RA; 2130be684edSJames Y Knight let Inst{48-63} = D{15-0}; // d1 2145abe6c31SLei Huang} 2155abe6c31SLei Huang 2165abe6c31SLei Huangclass MLS_DForm_R_SI34_RTA5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 2175abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 2185abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 2195abe6c31SLei Huang bits<5> RT; 2205abe6c31SLei Huang bits<5> RA; 2215abe6c31SLei Huang bits<34> SI; 2225abe6c31SLei Huang 2235abe6c31SLei Huang let Pattern = pattern; 2245abe6c31SLei Huang 2255abe6c31SLei Huang // The prefix. 2265abe6c31SLei Huang let Inst{6-7} = 2; 2275abe6c31SLei Huang let Inst{8-10} = 0; 2285abe6c31SLei Huang let Inst{11} = PCRel; 2295abe6c31SLei Huang let Inst{12-13} = 0; 2305abe6c31SLei Huang let Inst{14-31} = SI{33-16}; 2315abe6c31SLei Huang 2325abe6c31SLei Huang // The instruction. 2335abe6c31SLei Huang let Inst{38-42} = RT; 2345abe6c31SLei Huang let Inst{43-47} = RA; 2355abe6c31SLei Huang let Inst{48-63} = SI{15-0}; 2365abe6c31SLei Huang} 2375abe6c31SLei Huang 2385abe6c31SLei Huangclass MLS_DForm_SI34_RT5<bits<6> opcode, dag OOL, dag IOL, string asmstr, 2395abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 2405abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 2415abe6c31SLei Huang bits<5> RT; 2425abe6c31SLei Huang bits<34> SI; 2435abe6c31SLei Huang 2445abe6c31SLei Huang let Pattern = pattern; 2455abe6c31SLei Huang 2465abe6c31SLei Huang // The prefix. 2475abe6c31SLei Huang let Inst{6-7} = 2; 2485abe6c31SLei Huang let Inst{8-10} = 0; 2495abe6c31SLei Huang let Inst{11} = 0; 2505abe6c31SLei Huang let Inst{12-13} = 0; 2515abe6c31SLei Huang let Inst{14-31} = SI{33-16}; 2525abe6c31SLei Huang 2535abe6c31SLei Huang // The instruction. 2545abe6c31SLei Huang let Inst{38-42} = RT; 2555abe6c31SLei Huang let Inst{43-47} = 0; 2565abe6c31SLei Huang let Inst{48-63} = SI{15-0}; 2575abe6c31SLei Huang} 2585abe6c31SLei Huang 2595abe6c31SLei Huangmulticlass MLS_DForm_R_SI34_RTA5_p<bits<6> opcode, dag OOL, dag IOL, 2605abe6c31SLei Huang dag PCRel_IOL, string asmstr, 2615abe6c31SLei Huang InstrItinClass itin> { 2625abe6c31SLei Huang def NAME : MLS_DForm_R_SI34_RTA5<opcode, OOL, IOL, 2635abe6c31SLei Huang !strconcat(asmstr, ", 0"), itin, []>; 2645abe6c31SLei Huang def pc : MLS_DForm_R_SI34_RTA5<opcode, OOL, PCRel_IOL, 2655abe6c31SLei Huang !strconcat(asmstr, ", 1"), itin, []>, isPCRel; 2665abe6c31SLei Huang} 2675abe6c31SLei Huang 268bc9916ffSStefan Pintilieclass 8LS_DForm_R_SI34_RTA5_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 2695abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 27048cc4351SJake Egan : PI<1, opcode, OOL, IOL, asmstr, itin>, MemriOp { 2714b43ef3eSJames Y Knight bits<5> RST; 2720be684edSJames Y Knight bits<5> RA; 2730be684edSJames Y Knight bits<34> D; 2745abe6c31SLei Huang 2755abe6c31SLei Huang let Pattern = pattern; 2765abe6c31SLei Huang 2775abe6c31SLei Huang // The prefix. 2785abe6c31SLei Huang let Inst{6-10} = 0; 2795abe6c31SLei Huang let Inst{11} = PCRel; 2805abe6c31SLei Huang let Inst{12-13} = 0; 2810be684edSJames Y Knight let Inst{14-31} = D{33-16}; // d0 2825abe6c31SLei Huang 2835abe6c31SLei Huang // The instruction. 2844b43ef3eSJames Y Knight let Inst{38-42} = RST{4-0}; 2850be684edSJames Y Knight let Inst{43-47} = RA; 2860be684edSJames Y Knight let Inst{48-63} = D{15-0}; // d1 2875abe6c31SLei Huang} 2885abe6c31SLei Huang 2895abe6c31SLei Huang// 8LS:D-Form: [ 1 0 0 // R // d0 2905abe6c31SLei Huang// PO TX T RA d1 ] 291bc9916ffSStefan Pintilieclass 8LS_DForm_R_SI34_XT6_RA5_MEM<bits<5> opcode, dag OOL, dag IOL, 292bc9916ffSStefan Pintilie string asmstr, InstrItinClass itin, 293bc9916ffSStefan Pintilie list<dag> pattern> 29448cc4351SJake Egan : PI<1, { opcode, ? }, OOL, IOL, asmstr, itin>, MemriOp { 2954b43ef3eSJames Y Knight bits<6> XST; 2960be684edSJames Y Knight bits<5> RA; 2970be684edSJames Y Knight bits<34> D; 2985abe6c31SLei Huang 2995abe6c31SLei Huang let Pattern = pattern; 3005abe6c31SLei Huang 3015abe6c31SLei Huang // The prefix. 3025abe6c31SLei Huang let Inst{6-7} = 0; 3035abe6c31SLei Huang let Inst{8} = 0; 3045abe6c31SLei Huang let Inst{9-10} = 0; // reserved 3055abe6c31SLei Huang let Inst{11} = PCRel; 3065abe6c31SLei Huang let Inst{12-13} = 0; // reserved 3070be684edSJames Y Knight let Inst{14-31} = D{33-16}; // d0 3085abe6c31SLei Huang 3095abe6c31SLei Huang // The instruction. 3104b43ef3eSJames Y Knight let Inst{37} = XST{5}; 3114b43ef3eSJames Y Knight let Inst{38-42} = XST{4-0}; 3120be684edSJames Y Knight let Inst{43-47} = RA; 3130be684edSJames Y Knight let Inst{48-63} = D{15-0}; // d1 3145abe6c31SLei Huang} 3155abe6c31SLei Huang 3165abe6c31SLei Huang// X-Form: [PO T IMM VRB XO TX] 3175abe6c31SLei Huangclass XForm_XT6_IMM5_VB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 3185abe6c31SLei Huang string asmstr, InstrItinClass itin, list<dag> pattern> 3195abe6c31SLei Huang : I<opcode, OOL, IOL, asmstr, itin> { 3205abe6c31SLei Huang bits<6> XT; 3215abe6c31SLei Huang bits<5> VRB; 3225abe6c31SLei Huang bits<5> IMM; 3235abe6c31SLei Huang 3245abe6c31SLei Huang let Pattern = pattern; 3255abe6c31SLei Huang let Inst{6-10} = XT{4-0}; 3265abe6c31SLei Huang let Inst{11-15} = IMM; 3275abe6c31SLei Huang let Inst{16-20} = VRB; 3285abe6c31SLei Huang let Inst{21-30} = xo; 3295abe6c31SLei Huang let Inst{31} = XT{5}; 3305abe6c31SLei Huang} 3315abe6c31SLei Huang 3325abe6c31SLei Huangclass 8RR_XX4Form_IMM8_XTAB6<bits<6> opcode, bits<2> xo, 3335abe6c31SLei Huang dag OOL, dag IOL, string asmstr, 3345abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 3355abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 3365abe6c31SLei Huang bits<6> XT; 3375abe6c31SLei Huang bits<6> XA; 3385abe6c31SLei Huang bits<6> XB; 3395abe6c31SLei Huang bits<6> XC; 3405abe6c31SLei Huang bits<8> IMM; 3415abe6c31SLei Huang 3425abe6c31SLei Huang let Pattern = pattern; 3435abe6c31SLei Huang 3445abe6c31SLei Huang // The prefix. 3455abe6c31SLei Huang let Inst{6-7} = 1; 3465abe6c31SLei Huang let Inst{8} = 0; 3475abe6c31SLei Huang let Inst{9-11} = 0; 3485abe6c31SLei Huang let Inst{12-13} = 0; 3495abe6c31SLei Huang let Inst{14-23} = 0; 3505abe6c31SLei Huang let Inst{24-31} = IMM; 3515abe6c31SLei Huang 3525abe6c31SLei Huang // The instruction. 3535abe6c31SLei Huang let Inst{38-42} = XT{4-0}; 3545abe6c31SLei Huang let Inst{43-47} = XA{4-0}; 3555abe6c31SLei Huang let Inst{48-52} = XB{4-0}; 3565abe6c31SLei Huang let Inst{53-57} = XC{4-0}; 3575abe6c31SLei Huang let Inst{58-59} = xo; 3585abe6c31SLei Huang let Inst{60} = XC{5}; 3595abe6c31SLei Huang let Inst{61} = XA{5}; 3605abe6c31SLei Huang let Inst{62} = XB{5}; 3615abe6c31SLei Huang let Inst{63} = XT{5}; 3625abe6c31SLei Huang} 3635abe6c31SLei Huang 3645abe6c31SLei Huangclass VXForm_RD5_N3_VB5<bits<11> xo, dag OOL, dag IOL, string asmstr, 3655abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 3665abe6c31SLei Huang : I<4, OOL, IOL, asmstr, itin> { 3675abe6c31SLei Huang bits<5> RD; 3685abe6c31SLei Huang bits<5> VB; 3695abe6c31SLei Huang bits<3> N; 3705abe6c31SLei Huang 3715abe6c31SLei Huang let Pattern = pattern; 3725abe6c31SLei Huang 3735abe6c31SLei Huang let Inst{6-10} = RD; 3745abe6c31SLei Huang let Inst{11-12} = 0; 3755abe6c31SLei Huang let Inst{13-15} = N; 3765abe6c31SLei Huang let Inst{16-20} = VB; 3775abe6c31SLei Huang let Inst{21-31} = xo; 3785abe6c31SLei Huang} 3795abe6c31SLei Huang 3805abe6c31SLei Huang 3815abe6c31SLei Huang// VX-Form: [PO VRT RA VRB XO]. 3825abe6c31SLei Huang// Destructive (insert) forms are suffixed with _ins. 3835abe6c31SLei Huangclass VXForm_VTB5_RA5_ins<bits<11> xo, string opc, list<dag> pattern> 3844b43ef3eSJames Y Knight : VXForm_1<xo, (outs vrrc:$VD), (ins vrrc:$VDi, gprc:$VA, vrrc:$VB), 3854b43ef3eSJames Y Knight !strconcat(opc, " $VD, $VA, $VB"), IIC_VecGeneral, pattern>, 3864b43ef3eSJames Y Knight RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 3875abe6c31SLei Huang 3885abe6c31SLei Huang// VX-Form: [PO VRT RA RB XO]. 3895abe6c31SLei Huang// Destructive (insert) forms are suffixed with _ins. 3905abe6c31SLei Huangclass VXForm_VRT5_RAB5_ins<bits<11> xo, string opc, list<dag> pattern> 3914b43ef3eSJames Y Knight : VXForm_1<xo, (outs vrrc:$VD), (ins vrrc:$VDi, gprc:$VA, gprc:$VB), 3924b43ef3eSJames Y Knight !strconcat(opc, " $VD, $VA, $VB"), IIC_VecGeneral, pattern>, 3934b43ef3eSJames Y Knight RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 3945abe6c31SLei Huang 3955abe6c31SLei Huang// VX-Form: [ PO BF // VRA VRB XO ] 3965abe6c31SLei Huangclass VXForm_BF3_VAB5<bits<11> xo, dag OOL, dag IOL, string asmstr, 3975abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 3985abe6c31SLei Huang : I<4, OOL, IOL, asmstr, itin> { 3995abe6c31SLei Huang bits<3> BF; 4005abe6c31SLei Huang bits<5> VA; 4015abe6c31SLei Huang bits<5> VB; 4025abe6c31SLei Huang 4035abe6c31SLei Huang let Pattern = pattern; 4045abe6c31SLei Huang 4055abe6c31SLei Huang let Inst{6-8} = BF; 4065abe6c31SLei Huang let Inst{9-10} = 0; 4075abe6c31SLei Huang let Inst{11-15} = VA; 4085abe6c31SLei Huang let Inst{16-20} = VB; 4095abe6c31SLei Huang let Inst{21-31} = xo; 4105abe6c31SLei Huang} 4115abe6c31SLei Huang 4125abe6c31SLei Huang// VN-Form: [PO VRT VRA VRB PS SD XO] 4135abe6c31SLei Huang// SD is "Shift Direction" 4145abe6c31SLei Huangclass VNForm_VTAB5_SD3<bits<6> xo, bits<2> ps, dag OOL, dag IOL, string asmstr, 4155abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 4165abe6c31SLei Huang : I<4, OOL, IOL, asmstr, itin> { 4175abe6c31SLei Huang bits<5> VRT; 4185abe6c31SLei Huang bits<5> VRA; 4195abe6c31SLei Huang bits<5> VRB; 4205abe6c31SLei Huang bits<3> SD; 4215abe6c31SLei Huang 4225abe6c31SLei Huang let Pattern = pattern; 4235abe6c31SLei Huang 4245abe6c31SLei Huang let Inst{6-10} = VRT; 4255abe6c31SLei Huang let Inst{11-15} = VRA; 4265abe6c31SLei Huang let Inst{16-20} = VRB; 4275abe6c31SLei Huang let Inst{21-22} = ps; 4285abe6c31SLei Huang let Inst{23-25} = SD; 4295abe6c31SLei Huang let Inst{26-31} = xo; 4305abe6c31SLei Huang} 4315abe6c31SLei Huang 4325abe6c31SLei Huangclass VXForm_RD5_MP_VB5<bits<11> xo, bits<4> eo, dag OOL, dag IOL, 4335abe6c31SLei Huang string asmstr, InstrItinClass itin, list<dag> pattern> 4345abe6c31SLei Huang : I<4, OOL, IOL, asmstr, itin> { 4355abe6c31SLei Huang bits<5> RD; 4365abe6c31SLei Huang bits<5> VB; 4375abe6c31SLei Huang bit MP; 4385abe6c31SLei Huang 4395abe6c31SLei Huang let Pattern = pattern; 4405abe6c31SLei Huang 4415abe6c31SLei Huang let Inst{6-10} = RD; 4425abe6c31SLei Huang let Inst{11-14} = eo; 4435abe6c31SLei Huang let Inst{15} = MP; 4445abe6c31SLei Huang let Inst{16-20} = VB; 4455abe6c31SLei Huang let Inst{21-31} = xo; 4465abe6c31SLei Huang} 4475abe6c31SLei Huang 4485abe6c31SLei Huang// 8RR:D-Form: [ 1 1 0 // // imm0 4495abe6c31SLei Huang// PO T XO TX imm1 ]. 4505abe6c31SLei Huangclass 8RR_DForm_IMM32_XT6<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, 4515abe6c31SLei Huang string asmstr, InstrItinClass itin, 4525abe6c31SLei Huang list<dag> pattern> 4535abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 4545abe6c31SLei Huang bits<6> XT; 4555abe6c31SLei Huang bits<32> IMM32; 4565abe6c31SLei Huang 4575abe6c31SLei Huang let Pattern = pattern; 4585abe6c31SLei Huang 4595abe6c31SLei Huang // The prefix. 4605abe6c31SLei Huang let Inst{6-7} = 1; 4615abe6c31SLei Huang let Inst{8-11} = 0; 4625abe6c31SLei Huang let Inst{12-13} = 0; // reserved 4635abe6c31SLei Huang let Inst{14-15} = 0; // reserved 4645abe6c31SLei Huang let Inst{16-31} = IMM32{31-16}; 4655abe6c31SLei Huang 4665abe6c31SLei Huang // The instruction. 4675abe6c31SLei Huang let Inst{38-42} = XT{4-0}; 4685abe6c31SLei Huang let Inst{43-46} = xo; 4695abe6c31SLei Huang let Inst{47} = XT{5}; 4705abe6c31SLei Huang let Inst{48-63} = IMM32{15-0}; 4715abe6c31SLei Huang} 4725abe6c31SLei Huang 4735abe6c31SLei Huang// 8RR:D-Form: [ 1 1 0 // // imm0 4745abe6c31SLei Huang// PO T XO IX TX imm1 ]. 4755abe6c31SLei Huangclass 8RR_DForm_IMM32_XT6_IX<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, 4765abe6c31SLei Huang string asmstr, InstrItinClass itin, 4775abe6c31SLei Huang list<dag> pattern> 4785abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 4795abe6c31SLei Huang bits<6> XT; 4805abe6c31SLei Huang bit IX; 4815abe6c31SLei Huang bits<32> IMM32; 4825abe6c31SLei Huang 4835abe6c31SLei Huang let Pattern = pattern; 4845abe6c31SLei Huang 4855abe6c31SLei Huang // The prefix. 4865abe6c31SLei Huang let Inst{6-7} = 1; 4875abe6c31SLei Huang let Inst{8-11} = 0; 4885abe6c31SLei Huang let Inst{12-13} = 0; // reserved 4895abe6c31SLei Huang let Inst{14-15} = 0; // reserved 4905abe6c31SLei Huang let Inst{16-31} = IMM32{31-16}; 4915abe6c31SLei Huang 4925abe6c31SLei Huang // The instruction. 4935abe6c31SLei Huang let Inst{38-42} = XT{4-0}; 4945abe6c31SLei Huang let Inst{43-45} = xo; 4955abe6c31SLei Huang let Inst{46} = IX; 4965abe6c31SLei Huang let Inst{47} = XT{5}; 4975abe6c31SLei Huang let Inst{48-63} = IMM32{15-0}; 4985abe6c31SLei Huang} 4995abe6c31SLei Huang 5005abe6c31SLei Huangclass 8RR_XX4Form_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, 5015abe6c31SLei Huang string asmstr, InstrItinClass itin, list<dag> pattern> 5025abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 5035abe6c31SLei Huang bits<6> XT; 5045abe6c31SLei Huang bits<6> XA; 5055abe6c31SLei Huang bits<6> XB; 5065abe6c31SLei Huang bits<6> XC; 5075abe6c31SLei Huang 5085abe6c31SLei Huang let Pattern = pattern; 5095abe6c31SLei Huang 5105abe6c31SLei Huang // The prefix. 5115abe6c31SLei Huang let Inst{6-7} = 1; 5125abe6c31SLei Huang let Inst{8-11} = 0; 5135abe6c31SLei Huang let Inst{12-13} = 0; 5145abe6c31SLei Huang let Inst{14-31} = 0; 5155abe6c31SLei Huang 5165abe6c31SLei Huang // The instruction. 5175abe6c31SLei Huang let Inst{38-42} = XT{4-0}; 5185abe6c31SLei Huang let Inst{43-47} = XA{4-0}; 5195abe6c31SLei Huang let Inst{48-52} = XB{4-0}; 5205abe6c31SLei Huang let Inst{53-57} = XC{4-0}; 5215abe6c31SLei Huang let Inst{58-59} = xo; 5225abe6c31SLei Huang let Inst{60} = XC{5}; 5235abe6c31SLei Huang let Inst{61} = XA{5}; 5245abe6c31SLei Huang let Inst{62} = XB{5}; 5255abe6c31SLei Huang let Inst{63} = XT{5}; 5265abe6c31SLei Huang} 5275abe6c31SLei Huang 5285abe6c31SLei Huangclass 8RR_XX4Form_IMM3_XTABC6<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, 5295abe6c31SLei Huang string asmstr, InstrItinClass itin, 5305abe6c31SLei Huang list<dag> pattern> 5315abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 5325abe6c31SLei Huang bits<6> XT; 5335abe6c31SLei Huang bits<6> XA; 5345abe6c31SLei Huang bits<6> XB; 5355abe6c31SLei Huang bits<6> XC; 5365abe6c31SLei Huang bits<3> IMM; 5375abe6c31SLei Huang 5385abe6c31SLei Huang let Pattern = pattern; 5395abe6c31SLei Huang 5405abe6c31SLei Huang // The prefix. 5415abe6c31SLei Huang let Inst{6-7} = 1; 5425abe6c31SLei Huang let Inst{8-11} = 0; 5435abe6c31SLei Huang let Inst{12-13} = 0; 5445abe6c31SLei Huang let Inst{14-28} = 0; 5455abe6c31SLei Huang let Inst{29-31} = IMM; 5465abe6c31SLei Huang 5475abe6c31SLei Huang // The instruction. 5485abe6c31SLei Huang let Inst{38-42} = XT{4-0}; 5495abe6c31SLei Huang let Inst{43-47} = XA{4-0}; 5505abe6c31SLei Huang let Inst{48-52} = XB{4-0}; 5515abe6c31SLei Huang let Inst{53-57} = XC{4-0}; 5525abe6c31SLei Huang let Inst{58-59} = xo; 5535abe6c31SLei Huang let Inst{60} = XC{5}; 5545abe6c31SLei Huang let Inst{61} = XA{5}; 5555abe6c31SLei Huang let Inst{62} = XB{5}; 5565abe6c31SLei Huang let Inst{63} = XT{5}; 5575abe6c31SLei Huang} 5585abe6c31SLei Huang 5595abe6c31SLei Huang// [PO BF / XO2 B XO BX /] 5605abe6c31SLei Huangclass XX2_BF3_XO5_XB6_XO9<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, 5615abe6c31SLei Huang dag IOL, string asmstr, InstrItinClass itin, 5625abe6c31SLei Huang list<dag> pattern> 5635abe6c31SLei Huang : I<opcode, OOL, IOL, asmstr, itin> { 5645abe6c31SLei Huang bits<3> BF; 5655abe6c31SLei Huang bits<6> XB; 5665abe6c31SLei Huang 5675abe6c31SLei Huang let Pattern = pattern; 5685abe6c31SLei Huang 5695abe6c31SLei Huang let Inst{6-8} = BF; 5705abe6c31SLei Huang let Inst{9-10} = 0; 5715abe6c31SLei Huang let Inst{11-15} = xo2; 5725abe6c31SLei Huang let Inst{16-20} = XB{4-0}; 5735abe6c31SLei Huang let Inst{21-29} = xo; 5745abe6c31SLei Huang let Inst{30} = XB{5}; 5755abe6c31SLei Huang let Inst{31} = 0; 5765abe6c31SLei Huang} 5775abe6c31SLei Huang 5785abe6c31SLei Huang// X-Form: [ PO RT BI /// XO / ] 5795abe6c31SLei Huangclass XForm_XT5_BI5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 5805abe6c31SLei Huang string asmstr, InstrItinClass itin, list<dag> pattern> 5815abe6c31SLei Huang : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 5824b43ef3eSJames Y Knight bits<5> BI; 5834b43ef3eSJames Y Knight let RA = BI; 5844b43ef3eSJames Y Knight let RB = 0; 5855abe6c31SLei Huang} 5865abe6c31SLei Huang 5875abe6c31SLei Huangmulticlass MLS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL, 588ea8b95d0SStefan Pintilie dag PCRel_IOL, dag PCRelOnly_IOL, 589ea8b95d0SStefan Pintilie string asmstr, string asmstr_pcext, 5905abe6c31SLei Huang InstrItinClass itin> { 5915abe6c31SLei Huang def NAME : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, 5925abe6c31SLei Huang !strconcat(asmstr, ", 0"), itin, []>; 5935abe6c31SLei Huang def pc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL, 5945abe6c31SLei Huang !strconcat(asmstr, ", 1"), itin, []>, 5955abe6c31SLei Huang isPCRel; 596ea8b95d0SStefan Pintilie let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in { 597ea8b95d0SStefan Pintilie def nopc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, asmstr, itin, []>; 59848cc4351SJake Egan let RA = 0, MemriOp = 0 in 599ea8b95d0SStefan Pintilie def onlypc : MLS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRelOnly_IOL, 600ea8b95d0SStefan Pintilie asmstr_pcext, itin, []>, isPCRel; 601ea8b95d0SStefan Pintilie } 6025abe6c31SLei Huang} 6035abe6c31SLei Huang 604bc9916ffSStefan Pintiliemulticlass 8LS_DForm_R_SI34_RTA5_MEM_p<bits<6> opcode, dag OOL, dag IOL, 605ea8b95d0SStefan Pintilie dag PCRel_IOL, dag PCRelOnly_IOL, 606ea8b95d0SStefan Pintilie string asmstr, string asmstr_pcext, 6075abe6c31SLei Huang InstrItinClass itin> { 608bc9916ffSStefan Pintilie def NAME : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, 6095abe6c31SLei Huang !strconcat(asmstr, ", 0"), itin, []>; 610bc9916ffSStefan Pintilie def pc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRel_IOL, 6115abe6c31SLei Huang !strconcat(asmstr, ", 1"), itin, []>, 6125abe6c31SLei Huang isPCRel; 613ea8b95d0SStefan Pintilie let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in { 614ea8b95d0SStefan Pintilie def nopc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, IOL, asmstr, itin, []>; 61548cc4351SJake Egan let RA = 0, MemriOp = 0 in 616ea8b95d0SStefan Pintilie def onlypc : 8LS_DForm_R_SI34_RTA5_MEM<opcode, OOL, PCRelOnly_IOL, 617ea8b95d0SStefan Pintilie asmstr_pcext, itin, []>, isPCRel; 618ea8b95d0SStefan Pintilie } 6195abe6c31SLei Huang} 6205abe6c31SLei Huang 621bc9916ffSStefan Pintiliemulticlass 8LS_DForm_R_SI34_XT6_RA5_MEM_p<bits<5> opcode, dag OOL, dag IOL, 622ea8b95d0SStefan Pintilie dag PCRel_IOL, dag PCRelOnly_IOL, 623ea8b95d0SStefan Pintilie string asmstr, string asmstr_pcext, 624bc9916ffSStefan Pintilie InstrItinClass itin> { 625bc9916ffSStefan Pintilie def NAME : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL, 626bc9916ffSStefan Pintilie !strconcat(asmstr, ", 0"), itin, []>; 627bc9916ffSStefan Pintilie def pc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRel_IOL, 628bc9916ffSStefan Pintilie !strconcat(asmstr, ", 1"), itin, []>, 629bc9916ffSStefan Pintilie isPCRel; 630ea8b95d0SStefan Pintilie let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in { 631ea8b95d0SStefan Pintilie def nopc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, IOL, asmstr, itin, []>; 63248cc4351SJake Egan let RA = 0, MemriOp = 0 in 633ea8b95d0SStefan Pintilie def onlypc : 8LS_DForm_R_SI34_XT6_RA5_MEM<opcode, OOL, PCRelOnly_IOL, 634ea8b95d0SStefan Pintilie asmstr_pcext, itin, []>, isPCRel; 635ea8b95d0SStefan Pintilie } 636bc9916ffSStefan Pintilie} 637bc9916ffSStefan Pintilie 638bc9916ffSStefan Pintiliedef PrefixInstrs : Predicate<"Subtarget->hasPrefixInstrs()">; 639bc9916ffSStefan Pintiliedef IsISA3_1 : Predicate<"Subtarget->isISA3_1()">; 640bc9916ffSStefan Pintiliedef PairedVectorMemops : Predicate<"Subtarget->pairedVectorMemops()">; 641bc9916ffSStefan Pintiliedef RCCp { 642bc9916ffSStefan Pintilie dag AToVSRC = (COPY_TO_REGCLASS $XA, VSRC); 643bc9916ffSStefan Pintilie dag BToVSRC = (COPY_TO_REGCLASS $XB, VSRC); 644bc9916ffSStefan Pintilie} 645bc9916ffSStefan Pintilie 646bc9916ffSStefan Pintilielet Predicates = [PrefixInstrs] in { 647bc9916ffSStefan Pintilie let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 648bc9916ffSStefan Pintilie defm PADDI8 : 6494069299dSStefan Pintilie MLS_DForm_R_SI34_RTA5_p<14, (outs g8rc:$RT), (ins g8rc_nox0:$RA, s34imm:$SI), 650bc9916ffSStefan Pintilie (ins immZero:$RA, s34imm_pcrel:$SI), 651bc9916ffSStefan Pintilie "paddi $RT, $RA, $SI", IIC_LdStLFD>; 652bc9916ffSStefan Pintilie let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 653bc9916ffSStefan Pintilie def PLI8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT), 654bc9916ffSStefan Pintilie (ins s34imm:$SI), 655bc9916ffSStefan Pintilie "pli $RT, $SI", IIC_IntSimple, []>; 656bc9916ffSStefan Pintilie } 657bc9916ffSStefan Pintilie } 658bc9916ffSStefan Pintilie defm PADDI : 6594069299dSStefan Pintilie MLS_DForm_R_SI34_RTA5_p<14, (outs gprc:$RT), (ins gprc_nor0:$RA, s34imm:$SI), 660bc9916ffSStefan Pintilie (ins immZero:$RA, s34imm_pcrel:$SI), 661bc9916ffSStefan Pintilie "paddi $RT, $RA, $SI", IIC_LdStLFD>; 662bc9916ffSStefan Pintilie let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in { 663bc9916ffSStefan Pintilie def PLI : MLS_DForm_SI34_RT5<14, (outs gprc:$RT), 664bc9916ffSStefan Pintilie (ins s34imm:$SI), 665bc9916ffSStefan Pintilie "pli $RT, $SI", IIC_IntSimple, []>; 666bc9916ffSStefan Pintilie } 667bc9916ffSStefan Pintilie 6686127f15eSzhijian lin let mayLoad = 1, mayStore = 0 in { 669bc9916ffSStefan Pintilie let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 670bc9916ffSStefan Pintilie defm PLBZ8 : 6710be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 672ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 673ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), "plbz $RST, $addr", 674ea8b95d0SStefan Pintilie "plbz $RST, $D", IIC_LdStLFD>; 675bc9916ffSStefan Pintilie defm PLHZ8 : 6760be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 677ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 678ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), "plhz $RST, $addr", 679ea8b95d0SStefan Pintilie "plhz $RST, $D", IIC_LdStLFD>; 680bc9916ffSStefan Pintilie defm PLHA8 : 6810be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 682ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 683ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), "plha $RST, $addr", 684ea8b95d0SStefan Pintilie "plha $RST, $D", IIC_LdStLFD>; 685bc9916ffSStefan Pintilie defm PLWA8 : 6860be684edSJames Y Knight 8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 6870be684edSJames Y Knight (ins (memri34_pcrel $D, $RA):$addr), 688ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), 689ea8b95d0SStefan Pintilie "plwa $RST, $addr", "plwa $RST, $D", IIC_LdStLFD>; 690bc9916ffSStefan Pintilie defm PLWZ8 : 6910be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 692ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 693ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), "plwz $RST, $addr", 694ea8b95d0SStefan Pintilie "plwz $RST, $D", IIC_LdStLFD>; 695bc9916ffSStefan Pintilie } 696bc9916ffSStefan Pintilie defm PLBZ : 6970be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<34, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 698ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 699ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), "plbz $RST, $addr", 700ea8b95d0SStefan Pintilie "plbz $RST, $D", IIC_LdStLFD>; 701bc9916ffSStefan Pintilie defm PLHZ : 7020be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<40, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 703ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 704ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), "plhz $RST, $addr", 705ea8b95d0SStefan Pintilie "plhz $RST, $D", IIC_LdStLFD>; 706bc9916ffSStefan Pintilie defm PLHA : 7070be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<42, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 708ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 709ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), "plha $RST, $addr", 710ea8b95d0SStefan Pintilie "plha $RST, $D", IIC_LdStLFD>; 711bc9916ffSStefan Pintilie defm PLWZ : 7120be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<32, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 713ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 714ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), "plwz $RST, $addr", 715ea8b95d0SStefan Pintilie "plwz $RST, $D", IIC_LdStLFD>; 716bc9916ffSStefan Pintilie defm PLWA : 7170be684edSJames Y Knight 8LS_DForm_R_SI34_RTA5_MEM_p<41, (outs gprc:$RST), (ins (memri34 $D, $RA):$addr), 718ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 719ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), 720ea8b95d0SStefan Pintilie "plwa $RST, $addr", "plwa $RST, $D", 721bc9916ffSStefan Pintilie IIC_LdStLFD>; 722bc9916ffSStefan Pintilie defm PLD : 7230be684edSJames Y Knight 8LS_DForm_R_SI34_RTA5_MEM_p<57, (outs g8rc:$RST), (ins (memri34 $D, $RA):$addr), 724ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 725ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), 726ea8b95d0SStefan Pintilie "pld $RST, $addr", "pld $RST, $D", 727bc9916ffSStefan Pintilie IIC_LdStLFD>; 728bc9916ffSStefan Pintilie } 729bc9916ffSStefan Pintilie 730bc9916ffSStefan Pintilie let mayStore = 1, mayLoad = 0 in { 731bc9916ffSStefan Pintilie let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 732bc9916ffSStefan Pintilie defm PSTB8 : 7330be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr), 7340be684edSJames Y Knight (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr), 735ea8b95d0SStefan Pintilie (ins g8rc:$RST, s34imm_pcrel:$D), 736ea8b95d0SStefan Pintilie "pstb $RST, $addr", "pstb $RST, $D", IIC_LdStLFD>; 737bc9916ffSStefan Pintilie defm PSTH8 : 7380be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr), 7390be684edSJames Y Knight (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr), 740ea8b95d0SStefan Pintilie (ins g8rc:$RST, s34imm_pcrel:$D), 741ea8b95d0SStefan Pintilie "psth $RST, $addr", "psth $RST, $D", IIC_LdStLFD>; 742bc9916ffSStefan Pintilie defm PSTW8 : 7430be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr), 7440be684edSJames Y Knight (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr), 745ea8b95d0SStefan Pintilie (ins g8rc:$RST, s34imm_pcrel:$D), 746ea8b95d0SStefan Pintilie "pstw $RST, $addr", "pstw $RST, $D", IIC_LdStLFD>; 747bc9916ffSStefan Pintilie } 748bc9916ffSStefan Pintilie defm PSTB : 7490be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<38, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr), 7500be684edSJames Y Knight (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr), 751ea8b95d0SStefan Pintilie (ins gprc:$RST, s34imm_pcrel:$D), 752ea8b95d0SStefan Pintilie "pstb $RST, $addr", "pstb $RST, $D", IIC_LdStLFD>; 753bc9916ffSStefan Pintilie defm PSTH : 7540be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<44, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr), 7550be684edSJames Y Knight (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr), 756ea8b95d0SStefan Pintilie (ins gprc:$RST, s34imm_pcrel:$D), 757ea8b95d0SStefan Pintilie "psth $RST, $addr", "psth $RST, $D", IIC_LdStLFD>; 758bc9916ffSStefan Pintilie defm PSTW : 7590be684edSJames Y Knight MLS_DForm_R_SI34_RTA5_MEM_p<36, (outs), (ins gprc:$RST, (memri34 $D, $RA):$addr), 7600be684edSJames Y Knight (ins gprc:$RST, (memri34_pcrel $D, $RA):$addr), 761ea8b95d0SStefan Pintilie (ins gprc:$RST, s34imm_pcrel:$D), 762ea8b95d0SStefan Pintilie "pstw $RST, $addr", "pstw $RST, $D", IIC_LdStLFD>; 763bc9916ffSStefan Pintilie defm PSTD : 7640be684edSJames Y Knight 8LS_DForm_R_SI34_RTA5_MEM_p<61, (outs), (ins g8rc:$RST, (memri34 $D, $RA):$addr), 7650be684edSJames Y Knight (ins g8rc:$RST, (memri34_pcrel $D, $RA):$addr), 766ea8b95d0SStefan Pintilie (ins g8rc:$RST, s34imm_pcrel:$D), 767ea8b95d0SStefan Pintilie "pstd $RST, $addr", "pstd $RST, $D", IIC_LdStLFD>; 768bc9916ffSStefan Pintilie } 769bc9916ffSStefan Pintilie} 770bc9916ffSStefan Pintilie 771b41dbe60Szhijian linlet Predicates = [PrefixInstrs, HasFPU] in { 772b41dbe60Szhijian lin let mayLoad = 1, mayStore = 0 in { 773b41dbe60Szhijian lin defm PLFS : 774b41dbe60Szhijian lin MLS_DForm_R_SI34_RTA5_MEM_p<48, (outs f4rc:$RST), (ins (memri34 $D, $RA):$addr), 775b41dbe60Szhijian lin (ins (memri34_pcrel $D, $RA):$addr), 776b41dbe60Szhijian lin (ins s34imm_pcrel:$D), "plfs $RST, $addr", 777b41dbe60Szhijian lin "plfs $RST, $D", IIC_LdStLFD>; 778b41dbe60Szhijian lin defm PLFD : 779b41dbe60Szhijian lin MLS_DForm_R_SI34_RTA5_MEM_p<50, (outs f8rc:$RST), (ins (memri34 $D, $RA):$addr), 780b41dbe60Szhijian lin (ins (memri34_pcrel $D, $RA):$addr), 781b41dbe60Szhijian lin (ins s34imm_pcrel:$D), "plfd $RST, $addr", 782b41dbe60Szhijian lin "plfd $RST, $D", IIC_LdStLFD>; 783b41dbe60Szhijian lin } 784b41dbe60Szhijian lin let mayStore = 1, mayLoad = 0 in { 785b41dbe60Szhijian lin defm PSTFS : 786b41dbe60Szhijian lin MLS_DForm_R_SI34_RTA5_MEM_p<52, (outs), (ins f4rc:$RST, (memri34 $D, $RA):$addr), 787b41dbe60Szhijian lin (ins f4rc:$RST, (memri34_pcrel $D, $RA):$addr), 788b41dbe60Szhijian lin (ins f4rc:$RST, s34imm_pcrel:$D), 789b41dbe60Szhijian lin "pstfs $RST, $addr", "pstfs $RST, $D", IIC_LdStLFD>; 790b41dbe60Szhijian lin defm PSTFD : 791b41dbe60Szhijian lin MLS_DForm_R_SI34_RTA5_MEM_p<54, (outs), (ins f8rc:$RST, (memri34 $D, $RA):$addr), 792b41dbe60Szhijian lin (ins f8rc:$RST, (memri34_pcrel $D, $RA):$addr), 793b41dbe60Szhijian lin (ins f8rc:$RST, s34imm_pcrel:$D), 794b41dbe60Szhijian lin "pstfd $RST, $addr", "pstfd $RST, $D", IIC_LdStLFD>; 795b41dbe60Szhijian lin } 796b41dbe60Szhijian lin} 797b41dbe60Szhijian lin 798b41dbe60Szhijian linlet Predicates = [PrefixInstrs, HasP10Vector] in { 799b41dbe60Szhijian lin let mayLoad = 1, mayStore = 0 in { 800b41dbe60Szhijian lin defm PLXV : 801b41dbe60Szhijian lin 8LS_DForm_R_SI34_XT6_RA5_MEM_p<25, (outs vsrc:$XST), (ins (memri34 $D, $RA):$addr), 802b41dbe60Szhijian lin (ins (memri34_pcrel $D, $RA):$addr), 803b41dbe60Szhijian lin (ins s34imm_pcrel:$D), 804b41dbe60Szhijian lin "plxv $XST, $addr", "plxv $XST, $D", IIC_LdStLFD>; 805b41dbe60Szhijian lin defm PLXSSP : 806b41dbe60Szhijian lin 8LS_DForm_R_SI34_RTA5_MEM_p<43, (outs vfrc:$RST), (ins (memri34 $D, $RA):$addr), 807b41dbe60Szhijian lin (ins (memri34_pcrel $D, $RA):$addr), 808b41dbe60Szhijian lin (ins s34imm_pcrel:$D), 809b41dbe60Szhijian lin "plxssp $RST, $addr", "plxssp $RST, $D", 810b41dbe60Szhijian lin IIC_LdStLFD>; 811b41dbe60Szhijian lin defm PLXSD : 812b41dbe60Szhijian lin 8LS_DForm_R_SI34_RTA5_MEM_p<42, (outs vfrc:$RST), (ins (memri34 $D, $RA):$addr), 813b41dbe60Szhijian lin (ins (memri34_pcrel $D, $RA):$addr), 814b41dbe60Szhijian lin (ins s34imm_pcrel:$D), 815b41dbe60Szhijian lin "plxsd $RST, $addr", "plxsd $RST, $D", 816b41dbe60Szhijian lin IIC_LdStLFD>; 817b41dbe60Szhijian lin } 818b41dbe60Szhijian lin let mayStore = 1, mayLoad = 0 in { 819b41dbe60Szhijian lin defm PSTXV : 820b41dbe60Szhijian lin 8LS_DForm_R_SI34_XT6_RA5_MEM_p<27, (outs), (ins vsrc:$XST, (memri34 $D, $RA):$addr), 821b41dbe60Szhijian lin (ins vsrc:$XST, (memri34_pcrel $D, $RA):$addr), 822b41dbe60Szhijian lin (ins vsrc:$XST, s34imm_pcrel:$D), 823b41dbe60Szhijian lin "pstxv $XST, $addr", "pstxv $XST, $D", IIC_LdStLFD>; 824b41dbe60Szhijian lin defm PSTXSSP : 825b41dbe60Szhijian lin 8LS_DForm_R_SI34_RTA5_MEM_p<47, (outs), (ins vfrc:$RST, (memri34 $D, $RA):$addr), 826b41dbe60Szhijian lin (ins vfrc:$RST, (memri34_pcrel $D, $RA):$addr), 827b41dbe60Szhijian lin (ins vfrc:$RST, s34imm_pcrel:$D), 828b41dbe60Szhijian lin "pstxssp $RST, $addr", "pstxssp $RST, $D", IIC_LdStLFD>; 829b41dbe60Szhijian lin defm PSTXSD : 830b41dbe60Szhijian lin 8LS_DForm_R_SI34_RTA5_MEM_p<46, (outs), (ins vfrc:$RST, (memri34 $D, $RA):$addr), 831b41dbe60Szhijian lin (ins vfrc:$RST, (memri34_pcrel $D, $RA):$addr), 832b41dbe60Szhijian lin (ins vfrc:$RST, s34imm_pcrel:$D), 833b41dbe60Szhijian lin "pstxsd $RST, $addr", "pstxsd $RST, $D", IIC_LdStLFD>; 834b41dbe60Szhijian lin } 835b41dbe60Szhijian lin def XXPERMX : 836b41dbe60Szhijian lin 8RR_XX4Form_IMM3_XTABC6<34, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 837b41dbe60Szhijian lin vsrc:$XC, u3imm:$IMM), 838b41dbe60Szhijian lin "xxpermx $XT, $XA, $XB, $XC, $IMM", 839b41dbe60Szhijian lin IIC_VecPerm, []>; 840b41dbe60Szhijian lin def XXBLENDVB : 841b41dbe60Szhijian lin 8RR_XX4Form_XTABC6<33, 0, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 842b41dbe60Szhijian lin vsrc:$XC), "xxblendvb $XT, $XA, $XB, $XC", 843b41dbe60Szhijian lin IIC_VecGeneral, []>; 844b41dbe60Szhijian lin def XXBLENDVH : 845b41dbe60Szhijian lin 8RR_XX4Form_XTABC6<33, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 846b41dbe60Szhijian lin vsrc:$XC), "xxblendvh $XT, $XA, $XB, $XC", 847b41dbe60Szhijian lin IIC_VecGeneral, []>; 848b41dbe60Szhijian lin def XXBLENDVW : 849b41dbe60Szhijian lin 8RR_XX4Form_XTABC6<33, 2, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 850b41dbe60Szhijian lin vsrc:$XC), "xxblendvw $XT, $XA, $XB, $XC", 851b41dbe60Szhijian lin IIC_VecGeneral, []>; 852b41dbe60Szhijian lin def XXBLENDVD : 853b41dbe60Szhijian lin 8RR_XX4Form_XTABC6<33, 3, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 854b41dbe60Szhijian lin vsrc:$XC), "xxblendvd $XT, $XA, $XB, $XC", 855b41dbe60Szhijian lin IIC_VecGeneral, []>; 856b41dbe60Szhijian lin} 857b41dbe60Szhijian lin 8585abe6c31SLei Huangclass DQForm_XTp5_RA17_MEM<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, 8595abe6c31SLei Huang string asmstr, InstrItinClass itin, list<dag> pattern> 86048cc4351SJake Egan : I<opcode, OOL, IOL, asmstr, itin>, MemriOp { 8615abe6c31SLei Huang bits<5> XTp; 8620be684edSJames Y Knight bits<5> RA; 8630be684edSJames Y Knight bits<12> DQ; 8640be684edSJames Y Knight 8655abe6c31SLei Huang let Pattern = pattern; 8665abe6c31SLei Huang 8675abe6c31SLei Huang let Inst{6-9} = XTp{3-0}; 8685abe6c31SLei Huang let Inst{10} = XTp{4}; 8690be684edSJames Y Knight let Inst{11-15} = RA; 8700be684edSJames Y Knight let Inst{16-27} = DQ; 8715abe6c31SLei Huang let Inst{28-31} = xo; 8725abe6c31SLei Huang} 8735abe6c31SLei Huang 8745abe6c31SLei Huangclass XForm_XTp5_XAB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, 8755abe6c31SLei Huang string asmstr, InstrItinClass itin, list<dag> pattern> 8765abe6c31SLei Huang : I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp { 8775abe6c31SLei Huang bits<5> XTp; 8784b43ef3eSJames Y Knight bits<5> RA; 8794b43ef3eSJames Y Knight bits<5> RB; 8805abe6c31SLei Huang 8815abe6c31SLei Huang let Pattern = pattern; 8825abe6c31SLei Huang let Inst{6-9} = XTp{3-0}; 8835abe6c31SLei Huang let Inst{10} = XTp{4}; 8844b43ef3eSJames Y Knight let Inst{11-15} = RA; 8854b43ef3eSJames Y Knight let Inst{16-20} = RB; 8865abe6c31SLei Huang let Inst{21-30} = xo; 8875abe6c31SLei Huang let Inst{31} = 0; 8885abe6c31SLei Huang} 8895abe6c31SLei Huang 8905abe6c31SLei Huangclass 8LS_DForm_R_XTp5_SI34_MEM<bits<6> opcode, dag OOL, dag IOL, string asmstr, 8915abe6c31SLei Huang InstrItinClass itin, list<dag> pattern> 89248cc4351SJake Egan : PI<1, opcode, OOL, IOL, asmstr, itin>, MemriOp { 8935abe6c31SLei Huang bits<5> XTp; 8940be684edSJames Y Knight bits<5> RA; 8950be684edSJames Y Knight bits<34> D; 8965abe6c31SLei Huang 8975abe6c31SLei Huang let Pattern = pattern; 8985abe6c31SLei Huang 8995abe6c31SLei Huang // The prefix. 9005abe6c31SLei Huang let Inst{6-10} = 0; 9015abe6c31SLei Huang let Inst{11} = PCRel; 9025abe6c31SLei Huang let Inst{12-13} = 0; 9030be684edSJames Y Knight let Inst{14-31} = D{33-16}; // Imm18 9045abe6c31SLei Huang 9055abe6c31SLei Huang // The instruction. 9065abe6c31SLei Huang let Inst{38-41} = XTp{3-0}; 9075abe6c31SLei Huang let Inst{42} = XTp{4}; 9080be684edSJames Y Knight let Inst{43-47} = RA; 9090be684edSJames Y Knight let Inst{48-63} = D{15-0}; 9105abe6c31SLei Huang} 9115abe6c31SLei Huang 9125abe6c31SLei Huangmulticlass 8LS_DForm_R_XTp5_SI34_MEM_p<bits<6> opcode, dag OOL, 913ea8b95d0SStefan Pintilie dag IOL, dag PCRel_IOL, dag PCRelOnly_IOL, 914ea8b95d0SStefan Pintilie string asmstr, string asmstr_pcext, 915ea8b95d0SStefan Pintilie InstrItinClass itin> { 9165abe6c31SLei Huang def NAME : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL, 9175abe6c31SLei Huang !strconcat(asmstr, ", 0"), itin, []>; 9185abe6c31SLei Huang def pc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRel_IOL, 9195abe6c31SLei Huang !strconcat(asmstr, ", 1"), itin, []>, 9205abe6c31SLei Huang isPCRel; 921ea8b95d0SStefan Pintilie let isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in { 922ea8b95d0SStefan Pintilie def nopc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, IOL, asmstr, itin, []>; 92348cc4351SJake Egan let RA = 0, MemriOp = 0 in 924ea8b95d0SStefan Pintilie def onlypc : 8LS_DForm_R_XTp5_SI34_MEM<opcode, OOL, PCRelOnly_IOL, 925ea8b95d0SStefan Pintilie asmstr_pcext, itin, []>, isPCRel; 926ea8b95d0SStefan Pintilie } 9275abe6c31SLei Huang} 9285abe6c31SLei Huang 9295abe6c31SLei Huang 9305abe6c31SLei Huang 9315abe6c31SLei Huang// [PO AS XO2 XO] 9325abe6c31SLei Huangclass XForm_AT3<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL, 9335abe6c31SLei Huang string asmstr, InstrItinClass itin, list<dag> pattern> 9345abe6c31SLei Huang : I<opcode, OOL, IOL, asmstr, itin> { 9355abe6c31SLei Huang bits<3> AT; 9365abe6c31SLei Huang 9375abe6c31SLei Huang let Pattern = pattern; 9385abe6c31SLei Huang 9395abe6c31SLei Huang let Inst{6-8} = AT; 9405abe6c31SLei Huang let Inst{9-10} = 0; 9415abe6c31SLei Huang let Inst{11-15} = xo2; 9425abe6c31SLei Huang let Inst{16-20} = 0; 9435abe6c31SLei Huang let Inst{21-30} = xo; 9445abe6c31SLei Huang let Inst{31} = 0; 9455abe6c31SLei Huang} 9465abe6c31SLei Huang 947eb1c5a98SStefan Pintilie// X-Form: [ PO T EO UIM XO TX ] 948eb1c5a98SStefan Pintilieclass XForm_XT6_IMM5<bits<6> opcode, bits<5> eo, bits<10> xo, dag OOL, dag IOL, 949eb1c5a98SStefan Pintilie string asmstr, InstrItinClass itin, list<dag> pattern> 950eb1c5a98SStefan Pintilie : I<opcode, OOL, IOL, asmstr, itin> { 951eb1c5a98SStefan Pintilie bits<6> XT; 952eb1c5a98SStefan Pintilie bits<5> UIM; 953eb1c5a98SStefan Pintilie 954eb1c5a98SStefan Pintilie let Pattern = pattern; 955eb1c5a98SStefan Pintilie 956eb1c5a98SStefan Pintilie let Inst{6-10} = XT{4-0}; 957eb1c5a98SStefan Pintilie let Inst{11-15} = eo; 958eb1c5a98SStefan Pintilie let Inst{16-20} = UIM; 959eb1c5a98SStefan Pintilie let Inst{21-30} = xo; 960eb1c5a98SStefan Pintilie let Inst{31} = XT{5}; 961eb1c5a98SStefan Pintilie} 962eb1c5a98SStefan Pintilie 9635abe6c31SLei Huangclass XX3Form_AT3_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 9645abe6c31SLei Huang string asmstr, InstrItinClass itin, 9655abe6c31SLei Huang list<dag> pattern> 9665abe6c31SLei Huang : I<opcode, OOL, IOL, asmstr, itin> { 9675abe6c31SLei Huang bits<3> AT; 9685abe6c31SLei Huang bits<6> XA; 9695abe6c31SLei Huang bits<6> XB; 9705abe6c31SLei Huang 9715abe6c31SLei Huang let Pattern = pattern; 9725abe6c31SLei Huang 9735abe6c31SLei Huang let Inst{6-8} = AT; 9745abe6c31SLei Huang let Inst{9-10} = 0; 9755abe6c31SLei Huang let Inst{11-15} = XA{4-0}; 9765abe6c31SLei Huang let Inst{16-20} = XB{4-0}; 9775abe6c31SLei Huang let Inst{21-28} = xo; 9785abe6c31SLei Huang let Inst{29} = XA{5}; 9795abe6c31SLei Huang let Inst{30} = XB{5}; 9805abe6c31SLei Huang let Inst{31} = 0; 9815abe6c31SLei Huang} 9825abe6c31SLei Huang 9835abe6c31SLei Huangclass MMIRR_XX3Form_XY4P2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 9845abe6c31SLei Huang string asmstr, InstrItinClass itin, 9855abe6c31SLei Huang list<dag> pattern> 9865abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 9875abe6c31SLei Huang bits<3> AT; 9885abe6c31SLei Huang bits<6> XA; 9895abe6c31SLei Huang bits<6> XB; 9905abe6c31SLei Huang bits<4> XMSK; 9915abe6c31SLei Huang bits<4> YMSK; 9925abe6c31SLei Huang bits<2> PMSK; 9935abe6c31SLei Huang 9945abe6c31SLei Huang let Pattern = pattern; 9955abe6c31SLei Huang 9965abe6c31SLei Huang // The prefix. 9975abe6c31SLei Huang let Inst{6-7} = 3; 9985abe6c31SLei Huang let Inst{8-11} = 9; 9995abe6c31SLei Huang let Inst{12-15} = 0; 10005abe6c31SLei Huang let Inst{16-17} = PMSK; 10015abe6c31SLei Huang let Inst{18-23} = 0; 10025abe6c31SLei Huang let Inst{24-27} = XMSK; 10035abe6c31SLei Huang let Inst{28-31} = YMSK; 10045abe6c31SLei Huang 10055abe6c31SLei Huang // The instruction. 10065abe6c31SLei Huang let Inst{38-40} = AT; 10075abe6c31SLei Huang let Inst{41-42} = 0; 10085abe6c31SLei Huang let Inst{43-47} = XA{4-0}; 10095abe6c31SLei Huang let Inst{48-52} = XB{4-0}; 10105abe6c31SLei Huang let Inst{53-60} = xo; 10115abe6c31SLei Huang let Inst{61} = XA{5}; 10125abe6c31SLei Huang let Inst{62} = XB{5}; 10135abe6c31SLei Huang let Inst{63} = 0; 10145abe6c31SLei Huang} 10155abe6c31SLei Huang 10165abe6c31SLei Huangclass MMIRR_XX3Form_XY4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 10175abe6c31SLei Huang string asmstr, InstrItinClass itin, 10185abe6c31SLei Huang list<dag> pattern> 10195abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 10205abe6c31SLei Huang bits<3> AT; 10215abe6c31SLei Huang bits<6> XA; 10225abe6c31SLei Huang bits<6> XB; 10235abe6c31SLei Huang bits<4> XMSK; 10245abe6c31SLei Huang bits<4> YMSK; 10255abe6c31SLei Huang 10265abe6c31SLei Huang let Pattern = pattern; 10275abe6c31SLei Huang 10285abe6c31SLei Huang // The prefix. 10295abe6c31SLei Huang let Inst{6-7} = 3; 10305abe6c31SLei Huang let Inst{8-11} = 9; 10315abe6c31SLei Huang let Inst{12-23} = 0; 10325abe6c31SLei Huang let Inst{24-27} = XMSK; 10335abe6c31SLei Huang let Inst{28-31} = YMSK; 10345abe6c31SLei Huang 10355abe6c31SLei Huang // The instruction. 10365abe6c31SLei Huang let Inst{38-40} = AT; 10375abe6c31SLei Huang let Inst{41-42} = 0; 10385abe6c31SLei Huang let Inst{43-47} = XA{4-0}; 10395abe6c31SLei Huang let Inst{48-52} = XB{4-0}; 10405abe6c31SLei Huang let Inst{53-60} = xo; 10415abe6c31SLei Huang let Inst{61} = XA{5}; 10425abe6c31SLei Huang let Inst{62} = XB{5}; 10435abe6c31SLei Huang let Inst{63} = 0; 10445abe6c31SLei Huang} 10455abe6c31SLei Huang 10465abe6c31SLei Huangclass MMIRR_XX3Form_X4Y2_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 10475abe6c31SLei Huang string asmstr, InstrItinClass itin, 10485abe6c31SLei Huang list<dag> pattern> 10495abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 10505abe6c31SLei Huang bits<3> AT; 10515abe6c31SLei Huang bits<6> XA; 10525abe6c31SLei Huang bits<6> XB; 10535abe6c31SLei Huang bits<4> XMSK; 10545abe6c31SLei Huang bits<2> YMSK; 10555abe6c31SLei Huang 10565abe6c31SLei Huang let Pattern = pattern; 10575abe6c31SLei Huang 10585abe6c31SLei Huang // The prefix. 10595abe6c31SLei Huang let Inst{6-7} = 3; 10605abe6c31SLei Huang let Inst{8-11} = 9; 10615abe6c31SLei Huang let Inst{12-23} = 0; 10625abe6c31SLei Huang let Inst{24-27} = XMSK; 10635abe6c31SLei Huang let Inst{28-29} = YMSK; 10645abe6c31SLei Huang let Inst{30-31} = 0; 10655abe6c31SLei Huang 10665abe6c31SLei Huang // The instruction. 10675abe6c31SLei Huang let Inst{38-40} = AT; 10685abe6c31SLei Huang let Inst{41-42} = 0; 10695abe6c31SLei Huang let Inst{43-47} = XA{4-0}; 10705abe6c31SLei Huang let Inst{48-52} = XB{4-0}; 10715abe6c31SLei Huang let Inst{53-60} = xo; 10725abe6c31SLei Huang let Inst{61} = XA{5}; 10735abe6c31SLei Huang let Inst{62} = XB{5}; 10745abe6c31SLei Huang let Inst{63} = 0; 10755abe6c31SLei Huang} 10765abe6c31SLei Huang 10775abe6c31SLei Huangclass MMIRR_XX3Form_XY4P8_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 10785abe6c31SLei Huang string asmstr, InstrItinClass itin, 10795abe6c31SLei Huang list<dag> pattern> 10805abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 10815abe6c31SLei Huang bits<3> AT; 10825abe6c31SLei Huang bits<6> XA; 10835abe6c31SLei Huang bits<6> XB; 10845abe6c31SLei Huang bits<4> XMSK; 10855abe6c31SLei Huang bits<4> YMSK; 10865abe6c31SLei Huang bits<8> PMSK; 10875abe6c31SLei Huang 10885abe6c31SLei Huang let Pattern = pattern; 10895abe6c31SLei Huang 10905abe6c31SLei Huang // The prefix. 10915abe6c31SLei Huang let Inst{6-7} = 3; 10925abe6c31SLei Huang let Inst{8-11} = 9; 10935abe6c31SLei Huang let Inst{12-15} = 0; 10945abe6c31SLei Huang let Inst{16-23} = PMSK; 10955abe6c31SLei Huang let Inst{24-27} = XMSK; 10965abe6c31SLei Huang let Inst{28-31} = YMSK; 10975abe6c31SLei Huang 10985abe6c31SLei Huang // The instruction. 10995abe6c31SLei Huang let Inst{38-40} = AT; 11005abe6c31SLei Huang let Inst{41-42} = 0; 11015abe6c31SLei Huang let Inst{43-47} = XA{4-0}; 11025abe6c31SLei Huang let Inst{48-52} = XB{4-0}; 11035abe6c31SLei Huang let Inst{53-60} = xo; 11045abe6c31SLei Huang let Inst{61} = XA{5}; 11055abe6c31SLei Huang let Inst{62} = XB{5}; 11065abe6c31SLei Huang let Inst{63} = 0; 11075abe6c31SLei Huang} 11085abe6c31SLei Huang 11095abe6c31SLei Huangclass MMIRR_XX3Form_XYP4_XAB6<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, 11105abe6c31SLei Huang string asmstr, InstrItinClass itin, 11115abe6c31SLei Huang list<dag> pattern> 11125abe6c31SLei Huang : PI<1, opcode, OOL, IOL, asmstr, itin> { 11135abe6c31SLei Huang bits<3> AT; 11145abe6c31SLei Huang bits<6> XA; 11155abe6c31SLei Huang bits<6> XB; 11165abe6c31SLei Huang bits<4> XMSK; 11175abe6c31SLei Huang bits<4> YMSK; 11185abe6c31SLei Huang bits<4> PMSK; 11195abe6c31SLei Huang 11205abe6c31SLei Huang let Pattern = pattern; 11215abe6c31SLei Huang 11225abe6c31SLei Huang // The prefix. 11235abe6c31SLei Huang let Inst{6-7} = 3; 11245abe6c31SLei Huang let Inst{8-11} = 9; 11255abe6c31SLei Huang let Inst{12-15} = 0; 11265abe6c31SLei Huang let Inst{16-19} = PMSK; 11275abe6c31SLei Huang let Inst{20-23} = 0; 11285abe6c31SLei Huang let Inst{24-27} = XMSK; 11295abe6c31SLei Huang let Inst{28-31} = YMSK; 11305abe6c31SLei Huang 11315abe6c31SLei Huang // The instruction. 11325abe6c31SLei Huang let Inst{38-40} = AT; 11335abe6c31SLei Huang let Inst{41-42} = 0; 11345abe6c31SLei Huang let Inst{43-47} = XA{4-0}; 11355abe6c31SLei Huang let Inst{48-52} = XB{4-0}; 11365abe6c31SLei Huang let Inst{53-60} = xo; 11375abe6c31SLei Huang let Inst{61} = XA{5}; 11385abe6c31SLei Huang let Inst{62} = XB{5}; 11395abe6c31SLei Huang let Inst{63} = 0; 11405abe6c31SLei Huang} 11415abe6c31SLei Huang 11425abe6c31SLei Huang 11435abe6c31SLei Huang 11445abe6c31SLei Huangdef Concats { 11455abe6c31SLei Huang dag VecsToVecPair0 = 11465abe6c31SLei Huang (v256i1 (INSERT_SUBREG 11475abe6c31SLei Huang (INSERT_SUBREG (IMPLICIT_DEF), $vs0, sub_vsx1), 11485abe6c31SLei Huang $vs1, sub_vsx0)); 11495abe6c31SLei Huang dag VecsToVecPair1 = 11505abe6c31SLei Huang (v256i1 (INSERT_SUBREG 11515abe6c31SLei Huang (INSERT_SUBREG (IMPLICIT_DEF), $vs2, sub_vsx1), 11525abe6c31SLei Huang $vs3, sub_vsx0)); 11535abe6c31SLei Huang} 11545abe6c31SLei Huang 11555abe6c31SLei Huanglet Predicates = [PairedVectorMemops] in { 11565abe6c31SLei Huang def : Pat<(v256i1 (PPCPairBuild v4i32:$vs1, v4i32:$vs0)), 11575abe6c31SLei Huang Concats.VecsToVecPair0>; 11585abe6c31SLei Huang def : Pat<(v256i1 (int_ppc_vsx_assemble_pair v16i8:$vs1, v16i8:$vs0)), 11595abe6c31SLei Huang Concats.VecsToVecPair0>; 11605abe6c31SLei Huang def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 0)), 11615abe6c31SLei Huang (v4i32 (EXTRACT_SUBREG $v, sub_vsx0))>; 11625abe6c31SLei Huang def : Pat<(v4i32 (PPCPairExtractVsx vsrpevenrc:$v, 1)), 11635abe6c31SLei Huang (v4i32 (EXTRACT_SUBREG $v, sub_vsx1))>; 11645abe6c31SLei Huang 1165b41dbe60Szhijian lin let mayLoad = 1, mayStore = 0 in { 11665abe6c31SLei Huang def LXVP : DQForm_XTp5_RA17_MEM<6, 0, (outs vsrprc:$XTp), 11670be684edSJames Y Knight (ins (memrix16 $DQ, $RA):$addr), "lxvp $XTp, $addr", 11685abe6c31SLei Huang IIC_LdStLFD, []>; 11694b43ef3eSJames Y Knight def LXVPX : XForm_XTp5_XAB5<31, 333, (outs vsrprc:$XTp), (ins (memrr $RA, $RB):$addr), 11704b43ef3eSJames Y Knight "lxvpx $XTp, $addr", IIC_LdStLFD, 11715abe6c31SLei Huang []>; 11725abe6c31SLei Huang } 11735abe6c31SLei Huang 1174b41dbe60Szhijian lin let mayLoad = 0, mayStore = 1 in { 11755abe6c31SLei Huang def STXVP : DQForm_XTp5_RA17_MEM<6, 1, (outs), (ins vsrprc:$XTp, 11760be684edSJames Y Knight (memrix16 $DQ, $RA):$addr), "stxvp $XTp, $addr", 11775abe6c31SLei Huang IIC_LdStLFD, []>; 11784b43ef3eSJames Y Knight def STXVPX : XForm_XTp5_XAB5<31, 461, (outs), (ins vsrprc:$XTp, (memrr $RA, $RB):$addr), 11794b43ef3eSJames Y Knight "stxvpx $XTp, $addr", IIC_LdStLFD, 11805abe6c31SLei Huang []>; 11815abe6c31SLei Huang } 1182b41dbe60Szhijian lin} 11836127f15eSzhijian linlet mayLoad = 1, mayStore = 0, Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in { 11845abe6c31SLei Huang defm PLXVP : 11850be684edSJames Y Knight 8LS_DForm_R_XTp5_SI34_MEM_p<58, (outs vsrprc:$XTp), (ins (memri34 $D, $RA):$addr), 1186ea8b95d0SStefan Pintilie (ins (memri34_pcrel $D, $RA):$addr), 1187ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$D), 1188ea8b95d0SStefan Pintilie "plxvp $XTp, $addr", "plxvp $XTp, $D", 11895abe6c31SLei Huang IIC_LdStLFD>; 11905abe6c31SLei Huang} 11915abe6c31SLei Huang 11926127f15eSzhijian linlet mayLoad = 0, mayStore = 1, Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in { 11935abe6c31SLei Huang defm PSTXVP : 11940be684edSJames Y Knight 8LS_DForm_R_XTp5_SI34_MEM_p<62, (outs), (ins vsrprc:$XTp, (memri34 $D, $RA):$addr), 11950be684edSJames Y Knight (ins vsrprc:$XTp, (memri34_pcrel $D, $RA):$addr), 1196ea8b95d0SStefan Pintilie (ins vsrprc:$XTp, s34imm_pcrel:$D), 1197ea8b95d0SStefan Pintilie "pstxvp $XTp, $addr", "pstxvp $XTp, $D", IIC_LdStLFD>; 11985abe6c31SLei Huang} 11995abe6c31SLei Huang 12005abe6c31SLei Huanglet Predicates = [PairedVectorMemops] in { 12015abe6c31SLei Huang // Intrinsics for Paired Vector Loads. 12025abe6c31SLei Huang def : Pat<(v256i1 (int_ppc_vsx_lxvp DQForm:$src)), (LXVP memrix16:$src)>; 12035abe6c31SLei Huang def : Pat<(v256i1 (int_ppc_vsx_lxvp XForm:$src)), (LXVPX XForm:$src)>; 12046127f15eSzhijian lin let Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in { 12055abe6c31SLei Huang def : Pat<(v256i1 (int_ppc_vsx_lxvp PDForm:$src)), (PLXVP memri34:$src)>; 12065abe6c31SLei Huang } 12075abe6c31SLei Huang // Intrinsics for Paired Vector Stores. 12085abe6c31SLei Huang def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, DQForm:$dst), 12095abe6c31SLei Huang (STXVP $XSp, memrix16:$dst)>; 12105abe6c31SLei Huang def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, XForm:$dst), 12115abe6c31SLei Huang (STXVPX $XSp, XForm:$dst)>; 12126127f15eSzhijian lin let Predicates = [PairedVectorMemops, PrefixInstrs, HasP10Vector] in { 12135abe6c31SLei Huang def : Pat<(int_ppc_vsx_stxvp v256i1:$XSp, PDForm:$dst), 12145abe6c31SLei Huang (PSTXVP $XSp, memri34:$dst)>; 12155abe6c31SLei Huang } 12165abe6c31SLei Huang} 12175abe6c31SLei Huang 1218c19f905fSMaryam Moghadaslet Predicates = [IsISA3_1] in { 1219c19f905fSMaryam Moghadas def XSCMPEQQP : X_VT5_VA5_VB5<63, 68, "xscmpeqqp", []>; 1220c19f905fSMaryam Moghadas def XSCMPGEQP : X_VT5_VA5_VB5<63, 196, "xscmpgeqp", []>; 1221c19f905fSMaryam Moghadas def XSCMPGTQP : X_VT5_VA5_VB5<63, 228, "xscmpgtqp", []>; 1222c19f905fSMaryam Moghadas} 1223c19f905fSMaryam Moghadas 12245abe6c31SLei Huanglet Predicates = [PCRelativeMemops] in { 12255abe6c31SLei Huang // Load i32 12265abe6c31SLei Huang def : Pat<(i32 (zextloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 12275abe6c31SLei Huang (PLBZpc $ga, 0)>; 12285abe6c31SLei Huang def : Pat<(i32 (extloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 12295abe6c31SLei Huang (PLBZpc $ga, 0)>; 12305abe6c31SLei Huang def : Pat<(i32 (zextloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 12315abe6c31SLei Huang (PLBZpc $ga, 0)>; 12325abe6c31SLei Huang def : Pat<(i32 (extloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 12335abe6c31SLei Huang (PLBZpc $ga, 0)>; 12345abe6c31SLei Huang def : Pat<(i32 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 12355abe6c31SLei Huang (PLHApc $ga, 0)>; 12365abe6c31SLei Huang def : Pat<(i32 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 12375abe6c31SLei Huang (PLHZpc $ga, 0)>; 12385abe6c31SLei Huang def : Pat<(i32 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 12395abe6c31SLei Huang (PLHZpc $ga, 0)>; 12405abe6c31SLei Huang def : Pat<(i32 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLWZpc $ga, 0)>; 12415abe6c31SLei Huang 12425abe6c31SLei Huang // Store i32 12435abe6c31SLei Huang def : Pat<(truncstorei8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 12445abe6c31SLei Huang (PSTBpc $RS, $ga, 0)>; 12455abe6c31SLei Huang def : Pat<(truncstorei16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 12465abe6c31SLei Huang (PSTHpc $RS, $ga, 0)>; 12475abe6c31SLei Huang def : Pat<(store i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 12485abe6c31SLei Huang (PSTWpc $RS, $ga, 0)>; 12495abe6c31SLei Huang 12505abe6c31SLei Huang // Load i64 12515abe6c31SLei Huang def : Pat<(i64 (zextloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 12525abe6c31SLei Huang (PLBZ8pc $ga, 0)>; 12535abe6c31SLei Huang def : Pat<(i64 (extloadi1 (PPCmatpcreladdr PCRelForm:$ga))), 12545abe6c31SLei Huang (PLBZ8pc $ga, 0)>; 12555abe6c31SLei Huang def : Pat<(i64 (zextloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 12565abe6c31SLei Huang (PLBZ8pc $ga, 0)>; 12575abe6c31SLei Huang def : Pat<(i64 (extloadi8 (PPCmatpcreladdr PCRelForm:$ga))), 12585abe6c31SLei Huang (PLBZ8pc $ga, 0)>; 12595abe6c31SLei Huang def : Pat<(i64 (sextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 12605abe6c31SLei Huang (PLHA8pc $ga, 0)>; 12615abe6c31SLei Huang def : Pat<(i64 (zextloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 12625abe6c31SLei Huang (PLHZ8pc $ga, 0)>; 12635abe6c31SLei Huang def : Pat<(i64 (extloadi16 (PPCmatpcreladdr PCRelForm:$ga))), 12645abe6c31SLei Huang (PLHZ8pc $ga, 0)>; 12655abe6c31SLei Huang def : Pat<(i64 (zextloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 12665abe6c31SLei Huang (PLWZ8pc $ga, 0)>; 12675abe6c31SLei Huang def : Pat<(i64 (sextloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 12685abe6c31SLei Huang (PLWA8pc $ga, 0)>; 12695abe6c31SLei Huang def : Pat<(i64 (extloadi32 (PPCmatpcreladdr PCRelForm:$ga))), 12705abe6c31SLei Huang (PLWZ8pc $ga, 0)>; 12715abe6c31SLei Huang def : Pat<(i64 (load (PPCmatpcreladdr PCRelForm:$ga))), (PLDpc $ga, 0)>; 12725abe6c31SLei Huang 12735abe6c31SLei Huang // Store i64 12745abe6c31SLei Huang def : Pat<(truncstorei8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 12755abe6c31SLei Huang (PSTB8pc $RS, $ga, 0)>; 12765abe6c31SLei Huang def : Pat<(truncstorei16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 12775abe6c31SLei Huang (PSTH8pc $RS, $ga, 0)>; 12785abe6c31SLei Huang def : Pat<(truncstorei32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 12795abe6c31SLei Huang (PSTW8pc $RS, $ga, 0)>; 12805abe6c31SLei Huang def : Pat<(store i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 12815abe6c31SLei Huang (PSTDpc $RS, $ga, 0)>; 12825abe6c31SLei Huang 1283b41dbe60Szhijian lin // Atomic Load 1284b41dbe60Szhijian lin def : Pat<(i32 (atomic_load_8 (PPCmatpcreladdr PCRelForm:$ga))), 1285b41dbe60Szhijian lin (PLBZpc $ga, 0)>; 1286b41dbe60Szhijian lin def : Pat<(i32 (atomic_load_16 (PPCmatpcreladdr PCRelForm:$ga))), 1287b41dbe60Szhijian lin (PLHZpc $ga, 0)>; 1288b41dbe60Szhijian lin def : Pat<(i32 (atomic_load_32 (PPCmatpcreladdr PCRelForm:$ga))), 1289b41dbe60Szhijian lin (PLWZpc $ga, 0)>; 1290b41dbe60Szhijian lin def : Pat<(i64 (atomic_load_64 (PPCmatpcreladdr PCRelForm:$ga))), 1291b41dbe60Szhijian lin (PLDpc $ga, 0)>; 1292b41dbe60Szhijian lin 1293b41dbe60Szhijian lin // Atomic Store 1294b41dbe60Szhijian lin def : Pat<(atomic_store_8 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1295b41dbe60Szhijian lin (PSTBpc $RS, $ga, 0)>; 1296b41dbe60Szhijian lin def : Pat<(atomic_store_16 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1297b41dbe60Szhijian lin (PSTHpc $RS, $ga, 0)>; 1298b41dbe60Szhijian lin def : Pat<(atomic_store_32 i32:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1299b41dbe60Szhijian lin (PSTWpc $RS, $ga, 0)>; 1300b41dbe60Szhijian lin def : Pat<(atomic_store_8 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1301b41dbe60Szhijian lin (PSTB8pc $RS, $ga, 0)>; 1302b41dbe60Szhijian lin def : Pat<(atomic_store_16 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1303b41dbe60Szhijian lin (PSTH8pc $RS, $ga, 0)>; 1304b41dbe60Szhijian lin def : Pat<(atomic_store_32 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1305b41dbe60Szhijian lin (PSTW8pc $RS, $ga, 0)>; 1306b41dbe60Szhijian lin def : Pat<(atomic_store_64 i64:$RS, (PPCmatpcreladdr PCRelForm:$ga)), 1307b41dbe60Szhijian lin (PSTDpc $RS, $ga, 0)>; 1308b41dbe60Szhijian lin 1309b41dbe60Szhijian lin // If the PPCmatpcreladdr node is not caught by any other pattern it should be 1310b41dbe60Szhijian lin // caught here and turned into a paddi instruction to materialize the address. 1311b41dbe60Szhijian lin def : Pat<(PPCmatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>; 1312b41dbe60Szhijian lin // PPCtlsdynamatpcreladdr node is used for TLS dynamic models to materialize 1313b41dbe60Szhijian lin // tls global address with paddi instruction. 1314b41dbe60Szhijian lin def : Pat<(PPCtlsdynamatpcreladdr PCRelForm:$addr), (PADDI8pc 0, $addr)>; 1315b41dbe60Szhijian lin // PPCtlslocalexecmataddr node is used for TLS local exec models to 1316b41dbe60Szhijian lin // materialize tls global address with paddi instruction. 1317b41dbe60Szhijian lin def : Pat<(PPCaddTls i64:$in, (PPCtlslocalexecmataddr tglobaltlsaddr:$addr)), 1318b41dbe60Szhijian lin (PADDI8 $in, $addr)>; 13196127f15eSzhijian lin} 13206127f15eSzhijian lin 13216127f15eSzhijian linlet Predicates = [PCRelativeMemops, HasFPU] in { 13225abe6c31SLei Huang // Load f32 13235abe6c31SLei Huang def : Pat<(f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFSpc $addr, 0)>; 13245abe6c31SLei Huang 13255abe6c31SLei Huang // Store f32 13265abe6c31SLei Huang def : Pat<(store f32:$FRS, (PPCmatpcreladdr PCRelForm:$ga)), 13275abe6c31SLei Huang (PSTFSpc $FRS, $ga, 0)>; 13285abe6c31SLei Huang 13295abe6c31SLei Huang // Load f64 13305abe6c31SLei Huang def : Pat<(f64 (extloadf32 (PPCmatpcreladdr PCRelForm:$addr))), 13315abe6c31SLei Huang (COPY_TO_REGCLASS (PLFSpc $addr, 0), VSFRC)>; 13325abe6c31SLei Huang def : Pat<(f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLFDpc $addr, 0)>; 13335abe6c31SLei Huang 13345abe6c31SLei Huang // Store f64 13355abe6c31SLei Huang def : Pat<(store f64:$FRS, (PPCmatpcreladdr PCRelForm:$ga)), 13365abe6c31SLei Huang (PSTFDpc $FRS, $ga, 0)>; 13375abe6c31SLei Huang 13386127f15eSzhijian lin def : Pat<(v4f32 (PPCldvsxlh (PPCmatpcreladdr PCRelForm:$addr))), 13396127f15eSzhijian lin (SUBREG_TO_REG (i64 1), (PLFDpc $addr, 0), sub_64)>; 13406127f15eSzhijian lin} 13416127f15eSzhijian lin 13426127f15eSzhijian linlet Predicates = [PCRelativeMemops, HasP10Vector] in { 13435abe6c31SLei Huang // Load f128 13445abe6c31SLei Huang def : Pat<(f128 (load (PPCmatpcreladdr PCRelForm:$addr))), 13455abe6c31SLei Huang (COPY_TO_REGCLASS (PLXVpc $addr, 0), VRRC)>; 13465abe6c31SLei Huang 13475abe6c31SLei Huang // Store f128 13485abe6c31SLei Huang def : Pat<(store f128:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 13495abe6c31SLei Huang (PSTXVpc (COPY_TO_REGCLASS $XS, VSRC), $ga, 0)>; 13505abe6c31SLei Huang 13515abe6c31SLei Huang // Load v4i32 13525abe6c31SLei Huang def : Pat<(v4i32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 13535abe6c31SLei Huang 13545abe6c31SLei Huang // Store v4i32 13555abe6c31SLei Huang def : Pat<(store v4i32:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 13565abe6c31SLei Huang (PSTXVpc $XS, $ga, 0)>; 13575abe6c31SLei Huang 13585abe6c31SLei Huang // Load v2i64 13595abe6c31SLei Huang def : Pat<(v2i64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 13605abe6c31SLei Huang 13615abe6c31SLei Huang // Store v2i64 13625abe6c31SLei Huang def : Pat<(store v2i64:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 13635abe6c31SLei Huang (PSTXVpc $XS, $ga, 0)>; 13645abe6c31SLei Huang 13655abe6c31SLei Huang // Load v4f32 13665abe6c31SLei Huang def : Pat<(v4f32 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 13675abe6c31SLei Huang 13685abe6c31SLei Huang // Store v4f32 13695abe6c31SLei Huang def : Pat<(store v4f32:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 13705abe6c31SLei Huang (PSTXVpc $XS, $ga, 0)>; 13715abe6c31SLei Huang 13725abe6c31SLei Huang // Load v2f64 13735abe6c31SLei Huang def : Pat<(v2f64 (load (PPCmatpcreladdr PCRelForm:$addr))), (PLXVpc $addr, 0)>; 13745abe6c31SLei Huang 13755abe6c31SLei Huang // Store v2f64 13765abe6c31SLei Huang def : Pat<(store v2f64:$XS, (PPCmatpcreladdr PCRelForm:$ga)), 13775abe6c31SLei Huang (PSTXVpc $XS, $ga, 0)>; 13785abe6c31SLei Huang 13796127f15eSzhijian lin // Special Cases For PPCstore_scal_int_from_vsr 13806127f15eSzhijian lin def : Pat<(PPCstore_scal_int_from_vsr f64:$src, (PPCmatpcreladdr PCRelForm:$dst), 8), 13816127f15eSzhijian lin (PSTXSDpc $src, $dst, 0)>; 13826127f15eSzhijian lin def : Pat<(PPCstore_scal_int_from_vsr f128:$src, (PPCmatpcreladdr PCRelForm:$dst), 8), 13836127f15eSzhijian lin (PSTXSDpc (COPY_TO_REGCLASS $src, VFRC), $dst, 0)>; 13846127f15eSzhijian lin} 13856127f15eSzhijian lin 13865abe6c31SLei Huang// XXSPLTIW/DP/32DX need extra flags to make sure the compiler does not attempt 13875abe6c31SLei Huang// to spill part of the instruction when the values are similar. 13885abe6c31SLei Huanglet isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1, Predicates = [PrefixInstrs] in { 13895abe6c31SLei Huang def XXSPLTIW : 8RR_DForm_IMM32_XT6<32, 3, (outs vsrc:$XT), 13905abe6c31SLei Huang (ins i32imm:$IMM32), 13915abe6c31SLei Huang "xxspltiw $XT, $IMM32", IIC_VecGeneral, 13925abe6c31SLei Huang []>; 13935abe6c31SLei Huang def XXSPLTIDP : 8RR_DForm_IMM32_XT6<32, 2, (outs vsrc:$XT), 13945abe6c31SLei Huang (ins i32imm:$IMM32), 13955abe6c31SLei Huang "xxspltidp $XT, $IMM32", IIC_VecGeneral, 13965abe6c31SLei Huang [(set v2f64:$XT, 13975abe6c31SLei Huang (PPCxxspltidp i32:$IMM32))]>; 13985abe6c31SLei Huang def XXSPLTI32DX : 13995abe6c31SLei Huang 8RR_DForm_IMM32_XT6_IX<32, 0, (outs vsrc:$XT), 14005abe6c31SLei Huang (ins vsrc:$XTi, u1imm:$IX, i32imm:$IMM32), 14015abe6c31SLei Huang "xxsplti32dx $XT, $IX, $IMM32", IIC_VecGeneral, 14025abe6c31SLei Huang [(set v2i64:$XT, 14035abe6c31SLei Huang (PPCxxsplti32dx v2i64:$XTi, i32:$IX, 14045abe6c31SLei Huang i32:$IMM32))]>, 14055abe6c31SLei Huang RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">; 14065abe6c31SLei Huang} 14075abe6c31SLei Huang 14085abe6c31SLei Huanglet Predicates = [IsISA3_1] in { 14094b43ef3eSJames Y Knight def SETBC : XForm_XT5_BI5<31, 384, (outs gprc:$RST), (ins crbitrc:$BI), 1410*a4751804SRolandF77 "setbc $RST, $BI", IIC_IntCompare, 1411*a4751804SRolandF77 [(set i32:$RST, (PPCsetbc i1:$BI))]>, 14121492c88fSStefan Pintilie SExt32To64, ZExt32To64; 14134b43ef3eSJames Y Knight def SETBCR : XForm_XT5_BI5<31, 416, (outs gprc:$RST), (ins crbitrc:$BI), 1414*a4751804SRolandF77 "setbcr $RST, $BI", IIC_IntCompare, 1415*a4751804SRolandF77 [(set i32:$RST, (PPCsetbcr i1:$BI))]>, 14161492c88fSStefan Pintilie SExt32To64, ZExt32To64; 14174b43ef3eSJames Y Knight def SETNBC : XForm_XT5_BI5<31, 448, (outs gprc:$RST), (ins crbitrc:$BI), 14184b43ef3eSJames Y Knight "setnbc $RST, $BI", IIC_IntCompare, []>, 14191492c88fSStefan Pintilie SExt32To64; 14204b43ef3eSJames Y Knight def SETNBCR : XForm_XT5_BI5<31, 480, (outs gprc:$RST), (ins crbitrc:$BI), 14214b43ef3eSJames Y Knight "setnbcr $RST, $BI", IIC_IntCompare, []>, 14221492c88fSStefan Pintilie SExt32To64; 14235abe6c31SLei Huang 14245abe6c31SLei Huang let Interpretation64Bit = 1, isCodeGenOnly = 1 in { 14254b43ef3eSJames Y Knight def SETBC8 : XForm_XT5_BI5<31, 384, (outs g8rc:$RST), (ins crbitrc:$BI), 14264b43ef3eSJames Y Knight "setbc $RST, $BI", IIC_IntCompare, []>, 14271492c88fSStefan Pintilie SExt32To64, ZExt32To64; 14284b43ef3eSJames Y Knight def SETBCR8 : XForm_XT5_BI5<31, 416, (outs g8rc:$RST), (ins crbitrc:$BI), 14294b43ef3eSJames Y Knight "setbcr $RST, $BI", IIC_IntCompare, []>, 14301492c88fSStefan Pintilie SExt32To64, ZExt32To64; 14314b43ef3eSJames Y Knight def SETNBC8 : XForm_XT5_BI5<31, 448, (outs g8rc:$RST), (ins crbitrc:$BI), 14324b43ef3eSJames Y Knight "setnbc $RST, $BI", IIC_IntCompare, []>, 14331492c88fSStefan Pintilie SExt32To64; 14344b43ef3eSJames Y Knight def SETNBCR8 : XForm_XT5_BI5<31, 480, (outs g8rc:$RST), (ins crbitrc:$BI), 14354b43ef3eSJames Y Knight "setnbcr $RST, $BI", IIC_IntCompare, []>, 14361492c88fSStefan Pintilie SExt32To64; 14375abe6c31SLei Huang } 14385abe6c31SLei Huang 14395abe6c31SLei Huang def VSLDBI : VNForm_VTAB5_SD3<22, 0, (outs vrrc:$VRT), 14404b43ef3eSJames Y Knight (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SD), 14414b43ef3eSJames Y Knight "vsldbi $VRT, $VRA, $VRB, $SD", 14425abe6c31SLei Huang IIC_VecGeneral, 14435abe6c31SLei Huang [(set v16i8:$VRT, 14445abe6c31SLei Huang (int_ppc_altivec_vsldbi v16i8:$VRA, 14455abe6c31SLei Huang v16i8:$VRB, 14464b43ef3eSJames Y Knight timm:$SD))]>; 14475abe6c31SLei Huang def VSRDBI : VNForm_VTAB5_SD3<22, 1, (outs vrrc:$VRT), 14484b43ef3eSJames Y Knight (ins vrrc:$VRA, vrrc:$VRB, u3imm:$SD), 14494b43ef3eSJames Y Knight "vsrdbi $VRT, $VRA, $VRB, $SD", 14505abe6c31SLei Huang IIC_VecGeneral, 14515abe6c31SLei Huang [(set v16i8:$VRT, 14525abe6c31SLei Huang (int_ppc_altivec_vsrdbi v16i8:$VRA, 14535abe6c31SLei Huang v16i8:$VRB, 14544b43ef3eSJames Y Knight timm:$SD))]>; 14554b43ef3eSJames Y Knight defm VSTRIBR : VXForm_VTB5_RCr<13, 1, (outs vrrc:$VT), (ins vrrc:$VB), 14564b43ef3eSJames Y Knight "vstribr", "$VT, $VB", IIC_VecGeneral, 14574b43ef3eSJames Y Knight [(set v16i8:$VT, 14584b43ef3eSJames Y Knight (int_ppc_altivec_vstribr v16i8:$VB))]>; 14594b43ef3eSJames Y Knight defm VSTRIBL : VXForm_VTB5_RCr<13, 0, (outs vrrc:$VT), (ins vrrc:$VB), 14604b43ef3eSJames Y Knight "vstribl", "$VT, $VB", IIC_VecGeneral, 14614b43ef3eSJames Y Knight [(set v16i8:$VT, 14624b43ef3eSJames Y Knight (int_ppc_altivec_vstribl v16i8:$VB))]>; 14634b43ef3eSJames Y Knight defm VSTRIHR : VXForm_VTB5_RCr<13, 3, (outs vrrc:$VT), (ins vrrc:$VB), 14644b43ef3eSJames Y Knight "vstrihr", "$VT, $VB", IIC_VecGeneral, 14654b43ef3eSJames Y Knight [(set v8i16:$VT, 14664b43ef3eSJames Y Knight (int_ppc_altivec_vstrihr v8i16:$VB))]>; 14674b43ef3eSJames Y Knight defm VSTRIHL : VXForm_VTB5_RCr<13, 2, (outs vrrc:$VT), (ins vrrc:$VB), 14684b43ef3eSJames Y Knight "vstrihl", "$VT, $VB", IIC_VecGeneral, 14694b43ef3eSJames Y Knight [(set v8i16:$VT, 14704b43ef3eSJames Y Knight (int_ppc_altivec_vstrihl v8i16:$VB))]>; 14715abe6c31SLei Huang def VINSW : 14724b43ef3eSJames Y Knight VXForm_1<207, (outs vrrc:$VD), (ins vrrc:$VDi, u4imm:$VA, gprc:$VB), 14734b43ef3eSJames Y Knight "vinsw $VD, $VB, $VA", IIC_VecGeneral, 14744b43ef3eSJames Y Knight [(set v4i32:$VD, 14754b43ef3eSJames Y Knight (int_ppc_altivec_vinsw v4i32:$VDi, i32:$VB, timm:$VA))]>, 14764b43ef3eSJames Y Knight RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 14775abe6c31SLei Huang def VINSD : 14784b43ef3eSJames Y Knight VXForm_1<463, (outs vrrc:$VD), (ins vrrc:$VDi, u4imm:$VA, g8rc:$VB), 14794b43ef3eSJames Y Knight "vinsd $VD, $VB, $VA", IIC_VecGeneral, 14804b43ef3eSJames Y Knight [(set v2i64:$VD, 14814b43ef3eSJames Y Knight (int_ppc_altivec_vinsd v2i64:$VDi, i64:$VB, timm:$VA))]>, 14824b43ef3eSJames Y Knight RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 14835abe6c31SLei Huang def VINSBVLX : 14845abe6c31SLei Huang VXForm_VTB5_RA5_ins<15, "vinsbvlx", 14854b43ef3eSJames Y Knight [(set v16i8:$VD, 14864b43ef3eSJames Y Knight (int_ppc_altivec_vinsbvlx v16i8:$VDi, i32:$VA, 14874b43ef3eSJames Y Knight v16i8:$VB))]>; 14885abe6c31SLei Huang def VINSBVRX : 14895abe6c31SLei Huang VXForm_VTB5_RA5_ins<271, "vinsbvrx", 14904b43ef3eSJames Y Knight [(set v16i8:$VD, 14914b43ef3eSJames Y Knight (int_ppc_altivec_vinsbvrx v16i8:$VDi, i32:$VA, 14924b43ef3eSJames Y Knight v16i8:$VB))]>; 14935abe6c31SLei Huang def VINSHVLX : 14945abe6c31SLei Huang VXForm_VTB5_RA5_ins<79, "vinshvlx", 14954b43ef3eSJames Y Knight [(set v8i16:$VD, 14964b43ef3eSJames Y Knight (int_ppc_altivec_vinshvlx v8i16:$VDi, i32:$VA, 14974b43ef3eSJames Y Knight v8i16:$VB))]>; 14985abe6c31SLei Huang def VINSHVRX : 14995abe6c31SLei Huang VXForm_VTB5_RA5_ins<335, "vinshvrx", 15004b43ef3eSJames Y Knight [(set v8i16:$VD, 15014b43ef3eSJames Y Knight (int_ppc_altivec_vinshvrx v8i16:$VDi, i32:$VA, 15024b43ef3eSJames Y Knight v8i16:$VB))]>; 15035abe6c31SLei Huang def VINSWVLX : 15045abe6c31SLei Huang VXForm_VTB5_RA5_ins<143, "vinswvlx", 15054b43ef3eSJames Y Knight [(set v4i32:$VD, 15064b43ef3eSJames Y Knight (int_ppc_altivec_vinswvlx v4i32:$VDi, i32:$VA, 15074b43ef3eSJames Y Knight v4i32:$VB))]>; 15085abe6c31SLei Huang def VINSWVRX : 15095abe6c31SLei Huang VXForm_VTB5_RA5_ins<399, "vinswvrx", 15104b43ef3eSJames Y Knight [(set v4i32:$VD, 15114b43ef3eSJames Y Knight (int_ppc_altivec_vinswvrx v4i32:$VDi, i32:$VA, 15124b43ef3eSJames Y Knight v4i32:$VB))]>; 15135abe6c31SLei Huang def VINSBLX : 15145abe6c31SLei Huang VXForm_VRT5_RAB5_ins<527, "vinsblx", 15154b43ef3eSJames Y Knight [(set v16i8:$VD, 15164b43ef3eSJames Y Knight (int_ppc_altivec_vinsblx v16i8:$VDi, i32:$VA, 15174b43ef3eSJames Y Knight i32:$VB))]>; 15185abe6c31SLei Huang def VINSBRX : 15195abe6c31SLei Huang VXForm_VRT5_RAB5_ins<783, "vinsbrx", 15204b43ef3eSJames Y Knight [(set v16i8:$VD, 15214b43ef3eSJames Y Knight (int_ppc_altivec_vinsbrx v16i8:$VDi, i32:$VA, 15224b43ef3eSJames Y Knight i32:$VB))]>; 15235abe6c31SLei Huang def VINSHLX : 15245abe6c31SLei Huang VXForm_VRT5_RAB5_ins<591, "vinshlx", 15254b43ef3eSJames Y Knight [(set v8i16:$VD, 15264b43ef3eSJames Y Knight (int_ppc_altivec_vinshlx v8i16:$VDi, i32:$VA, 15274b43ef3eSJames Y Knight i32:$VB))]>; 15285abe6c31SLei Huang def VINSHRX : 15295abe6c31SLei Huang VXForm_VRT5_RAB5_ins<847, "vinshrx", 15304b43ef3eSJames Y Knight [(set v8i16:$VD, 15314b43ef3eSJames Y Knight (int_ppc_altivec_vinshrx v8i16:$VDi, i32:$VA, 15324b43ef3eSJames Y Knight i32:$VB))]>; 15335abe6c31SLei Huang def VINSWLX : 15345abe6c31SLei Huang VXForm_VRT5_RAB5_ins<655, "vinswlx", 15354b43ef3eSJames Y Knight [(set v4i32:$VD, 15364b43ef3eSJames Y Knight (int_ppc_altivec_vinswlx v4i32:$VDi, i32:$VA, 15374b43ef3eSJames Y Knight i32:$VB))]>; 15385abe6c31SLei Huang def VINSWRX : 15395abe6c31SLei Huang VXForm_VRT5_RAB5_ins<911, "vinswrx", 15404b43ef3eSJames Y Knight [(set v4i32:$VD, 15414b43ef3eSJames Y Knight (int_ppc_altivec_vinswrx v4i32:$VDi, i32:$VA, 15424b43ef3eSJames Y Knight i32:$VB))]>; 15435abe6c31SLei Huang def VINSDLX : 15444b43ef3eSJames Y Knight VXForm_1<719, (outs vrrc:$VD), (ins vrrc:$VDi, g8rc:$VA, g8rc:$VB), 15454b43ef3eSJames Y Knight "vinsdlx $VD, $VA, $VB", IIC_VecGeneral, 15464b43ef3eSJames Y Knight [(set v2i64:$VD, 15474b43ef3eSJames Y Knight (int_ppc_altivec_vinsdlx v2i64:$VDi, i64:$VA, i64:$VB))]>, 15484b43ef3eSJames Y Knight RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 15495abe6c31SLei Huang def VINSDRX : 15504b43ef3eSJames Y Knight VXForm_1<975, (outs vrrc:$VD), (ins vrrc:$VDi, g8rc:$VA, g8rc:$VB), 15514b43ef3eSJames Y Knight "vinsdrx $VD, $VA, $VB", IIC_VecGeneral, 15524b43ef3eSJames Y Knight [(set v2i64:$VD, 15534b43ef3eSJames Y Knight (int_ppc_altivec_vinsdrx v2i64:$VDi, i64:$VA, i64:$VB))]>, 15544b43ef3eSJames Y Knight RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 15554b43ef3eSJames Y Knight def VEXTRACTBM : VXForm_RD5_XO5_RS5<1602, 8, (outs gprc:$VD), (ins vrrc:$VB), 15564b43ef3eSJames Y Knight "vextractbm $VD, $VB", IIC_VecGeneral, 15574b43ef3eSJames Y Knight [(set i32:$VD, 15584b43ef3eSJames Y Knight (int_ppc_altivec_vextractbm v16i8:$VB))]>, 15591492c88fSStefan Pintilie ZExt32To64; 15604b43ef3eSJames Y Knight def VEXTRACTHM : VXForm_RD5_XO5_RS5<1602, 9, (outs gprc:$VD), (ins vrrc:$VB), 15614b43ef3eSJames Y Knight "vextracthm $VD, $VB", IIC_VecGeneral, 15624b43ef3eSJames Y Knight [(set i32:$VD, 15634b43ef3eSJames Y Knight (int_ppc_altivec_vextracthm v8i16:$VB))]>, 15641492c88fSStefan Pintilie ZExt32To64; 15654b43ef3eSJames Y Knight def VEXTRACTWM : VXForm_RD5_XO5_RS5<1602, 10, (outs gprc:$VD), (ins vrrc:$VB), 15664b43ef3eSJames Y Knight "vextractwm $VD, $VB", IIC_VecGeneral, 15674b43ef3eSJames Y Knight [(set i32:$VD, 15684b43ef3eSJames Y Knight (int_ppc_altivec_vextractwm v4i32:$VB))]>, 15691492c88fSStefan Pintilie ZExt32To64; 15704b43ef3eSJames Y Knight def VEXTRACTDM : VXForm_RD5_XO5_RS5<1602, 11, (outs gprc:$VD), (ins vrrc:$VB), 15714b43ef3eSJames Y Knight "vextractdm $VD, $VB", IIC_VecGeneral, 15724b43ef3eSJames Y Knight [(set i32:$VD, 15734b43ef3eSJames Y Knight (int_ppc_altivec_vextractdm v2i64:$VB))]>, 15741492c88fSStefan Pintilie ZExt32To64; 15754b43ef3eSJames Y Knight def VEXTRACTQM : VXForm_RD5_XO5_RS5<1602, 12, (outs gprc:$VD), (ins vrrc:$VB), 15764b43ef3eSJames Y Knight "vextractqm $VD, $VB", IIC_VecGeneral, 15774b43ef3eSJames Y Knight [(set i32:$VD, 15784b43ef3eSJames Y Knight (int_ppc_altivec_vextractqm v1i128:$VB))]>; 15794b43ef3eSJames Y Knight def VEXPANDBM : VXForm_RD5_XO5_RS5<1602, 0, (outs vrrc:$VD), (ins vrrc:$VB), 15804b43ef3eSJames Y Knight "vexpandbm $VD, $VB", IIC_VecGeneral, 15814b43ef3eSJames Y Knight [(set v16i8:$VD, (int_ppc_altivec_vexpandbm 15824b43ef3eSJames Y Knight v16i8:$VB))]>; 15834b43ef3eSJames Y Knight def VEXPANDHM : VXForm_RD5_XO5_RS5<1602, 1, (outs vrrc:$VD), (ins vrrc:$VB), 15844b43ef3eSJames Y Knight "vexpandhm $VD, $VB", IIC_VecGeneral, 15854b43ef3eSJames Y Knight [(set v8i16:$VD, (int_ppc_altivec_vexpandhm 15864b43ef3eSJames Y Knight v8i16:$VB))]>; 15874b43ef3eSJames Y Knight def VEXPANDWM : VXForm_RD5_XO5_RS5<1602, 2, (outs vrrc:$VD), (ins vrrc:$VB), 15884b43ef3eSJames Y Knight "vexpandwm $VD, $VB", IIC_VecGeneral, 15894b43ef3eSJames Y Knight [(set v4i32:$VD, (int_ppc_altivec_vexpandwm 15904b43ef3eSJames Y Knight v4i32:$VB))]>; 15914b43ef3eSJames Y Knight def VEXPANDDM : VXForm_RD5_XO5_RS5<1602, 3, (outs vrrc:$VD), (ins vrrc:$VB), 15924b43ef3eSJames Y Knight "vexpanddm $VD, $VB", IIC_VecGeneral, 15934b43ef3eSJames Y Knight [(set v2i64:$VD, (int_ppc_altivec_vexpanddm 15944b43ef3eSJames Y Knight v2i64:$VB))]>; 15954b43ef3eSJames Y Knight def VEXPANDQM : VXForm_RD5_XO5_RS5<1602, 4, (outs vrrc:$VD), (ins vrrc:$VB), 15964b43ef3eSJames Y Knight "vexpandqm $VD, $VB", IIC_VecGeneral, 15974b43ef3eSJames Y Knight [(set v1i128:$VD, (int_ppc_altivec_vexpandqm 15984b43ef3eSJames Y Knight v1i128:$VB))]>; 15994b43ef3eSJames Y Knight def MTVSRBM : VXForm_RD5_XO5_RS5<1602, 16, (outs vrrc:$VD), (ins g8rc:$VB), 16004b43ef3eSJames Y Knight "mtvsrbm $VD, $VB", IIC_VecGeneral, 16014b43ef3eSJames Y Knight [(set v16i8:$VD, 16024b43ef3eSJames Y Knight (int_ppc_altivec_mtvsrbm i64:$VB))]>; 16034b43ef3eSJames Y Knight def MTVSRHM : VXForm_RD5_XO5_RS5<1602, 17, (outs vrrc:$VD), (ins g8rc:$VB), 16044b43ef3eSJames Y Knight "mtvsrhm $VD, $VB", IIC_VecGeneral, 16054b43ef3eSJames Y Knight [(set v8i16:$VD, 16064b43ef3eSJames Y Knight (int_ppc_altivec_mtvsrhm i64:$VB))]>; 16074b43ef3eSJames Y Knight def MTVSRWM : VXForm_RD5_XO5_RS5<1602, 18, (outs vrrc:$VD), (ins g8rc:$VB), 16084b43ef3eSJames Y Knight "mtvsrwm $VD, $VB", IIC_VecGeneral, 16094b43ef3eSJames Y Knight [(set v4i32:$VD, 16104b43ef3eSJames Y Knight (int_ppc_altivec_mtvsrwm i64:$VB))]>; 16114b43ef3eSJames Y Knight def MTVSRDM : VXForm_RD5_XO5_RS5<1602, 19, (outs vrrc:$VD), (ins g8rc:$VB), 16124b43ef3eSJames Y Knight "mtvsrdm $VD, $VB", IIC_VecGeneral, 16134b43ef3eSJames Y Knight [(set v2i64:$VD, 16144b43ef3eSJames Y Knight (int_ppc_altivec_mtvsrdm i64:$VB))]>; 16154b43ef3eSJames Y Knight def MTVSRQM : VXForm_RD5_XO5_RS5<1602, 20, (outs vrrc:$VD), (ins g8rc:$VB), 16164b43ef3eSJames Y Knight "mtvsrqm $VD, $VB", IIC_VecGeneral, 16174b43ef3eSJames Y Knight [(set v1i128:$VD, 16184b43ef3eSJames Y Knight (int_ppc_altivec_mtvsrqm i64:$VB))]>; 16194b43ef3eSJames Y Knight def MTVSRBMI : DXForm<4, 10, (outs vrrc:$RT), (ins u16imm64:$D), 16204b43ef3eSJames Y Knight "mtvsrbmi $RT, $D", IIC_VecGeneral, 16214b43ef3eSJames Y Knight [(set v16i8:$RT, 16225abe6c31SLei Huang (int_ppc_altivec_mtvsrbm imm:$D))]>; 16234b43ef3eSJames Y Knight def VCNTMBB : VXForm_RD5_MP_VB5<1602, 12, (outs g8rc:$RD), 16244b43ef3eSJames Y Knight (ins vrrc:$VB, u1imm:$MP), 16254b43ef3eSJames Y Knight "vcntmbb $RD, $VB, $MP", IIC_VecGeneral, 16264b43ef3eSJames Y Knight [(set i64:$RD, (int_ppc_altivec_vcntmbb 16274b43ef3eSJames Y Knight v16i8:$VB, timm:$MP))]>; 16284b43ef3eSJames Y Knight def VCNTMBH : VXForm_RD5_MP_VB5<1602, 13, (outs g8rc:$RD), 16294b43ef3eSJames Y Knight (ins vrrc:$VB, u1imm:$MP), 16304b43ef3eSJames Y Knight "vcntmbh $RD, $VB, $MP", IIC_VecGeneral, 16314b43ef3eSJames Y Knight [(set i64:$RD, (int_ppc_altivec_vcntmbh 16324b43ef3eSJames Y Knight v8i16:$VB, timm:$MP))]>; 16334b43ef3eSJames Y Knight def VCNTMBW : VXForm_RD5_MP_VB5<1602, 14, (outs g8rc:$RD), 16344b43ef3eSJames Y Knight (ins vrrc:$VB, u1imm:$MP), 16354b43ef3eSJames Y Knight "vcntmbw $RD, $VB, $MP", IIC_VecGeneral, 16364b43ef3eSJames Y Knight [(set i64:$RD, (int_ppc_altivec_vcntmbw 16374b43ef3eSJames Y Knight v4i32:$VB, timm:$MP))]>; 16384b43ef3eSJames Y Knight def VCNTMBD : VXForm_RD5_MP_VB5<1602, 15, (outs g8rc:$RD), 16394b43ef3eSJames Y Knight (ins vrrc:$VB, u1imm:$MP), 16404b43ef3eSJames Y Knight "vcntmbd $RD, $VB, $MP", IIC_VecGeneral, 16414b43ef3eSJames Y Knight [(set i64:$RD, (int_ppc_altivec_vcntmbd 16424b43ef3eSJames Y Knight v2i64:$VB, timm:$MP))]>; 16434b43ef3eSJames Y Knight def VEXTDUBVLX : VAForm_1a<24, (outs vrrc:$RT), 16444b43ef3eSJames Y Knight (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 16454b43ef3eSJames Y Knight "vextdubvlx $RT, $RA, $RB, $RC", 16465abe6c31SLei Huang IIC_VecGeneral, 16474b43ef3eSJames Y Knight [(set v2i64:$RT, 16484b43ef3eSJames Y Knight (int_ppc_altivec_vextdubvlx v16i8:$RA, 16494b43ef3eSJames Y Knight v16i8:$RB, 16504b43ef3eSJames Y Knight i32:$RC))]>; 16514b43ef3eSJames Y Knight def VEXTDUBVRX : VAForm_1a<25, (outs vrrc:$RT), 16524b43ef3eSJames Y Knight (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 16534b43ef3eSJames Y Knight "vextdubvrx $RT, $RA, $RB, $RC", 16545abe6c31SLei Huang IIC_VecGeneral, 16554b43ef3eSJames Y Knight [(set v2i64:$RT, 16564b43ef3eSJames Y Knight (int_ppc_altivec_vextdubvrx v16i8:$RA, 16574b43ef3eSJames Y Knight v16i8:$RB, 16584b43ef3eSJames Y Knight i32:$RC))]>; 16594b43ef3eSJames Y Knight def VEXTDUHVLX : VAForm_1a<26, (outs vrrc:$RT), 16604b43ef3eSJames Y Knight (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 16614b43ef3eSJames Y Knight "vextduhvlx $RT, $RA, $RB, $RC", 16625abe6c31SLei Huang IIC_VecGeneral, 16634b43ef3eSJames Y Knight [(set v2i64:$RT, 16644b43ef3eSJames Y Knight (int_ppc_altivec_vextduhvlx v8i16:$RA, 16654b43ef3eSJames Y Knight v8i16:$RB, 16664b43ef3eSJames Y Knight i32:$RC))]>; 16674b43ef3eSJames Y Knight def VEXTDUHVRX : VAForm_1a<27, (outs vrrc:$RT), 16684b43ef3eSJames Y Knight (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 16694b43ef3eSJames Y Knight "vextduhvrx $RT, $RA, $RB, $RC", 16705abe6c31SLei Huang IIC_VecGeneral, 16714b43ef3eSJames Y Knight [(set v2i64:$RT, 16724b43ef3eSJames Y Knight (int_ppc_altivec_vextduhvrx v8i16:$RA, 16734b43ef3eSJames Y Knight v8i16:$RB, 16744b43ef3eSJames Y Knight i32:$RC))]>; 16754b43ef3eSJames Y Knight def VEXTDUWVLX : VAForm_1a<28, (outs vrrc:$RT), 16764b43ef3eSJames Y Knight (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 16774b43ef3eSJames Y Knight "vextduwvlx $RT, $RA, $RB, $RC", 16785abe6c31SLei Huang IIC_VecGeneral, 16794b43ef3eSJames Y Knight [(set v2i64:$RT, 16804b43ef3eSJames Y Knight (int_ppc_altivec_vextduwvlx v4i32:$RA, 16814b43ef3eSJames Y Knight v4i32:$RB, 16824b43ef3eSJames Y Knight i32:$RC))]>; 16834b43ef3eSJames Y Knight def VEXTDUWVRX : VAForm_1a<29, (outs vrrc:$RT), 16844b43ef3eSJames Y Knight (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 16854b43ef3eSJames Y Knight "vextduwvrx $RT, $RA, $RB, $RC", 16865abe6c31SLei Huang IIC_VecGeneral, 16874b43ef3eSJames Y Knight [(set v2i64:$RT, 16884b43ef3eSJames Y Knight (int_ppc_altivec_vextduwvrx v4i32:$RA, 16894b43ef3eSJames Y Knight v4i32:$RB, 16904b43ef3eSJames Y Knight i32:$RC))]>; 16914b43ef3eSJames Y Knight def VEXTDDVLX : VAForm_1a<30, (outs vrrc:$RT), 16924b43ef3eSJames Y Knight (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 16934b43ef3eSJames Y Knight "vextddvlx $RT, $RA, $RB, $RC", 16945abe6c31SLei Huang IIC_VecGeneral, 16954b43ef3eSJames Y Knight [(set v2i64:$RT, 16964b43ef3eSJames Y Knight (int_ppc_altivec_vextddvlx v2i64:$RA, 16974b43ef3eSJames Y Knight v2i64:$RB, 16984b43ef3eSJames Y Knight i32:$RC))]>; 16994b43ef3eSJames Y Knight def VEXTDDVRX : VAForm_1a<31, (outs vrrc:$RT), 17004b43ef3eSJames Y Knight (ins vrrc:$RA, vrrc:$RB, gprc:$RC), 17014b43ef3eSJames Y Knight "vextddvrx $RT, $RA, $RB, $RC", 17025abe6c31SLei Huang IIC_VecGeneral, 17034b43ef3eSJames Y Knight [(set v2i64:$RT, 17044b43ef3eSJames Y Knight (int_ppc_altivec_vextddvrx v2i64:$RA, 17054b43ef3eSJames Y Knight v2i64:$RB, 17064b43ef3eSJames Y Knight i32:$RC))]>; 17074b43ef3eSJames Y Knight def VPDEPD : VXForm_1<1485, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17084b43ef3eSJames Y Knight "vpdepd $VD, $VA, $VB", IIC_VecGeneral, 17094b43ef3eSJames Y Knight [(set v2i64:$VD, 17104b43ef3eSJames Y Knight (int_ppc_altivec_vpdepd v2i64:$VA, v2i64:$VB))]>; 17114b43ef3eSJames Y Knight def VPEXTD : VXForm_1<1421, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17124b43ef3eSJames Y Knight "vpextd $VD, $VA, $VB", IIC_VecGeneral, 17134b43ef3eSJames Y Knight [(set v2i64:$VD, 17144b43ef3eSJames Y Knight (int_ppc_altivec_vpextd v2i64:$VA, v2i64:$VB))]>; 17154b43ef3eSJames Y Knight def PDEPD : XForm_6<31, 156, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 17164b43ef3eSJames Y Knight "pdepd $RA, $RST, $RB", IIC_IntGeneral, 17174b43ef3eSJames Y Knight [(set i64:$RA, (int_ppc_pdepd i64:$RST, i64:$RB))]>; 17184b43ef3eSJames Y Knight def PEXTD : XForm_6<31, 188, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 17194b43ef3eSJames Y Knight "pextd $RA, $RST, $RB", IIC_IntGeneral, 17204b43ef3eSJames Y Knight [(set i64:$RA, (int_ppc_pextd i64:$RST, i64:$RB))]>; 17214b43ef3eSJames Y Knight def VCFUGED : VXForm_1<1357, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17224b43ef3eSJames Y Knight "vcfuged $VD, $VA, $VB", IIC_VecGeneral, 17234b43ef3eSJames Y Knight [(set v2i64:$VD, 17244b43ef3eSJames Y Knight (int_ppc_altivec_vcfuged v2i64:$VA, v2i64:$VB))]>; 17254b43ef3eSJames Y Knight def VGNB : VXForm_RD5_N3_VB5<1228, (outs g8rc:$RD), (ins vrrc:$VB, u3imm:$N), 17264b43ef3eSJames Y Knight "vgnb $RD, $VB, $N", IIC_VecGeneral, 17274b43ef3eSJames Y Knight [(set i64:$RD, 17284b43ef3eSJames Y Knight (int_ppc_altivec_vgnb v1i128:$VB, timm:$N))]>; 17294b43ef3eSJames Y Knight def CFUGED : XForm_6<31, 220, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 17304b43ef3eSJames Y Knight "cfuged $RA, $RST, $RB", IIC_IntGeneral, 17314b43ef3eSJames Y Knight [(set i64:$RA, (int_ppc_cfuged i64:$RST, i64:$RB))]>; 17325abe6c31SLei Huang def XXEVAL : 17335abe6c31SLei Huang 8RR_XX4Form_IMM8_XTAB6<34, 1, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, 17345abe6c31SLei Huang vsrc:$XC, u8imm:$IMM), 17355abe6c31SLei Huang "xxeval $XT, $XA, $XB, $XC, $IMM", IIC_VecGeneral, 17365abe6c31SLei Huang [(set v2i64:$XT, (int_ppc_vsx_xxeval v2i64:$XA, 17375abe6c31SLei Huang v2i64:$XB, v2i64:$XC, timm:$IMM))]>; 17384b43ef3eSJames Y Knight def VCLZDM : VXForm_1<1924, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17394b43ef3eSJames Y Knight "vclzdm $VD, $VA, $VB", IIC_VecGeneral, 17404b43ef3eSJames Y Knight [(set v2i64:$VD, 17414b43ef3eSJames Y Knight (int_ppc_altivec_vclzdm v2i64:$VA, v2i64:$VB))]>; 17424b43ef3eSJames Y Knight def VCTZDM : VXForm_1<1988, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17434b43ef3eSJames Y Knight "vctzdm $VD, $VA, $VB", IIC_VecGeneral, 17444b43ef3eSJames Y Knight [(set v2i64:$VD, 17454b43ef3eSJames Y Knight (int_ppc_altivec_vctzdm v2i64:$VA, v2i64:$VB))]>; 17464b43ef3eSJames Y Knight def CNTLZDM : XForm_6<31, 59, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 17474b43ef3eSJames Y Knight "cntlzdm $RA, $RST, $RB", IIC_IntGeneral, 17484b43ef3eSJames Y Knight [(set i64:$RA, 17494b43ef3eSJames Y Knight (int_ppc_cntlzdm i64:$RST, i64:$RB))]>; 17504b43ef3eSJames Y Knight def CNTTZDM : XForm_6<31, 571, (outs g8rc:$RA), (ins g8rc:$RST, g8rc:$RB), 17514b43ef3eSJames Y Knight "cnttzdm $RA, $RST, $RB", IIC_IntGeneral, 17524b43ef3eSJames Y Knight [(set i64:$RA, 17534b43ef3eSJames Y Knight (int_ppc_cnttzdm i64:$RST, i64:$RB))]>; 17545abe6c31SLei Huang def XXGENPCVBM : 17555abe6c31SLei Huang XForm_XT6_IMM5_VB5<60, 916, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 17565abe6c31SLei Huang "xxgenpcvbm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 17575abe6c31SLei Huang def XXGENPCVHM : 17585abe6c31SLei Huang XForm_XT6_IMM5_VB5<60, 917, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 17595abe6c31SLei Huang "xxgenpcvhm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 17605abe6c31SLei Huang def XXGENPCVWM : 17615abe6c31SLei Huang XForm_XT6_IMM5_VB5<60, 948, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 17625abe6c31SLei Huang "xxgenpcvwm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 17635abe6c31SLei Huang def XXGENPCVDM : 17645abe6c31SLei Huang XForm_XT6_IMM5_VB5<60, 949, (outs vsrc:$XT), (ins vrrc:$VRB, s5imm:$IMM), 17655abe6c31SLei Huang "xxgenpcvdm $XT, $VRB, $IMM", IIC_VecGeneral, []>; 17664b43ef3eSJames Y Knight def VCLRLB : VXForm_1<397, (outs vrrc:$VD), (ins vrrc:$VA, gprc:$VB), 17674b43ef3eSJames Y Knight "vclrlb $VD, $VA, $VB", IIC_VecGeneral, 17684b43ef3eSJames Y Knight [(set v16i8:$VD, 17694b43ef3eSJames Y Knight (int_ppc_altivec_vclrlb v16i8:$VA, i32:$VB))]>; 17704b43ef3eSJames Y Knight def VCLRRB : VXForm_1<461, (outs vrrc:$VD), (ins vrrc:$VA, gprc:$VB), 17714b43ef3eSJames Y Knight "vclrrb $VD, $VA, $VB", IIC_VecGeneral, 17724b43ef3eSJames Y Knight [(set v16i8:$VD, 17734b43ef3eSJames Y Knight (int_ppc_altivec_vclrrb v16i8:$VA, i32:$VB))]>; 17744b43ef3eSJames Y Knight def VMULLD : VXForm_1<457, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17754b43ef3eSJames Y Knight "vmulld $VD, $VA, $VB", IIC_VecGeneral, 17764b43ef3eSJames Y Knight [(set v2i64:$VD, (mul v2i64:$VA, v2i64:$VB))]>; 17774b43ef3eSJames Y Knight def VMULHSW : VXForm_1<905, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17784b43ef3eSJames Y Knight "vmulhsw $VD, $VA, $VB", IIC_VecGeneral, 17794b43ef3eSJames Y Knight [(set v4i32:$VD, (mulhs v4i32:$VA, v4i32:$VB))]>; 17804b43ef3eSJames Y Knight def VMULHUW : VXForm_1<649, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17814b43ef3eSJames Y Knight "vmulhuw $VD, $VA, $VB", IIC_VecGeneral, 17824b43ef3eSJames Y Knight [(set v4i32:$VD, (mulhu v4i32:$VA, v4i32:$VB))]>; 17834b43ef3eSJames Y Knight def VMULHSD : VXForm_1<969, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17844b43ef3eSJames Y Knight "vmulhsd $VD, $VA, $VB", IIC_VecGeneral, 17854b43ef3eSJames Y Knight [(set v2i64:$VD, (mulhs v2i64:$VA, v2i64:$VB))]>; 17864b43ef3eSJames Y Knight def VMULHUD : VXForm_1<713, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17874b43ef3eSJames Y Knight "vmulhud $VD, $VA, $VB", IIC_VecGeneral, 17884b43ef3eSJames Y Knight [(set v2i64:$VD, (mulhu v2i64:$VA, v2i64:$VB))]>; 17894b43ef3eSJames Y Knight def VMODSW : VXForm_1<1931, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17904b43ef3eSJames Y Knight "vmodsw $VD, $VA, $VB", IIC_VecGeneral, 17914b43ef3eSJames Y Knight [(set v4i32:$VD, (srem v4i32:$VA, v4i32:$VB))]>; 17924b43ef3eSJames Y Knight def VMODUW : VXForm_1<1675, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17934b43ef3eSJames Y Knight "vmoduw $VD, $VA, $VB", IIC_VecGeneral, 17944b43ef3eSJames Y Knight [(set v4i32:$VD, (urem v4i32:$VA, v4i32:$VB))]>; 17954b43ef3eSJames Y Knight def VMODSD : VXForm_1<1995, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17964b43ef3eSJames Y Knight "vmodsd $VD, $VA, $VB", IIC_VecGeneral, 17974b43ef3eSJames Y Knight [(set v2i64:$VD, (srem v2i64:$VA, v2i64:$VB))]>; 17984b43ef3eSJames Y Knight def VMODUD : VXForm_1<1739, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 17994b43ef3eSJames Y Knight "vmodud $VD, $VA, $VB", IIC_VecGeneral, 18004b43ef3eSJames Y Knight [(set v2i64:$VD, (urem v2i64:$VA, v2i64:$VB))]>; 18014b43ef3eSJames Y Knight def VDIVSW : VXForm_1<395, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18024b43ef3eSJames Y Knight "vdivsw $VD, $VA, $VB", IIC_VecGeneral, 18034b43ef3eSJames Y Knight [(set v4i32:$VD, (sdiv v4i32:$VA, v4i32:$VB))]>; 18044b43ef3eSJames Y Knight def VDIVUW : VXForm_1<139, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18054b43ef3eSJames Y Knight "vdivuw $VD, $VA, $VB", IIC_VecGeneral, 18064b43ef3eSJames Y Knight [(set v4i32:$VD, (udiv v4i32:$VA, v4i32:$VB))]>; 18074b43ef3eSJames Y Knight def VDIVSD : VXForm_1<459, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18084b43ef3eSJames Y Knight "vdivsd $VD, $VA, $VB", IIC_VecGeneral, 18094b43ef3eSJames Y Knight [(set v2i64:$VD, (sdiv v2i64:$VA, v2i64:$VB))]>; 18104b43ef3eSJames Y Knight def VDIVUD : VXForm_1<203, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18114b43ef3eSJames Y Knight "vdivud $VD, $VA, $VB", IIC_VecGeneral, 18124b43ef3eSJames Y Knight [(set v2i64:$VD, (udiv v2i64:$VA, v2i64:$VB))]>; 18134b43ef3eSJames Y Knight def VDIVESW : VXForm_1<907, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18144b43ef3eSJames Y Knight "vdivesw $VD, $VA, $VB", IIC_VecGeneral, 18154b43ef3eSJames Y Knight [(set v4i32:$VD, (int_ppc_altivec_vdivesw v4i32:$VA, 18164b43ef3eSJames Y Knight v4i32:$VB))]>; 18174b43ef3eSJames Y Knight def VDIVEUW : VXForm_1<651, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18184b43ef3eSJames Y Knight "vdiveuw $VD, $VA, $VB", IIC_VecGeneral, 18194b43ef3eSJames Y Knight [(set v4i32:$VD, (int_ppc_altivec_vdiveuw v4i32:$VA, 18204b43ef3eSJames Y Knight v4i32:$VB))]>; 18214b43ef3eSJames Y Knight def VDIVESD : VXForm_1<971, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18224b43ef3eSJames Y Knight "vdivesd $VD, $VA, $VB", IIC_VecGeneral, 18234b43ef3eSJames Y Knight [(set v2i64:$VD, (int_ppc_altivec_vdivesd v2i64:$VA, 18244b43ef3eSJames Y Knight v2i64:$VB))]>; 18254b43ef3eSJames Y Knight def VDIVEUD : VXForm_1<715, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18264b43ef3eSJames Y Knight "vdiveud $VD, $VA, $VB", IIC_VecGeneral, 18274b43ef3eSJames Y Knight [(set v2i64:$VD, (int_ppc_altivec_vdiveud v2i64:$VA, 18284b43ef3eSJames Y Knight v2i64:$VB))]>; 18295abe6c31SLei Huang def XVTLSBB : XX2_BF3_XO5_XB6_XO9<60, 2, 475, (outs crrc:$BF), (ins vsrc:$XB), 18305abe6c31SLei Huang "xvtlsbb $BF, $XB", IIC_VecGeneral, []>; 18314b43ef3eSJames Y Knight def BRH : XForm_11<31, 219, (outs gprc:$RA), (ins gprc:$RST), 18324b43ef3eSJames Y Knight "brh $RA, $RST", IIC_IntRotate, []>; 18334b43ef3eSJames Y Knight def BRW : XForm_11<31, 155, (outs gprc:$RA), (ins gprc:$RST), 18344b43ef3eSJames Y Knight "brw $RA, $RST", IIC_IntRotate, 18354b43ef3eSJames Y Knight [(set i32:$RA, (bswap i32:$RST))]>; 18367a7e9109SLei Huang let isCodeGenOnly = 1 in { 18374b43ef3eSJames Y Knight def BRH8 : XForm_11<31, 219, (outs g8rc:$RA), (ins g8rc:$RST), 18384b43ef3eSJames Y Knight "brh $RA, $RST", IIC_IntRotate, []>; 18394b43ef3eSJames Y Knight def BRW8 : XForm_11<31, 155, (outs g8rc:$RA), (ins g8rc:$RST), 18404b43ef3eSJames Y Knight "brw $RA, $RST", IIC_IntRotate, []>; 18417a7e9109SLei Huang } 18424b43ef3eSJames Y Knight def BRD : XForm_11<31, 187, (outs g8rc:$RA), (ins g8rc:$RST), 18434b43ef3eSJames Y Knight "brd $RA, $RST", IIC_IntRotate, 18444b43ef3eSJames Y Knight [(set i64:$RA, (bswap i64:$RST))]>; 18455abe6c31SLei Huang 18465abe6c31SLei Huang // The XFormMemOp flag for the following 8 instructions is set on 18475abe6c31SLei Huang // the instruction format. 18485abe6c31SLei Huang let mayLoad = 1, mayStore = 0 in { 18495abe6c31SLei Huang def LXVRBX : X_XT6_RA5_RB5<31, 13, "lxvrbx", vsrc, []>; 18505abe6c31SLei Huang def LXVRHX : X_XT6_RA5_RB5<31, 45, "lxvrhx", vsrc, []>; 18515abe6c31SLei Huang def LXVRWX : X_XT6_RA5_RB5<31, 77, "lxvrwx", vsrc, []>; 18525abe6c31SLei Huang def LXVRDX : X_XT6_RA5_RB5<31, 109, "lxvrdx", vsrc, []>; 18535abe6c31SLei Huang } 18545abe6c31SLei Huang 18555abe6c31SLei Huang let mayLoad = 0, mayStore = 1 in { 18565abe6c31SLei Huang def STXVRBX : X_XS6_RA5_RB5<31, 141, "stxvrbx", vsrc, []>; 18575abe6c31SLei Huang def STXVRHX : X_XS6_RA5_RB5<31, 173, "stxvrhx", vsrc, []>; 18585abe6c31SLei Huang def STXVRWX : X_XS6_RA5_RB5<31, 205, "stxvrwx", vsrc, []>; 18595abe6c31SLei Huang def STXVRDX : X_XS6_RA5_RB5<31, 237, "stxvrdx", vsrc, []>; 18605abe6c31SLei Huang } 18615abe6c31SLei Huang 18624b43ef3eSJames Y Knight def VMULESD : VXForm_1<968, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18634b43ef3eSJames Y Knight "vmulesd $VD, $VA, $VB", IIC_VecGeneral, 18644b43ef3eSJames Y Knight [(set v1i128:$VD, (int_ppc_altivec_vmulesd v2i64:$VA, 18654b43ef3eSJames Y Knight v2i64:$VB))]>; 18664b43ef3eSJames Y Knight def VMULEUD : VXForm_1<712, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18674b43ef3eSJames Y Knight "vmuleud $VD, $VA, $VB", IIC_VecGeneral, 18684b43ef3eSJames Y Knight [(set v1i128:$VD, (int_ppc_altivec_vmuleud v2i64:$VA, 18694b43ef3eSJames Y Knight v2i64:$VB))]>; 18704b43ef3eSJames Y Knight def VMULOSD : VXForm_1<456, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18714b43ef3eSJames Y Knight "vmulosd $VD, $VA, $VB", IIC_VecGeneral, 18724b43ef3eSJames Y Knight [(set v1i128:$VD, (int_ppc_altivec_vmulosd v2i64:$VA, 18734b43ef3eSJames Y Knight v2i64:$VB))]>; 18744b43ef3eSJames Y Knight def VMULOUD : VXForm_1<200, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18754b43ef3eSJames Y Knight "vmuloud $VD, $VA, $VB", IIC_VecGeneral, 18764b43ef3eSJames Y Knight [(set v1i128:$VD, (int_ppc_altivec_vmuloud v2i64:$VA, 18774b43ef3eSJames Y Knight v2i64:$VB))]>; 18784b43ef3eSJames Y Knight def VMSUMCUD : VAForm_1a<23, (outs vrrc:$RT), (ins vrrc:$RA, vrrc:$RB, vrrc:$RC), 18794b43ef3eSJames Y Knight "vmsumcud $RT, $RA, $RB, $RC", IIC_VecGeneral, 18804b43ef3eSJames Y Knight [(set v1i128:$RT, (int_ppc_altivec_vmsumcud 18814b43ef3eSJames Y Knight v2i64:$RA, v2i64:$RB, v1i128:$RC))]>; 18824b43ef3eSJames Y Knight def VDIVSQ : VXForm_1<267, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18834b43ef3eSJames Y Knight "vdivsq $VD, $VA, $VB", IIC_VecGeneral, 18844b43ef3eSJames Y Knight [(set v1i128:$VD, (sdiv v1i128:$VA, v1i128:$VB))]>; 18854b43ef3eSJames Y Knight def VDIVUQ : VXForm_1<11, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18864b43ef3eSJames Y Knight "vdivuq $VD, $VA, $VB", IIC_VecGeneral, 18874b43ef3eSJames Y Knight [(set v1i128:$VD, (udiv v1i128:$VA, v1i128:$VB))]>; 18884b43ef3eSJames Y Knight def VDIVESQ : VXForm_1<779, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18894b43ef3eSJames Y Knight "vdivesq $VD, $VA, $VB", IIC_VecGeneral, 18904b43ef3eSJames Y Knight [(set v1i128:$VD, (int_ppc_altivec_vdivesq v1i128:$VA, 18914b43ef3eSJames Y Knight v1i128:$VB))]>; 18924b43ef3eSJames Y Knight def VDIVEUQ : VXForm_1<523, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 18934b43ef3eSJames Y Knight "vdiveuq $VD, $VA, $VB", IIC_VecGeneral, 18944b43ef3eSJames Y Knight [(set v1i128:$VD, (int_ppc_altivec_vdiveuq v1i128:$VA, 18954b43ef3eSJames Y Knight v1i128:$VB))]>; 18964b43ef3eSJames Y Knight def VCMPEQUQ : VCMP <455, "vcmpequq $VD, $VA, $VB" , v1i128>; 18974b43ef3eSJames Y Knight def VCMPGTSQ : VCMP <903, "vcmpgtsq $VD, $VA, $VB" , v1i128>; 18984b43ef3eSJames Y Knight def VCMPGTUQ : VCMP <647, "vcmpgtuq $VD, $VA, $VB" , v1i128>; 18994b43ef3eSJames Y Knight def VCMPEQUQ_rec : VCMP_rec <455, "vcmpequq. $VD, $VA, $VB" , v1i128>; 19004b43ef3eSJames Y Knight def VCMPGTSQ_rec : VCMP_rec <903, "vcmpgtsq. $VD, $VA, $VB" , v1i128>; 19014b43ef3eSJames Y Knight def VCMPGTUQ_rec : VCMP_rec <647, "vcmpgtuq. $VD, $VA, $VB" , v1i128>; 19024b43ef3eSJames Y Knight def VMODSQ : VXForm_1<1803, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 19034b43ef3eSJames Y Knight "vmodsq $VD, $VA, $VB", IIC_VecGeneral, 19044b43ef3eSJames Y Knight [(set v1i128:$VD, (srem v1i128:$VA, v1i128:$VB))]>; 19054b43ef3eSJames Y Knight def VMODUQ : VXForm_1<1547, (outs vrrc:$VD), (ins vrrc:$VA, vrrc:$VB), 19064b43ef3eSJames Y Knight "vmoduq $VD, $VA, $VB", IIC_VecGeneral, 19074b43ef3eSJames Y Knight [(set v1i128:$VD, (urem v1i128:$VA, v1i128:$VB))]>; 19084b43ef3eSJames Y Knight def VEXTSD2Q : VXForm_RD5_XO5_RS5<1538, 27, (outs vrrc:$VD), (ins vrrc:$VB), 19094b43ef3eSJames Y Knight "vextsd2q $VD, $VB", IIC_VecGeneral, 19104b43ef3eSJames Y Knight [(set v1i128:$VD, (int_ppc_altivec_vextsd2q v2i64:$VB))]>; 19114b43ef3eSJames Y Knight def VCMPUQ : VXForm_BF3_VAB5<257, (outs crrc:$BF), (ins vrrc:$VA, vrrc:$VB), 19124b43ef3eSJames Y Knight "vcmpuq $BF, $VA, $VB", IIC_VecGeneral, []>; 19134b43ef3eSJames Y Knight def VCMPSQ : VXForm_BF3_VAB5<321, (outs crrc:$BF), (ins vrrc:$VA, vrrc:$VB), 19144b43ef3eSJames Y Knight "vcmpsq $BF, $VA, $VB", IIC_VecGeneral, []>; 19155abe6c31SLei Huang def VRLQNM : VX1_VT5_VA5_VB5<325, "vrlqnm", 19164b43ef3eSJames Y Knight [(set v1i128:$VD, 19174b43ef3eSJames Y Knight (int_ppc_altivec_vrlqnm v1i128:$VA, 19184b43ef3eSJames Y Knight v1i128:$VB))]>; 19194b43ef3eSJames Y Knight def VRLQMI : VXForm_1<69, (outs vrrc:$VD), 19204b43ef3eSJames Y Knight (ins vrrc:$VA, vrrc:$VB, vrrc:$VDi), 19214b43ef3eSJames Y Knight "vrlqmi $VD, $VA, $VB", IIC_VecFP, 19224b43ef3eSJames Y Knight [(set v1i128:$VD, 19234b43ef3eSJames Y Knight (int_ppc_altivec_vrlqmi v1i128:$VA, v1i128:$VB, 19244b43ef3eSJames Y Knight v1i128:$VDi))]>, 19254b43ef3eSJames Y Knight RegConstraint<"$VDi = $VD">, NoEncode<"$VDi">; 19265abe6c31SLei Huang def VSLQ : VX1_VT5_VA5_VB5<261, "vslq", []>; 19275abe6c31SLei Huang def VSRAQ : VX1_VT5_VA5_VB5<773, "vsraq", []>; 19285abe6c31SLei Huang def VSRQ : VX1_VT5_VA5_VB5<517, "vsrq", []>; 19295abe6c31SLei Huang def VRLQ : VX1_VT5_VA5_VB5<5, "vrlq", []>; 19305abe6c31SLei Huang def XSCVQPUQZ : X_VT5_XO5_VB5<63, 0, 836, "xscvqpuqz", []>; 19315abe6c31SLei Huang def XSCVQPSQZ : X_VT5_XO5_VB5<63, 8, 836, "xscvqpsqz", []>; 19325abe6c31SLei Huang def XSCVUQQP : X_VT5_XO5_VB5<63, 3, 836, "xscvuqqp", []>; 19335abe6c31SLei Huang def XSCVSQQP : X_VT5_XO5_VB5<63, 11, 836, "xscvsqqp", []>; 1934eb1c5a98SStefan Pintilie def LXVKQ : XForm_XT6_IMM5<60, 31, 360, (outs vsrc:$XT), (ins u5imm:$UIM), 1935eb1c5a98SStefan Pintilie "lxvkq $XT, $UIM", IIC_VecGeneral, []>; 19365abe6c31SLei Huang} 19375abe6c31SLei Huang 19385abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX] in { 19395abe6c31SLei Huang def XVCVSPBF16 : XX2_XT6_XO5_XB6<60, 17, 475, "xvcvspbf16", vsrc, []>; 19405abe6c31SLei Huang def XVCVBF16SPN : XX2_XT6_XO5_XB6<60, 16, 475, "xvcvbf16spn", vsrc, []>; 19415abe6c31SLei Huang def XSMAXCQP : X_VT5_VA5_VB5<63, 676, "xsmaxcqp", 19424b43ef3eSJames Y Knight [(set f128:$RST, (PPCxsmaxc f128:$RA, f128:$RB))]>; 19435abe6c31SLei Huang def XSMINCQP : X_VT5_VA5_VB5<63, 740, "xsmincqp", 19444b43ef3eSJames Y Knight [(set f128:$RST, (PPCxsminc f128:$RA, f128:$RB))]>; 19455abe6c31SLei Huang} 19465abe6c31SLei Huang 1947ea8b95d0SStefan Pintilielet Predicates = [IsISA3_1] in { 1948ea8b95d0SStefan Pintilie def WAITP10 : XForm_IMM2_IMM2<31, 30, (outs), (ins u2imm:$L, u2imm:$PL), 1949ea8b95d0SStefan Pintilie "wait $L $PL", IIC_LdStLoad, []>; 1950ea8b95d0SStefan Pintilie def SYNCP10 : XForm_IMM3_IMM2<31, 598, (outs), (ins u3imm:$L, u2imm:$SC), 1951ea8b95d0SStefan Pintilie "sync $L, $SC", IIC_LdStSync, []>; 1952ea8b95d0SStefan Pintilie} 1953ea8b95d0SStefan Pintilie 19545abe6c31SLei Huang// Multiclass defining patterns for Set Boolean Extension Reverse Instructions. 19555abe6c31SLei Huang// This is analogous to the CRNotPat multiclass but specifically for Power10 19565abe6c31SLei Huang// and newer subtargets since the extended forms use Set Boolean instructions. 19575abe6c31SLei Huang// The first two anonymous patterns defined are actually a duplicate of those 19585abe6c31SLei Huang// in CRNotPat, but it is preferable to define both multiclasses as complete 19595abe6c31SLei Huang// ones rather than pulling that small common section out. 19605abe6c31SLei Huangmulticlass P10ReverseSetBool<dag pattern, dag result> { 19615abe6c31SLei Huang def : Pat<pattern, (crnot result)>; 19625abe6c31SLei Huang def : Pat<(not pattern), result>; 19635abe6c31SLei Huang 19645abe6c31SLei Huang def : Pat<(i32 (zext pattern)), 19655abe6c31SLei Huang (SETBCR result)>; 19665abe6c31SLei Huang def : Pat<(i64 (zext pattern)), 19675abe6c31SLei Huang (SETBCR8 result)>; 19685abe6c31SLei Huang 19695abe6c31SLei Huang def : Pat<(i32 (sext pattern)), 19705abe6c31SLei Huang (SETNBCR result)>; 19715abe6c31SLei Huang def : Pat<(i64 (sext pattern)), 19725abe6c31SLei Huang (SETNBCR8 result)>; 19735abe6c31SLei Huang 19745abe6c31SLei Huang def : Pat<(i32 (anyext pattern)), 19755abe6c31SLei Huang (SETBCR result)>; 19765abe6c31SLei Huang def : Pat<(i64 (anyext pattern)), 19775abe6c31SLei Huang (SETBCR8 result)>; 19785abe6c31SLei Huang} 19795abe6c31SLei Huang 19805abe6c31SLei Huangmulticlass IntSetP10RevSetBool<SDNode SetCC, ValueType Ty, PatLeaf ZExtTy, 19815abe6c31SLei Huang ImmLeaf SExtTy, I Cmpi, I Cmpli, 19825abe6c31SLei Huang I Cmp, I Cmpl> { 19835abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)), 19845abe6c31SLei Huang (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_lt)>; 19855abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)), 19865abe6c31SLei Huang (EXTRACT_SUBREG (Cmp $s1, $s2), sub_lt)>; 19875abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)), 19885abe6c31SLei Huang (EXTRACT_SUBREG (Cmpl $s1, $s2), sub_gt)>; 19895abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)), 19905abe6c31SLei Huang (EXTRACT_SUBREG (Cmp $s1, $s2), sub_gt)>; 19915abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)), 19925abe6c31SLei Huang (EXTRACT_SUBREG (Cmp $s1, $s2), sub_eq)>; 19935abe6c31SLei Huang 19945abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETUGE)), 19955abe6c31SLei Huang (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_lt)>; 19965abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETGE)), 19975abe6c31SLei Huang (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_lt)>; 19985abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETULE)), 19995abe6c31SLei Huang (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_gt)>; 20005abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETLE)), 20015abe6c31SLei Huang (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_gt)>; 20025abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, SExtTy:$imm, SETNE)), 20035abe6c31SLei Huang (EXTRACT_SUBREG (Cmpi $s1, imm:$imm), sub_eq)>; 20045abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, ZExtTy:$imm, SETNE)), 20055abe6c31SLei Huang (EXTRACT_SUBREG (Cmpli $s1, imm:$imm), sub_eq)>; 20065abe6c31SLei Huang} 20075abe6c31SLei Huang 20085abe6c31SLei Huangmulticlass FSetP10RevSetBool<SDNode SetCC, ValueType Ty, I FCmp> { 20095abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUGE)), 20105abe6c31SLei Huang (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>; 20115abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETGE)), 20125abe6c31SLei Huang (EXTRACT_SUBREG (FCmp $s1, $s2), sub_lt)>; 20135abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETULE)), 20145abe6c31SLei Huang (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>; 20155abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETLE)), 20165abe6c31SLei Huang (EXTRACT_SUBREG (FCmp $s1, $s2), sub_gt)>; 20175abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETUNE)), 20185abe6c31SLei Huang (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>; 20195abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETNE)), 20205abe6c31SLei Huang (EXTRACT_SUBREG (FCmp $s1, $s2), sub_eq)>; 20215abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (SetCC Ty:$s1, Ty:$s2, SETO)), 20225abe6c31SLei Huang (EXTRACT_SUBREG (FCmp $s1, $s2), sub_un)>; 20235abe6c31SLei Huang} 20245abe6c31SLei Huang 20255abe6c31SLei Huanglet Predicates = [IsISA3_1] in { 20265abe6c31SLei Huang def : Pat<(i32 (zext i1:$in)), 20275abe6c31SLei Huang (SETBC $in)>; 20285abe6c31SLei Huang def : Pat<(i64 (zext i1:$in)), 20295abe6c31SLei Huang (SETBC8 $in)>; 20305abe6c31SLei Huang def : Pat<(i32 (sext i1:$in)), 20315abe6c31SLei Huang (SETNBC $in)>; 20325abe6c31SLei Huang def : Pat<(i64 (sext i1:$in)), 20335abe6c31SLei Huang (SETNBC8 $in)>; 20345abe6c31SLei Huang def : Pat<(i32 (anyext i1:$in)), 20355abe6c31SLei Huang (SETBC $in)>; 20365abe6c31SLei Huang def : Pat<(i64 (anyext i1:$in)), 20375abe6c31SLei Huang (SETBC8 $in)>; 20385abe6c31SLei Huang 20395abe6c31SLei Huang // Instantiation of the set boolean reverse patterns for 32-bit integers. 20405abe6c31SLei Huang defm : IntSetP10RevSetBool<setcc, i32, immZExt16, imm32SExt16, 20415abe6c31SLei Huang CMPWI, CMPLWI, CMPW, CMPLW>; 20425abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (setcc i32:$s1, imm:$imm, SETNE)), 20435abe6c31SLei Huang (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)), 20445abe6c31SLei Huang (LO16 imm:$imm)), sub_eq)>; 20455abe6c31SLei Huang 20465abe6c31SLei Huang // Instantiation of the set boolean reverse patterns for 64-bit integers. 20475abe6c31SLei Huang defm : IntSetP10RevSetBool<setcc, i64, immZExt16, imm64SExt16, 20485abe6c31SLei Huang CMPDI, CMPLDI, CMPD, CMPLD>; 20495abe6c31SLei Huang defm : P10ReverseSetBool<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETNE)), 20505abe6c31SLei Huang (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)), 20515abe6c31SLei Huang (LO16 imm:$imm)), sub_eq)>; 20525abe6c31SLei Huang} 20535abe6c31SLei Huang 20545abe6c31SLei Huang// Instantiation of the set boolean reverse patterns for f32, f64, f128. 20555abe6c31SLei Huanglet Predicates = [IsISA3_1, HasFPU] in { 20565abe6c31SLei Huang defm : FSetP10RevSetBool<setcc, f32, FCMPUS>; 20575abe6c31SLei Huang defm : FSetP10RevSetBool<setcc, f64, FCMPUD>; 20585abe6c31SLei Huang defm : FSetP10RevSetBool<setcc, f128, XSCMPUQP>; 20595abe6c31SLei Huang} 20605abe6c31SLei Huang 20615abe6c31SLei Huang//---------------------------- Anonymous Patterns ----------------------------// 20625abe6c31SLei Huanglet Predicates = [IsISA3_1] in { 20635abe6c31SLei Huang // Exploit the vector multiply high instructions using intrinsics. 20645abe6c31SLei Huang def : Pat<(v4i32 (int_ppc_altivec_vmulhsw v4i32:$vA, v4i32:$vB)), 20655abe6c31SLei Huang (v4i32 (VMULHSW $vA, $vB))>; 20665abe6c31SLei Huang def : Pat<(v4i32 (int_ppc_altivec_vmulhuw v4i32:$vA, v4i32:$vB)), 20675abe6c31SLei Huang (v4i32 (VMULHUW $vA, $vB))>; 20685abe6c31SLei Huang def : Pat<(v2i64 (int_ppc_altivec_vmulhsd v2i64:$vA, v2i64:$vB)), 20695abe6c31SLei Huang (v2i64 (VMULHSD $vA, $vB))>; 20705abe6c31SLei Huang def : Pat<(v2i64 (int_ppc_altivec_vmulhud v2i64:$vA, v2i64:$vB)), 20715abe6c31SLei Huang (v2i64 (VMULHUD $vA, $vB))>; 20725abe6c31SLei Huang def : Pat<(v16i8 (int_ppc_vsx_xxgenpcvbm v16i8:$VRB, imm:$IMM)), 20735abe6c31SLei Huang (v16i8 (COPY_TO_REGCLASS (XXGENPCVBM $VRB, imm:$IMM), VRRC))>; 20745abe6c31SLei Huang def : Pat<(v8i16 (int_ppc_vsx_xxgenpcvhm v8i16:$VRB, imm:$IMM)), 20755abe6c31SLei Huang (v8i16 (COPY_TO_REGCLASS (XXGENPCVHM $VRB, imm:$IMM), VRRC))>; 20765abe6c31SLei Huang def : Pat<(v4i32 (int_ppc_vsx_xxgenpcvwm v4i32:$VRB, imm:$IMM)), 20775abe6c31SLei Huang (v4i32 (COPY_TO_REGCLASS (XXGENPCVWM $VRB, imm:$IMM), VRRC))>; 20785abe6c31SLei Huang def : Pat<(v2i64 (int_ppc_vsx_xxgenpcvdm v2i64:$VRB, imm:$IMM)), 20795abe6c31SLei Huang (v2i64 (COPY_TO_REGCLASS (XXGENPCVDM $VRB, imm:$IMM), VRRC))>; 20805abe6c31SLei Huang def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 1)), 20815abe6c31SLei Huang (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_lt)>; 20825abe6c31SLei Huang def : Pat<(i32 (int_ppc_vsx_xvtlsbb v16i8:$XB, 0)), 20835abe6c31SLei Huang (EXTRACT_SUBREG (XVTLSBB (COPY_TO_REGCLASS $XB, VSRC)), sub_eq)>; 2084ee559b21SLei Huang def : Pat<(srl (bswap i32:$RS), (i32 16)), 2085ee559b21SLei Huang (RLDICL_32 (BRH $RS), 0, 48)>; 2086ee559b21SLei Huang def : Pat<(i64 (zext (i32 (srl (bswap i32:$RS), (i32 16))))), 2087ee559b21SLei Huang (RLDICL_32_64 (BRH $RS), 0, 48)>; 20885abe6c31SLei Huang def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 8)), 20895abe6c31SLei Huang (v1i128 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VRRC))>; 20905abe6c31SLei Huang def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 16)), 20915abe6c31SLei Huang (v1i128 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VRRC))>; 20925abe6c31SLei Huang def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 32)), 20935abe6c31SLei Huang (v1i128 (COPY_TO_REGCLASS (LXVRWX ForceXForm:$src), VRRC))>; 20945abe6c31SLei Huang def : Pat <(v1i128 (PPClxvrzx ForceXForm:$src, 64)), 20955abe6c31SLei Huang (v1i128 (COPY_TO_REGCLASS (LXVRDX ForceXForm:$src), VRRC))>; 20965abe6c31SLei Huang 20975abe6c31SLei Huang def : Pat<(v1i128 (rotl v1i128:$vA, v1i128:$vB)), 20985abe6c31SLei Huang (v1i128 (VRLQ v1i128:$vA, v1i128:$vB))>; 20995abe6c31SLei Huang 21005abe6c31SLei Huang def : Pat <(v2i64 (PPCxxsplti32dx v2i64:$XT, i32:$XI, i32:$IMM32)), 21015abe6c31SLei Huang (v2i64 (XXSPLTI32DX v2i64:$XT, i32:$XI, i32:$IMM32))>; 21025abe6c31SLei Huang} 21035abe6c31SLei Huang 21045abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX] in { 21055abe6c31SLei Huang def : Pat<(v16i8 (int_ppc_vsx_xvcvspbf16 v16i8:$XA)), 21065abe6c31SLei Huang (COPY_TO_REGCLASS (XVCVSPBF16 RCCp.AToVSRC), VRRC)>; 21075abe6c31SLei Huang def : Pat<(v16i8 (int_ppc_vsx_xvcvbf16spn v16i8:$XA)), 21085abe6c31SLei Huang (COPY_TO_REGCLASS (XVCVBF16SPN RCCp.AToVSRC), VRRC)>; 21095abe6c31SLei Huang} 21105abe6c31SLei Huang 21115abe6c31SLei Huanglet AddedComplexity = 400, Predicates = [IsISA3_1, IsLittleEndian] in { 21125abe6c31SLei Huang // Store element 0 of a VSX register to memory 21135abe6c31SLei Huang def : Pat<(truncstorei8 (i32 (vector_extract v16i8:$src, 0)), ForceXForm:$dst), 21145abe6c31SLei Huang (STXVRBX (COPY_TO_REGCLASS v16i8:$src, VSRC), ForceXForm:$dst)>; 21155abe6c31SLei Huang def : Pat<(truncstorei16 (i32 (vector_extract v8i16:$src, 0)), ForceXForm:$dst), 21165abe6c31SLei Huang (STXVRHX (COPY_TO_REGCLASS v8i16:$src, VSRC), ForceXForm:$dst)>; 21175abe6c31SLei Huang def : Pat<(store (i32 (extractelt v4i32:$src, 0)), ForceXForm:$dst), 21185abe6c31SLei Huang (STXVRWX $src, ForceXForm:$dst)>; 21195abe6c31SLei Huang def : Pat<(store (f32 (extractelt v4f32:$src, 0)), ForceXForm:$dst), 21205abe6c31SLei Huang (STXVRWX $src, ForceXForm:$dst)>; 21215abe6c31SLei Huang def : Pat<(store (i64 (extractelt v2i64:$src, 0)), ForceXForm:$dst), 21225abe6c31SLei Huang (STXVRDX $src, ForceXForm:$dst)>; 21235abe6c31SLei Huang def : Pat<(store (f64 (extractelt v2f64:$src, 0)), ForceXForm:$dst), 21245abe6c31SLei Huang (STXVRDX $src, ForceXForm:$dst)>; 21255abe6c31SLei Huang // Load element 0 of a VSX register to memory 21265abe6c31SLei Huang def : Pat<(v8i16 (scalar_to_vector (i32 (extloadi16 ForceXForm:$src)))), 21275abe6c31SLei Huang (v8i16 (COPY_TO_REGCLASS (LXVRHX ForceXForm:$src), VSRC))>; 21285abe6c31SLei Huang def : Pat<(v16i8 (scalar_to_vector (i32 (extloadi8 ForceXForm:$src)))), 21295abe6c31SLei Huang (v16i8 (COPY_TO_REGCLASS (LXVRBX ForceXForm:$src), VSRC))>; 213071be020dSTing Wang def : Pat<(store (i64 (extractelt v2i64:$A, 1)), ForceXForm:$src), 213171be020dSTing Wang (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 213271be020dSTing Wang } 213371be020dSTing Wang 213471be020dSTing Wanglet Predicates = [IsISA3_1, IsBigEndian] in { 213571be020dSTing Wang def : Pat<(store (i64 (extractelt v2i64:$A, 0)), ForceXForm:$src), 213671be020dSTing Wang (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 21375abe6c31SLei Huang} 21385abe6c31SLei Huang 21395abe6c31SLei Huang// FIXME: The swap is overkill when the shift amount is a constant. 21405abe6c31SLei Huang// We should just fix the constant in the DAG. 21415abe6c31SLei Huanglet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX] in { 21425abe6c31SLei Huang def : Pat<(v1i128 (shl v1i128:$VRA, v1i128:$VRB)), 21435abe6c31SLei Huang (v1i128 (VSLQ v1i128:$VRA, 21445abe6c31SLei Huang (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 21455abe6c31SLei Huang (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 21465abe6c31SLei Huang def : Pat<(v1i128 (PPCshl v1i128:$VRA, v1i128:$VRB)), 21475abe6c31SLei Huang (v1i128 (VSLQ v1i128:$VRA, 21485abe6c31SLei Huang (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 21495abe6c31SLei Huang (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 21505abe6c31SLei Huang def : Pat<(v1i128 (srl v1i128:$VRA, v1i128:$VRB)), 21515abe6c31SLei Huang (v1i128 (VSRQ v1i128:$VRA, 21525abe6c31SLei Huang (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 21535abe6c31SLei Huang (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 21545abe6c31SLei Huang def : Pat<(v1i128 (PPCsrl v1i128:$VRA, v1i128:$VRB)), 21555abe6c31SLei Huang (v1i128 (VSRQ v1i128:$VRA, 21565abe6c31SLei Huang (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 21575abe6c31SLei Huang (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 21585abe6c31SLei Huang def : Pat<(v1i128 (sra v1i128:$VRA, v1i128:$VRB)), 21595abe6c31SLei Huang (v1i128 (VSRAQ v1i128:$VRA, 21605abe6c31SLei Huang (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 21615abe6c31SLei Huang (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 21625abe6c31SLei Huang def : Pat<(v1i128 (PPCsra v1i128:$VRA, v1i128:$VRB)), 21635abe6c31SLei Huang (v1i128 (VSRAQ v1i128:$VRA, 21645abe6c31SLei Huang (XXPERMDI (COPY_TO_REGCLASS $VRB, VSRC), 21655abe6c31SLei Huang (COPY_TO_REGCLASS $VRB, VSRC), 2)))>; 21665abe6c31SLei Huang} 21675abe6c31SLei Huang 21685abe6c31SLei Huangclass xxevalPattern <dag pattern, bits<8> imm> : 21695abe6c31SLei Huang Pat<(v4i32 pattern), (XXEVAL $vA, $vB, $vC, imm)> {} 21705abe6c31SLei Huang 2171b41dbe60Szhijian linlet Predicates = [PrefixInstrs, HasP10Vector] in { 2172b41dbe60Szhijian lin let AddedComplexity = 400 in { 21735abe6c31SLei Huang def : Pat<(v4i32 (build_vector i32immNonAllOneNonZero:$A, 21745abe6c31SLei Huang i32immNonAllOneNonZero:$A, 21755abe6c31SLei Huang i32immNonAllOneNonZero:$A, 21765abe6c31SLei Huang i32immNonAllOneNonZero:$A)), 21775abe6c31SLei Huang (v4i32 (XXSPLTIW imm:$A))>; 21785abe6c31SLei Huang def : Pat<(f32 nzFPImmAsi32:$A), 21795abe6c31SLei Huang (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)), 21805abe6c31SLei Huang VSFRC)>; 21815abe6c31SLei Huang def : Pat<(f64 nzFPImmAsi32:$A), 21825abe6c31SLei Huang (COPY_TO_REGCLASS (XXSPLTIDP (getFPAs32BitInt fpimm:$A)), 21835abe6c31SLei Huang VSFRC)>; 21845abe6c31SLei Huang 21855abe6c31SLei Huang // To replace constant pool with XXSPLTI32DX for scalars. 21865abe6c31SLei Huang def : Pat<(f32 nzFPImmAsi64:$A), 21875abe6c31SLei Huang (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX(IMPLICIT_DEF), 0, 21885abe6c31SLei Huang (getFPAs64BitIntHi $A)), 21895abe6c31SLei Huang 1, (getFPAs64BitIntLo $A)), 21905abe6c31SLei Huang VSSRC)>; 21915abe6c31SLei Huang 21925abe6c31SLei Huang def : Pat<(f64 nzFPImmAsi64:$A), 21935abe6c31SLei Huang (COPY_TO_REGCLASS (XXSPLTI32DX (XXSPLTI32DX (IMPLICIT_DEF), 0, 21945abe6c31SLei Huang (getFPAs64BitIntHi $A)), 21955abe6c31SLei Huang 1, (getFPAs64BitIntLo $A)), 21965abe6c31SLei Huang VSFRC)>; 21975abe6c31SLei Huang 21985abe6c31SLei Huang // Anonymous patterns for XXEVAL 21995abe6c31SLei Huang // AND 22005abe6c31SLei Huang // and(A, B, C) 22015abe6c31SLei Huang def : xxevalPattern<(and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 1>; 22025abe6c31SLei Huang // and(A, xor(B, C)) 22035abe6c31SLei Huang def : xxevalPattern<(and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 6>; 22045abe6c31SLei Huang // and(A, or(B, C)) 22055abe6c31SLei Huang def : xxevalPattern<(and v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 7>; 22065abe6c31SLei Huang // and(A, nor(B, C)) 22075abe6c31SLei Huang def : xxevalPattern<(and v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 8>; 22085abe6c31SLei Huang // and(A, eqv(B, C)) 22095abe6c31SLei Huang def : xxevalPattern<(and v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 9>; 22105abe6c31SLei Huang // and(A, nand(B, C)) 22115abe6c31SLei Huang def : xxevalPattern<(and v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 14>; 22125abe6c31SLei Huang 22135abe6c31SLei Huang // NAND 22145abe6c31SLei Huang // nand(A, B, C) 22155abe6c31SLei Huang def : xxevalPattern<(vnot (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 22165abe6c31SLei Huang !sub(255, 1)>; 22175abe6c31SLei Huang // nand(A, xor(B, C)) 22185abe6c31SLei Huang def : xxevalPattern<(vnot (and v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 22195abe6c31SLei Huang !sub(255, 6)>; 22205abe6c31SLei Huang // nand(A, or(B, C)) 22215abe6c31SLei Huang def : xxevalPattern<(vnot (and v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 22225abe6c31SLei Huang !sub(255, 7)>; 22235abe6c31SLei Huang // nand(A, nor(B, C)) 22245abe6c31SLei Huang def : xxevalPattern<(or (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 22255abe6c31SLei Huang !sub(255, 8)>; 22265abe6c31SLei Huang // nand(A, eqv(B, C)) 22275abe6c31SLei Huang def : xxevalPattern<(or (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 22285abe6c31SLei Huang !sub(255, 9)>; 22295abe6c31SLei Huang // nand(A, nand(B, C)) 22305abe6c31SLei Huang def : xxevalPattern<(or (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 22315abe6c31SLei Huang !sub(255, 14)>; 22325abe6c31SLei Huang 223312e1936fSTing Wang // EQV 223412e1936fSTing Wang // (eqv A, B, C) 223512e1936fSTing Wang def : xxevalPattern<(or (and v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 223612e1936fSTing Wang (vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)))), 223712e1936fSTing Wang 150>; 223812e1936fSTing Wang // (eqv A, (and B, C)) 223912e1936fSTing Wang def : xxevalPattern<(vnot (xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 225>; 224012e1936fSTing Wang // (eqv A, (or B, C)) 224112e1936fSTing Wang def : xxevalPattern<(vnot (xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 135>; 224212e1936fSTing Wang 224312e1936fSTing Wang // NOR 224412e1936fSTing Wang // (nor A, B, C) 224512e1936fSTing Wang def : xxevalPattern<(vnot (or v4i32:$vA, (or v4i32:$vB, v4i32:$vC))), 128>; 224612e1936fSTing Wang // (nor A, (and B, C)) 224712e1936fSTing Wang def : xxevalPattern<(vnot (or v4i32:$vA, (and v4i32:$vB, v4i32:$vC))), 224>; 224812e1936fSTing Wang // (nor A, (eqv B, C)) 224912e1936fSTing Wang def : xxevalPattern<(and (vnot v4i32:$vA), (xor v4i32:$vB, v4i32:$vC)), 96>; 225012e1936fSTing Wang // (nor A, (nand B, C)) 225112e1936fSTing Wang def : xxevalPattern<(and (vnot v4i32:$vA), (and v4i32:$vB, v4i32:$vC)), 16>; 225212e1936fSTing Wang // (nor A, (nor B, C)) 225312e1936fSTing Wang def : xxevalPattern<(and (vnot v4i32:$vA), (or v4i32:$vB, v4i32:$vC)), 112>; 225412e1936fSTing Wang // (nor A, (xor B, C)) 225512e1936fSTing Wang def : xxevalPattern<(vnot (or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC))), 144>; 225612e1936fSTing Wang 225712e1936fSTing Wang // OR 225812e1936fSTing Wang // (or A, B, C) 225912e1936fSTing Wang def : xxevalPattern<(or v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 127>; 226012e1936fSTing Wang // (or A, (and B, C)) 226112e1936fSTing Wang def : xxevalPattern<(or v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 31>; 226212e1936fSTing Wang // (or A, (eqv B, C)) 226312e1936fSTing Wang def : xxevalPattern<(or v4i32:$vA, (vnot (xor v4i32:$vB, v4i32:$vC))), 159>; 226412e1936fSTing Wang // (or A, (nand B, C)) 226512e1936fSTing Wang def : xxevalPattern<(or v4i32:$vA, (vnot (and v4i32:$vB, v4i32:$vC))), 239>; 226612e1936fSTing Wang // (or A, (nor B, C)) 226712e1936fSTing Wang def : xxevalPattern<(or v4i32:$vA, (vnot (or v4i32:$vB, v4i32:$vC))), 143>; 226812e1936fSTing Wang // (or A, (xor B, C)) 226912e1936fSTing Wang def : xxevalPattern<(or v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 111>; 227012e1936fSTing Wang 227112e1936fSTing Wang // XOR 227212e1936fSTing Wang // (xor A, B, C) 227312e1936fSTing Wang def : xxevalPattern<(xor v4i32:$vA, (xor v4i32:$vB, v4i32:$vC)), 105>; 227412e1936fSTing Wang // (xor A, (and B, C)) 227512e1936fSTing Wang def : xxevalPattern<(xor v4i32:$vA, (and v4i32:$vB, v4i32:$vC)), 30>; 227612e1936fSTing Wang // (xor A, (or B, C)) 227712e1936fSTing Wang def : xxevalPattern<(xor v4i32:$vA, (or v4i32:$vB, v4i32:$vC)), 120>; 227812e1936fSTing Wang 22795abe6c31SLei Huang // Anonymous patterns to select prefixed VSX loads and stores. 22805abe6c31SLei Huang // Load / Store f128 22815abe6c31SLei Huang def : Pat<(f128 (load PDForm:$src)), 22825abe6c31SLei Huang (COPY_TO_REGCLASS (PLXV memri34:$src), VRRC)>; 22835abe6c31SLei Huang def : Pat<(store f128:$XS, PDForm:$dst), 22845abe6c31SLei Huang (PSTXV (COPY_TO_REGCLASS $XS, VSRC), memri34:$dst)>; 22855abe6c31SLei Huang 22865abe6c31SLei Huang // Load / Store v4i32 22875abe6c31SLei Huang def : Pat<(v4i32 (load PDForm:$src)), (PLXV memri34:$src)>; 22885abe6c31SLei Huang def : Pat<(store v4i32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 22895abe6c31SLei Huang 22905abe6c31SLei Huang // Load / Store v2i64 22915abe6c31SLei Huang def : Pat<(v2i64 (load PDForm:$src)), (PLXV memri34:$src)>; 22925abe6c31SLei Huang def : Pat<(store v2i64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 22935abe6c31SLei Huang 22945abe6c31SLei Huang // Load / Store v4f32 22955abe6c31SLei Huang def : Pat<(v4f32 (load PDForm:$src)), (PLXV memri34:$src)>; 22965abe6c31SLei Huang def : Pat<(store v4f32:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 22975abe6c31SLei Huang 22985abe6c31SLei Huang // Load / Store v2f64 22995abe6c31SLei Huang def : Pat<(v2f64 (load PDForm:$src)), (PLXV memri34:$src)>; 23005abe6c31SLei Huang def : Pat<(store v2f64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; 23015abe6c31SLei Huang 23025abe6c31SLei Huang // Cases For PPCstore_scal_int_from_vsr 230369bc8ff7SQiu Chaofan def : Pat<(PPCstore_scal_int_from_vsr f64:$src, PDForm:$dst, 8), 230469bc8ff7SQiu Chaofan (PSTXSD $src, PDForm:$dst)>; 230569bc8ff7SQiu Chaofan def : Pat<(PPCstore_scal_int_from_vsr f128:$src, PDForm:$dst, 8), 230669bc8ff7SQiu Chaofan (PSTXSD (COPY_TO_REGCLASS $src, VFRC), PDForm:$dst)>; 23075abe6c31SLei Huang } 23085abe6c31SLei Huang 2309b41dbe60Szhijian lin 23105abe6c31SLei Huang def : Pat<(i32 imm34:$imm), (PLI (getImmAs64BitInt imm:$imm))>; 23115abe6c31SLei Huang def : Pat<(i64 imm34:$imm), (PLI8 (getImmAs64BitInt imm:$imm))>; 23125abe6c31SLei Huang def : Pat<(v16i8 (int_ppc_vsx_xxpermx v16i8:$A, v16i8:$B, v16i8:$C, timm:$D)), 23135abe6c31SLei Huang (COPY_TO_REGCLASS (XXPERMX (COPY_TO_REGCLASS $A, VSRC), 23145abe6c31SLei Huang (COPY_TO_REGCLASS $B, VSRC), 23155abe6c31SLei Huang (COPY_TO_REGCLASS $C, VSRC), $D), VSRC)>; 23165abe6c31SLei Huang def : Pat<(v16i8 (int_ppc_vsx_xxblendvb v16i8:$A, v16i8:$B, v16i8:$C)), 23175abe6c31SLei Huang (COPY_TO_REGCLASS 23185abe6c31SLei Huang (XXBLENDVB (COPY_TO_REGCLASS $A, VSRC), 23195abe6c31SLei Huang (COPY_TO_REGCLASS $B, VSRC), 23205abe6c31SLei Huang (COPY_TO_REGCLASS $C, VSRC)), VSRC)>; 23215abe6c31SLei Huang def : Pat<(v8i16 (int_ppc_vsx_xxblendvh v8i16:$A, v8i16:$B, v8i16:$C)), 23225abe6c31SLei Huang (COPY_TO_REGCLASS 23235abe6c31SLei Huang (XXBLENDVH (COPY_TO_REGCLASS $A, VSRC), 23245abe6c31SLei Huang (COPY_TO_REGCLASS $B, VSRC), 23255abe6c31SLei Huang (COPY_TO_REGCLASS $C, VSRC)), VSRC)>; 23265abe6c31SLei Huang def : Pat<(int_ppc_vsx_xxblendvw v4i32:$A, v4i32:$B, v4i32:$C), 23275abe6c31SLei Huang (XXBLENDVW $A, $B, $C)>; 23285abe6c31SLei Huang def : Pat<(int_ppc_vsx_xxblendvd v2i64:$A, v2i64:$B, v2i64:$C), 23295abe6c31SLei Huang (XXBLENDVD $A, $B, $C)>; 23306127f15eSzhijian lin} 23315abe6c31SLei Huang 23326127f15eSzhijian linlet Predicates = [PrefixInstrs] in { 23335abe6c31SLei Huang // Anonymous patterns to select prefixed loads and stores. 23345abe6c31SLei Huang // Load i32 23355abe6c31SLei Huang def : Pat<(i32 (extloadi1 PDForm:$src)), (PLBZ memri34:$src)>; 23365abe6c31SLei Huang def : Pat<(i32 (zextloadi1 PDForm:$src)), (PLBZ memri34:$src)>; 23375abe6c31SLei Huang def : Pat<(i32 (extloadi8 PDForm:$src)), (PLBZ memri34:$src)>; 23385abe6c31SLei Huang def : Pat<(i32 (zextloadi8 PDForm:$src)), (PLBZ memri34:$src)>; 23395abe6c31SLei Huang def : Pat<(i32 (extloadi16 PDForm:$src)), (PLHZ memri34:$src)>; 23405abe6c31SLei Huang def : Pat<(i32 (zextloadi16 PDForm:$src)), (PLHZ memri34:$src)>; 23415abe6c31SLei Huang def : Pat<(i32 (sextloadi16 PDForm:$src)), (PLHA memri34:$src)>; 23425abe6c31SLei Huang def : Pat<(i32 (load PDForm:$src)), (PLWZ memri34:$src)>; 23435abe6c31SLei Huang 23445abe6c31SLei Huang // Store i32 23455abe6c31SLei Huang def : Pat<(truncstorei8 i32:$rS, PDForm:$dst), (PSTB gprc:$rS, memri34:$dst)>; 23465abe6c31SLei Huang def : Pat<(truncstorei16 i32:$rS, PDForm:$dst), (PSTH gprc:$rS, memri34:$dst)>; 23475abe6c31SLei Huang def : Pat<(store i32:$rS, PDForm:$dst), (PSTW gprc:$rS, memri34:$dst)>; 23485abe6c31SLei Huang 23495abe6c31SLei Huang // Load i64 23505abe6c31SLei Huang def : Pat<(i64 (extloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>; 23515abe6c31SLei Huang def : Pat<(i64 (zextloadi1 PDForm:$src)), (PLBZ8 memri34:$src)>; 23525abe6c31SLei Huang def : Pat<(i64 (extloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>; 23535abe6c31SLei Huang def : Pat<(i64 (zextloadi8 PDForm:$src)), (PLBZ8 memri34:$src)>; 23545abe6c31SLei Huang def : Pat<(i64 (extloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>; 23555abe6c31SLei Huang def : Pat<(i64 (zextloadi16 PDForm:$src)), (PLHZ8 memri34:$src)>; 23565abe6c31SLei Huang def : Pat<(i64 (sextloadi16 PDForm:$src)), (PLHA8 memri34:$src)>; 23575abe6c31SLei Huang def : Pat<(i64 (extloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>; 23585abe6c31SLei Huang def : Pat<(i64 (zextloadi32 PDForm:$src)), (PLWZ8 memri34:$src)>; 23595abe6c31SLei Huang def : Pat<(i64 (sextloadi32 PDForm:$src)), (PLWA8 memri34:$src)>; 23605abe6c31SLei Huang def : Pat<(i64 (load PDForm:$src)), (PLD memri34:$src)>; 23615abe6c31SLei Huang 23625abe6c31SLei Huang // Store i64 23635abe6c31SLei Huang def : Pat<(truncstorei8 i64:$rS, PDForm:$dst), (PSTB8 g8rc:$rS, memri34:$dst)>; 23645abe6c31SLei Huang def : Pat<(truncstorei16 i64:$rS, PDForm:$dst), (PSTH8 g8rc:$rS, memri34:$dst)>; 23655abe6c31SLei Huang def : Pat<(truncstorei32 i64:$rS, PDForm:$dst), (PSTW8 g8rc:$rS, memri34:$dst)>; 23665abe6c31SLei Huang def : Pat<(store i64:$rS, PDForm:$dst), (PSTD g8rc:$rS, memri34:$dst)>; 2367b41dbe60Szhijian lin 2368b41dbe60Szhijian lin // Atomic Load 2369b41dbe60Szhijian lin def : Pat<(i32 (atomic_load_8 PDForm:$src)), (PLBZ memri34:$src)>; 2370b41dbe60Szhijian lin def : Pat<(i32 (atomic_load_16 PDForm:$src)), (PLHZ memri34:$src)>; 2371b41dbe60Szhijian lin def : Pat<(i32 (atomic_load_32 PDForm:$src)), (PLWZ memri34:$src)>; 2372b41dbe60Szhijian lin def : Pat<(i64 (atomic_load_64 PDForm:$src)), (PLD memri34:$src)>; 2373b41dbe60Szhijian lin 2374b41dbe60Szhijian lin // Atomic Store 2375b41dbe60Szhijian lin def : Pat<(atomic_store_8 i32:$RS, PDForm:$dst), (PSTB $RS, memri34:$dst)>; 2376b41dbe60Szhijian lin def : Pat<(atomic_store_16 i32:$RS, PDForm:$dst), (PSTH $RS, memri34:$dst)>; 2377b41dbe60Szhijian lin def : Pat<(atomic_store_32 i32:$RS, PDForm:$dst), (PSTW $RS, memri34:$dst)>; 2378b41dbe60Szhijian lin def : Pat<(atomic_store_64 i64:$RS, PDForm:$dst), (PSTD $RS, memri34:$dst)>; 23796127f15eSzhijian lin} 23805abe6c31SLei Huang 23816127f15eSzhijian linlet Predicates = [PrefixInstrs, HasFPU] in { 23825abe6c31SLei Huang // Load / Store f32 23835abe6c31SLei Huang def : Pat<(f32 (load PDForm:$src)), (PLFS memri34:$src)>; 23845abe6c31SLei Huang def : Pat<(store f32:$FRS, PDForm:$dst), (PSTFS $FRS, memri34:$dst)>; 23855abe6c31SLei Huang 23865abe6c31SLei Huang // Load / Store f64 23875abe6c31SLei Huang def : Pat<(f64 (extloadf32 PDForm:$src)), 23885abe6c31SLei Huang (COPY_TO_REGCLASS (PLFS memri34:$src), VSFRC)>; 23895abe6c31SLei Huang def : Pat<(f64 (load PDForm:$src)), (PLFD memri34:$src)>; 23905abe6c31SLei Huang def : Pat<(store f64:$FRS, PDForm:$dst), (PSTFD $FRS, memri34:$dst)>; 23916127f15eSzhijian lin // Prefixed fpext to v2f64 23926127f15eSzhijian lin def : Pat<(v4f32 (PPCldvsxlh PDForm:$src)), 23936127f15eSzhijian lin (SUBREG_TO_REG (i64 1), (PLFD PDForm:$src), sub_64)>; 23945abe6c31SLei Huang 23956127f15eSzhijian lin} 23966127f15eSzhijian lin 23975abe6c31SLei Huangdef InsertEltShift { 23985abe6c31SLei Huang dag Sub32 = (i32 (EXTRACT_SUBREG $rB, sub_32)); 23995abe6c31SLei Huang dag Sub32Left1 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 1, 0, 30); 24005abe6c31SLei Huang dag Sub32Left2 = (RLWINM (EXTRACT_SUBREG $rB, sub_32), 2, 0, 29); 24015abe6c31SLei Huang dag Left1 = (RLWINM $rB, 1, 0, 30); 24025abe6c31SLei Huang dag Left2 = (RLWINM $rB, 2, 0, 29); 24035abe6c31SLei Huang dag Left3 = (RLWINM8 $rB, 3, 0, 28); 24045abe6c31SLei Huang} 24055abe6c31SLei Huang 24065abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX, IsLittleEndian] in { 24075abe6c31SLei Huang // Indexed vector insert element 24085abe6c31SLei Huang def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)), 24095abe6c31SLei Huang (VINSBRX $vDi, InsertEltShift.Sub32, $rA)>; 24105abe6c31SLei Huang def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)), 24115abe6c31SLei Huang (VINSHRX $vDi, InsertEltShift.Sub32Left1, $rA)>; 24125abe6c31SLei Huang def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)), 24135abe6c31SLei Huang (VINSWRX $vDi, InsertEltShift.Sub32Left2, $rA)>; 24145abe6c31SLei Huang def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)), 24155abe6c31SLei Huang (VINSDRX $vDi, InsertEltShift.Left3, $rA)>; 24165abe6c31SLei Huang 24175abe6c31SLei Huang def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)), 24185abe6c31SLei Huang (VINSWVRX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>; 24195abe6c31SLei Huang 24205abe6c31SLei Huang def : Pat<(v2f64 (insertelt v2f64:$vDi, f64:$A, i64:$rB)), 24215abe6c31SLei Huang (VINSDRX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>; 24225abe6c31SLei Huang def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)), 24235abe6c31SLei Huang (VINSDRX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>; 24245abe6c31SLei Huang def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)), 24255abe6c31SLei Huang (VINSDRX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>; 24265abe6c31SLei Huang def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)), 24275abe6c31SLei Huang (VINSDRX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>; 24285abe6c31SLei Huang let AddedComplexity = 400 in { 24295abe6c31SLei Huang // Immediate vector insert element 24305abe6c31SLei Huang foreach Idx = [0, 1, 2, 3] in { 24315abe6c31SLei Huang def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, Idx)), 24325abe6c31SLei Huang (VINSW $vDi, !mul(!sub(3, Idx), 4), $rA)>; 24335abe6c31SLei Huang } 24345abe6c31SLei Huang foreach i = [0, 1] in 24355abe6c31SLei Huang def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, (i64 i))), 24365abe6c31SLei Huang (VINSD $vDi, !mul(!sub(1, i), 8), $rA)>; 24375abe6c31SLei Huang } 24385abe6c31SLei Huang} 24395abe6c31SLei Huang 24405abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC32] in { 24415abe6c31SLei Huang // Indexed vector insert element 24425abe6c31SLei Huang def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i32:$rB)), 24435abe6c31SLei Huang (VINSBLX $vDi, $rB, $rA)>; 24445abe6c31SLei Huang def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i32:$rB)), 24455abe6c31SLei Huang (VINSHLX $vDi, InsertEltShift.Left1, $rA)>; 24465abe6c31SLei Huang def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i32:$rB)), 24475abe6c31SLei Huang (VINSWLX $vDi, InsertEltShift.Left2, $rA)>; 24485abe6c31SLei Huang 24495abe6c31SLei Huang def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i32:$rB)), 24505abe6c31SLei Huang (VINSWVLX $vDi, InsertEltShift.Left2, (XSCVDPSPN $rA))>; 24515abe6c31SLei Huang} 24525abe6c31SLei Huang 24535abe6c31SLei Huanglet Predicates = [IsISA3_1, HasVSX, IsBigEndian, IsPPC64] in { 24545abe6c31SLei Huang // Indexed vector insert element 24555abe6c31SLei Huang def : Pat<(v16i8 (vector_insert v16i8:$vDi, i32:$rA, i64:$rB)), 24565abe6c31SLei Huang (VINSBLX $vDi, InsertEltShift.Sub32, $rA)>; 24575abe6c31SLei Huang def : Pat<(v8i16 (vector_insert v8i16:$vDi, i32:$rA, i64:$rB)), 24585abe6c31SLei Huang (VINSHLX $vDi, InsertEltShift.Sub32Left1, $rA)>; 24595abe6c31SLei Huang def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, i64:$rB)), 24605abe6c31SLei Huang (VINSWLX $vDi, InsertEltShift.Sub32Left2, $rA)>; 24615abe6c31SLei Huang def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, i64:$rB)), 24625abe6c31SLei Huang (VINSDLX $vDi, InsertEltShift.Left3, $rA)>; 24635abe6c31SLei Huang 24645abe6c31SLei Huang def : Pat<(v4f32 (insertelt v4f32:$vDi, f32:$rA, i64:$rB)), 24655abe6c31SLei Huang (VINSWVLX $vDi, InsertEltShift.Sub32Left2, (XSCVDPSPN $rA))>; 24665abe6c31SLei Huang 24675abe6c31SLei Huang def : Pat<(v2f64 (insertelt v2f64:$vDi, f64:$A, i64:$rB)), 24685abe6c31SLei Huang (VINSDLX $vDi, InsertEltShift.Left3, Bitcast.DblToLong)>; 24695abe6c31SLei Huang def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load DSForm:$rA)), i64:$rB)), 24705abe6c31SLei Huang (VINSDLX $vDi, InsertEltShift.Left3, (LD memrix:$rA))>; 24715abe6c31SLei Huang def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load PDForm:$rA)), i64:$rB)), 24725abe6c31SLei Huang (VINSDLX $vDi, InsertEltShift.Left3, (PLD memri34:$rA))>; 24735abe6c31SLei Huang def : Pat<(v2f64 (insertelt v2f64:$vDi, (f64 (load XForm:$rA)), i64:$rB)), 24745abe6c31SLei Huang (VINSDLX $vDi, InsertEltShift.Left3, (LDX memrr:$rA))>; 24755abe6c31SLei Huang} 24765abe6c31SLei Huang 24775abe6c31SLei Huanglet AddedComplexity = 400, Predicates = [IsISA3_1, HasVSX, IsBigEndian] in { 24785abe6c31SLei Huang // Immediate vector insert element 24795abe6c31SLei Huang foreach Ty = [i32, i64] in { 24805abe6c31SLei Huang foreach Idx = [0, 1, 2, 3] in { 24815abe6c31SLei Huang def : Pat<(v4i32 (insertelt v4i32:$vDi, i32:$rA, (Ty Idx))), 24825abe6c31SLei Huang (VINSW $vDi, !mul(Idx, 4), $rA)>; 24835abe6c31SLei Huang } 24845abe6c31SLei Huang } 24855abe6c31SLei Huang 24865abe6c31SLei Huang foreach Idx = [0, 1] in 24875abe6c31SLei Huang def : Pat<(v2i64 (insertelt v2i64:$vDi, i64:$rA, Idx)), 24885abe6c31SLei Huang (VINSD $vDi, !mul(Idx, 8), $rA)>; 24895abe6c31SLei Huang} 2490ea8b95d0SStefan Pintilie 2491ea8b95d0SStefan Pintilie 2492ea8b95d0SStefan Pintilie//===----------------------------------------------------------------------===// 2493ea8b95d0SStefan Pintilie// PowerPC ISA 3.1 Extended Mnemonics. 2494ea8b95d0SStefan Pintilie// 2495ea8b95d0SStefan Pintilie 2496ea8b95d0SStefan Pintilielet Predicates = [IsISA3_1] in { 2497ea8b95d0SStefan Pintilie def : InstAlias<"wait", (WAITP10 0, 0)>; 2498ea8b95d0SStefan Pintilie def : InstAlias<"wait 0", (WAITP10 0, 0), 0>; 2499ea8b95d0SStefan Pintilie def : InstAlias<"wait 1", (WAITP10 1, 0), 0>; 2500ea8b95d0SStefan Pintilie def : InstAlias<"waitrsv", (WAITP10 1, 0)>; 2501ea8b95d0SStefan Pintilie def : InstAlias<"pause_short", (WAITP10 2, 0), 0>; 2502ea8b95d0SStefan Pintilie 2503ea8b95d0SStefan Pintilie def : InstAlias<"sync", (SYNCP10 0, 0)>; 2504ea8b95d0SStefan Pintilie def : InstAlias<"hwsync", (SYNCP10 0, 0), 0>; 2505ea8b95d0SStefan Pintilie def : InstAlias<"wsync", (SYNCP10 1, 0), 0>; 2506ea8b95d0SStefan Pintilie def : InstAlias<"ptesync", (SYNCP10 2, 0)>; 2507ea8b95d0SStefan Pintilie def : InstAlias<"phwsync", (SYNCP10 4, 0)>; 2508ea8b95d0SStefan Pintilie def : InstAlias<"plwsync", (SYNCP10 5, 0)>; 2509ea8b95d0SStefan Pintilie def : InstAlias<"sync $L", (SYNCP10 u3imm:$L, 0)>; 2510ea8b95d0SStefan Pintilie def : InstAlias<"stncisync", (SYNCP10 1, 1)>; 2511ea8b95d0SStefan Pintilie def : InstAlias<"stcisync", (SYNCP10 0, 2)>; 2512ea8b95d0SStefan Pintilie def : InstAlias<"stsync", (SYNCP10 0, 3)>; 2513ea8b95d0SStefan Pintilie 2514ea8b95d0SStefan Pintilie def : InstAlias<"paddi $RT, $RA, $SI", (PADDI8 g8rc:$RT, g8rc_nox0:$RA, s34imm:$SI)>; 2515ea8b95d0SStefan Pintilie} 2516ea8b95d0SStefan Pintilie 2517ea8b95d0SStefan Pintilielet Predicates = [IsISA3_1, PrefixInstrs], isAsmParserOnly = 1, hasNoSchedulingInfo = 1 in { 2518ea8b95d0SStefan Pintilie let Interpretation64Bit = 1 in { 2519ea8b95d0SStefan Pintilie def PLA8 : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT), 2520ea8b95d0SStefan Pintilie (ins g8rc_nox0:$RA, s34imm:$SI), 252148cc4351SJake Egan "pla $RT, ${SI} ${RA}", IIC_IntSimple, []>, MemriOp; 2522ea8b95d0SStefan Pintilie def PLA8pc : MLS_DForm_SI34_RT5<14, (outs g8rc:$RT), 2523ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$SI), 2524ea8b95d0SStefan Pintilie "pla $RT, $SI", IIC_IntSimple, []>, isPCRel; 2525ea8b95d0SStefan Pintilie } 2526ea8b95d0SStefan Pintilie 2527ea8b95d0SStefan Pintilie def PSUBI : PPCAsmPseudo<"psubi $RT, $RA, $SI", 2528ea8b95d0SStefan Pintilie (ins g8rc:$RT, g8rc_nox0:$RA, s34imm:$SI)>; 2529ea8b95d0SStefan Pintilie 2530ea8b95d0SStefan Pintilie def PLA : MLS_DForm_SI34_RT5<14, (outs gprc:$RT), 2531ea8b95d0SStefan Pintilie (ins gprc_nor0:$RA, s34imm:$SI), 253248cc4351SJake Egan "pla $RT, ${SI} ${RA}", IIC_IntSimple, []>, MemriOp; 2533ea8b95d0SStefan Pintilie def PLApc : MLS_DForm_SI34_RT5<14, (outs gprc:$RT), 2534ea8b95d0SStefan Pintilie (ins s34imm_pcrel:$SI), 2535ea8b95d0SStefan Pintilie "pla $RT, $SI", IIC_IntSimple, []>, isPCRel; 2536ea8b95d0SStefan Pintilie} 2537