10b57cec5SDimitry Andric//===- PPCInstrVSX.td - The PowerPC VSX Extension --*- tablegen -*-===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This file describes the VSX extension to the PowerPC instruction set. 100b57cec5SDimitry Andric// 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric// *********************************** NOTE *********************************** 140b57cec5SDimitry Andric// ** For POWER8 Little Endian, the VSX swap optimization relies on knowing ** 150b57cec5SDimitry Andric// ** which VMX and VSX instructions are lane-sensitive and which are not. ** 160b57cec5SDimitry Andric// ** A lane-sensitive instruction relies, implicitly or explicitly, on ** 170b57cec5SDimitry Andric// ** whether lanes are numbered from left to right. An instruction like ** 180b57cec5SDimitry Andric// ** VADDFP is not lane-sensitive, because each lane of the result vector ** 190b57cec5SDimitry Andric// ** relies only on the corresponding lane of the source vectors. However, ** 200b57cec5SDimitry Andric// ** an instruction like VMULESB is lane-sensitive, because "even" and ** 210b57cec5SDimitry Andric// ** "odd" lanes are different for big-endian and little-endian numbering. ** 220b57cec5SDimitry Andric// ** ** 230b57cec5SDimitry Andric// ** When adding new VMX and VSX instructions, please consider whether they ** 240b57cec5SDimitry Andric// ** are lane-sensitive. If so, they must be added to a switch statement ** 250b57cec5SDimitry Andric// ** in PPCVSXSwapRemoval::gatherVectorInstructions(). ** 260b57cec5SDimitry Andric// **************************************************************************** 270b57cec5SDimitry Andric 285ffd83dbSDimitry Andric// *********************************** NOTE *********************************** 295ffd83dbSDimitry Andric// ** When adding new anonymous patterns to this file, please add them to ** 305ffd83dbSDimitry Andric// ** the section titled Anonymous Patterns. Chances are that the existing ** 315ffd83dbSDimitry Andric// ** predicate blocks already contain a combination of features that you ** 325ffd83dbSDimitry Andric// ** are after. There is a list of blocks at the top of the section. If ** 335ffd83dbSDimitry Andric// ** you definitely need a new combination of predicates, please add that ** 345ffd83dbSDimitry Andric// ** combination to the list. ** 355ffd83dbSDimitry Andric// ** File Structure: ** 365ffd83dbSDimitry Andric// ** - Custom PPCISD node definitions ** 375ffd83dbSDimitry Andric// ** - Predicate definitions: predicates to specify the subtargets for ** 385ffd83dbSDimitry Andric// ** which an instruction or pattern can be emitted. ** 395ffd83dbSDimitry Andric// ** - Instruction formats: classes instantiated by the instructions. ** 405ffd83dbSDimitry Andric// ** These generally correspond to instruction formats in section 1.6 of ** 415ffd83dbSDimitry Andric// ** the ISA document. ** 425ffd83dbSDimitry Andric// ** - Instruction definitions: the actual definitions of the instructions ** 435ffd83dbSDimitry Andric// ** often including input patterns that they match. ** 445ffd83dbSDimitry Andric// ** - Helper DAG definitions: We define a number of dag objects to use as ** 455ffd83dbSDimitry Andric// ** input or output patterns for consciseness of the code. ** 465ffd83dbSDimitry Andric// ** - Anonymous patterns: input patterns that an instruction matches can ** 475ffd83dbSDimitry Andric// ** often not be specified as part of the instruction definition, so an ** 485ffd83dbSDimitry Andric// ** anonymous pattern must be specified mapping an input pattern to an ** 495ffd83dbSDimitry Andric// ** output pattern. These are generally guarded by subtarget predicates. ** 505ffd83dbSDimitry Andric// ** - Instruction aliases: used to define extended mnemonics for assembly ** 515ffd83dbSDimitry Andric// ** printing (for example: xxswapd for xxpermdi with 0x2 as the imm). ** 525ffd83dbSDimitry Andric// **************************************************************************** 535ffd83dbSDimitry Andric 540b57cec5SDimitry Andricdef PPCRegVSRCAsmOperand : AsmOperandClass { 550b57cec5SDimitry Andric let Name = "RegVSRC"; let PredicateMethod = "isVSRegNumber"; 560b57cec5SDimitry Andric} 570b57cec5SDimitry Andricdef vsrc : RegisterOperand<VSRC> { 580b57cec5SDimitry Andric let ParserMatchClass = PPCRegVSRCAsmOperand; 590b57cec5SDimitry Andric} 600b57cec5SDimitry Andric 610b57cec5SDimitry Andricdef PPCRegVSFRCAsmOperand : AsmOperandClass { 620b57cec5SDimitry Andric let Name = "RegVSFRC"; let PredicateMethod = "isVSRegNumber"; 630b57cec5SDimitry Andric} 640b57cec5SDimitry Andricdef vsfrc : RegisterOperand<VSFRC> { 650b57cec5SDimitry Andric let ParserMatchClass = PPCRegVSFRCAsmOperand; 660b57cec5SDimitry Andric} 670b57cec5SDimitry Andric 680b57cec5SDimitry Andricdef PPCRegVSSRCAsmOperand : AsmOperandClass { 690b57cec5SDimitry Andric let Name = "RegVSSRC"; let PredicateMethod = "isVSRegNumber"; 700b57cec5SDimitry Andric} 710b57cec5SDimitry Andricdef vssrc : RegisterOperand<VSSRC> { 720b57cec5SDimitry Andric let ParserMatchClass = PPCRegVSSRCAsmOperand; 730b57cec5SDimitry Andric} 740b57cec5SDimitry Andric 750b57cec5SDimitry Andricdef PPCRegSPILLTOVSRRCAsmOperand : AsmOperandClass { 760b57cec5SDimitry Andric let Name = "RegSPILLTOVSRRC"; let PredicateMethod = "isVSRegNumber"; 770b57cec5SDimitry Andric} 780b57cec5SDimitry Andric 790b57cec5SDimitry Andricdef spilltovsrrc : RegisterOperand<SPILLTOVSRRC> { 800b57cec5SDimitry Andric let ParserMatchClass = PPCRegSPILLTOVSRRCAsmOperand; 810b57cec5SDimitry Andric} 820b57cec5SDimitry Andric 830b57cec5SDimitry Andricdef SDT_PPCldvsxlh : SDTypeProfile<1, 1, [ 840b57cec5SDimitry Andric SDTCisVT<0, v4f32>, SDTCisPtrTy<1> 850b57cec5SDimitry Andric]>; 860b57cec5SDimitry Andric 878bcb0991SDimitry Andricdef SDT_PPCfpexth : SDTypeProfile<1, 2, [ 888bcb0991SDimitry Andric SDTCisVT<0, v2f64>, SDTCisVT<1, v4f32>, SDTCisPtrTy<2> 898bcb0991SDimitry Andric]>; 908bcb0991SDimitry Andric 918bcb0991SDimitry Andricdef SDT_PPCldsplat : SDTypeProfile<1, 1, [ 928bcb0991SDimitry Andric SDTCisVec<0>, SDTCisPtrTy<1> 930b57cec5SDimitry Andric]>; 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric// Little-endian-specific nodes. 960b57cec5SDimitry Andricdef SDT_PPClxvd2x : SDTypeProfile<1, 1, [ 970b57cec5SDimitry Andric SDTCisVT<0, v2f64>, SDTCisPtrTy<1> 980b57cec5SDimitry Andric]>; 990b57cec5SDimitry Andricdef SDT_PPCstxvd2x : SDTypeProfile<0, 2, [ 1000b57cec5SDimitry Andric SDTCisVT<0, v2f64>, SDTCisPtrTy<1> 1010b57cec5SDimitry Andric]>; 1020b57cec5SDimitry Andricdef SDT_PPCxxswapd : SDTypeProfile<1, 1, [ 1030b57cec5SDimitry Andric SDTCisSameAs<0, 1> 1040b57cec5SDimitry Andric]>; 1050b57cec5SDimitry Andricdef SDTVecConv : SDTypeProfile<1, 2, [ 1060b57cec5SDimitry Andric SDTCisVec<0>, SDTCisVec<1>, SDTCisPtrTy<2> 1070b57cec5SDimitry Andric]>; 1080b57cec5SDimitry Andricdef SDTVabsd : SDTypeProfile<1, 3, [ 1090b57cec5SDimitry Andric SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisVT<3, i32> 1100b57cec5SDimitry Andric]>; 1118bcb0991SDimitry Andricdef SDT_PPCld_vec_be : SDTypeProfile<1, 1, [ 1128bcb0991SDimitry Andric SDTCisVec<0>, SDTCisPtrTy<1> 1138bcb0991SDimitry Andric]>; 1148bcb0991SDimitry Andricdef SDT_PPCst_vec_be : SDTypeProfile<0, 2, [ 1158bcb0991SDimitry Andric SDTCisVec<0>, SDTCisPtrTy<1> 1168bcb0991SDimitry Andric]>; 1170b57cec5SDimitry Andric 1185ffd83dbSDimitry Andric//--------------------------- Custom PPC nodes -------------------------------// 1190b57cec5SDimitry Andricdef PPClxvd2x : SDNode<"PPCISD::LXVD2X", SDT_PPClxvd2x, 1200b57cec5SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1210b57cec5SDimitry Andricdef PPCstxvd2x : SDNode<"PPCISD::STXVD2X", SDT_PPCstxvd2x, 1220b57cec5SDimitry Andric [SDNPHasChain, SDNPMayStore]>; 1238bcb0991SDimitry Andricdef PPCld_vec_be : SDNode<"PPCISD::LOAD_VEC_BE", SDT_PPCld_vec_be, 1248bcb0991SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1258bcb0991SDimitry Andricdef PPCst_vec_be : SDNode<"PPCISD::STORE_VEC_BE", SDT_PPCst_vec_be, 1268bcb0991SDimitry Andric [SDNPHasChain, SDNPMayStore]>; 1270b57cec5SDimitry Andricdef PPCxxswapd : SDNode<"PPCISD::XXSWAPD", SDT_PPCxxswapd, [SDNPHasChain]>; 1280b57cec5SDimitry Andricdef PPCmfvsr : SDNode<"PPCISD::MFVSR", SDTUnaryOp, []>; 1290b57cec5SDimitry Andricdef PPCmtvsra : SDNode<"PPCISD::MTVSRA", SDTUnaryOp, []>; 1300b57cec5SDimitry Andricdef PPCmtvsrz : SDNode<"PPCISD::MTVSRZ", SDTUnaryOp, []>; 1310b57cec5SDimitry Andricdef PPCsvec2fp : SDNode<"PPCISD::SINT_VEC_TO_FP", SDTVecConv, []>; 1320b57cec5SDimitry Andricdef PPCuvec2fp: SDNode<"PPCISD::UINT_VEC_TO_FP", SDTVecConv, []>; 1330b57cec5SDimitry Andricdef PPCswapNoChain : SDNode<"PPCISD::SWAP_NO_CHAIN", SDT_PPCxxswapd>; 1340b57cec5SDimitry Andricdef PPCvabsd : SDNode<"PPCISD::VABSD", SDTVabsd, []>; 1350b57cec5SDimitry Andric 1368bcb0991SDimitry Andricdef PPCfpexth : SDNode<"PPCISD::FP_EXTEND_HALF", SDT_PPCfpexth, []>; 1370b57cec5SDimitry Andricdef PPCldvsxlh : SDNode<"PPCISD::LD_VSX_LH", SDT_PPCldvsxlh, 1380b57cec5SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1398bcb0991SDimitry Andricdef PPCldsplat : SDNode<"PPCISD::LD_SPLAT", SDT_PPCldsplat, 1408bcb0991SDimitry Andric [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; 1415ffd83dbSDimitry Andricdef PPCSToV : SDNode<"PPCISD::SCALAR_TO_VECTOR_PERMUTED", 1425ffd83dbSDimitry Andric SDTypeProfile<1, 1, []>, []>; 1430b57cec5SDimitry Andric 1445ffd83dbSDimitry Andric//-------------------------- Predicate definitions ---------------------------// 1455ffd83dbSDimitry Andricdef HasVSX : Predicate<"Subtarget->hasVSX()">; 1465ffd83dbSDimitry Andricdef IsLittleEndian : Predicate<"Subtarget->isLittleEndian()">; 1475ffd83dbSDimitry Andricdef IsBigEndian : Predicate<"!Subtarget->isLittleEndian()">; 148e8d8bef9SDimitry Andricdef IsPPC64 : Predicate<"Subtarget->isPPC64()">; 1495ffd83dbSDimitry Andricdef HasOnlySwappingMemOps : Predicate<"!Subtarget->hasP9Vector()">; 1505ffd83dbSDimitry Andricdef HasP8Vector : Predicate<"Subtarget->hasP8Vector()">; 1515ffd83dbSDimitry Andricdef HasDirectMove : Predicate<"Subtarget->hasDirectMove()">; 1525ffd83dbSDimitry Andricdef NoP9Vector : Predicate<"!Subtarget->hasP9Vector()">; 1535ffd83dbSDimitry Andricdef HasP9Vector : Predicate<"Subtarget->hasP9Vector()">; 1545ffd83dbSDimitry Andricdef NoP9Altivec : Predicate<"!Subtarget->hasP9Altivec()">; 155*fe6060f1SDimitry Andricdef NoP10Vector: Predicate<"!Subtarget->hasP10Vector()">; 1565ffd83dbSDimitry Andric 1575ffd83dbSDimitry Andric//--------------------- VSX-specific instruction formats ---------------------// 1585ffd83dbSDimitry Andric// By default, all VSX instructions are to be selected over their Altivec 1595ffd83dbSDimitry Andric// counter parts and they do not have unmodeled sideeffects. 1605ffd83dbSDimitry Andriclet AddedComplexity = 400, hasSideEffects = 0 in { 1610b57cec5SDimitry Andricmulticlass XX3Form_Rcr<bits<6> opcode, bits<7> xo, string asmbase, 1620b57cec5SDimitry Andric string asmstr, InstrItinClass itin, Intrinsic Int, 1630b57cec5SDimitry Andric ValueType OutTy, ValueType InTy> { 1640b57cec5SDimitry Andric let BaseName = asmbase in { 1650b57cec5SDimitry Andric def NAME : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 1660b57cec5SDimitry Andric !strconcat(asmbase, !strconcat(" ", asmstr)), itin, 1670b57cec5SDimitry Andric [(set OutTy:$XT, (Int InTy:$XA, InTy:$XB))]>; 1680b57cec5SDimitry Andric let Defs = [CR6] in 169480093f4SDimitry Andric def _rec : XX3Form_Rc<opcode, xo, (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 1700b57cec5SDimitry Andric !strconcat(asmbase, !strconcat(". ", asmstr)), itin, 1710b57cec5SDimitry Andric [(set InTy:$XT, 172e8d8bef9SDimitry Andric (InTy (PPCvcmp_rec InTy:$XA, InTy:$XB, xo)))]>, 173480093f4SDimitry Andric isRecordForm; 1740b57cec5SDimitry Andric } 1750b57cec5SDimitry Andric} 1760b57cec5SDimitry Andric 1770b57cec5SDimitry Andric// Instruction form with a single input register for instructions such as 1780b57cec5SDimitry Andric// XXPERMDI. The reason for defining this is that specifying multiple chained 1790b57cec5SDimitry Andric// operands (such as loads) to an instruction will perform both chained 1800b57cec5SDimitry Andric// operations rather than coalescing them into a single register - even though 1810b57cec5SDimitry Andric// the source memory location is the same. This simply forces the instruction 1820b57cec5SDimitry Andric// to use the same register for both inputs. 1830b57cec5SDimitry Andric// For example, an output DAG such as this: 1840b57cec5SDimitry Andric// (XXPERMDI (LXSIBZX xoaddr:$src), (LXSIBZX xoaddr:$src ), 0)) 1850b57cec5SDimitry Andric// would result in two load instructions emitted and used as separate inputs 1860b57cec5SDimitry Andric// to the XXPERMDI instruction. 1870b57cec5SDimitry Andricclass XX3Form_2s<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 1880b57cec5SDimitry Andric InstrItinClass itin, list<dag> pattern> 1890b57cec5SDimitry Andric : XX3Form_2<opcode, xo, OOL, IOL, asmstr, itin, pattern> { 1900b57cec5SDimitry Andric let XB = XA; 1910b57cec5SDimitry Andric} 1920b57cec5SDimitry Andric 1935ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP9Vector] in { 1945ffd83dbSDimitry Andricclass X_VT5_XO5_VB5<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc, 1955ffd83dbSDimitry Andric list<dag> pattern> 1965ffd83dbSDimitry Andric : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vrrc:$vB), 1975ffd83dbSDimitry Andric !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>; 1980b57cec5SDimitry Andric 1995ffd83dbSDimitry Andric// [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /] 2005ffd83dbSDimitry Andricclass X_VT5_XO5_VB5_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc, 2015ffd83dbSDimitry Andric list<dag> pattern> 2025ffd83dbSDimitry Andric : X_VT5_XO5_VB5<opcode, xo2, xo, opc, pattern>, isRecordForm; 2035ffd83dbSDimitry Andric 2045ffd83dbSDimitry Andric// [PO VRT XO VRB XO /], but the VRB is only used the left 64 bits (or less), 2055ffd83dbSDimitry Andric// So we use different operand class for VRB 2065ffd83dbSDimitry Andricclass X_VT5_XO5_VB5_TyVB<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc, 2075ffd83dbSDimitry Andric RegisterOperand vbtype, list<dag> pattern> 2085ffd83dbSDimitry Andric : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vrrc:$vT), (ins vbtype:$vB), 2095ffd83dbSDimitry Andric !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>; 2105ffd83dbSDimitry Andric 2115ffd83dbSDimitry Andric// [PO VRT XO VRB XO /] 2125ffd83dbSDimitry Andricclass X_VT5_XO5_VB5_VSFR<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc, 2135ffd83dbSDimitry Andric list<dag> pattern> 2145ffd83dbSDimitry Andric : X_RD5_XO5_RS5<opcode, xo2, xo, (outs vfrc:$vT), (ins vrrc:$vB), 2155ffd83dbSDimitry Andric !strconcat(opc, " $vT, $vB"), IIC_VecFP, pattern>; 2165ffd83dbSDimitry Andric 2175ffd83dbSDimitry Andric// [PO VRT XO VRB XO RO], Round to Odd version of [PO VRT XO VRB XO /] 2185ffd83dbSDimitry Andricclass X_VT5_XO5_VB5_VSFR_Ro<bits<6> opcode, bits<5> xo2, bits<10> xo, string opc, 2195ffd83dbSDimitry Andric list<dag> pattern> 2205ffd83dbSDimitry Andric : X_VT5_XO5_VB5_VSFR<opcode, xo2, xo, opc, pattern>, isRecordForm; 2215ffd83dbSDimitry Andric 2225ffd83dbSDimitry Andric// [PO T XO B XO BX /] 2235ffd83dbSDimitry Andricclass XX2_RT5_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc, 2245ffd83dbSDimitry Andric list<dag> pattern> 2255ffd83dbSDimitry Andric : XX2_RD5_XO5_RS6<opcode, xo2, xo, (outs g8rc:$rT), (ins vsfrc:$XB), 2265ffd83dbSDimitry Andric !strconcat(opc, " $rT, $XB"), IIC_VecFP, pattern>; 2275ffd83dbSDimitry Andric 2285ffd83dbSDimitry Andric// [PO T XO B XO BX TX] 2295ffd83dbSDimitry Andricclass XX2_XT6_XO5_XB6<bits<6> opcode, bits<5> xo2, bits<9> xo, string opc, 2305ffd83dbSDimitry Andric RegisterOperand vtype, list<dag> pattern> 2315ffd83dbSDimitry Andric : XX2_RD6_XO5_RS6<opcode, xo2, xo, (outs vtype:$XT), (ins vtype:$XB), 2325ffd83dbSDimitry Andric !strconcat(opc, " $XT, $XB"), IIC_VecFP, pattern>; 2335ffd83dbSDimitry Andric 2345ffd83dbSDimitry Andric// [PO T A B XO AX BX TX], src and dest register use different operand class 2355ffd83dbSDimitry Andricclass XX3_XT5_XA5_XB5<bits<6> opcode, bits<8> xo, string opc, 2365ffd83dbSDimitry Andric RegisterOperand xty, RegisterOperand aty, RegisterOperand bty, 2375ffd83dbSDimitry Andric InstrItinClass itin, list<dag> pattern> 2385ffd83dbSDimitry Andric : XX3Form<opcode, xo, (outs xty:$XT), (ins aty:$XA, bty:$XB), 2395ffd83dbSDimitry Andric !strconcat(opc, " $XT, $XA, $XB"), itin, pattern>; 2405ffd83dbSDimitry Andric 2415ffd83dbSDimitry Andric// [PO VRT VRA VRB XO /] 2425ffd83dbSDimitry Andricclass X_VT5_VA5_VB5<bits<6> opcode, bits<10> xo, string opc, 2435ffd83dbSDimitry Andric list<dag> pattern> 2445ffd83dbSDimitry Andric : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vA, vrrc:$vB), 2455ffd83dbSDimitry Andric !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>; 2465ffd83dbSDimitry Andric 2475ffd83dbSDimitry Andric// [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /] 2485ffd83dbSDimitry Andricclass X_VT5_VA5_VB5_Ro<bits<6> opcode, bits<10> xo, string opc, 2495ffd83dbSDimitry Andric list<dag> pattern> 2505ffd83dbSDimitry Andric : X_VT5_VA5_VB5<opcode, xo, opc, pattern>, isRecordForm; 2515ffd83dbSDimitry Andric 2525ffd83dbSDimitry Andric// [PO VRT VRA VRB XO /] 2535ffd83dbSDimitry Andricclass X_VT5_VA5_VB5_FMA<bits<6> opcode, bits<10> xo, string opc, 2545ffd83dbSDimitry Andric list<dag> pattern> 2555ffd83dbSDimitry Andric : XForm_1<opcode, xo, (outs vrrc:$vT), (ins vrrc:$vTi, vrrc:$vA, vrrc:$vB), 2565ffd83dbSDimitry Andric !strconcat(opc, " $vT, $vA, $vB"), IIC_VecFP, pattern>, 2575ffd83dbSDimitry Andric RegConstraint<"$vTi = $vT">, NoEncode<"$vTi">; 2585ffd83dbSDimitry Andric 2595ffd83dbSDimitry Andric// [PO VRT VRA VRB XO RO], Round to Odd version of [PO VRT VRA VRB XO /] 2605ffd83dbSDimitry Andricclass X_VT5_VA5_VB5_FMA_Ro<bits<6> opcode, bits<10> xo, string opc, 2615ffd83dbSDimitry Andric list<dag> pattern> 2625ffd83dbSDimitry Andric : X_VT5_VA5_VB5_FMA<opcode, xo, opc, pattern>, isRecordForm; 2635ffd83dbSDimitry Andric 2645ffd83dbSDimitry Andricclass Z23_VT5_R1_VB5_RMC2_EX1<bits<6> opcode, bits<8> xo, bit ex, string opc, 2655ffd83dbSDimitry Andric list<dag> pattern> 2665ffd83dbSDimitry Andric : Z23Form_8<opcode, xo, 2675ffd83dbSDimitry Andric (outs vrrc:$vT), (ins u1imm:$r, vrrc:$vB, u2imm:$rmc), 2685ffd83dbSDimitry Andric !strconcat(opc, " $r, $vT, $vB, $rmc"), IIC_VecFP, pattern> { 2695ffd83dbSDimitry Andric let RC = ex; 2705ffd83dbSDimitry Andric} 2715ffd83dbSDimitry Andric 2725ffd83dbSDimitry Andric// [PO BF // VRA VRB XO /] 2735ffd83dbSDimitry Andricclass X_BF3_VA5_VB5<bits<6> opcode, bits<10> xo, string opc, 2745ffd83dbSDimitry Andric list<dag> pattern> 2755ffd83dbSDimitry Andric : XForm_17<opcode, xo, (outs crrc:$crD), (ins vrrc:$VA, vrrc:$VB), 2765ffd83dbSDimitry Andric !strconcat(opc, " $crD, $VA, $VB"), IIC_FPCompare> { 2775ffd83dbSDimitry Andric let Pattern = pattern; 2785ffd83dbSDimitry Andric} 2795ffd83dbSDimitry Andric 2805ffd83dbSDimitry Andric// [PO T RA RB XO TX] almost equal to [PO S RA RB XO SX], but has different 2815ffd83dbSDimitry Andric// "out" and "in" dag 2825ffd83dbSDimitry Andricclass X_XT6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc, 2835ffd83dbSDimitry Andric RegisterOperand vtype, list<dag> pattern> 2845ffd83dbSDimitry Andric : XX1Form_memOp<opcode, xo, (outs vtype:$XT), (ins memrr:$src), 2855ffd83dbSDimitry Andric !strconcat(opc, " $XT, $src"), IIC_LdStLFD, pattern>; 2865ffd83dbSDimitry Andric 2875ffd83dbSDimitry Andric// [PO S RA RB XO SX] 2885ffd83dbSDimitry Andricclass X_XS6_RA5_RB5<bits<6> opcode, bits<10> xo, string opc, 2895ffd83dbSDimitry Andric RegisterOperand vtype, list<dag> pattern> 2905ffd83dbSDimitry Andric : XX1Form_memOp<opcode, xo, (outs), (ins vtype:$XT, memrr:$dst), 2915ffd83dbSDimitry Andric !strconcat(opc, " $XT, $dst"), IIC_LdStSTFD, pattern>; 2925ffd83dbSDimitry Andric} // Predicates = HasP9Vector 2935ffd83dbSDimitry Andric} // AddedComplexity = 400, hasSideEffects = 0 2945ffd83dbSDimitry Andric 2955ffd83dbSDimitry Andricmulticlass ScalToVecWPermute<ValueType Ty, dag In, dag NonPermOut, dag PermOut> { 2965ffd83dbSDimitry Andric def : Pat<(Ty (scalar_to_vector In)), (Ty NonPermOut)>; 2975ffd83dbSDimitry Andric def : Pat<(Ty (PPCSToV In)), (Ty PermOut)>; 2985ffd83dbSDimitry Andric} 2995ffd83dbSDimitry Andric 3005ffd83dbSDimitry Andric//-------------------------- Instruction definitions -------------------------// 3015ffd83dbSDimitry Andric// VSX instructions require the VSX feature, they are to be selected over 3025ffd83dbSDimitry Andric// equivalent Altivec patterns (as they address a larger register set) and 3035ffd83dbSDimitry Andric// they do not have unmodeled side effects. 3045ffd83dbSDimitry Andriclet Predicates = [HasVSX], AddedComplexity = 400 in { 3055ffd83dbSDimitry Andriclet hasSideEffects = 0 in { 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andric // Load indexed instructions 3080b57cec5SDimitry Andric let mayLoad = 1, mayStore = 0 in { 3090b57cec5SDimitry Andric let CodeSize = 3 in 3100b57cec5SDimitry Andric def LXSDX : XX1Form_memOp<31, 588, 3110b57cec5SDimitry Andric (outs vsfrc:$XT), (ins memrr:$src), 3120b57cec5SDimitry Andric "lxsdx $XT, $src", IIC_LdStLFD, 3130b57cec5SDimitry Andric []>; 3140b57cec5SDimitry Andric 3150b57cec5SDimitry Andric // Pseudo instruction XFLOADf64 will be expanded to LXSDX or LFDX later 3160b57cec5SDimitry Andric let CodeSize = 3 in 3170b57cec5SDimitry Andric def XFLOADf64 : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src), 3180b57cec5SDimitry Andric "#XFLOADf64", 319*fe6060f1SDimitry Andric [(set f64:$XT, (load XForm:$src))]>; 3200b57cec5SDimitry Andric 3210b57cec5SDimitry Andric let Predicates = [HasVSX, HasOnlySwappingMemOps] in 3220b57cec5SDimitry Andric def LXVD2X : XX1Form_memOp<31, 844, 3230b57cec5SDimitry Andric (outs vsrc:$XT), (ins memrr:$src), 3240b57cec5SDimitry Andric "lxvd2x $XT, $src", IIC_LdStLFD, 325*fe6060f1SDimitry Andric []>; 3260b57cec5SDimitry Andric 3270b57cec5SDimitry Andric def LXVDSX : XX1Form_memOp<31, 332, 3280b57cec5SDimitry Andric (outs vsrc:$XT), (ins memrr:$src), 3290b57cec5SDimitry Andric "lxvdsx $XT, $src", IIC_LdStLFD, []>; 3300b57cec5SDimitry Andric 3310b57cec5SDimitry Andric let Predicates = [HasVSX, HasOnlySwappingMemOps] in 3320b57cec5SDimitry Andric def LXVW4X : XX1Form_memOp<31, 780, 3330b57cec5SDimitry Andric (outs vsrc:$XT), (ins memrr:$src), 3340b57cec5SDimitry Andric "lxvw4x $XT, $src", IIC_LdStLFD, 3350b57cec5SDimitry Andric []>; 3360b57cec5SDimitry Andric } // mayLoad 3370b57cec5SDimitry Andric 3380b57cec5SDimitry Andric // Store indexed instructions 3390b57cec5SDimitry Andric let mayStore = 1, mayLoad = 0 in { 3400b57cec5SDimitry Andric let CodeSize = 3 in 3410b57cec5SDimitry Andric def STXSDX : XX1Form_memOp<31, 716, 3420b57cec5SDimitry Andric (outs), (ins vsfrc:$XT, memrr:$dst), 3430b57cec5SDimitry Andric "stxsdx $XT, $dst", IIC_LdStSTFD, 3440b57cec5SDimitry Andric []>; 3450b57cec5SDimitry Andric 3460b57cec5SDimitry Andric // Pseudo instruction XFSTOREf64 will be expanded to STXSDX or STFDX later 3470b57cec5SDimitry Andric let CodeSize = 3 in 3480b57cec5SDimitry Andric def XFSTOREf64 : PseudoXFormMemOp<(outs), (ins vsfrc:$XT, memrr:$dst), 3490b57cec5SDimitry Andric "#XFSTOREf64", 350*fe6060f1SDimitry Andric [(store f64:$XT, XForm:$dst)]>; 3510b57cec5SDimitry Andric 3520b57cec5SDimitry Andric let Predicates = [HasVSX, HasOnlySwappingMemOps] in { 3530b57cec5SDimitry Andric // The behaviour of this instruction is endianness-specific so we provide no 3540b57cec5SDimitry Andric // pattern to match it without considering endianness. 3550b57cec5SDimitry Andric def STXVD2X : XX1Form_memOp<31, 972, 3560b57cec5SDimitry Andric (outs), (ins vsrc:$XT, memrr:$dst), 3570b57cec5SDimitry Andric "stxvd2x $XT, $dst", IIC_LdStSTFD, 3580b57cec5SDimitry Andric []>; 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andric def STXVW4X : XX1Form_memOp<31, 908, 3610b57cec5SDimitry Andric (outs), (ins vsrc:$XT, memrr:$dst), 3620b57cec5SDimitry Andric "stxvw4x $XT, $dst", IIC_LdStSTFD, 3630b57cec5SDimitry Andric []>; 3640b57cec5SDimitry Andric } 3650b57cec5SDimitry Andric } // mayStore 3660b57cec5SDimitry Andric 367e8d8bef9SDimitry Andric let mayRaiseFPException = 1 in { 368e8d8bef9SDimitry Andric let Uses = [RM] in { 3690b57cec5SDimitry Andric // Add/Mul Instructions 3700b57cec5SDimitry Andric let isCommutable = 1 in { 3710b57cec5SDimitry Andric def XSADDDP : XX3Form<60, 32, 3720b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB), 3730b57cec5SDimitry Andric "xsadddp $XT, $XA, $XB", IIC_VecFP, 3745ffd83dbSDimitry Andric [(set f64:$XT, (any_fadd f64:$XA, f64:$XB))]>; 3750b57cec5SDimitry Andric def XSMULDP : XX3Form<60, 48, 3760b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB), 3770b57cec5SDimitry Andric "xsmuldp $XT, $XA, $XB", IIC_VecFP, 3785ffd83dbSDimitry Andric [(set f64:$XT, (any_fmul f64:$XA, f64:$XB))]>; 3790b57cec5SDimitry Andric 3800b57cec5SDimitry Andric def XVADDDP : XX3Form<60, 96, 3810b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 3820b57cec5SDimitry Andric "xvadddp $XT, $XA, $XB", IIC_VecFP, 3835ffd83dbSDimitry Andric [(set v2f64:$XT, (any_fadd v2f64:$XA, v2f64:$XB))]>; 3840b57cec5SDimitry Andric 3850b57cec5SDimitry Andric def XVADDSP : XX3Form<60, 64, 3860b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 3870b57cec5SDimitry Andric "xvaddsp $XT, $XA, $XB", IIC_VecFP, 3885ffd83dbSDimitry Andric [(set v4f32:$XT, (any_fadd v4f32:$XA, v4f32:$XB))]>; 3890b57cec5SDimitry Andric 3900b57cec5SDimitry Andric def XVMULDP : XX3Form<60, 112, 3910b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 3920b57cec5SDimitry Andric "xvmuldp $XT, $XA, $XB", IIC_VecFP, 3935ffd83dbSDimitry Andric [(set v2f64:$XT, (any_fmul v2f64:$XA, v2f64:$XB))]>; 3940b57cec5SDimitry Andric 3950b57cec5SDimitry Andric def XVMULSP : XX3Form<60, 80, 3960b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 3970b57cec5SDimitry Andric "xvmulsp $XT, $XA, $XB", IIC_VecFP, 3985ffd83dbSDimitry Andric [(set v4f32:$XT, (any_fmul v4f32:$XA, v4f32:$XB))]>; 3990b57cec5SDimitry Andric } 4000b57cec5SDimitry Andric 4010b57cec5SDimitry Andric // Subtract Instructions 4020b57cec5SDimitry Andric def XSSUBDP : XX3Form<60, 40, 4030b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB), 4040b57cec5SDimitry Andric "xssubdp $XT, $XA, $XB", IIC_VecFP, 4055ffd83dbSDimitry Andric [(set f64:$XT, (any_fsub f64:$XA, f64:$XB))]>; 4060b57cec5SDimitry Andric 4070b57cec5SDimitry Andric def XVSUBDP : XX3Form<60, 104, 4080b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 4090b57cec5SDimitry Andric "xvsubdp $XT, $XA, $XB", IIC_VecFP, 4105ffd83dbSDimitry Andric [(set v2f64:$XT, (any_fsub v2f64:$XA, v2f64:$XB))]>; 4110b57cec5SDimitry Andric def XVSUBSP : XX3Form<60, 72, 4120b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 4130b57cec5SDimitry Andric "xvsubsp $XT, $XA, $XB", IIC_VecFP, 4145ffd83dbSDimitry Andric [(set v4f32:$XT, (any_fsub v4f32:$XA, v4f32:$XB))]>; 4150b57cec5SDimitry Andric 4160b57cec5SDimitry Andric // FMA Instructions 4170b57cec5SDimitry Andric let BaseName = "XSMADDADP" in { 4180b57cec5SDimitry Andric let isCommutable = 1 in 4190b57cec5SDimitry Andric def XSMADDADP : XX3Form<60, 33, 4200b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB), 4210b57cec5SDimitry Andric "xsmaddadp $XT, $XA, $XB", IIC_VecFP, 4225ffd83dbSDimitry Andric [(set f64:$XT, (any_fma f64:$XA, f64:$XB, f64:$XTi))]>, 4230b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4240b57cec5SDimitry Andric AltVSXFMARel; 4250b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 4260b57cec5SDimitry Andric def XSMADDMDP : XX3Form<60, 41, 4270b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB), 4280b57cec5SDimitry Andric "xsmaddmdp $XT, $XA, $XB", IIC_VecFP, []>, 4290b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4300b57cec5SDimitry Andric AltVSXFMARel; 4310b57cec5SDimitry Andric } 4320b57cec5SDimitry Andric 4330b57cec5SDimitry Andric let BaseName = "XSMSUBADP" in { 4340b57cec5SDimitry Andric let isCommutable = 1 in 4350b57cec5SDimitry Andric def XSMSUBADP : XX3Form<60, 49, 4360b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB), 4370b57cec5SDimitry Andric "xsmsubadp $XT, $XA, $XB", IIC_VecFP, 4385ffd83dbSDimitry Andric [(set f64:$XT, (any_fma f64:$XA, f64:$XB, (fneg f64:$XTi)))]>, 4390b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4400b57cec5SDimitry Andric AltVSXFMARel; 4410b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 4420b57cec5SDimitry Andric def XSMSUBMDP : XX3Form<60, 57, 4430b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB), 4440b57cec5SDimitry Andric "xsmsubmdp $XT, $XA, $XB", IIC_VecFP, []>, 4450b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4460b57cec5SDimitry Andric AltVSXFMARel; 4470b57cec5SDimitry Andric } 4480b57cec5SDimitry Andric 4490b57cec5SDimitry Andric let BaseName = "XSNMADDADP" in { 4500b57cec5SDimitry Andric let isCommutable = 1 in 4510b57cec5SDimitry Andric def XSNMADDADP : XX3Form<60, 161, 4520b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB), 4530b57cec5SDimitry Andric "xsnmaddadp $XT, $XA, $XB", IIC_VecFP, 4545ffd83dbSDimitry Andric [(set f64:$XT, (fneg (any_fma f64:$XA, f64:$XB, f64:$XTi)))]>, 4550b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4560b57cec5SDimitry Andric AltVSXFMARel; 4570b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 4580b57cec5SDimitry Andric def XSNMADDMDP : XX3Form<60, 169, 4590b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB), 4600b57cec5SDimitry Andric "xsnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>, 4610b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4620b57cec5SDimitry Andric AltVSXFMARel; 4630b57cec5SDimitry Andric } 4640b57cec5SDimitry Andric 4650b57cec5SDimitry Andric let BaseName = "XSNMSUBADP" in { 4660b57cec5SDimitry Andric let isCommutable = 1 in 4670b57cec5SDimitry Andric def XSNMSUBADP : XX3Form<60, 177, 4680b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB), 4690b57cec5SDimitry Andric "xsnmsubadp $XT, $XA, $XB", IIC_VecFP, 4705ffd83dbSDimitry Andric [(set f64:$XT, (fneg (any_fma f64:$XA, f64:$XB, (fneg f64:$XTi))))]>, 4710b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4720b57cec5SDimitry Andric AltVSXFMARel; 4730b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 4740b57cec5SDimitry Andric def XSNMSUBMDP : XX3Form<60, 185, 4750b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB), 4760b57cec5SDimitry Andric "xsnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>, 4770b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4780b57cec5SDimitry Andric AltVSXFMARel; 4790b57cec5SDimitry Andric } 4800b57cec5SDimitry Andric 4810b57cec5SDimitry Andric let BaseName = "XVMADDADP" in { 4820b57cec5SDimitry Andric let isCommutable = 1 in 4830b57cec5SDimitry Andric def XVMADDADP : XX3Form<60, 97, 4840b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 4850b57cec5SDimitry Andric "xvmaddadp $XT, $XA, $XB", IIC_VecFP, 4865ffd83dbSDimitry Andric [(set v2f64:$XT, (any_fma v2f64:$XA, v2f64:$XB, v2f64:$XTi))]>, 4870b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4880b57cec5SDimitry Andric AltVSXFMARel; 4890b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 4900b57cec5SDimitry Andric def XVMADDMDP : XX3Form<60, 105, 4910b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 4920b57cec5SDimitry Andric "xvmaddmdp $XT, $XA, $XB", IIC_VecFP, []>, 4930b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 4940b57cec5SDimitry Andric AltVSXFMARel; 4950b57cec5SDimitry Andric } 4960b57cec5SDimitry Andric 4970b57cec5SDimitry Andric let BaseName = "XVMADDASP" in { 4980b57cec5SDimitry Andric let isCommutable = 1 in 4990b57cec5SDimitry Andric def XVMADDASP : XX3Form<60, 65, 5000b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5010b57cec5SDimitry Andric "xvmaddasp $XT, $XA, $XB", IIC_VecFP, 5025ffd83dbSDimitry Andric [(set v4f32:$XT, (any_fma v4f32:$XA, v4f32:$XB, v4f32:$XTi))]>, 5030b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5040b57cec5SDimitry Andric AltVSXFMARel; 5050b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 5060b57cec5SDimitry Andric def XVMADDMSP : XX3Form<60, 73, 5070b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5080b57cec5SDimitry Andric "xvmaddmsp $XT, $XA, $XB", IIC_VecFP, []>, 5090b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5100b57cec5SDimitry Andric AltVSXFMARel; 5110b57cec5SDimitry Andric } 5120b57cec5SDimitry Andric 5130b57cec5SDimitry Andric let BaseName = "XVMSUBADP" in { 5140b57cec5SDimitry Andric let isCommutable = 1 in 5150b57cec5SDimitry Andric def XVMSUBADP : XX3Form<60, 113, 5160b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5170b57cec5SDimitry Andric "xvmsubadp $XT, $XA, $XB", IIC_VecFP, 5185ffd83dbSDimitry Andric [(set v2f64:$XT, (any_fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi)))]>, 5190b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5200b57cec5SDimitry Andric AltVSXFMARel; 5210b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 5220b57cec5SDimitry Andric def XVMSUBMDP : XX3Form<60, 121, 5230b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5240b57cec5SDimitry Andric "xvmsubmdp $XT, $XA, $XB", IIC_VecFP, []>, 5250b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5260b57cec5SDimitry Andric AltVSXFMARel; 5270b57cec5SDimitry Andric } 5280b57cec5SDimitry Andric 5290b57cec5SDimitry Andric let BaseName = "XVMSUBASP" in { 5300b57cec5SDimitry Andric let isCommutable = 1 in 5310b57cec5SDimitry Andric def XVMSUBASP : XX3Form<60, 81, 5320b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5330b57cec5SDimitry Andric "xvmsubasp $XT, $XA, $XB", IIC_VecFP, 5345ffd83dbSDimitry Andric [(set v4f32:$XT, (any_fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi)))]>, 5350b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5360b57cec5SDimitry Andric AltVSXFMARel; 5370b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 5380b57cec5SDimitry Andric def XVMSUBMSP : XX3Form<60, 89, 5390b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5400b57cec5SDimitry Andric "xvmsubmsp $XT, $XA, $XB", IIC_VecFP, []>, 5410b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5420b57cec5SDimitry Andric AltVSXFMARel; 5430b57cec5SDimitry Andric } 5440b57cec5SDimitry Andric 5450b57cec5SDimitry Andric let BaseName = "XVNMADDADP" in { 5460b57cec5SDimitry Andric let isCommutable = 1 in 5470b57cec5SDimitry Andric def XVNMADDADP : XX3Form<60, 225, 5480b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5490b57cec5SDimitry Andric "xvnmaddadp $XT, $XA, $XB", IIC_VecFP, 5505ffd83dbSDimitry Andric [(set v2f64:$XT, (fneg (any_fma v2f64:$XA, v2f64:$XB, v2f64:$XTi)))]>, 5510b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5520b57cec5SDimitry Andric AltVSXFMARel; 5530b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 5540b57cec5SDimitry Andric def XVNMADDMDP : XX3Form<60, 233, 5550b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5560b57cec5SDimitry Andric "xvnmaddmdp $XT, $XA, $XB", IIC_VecFP, []>, 5570b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5580b57cec5SDimitry Andric AltVSXFMARel; 5590b57cec5SDimitry Andric } 5600b57cec5SDimitry Andric 5610b57cec5SDimitry Andric let BaseName = "XVNMADDASP" in { 5620b57cec5SDimitry Andric let isCommutable = 1 in 5630b57cec5SDimitry Andric def XVNMADDASP : XX3Form<60, 193, 5640b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5650b57cec5SDimitry Andric "xvnmaddasp $XT, $XA, $XB", IIC_VecFP, 5660b57cec5SDimitry Andric [(set v4f32:$XT, (fneg (fma v4f32:$XA, v4f32:$XB, v4f32:$XTi)))]>, 5670b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5680b57cec5SDimitry Andric AltVSXFMARel; 5690b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 5700b57cec5SDimitry Andric def XVNMADDMSP : XX3Form<60, 201, 5710b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5720b57cec5SDimitry Andric "xvnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>, 5730b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5740b57cec5SDimitry Andric AltVSXFMARel; 5750b57cec5SDimitry Andric } 5760b57cec5SDimitry Andric 5770b57cec5SDimitry Andric let BaseName = "XVNMSUBADP" in { 5780b57cec5SDimitry Andric let isCommutable = 1 in 5790b57cec5SDimitry Andric def XVNMSUBADP : XX3Form<60, 241, 5800b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5810b57cec5SDimitry Andric "xvnmsubadp $XT, $XA, $XB", IIC_VecFP, 5825ffd83dbSDimitry Andric [(set v2f64:$XT, (fneg (any_fma v2f64:$XA, v2f64:$XB, (fneg v2f64:$XTi))))]>, 5830b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5840b57cec5SDimitry Andric AltVSXFMARel; 5850b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 5860b57cec5SDimitry Andric def XVNMSUBMDP : XX3Form<60, 249, 5870b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5880b57cec5SDimitry Andric "xvnmsubmdp $XT, $XA, $XB", IIC_VecFP, []>, 5890b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 5900b57cec5SDimitry Andric AltVSXFMARel; 5910b57cec5SDimitry Andric } 5920b57cec5SDimitry Andric 5930b57cec5SDimitry Andric let BaseName = "XVNMSUBASP" in { 5940b57cec5SDimitry Andric let isCommutable = 1 in 5950b57cec5SDimitry Andric def XVNMSUBASP : XX3Form<60, 209, 5960b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 5970b57cec5SDimitry Andric "xvnmsubasp $XT, $XA, $XB", IIC_VecFP, 5985ffd83dbSDimitry Andric [(set v4f32:$XT, (fneg (any_fma v4f32:$XA, v4f32:$XB, (fneg v4f32:$XTi))))]>, 5990b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 6000b57cec5SDimitry Andric AltVSXFMARel; 6010b57cec5SDimitry Andric let IsVSXFMAAlt = 1 in 6020b57cec5SDimitry Andric def XVNMSUBMSP : XX3Form<60, 217, 6030b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XTi, vsrc:$XA, vsrc:$XB), 6040b57cec5SDimitry Andric "xvnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>, 6050b57cec5SDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 6060b57cec5SDimitry Andric AltVSXFMARel; 6070b57cec5SDimitry Andric } 6080b57cec5SDimitry Andric 6090b57cec5SDimitry Andric // Division Instructions 6100b57cec5SDimitry Andric def XSDIVDP : XX3Form<60, 56, 6110b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB), 6120b57cec5SDimitry Andric "xsdivdp $XT, $XA, $XB", IIC_FPDivD, 6135ffd83dbSDimitry Andric [(set f64:$XT, (any_fdiv f64:$XA, f64:$XB))]>; 6140b57cec5SDimitry Andric def XSSQRTDP : XX2Form<60, 75, 6150b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 6160b57cec5SDimitry Andric "xssqrtdp $XT, $XB", IIC_FPSqrtD, 6175ffd83dbSDimitry Andric [(set f64:$XT, (any_fsqrt f64:$XB))]>; 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric def XSREDP : XX2Form<60, 90, 6200b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 6210b57cec5SDimitry Andric "xsredp $XT, $XB", IIC_VecFP, 6220b57cec5SDimitry Andric [(set f64:$XT, (PPCfre f64:$XB))]>; 6230b57cec5SDimitry Andric def XSRSQRTEDP : XX2Form<60, 74, 6240b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 6250b57cec5SDimitry Andric "xsrsqrtedp $XT, $XB", IIC_VecFP, 6260b57cec5SDimitry Andric [(set f64:$XT, (PPCfrsqrte f64:$XB))]>; 6270b57cec5SDimitry Andric 628e8d8bef9SDimitry Andric let mayRaiseFPException = 0 in { 6290b57cec5SDimitry Andric def XSTDIVDP : XX3Form_1<60, 61, 6300b57cec5SDimitry Andric (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB), 6310b57cec5SDimitry Andric "xstdivdp $crD, $XA, $XB", IIC_FPCompare, []>; 6320b57cec5SDimitry Andric def XSTSQRTDP : XX2Form_1<60, 106, 6330b57cec5SDimitry Andric (outs crrc:$crD), (ins vsfrc:$XB), 634e8d8bef9SDimitry Andric "xstsqrtdp $crD, $XB", IIC_FPCompare, 635e8d8bef9SDimitry Andric [(set i32:$crD, (PPCftsqrt f64:$XB))]>; 636e8d8bef9SDimitry Andric def XVTDIVDP : XX3Form_1<60, 125, 637e8d8bef9SDimitry Andric (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB), 638e8d8bef9SDimitry Andric "xvtdivdp $crD, $XA, $XB", IIC_FPCompare, []>; 639e8d8bef9SDimitry Andric def XVTDIVSP : XX3Form_1<60, 93, 640e8d8bef9SDimitry Andric (outs crrc:$crD), (ins vsrc:$XA, vsrc:$XB), 641e8d8bef9SDimitry Andric "xvtdivsp $crD, $XA, $XB", IIC_FPCompare, []>; 642e8d8bef9SDimitry Andric 643e8d8bef9SDimitry Andric def XVTSQRTDP : XX2Form_1<60, 234, 644e8d8bef9SDimitry Andric (outs crrc:$crD), (ins vsrc:$XB), 645e8d8bef9SDimitry Andric "xvtsqrtdp $crD, $XB", IIC_FPCompare, 646e8d8bef9SDimitry Andric [(set i32:$crD, (PPCftsqrt v2f64:$XB))]>; 647e8d8bef9SDimitry Andric def XVTSQRTSP : XX2Form_1<60, 170, 648e8d8bef9SDimitry Andric (outs crrc:$crD), (ins vsrc:$XB), 649e8d8bef9SDimitry Andric "xvtsqrtsp $crD, $XB", IIC_FPCompare, 650e8d8bef9SDimitry Andric [(set i32:$crD, (PPCftsqrt v4f32:$XB))]>; 651e8d8bef9SDimitry Andric } 6520b57cec5SDimitry Andric 6530b57cec5SDimitry Andric def XVDIVDP : XX3Form<60, 120, 6540b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 6550b57cec5SDimitry Andric "xvdivdp $XT, $XA, $XB", IIC_FPDivD, 6565ffd83dbSDimitry Andric [(set v2f64:$XT, (any_fdiv v2f64:$XA, v2f64:$XB))]>; 6570b57cec5SDimitry Andric def XVDIVSP : XX3Form<60, 88, 6580b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 6590b57cec5SDimitry Andric "xvdivsp $XT, $XA, $XB", IIC_FPDivS, 6605ffd83dbSDimitry Andric [(set v4f32:$XT, (any_fdiv v4f32:$XA, v4f32:$XB))]>; 6610b57cec5SDimitry Andric 6620b57cec5SDimitry Andric def XVSQRTDP : XX2Form<60, 203, 6630b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 6640b57cec5SDimitry Andric "xvsqrtdp $XT, $XB", IIC_FPSqrtD, 6655ffd83dbSDimitry Andric [(set v2f64:$XT, (any_fsqrt v2f64:$XB))]>; 6660b57cec5SDimitry Andric def XVSQRTSP : XX2Form<60, 139, 6670b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 6680b57cec5SDimitry Andric "xvsqrtsp $XT, $XB", IIC_FPSqrtS, 6695ffd83dbSDimitry Andric [(set v4f32:$XT, (any_fsqrt v4f32:$XB))]>; 6700b57cec5SDimitry Andric 6710b57cec5SDimitry Andric def XVREDP : XX2Form<60, 218, 6720b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 6730b57cec5SDimitry Andric "xvredp $XT, $XB", IIC_VecFP, 6740b57cec5SDimitry Andric [(set v2f64:$XT, (PPCfre v2f64:$XB))]>; 6750b57cec5SDimitry Andric def XVRESP : XX2Form<60, 154, 6760b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 6770b57cec5SDimitry Andric "xvresp $XT, $XB", IIC_VecFP, 6780b57cec5SDimitry Andric [(set v4f32:$XT, (PPCfre v4f32:$XB))]>; 6790b57cec5SDimitry Andric 6800b57cec5SDimitry Andric def XVRSQRTEDP : XX2Form<60, 202, 6810b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 6820b57cec5SDimitry Andric "xvrsqrtedp $XT, $XB", IIC_VecFP, 6830b57cec5SDimitry Andric [(set v2f64:$XT, (PPCfrsqrte v2f64:$XB))]>; 6840b57cec5SDimitry Andric def XVRSQRTESP : XX2Form<60, 138, 6850b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 6860b57cec5SDimitry Andric "xvrsqrtesp $XT, $XB", IIC_VecFP, 6870b57cec5SDimitry Andric [(set v4f32:$XT, (PPCfrsqrte v4f32:$XB))]>; 6880b57cec5SDimitry Andric 6890b57cec5SDimitry Andric // Compare Instructions 6900b57cec5SDimitry Andric def XSCMPODP : XX3Form_1<60, 43, 6910b57cec5SDimitry Andric (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB), 6920b57cec5SDimitry Andric "xscmpodp $crD, $XA, $XB", IIC_FPCompare, []>; 6930b57cec5SDimitry Andric def XSCMPUDP : XX3Form_1<60, 35, 6940b57cec5SDimitry Andric (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB), 6950b57cec5SDimitry Andric "xscmpudp $crD, $XA, $XB", IIC_FPCompare, []>; 6960b57cec5SDimitry Andric 6970b57cec5SDimitry Andric defm XVCMPEQDP : XX3Form_Rcr<60, 99, 6980b57cec5SDimitry Andric "xvcmpeqdp", "$XT, $XA, $XB", IIC_VecFPCompare, 6990b57cec5SDimitry Andric int_ppc_vsx_xvcmpeqdp, v2i64, v2f64>; 7000b57cec5SDimitry Andric defm XVCMPEQSP : XX3Form_Rcr<60, 67, 7010b57cec5SDimitry Andric "xvcmpeqsp", "$XT, $XA, $XB", IIC_VecFPCompare, 7020b57cec5SDimitry Andric int_ppc_vsx_xvcmpeqsp, v4i32, v4f32>; 7030b57cec5SDimitry Andric defm XVCMPGEDP : XX3Form_Rcr<60, 115, 7040b57cec5SDimitry Andric "xvcmpgedp", "$XT, $XA, $XB", IIC_VecFPCompare, 7050b57cec5SDimitry Andric int_ppc_vsx_xvcmpgedp, v2i64, v2f64>; 7060b57cec5SDimitry Andric defm XVCMPGESP : XX3Form_Rcr<60, 83, 7070b57cec5SDimitry Andric "xvcmpgesp", "$XT, $XA, $XB", IIC_VecFPCompare, 7080b57cec5SDimitry Andric int_ppc_vsx_xvcmpgesp, v4i32, v4f32>; 7090b57cec5SDimitry Andric defm XVCMPGTDP : XX3Form_Rcr<60, 107, 7100b57cec5SDimitry Andric "xvcmpgtdp", "$XT, $XA, $XB", IIC_VecFPCompare, 7110b57cec5SDimitry Andric int_ppc_vsx_xvcmpgtdp, v2i64, v2f64>; 7120b57cec5SDimitry Andric defm XVCMPGTSP : XX3Form_Rcr<60, 75, 7130b57cec5SDimitry Andric "xvcmpgtsp", "$XT, $XA, $XB", IIC_VecFPCompare, 7140b57cec5SDimitry Andric int_ppc_vsx_xvcmpgtsp, v4i32, v4f32>; 7150b57cec5SDimitry Andric 7160b57cec5SDimitry Andric // Move Instructions 717e8d8bef9SDimitry Andric let mayRaiseFPException = 0 in { 7180b57cec5SDimitry Andric def XSABSDP : XX2Form<60, 345, 7190b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 7200b57cec5SDimitry Andric "xsabsdp $XT, $XB", IIC_VecFP, 7210b57cec5SDimitry Andric [(set f64:$XT, (fabs f64:$XB))]>; 7220b57cec5SDimitry Andric def XSNABSDP : XX2Form<60, 361, 7230b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 7240b57cec5SDimitry Andric "xsnabsdp $XT, $XB", IIC_VecFP, 7250b57cec5SDimitry Andric [(set f64:$XT, (fneg (fabs f64:$XB)))]>; 7260b57cec5SDimitry Andric def XSNEGDP : XX2Form<60, 377, 7270b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 7280b57cec5SDimitry Andric "xsnegdp $XT, $XB", IIC_VecFP, 7290b57cec5SDimitry Andric [(set f64:$XT, (fneg f64:$XB))]>; 7300b57cec5SDimitry Andric def XSCPSGNDP : XX3Form<60, 176, 7310b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB), 7320b57cec5SDimitry Andric "xscpsgndp $XT, $XA, $XB", IIC_VecFP, 7330b57cec5SDimitry Andric [(set f64:$XT, (fcopysign f64:$XB, f64:$XA))]>; 7340b57cec5SDimitry Andric 7350b57cec5SDimitry Andric def XVABSDP : XX2Form<60, 473, 7360b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 7370b57cec5SDimitry Andric "xvabsdp $XT, $XB", IIC_VecFP, 7380b57cec5SDimitry Andric [(set v2f64:$XT, (fabs v2f64:$XB))]>; 7390b57cec5SDimitry Andric 7400b57cec5SDimitry Andric def XVABSSP : XX2Form<60, 409, 7410b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 7420b57cec5SDimitry Andric "xvabssp $XT, $XB", IIC_VecFP, 7430b57cec5SDimitry Andric [(set v4f32:$XT, (fabs v4f32:$XB))]>; 7440b57cec5SDimitry Andric 7450b57cec5SDimitry Andric def XVCPSGNDP : XX3Form<60, 240, 7460b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 7470b57cec5SDimitry Andric "xvcpsgndp $XT, $XA, $XB", IIC_VecFP, 7480b57cec5SDimitry Andric [(set v2f64:$XT, (fcopysign v2f64:$XB, v2f64:$XA))]>; 7490b57cec5SDimitry Andric def XVCPSGNSP : XX3Form<60, 208, 7500b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 7510b57cec5SDimitry Andric "xvcpsgnsp $XT, $XA, $XB", IIC_VecFP, 7520b57cec5SDimitry Andric [(set v4f32:$XT, (fcopysign v4f32:$XB, v4f32:$XA))]>; 7530b57cec5SDimitry Andric 7540b57cec5SDimitry Andric def XVNABSDP : XX2Form<60, 489, 7550b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 7560b57cec5SDimitry Andric "xvnabsdp $XT, $XB", IIC_VecFP, 7570b57cec5SDimitry Andric [(set v2f64:$XT, (fneg (fabs v2f64:$XB)))]>; 7580b57cec5SDimitry Andric def XVNABSSP : XX2Form<60, 425, 7590b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 7600b57cec5SDimitry Andric "xvnabssp $XT, $XB", IIC_VecFP, 7610b57cec5SDimitry Andric [(set v4f32:$XT, (fneg (fabs v4f32:$XB)))]>; 7620b57cec5SDimitry Andric 7630b57cec5SDimitry Andric def XVNEGDP : XX2Form<60, 505, 7640b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 7650b57cec5SDimitry Andric "xvnegdp $XT, $XB", IIC_VecFP, 7660b57cec5SDimitry Andric [(set v2f64:$XT, (fneg v2f64:$XB))]>; 7670b57cec5SDimitry Andric def XVNEGSP : XX2Form<60, 441, 7680b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 7690b57cec5SDimitry Andric "xvnegsp $XT, $XB", IIC_VecFP, 7700b57cec5SDimitry Andric [(set v4f32:$XT, (fneg v4f32:$XB))]>; 771e8d8bef9SDimitry Andric } 7720b57cec5SDimitry Andric 7730b57cec5SDimitry Andric // Conversion Instructions 7740b57cec5SDimitry Andric def XSCVDPSP : XX2Form<60, 265, 7750b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 7760b57cec5SDimitry Andric "xscvdpsp $XT, $XB", IIC_VecFP, []>; 7770b57cec5SDimitry Andric def XSCVDPSXDS : XX2Form<60, 344, 7780b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 7790b57cec5SDimitry Andric "xscvdpsxds $XT, $XB", IIC_VecFP, 780e8d8bef9SDimitry Andric [(set f64:$XT, (PPCany_fctidz f64:$XB))]>; 7810b57cec5SDimitry Andric let isCodeGenOnly = 1 in 7820b57cec5SDimitry Andric def XSCVDPSXDSs : XX2Form<60, 344, 7830b57cec5SDimitry Andric (outs vssrc:$XT), (ins vssrc:$XB), 7840b57cec5SDimitry Andric "xscvdpsxds $XT, $XB", IIC_VecFP, 785e8d8bef9SDimitry Andric [(set f32:$XT, (PPCany_fctidz f32:$XB))]>; 7860b57cec5SDimitry Andric def XSCVDPSXWS : XX2Form<60, 88, 7870b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 7880b57cec5SDimitry Andric "xscvdpsxws $XT, $XB", IIC_VecFP, 789e8d8bef9SDimitry Andric [(set f64:$XT, (PPCany_fctiwz f64:$XB))]>; 7900b57cec5SDimitry Andric let isCodeGenOnly = 1 in 7910b57cec5SDimitry Andric def XSCVDPSXWSs : XX2Form<60, 88, 7920b57cec5SDimitry Andric (outs vssrc:$XT), (ins vssrc:$XB), 7930b57cec5SDimitry Andric "xscvdpsxws $XT, $XB", IIC_VecFP, 794e8d8bef9SDimitry Andric [(set f32:$XT, (PPCany_fctiwz f32:$XB))]>; 7950b57cec5SDimitry Andric def XSCVDPUXDS : XX2Form<60, 328, 7960b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 7970b57cec5SDimitry Andric "xscvdpuxds $XT, $XB", IIC_VecFP, 798e8d8bef9SDimitry Andric [(set f64:$XT, (PPCany_fctiduz f64:$XB))]>; 7990b57cec5SDimitry Andric let isCodeGenOnly = 1 in 8000b57cec5SDimitry Andric def XSCVDPUXDSs : XX2Form<60, 328, 8010b57cec5SDimitry Andric (outs vssrc:$XT), (ins vssrc:$XB), 8020b57cec5SDimitry Andric "xscvdpuxds $XT, $XB", IIC_VecFP, 803e8d8bef9SDimitry Andric [(set f32:$XT, (PPCany_fctiduz f32:$XB))]>; 8040b57cec5SDimitry Andric def XSCVDPUXWS : XX2Form<60, 72, 8050b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 8060b57cec5SDimitry Andric "xscvdpuxws $XT, $XB", IIC_VecFP, 807e8d8bef9SDimitry Andric [(set f64:$XT, (PPCany_fctiwuz f64:$XB))]>; 8080b57cec5SDimitry Andric let isCodeGenOnly = 1 in 8090b57cec5SDimitry Andric def XSCVDPUXWSs : XX2Form<60, 72, 8100b57cec5SDimitry Andric (outs vssrc:$XT), (ins vssrc:$XB), 8110b57cec5SDimitry Andric "xscvdpuxws $XT, $XB", IIC_VecFP, 812e8d8bef9SDimitry Andric [(set f32:$XT, (PPCany_fctiwuz f32:$XB))]>; 8130b57cec5SDimitry Andric def XSCVSPDP : XX2Form<60, 329, 8140b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 8150b57cec5SDimitry Andric "xscvspdp $XT, $XB", IIC_VecFP, []>; 8160b57cec5SDimitry Andric def XSCVSXDDP : XX2Form<60, 376, 8170b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 8180b57cec5SDimitry Andric "xscvsxddp $XT, $XB", IIC_VecFP, 819e8d8bef9SDimitry Andric [(set f64:$XT, (PPCany_fcfid f64:$XB))]>; 8200b57cec5SDimitry Andric def XSCVUXDDP : XX2Form<60, 360, 8210b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 8220b57cec5SDimitry Andric "xscvuxddp $XT, $XB", IIC_VecFP, 823e8d8bef9SDimitry Andric [(set f64:$XT, (PPCany_fcfidu f64:$XB))]>; 8240b57cec5SDimitry Andric 8250b57cec5SDimitry Andric def XVCVDPSP : XX2Form<60, 393, 8260b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8270b57cec5SDimitry Andric "xvcvdpsp $XT, $XB", IIC_VecFP, 8280b57cec5SDimitry Andric [(set v4f32:$XT, (int_ppc_vsx_xvcvdpsp v2f64:$XB))]>; 8290b57cec5SDimitry Andric def XVCVDPSXDS : XX2Form<60, 472, 8300b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8310b57cec5SDimitry Andric "xvcvdpsxds $XT, $XB", IIC_VecFP, 832e8d8bef9SDimitry Andric [(set v2i64:$XT, (any_fp_to_sint v2f64:$XB))]>; 8330b57cec5SDimitry Andric def XVCVDPSXWS : XX2Form<60, 216, 8340b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8350b57cec5SDimitry Andric "xvcvdpsxws $XT, $XB", IIC_VecFP, 8360b57cec5SDimitry Andric [(set v4i32:$XT, (int_ppc_vsx_xvcvdpsxws v2f64:$XB))]>; 8370b57cec5SDimitry Andric def XVCVDPUXDS : XX2Form<60, 456, 8380b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8390b57cec5SDimitry Andric "xvcvdpuxds $XT, $XB", IIC_VecFP, 840e8d8bef9SDimitry Andric [(set v2i64:$XT, (any_fp_to_uint v2f64:$XB))]>; 8410b57cec5SDimitry Andric def XVCVDPUXWS : XX2Form<60, 200, 8420b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8430b57cec5SDimitry Andric "xvcvdpuxws $XT, $XB", IIC_VecFP, 8440b57cec5SDimitry Andric [(set v4i32:$XT, (int_ppc_vsx_xvcvdpuxws v2f64:$XB))]>; 8450b57cec5SDimitry Andric 8460b57cec5SDimitry Andric def XVCVSPDP : XX2Form<60, 457, 8470b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8480b57cec5SDimitry Andric "xvcvspdp $XT, $XB", IIC_VecFP, 8490b57cec5SDimitry Andric [(set v2f64:$XT, (int_ppc_vsx_xvcvspdp v4f32:$XB))]>; 8500b57cec5SDimitry Andric def XVCVSPSXDS : XX2Form<60, 408, 8510b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 852*fe6060f1SDimitry Andric "xvcvspsxds $XT, $XB", IIC_VecFP, 853*fe6060f1SDimitry Andric [(set v2i64:$XT, (int_ppc_vsx_xvcvspsxds v4f32:$XB))]>; 8540b57cec5SDimitry Andric def XVCVSPSXWS : XX2Form<60, 152, 8550b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8560b57cec5SDimitry Andric "xvcvspsxws $XT, $XB", IIC_VecFP, 857e8d8bef9SDimitry Andric [(set v4i32:$XT, (any_fp_to_sint v4f32:$XB))]>; 8580b57cec5SDimitry Andric def XVCVSPUXDS : XX2Form<60, 392, 8590b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 860*fe6060f1SDimitry Andric "xvcvspuxds $XT, $XB", IIC_VecFP, 861*fe6060f1SDimitry Andric [(set v2i64:$XT, (int_ppc_vsx_xvcvspuxds v4f32:$XB))]>; 8620b57cec5SDimitry Andric def XVCVSPUXWS : XX2Form<60, 136, 8630b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8640b57cec5SDimitry Andric "xvcvspuxws $XT, $XB", IIC_VecFP, 865e8d8bef9SDimitry Andric [(set v4i32:$XT, (any_fp_to_uint v4f32:$XB))]>; 8660b57cec5SDimitry Andric def XVCVSXDDP : XX2Form<60, 504, 8670b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8680b57cec5SDimitry Andric "xvcvsxddp $XT, $XB", IIC_VecFP, 869e8d8bef9SDimitry Andric [(set v2f64:$XT, (any_sint_to_fp v2i64:$XB))]>; 8700b57cec5SDimitry Andric def XVCVSXDSP : XX2Form<60, 440, 8710b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8720b57cec5SDimitry Andric "xvcvsxdsp $XT, $XB", IIC_VecFP, 8730b57cec5SDimitry Andric [(set v4f32:$XT, (int_ppc_vsx_xvcvsxdsp v2i64:$XB))]>; 8740b57cec5SDimitry Andric def XVCVSXWSP : XX2Form<60, 184, 8750b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8760b57cec5SDimitry Andric "xvcvsxwsp $XT, $XB", IIC_VecFP, 877e8d8bef9SDimitry Andric [(set v4f32:$XT, (any_sint_to_fp v4i32:$XB))]>; 8780b57cec5SDimitry Andric def XVCVUXDDP : XX2Form<60, 488, 8790b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8800b57cec5SDimitry Andric "xvcvuxddp $XT, $XB", IIC_VecFP, 881e8d8bef9SDimitry Andric [(set v2f64:$XT, (any_uint_to_fp v2i64:$XB))]>; 8820b57cec5SDimitry Andric def XVCVUXDSP : XX2Form<60, 424, 8830b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8840b57cec5SDimitry Andric "xvcvuxdsp $XT, $XB", IIC_VecFP, 8850b57cec5SDimitry Andric [(set v4f32:$XT, (int_ppc_vsx_xvcvuxdsp v2i64:$XB))]>; 886e8d8bef9SDimitry Andric def XVCVUXWSP : XX2Form<60, 168, 887e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 888e8d8bef9SDimitry Andric "xvcvuxwsp $XT, $XB", IIC_VecFP, 889e8d8bef9SDimitry Andric [(set v4f32:$XT, (any_uint_to_fp v4i32:$XB))]>; 890e8d8bef9SDimitry Andric 891e8d8bef9SDimitry Andric let mayRaiseFPException = 0 in { 892e8d8bef9SDimitry Andric def XVCVSXWDP : XX2Form<60, 248, 893e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 894e8d8bef9SDimitry Andric "xvcvsxwdp $XT, $XB", IIC_VecFP, 895e8d8bef9SDimitry Andric [(set v2f64:$XT, (int_ppc_vsx_xvcvsxwdp v4i32:$XB))]>; 8960b57cec5SDimitry Andric def XVCVUXWDP : XX2Form<60, 232, 8970b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 8980b57cec5SDimitry Andric "xvcvuxwdp $XT, $XB", IIC_VecFP, 8990b57cec5SDimitry Andric [(set v2f64:$XT, (int_ppc_vsx_xvcvuxwdp v4i32:$XB))]>; 900e8d8bef9SDimitry Andric } 9010b57cec5SDimitry Andric 902e8d8bef9SDimitry Andric // Rounding Instructions respecting current rounding mode 9030b57cec5SDimitry Andric def XSRDPIC : XX2Form<60, 107, 9040b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 9050b57cec5SDimitry Andric "xsrdpic $XT, $XB", IIC_VecFP, 906e8d8bef9SDimitry Andric [(set f64:$XT, (fnearbyint f64:$XB))]>; 9070b57cec5SDimitry Andric def XVRDPIC : XX2Form<60, 235, 9080b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 9090b57cec5SDimitry Andric "xvrdpic $XT, $XB", IIC_VecFP, 910e8d8bef9SDimitry Andric [(set v2f64:$XT, (fnearbyint v2f64:$XB))]>; 9110b57cec5SDimitry Andric def XVRSPIC : XX2Form<60, 171, 9120b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 9130b57cec5SDimitry Andric "xvrspic $XT, $XB", IIC_VecFP, 914e8d8bef9SDimitry Andric [(set v4f32:$XT, (fnearbyint v4f32:$XB))]>; 9150b57cec5SDimitry Andric // Max/Min Instructions 9160b57cec5SDimitry Andric let isCommutable = 1 in { 9170b57cec5SDimitry Andric def XSMAXDP : XX3Form<60, 160, 9180b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB), 9190b57cec5SDimitry Andric "xsmaxdp $XT, $XA, $XB", IIC_VecFP, 9200b57cec5SDimitry Andric [(set vsfrc:$XT, 9210b57cec5SDimitry Andric (int_ppc_vsx_xsmaxdp vsfrc:$XA, vsfrc:$XB))]>; 9220b57cec5SDimitry Andric def XSMINDP : XX3Form<60, 168, 9230b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB), 9240b57cec5SDimitry Andric "xsmindp $XT, $XA, $XB", IIC_VecFP, 9250b57cec5SDimitry Andric [(set vsfrc:$XT, 9260b57cec5SDimitry Andric (int_ppc_vsx_xsmindp vsfrc:$XA, vsfrc:$XB))]>; 9270b57cec5SDimitry Andric 9280b57cec5SDimitry Andric def XVMAXDP : XX3Form<60, 224, 9290b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 9300b57cec5SDimitry Andric "xvmaxdp $XT, $XA, $XB", IIC_VecFP, 9310b57cec5SDimitry Andric [(set vsrc:$XT, 9320b57cec5SDimitry Andric (int_ppc_vsx_xvmaxdp vsrc:$XA, vsrc:$XB))]>; 9330b57cec5SDimitry Andric def XVMINDP : XX3Form<60, 232, 9340b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 9350b57cec5SDimitry Andric "xvmindp $XT, $XA, $XB", IIC_VecFP, 9360b57cec5SDimitry Andric [(set vsrc:$XT, 9370b57cec5SDimitry Andric (int_ppc_vsx_xvmindp vsrc:$XA, vsrc:$XB))]>; 9380b57cec5SDimitry Andric 9390b57cec5SDimitry Andric def XVMAXSP : XX3Form<60, 192, 9400b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 9410b57cec5SDimitry Andric "xvmaxsp $XT, $XA, $XB", IIC_VecFP, 9420b57cec5SDimitry Andric [(set vsrc:$XT, 9430b57cec5SDimitry Andric (int_ppc_vsx_xvmaxsp vsrc:$XA, vsrc:$XB))]>; 9440b57cec5SDimitry Andric def XVMINSP : XX3Form<60, 200, 9450b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 9460b57cec5SDimitry Andric "xvminsp $XT, $XA, $XB", IIC_VecFP, 9470b57cec5SDimitry Andric [(set vsrc:$XT, 9480b57cec5SDimitry Andric (int_ppc_vsx_xvminsp vsrc:$XA, vsrc:$XB))]>; 9490b57cec5SDimitry Andric } // isCommutable 950e8d8bef9SDimitry Andric } // Uses = [RM] 951e8d8bef9SDimitry Andric 952e8d8bef9SDimitry Andric // Rounding Instructions with static direction. 953e8d8bef9SDimitry Andric def XSRDPI : XX2Form<60, 73, 954e8d8bef9SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 955e8d8bef9SDimitry Andric "xsrdpi $XT, $XB", IIC_VecFP, 956e8d8bef9SDimitry Andric [(set f64:$XT, (any_fround f64:$XB))]>; 957e8d8bef9SDimitry Andric def XSRDPIM : XX2Form<60, 121, 958e8d8bef9SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 959e8d8bef9SDimitry Andric "xsrdpim $XT, $XB", IIC_VecFP, 960e8d8bef9SDimitry Andric [(set f64:$XT, (any_ffloor f64:$XB))]>; 961e8d8bef9SDimitry Andric def XSRDPIP : XX2Form<60, 105, 962e8d8bef9SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 963e8d8bef9SDimitry Andric "xsrdpip $XT, $XB", IIC_VecFP, 964e8d8bef9SDimitry Andric [(set f64:$XT, (any_fceil f64:$XB))]>; 965e8d8bef9SDimitry Andric def XSRDPIZ : XX2Form<60, 89, 966e8d8bef9SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XB), 967e8d8bef9SDimitry Andric "xsrdpiz $XT, $XB", IIC_VecFP, 968e8d8bef9SDimitry Andric [(set f64:$XT, (any_ftrunc f64:$XB))]>; 969e8d8bef9SDimitry Andric 970e8d8bef9SDimitry Andric def XVRDPI : XX2Form<60, 201, 971e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 972e8d8bef9SDimitry Andric "xvrdpi $XT, $XB", IIC_VecFP, 973e8d8bef9SDimitry Andric [(set v2f64:$XT, (any_fround v2f64:$XB))]>; 974e8d8bef9SDimitry Andric def XVRDPIM : XX2Form<60, 249, 975e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 976e8d8bef9SDimitry Andric "xvrdpim $XT, $XB", IIC_VecFP, 977e8d8bef9SDimitry Andric [(set v2f64:$XT, (any_ffloor v2f64:$XB))]>; 978e8d8bef9SDimitry Andric def XVRDPIP : XX2Form<60, 233, 979e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 980e8d8bef9SDimitry Andric "xvrdpip $XT, $XB", IIC_VecFP, 981e8d8bef9SDimitry Andric [(set v2f64:$XT, (any_fceil v2f64:$XB))]>; 982e8d8bef9SDimitry Andric def XVRDPIZ : XX2Form<60, 217, 983e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 984e8d8bef9SDimitry Andric "xvrdpiz $XT, $XB", IIC_VecFP, 985e8d8bef9SDimitry Andric [(set v2f64:$XT, (any_ftrunc v2f64:$XB))]>; 986e8d8bef9SDimitry Andric 987e8d8bef9SDimitry Andric def XVRSPI : XX2Form<60, 137, 988e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 989e8d8bef9SDimitry Andric "xvrspi $XT, $XB", IIC_VecFP, 990e8d8bef9SDimitry Andric [(set v4f32:$XT, (any_fround v4f32:$XB))]>; 991e8d8bef9SDimitry Andric def XVRSPIM : XX2Form<60, 185, 992e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 993e8d8bef9SDimitry Andric "xvrspim $XT, $XB", IIC_VecFP, 994e8d8bef9SDimitry Andric [(set v4f32:$XT, (any_ffloor v4f32:$XB))]>; 995e8d8bef9SDimitry Andric def XVRSPIP : XX2Form<60, 169, 996e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 997e8d8bef9SDimitry Andric "xvrspip $XT, $XB", IIC_VecFP, 998e8d8bef9SDimitry Andric [(set v4f32:$XT, (any_fceil v4f32:$XB))]>; 999e8d8bef9SDimitry Andric def XVRSPIZ : XX2Form<60, 153, 1000e8d8bef9SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB), 1001e8d8bef9SDimitry Andric "xvrspiz $XT, $XB", IIC_VecFP, 1002e8d8bef9SDimitry Andric [(set v4f32:$XT, (any_ftrunc v4f32:$XB))]>; 1003e8d8bef9SDimitry Andric } // mayRaiseFPException 10040b57cec5SDimitry Andric 10050b57cec5SDimitry Andric // Logical Instructions 10060b57cec5SDimitry Andric let isCommutable = 1 in 10070b57cec5SDimitry Andric def XXLAND : XX3Form<60, 130, 10080b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 10090b57cec5SDimitry Andric "xxland $XT, $XA, $XB", IIC_VecGeneral, 10100b57cec5SDimitry Andric [(set v4i32:$XT, (and v4i32:$XA, v4i32:$XB))]>; 10110b57cec5SDimitry Andric def XXLANDC : XX3Form<60, 138, 10120b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 10130b57cec5SDimitry Andric "xxlandc $XT, $XA, $XB", IIC_VecGeneral, 10140b57cec5SDimitry Andric [(set v4i32:$XT, (and v4i32:$XA, 1015*fe6060f1SDimitry Andric (vnot v4i32:$XB)))]>; 10160b57cec5SDimitry Andric let isCommutable = 1 in { 10170b57cec5SDimitry Andric def XXLNOR : XX3Form<60, 162, 10180b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 10190b57cec5SDimitry Andric "xxlnor $XT, $XA, $XB", IIC_VecGeneral, 1020*fe6060f1SDimitry Andric [(set v4i32:$XT, (vnot (or v4i32:$XA, 10210b57cec5SDimitry Andric v4i32:$XB)))]>; 10220b57cec5SDimitry Andric def XXLOR : XX3Form<60, 146, 10230b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 10240b57cec5SDimitry Andric "xxlor $XT, $XA, $XB", IIC_VecGeneral, 10250b57cec5SDimitry Andric [(set v4i32:$XT, (or v4i32:$XA, v4i32:$XB))]>; 10260b57cec5SDimitry Andric let isCodeGenOnly = 1 in 10270b57cec5SDimitry Andric def XXLORf: XX3Form<60, 146, 10280b57cec5SDimitry Andric (outs vsfrc:$XT), (ins vsfrc:$XA, vsfrc:$XB), 10290b57cec5SDimitry Andric "xxlor $XT, $XA, $XB", IIC_VecGeneral, []>; 10300b57cec5SDimitry Andric def XXLXOR : XX3Form<60, 154, 10310b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 10320b57cec5SDimitry Andric "xxlxor $XT, $XA, $XB", IIC_VecGeneral, 10330b57cec5SDimitry Andric [(set v4i32:$XT, (xor v4i32:$XA, v4i32:$XB))]>; 10340b57cec5SDimitry Andric } // isCommutable 10350b57cec5SDimitry Andric 10360b57cec5SDimitry Andric let isCodeGenOnly = 1, isMoveImm = 1, isAsCheapAsAMove = 1, 10370b57cec5SDimitry Andric isReMaterializable = 1 in { 10388bcb0991SDimitry Andric def XXLXORz : XX3Form_SameOp<60, 154, (outs vsrc:$XT), (ins), 10390b57cec5SDimitry Andric "xxlxor $XT, $XT, $XT", IIC_VecGeneral, 10400b57cec5SDimitry Andric [(set v4i32:$XT, (v4i32 immAllZerosV))]>; 10418bcb0991SDimitry Andric def XXLXORdpz : XX3Form_SameOp<60, 154, 10420b57cec5SDimitry Andric (outs vsfrc:$XT), (ins), 10430b57cec5SDimitry Andric "xxlxor $XT, $XT, $XT", IIC_VecGeneral, 10440b57cec5SDimitry Andric [(set f64:$XT, (fpimm0))]>; 10458bcb0991SDimitry Andric def XXLXORspz : XX3Form_SameOp<60, 154, 10460b57cec5SDimitry Andric (outs vssrc:$XT), (ins), 10470b57cec5SDimitry Andric "xxlxor $XT, $XT, $XT", IIC_VecGeneral, 10480b57cec5SDimitry Andric [(set f32:$XT, (fpimm0))]>; 10490b57cec5SDimitry Andric } 10500b57cec5SDimitry Andric 10510b57cec5SDimitry Andric // Permutation Instructions 10520b57cec5SDimitry Andric def XXMRGHW : XX3Form<60, 18, 10530b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 10540b57cec5SDimitry Andric "xxmrghw $XT, $XA, $XB", IIC_VecPerm, []>; 10550b57cec5SDimitry Andric def XXMRGLW : XX3Form<60, 50, 10560b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 10570b57cec5SDimitry Andric "xxmrglw $XT, $XA, $XB", IIC_VecPerm, []>; 10580b57cec5SDimitry Andric 10590b57cec5SDimitry Andric def XXPERMDI : XX3Form_2<60, 10, 10600b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$DM), 10610b57cec5SDimitry Andric "xxpermdi $XT, $XA, $XB, $DM", IIC_VecPerm, 10620b57cec5SDimitry Andric [(set v2i64:$XT, (PPCxxpermdi v2i64:$XA, v2i64:$XB, 10630b57cec5SDimitry Andric imm32SExt16:$DM))]>; 10640b57cec5SDimitry Andric let isCodeGenOnly = 1 in 10650b57cec5SDimitry Andric def XXPERMDIs : XX3Form_2s<60, 10, (outs vsrc:$XT), (ins vsfrc:$XA, u2imm:$DM), 10660b57cec5SDimitry Andric "xxpermdi $XT, $XA, $XA, $DM", IIC_VecPerm, []>; 10670b57cec5SDimitry Andric def XXSEL : XX4Form<60, 3, 10680b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, vsrc:$XC), 10690b57cec5SDimitry Andric "xxsel $XT, $XA, $XB, $XC", IIC_VecPerm, []>; 10700b57cec5SDimitry Andric 10710b57cec5SDimitry Andric def XXSLDWI : XX3Form_2<60, 2, 10720b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB, u2imm:$SHW), 10730b57cec5SDimitry Andric "xxsldwi $XT, $XA, $XB, $SHW", IIC_VecPerm, 10740b57cec5SDimitry Andric [(set v4i32:$XT, (PPCvecshl v4i32:$XA, v4i32:$XB, 10750b57cec5SDimitry Andric imm32SExt16:$SHW))]>; 10760b57cec5SDimitry Andric 10770b57cec5SDimitry Andric let isCodeGenOnly = 1 in 10780b57cec5SDimitry Andric def XXSLDWIs : XX3Form_2s<60, 2, 10790b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsfrc:$XA, u2imm:$SHW), 10800b57cec5SDimitry Andric "xxsldwi $XT, $XA, $XA, $SHW", IIC_VecPerm, []>; 10810b57cec5SDimitry Andric 10820b57cec5SDimitry Andric def XXSPLTW : XX2Form_2<60, 164, 10830b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsrc:$XB, u2imm:$UIM), 10840b57cec5SDimitry Andric "xxspltw $XT, $XB, $UIM", IIC_VecPerm, 10850b57cec5SDimitry Andric [(set v4i32:$XT, 10860b57cec5SDimitry Andric (PPCxxsplt v4i32:$XB, imm32SExt16:$UIM))]>; 10870b57cec5SDimitry Andric let isCodeGenOnly = 1 in 10880b57cec5SDimitry Andric def XXSPLTWs : XX2Form_2<60, 164, 10890b57cec5SDimitry Andric (outs vsrc:$XT), (ins vsfrc:$XB, u2imm:$UIM), 10900b57cec5SDimitry Andric "xxspltw $XT, $XB, $UIM", IIC_VecPerm, []>; 10910b57cec5SDimitry Andric 10925ffd83dbSDimitry Andric// The following VSX instructions were introduced in Power ISA 2.07 10935ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP8Vector] in { 10945ffd83dbSDimitry Andric let isCommutable = 1 in { 10955ffd83dbSDimitry Andric def XXLEQV : XX3Form<60, 186, 10965ffd83dbSDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 10975ffd83dbSDimitry Andric "xxleqv $XT, $XA, $XB", IIC_VecGeneral, 1098*fe6060f1SDimitry Andric [(set v4i32:$XT, (vnot (xor v4i32:$XA, v4i32:$XB)))]>; 10995ffd83dbSDimitry Andric def XXLNAND : XX3Form<60, 178, 11005ffd83dbSDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 11015ffd83dbSDimitry Andric "xxlnand $XT, $XA, $XB", IIC_VecGeneral, 1102*fe6060f1SDimitry Andric [(set v4i32:$XT, (vnot (and v4i32:$XA, v4i32:$XB)))]>; 11035ffd83dbSDimitry Andric } // isCommutable 11040b57cec5SDimitry Andric 11055ffd83dbSDimitry Andric let isCodeGenOnly = 1, isMoveImm = 1, isAsCheapAsAMove = 1, 11065ffd83dbSDimitry Andric isReMaterializable = 1 in { 11075ffd83dbSDimitry Andric def XXLEQVOnes : XX3Form_SameOp<60, 186, (outs vsrc:$XT), (ins), 11085ffd83dbSDimitry Andric "xxleqv $XT, $XT, $XT", IIC_VecGeneral, 11095ffd83dbSDimitry Andric [(set v4i32:$XT, (bitconvert (v16i8 immAllOnesV)))]>; 11105ffd83dbSDimitry Andric } 11115ffd83dbSDimitry Andric 11125ffd83dbSDimitry Andric def XXLORC : XX3Form<60, 170, 11135ffd83dbSDimitry Andric (outs vsrc:$XT), (ins vsrc:$XA, vsrc:$XB), 11145ffd83dbSDimitry Andric "xxlorc $XT, $XA, $XB", IIC_VecGeneral, 1115*fe6060f1SDimitry Andric [(set v4i32:$XT, (or v4i32:$XA, (vnot v4i32:$XB)))]>; 11165ffd83dbSDimitry Andric 11175ffd83dbSDimitry Andric // VSX scalar loads introduced in ISA 2.07 11185ffd83dbSDimitry Andric let mayLoad = 1, mayStore = 0 in { 11195ffd83dbSDimitry Andric let CodeSize = 3 in 11205ffd83dbSDimitry Andric def LXSSPX : XX1Form_memOp<31, 524, (outs vssrc:$XT), (ins memrr:$src), 11215ffd83dbSDimitry Andric "lxsspx $XT, $src", IIC_LdStLFD, []>; 11225ffd83dbSDimitry Andric def LXSIWAX : XX1Form_memOp<31, 76, (outs vsfrc:$XT), (ins memrr:$src), 11235ffd83dbSDimitry Andric "lxsiwax $XT, $src", IIC_LdStLFD, []>; 11245ffd83dbSDimitry Andric def LXSIWZX : XX1Form_memOp<31, 12, (outs vsfrc:$XT), (ins memrr:$src), 11255ffd83dbSDimitry Andric "lxsiwzx $XT, $src", IIC_LdStLFD, []>; 11265ffd83dbSDimitry Andric 11275ffd83dbSDimitry Andric // Pseudo instruction XFLOADf32 will be expanded to LXSSPX or LFSX later 11285ffd83dbSDimitry Andric let CodeSize = 3 in 11295ffd83dbSDimitry Andric def XFLOADf32 : PseudoXFormMemOp<(outs vssrc:$XT), (ins memrr:$src), 11305ffd83dbSDimitry Andric "#XFLOADf32", 1131*fe6060f1SDimitry Andric [(set f32:$XT, (load XForm:$src))]>; 11325ffd83dbSDimitry Andric // Pseudo instruction LIWAX will be expanded to LXSIWAX or LFIWAX later 11335ffd83dbSDimitry Andric def LIWAX : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src), 11345ffd83dbSDimitry Andric "#LIWAX", 1135*fe6060f1SDimitry Andric [(set f64:$XT, (PPClfiwax ForceXForm:$src))]>; 11365ffd83dbSDimitry Andric // Pseudo instruction LIWZX will be expanded to LXSIWZX or LFIWZX later 11375ffd83dbSDimitry Andric def LIWZX : PseudoXFormMemOp<(outs vsfrc:$XT), (ins memrr:$src), 11385ffd83dbSDimitry Andric "#LIWZX", 1139*fe6060f1SDimitry Andric [(set f64:$XT, (PPClfiwzx ForceXForm:$src))]>; 11405ffd83dbSDimitry Andric } // mayLoad 11415ffd83dbSDimitry Andric 11425ffd83dbSDimitry Andric // VSX scalar stores introduced in ISA 2.07 11435ffd83dbSDimitry Andric let mayStore = 1, mayLoad = 0 in { 11445ffd83dbSDimitry Andric let CodeSize = 3 in 11455ffd83dbSDimitry Andric def STXSSPX : XX1Form_memOp<31, 652, (outs), (ins vssrc:$XT, memrr:$dst), 11465ffd83dbSDimitry Andric "stxsspx $XT, $dst", IIC_LdStSTFD, []>; 11475ffd83dbSDimitry Andric def STXSIWX : XX1Form_memOp<31, 140, (outs), (ins vsfrc:$XT, memrr:$dst), 11485ffd83dbSDimitry Andric "stxsiwx $XT, $dst", IIC_LdStSTFD, []>; 11495ffd83dbSDimitry Andric 11505ffd83dbSDimitry Andric // Pseudo instruction XFSTOREf32 will be expanded to STXSSPX or STFSX later 11515ffd83dbSDimitry Andric let CodeSize = 3 in 11525ffd83dbSDimitry Andric def XFSTOREf32 : PseudoXFormMemOp<(outs), (ins vssrc:$XT, memrr:$dst), 11535ffd83dbSDimitry Andric "#XFSTOREf32", 1154*fe6060f1SDimitry Andric [(store f32:$XT, XForm:$dst)]>; 11555ffd83dbSDimitry Andric // Pseudo instruction STIWX will be expanded to STXSIWX or STFIWX later 11565ffd83dbSDimitry Andric def STIWX : PseudoXFormMemOp<(outs), (ins vsfrc:$XT, memrr:$dst), 11575ffd83dbSDimitry Andric "#STIWX", 1158*fe6060f1SDimitry Andric [(PPCstfiwx f64:$XT, ForceXForm:$dst)]>; 11595ffd83dbSDimitry Andric } // mayStore 11605ffd83dbSDimitry Andric 11615ffd83dbSDimitry Andric // VSX Elementary Scalar FP arithmetic (SP) 11625ffd83dbSDimitry Andric let mayRaiseFPException = 1 in { 11635ffd83dbSDimitry Andric let isCommutable = 1 in { 11645ffd83dbSDimitry Andric def XSADDSP : XX3Form<60, 0, 11655ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB), 11665ffd83dbSDimitry Andric "xsaddsp $XT, $XA, $XB", IIC_VecFP, 11675ffd83dbSDimitry Andric [(set f32:$XT, (any_fadd f32:$XA, f32:$XB))]>; 11685ffd83dbSDimitry Andric def XSMULSP : XX3Form<60, 16, 11695ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB), 11705ffd83dbSDimitry Andric "xsmulsp $XT, $XA, $XB", IIC_VecFP, 11715ffd83dbSDimitry Andric [(set f32:$XT, (any_fmul f32:$XA, f32:$XB))]>; 11725ffd83dbSDimitry Andric } // isCommutable 11735ffd83dbSDimitry Andric 11745ffd83dbSDimitry Andric def XSSUBSP : XX3Form<60, 8, 11755ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB), 11765ffd83dbSDimitry Andric "xssubsp $XT, $XA, $XB", IIC_VecFP, 11775ffd83dbSDimitry Andric [(set f32:$XT, (any_fsub f32:$XA, f32:$XB))]>; 11785ffd83dbSDimitry Andric def XSDIVSP : XX3Form<60, 24, 11795ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vssrc:$XA, vssrc:$XB), 11805ffd83dbSDimitry Andric "xsdivsp $XT, $XA, $XB", IIC_FPDivS, 11815ffd83dbSDimitry Andric [(set f32:$XT, (any_fdiv f32:$XA, f32:$XB))]>; 11825ffd83dbSDimitry Andric 11835ffd83dbSDimitry Andric def XSRESP : XX2Form<60, 26, 11845ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vssrc:$XB), 11855ffd83dbSDimitry Andric "xsresp $XT, $XB", IIC_VecFP, 11865ffd83dbSDimitry Andric [(set f32:$XT, (PPCfre f32:$XB))]>; 11875ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 1188e8d8bef9SDimitry Andric let hasSideEffects = 1 in 11895ffd83dbSDimitry Andric def XSRSP : XX2Form<60, 281, 11905ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vsfrc:$XB), 11915ffd83dbSDimitry Andric "xsrsp $XT, $XB", IIC_VecFP, 11925ffd83dbSDimitry Andric [(set f32:$XT, (any_fpround f64:$XB))]>; 11935ffd83dbSDimitry Andric def XSSQRTSP : XX2Form<60, 11, 11945ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vssrc:$XB), 11955ffd83dbSDimitry Andric "xssqrtsp $XT, $XB", IIC_FPSqrtS, 11965ffd83dbSDimitry Andric [(set f32:$XT, (any_fsqrt f32:$XB))]>; 11975ffd83dbSDimitry Andric def XSRSQRTESP : XX2Form<60, 10, 11985ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vssrc:$XB), 11995ffd83dbSDimitry Andric "xsrsqrtesp $XT, $XB", IIC_VecFP, 12005ffd83dbSDimitry Andric [(set f32:$XT, (PPCfrsqrte f32:$XB))]>; 12015ffd83dbSDimitry Andric 12025ffd83dbSDimitry Andric // FMA Instructions 12035ffd83dbSDimitry Andric let BaseName = "XSMADDASP" in { 12045ffd83dbSDimitry Andric let isCommutable = 1 in 12055ffd83dbSDimitry Andric def XSMADDASP : XX3Form<60, 1, 12065ffd83dbSDimitry Andric (outs vssrc:$XT), 12075ffd83dbSDimitry Andric (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB), 12085ffd83dbSDimitry Andric "xsmaddasp $XT, $XA, $XB", IIC_VecFP, 12095ffd83dbSDimitry Andric [(set f32:$XT, (any_fma f32:$XA, f32:$XB, f32:$XTi))]>, 12105ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 12115ffd83dbSDimitry Andric AltVSXFMARel; 12125ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 12135ffd83dbSDimitry Andric let IsVSXFMAAlt = 1, hasSideEffects = 1 in 12145ffd83dbSDimitry Andric def XSMADDMSP : XX3Form<60, 9, 12155ffd83dbSDimitry Andric (outs vssrc:$XT), 12165ffd83dbSDimitry Andric (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB), 12175ffd83dbSDimitry Andric "xsmaddmsp $XT, $XA, $XB", IIC_VecFP, []>, 12185ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 12195ffd83dbSDimitry Andric AltVSXFMARel; 12205ffd83dbSDimitry Andric } 12215ffd83dbSDimitry Andric 12225ffd83dbSDimitry Andric let BaseName = "XSMSUBASP" in { 12235ffd83dbSDimitry Andric let isCommutable = 1 in 12245ffd83dbSDimitry Andric def XSMSUBASP : XX3Form<60, 17, 12255ffd83dbSDimitry Andric (outs vssrc:$XT), 12265ffd83dbSDimitry Andric (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB), 12275ffd83dbSDimitry Andric "xsmsubasp $XT, $XA, $XB", IIC_VecFP, 12285ffd83dbSDimitry Andric [(set f32:$XT, (any_fma f32:$XA, f32:$XB, 12295ffd83dbSDimitry Andric (fneg f32:$XTi)))]>, 12305ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 12315ffd83dbSDimitry Andric AltVSXFMARel; 12325ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 12335ffd83dbSDimitry Andric let IsVSXFMAAlt = 1, hasSideEffects = 1 in 12345ffd83dbSDimitry Andric def XSMSUBMSP : XX3Form<60, 25, 12355ffd83dbSDimitry Andric (outs vssrc:$XT), 12365ffd83dbSDimitry Andric (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB), 12375ffd83dbSDimitry Andric "xsmsubmsp $XT, $XA, $XB", IIC_VecFP, []>, 12385ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 12395ffd83dbSDimitry Andric AltVSXFMARel; 12405ffd83dbSDimitry Andric } 12415ffd83dbSDimitry Andric 12425ffd83dbSDimitry Andric let BaseName = "XSNMADDASP" in { 12435ffd83dbSDimitry Andric let isCommutable = 1 in 12445ffd83dbSDimitry Andric def XSNMADDASP : XX3Form<60, 129, 12455ffd83dbSDimitry Andric (outs vssrc:$XT), 12465ffd83dbSDimitry Andric (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB), 12475ffd83dbSDimitry Andric "xsnmaddasp $XT, $XA, $XB", IIC_VecFP, 12485ffd83dbSDimitry Andric [(set f32:$XT, (fneg (any_fma f32:$XA, f32:$XB, 12495ffd83dbSDimitry Andric f32:$XTi)))]>, 12505ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 12515ffd83dbSDimitry Andric AltVSXFMARel; 12525ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 12535ffd83dbSDimitry Andric let IsVSXFMAAlt = 1, hasSideEffects = 1 in 12545ffd83dbSDimitry Andric def XSNMADDMSP : XX3Form<60, 137, 12555ffd83dbSDimitry Andric (outs vssrc:$XT), 12565ffd83dbSDimitry Andric (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB), 12575ffd83dbSDimitry Andric "xsnmaddmsp $XT, $XA, $XB", IIC_VecFP, []>, 12585ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 12595ffd83dbSDimitry Andric AltVSXFMARel; 12605ffd83dbSDimitry Andric } 12615ffd83dbSDimitry Andric 12625ffd83dbSDimitry Andric let BaseName = "XSNMSUBASP" in { 12635ffd83dbSDimitry Andric let isCommutable = 1 in 12645ffd83dbSDimitry Andric def XSNMSUBASP : XX3Form<60, 145, 12655ffd83dbSDimitry Andric (outs vssrc:$XT), 12665ffd83dbSDimitry Andric (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB), 12675ffd83dbSDimitry Andric "xsnmsubasp $XT, $XA, $XB", IIC_VecFP, 12685ffd83dbSDimitry Andric [(set f32:$XT, (fneg (any_fma f32:$XA, f32:$XB, 12695ffd83dbSDimitry Andric (fneg f32:$XTi))))]>, 12705ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 12715ffd83dbSDimitry Andric AltVSXFMARel; 12725ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 12735ffd83dbSDimitry Andric let IsVSXFMAAlt = 1, hasSideEffects = 1 in 12745ffd83dbSDimitry Andric def XSNMSUBMSP : XX3Form<60, 153, 12755ffd83dbSDimitry Andric (outs vssrc:$XT), 12765ffd83dbSDimitry Andric (ins vssrc:$XTi, vssrc:$XA, vssrc:$XB), 12775ffd83dbSDimitry Andric "xsnmsubmsp $XT, $XA, $XB", IIC_VecFP, []>, 12785ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">, 12795ffd83dbSDimitry Andric AltVSXFMARel; 12805ffd83dbSDimitry Andric } 12815ffd83dbSDimitry Andric 12825ffd83dbSDimitry Andric // Single Precision Conversions (FP <-> INT) 12835ffd83dbSDimitry Andric def XSCVSXDSP : XX2Form<60, 312, 12845ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vsfrc:$XB), 12855ffd83dbSDimitry Andric "xscvsxdsp $XT, $XB", IIC_VecFP, 1286e8d8bef9SDimitry Andric [(set f32:$XT, (PPCany_fcfids f64:$XB))]>; 12875ffd83dbSDimitry Andric def XSCVUXDSP : XX2Form<60, 296, 12885ffd83dbSDimitry Andric (outs vssrc:$XT), (ins vsfrc:$XB), 12895ffd83dbSDimitry Andric "xscvuxdsp $XT, $XB", IIC_VecFP, 1290e8d8bef9SDimitry Andric [(set f32:$XT, (PPCany_fcfidus f64:$XB))]>; 1291e8d8bef9SDimitry Andric } // mayRaiseFPException 12925ffd83dbSDimitry Andric 12935ffd83dbSDimitry Andric // Conversions between vector and scalar single precision 12945ffd83dbSDimitry Andric def XSCVDPSPN : XX2Form<60, 267, (outs vsrc:$XT), (ins vssrc:$XB), 12955ffd83dbSDimitry Andric "xscvdpspn $XT, $XB", IIC_VecFP, []>; 12965ffd83dbSDimitry Andric def XSCVSPDPN : XX2Form<60, 331, (outs vssrc:$XT), (ins vsrc:$XB), 12975ffd83dbSDimitry Andric "xscvspdpn $XT, $XB", IIC_VecFP, []>; 12985ffd83dbSDimitry Andric 12995ffd83dbSDimitry Andric let Predicates = [HasVSX, HasDirectMove] in { 13005ffd83dbSDimitry Andric // VSX direct move instructions 13015ffd83dbSDimitry Andric def MFVSRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsfrc:$XT), 13025ffd83dbSDimitry Andric "mfvsrd $rA, $XT", IIC_VecGeneral, 13035ffd83dbSDimitry Andric [(set i64:$rA, (PPCmfvsr f64:$XT))]>, 13045ffd83dbSDimitry Andric Requires<[In64BitMode]>; 13055ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 13065ffd83dbSDimitry Andric let isCodeGenOnly = 1, hasSideEffects = 1 in 13075ffd83dbSDimitry Andric def MFVRD : XX1_RS6_RD5_XO<31, 51, (outs g8rc:$rA), (ins vsrc:$XT), 13085ffd83dbSDimitry Andric "mfvsrd $rA, $XT", IIC_VecGeneral, 13095ffd83dbSDimitry Andric []>, 13105ffd83dbSDimitry Andric Requires<[In64BitMode]>; 13115ffd83dbSDimitry Andric def MFVSRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsfrc:$XT), 13125ffd83dbSDimitry Andric "mfvsrwz $rA, $XT", IIC_VecGeneral, 13135ffd83dbSDimitry Andric [(set i32:$rA, (PPCmfvsr f64:$XT))]>; 13145ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 13155ffd83dbSDimitry Andric let isCodeGenOnly = 1, hasSideEffects = 1 in 13165ffd83dbSDimitry Andric def MFVRWZ : XX1_RS6_RD5_XO<31, 115, (outs gprc:$rA), (ins vsrc:$XT), 13175ffd83dbSDimitry Andric "mfvsrwz $rA, $XT", IIC_VecGeneral, 13185ffd83dbSDimitry Andric []>; 13195ffd83dbSDimitry Andric def MTVSRD : XX1_RS6_RD5_XO<31, 179, (outs vsfrc:$XT), (ins g8rc:$rA), 13205ffd83dbSDimitry Andric "mtvsrd $XT, $rA", IIC_VecGeneral, 13215ffd83dbSDimitry Andric [(set f64:$XT, (PPCmtvsra i64:$rA))]>, 13225ffd83dbSDimitry Andric Requires<[In64BitMode]>; 13235ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 13245ffd83dbSDimitry Andric let isCodeGenOnly = 1, hasSideEffects = 1 in 13255ffd83dbSDimitry Andric def MTVRD : XX1_RS6_RD5_XO<31, 179, (outs vsrc:$XT), (ins g8rc:$rA), 13265ffd83dbSDimitry Andric "mtvsrd $XT, $rA", IIC_VecGeneral, 13275ffd83dbSDimitry Andric []>, 13285ffd83dbSDimitry Andric Requires<[In64BitMode]>; 13295ffd83dbSDimitry Andric def MTVSRWA : XX1_RS6_RD5_XO<31, 211, (outs vsfrc:$XT), (ins gprc:$rA), 13305ffd83dbSDimitry Andric "mtvsrwa $XT, $rA", IIC_VecGeneral, 13315ffd83dbSDimitry Andric [(set f64:$XT, (PPCmtvsra i32:$rA))]>; 13325ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 13335ffd83dbSDimitry Andric let isCodeGenOnly = 1, hasSideEffects = 1 in 13345ffd83dbSDimitry Andric def MTVRWA : XX1_RS6_RD5_XO<31, 211, (outs vsrc:$XT), (ins gprc:$rA), 13355ffd83dbSDimitry Andric "mtvsrwa $XT, $rA", IIC_VecGeneral, 13365ffd83dbSDimitry Andric []>; 13375ffd83dbSDimitry Andric def MTVSRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsfrc:$XT), (ins gprc:$rA), 13385ffd83dbSDimitry Andric "mtvsrwz $XT, $rA", IIC_VecGeneral, 13395ffd83dbSDimitry Andric [(set f64:$XT, (PPCmtvsrz i32:$rA))]>; 13405ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 13415ffd83dbSDimitry Andric let isCodeGenOnly = 1, hasSideEffects = 1 in 13425ffd83dbSDimitry Andric def MTVRWZ : XX1_RS6_RD5_XO<31, 243, (outs vsrc:$XT), (ins gprc:$rA), 13435ffd83dbSDimitry Andric "mtvsrwz $XT, $rA", IIC_VecGeneral, 13445ffd83dbSDimitry Andric []>; 13455ffd83dbSDimitry Andric } // HasDirectMove 13465ffd83dbSDimitry Andric 13475ffd83dbSDimitry Andric} // HasVSX, HasP8Vector 13485ffd83dbSDimitry Andric 13495ffd83dbSDimitry Andriclet Predicates = [HasVSX, IsISA3_0, HasDirectMove] in { 13505ffd83dbSDimitry Andricdef MTVSRWS: XX1_RS6_RD5_XO<31, 403, (outs vsrc:$XT), (ins gprc:$rA), 13515ffd83dbSDimitry Andric "mtvsrws $XT, $rA", IIC_VecGeneral, []>; 13525ffd83dbSDimitry Andric 13535ffd83dbSDimitry Andricdef MTVSRDD: XX1Form<31, 435, (outs vsrc:$XT), (ins g8rc_nox0:$rA, g8rc:$rB), 13545ffd83dbSDimitry Andric "mtvsrdd $XT, $rA, $rB", IIC_VecGeneral, 13555ffd83dbSDimitry Andric []>, Requires<[In64BitMode]>; 13565ffd83dbSDimitry Andric 13575ffd83dbSDimitry Andricdef MFVSRLD: XX1_RS6_RD5_XO<31, 307, (outs g8rc:$rA), (ins vsrc:$XT), 13585ffd83dbSDimitry Andric "mfvsrld $rA, $XT", IIC_VecGeneral, 13595ffd83dbSDimitry Andric []>, Requires<[In64BitMode]>; 13605ffd83dbSDimitry Andric 13615ffd83dbSDimitry Andric} // HasVSX, IsISA3_0, HasDirectMove 13625ffd83dbSDimitry Andric 13635ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP9Vector] in { 13645ffd83dbSDimitry Andric // Quad-Precision Scalar Move Instructions: 13655ffd83dbSDimitry Andric // Copy Sign 13665ffd83dbSDimitry Andric def XSCPSGNQP : X_VT5_VA5_VB5<63, 100, "xscpsgnqp", 13675ffd83dbSDimitry Andric [(set f128:$vT, 13685ffd83dbSDimitry Andric (fcopysign f128:$vB, f128:$vA))]>; 13695ffd83dbSDimitry Andric 13705ffd83dbSDimitry Andric // Absolute/Negative-Absolute/Negate 13715ffd83dbSDimitry Andric def XSABSQP : X_VT5_XO5_VB5<63, 0, 804, "xsabsqp", 13725ffd83dbSDimitry Andric [(set f128:$vT, (fabs f128:$vB))]>; 13735ffd83dbSDimitry Andric def XSNABSQP : X_VT5_XO5_VB5<63, 8, 804, "xsnabsqp", 13745ffd83dbSDimitry Andric [(set f128:$vT, (fneg (fabs f128:$vB)))]>; 13755ffd83dbSDimitry Andric def XSNEGQP : X_VT5_XO5_VB5<63, 16, 804, "xsnegqp", 13765ffd83dbSDimitry Andric [(set f128:$vT, (fneg f128:$vB))]>; 13775ffd83dbSDimitry Andric 13785ffd83dbSDimitry Andric //===--------------------------------------------------------------------===// 13795ffd83dbSDimitry Andric // Quad-Precision Scalar Floating-Point Arithmetic Instructions: 13805ffd83dbSDimitry Andric 13815ffd83dbSDimitry Andric // Add/Divide/Multiply/Subtract 13825ffd83dbSDimitry Andric let mayRaiseFPException = 1 in { 13835ffd83dbSDimitry Andric let isCommutable = 1 in { 13845ffd83dbSDimitry Andric def XSADDQP : X_VT5_VA5_VB5 <63, 4, "xsaddqp", 13855ffd83dbSDimitry Andric [(set f128:$vT, (any_fadd f128:$vA, f128:$vB))]>; 13865ffd83dbSDimitry Andric def XSMULQP : X_VT5_VA5_VB5 <63, 36, "xsmulqp", 13875ffd83dbSDimitry Andric [(set f128:$vT, (any_fmul f128:$vA, f128:$vB))]>; 13885ffd83dbSDimitry Andric } 13895ffd83dbSDimitry Andric def XSSUBQP : X_VT5_VA5_VB5 <63, 516, "xssubqp" , 13905ffd83dbSDimitry Andric [(set f128:$vT, (any_fsub f128:$vA, f128:$vB))]>; 13915ffd83dbSDimitry Andric def XSDIVQP : X_VT5_VA5_VB5 <63, 548, "xsdivqp", 13925ffd83dbSDimitry Andric [(set f128:$vT, (any_fdiv f128:$vA, f128:$vB))]>; 13935ffd83dbSDimitry Andric // Square-Root 13945ffd83dbSDimitry Andric def XSSQRTQP : X_VT5_XO5_VB5 <63, 27, 804, "xssqrtqp", 13955ffd83dbSDimitry Andric [(set f128:$vT, (any_fsqrt f128:$vB))]>; 13965ffd83dbSDimitry Andric // (Negative) Multiply-{Add/Subtract} 13975ffd83dbSDimitry Andric def XSMADDQP : X_VT5_VA5_VB5_FMA <63, 388, "xsmaddqp", 13985ffd83dbSDimitry Andric [(set f128:$vT, 13995ffd83dbSDimitry Andric (any_fma f128:$vA, f128:$vB, f128:$vTi))]>; 14005ffd83dbSDimitry Andric def XSMSUBQP : X_VT5_VA5_VB5_FMA <63, 420, "xsmsubqp" , 14015ffd83dbSDimitry Andric [(set f128:$vT, 14025ffd83dbSDimitry Andric (any_fma f128:$vA, f128:$vB, 14035ffd83dbSDimitry Andric (fneg f128:$vTi)))]>; 14045ffd83dbSDimitry Andric def XSNMADDQP : X_VT5_VA5_VB5_FMA <63, 452, "xsnmaddqp", 14055ffd83dbSDimitry Andric [(set f128:$vT, 14065ffd83dbSDimitry Andric (fneg (any_fma f128:$vA, f128:$vB, 14075ffd83dbSDimitry Andric f128:$vTi)))]>; 14085ffd83dbSDimitry Andric def XSNMSUBQP : X_VT5_VA5_VB5_FMA <63, 484, "xsnmsubqp", 14095ffd83dbSDimitry Andric [(set f128:$vT, 14105ffd83dbSDimitry Andric (fneg (any_fma f128:$vA, f128:$vB, 14115ffd83dbSDimitry Andric (fneg f128:$vTi))))]>; 14125ffd83dbSDimitry Andric 14135ffd83dbSDimitry Andric let isCommutable = 1 in { 14145ffd83dbSDimitry Andric def XSADDQPO : X_VT5_VA5_VB5_Ro<63, 4, "xsaddqpo", 14155ffd83dbSDimitry Andric [(set f128:$vT, 14165ffd83dbSDimitry Andric (int_ppc_addf128_round_to_odd 14175ffd83dbSDimitry Andric f128:$vA, f128:$vB))]>; 14185ffd83dbSDimitry Andric def XSMULQPO : X_VT5_VA5_VB5_Ro<63, 36, "xsmulqpo", 14195ffd83dbSDimitry Andric [(set f128:$vT, 14205ffd83dbSDimitry Andric (int_ppc_mulf128_round_to_odd 14215ffd83dbSDimitry Andric f128:$vA, f128:$vB))]>; 14225ffd83dbSDimitry Andric } 14235ffd83dbSDimitry Andric def XSSUBQPO : X_VT5_VA5_VB5_Ro<63, 516, "xssubqpo", 14245ffd83dbSDimitry Andric [(set f128:$vT, 14255ffd83dbSDimitry Andric (int_ppc_subf128_round_to_odd 14265ffd83dbSDimitry Andric f128:$vA, f128:$vB))]>; 14275ffd83dbSDimitry Andric def XSDIVQPO : X_VT5_VA5_VB5_Ro<63, 548, "xsdivqpo", 14285ffd83dbSDimitry Andric [(set f128:$vT, 14295ffd83dbSDimitry Andric (int_ppc_divf128_round_to_odd 14305ffd83dbSDimitry Andric f128:$vA, f128:$vB))]>; 14315ffd83dbSDimitry Andric def XSSQRTQPO : X_VT5_XO5_VB5_Ro<63, 27, 804, "xssqrtqpo", 14325ffd83dbSDimitry Andric [(set f128:$vT, 14335ffd83dbSDimitry Andric (int_ppc_sqrtf128_round_to_odd f128:$vB))]>; 14345ffd83dbSDimitry Andric 14355ffd83dbSDimitry Andric 14365ffd83dbSDimitry Andric def XSMADDQPO : X_VT5_VA5_VB5_FMA_Ro<63, 388, "xsmaddqpo", 14375ffd83dbSDimitry Andric [(set f128:$vT, 14385ffd83dbSDimitry Andric (int_ppc_fmaf128_round_to_odd 14395ffd83dbSDimitry Andric f128:$vA,f128:$vB,f128:$vTi))]>; 14405ffd83dbSDimitry Andric 14415ffd83dbSDimitry Andric def XSMSUBQPO : X_VT5_VA5_VB5_FMA_Ro<63, 420, "xsmsubqpo" , 14425ffd83dbSDimitry Andric [(set f128:$vT, 14435ffd83dbSDimitry Andric (int_ppc_fmaf128_round_to_odd 14445ffd83dbSDimitry Andric f128:$vA, f128:$vB, (fneg f128:$vTi)))]>; 14455ffd83dbSDimitry Andric def XSNMADDQPO: X_VT5_VA5_VB5_FMA_Ro<63, 452, "xsnmaddqpo", 14465ffd83dbSDimitry Andric [(set f128:$vT, 14475ffd83dbSDimitry Andric (fneg (int_ppc_fmaf128_round_to_odd 14485ffd83dbSDimitry Andric f128:$vA, f128:$vB, f128:$vTi)))]>; 14495ffd83dbSDimitry Andric def XSNMSUBQPO: X_VT5_VA5_VB5_FMA_Ro<63, 484, "xsnmsubqpo", 14505ffd83dbSDimitry Andric [(set f128:$vT, 14515ffd83dbSDimitry Andric (fneg (int_ppc_fmaf128_round_to_odd 14525ffd83dbSDimitry Andric f128:$vA, f128:$vB, (fneg f128:$vTi))))]>; 14535ffd83dbSDimitry Andric } // mayRaiseFPException 14545ffd83dbSDimitry Andric 14555ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 14565ffd83dbSDimitry Andric // QP Compare Ordered/Unordered 14575ffd83dbSDimitry Andric let hasSideEffects = 1 in { 14585ffd83dbSDimitry Andric // DP/QP Compare Exponents 14595ffd83dbSDimitry Andric def XSCMPEXPDP : XX3Form_1<60, 59, 14605ffd83dbSDimitry Andric (outs crrc:$crD), (ins vsfrc:$XA, vsfrc:$XB), 14615ffd83dbSDimitry Andric "xscmpexpdp $crD, $XA, $XB", IIC_FPCompare, []>; 14625ffd83dbSDimitry Andric def XSCMPEXPQP : X_BF3_VA5_VB5<63, 164, "xscmpexpqp", []>; 14635ffd83dbSDimitry Andric 1464e8d8bef9SDimitry Andric let mayRaiseFPException = 1 in { 1465e8d8bef9SDimitry Andric def XSCMPOQP : X_BF3_VA5_VB5<63, 132, "xscmpoqp", []>; 1466e8d8bef9SDimitry Andric def XSCMPUQP : X_BF3_VA5_VB5<63, 644, "xscmpuqp", []>; 1467e8d8bef9SDimitry Andric 14685ffd83dbSDimitry Andric // DP Compare ==, >=, >, != 14695ffd83dbSDimitry Andric // Use vsrc for XT, because the entire register of XT is set. 14705ffd83dbSDimitry Andric // XT.dword[1] = 0x0000_0000_0000_0000 14715ffd83dbSDimitry Andric def XSCMPEQDP : XX3_XT5_XA5_XB5<60, 3, "xscmpeqdp", vsrc, vsfrc, vsfrc, 14725ffd83dbSDimitry Andric IIC_FPCompare, []>; 14735ffd83dbSDimitry Andric def XSCMPGEDP : XX3_XT5_XA5_XB5<60, 19, "xscmpgedp", vsrc, vsfrc, vsfrc, 14745ffd83dbSDimitry Andric IIC_FPCompare, []>; 14755ffd83dbSDimitry Andric def XSCMPGTDP : XX3_XT5_XA5_XB5<60, 11, "xscmpgtdp", vsrc, vsfrc, vsfrc, 14765ffd83dbSDimitry Andric IIC_FPCompare, []>; 14775ffd83dbSDimitry Andric } 1478e8d8bef9SDimitry Andric } 14795ffd83dbSDimitry Andric 14805ffd83dbSDimitry Andric //===--------------------------------------------------------------------===// 14815ffd83dbSDimitry Andric // Quad-Precision Floating-Point Conversion Instructions: 14825ffd83dbSDimitry Andric 14835ffd83dbSDimitry Andric let mayRaiseFPException = 1 in { 14845ffd83dbSDimitry Andric // Convert DP -> QP 14855ffd83dbSDimitry Andric def XSCVDPQP : X_VT5_XO5_VB5_TyVB<63, 22, 836, "xscvdpqp", vfrc, 14865ffd83dbSDimitry Andric [(set f128:$vT, (any_fpextend f64:$vB))]>; 14875ffd83dbSDimitry Andric 14885ffd83dbSDimitry Andric // Round & Convert QP -> DP (dword[1] is set to zero) 14895ffd83dbSDimitry Andric def XSCVQPDP : X_VT5_XO5_VB5_VSFR<63, 20, 836, "xscvqpdp" , []>; 14905ffd83dbSDimitry Andric def XSCVQPDPO : X_VT5_XO5_VB5_VSFR_Ro<63, 20, 836, "xscvqpdpo", 14915ffd83dbSDimitry Andric [(set f64:$vT, 14925ffd83dbSDimitry Andric (int_ppc_truncf128_round_to_odd 14935ffd83dbSDimitry Andric f128:$vB))]>; 14945ffd83dbSDimitry Andric } 14955ffd83dbSDimitry Andric 14965ffd83dbSDimitry Andric // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero) 1497e8d8bef9SDimitry Andric let mayRaiseFPException = 1 in { 14985ffd83dbSDimitry Andric def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>; 14995ffd83dbSDimitry Andric def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>; 15005ffd83dbSDimitry Andric def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>; 15015ffd83dbSDimitry Andric def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>; 15025ffd83dbSDimitry Andric } 15035ffd83dbSDimitry Andric 15045ffd83dbSDimitry Andric // Convert (Un)Signed DWord -> QP. 15055ffd83dbSDimitry Andric def XSCVSDQP : X_VT5_XO5_VB5_TyVB<63, 10, 836, "xscvsdqp", vfrc, []>; 15065ffd83dbSDimitry Andric def XSCVUDQP : X_VT5_XO5_VB5_TyVB<63, 2, 836, "xscvudqp", vfrc, []>; 15075ffd83dbSDimitry Andric 15085ffd83dbSDimitry Andric // (Round &) Convert DP <-> HP 15095ffd83dbSDimitry Andric // Note! xscvdphp's src and dest register both use the left 64 bits, so we use 15105ffd83dbSDimitry Andric // vsfrc for src and dest register. xscvhpdp's src only use the left 16 bits, 15115ffd83dbSDimitry Andric // but we still use vsfrc for it. 15125ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 1513e8d8bef9SDimitry Andric let hasSideEffects = 1, mayRaiseFPException = 1 in { 15145ffd83dbSDimitry Andric def XSCVDPHP : XX2_XT6_XO5_XB6<60, 17, 347, "xscvdphp", vsfrc, []>; 15155ffd83dbSDimitry Andric def XSCVHPDP : XX2_XT6_XO5_XB6<60, 16, 347, "xscvhpdp", vsfrc, []>; 15165ffd83dbSDimitry Andric } 15175ffd83dbSDimitry Andric 1518e8d8bef9SDimitry Andric let mayRaiseFPException = 1 in { 15195ffd83dbSDimitry Andric // Vector HP -> SP 15205ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 15215ffd83dbSDimitry Andric let hasSideEffects = 1 in 15225ffd83dbSDimitry Andric def XVCVHPSP : XX2_XT6_XO5_XB6<60, 24, 475, "xvcvhpsp", vsrc, []>; 15235ffd83dbSDimitry Andric def XVCVSPHP : XX2_XT6_XO5_XB6<60, 25, 475, "xvcvsphp", vsrc, 15245ffd83dbSDimitry Andric [(set v4f32:$XT, 15255ffd83dbSDimitry Andric (int_ppc_vsx_xvcvsphp v4f32:$XB))]>; 15265ffd83dbSDimitry Andric 15275ffd83dbSDimitry Andric // Round to Quad-Precision Integer [with Inexact] 15285ffd83dbSDimitry Andric def XSRQPI : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 0, "xsrqpi" , []>; 15295ffd83dbSDimitry Andric def XSRQPIX : Z23_VT5_R1_VB5_RMC2_EX1<63, 5, 1, "xsrqpix", []>; 15305ffd83dbSDimitry Andric 15315ffd83dbSDimitry Andric // Round Quad-Precision to Double-Extended Precision (fp80) 15325ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 15335ffd83dbSDimitry Andric let hasSideEffects = 1 in 15345ffd83dbSDimitry Andric def XSRQPXP : Z23_VT5_R1_VB5_RMC2_EX1<63, 37, 0, "xsrqpxp", []>; 1535e8d8bef9SDimitry Andric } 15365ffd83dbSDimitry Andric 15375ffd83dbSDimitry Andric //===--------------------------------------------------------------------===// 15385ffd83dbSDimitry Andric // Insert/Extract Instructions 15395ffd83dbSDimitry Andric 15405ffd83dbSDimitry Andric // Insert Exponent DP/QP 15415ffd83dbSDimitry Andric // XT NOTE: XT.dword[1] = 0xUUUU_UUUU_UUUU_UUUU 15425ffd83dbSDimitry Andric def XSIEXPDP : XX1Form <60, 918, (outs vsrc:$XT), (ins g8rc:$rA, g8rc:$rB), 15435ffd83dbSDimitry Andric "xsiexpdp $XT, $rA, $rB", IIC_VecFP, []>; 1544*fe6060f1SDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 1545*fe6060f1SDimitry Andric let hasSideEffects = 1 in { 15465ffd83dbSDimitry Andric // vB NOTE: only vB.dword[0] is used, that's why we don't use 15475ffd83dbSDimitry Andric // X_VT5_VA5_VB5 form 15485ffd83dbSDimitry Andric def XSIEXPQP : XForm_18<63, 868, (outs vrrc:$vT), (ins vrrc:$vA, vsfrc:$vB), 15495ffd83dbSDimitry Andric "xsiexpqp $vT, $vA, $vB", IIC_VecFP, []>; 15505ffd83dbSDimitry Andric } 15515ffd83dbSDimitry Andric 15525ffd83dbSDimitry Andric // Extract Exponent/Significand DP/QP 15535ffd83dbSDimitry Andric def XSXEXPDP : XX2_RT5_XO5_XB6<60, 0, 347, "xsxexpdp", []>; 15545ffd83dbSDimitry Andric def XSXSIGDP : XX2_RT5_XO5_XB6<60, 1, 347, "xsxsigdp", []>; 15555ffd83dbSDimitry Andric 1556*fe6060f1SDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 1557*fe6060f1SDimitry Andric let hasSideEffects = 1 in { 15585ffd83dbSDimitry Andric def XSXEXPQP : X_VT5_XO5_VB5 <63, 2, 804, "xsxexpqp", []>; 15595ffd83dbSDimitry Andric def XSXSIGQP : X_VT5_XO5_VB5 <63, 18, 804, "xsxsigqp", []>; 15605ffd83dbSDimitry Andric } 15615ffd83dbSDimitry Andric 15625ffd83dbSDimitry Andric // Vector Insert Word 15635ffd83dbSDimitry Andric // XB NOTE: Only XB.dword[1] is used, but we use vsrc on XB. 15645ffd83dbSDimitry Andric def XXINSERTW : 15655ffd83dbSDimitry Andric XX2_RD6_UIM5_RS6<60, 181, (outs vsrc:$XT), 15665ffd83dbSDimitry Andric (ins vsrc:$XTi, vsrc:$XB, u4imm:$UIM), 15675ffd83dbSDimitry Andric "xxinsertw $XT, $XB, $UIM", IIC_VecFP, 15685ffd83dbSDimitry Andric [(set v4i32:$XT, (PPCvecinsert v4i32:$XTi, v4i32:$XB, 15695ffd83dbSDimitry Andric imm32SExt16:$UIM))]>, 15705ffd83dbSDimitry Andric RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">; 15715ffd83dbSDimitry Andric 15725ffd83dbSDimitry Andric // Vector Extract Unsigned Word 15735ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 15745ffd83dbSDimitry Andric let hasSideEffects = 1 in 15755ffd83dbSDimitry Andric def XXEXTRACTUW : XX2_RD6_UIM5_RS6<60, 165, 15765ffd83dbSDimitry Andric (outs vsfrc:$XT), (ins vsrc:$XB, u4imm:$UIMM), 15775ffd83dbSDimitry Andric "xxextractuw $XT, $XB, $UIMM", IIC_VecFP, []>; 15785ffd83dbSDimitry Andric 15795ffd83dbSDimitry Andric // Vector Insert Exponent DP/SP 15805ffd83dbSDimitry Andric def XVIEXPDP : XX3_XT5_XA5_XB5<60, 248, "xviexpdp", vsrc, vsrc, vsrc, 15815ffd83dbSDimitry Andric IIC_VecFP, [(set v2f64: $XT,(int_ppc_vsx_xviexpdp v2i64:$XA, v2i64:$XB))]>; 15825ffd83dbSDimitry Andric def XVIEXPSP : XX3_XT5_XA5_XB5<60, 216, "xviexpsp", vsrc, vsrc, vsrc, 15835ffd83dbSDimitry Andric IIC_VecFP, [(set v4f32: $XT,(int_ppc_vsx_xviexpsp v4i32:$XA, v4i32:$XB))]>; 15845ffd83dbSDimitry Andric 15855ffd83dbSDimitry Andric // Vector Extract Exponent/Significand DP/SP 15865ffd83dbSDimitry Andric def XVXEXPDP : XX2_XT6_XO5_XB6<60, 0, 475, "xvxexpdp", vsrc, 15875ffd83dbSDimitry Andric [(set v2i64: $XT, 15885ffd83dbSDimitry Andric (int_ppc_vsx_xvxexpdp v2f64:$XB))]>; 15895ffd83dbSDimitry Andric def XVXEXPSP : XX2_XT6_XO5_XB6<60, 8, 475, "xvxexpsp", vsrc, 15905ffd83dbSDimitry Andric [(set v4i32: $XT, 15915ffd83dbSDimitry Andric (int_ppc_vsx_xvxexpsp v4f32:$XB))]>; 15925ffd83dbSDimitry Andric def XVXSIGDP : XX2_XT6_XO5_XB6<60, 1, 475, "xvxsigdp", vsrc, 15935ffd83dbSDimitry Andric [(set v2i64: $XT, 15945ffd83dbSDimitry Andric (int_ppc_vsx_xvxsigdp v2f64:$XB))]>; 15955ffd83dbSDimitry Andric def XVXSIGSP : XX2_XT6_XO5_XB6<60, 9, 475, "xvxsigsp", vsrc, 15965ffd83dbSDimitry Andric [(set v4i32: $XT, 15975ffd83dbSDimitry Andric (int_ppc_vsx_xvxsigsp v4f32:$XB))]>; 15985ffd83dbSDimitry Andric 15995ffd83dbSDimitry Andric // Test Data Class SP/DP/QP 16005ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 16015ffd83dbSDimitry Andric let hasSideEffects = 1 in { 16025ffd83dbSDimitry Andric def XSTSTDCSP : XX2_BF3_DCMX7_RS6<60, 298, 16035ffd83dbSDimitry Andric (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB), 16045ffd83dbSDimitry Andric "xststdcsp $BF, $XB, $DCMX", IIC_VecFP, []>; 16055ffd83dbSDimitry Andric def XSTSTDCDP : XX2_BF3_DCMX7_RS6<60, 362, 16065ffd83dbSDimitry Andric (outs crrc:$BF), (ins u7imm:$DCMX, vsfrc:$XB), 16075ffd83dbSDimitry Andric "xststdcdp $BF, $XB, $DCMX", IIC_VecFP, []>; 16085ffd83dbSDimitry Andric def XSTSTDCQP : X_BF3_DCMX7_RS5 <63, 708, 16095ffd83dbSDimitry Andric (outs crrc:$BF), (ins u7imm:$DCMX, vrrc:$vB), 16105ffd83dbSDimitry Andric "xststdcqp $BF, $vB, $DCMX", IIC_VecFP, []>; 16115ffd83dbSDimitry Andric } 16125ffd83dbSDimitry Andric 16135ffd83dbSDimitry Andric // Vector Test Data Class SP/DP 16145ffd83dbSDimitry Andric def XVTSTDCSP : XX2_RD6_DCMX7_RS6<60, 13, 5, 16155ffd83dbSDimitry Andric (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB), 16165ffd83dbSDimitry Andric "xvtstdcsp $XT, $XB, $DCMX", IIC_VecFP, 16175ffd83dbSDimitry Andric [(set v4i32: $XT, 16185ffd83dbSDimitry Andric (int_ppc_vsx_xvtstdcsp v4f32:$XB, timm:$DCMX))]>; 16195ffd83dbSDimitry Andric def XVTSTDCDP : XX2_RD6_DCMX7_RS6<60, 15, 5, 16205ffd83dbSDimitry Andric (outs vsrc:$XT), (ins u7imm:$DCMX, vsrc:$XB), 16215ffd83dbSDimitry Andric "xvtstdcdp $XT, $XB, $DCMX", IIC_VecFP, 16225ffd83dbSDimitry Andric [(set v2i64: $XT, 16235ffd83dbSDimitry Andric (int_ppc_vsx_xvtstdcdp v2f64:$XB, timm:$DCMX))]>; 16245ffd83dbSDimitry Andric 16255ffd83dbSDimitry Andric // Maximum/Minimum Type-C/Type-J DP 1626e8d8bef9SDimitry Andric let mayRaiseFPException = 1 in { 16275ffd83dbSDimitry Andric def XSMAXCDP : XX3_XT5_XA5_XB5<60, 128, "xsmaxcdp", vsfrc, vsfrc, vsfrc, 16285ffd83dbSDimitry Andric IIC_VecFP, 16295ffd83dbSDimitry Andric [(set f64:$XT, (PPCxsmaxc f64:$XA, f64:$XB))]>; 16305ffd83dbSDimitry Andric def XSMINCDP : XX3_XT5_XA5_XB5<60, 136, "xsmincdp", vsfrc, vsfrc, vsfrc, 16315ffd83dbSDimitry Andric IIC_VecFP, 16325ffd83dbSDimitry Andric [(set f64:$XT, (PPCxsminc f64:$XA, f64:$XB))]>; 16335ffd83dbSDimitry Andric 16345ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 16355ffd83dbSDimitry Andric let hasSideEffects = 1 in { 16365ffd83dbSDimitry Andric def XSMAXJDP : XX3_XT5_XA5_XB5<60, 144, "xsmaxjdp", vsrc, vsfrc, vsfrc, 16375ffd83dbSDimitry Andric IIC_VecFP, []>; 16385ffd83dbSDimitry Andric def XSMINJDP : XX3_XT5_XA5_XB5<60, 152, "xsminjdp", vsrc, vsfrc, vsfrc, 16395ffd83dbSDimitry Andric IIC_VecFP, []>; 16405ffd83dbSDimitry Andric } 1641e8d8bef9SDimitry Andric } 16425ffd83dbSDimitry Andric 16435ffd83dbSDimitry Andric // Vector Byte-Reverse H/W/D/Q Word 16445ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 16455ffd83dbSDimitry Andric let hasSideEffects = 1 in 16465ffd83dbSDimitry Andric def XXBRH : XX2_XT6_XO5_XB6<60, 7, 475, "xxbrh", vsrc, []>; 16475ffd83dbSDimitry Andric def XXBRW : XX2_XT6_XO5_XB6<60, 15, 475, "xxbrw", vsrc, 16485ffd83dbSDimitry Andric [(set v4i32:$XT, (bswap v4i32:$XB))]>; 16495ffd83dbSDimitry Andric def XXBRD : XX2_XT6_XO5_XB6<60, 23, 475, "xxbrd", vsrc, 16505ffd83dbSDimitry Andric [(set v2i64:$XT, (bswap v2i64:$XB))]>; 16515ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 16525ffd83dbSDimitry Andric let hasSideEffects = 1 in 16535ffd83dbSDimitry Andric def XXBRQ : XX2_XT6_XO5_XB6<60, 31, 475, "xxbrq", vsrc, []>; 16545ffd83dbSDimitry Andric 16555ffd83dbSDimitry Andric // Vector Permute 16565ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 16575ffd83dbSDimitry Andric let hasSideEffects = 1 in { 16585ffd83dbSDimitry Andric def XXPERM : XX3_XT5_XA5_XB5<60, 26, "xxperm" , vsrc, vsrc, vsrc, 16595ffd83dbSDimitry Andric IIC_VecPerm, []>; 16605ffd83dbSDimitry Andric def XXPERMR : XX3_XT5_XA5_XB5<60, 58, "xxpermr", vsrc, vsrc, vsrc, 16615ffd83dbSDimitry Andric IIC_VecPerm, []>; 16625ffd83dbSDimitry Andric } 16635ffd83dbSDimitry Andric 16645ffd83dbSDimitry Andric // Vector Splat Immediate Byte 16655ffd83dbSDimitry Andric // FIXME: Setting the hasSideEffects flag here to match current behaviour. 16665ffd83dbSDimitry Andric let hasSideEffects = 1 in 16675ffd83dbSDimitry Andric def XXSPLTIB : X_RD6_IMM8<60, 360, (outs vsrc:$XT), (ins u8imm:$IMM8), 16685ffd83dbSDimitry Andric "xxspltib $XT, $IMM8", IIC_VecPerm, []>; 16695ffd83dbSDimitry Andric 16705ffd83dbSDimitry Andric // When adding new D-Form loads/stores, be sure to update the ImmToIdxMap in 16715ffd83dbSDimitry Andric // PPCRegisterInfo::PPCRegisterInfo and maybe save yourself some debugging. 16725ffd83dbSDimitry Andric let mayLoad = 1, mayStore = 0 in { 16735ffd83dbSDimitry Andric // Load Vector 16745ffd83dbSDimitry Andric def LXV : DQ_RD6_RS5_DQ12<61, 1, (outs vsrc:$XT), (ins memrix16:$src), 16755ffd83dbSDimitry Andric "lxv $XT, $src", IIC_LdStLFD, []>; 16765ffd83dbSDimitry Andric // Load DWord 16775ffd83dbSDimitry Andric def LXSD : DSForm_1<57, 2, (outs vfrc:$vD), (ins memrix:$src), 16785ffd83dbSDimitry Andric "lxsd $vD, $src", IIC_LdStLFD, []>; 16795ffd83dbSDimitry Andric // Load SP from src, convert it to DP, and place in dword[0] 16805ffd83dbSDimitry Andric def LXSSP : DSForm_1<57, 3, (outs vfrc:$vD), (ins memrix:$src), 16815ffd83dbSDimitry Andric "lxssp $vD, $src", IIC_LdStLFD, []>; 16825ffd83dbSDimitry Andric 16835ffd83dbSDimitry Andric // Load as Integer Byte/Halfword & Zero Indexed 16845ffd83dbSDimitry Andric def LXSIBZX : X_XT6_RA5_RB5<31, 781, "lxsibzx", vsfrc, 1685*fe6060f1SDimitry Andric [(set f64:$XT, (PPClxsizx ForceXForm:$src, 1))]>; 16865ffd83dbSDimitry Andric def LXSIHZX : X_XT6_RA5_RB5<31, 813, "lxsihzx", vsfrc, 1687*fe6060f1SDimitry Andric [(set f64:$XT, (PPClxsizx ForceXForm:$src, 2))]>; 16885ffd83dbSDimitry Andric 16895ffd83dbSDimitry Andric // Load Vector Halfword*8/Byte*16 Indexed 16905ffd83dbSDimitry Andric def LXVH8X : X_XT6_RA5_RB5<31, 812, "lxvh8x" , vsrc, []>; 16915ffd83dbSDimitry Andric def LXVB16X : X_XT6_RA5_RB5<31, 876, "lxvb16x", vsrc, []>; 16925ffd83dbSDimitry Andric 16935ffd83dbSDimitry Andric // Load Vector Indexed 16945ffd83dbSDimitry Andric def LXVX : X_XT6_RA5_RB5<31, 268, "lxvx" , vsrc, 1695*fe6060f1SDimitry Andric [(set v2f64:$XT, (load XForm:$src))]>; 16965ffd83dbSDimitry Andric // Load Vector (Left-justified) with Length 16975ffd83dbSDimitry Andric def LXVL : XX1Form_memOp<31, 269, (outs vsrc:$XT), (ins memr:$src, g8rc:$rB), 16985ffd83dbSDimitry Andric "lxvl $XT, $src, $rB", IIC_LdStLoad, 16995ffd83dbSDimitry Andric [(set v4i32:$XT, (int_ppc_vsx_lxvl addr:$src, i64:$rB))]>; 17005ffd83dbSDimitry Andric def LXVLL : XX1Form_memOp<31,301, (outs vsrc:$XT), (ins memr:$src, g8rc:$rB), 17015ffd83dbSDimitry Andric "lxvll $XT, $src, $rB", IIC_LdStLoad, 17025ffd83dbSDimitry Andric [(set v4i32:$XT, (int_ppc_vsx_lxvll addr:$src, i64:$rB))]>; 17035ffd83dbSDimitry Andric 17045ffd83dbSDimitry Andric // Load Vector Word & Splat Indexed 17055ffd83dbSDimitry Andric def LXVWSX : X_XT6_RA5_RB5<31, 364, "lxvwsx" , vsrc, []>; 17065ffd83dbSDimitry Andric } // mayLoad 17075ffd83dbSDimitry Andric 17085ffd83dbSDimitry Andric // When adding new D-Form loads/stores, be sure to update the ImmToIdxMap in 17095ffd83dbSDimitry Andric // PPCRegisterInfo::PPCRegisterInfo and maybe save yourself some debugging. 17105ffd83dbSDimitry Andric let mayStore = 1, mayLoad = 0 in { 17115ffd83dbSDimitry Andric // Store Vector 17125ffd83dbSDimitry Andric def STXV : DQ_RD6_RS5_DQ12<61, 5, (outs), (ins vsrc:$XT, memrix16:$dst), 17135ffd83dbSDimitry Andric "stxv $XT, $dst", IIC_LdStSTFD, []>; 17145ffd83dbSDimitry Andric // Store DWord 17155ffd83dbSDimitry Andric def STXSD : DSForm_1<61, 2, (outs), (ins vfrc:$vS, memrix:$dst), 17165ffd83dbSDimitry Andric "stxsd $vS, $dst", IIC_LdStSTFD, []>; 17175ffd83dbSDimitry Andric // Convert DP of dword[0] to SP, and Store to dst 17185ffd83dbSDimitry Andric def STXSSP : DSForm_1<61, 3, (outs), (ins vfrc:$vS, memrix:$dst), 17195ffd83dbSDimitry Andric "stxssp $vS, $dst", IIC_LdStSTFD, []>; 17205ffd83dbSDimitry Andric 17215ffd83dbSDimitry Andric // Store as Integer Byte/Halfword Indexed 17225ffd83dbSDimitry Andric def STXSIBX : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsfrc, 1723*fe6060f1SDimitry Andric [(PPCstxsix f64:$XT, ForceXForm:$dst, 1)]>; 17245ffd83dbSDimitry Andric def STXSIHX : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsfrc, 1725*fe6060f1SDimitry Andric [(PPCstxsix f64:$XT, ForceXForm:$dst, 2)]>; 17265ffd83dbSDimitry Andric let isCodeGenOnly = 1 in { 17275ffd83dbSDimitry Andric def STXSIBXv : X_XS6_RA5_RB5<31, 909, "stxsibx" , vsrc, []>; 17285ffd83dbSDimitry Andric def STXSIHXv : X_XS6_RA5_RB5<31, 941, "stxsihx" , vsrc, []>; 17295ffd83dbSDimitry Andric } 17305ffd83dbSDimitry Andric 17315ffd83dbSDimitry Andric // Store Vector Halfword*8/Byte*16 Indexed 17325ffd83dbSDimitry Andric def STXVH8X : X_XS6_RA5_RB5<31, 940, "stxvh8x" , vsrc, []>; 17335ffd83dbSDimitry Andric def STXVB16X : X_XS6_RA5_RB5<31, 1004, "stxvb16x", vsrc, []>; 17345ffd83dbSDimitry Andric 17355ffd83dbSDimitry Andric // Store Vector Indexed 17365ffd83dbSDimitry Andric def STXVX : X_XS6_RA5_RB5<31, 396, "stxvx" , vsrc, 1737*fe6060f1SDimitry Andric [(store v2f64:$XT, XForm:$dst)]>; 17385ffd83dbSDimitry Andric 17395ffd83dbSDimitry Andric // Store Vector (Left-justified) with Length 17405ffd83dbSDimitry Andric def STXVL : XX1Form_memOp<31, 397, (outs), 17415ffd83dbSDimitry Andric (ins vsrc:$XT, memr:$dst, g8rc:$rB), 17425ffd83dbSDimitry Andric "stxvl $XT, $dst, $rB", IIC_LdStLoad, 17435ffd83dbSDimitry Andric [(int_ppc_vsx_stxvl v4i32:$XT, addr:$dst, 17445ffd83dbSDimitry Andric i64:$rB)]>; 17455ffd83dbSDimitry Andric def STXVLL : XX1Form_memOp<31, 429, (outs), 17465ffd83dbSDimitry Andric (ins vsrc:$XT, memr:$dst, g8rc:$rB), 17475ffd83dbSDimitry Andric "stxvll $XT, $dst, $rB", IIC_LdStLoad, 17485ffd83dbSDimitry Andric [(int_ppc_vsx_stxvll v4i32:$XT, addr:$dst, 17495ffd83dbSDimitry Andric i64:$rB)]>; 17505ffd83dbSDimitry Andric } // mayStore 17515ffd83dbSDimitry Andric 17525ffd83dbSDimitry Andric def DFLOADf32 : PPCPostRAExpPseudo<(outs vssrc:$XT), (ins memrix:$src), 17535ffd83dbSDimitry Andric "#DFLOADf32", 1754*fe6060f1SDimitry Andric [(set f32:$XT, (load DSForm:$src))]>; 17555ffd83dbSDimitry Andric def DFLOADf64 : PPCPostRAExpPseudo<(outs vsfrc:$XT), (ins memrix:$src), 17565ffd83dbSDimitry Andric "#DFLOADf64", 1757*fe6060f1SDimitry Andric [(set f64:$XT, (load DSForm:$src))]>; 17585ffd83dbSDimitry Andric def DFSTOREf32 : PPCPostRAExpPseudo<(outs), (ins vssrc:$XT, memrix:$dst), 17595ffd83dbSDimitry Andric "#DFSTOREf32", 1760*fe6060f1SDimitry Andric [(store f32:$XT, DSForm:$dst)]>; 17615ffd83dbSDimitry Andric def DFSTOREf64 : PPCPostRAExpPseudo<(outs), (ins vsfrc:$XT, memrix:$dst), 17625ffd83dbSDimitry Andric "#DFSTOREf64", 1763*fe6060f1SDimitry Andric [(store f64:$XT, DSForm:$dst)]>; 17645ffd83dbSDimitry Andric 17655ffd83dbSDimitry Andric let mayStore = 1 in { 17665ffd83dbSDimitry Andric def SPILLTOVSR_STX : PseudoXFormMemOp<(outs), 17675ffd83dbSDimitry Andric (ins spilltovsrrc:$XT, memrr:$dst), 17685ffd83dbSDimitry Andric "#SPILLTOVSR_STX", []>; 17695ffd83dbSDimitry Andric def SPILLTOVSR_ST : PPCPostRAExpPseudo<(outs), (ins spilltovsrrc:$XT, memrix:$dst), 17705ffd83dbSDimitry Andric "#SPILLTOVSR_ST", []>; 17715ffd83dbSDimitry Andric } 17725ffd83dbSDimitry Andric let mayLoad = 1 in { 17735ffd83dbSDimitry Andric def SPILLTOVSR_LDX : PseudoXFormMemOp<(outs spilltovsrrc:$XT), 17745ffd83dbSDimitry Andric (ins memrr:$src), 17755ffd83dbSDimitry Andric "#SPILLTOVSR_LDX", []>; 17765ffd83dbSDimitry Andric def SPILLTOVSR_LD : PPCPostRAExpPseudo<(outs spilltovsrrc:$XT), (ins memrix:$src), 17775ffd83dbSDimitry Andric "#SPILLTOVSR_LD", []>; 17785ffd83dbSDimitry Andric 17795ffd83dbSDimitry Andric } 17805ffd83dbSDimitry Andric } // HasP9Vector 17815ffd83dbSDimitry Andric} // hasSideEffects = 0 17825ffd83dbSDimitry Andric 17835ffd83dbSDimitry Andriclet PPC970_Single = 1, AddedComplexity = 400 in { 17840b57cec5SDimitry Andric 17850b57cec5SDimitry Andric def SELECT_CC_VSRC: PPCCustomInserterPseudo<(outs vsrc:$dst), 17860b57cec5SDimitry Andric (ins crrc:$cond, vsrc:$T, vsrc:$F, i32imm:$BROPC), 17870b57cec5SDimitry Andric "#SELECT_CC_VSRC", 17880b57cec5SDimitry Andric []>; 17890b57cec5SDimitry Andric def SELECT_VSRC: PPCCustomInserterPseudo<(outs vsrc:$dst), 17900b57cec5SDimitry Andric (ins crbitrc:$cond, vsrc:$T, vsrc:$F), 17910b57cec5SDimitry Andric "#SELECT_VSRC", 17920b57cec5SDimitry Andric [(set v2f64:$dst, 17930b57cec5SDimitry Andric (select i1:$cond, v2f64:$T, v2f64:$F))]>; 17940b57cec5SDimitry Andric def SELECT_CC_VSFRC: PPCCustomInserterPseudo<(outs f8rc:$dst), 17950b57cec5SDimitry Andric (ins crrc:$cond, f8rc:$T, f8rc:$F, 17960b57cec5SDimitry Andric i32imm:$BROPC), "#SELECT_CC_VSFRC", 17970b57cec5SDimitry Andric []>; 17980b57cec5SDimitry Andric def SELECT_VSFRC: PPCCustomInserterPseudo<(outs f8rc:$dst), 17990b57cec5SDimitry Andric (ins crbitrc:$cond, f8rc:$T, f8rc:$F), 18000b57cec5SDimitry Andric "#SELECT_VSFRC", 18010b57cec5SDimitry Andric [(set f64:$dst, 18020b57cec5SDimitry Andric (select i1:$cond, f64:$T, f64:$F))]>; 18030b57cec5SDimitry Andric def SELECT_CC_VSSRC: PPCCustomInserterPseudo<(outs f4rc:$dst), 18040b57cec5SDimitry Andric (ins crrc:$cond, f4rc:$T, f4rc:$F, 18050b57cec5SDimitry Andric i32imm:$BROPC), "#SELECT_CC_VSSRC", 18060b57cec5SDimitry Andric []>; 18070b57cec5SDimitry Andric def SELECT_VSSRC: PPCCustomInserterPseudo<(outs f4rc:$dst), 18080b57cec5SDimitry Andric (ins crbitrc:$cond, f4rc:$T, f4rc:$F), 18090b57cec5SDimitry Andric "#SELECT_VSSRC", 18100b57cec5SDimitry Andric [(set f32:$dst, 18110b57cec5SDimitry Andric (select i1:$cond, f32:$T, f32:$F))]>; 18120b57cec5SDimitry Andric} 18130b57cec5SDimitry Andric} 18140b57cec5SDimitry Andric 18155ffd83dbSDimitry Andric//----------------------------- DAG Definitions ------------------------------// 1816*fe6060f1SDimitry Andric 1817*fe6060f1SDimitry Andric// Output dag used to bitcast f32 to i32 and f64 to i64 1818*fe6060f1SDimitry Andricdef Bitcast { 1819*fe6060f1SDimitry Andric dag FltToInt = (i32 (MFVSRWZ (EXTRACT_SUBREG (XSCVDPSPN $A), sub_64))); 1820*fe6060f1SDimitry Andric dag DblToLong = (i64 (MFVSRD $A)); 1821*fe6060f1SDimitry Andric} 1822*fe6060f1SDimitry Andric 1823480093f4SDimitry Andricdef FpMinMax { 1824480093f4SDimitry Andric dag F32Min = (COPY_TO_REGCLASS (XSMINDP (COPY_TO_REGCLASS $A, VSFRC), 1825480093f4SDimitry Andric (COPY_TO_REGCLASS $B, VSFRC)), 1826480093f4SDimitry Andric VSSRC); 1827480093f4SDimitry Andric dag F32Max = (COPY_TO_REGCLASS (XSMAXDP (COPY_TO_REGCLASS $A, VSFRC), 1828480093f4SDimitry Andric (COPY_TO_REGCLASS $B, VSFRC)), 1829480093f4SDimitry Andric VSSRC); 1830480093f4SDimitry Andric} 1831480093f4SDimitry Andric 18320b57cec5SDimitry Andricdef ScalarLoads { 1833*fe6060f1SDimitry Andric dag Li8 = (i32 (extloadi8 ForceXForm:$src)); 1834*fe6060f1SDimitry Andric dag ZELi8 = (i32 (zextloadi8 ForceXForm:$src)); 1835*fe6060f1SDimitry Andric dag ZELi8i64 = (i64 (zextloadi8 ForceXForm:$src)); 1836*fe6060f1SDimitry Andric dag SELi8 = (i32 (sext_inreg (extloadi8 ForceXForm:$src), i8)); 1837*fe6060f1SDimitry Andric dag SELi8i64 = (i64 (sext_inreg (extloadi8 ForceXForm:$src), i8)); 18380b57cec5SDimitry Andric 1839*fe6060f1SDimitry Andric dag Li16 = (i32 (extloadi16 ForceXForm:$src)); 1840*fe6060f1SDimitry Andric dag ZELi16 = (i32 (zextloadi16 ForceXForm:$src)); 1841*fe6060f1SDimitry Andric dag ZELi16i64 = (i64 (zextloadi16 ForceXForm:$src)); 1842*fe6060f1SDimitry Andric dag SELi16 = (i32 (sextloadi16 ForceXForm:$src)); 1843*fe6060f1SDimitry Andric dag SELi16i64 = (i64 (sextloadi16 ForceXForm:$src)); 18440b57cec5SDimitry Andric 1845*fe6060f1SDimitry Andric dag Li32 = (i32 (load ForceXForm:$src)); 18460b57cec5SDimitry Andric} 18470b57cec5SDimitry Andric 18480b57cec5SDimitry Andricdef DWToSPExtractConv { 18490b57cec5SDimitry Andric dag El0US1 = (f32 (PPCfcfidus 18500b57cec5SDimitry Andric (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S1, 0)))))); 18510b57cec5SDimitry Andric dag El1US1 = (f32 (PPCfcfidus 18520b57cec5SDimitry Andric (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S1, 1)))))); 18530b57cec5SDimitry Andric dag El0US2 = (f32 (PPCfcfidus 18540b57cec5SDimitry Andric (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S2, 0)))))); 18550b57cec5SDimitry Andric dag El1US2 = (f32 (PPCfcfidus 18560b57cec5SDimitry Andric (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S2, 1)))))); 18570b57cec5SDimitry Andric dag El0SS1 = (f32 (PPCfcfids 18580b57cec5SDimitry Andric (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S1, 0)))))); 18590b57cec5SDimitry Andric dag El1SS1 = (f32 (PPCfcfids 18600b57cec5SDimitry Andric (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S1, 1)))))); 18610b57cec5SDimitry Andric dag El0SS2 = (f32 (PPCfcfids 18620b57cec5SDimitry Andric (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S2, 0)))))); 18630b57cec5SDimitry Andric dag El1SS2 = (f32 (PPCfcfids 18640b57cec5SDimitry Andric (f64 (PPCmtvsra (i64 (vector_extract v2i64:$S2, 1)))))); 18650b57cec5SDimitry Andric dag BVU = (v4f32 (build_vector El0US1, El1US1, El0US2, El1US2)); 18660b57cec5SDimitry Andric dag BVS = (v4f32 (build_vector El0SS1, El1SS1, El0SS2, El1SS2)); 18670b57cec5SDimitry Andric} 18680b57cec5SDimitry Andric 18695ffd83dbSDimitry Andricdef WToDPExtractConv { 18705ffd83dbSDimitry Andric dag El0S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 0)))); 18715ffd83dbSDimitry Andric dag El1S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 1)))); 18725ffd83dbSDimitry Andric dag El2S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 2)))); 18735ffd83dbSDimitry Andric dag El3S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 3)))); 18745ffd83dbSDimitry Andric dag El0U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 0)))); 18755ffd83dbSDimitry Andric dag El1U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 1)))); 18765ffd83dbSDimitry Andric dag El2U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 2)))); 18775ffd83dbSDimitry Andric dag El3U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 3)))); 18785ffd83dbSDimitry Andric dag BV02S = (v2f64 (build_vector El0S, El2S)); 18795ffd83dbSDimitry Andric dag BV13S = (v2f64 (build_vector El1S, El3S)); 18805ffd83dbSDimitry Andric dag BV02U = (v2f64 (build_vector El0U, El2U)); 18815ffd83dbSDimitry Andric dag BV13U = (v2f64 (build_vector El1U, El3U)); 18828bcb0991SDimitry Andric} 18838bcb0991SDimitry Andric 18840b57cec5SDimitry Andric/* Direct moves of various widths from GPR's into VSR's. Each move lines 18850b57cec5SDimitry Andric the value up into element 0 (both BE and LE). Namely, entities smaller than 18860b57cec5SDimitry Andric a doubleword are shifted left and moved for BE. For LE, they're moved, then 18870b57cec5SDimitry Andric swapped to go into the least significant element of the VSR. 18880b57cec5SDimitry Andric*/ 18890b57cec5SDimitry Andricdef MovesToVSR { 18900b57cec5SDimitry Andric dag BE_BYTE_0 = 18910b57cec5SDimitry Andric (MTVSRD 18920b57cec5SDimitry Andric (RLDICR 18930b57cec5SDimitry Andric (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 56, 7)); 18940b57cec5SDimitry Andric dag BE_HALF_0 = 18950b57cec5SDimitry Andric (MTVSRD 18960b57cec5SDimitry Andric (RLDICR 18970b57cec5SDimitry Andric (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 48, 15)); 18980b57cec5SDimitry Andric dag BE_WORD_0 = 18990b57cec5SDimitry Andric (MTVSRD 19000b57cec5SDimitry Andric (RLDICR 19010b57cec5SDimitry Andric (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32), 32, 31)); 19020b57cec5SDimitry Andric dag BE_DWORD_0 = (MTVSRD $A); 19030b57cec5SDimitry Andric 19040b57cec5SDimitry Andric dag LE_MTVSRW = (MTVSRD (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32)); 19050b57cec5SDimitry Andric dag LE_WORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), 19060b57cec5SDimitry Andric LE_MTVSRW, sub_64)); 19070b57cec5SDimitry Andric dag LE_WORD_0 = (XXPERMDI LE_WORD_1, LE_WORD_1, 2); 19080b57cec5SDimitry Andric dag LE_DWORD_1 = (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), 19090b57cec5SDimitry Andric BE_DWORD_0, sub_64)); 19100b57cec5SDimitry Andric dag LE_DWORD_0 = (XXPERMDI LE_DWORD_1, LE_DWORD_1, 2); 19110b57cec5SDimitry Andric} 19120b57cec5SDimitry Andric 19130b57cec5SDimitry Andric/* Patterns for extracting elements out of vectors. Integer elements are 19140b57cec5SDimitry Andric extracted using direct move operations. Patterns for extracting elements 19150b57cec5SDimitry Andric whose indices are not available at compile time are also provided with 19160b57cec5SDimitry Andric various _VARIABLE_ patterns. 19170b57cec5SDimitry Andric The numbering for the DAG's is for LE, but when used on BE, the correct 19180b57cec5SDimitry Andric LE element can just be used (i.e. LE_BYTE_2 == BE_BYTE_13). 19190b57cec5SDimitry Andric*/ 19200b57cec5SDimitry Andricdef VectorExtractions { 19210b57cec5SDimitry Andric // Doubleword extraction 19220b57cec5SDimitry Andric dag LE_DWORD_0 = 19230b57cec5SDimitry Andric (MFVSRD 19240b57cec5SDimitry Andric (EXTRACT_SUBREG 19250b57cec5SDimitry Andric (XXPERMDI (COPY_TO_REGCLASS $S, VSRC), 19260b57cec5SDimitry Andric (COPY_TO_REGCLASS $S, VSRC), 2), sub_64)); 19270b57cec5SDimitry Andric dag LE_DWORD_1 = (MFVSRD 19280b57cec5SDimitry Andric (EXTRACT_SUBREG 19290b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64)); 19300b57cec5SDimitry Andric 19310b57cec5SDimitry Andric // Word extraction 19320b57cec5SDimitry Andric dag LE_WORD_0 = (MFVSRWZ (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64)); 19330b57cec5SDimitry Andric dag LE_WORD_1 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 1), sub_64)); 19340b57cec5SDimitry Andric dag LE_WORD_2 = (MFVSRWZ (EXTRACT_SUBREG 19350b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS $S, VSRC)), sub_64)); 19360b57cec5SDimitry Andric dag LE_WORD_3 = (MFVSRWZ (EXTRACT_SUBREG (XXSLDWI $S, $S, 3), sub_64)); 19370b57cec5SDimitry Andric 19380b57cec5SDimitry Andric // Halfword extraction 19390b57cec5SDimitry Andric dag LE_HALF_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 48), sub_32)); 19400b57cec5SDimitry Andric dag LE_HALF_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 48), sub_32)); 19410b57cec5SDimitry Andric dag LE_HALF_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 48), sub_32)); 19420b57cec5SDimitry Andric dag LE_HALF_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 48), sub_32)); 19430b57cec5SDimitry Andric dag LE_HALF_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 48), sub_32)); 19440b57cec5SDimitry Andric dag LE_HALF_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 48), sub_32)); 19450b57cec5SDimitry Andric dag LE_HALF_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 48), sub_32)); 19460b57cec5SDimitry Andric dag LE_HALF_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 48), sub_32)); 19470b57cec5SDimitry Andric 19480b57cec5SDimitry Andric // Byte extraction 19490b57cec5SDimitry Andric dag LE_BYTE_0 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 0, 56), sub_32)); 19500b57cec5SDimitry Andric dag LE_BYTE_1 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 56, 56), sub_32)); 19510b57cec5SDimitry Andric dag LE_BYTE_2 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 48, 56), sub_32)); 19520b57cec5SDimitry Andric dag LE_BYTE_3 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 40, 56), sub_32)); 19530b57cec5SDimitry Andric dag LE_BYTE_4 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 32, 56), sub_32)); 19540b57cec5SDimitry Andric dag LE_BYTE_5 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 24, 56), sub_32)); 19550b57cec5SDimitry Andric dag LE_BYTE_6 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 16, 56), sub_32)); 19560b57cec5SDimitry Andric dag LE_BYTE_7 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_0, 8, 56), sub_32)); 19570b57cec5SDimitry Andric dag LE_BYTE_8 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 0, 56), sub_32)); 19580b57cec5SDimitry Andric dag LE_BYTE_9 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 56, 56), sub_32)); 19590b57cec5SDimitry Andric dag LE_BYTE_10 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 48, 56), sub_32)); 19600b57cec5SDimitry Andric dag LE_BYTE_11 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 40, 56), sub_32)); 19610b57cec5SDimitry Andric dag LE_BYTE_12 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 32, 56), sub_32)); 19620b57cec5SDimitry Andric dag LE_BYTE_13 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 24, 56), sub_32)); 19630b57cec5SDimitry Andric dag LE_BYTE_14 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 16, 56), sub_32)); 19640b57cec5SDimitry Andric dag LE_BYTE_15 = (i32 (EXTRACT_SUBREG (RLDICL LE_DWORD_1, 8, 56), sub_32)); 19650b57cec5SDimitry Andric 19660b57cec5SDimitry Andric /* Variable element number (BE and LE patterns must be specified separately) 19670b57cec5SDimitry Andric This is a rather involved process. 19680b57cec5SDimitry Andric 19690b57cec5SDimitry Andric Conceptually, this is how the move is accomplished: 19700b57cec5SDimitry Andric 1. Identify which doubleword contains the element 19710b57cec5SDimitry Andric 2. Shift in the VMX register so that the correct doubleword is correctly 19720b57cec5SDimitry Andric lined up for the MFVSRD 19730b57cec5SDimitry Andric 3. Perform the move so that the element (along with some extra stuff) 19740b57cec5SDimitry Andric is in the GPR 19750b57cec5SDimitry Andric 4. Right shift within the GPR so that the element is right-justified 19760b57cec5SDimitry Andric 19770b57cec5SDimitry Andric Of course, the index is an element number which has a different meaning 19780b57cec5SDimitry Andric on LE/BE so the patterns have to be specified separately. 19790b57cec5SDimitry Andric 19800b57cec5SDimitry Andric Note: The final result will be the element right-justified with high 19810b57cec5SDimitry Andric order bits being arbitrarily defined (namely, whatever was in the 19820b57cec5SDimitry Andric vector register to the left of the value originally). 19830b57cec5SDimitry Andric */ 19840b57cec5SDimitry Andric 19850b57cec5SDimitry Andric /* LE variable byte 19860b57cec5SDimitry Andric Number 1. above: 19870b57cec5SDimitry Andric - For elements 0-7, we shift left by 8 bytes since they're on the right 19880b57cec5SDimitry Andric - For elements 8-15, we need not shift (shift left by zero bytes) 19890b57cec5SDimitry Andric This is accomplished by inverting the bits of the index and AND-ing 19900b57cec5SDimitry Andric with 0x8 (i.e. clearing all bits of the index and inverting bit 60). 19910b57cec5SDimitry Andric */ 19920b57cec5SDimitry Andric dag LE_VBYTE_PERM_VEC = (v16i8 (LVSL ZERO8, (ANDC8 (LI8 8), $Idx))); 19930b57cec5SDimitry Andric 19940b57cec5SDimitry Andric // Number 2. above: 19950b57cec5SDimitry Andric // - Now that we set up the shift amount, we shift in the VMX register 19960b57cec5SDimitry Andric dag LE_VBYTE_PERMUTE = (v16i8 (VPERM $S, $S, LE_VBYTE_PERM_VEC)); 19970b57cec5SDimitry Andric 19980b57cec5SDimitry Andric // Number 3. above: 19990b57cec5SDimitry Andric // - The doubleword containing our element is moved to a GPR 20000b57cec5SDimitry Andric dag LE_MV_VBYTE = (MFVSRD 20010b57cec5SDimitry Andric (EXTRACT_SUBREG 20020b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS LE_VBYTE_PERMUTE, VSRC)), 20030b57cec5SDimitry Andric sub_64)); 20040b57cec5SDimitry Andric 20050b57cec5SDimitry Andric /* Number 4. above: 20060b57cec5SDimitry Andric - Truncate the element number to the range 0-7 (8-15 are symmetrical 20070b57cec5SDimitry Andric and out of range values are truncated accordingly) 20080b57cec5SDimitry Andric - Multiply by 8 as we need to shift right by the number of bits, not bytes 20090b57cec5SDimitry Andric - Shift right in the GPR by the calculated value 20100b57cec5SDimitry Andric */ 20110b57cec5SDimitry Andric dag LE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 7), $Idx), 3, 60), 20120b57cec5SDimitry Andric sub_32); 20130b57cec5SDimitry Andric dag LE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD LE_MV_VBYTE, LE_VBYTE_SHIFT), 20140b57cec5SDimitry Andric sub_32); 20150b57cec5SDimitry Andric 20160b57cec5SDimitry Andric /* LE variable halfword 20170b57cec5SDimitry Andric Number 1. above: 20180b57cec5SDimitry Andric - For elements 0-3, we shift left by 8 since they're on the right 20190b57cec5SDimitry Andric - For elements 4-7, we need not shift (shift left by zero bytes) 20200b57cec5SDimitry Andric Similarly to the byte pattern, we invert the bits of the index, but we 20210b57cec5SDimitry Andric AND with 0x4 (i.e. clear all bits of the index and invert bit 61). 20220b57cec5SDimitry Andric Of course, the shift is still by 8 bytes, so we must multiply by 2. 20230b57cec5SDimitry Andric */ 20240b57cec5SDimitry Andric dag LE_VHALF_PERM_VEC = 20250b57cec5SDimitry Andric (v16i8 (LVSL ZERO8, (RLDICR (ANDC8 (LI8 4), $Idx), 1, 62))); 20260b57cec5SDimitry Andric 20270b57cec5SDimitry Andric // Number 2. above: 20280b57cec5SDimitry Andric // - Now that we set up the shift amount, we shift in the VMX register 20290b57cec5SDimitry Andric dag LE_VHALF_PERMUTE = (v16i8 (VPERM $S, $S, LE_VHALF_PERM_VEC)); 20300b57cec5SDimitry Andric 20310b57cec5SDimitry Andric // Number 3. above: 20320b57cec5SDimitry Andric // - The doubleword containing our element is moved to a GPR 20330b57cec5SDimitry Andric dag LE_MV_VHALF = (MFVSRD 20340b57cec5SDimitry Andric (EXTRACT_SUBREG 20350b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS LE_VHALF_PERMUTE, VSRC)), 20360b57cec5SDimitry Andric sub_64)); 20370b57cec5SDimitry Andric 20380b57cec5SDimitry Andric /* Number 4. above: 20390b57cec5SDimitry Andric - Truncate the element number to the range 0-3 (4-7 are symmetrical 20400b57cec5SDimitry Andric and out of range values are truncated accordingly) 20410b57cec5SDimitry Andric - Multiply by 16 as we need to shift right by the number of bits 20420b57cec5SDimitry Andric - Shift right in the GPR by the calculated value 20430b57cec5SDimitry Andric */ 20440b57cec5SDimitry Andric dag LE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 3), $Idx), 4, 59), 20450b57cec5SDimitry Andric sub_32); 20460b57cec5SDimitry Andric dag LE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD LE_MV_VHALF, LE_VHALF_SHIFT), 20470b57cec5SDimitry Andric sub_32); 20480b57cec5SDimitry Andric 20490b57cec5SDimitry Andric /* LE variable word 20500b57cec5SDimitry Andric Number 1. above: 20510b57cec5SDimitry Andric - For elements 0-1, we shift left by 8 since they're on the right 20520b57cec5SDimitry Andric - For elements 2-3, we need not shift 20530b57cec5SDimitry Andric */ 20540b57cec5SDimitry Andric dag LE_VWORD_PERM_VEC = (v16i8 (LVSL ZERO8, 20550b57cec5SDimitry Andric (RLDICR (ANDC8 (LI8 2), $Idx), 2, 61))); 20560b57cec5SDimitry Andric 20570b57cec5SDimitry Andric // Number 2. above: 20580b57cec5SDimitry Andric // - Now that we set up the shift amount, we shift in the VMX register 20590b57cec5SDimitry Andric dag LE_VWORD_PERMUTE = (v16i8 (VPERM $S, $S, LE_VWORD_PERM_VEC)); 20600b57cec5SDimitry Andric 20610b57cec5SDimitry Andric // Number 3. above: 20620b57cec5SDimitry Andric // - The doubleword containing our element is moved to a GPR 20630b57cec5SDimitry Andric dag LE_MV_VWORD = (MFVSRD 20640b57cec5SDimitry Andric (EXTRACT_SUBREG 20650b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS LE_VWORD_PERMUTE, VSRC)), 20660b57cec5SDimitry Andric sub_64)); 20670b57cec5SDimitry Andric 20680b57cec5SDimitry Andric /* Number 4. above: 20690b57cec5SDimitry Andric - Truncate the element number to the range 0-1 (2-3 are symmetrical 20700b57cec5SDimitry Andric and out of range values are truncated accordingly) 20710b57cec5SDimitry Andric - Multiply by 32 as we need to shift right by the number of bits 20720b57cec5SDimitry Andric - Shift right in the GPR by the calculated value 20730b57cec5SDimitry Andric */ 20740b57cec5SDimitry Andric dag LE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (AND8 (LI8 1), $Idx), 5, 58), 20750b57cec5SDimitry Andric sub_32); 20760b57cec5SDimitry Andric dag LE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD LE_MV_VWORD, LE_VWORD_SHIFT), 20770b57cec5SDimitry Andric sub_32); 20780b57cec5SDimitry Andric 20790b57cec5SDimitry Andric /* LE variable doubleword 20800b57cec5SDimitry Andric Number 1. above: 20810b57cec5SDimitry Andric - For element 0, we shift left by 8 since it's on the right 20820b57cec5SDimitry Andric - For element 1, we need not shift 20830b57cec5SDimitry Andric */ 20840b57cec5SDimitry Andric dag LE_VDWORD_PERM_VEC = (v16i8 (LVSL ZERO8, 20850b57cec5SDimitry Andric (RLDICR (ANDC8 (LI8 1), $Idx), 3, 60))); 20860b57cec5SDimitry Andric 20870b57cec5SDimitry Andric // Number 2. above: 20880b57cec5SDimitry Andric // - Now that we set up the shift amount, we shift in the VMX register 20890b57cec5SDimitry Andric dag LE_VDWORD_PERMUTE = (v16i8 (VPERM $S, $S, LE_VDWORD_PERM_VEC)); 20900b57cec5SDimitry Andric 20910b57cec5SDimitry Andric // Number 3. above: 20920b57cec5SDimitry Andric // - The doubleword containing our element is moved to a GPR 20930b57cec5SDimitry Andric // - Number 4. is not needed for the doubleword as the value is 64-bits 20940b57cec5SDimitry Andric dag LE_VARIABLE_DWORD = 20950b57cec5SDimitry Andric (MFVSRD (EXTRACT_SUBREG 20960b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS LE_VDWORD_PERMUTE, VSRC)), 20970b57cec5SDimitry Andric sub_64)); 20980b57cec5SDimitry Andric 20990b57cec5SDimitry Andric /* LE variable float 21000b57cec5SDimitry Andric - Shift the vector to line up the desired element to BE Word 0 21010b57cec5SDimitry Andric - Convert 32-bit float to a 64-bit single precision float 21020b57cec5SDimitry Andric */ 21030b57cec5SDimitry Andric dag LE_VFLOAT_PERM_VEC = (v16i8 (LVSL ZERO8, 21040b57cec5SDimitry Andric (RLDICR (XOR8 (LI8 3), $Idx), 2, 61))); 21050b57cec5SDimitry Andric dag LE_VFLOAT_PERMUTE = (VPERM $S, $S, LE_VFLOAT_PERM_VEC); 21060b57cec5SDimitry Andric dag LE_VARIABLE_FLOAT = (XSCVSPDPN LE_VFLOAT_PERMUTE); 21070b57cec5SDimitry Andric 21080b57cec5SDimitry Andric /* LE variable double 21090b57cec5SDimitry Andric Same as the LE doubleword except there is no move. 21100b57cec5SDimitry Andric */ 21110b57cec5SDimitry Andric dag LE_VDOUBLE_PERMUTE = (v16i8 (VPERM (v16i8 (COPY_TO_REGCLASS $S, VRRC)), 21120b57cec5SDimitry Andric (v16i8 (COPY_TO_REGCLASS $S, VRRC)), 21130b57cec5SDimitry Andric LE_VDWORD_PERM_VEC)); 21140b57cec5SDimitry Andric dag LE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS LE_VDOUBLE_PERMUTE, VSRC); 21150b57cec5SDimitry Andric 21160b57cec5SDimitry Andric /* BE variable byte 21170b57cec5SDimitry Andric The algorithm here is the same as the LE variable byte except: 21180b57cec5SDimitry Andric - The shift in the VMX register is by 0/8 for opposite element numbers so 21190b57cec5SDimitry Andric we simply AND the element number with 0x8 21200b57cec5SDimitry Andric - The order of elements after the move to GPR is reversed, so we invert 21210b57cec5SDimitry Andric the bits of the index prior to truncating to the range 0-7 21220b57cec5SDimitry Andric */ 2123480093f4SDimitry Andric dag BE_VBYTE_PERM_VEC = (v16i8 (LVSL ZERO8, (ANDI8_rec $Idx, 8))); 21240b57cec5SDimitry Andric dag BE_VBYTE_PERMUTE = (v16i8 (VPERM $S, $S, BE_VBYTE_PERM_VEC)); 21250b57cec5SDimitry Andric dag BE_MV_VBYTE = (MFVSRD 21260b57cec5SDimitry Andric (EXTRACT_SUBREG 21270b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS BE_VBYTE_PERMUTE, VSRC)), 21280b57cec5SDimitry Andric sub_64)); 21290b57cec5SDimitry Andric dag BE_VBYTE_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 7), $Idx), 3, 60), 21300b57cec5SDimitry Andric sub_32); 21310b57cec5SDimitry Andric dag BE_VARIABLE_BYTE = (EXTRACT_SUBREG (SRD BE_MV_VBYTE, BE_VBYTE_SHIFT), 21320b57cec5SDimitry Andric sub_32); 21330b57cec5SDimitry Andric 21340b57cec5SDimitry Andric /* BE variable halfword 21350b57cec5SDimitry Andric The algorithm here is the same as the LE variable halfword except: 21360b57cec5SDimitry Andric - The shift in the VMX register is by 0/8 for opposite element numbers so 21370b57cec5SDimitry Andric we simply AND the element number with 0x4 and multiply by 2 21380b57cec5SDimitry Andric - The order of elements after the move to GPR is reversed, so we invert 21390b57cec5SDimitry Andric the bits of the index prior to truncating to the range 0-3 21400b57cec5SDimitry Andric */ 21410b57cec5SDimitry Andric dag BE_VHALF_PERM_VEC = (v16i8 (LVSL ZERO8, 2142480093f4SDimitry Andric (RLDICR (ANDI8_rec $Idx, 4), 1, 62))); 21430b57cec5SDimitry Andric dag BE_VHALF_PERMUTE = (v16i8 (VPERM $S, $S, BE_VHALF_PERM_VEC)); 21440b57cec5SDimitry Andric dag BE_MV_VHALF = (MFVSRD 21450b57cec5SDimitry Andric (EXTRACT_SUBREG 21460b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS BE_VHALF_PERMUTE, VSRC)), 21470b57cec5SDimitry Andric sub_64)); 21480b57cec5SDimitry Andric dag BE_VHALF_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 3), $Idx), 4, 59), 21490b57cec5SDimitry Andric sub_32); 21500b57cec5SDimitry Andric dag BE_VARIABLE_HALF = (EXTRACT_SUBREG (SRD BE_MV_VHALF, BE_VHALF_SHIFT), 21510b57cec5SDimitry Andric sub_32); 21520b57cec5SDimitry Andric 21530b57cec5SDimitry Andric /* BE variable word 21540b57cec5SDimitry Andric The algorithm is the same as the LE variable word except: 21550b57cec5SDimitry Andric - The shift in the VMX register happens for opposite element numbers 21560b57cec5SDimitry Andric - The order of elements after the move to GPR is reversed, so we invert 21570b57cec5SDimitry Andric the bits of the index prior to truncating to the range 0-1 21580b57cec5SDimitry Andric */ 21590b57cec5SDimitry Andric dag BE_VWORD_PERM_VEC = (v16i8 (LVSL ZERO8, 2160480093f4SDimitry Andric (RLDICR (ANDI8_rec $Idx, 2), 2, 61))); 21610b57cec5SDimitry Andric dag BE_VWORD_PERMUTE = (v16i8 (VPERM $S, $S, BE_VWORD_PERM_VEC)); 21620b57cec5SDimitry Andric dag BE_MV_VWORD = (MFVSRD 21630b57cec5SDimitry Andric (EXTRACT_SUBREG 21640b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS BE_VWORD_PERMUTE, VSRC)), 21650b57cec5SDimitry Andric sub_64)); 21660b57cec5SDimitry Andric dag BE_VWORD_SHIFT = (EXTRACT_SUBREG (RLDICR (ANDC8 (LI8 1), $Idx), 5, 58), 21670b57cec5SDimitry Andric sub_32); 21680b57cec5SDimitry Andric dag BE_VARIABLE_WORD = (EXTRACT_SUBREG (SRD BE_MV_VWORD, BE_VWORD_SHIFT), 21690b57cec5SDimitry Andric sub_32); 21700b57cec5SDimitry Andric 21710b57cec5SDimitry Andric /* BE variable doubleword 21720b57cec5SDimitry Andric Same as the LE doubleword except we shift in the VMX register for opposite 21730b57cec5SDimitry Andric element indices. 21740b57cec5SDimitry Andric */ 21750b57cec5SDimitry Andric dag BE_VDWORD_PERM_VEC = (v16i8 (LVSL ZERO8, 2176480093f4SDimitry Andric (RLDICR (ANDI8_rec $Idx, 1), 3, 60))); 21770b57cec5SDimitry Andric dag BE_VDWORD_PERMUTE = (v16i8 (VPERM $S, $S, BE_VDWORD_PERM_VEC)); 21780b57cec5SDimitry Andric dag BE_VARIABLE_DWORD = 21790b57cec5SDimitry Andric (MFVSRD (EXTRACT_SUBREG 21800b57cec5SDimitry Andric (v2i64 (COPY_TO_REGCLASS BE_VDWORD_PERMUTE, VSRC)), 21810b57cec5SDimitry Andric sub_64)); 21820b57cec5SDimitry Andric 21830b57cec5SDimitry Andric /* BE variable float 21840b57cec5SDimitry Andric - Shift the vector to line up the desired element to BE Word 0 21850b57cec5SDimitry Andric - Convert 32-bit float to a 64-bit single precision float 21860b57cec5SDimitry Andric */ 21870b57cec5SDimitry Andric dag BE_VFLOAT_PERM_VEC = (v16i8 (LVSL ZERO8, (RLDICR $Idx, 2, 61))); 21880b57cec5SDimitry Andric dag BE_VFLOAT_PERMUTE = (VPERM $S, $S, BE_VFLOAT_PERM_VEC); 21890b57cec5SDimitry Andric dag BE_VARIABLE_FLOAT = (XSCVSPDPN BE_VFLOAT_PERMUTE); 21900b57cec5SDimitry Andric 2191*fe6060f1SDimitry Andric // BE variable float 32-bit version 2192*fe6060f1SDimitry Andric dag BE_32B_VFLOAT_PERM_VEC = (v16i8 (LVSL (i32 ZERO), (RLWINM $Idx, 2, 0, 29))); 2193*fe6060f1SDimitry Andric dag BE_32B_VFLOAT_PERMUTE = (VPERM $S, $S, BE_32B_VFLOAT_PERM_VEC); 2194*fe6060f1SDimitry Andric dag BE_32B_VARIABLE_FLOAT = (XSCVSPDPN BE_32B_VFLOAT_PERMUTE); 2195*fe6060f1SDimitry Andric 21960b57cec5SDimitry Andric /* BE variable double 21970b57cec5SDimitry Andric Same as the BE doubleword except there is no move. 21980b57cec5SDimitry Andric */ 21990b57cec5SDimitry Andric dag BE_VDOUBLE_PERMUTE = (v16i8 (VPERM (v16i8 (COPY_TO_REGCLASS $S, VRRC)), 22000b57cec5SDimitry Andric (v16i8 (COPY_TO_REGCLASS $S, VRRC)), 22010b57cec5SDimitry Andric BE_VDWORD_PERM_VEC)); 22020b57cec5SDimitry Andric dag BE_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_VDOUBLE_PERMUTE, VSRC); 2203*fe6060f1SDimitry Andric 2204*fe6060f1SDimitry Andric // BE variable double 32-bit version 2205*fe6060f1SDimitry Andric dag BE_32B_VDWORD_PERM_VEC = (v16i8 (LVSL (i32 ZERO), 2206*fe6060f1SDimitry Andric (RLWINM (ANDI_rec $Idx, 1), 3, 0, 28))); 2207*fe6060f1SDimitry Andric dag BE_32B_VDOUBLE_PERMUTE = (v16i8 (VPERM (v16i8 (COPY_TO_REGCLASS $S, VRRC)), 2208*fe6060f1SDimitry Andric (v16i8 (COPY_TO_REGCLASS $S, VRRC)), 2209*fe6060f1SDimitry Andric BE_32B_VDWORD_PERM_VEC)); 2210*fe6060f1SDimitry Andric dag BE_32B_VARIABLE_DOUBLE = (COPY_TO_REGCLASS BE_32B_VDOUBLE_PERMUTE, VSRC); 22110b57cec5SDimitry Andric} 22120b57cec5SDimitry Andric 22130b57cec5SDimitry Andricdef AlignValues { 2214*fe6060f1SDimitry Andric dag F32_TO_BE_WORD1 = (v4f32 (XSCVDPSPN $B)); 2215*fe6060f1SDimitry Andric dag I32_TO_BE_WORD1 = (SUBREG_TO_REG (i64 1), (MTVSRWZ $B), sub_64); 22160b57cec5SDimitry Andric} 22170b57cec5SDimitry Andric 22180b57cec5SDimitry Andric// Integer extend helper dags 32 -> 64 22190b57cec5SDimitry Andricdef AnyExts { 22200b57cec5SDimitry Andric dag A = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $A, sub_32); 22210b57cec5SDimitry Andric dag B = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $B, sub_32); 22220b57cec5SDimitry Andric dag C = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $C, sub_32); 22230b57cec5SDimitry Andric dag D = (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $D, sub_32); 22240b57cec5SDimitry Andric} 22250b57cec5SDimitry Andric 22260b57cec5SDimitry Andricdef DblToFlt { 22275ffd83dbSDimitry Andric dag A0 = (f32 (any_fpround (f64 (extractelt v2f64:$A, 0)))); 22285ffd83dbSDimitry Andric dag A1 = (f32 (any_fpround (f64 (extractelt v2f64:$A, 1)))); 22295ffd83dbSDimitry Andric dag B0 = (f32 (any_fpround (f64 (extractelt v2f64:$B, 0)))); 22305ffd83dbSDimitry Andric dag B1 = (f32 (any_fpround (f64 (extractelt v2f64:$B, 1)))); 22310b57cec5SDimitry Andric} 22320b57cec5SDimitry Andric 22330b57cec5SDimitry Andricdef ExtDbl { 22340b57cec5SDimitry Andric dag A0S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$A, 0)))))); 22350b57cec5SDimitry Andric dag A1S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$A, 1)))))); 22360b57cec5SDimitry Andric dag B0S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$B, 0)))))); 22370b57cec5SDimitry Andric dag B1S = (i32 (PPCmfvsr (f64 (PPCfctiwz (f64 (extractelt v2f64:$B, 1)))))); 22380b57cec5SDimitry Andric dag A0U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$A, 0)))))); 22390b57cec5SDimitry Andric dag A1U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$A, 1)))))); 22400b57cec5SDimitry Andric dag B0U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$B, 0)))))); 22410b57cec5SDimitry Andric dag B1U = (i32 (PPCmfvsr (f64 (PPCfctiwuz (f64 (extractelt v2f64:$B, 1)))))); 22420b57cec5SDimitry Andric} 22430b57cec5SDimitry Andric 22440b57cec5SDimitry Andricdef ByteToWord { 22450b57cec5SDimitry Andric dag LE_A0 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 0)), i8)); 22460b57cec5SDimitry Andric dag LE_A1 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 4)), i8)); 22470b57cec5SDimitry Andric dag LE_A2 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 8)), i8)); 22480b57cec5SDimitry Andric dag LE_A3 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 12)), i8)); 22490b57cec5SDimitry Andric dag BE_A0 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 3)), i8)); 22500b57cec5SDimitry Andric dag BE_A1 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 7)), i8)); 22510b57cec5SDimitry Andric dag BE_A2 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 11)), i8)); 22520b57cec5SDimitry Andric dag BE_A3 = (i32 (sext_inreg (i32 (vector_extract v16i8:$A, 15)), i8)); 22530b57cec5SDimitry Andric} 22540b57cec5SDimitry Andric 22550b57cec5SDimitry Andricdef ByteToDWord { 22560b57cec5SDimitry Andric dag LE_A0 = (i64 (sext_inreg 22570b57cec5SDimitry Andric (i64 (anyext (i32 (vector_extract v16i8:$A, 0)))), i8)); 22580b57cec5SDimitry Andric dag LE_A1 = (i64 (sext_inreg 22590b57cec5SDimitry Andric (i64 (anyext (i32 (vector_extract v16i8:$A, 8)))), i8)); 22600b57cec5SDimitry Andric dag BE_A0 = (i64 (sext_inreg 22610b57cec5SDimitry Andric (i64 (anyext (i32 (vector_extract v16i8:$A, 7)))), i8)); 22620b57cec5SDimitry Andric dag BE_A1 = (i64 (sext_inreg 22630b57cec5SDimitry Andric (i64 (anyext (i32 (vector_extract v16i8:$A, 15)))), i8)); 22640b57cec5SDimitry Andric} 22650b57cec5SDimitry Andric 22660b57cec5SDimitry Andricdef HWordToWord { 22670b57cec5SDimitry Andric dag LE_A0 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 0)), i16)); 22680b57cec5SDimitry Andric dag LE_A1 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 2)), i16)); 22690b57cec5SDimitry Andric dag LE_A2 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 4)), i16)); 22700b57cec5SDimitry Andric dag LE_A3 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 6)), i16)); 22710b57cec5SDimitry Andric dag BE_A0 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 1)), i16)); 22720b57cec5SDimitry Andric dag BE_A1 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 3)), i16)); 22730b57cec5SDimitry Andric dag BE_A2 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 5)), i16)); 22740b57cec5SDimitry Andric dag BE_A3 = (i32 (sext_inreg (i32 (vector_extract v8i16:$A, 7)), i16)); 22750b57cec5SDimitry Andric} 22760b57cec5SDimitry Andric 22770b57cec5SDimitry Andricdef HWordToDWord { 22780b57cec5SDimitry Andric dag LE_A0 = (i64 (sext_inreg 22790b57cec5SDimitry Andric (i64 (anyext (i32 (vector_extract v8i16:$A, 0)))), i16)); 22800b57cec5SDimitry Andric dag LE_A1 = (i64 (sext_inreg 22810b57cec5SDimitry Andric (i64 (anyext (i32 (vector_extract v8i16:$A, 4)))), i16)); 22820b57cec5SDimitry Andric dag BE_A0 = (i64 (sext_inreg 22830b57cec5SDimitry Andric (i64 (anyext (i32 (vector_extract v8i16:$A, 3)))), i16)); 22840b57cec5SDimitry Andric dag BE_A1 = (i64 (sext_inreg 22850b57cec5SDimitry Andric (i64 (anyext (i32 (vector_extract v8i16:$A, 7)))), i16)); 22860b57cec5SDimitry Andric} 22870b57cec5SDimitry Andric 22880b57cec5SDimitry Andricdef WordToDWord { 22890b57cec5SDimitry Andric dag LE_A0 = (i64 (sext (i32 (vector_extract v4i32:$A, 0)))); 22900b57cec5SDimitry Andric dag LE_A1 = (i64 (sext (i32 (vector_extract v4i32:$A, 2)))); 22910b57cec5SDimitry Andric dag BE_A0 = (i64 (sext (i32 (vector_extract v4i32:$A, 1)))); 22920b57cec5SDimitry Andric dag BE_A1 = (i64 (sext (i32 (vector_extract v4i32:$A, 3)))); 22930b57cec5SDimitry Andric} 22940b57cec5SDimitry Andric 22950b57cec5SDimitry Andricdef FltToIntLoad { 2296*fe6060f1SDimitry Andric dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (extloadf32 ForceXForm:$A))))); 22970b57cec5SDimitry Andric} 22980b57cec5SDimitry Andricdef FltToUIntLoad { 2299*fe6060f1SDimitry Andric dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (extloadf32 ForceXForm:$A))))); 23000b57cec5SDimitry Andric} 23010b57cec5SDimitry Andricdef FltToLongLoad { 2302*fe6060f1SDimitry Andric dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (extloadf32 ForceXForm:$A))))); 23030b57cec5SDimitry Andric} 23040b57cec5SDimitry Andricdef FltToLongLoadP9 { 2305*fe6060f1SDimitry Andric dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (extloadf32 DSForm:$A))))); 23060b57cec5SDimitry Andric} 23070b57cec5SDimitry Andricdef FltToULongLoad { 2308*fe6060f1SDimitry Andric dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (extloadf32 ForceXForm:$A))))); 23090b57cec5SDimitry Andric} 23100b57cec5SDimitry Andricdef FltToULongLoadP9 { 2311*fe6060f1SDimitry Andric dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (extloadf32 DSForm:$A))))); 23120b57cec5SDimitry Andric} 23130b57cec5SDimitry Andricdef FltToLong { 23140b57cec5SDimitry Andric dag A = (i64 (PPCmfvsr (f64 (PPCfctidz (fpextend f32:$A))))); 23150b57cec5SDimitry Andric} 23160b57cec5SDimitry Andricdef FltToULong { 23170b57cec5SDimitry Andric dag A = (i64 (PPCmfvsr (f64 (PPCfctiduz (fpextend f32:$A))))); 23180b57cec5SDimitry Andric} 23190b57cec5SDimitry Andricdef DblToInt { 23200b57cec5SDimitry Andric dag A = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$A)))); 23210b57cec5SDimitry Andric dag B = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$B)))); 23220b57cec5SDimitry Andric dag C = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$C)))); 23230b57cec5SDimitry Andric dag D = (i32 (PPCmfvsr (f64 (PPCfctiwz f64:$D)))); 23240b57cec5SDimitry Andric} 23250b57cec5SDimitry Andricdef DblToUInt { 23260b57cec5SDimitry Andric dag A = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$A)))); 23270b57cec5SDimitry Andric dag B = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$B)))); 23280b57cec5SDimitry Andric dag C = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$C)))); 23290b57cec5SDimitry Andric dag D = (i32 (PPCmfvsr (f64 (PPCfctiwuz f64:$D)))); 23300b57cec5SDimitry Andric} 23310b57cec5SDimitry Andricdef DblToLong { 23320b57cec5SDimitry Andric dag A = (i64 (PPCmfvsr (f64 (PPCfctidz f64:$A)))); 23330b57cec5SDimitry Andric} 23340b57cec5SDimitry Andricdef DblToULong { 23350b57cec5SDimitry Andric dag A = (i64 (PPCmfvsr (f64 (PPCfctiduz f64:$A)))); 23360b57cec5SDimitry Andric} 23370b57cec5SDimitry Andricdef DblToIntLoad { 2338*fe6060f1SDimitry Andric dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (load ForceXForm:$A))))); 23390b57cec5SDimitry Andric} 23400b57cec5SDimitry Andricdef DblToIntLoadP9 { 2341*fe6060f1SDimitry Andric dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (load DSForm:$A))))); 23420b57cec5SDimitry Andric} 23430b57cec5SDimitry Andricdef DblToUIntLoad { 2344*fe6060f1SDimitry Andric dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (load ForceXForm:$A))))); 23450b57cec5SDimitry Andric} 23460b57cec5SDimitry Andricdef DblToUIntLoadP9 { 2347*fe6060f1SDimitry Andric dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (load DSForm:$A))))); 23480b57cec5SDimitry Andric} 23490b57cec5SDimitry Andricdef DblToLongLoad { 2350*fe6060f1SDimitry Andric dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (load ForceXForm:$A))))); 23510b57cec5SDimitry Andric} 23520b57cec5SDimitry Andricdef DblToULongLoad { 2353*fe6060f1SDimitry Andric dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (load ForceXForm:$A))))); 23540b57cec5SDimitry Andric} 23550b57cec5SDimitry Andric 2356480093f4SDimitry Andric// FP load dags (for f32 -> v4f32) 2357480093f4SDimitry Andricdef LoadFP { 2358*fe6060f1SDimitry Andric dag A = (f32 (load ForceXForm:$A)); 2359*fe6060f1SDimitry Andric dag B = (f32 (load ForceXForm:$B)); 2360*fe6060f1SDimitry Andric dag C = (f32 (load ForceXForm:$C)); 2361*fe6060f1SDimitry Andric dag D = (f32 (load ForceXForm:$D)); 2362480093f4SDimitry Andric} 2363480093f4SDimitry Andric 23640b57cec5SDimitry Andric// FP merge dags (for f32 -> v4f32) 23650b57cec5SDimitry Andricdef MrgFP { 2366*fe6060f1SDimitry Andric dag LD32A = (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$A), sub_64); 2367*fe6060f1SDimitry Andric dag LD32B = (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$B), sub_64); 2368*fe6060f1SDimitry Andric dag LD32C = (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$C), sub_64); 2369*fe6060f1SDimitry Andric dag LD32D = (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$D), sub_64); 2370*fe6060f1SDimitry Andric dag AC = (XVCVDPSP (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64), 2371*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), $C, sub_64), 0)); 2372*fe6060f1SDimitry Andric dag BD = (XVCVDPSP (XXPERMDI (SUBREG_TO_REG (i64 1), $B, sub_64), 2373*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), $D, sub_64), 0)); 23740b57cec5SDimitry Andric dag ABhToFlt = (XVCVDPSP (XXPERMDI $A, $B, 0)); 23750b57cec5SDimitry Andric dag ABlToFlt = (XVCVDPSP (XXPERMDI $A, $B, 3)); 23760b57cec5SDimitry Andric dag BAhToFlt = (XVCVDPSP (XXPERMDI $B, $A, 0)); 23770b57cec5SDimitry Andric dag BAlToFlt = (XVCVDPSP (XXPERMDI $B, $A, 3)); 23780b57cec5SDimitry Andric} 23790b57cec5SDimitry Andric 23800b57cec5SDimitry Andric// Word-element merge dags - conversions from f64 to i32 merged into vectors. 23810b57cec5SDimitry Andricdef MrgWords { 23820b57cec5SDimitry Andric // For big endian, we merge low and hi doublewords (A, B). 23830b57cec5SDimitry Andric dag A0B0 = (v2f64 (XXPERMDI v2f64:$A, v2f64:$B, 0)); 23840b57cec5SDimitry Andric dag A1B1 = (v2f64 (XXPERMDI v2f64:$A, v2f64:$B, 3)); 23850b57cec5SDimitry Andric dag CVA1B1S = (v4i32 (XVCVDPSXWS A1B1)); 23860b57cec5SDimitry Andric dag CVA0B0S = (v4i32 (XVCVDPSXWS A0B0)); 23870b57cec5SDimitry Andric dag CVA1B1U = (v4i32 (XVCVDPUXWS A1B1)); 23880b57cec5SDimitry Andric dag CVA0B0U = (v4i32 (XVCVDPUXWS A0B0)); 23890b57cec5SDimitry Andric 23900b57cec5SDimitry Andric // For little endian, we merge low and hi doublewords (B, A). 23910b57cec5SDimitry Andric dag B1A1 = (v2f64 (XXPERMDI v2f64:$B, v2f64:$A, 0)); 23920b57cec5SDimitry Andric dag B0A0 = (v2f64 (XXPERMDI v2f64:$B, v2f64:$A, 3)); 23930b57cec5SDimitry Andric dag CVB1A1S = (v4i32 (XVCVDPSXWS B1A1)); 23940b57cec5SDimitry Andric dag CVB0A0S = (v4i32 (XVCVDPSXWS B0A0)); 23950b57cec5SDimitry Andric dag CVB1A1U = (v4i32 (XVCVDPUXWS B1A1)); 23960b57cec5SDimitry Andric dag CVB0A0U = (v4i32 (XVCVDPUXWS B0A0)); 23970b57cec5SDimitry Andric 23980b57cec5SDimitry Andric // For big endian, we merge hi doublewords of (A, C) and (B, D), convert 23990b57cec5SDimitry Andric // then merge. 2400*fe6060f1SDimitry Andric dag AC = (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), f64:$A, sub_64), 2401*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), f64:$C, sub_64), 0)); 2402*fe6060f1SDimitry Andric dag BD = (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), f64:$B, sub_64), 2403*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), f64:$D, sub_64), 0)); 24040b57cec5SDimitry Andric dag CVACS = (v4i32 (XVCVDPSXWS AC)); 24050b57cec5SDimitry Andric dag CVBDS = (v4i32 (XVCVDPSXWS BD)); 24060b57cec5SDimitry Andric dag CVACU = (v4i32 (XVCVDPUXWS AC)); 24070b57cec5SDimitry Andric dag CVBDU = (v4i32 (XVCVDPUXWS BD)); 24080b57cec5SDimitry Andric 24090b57cec5SDimitry Andric // For little endian, we merge hi doublewords of (D, B) and (C, A), convert 24100b57cec5SDimitry Andric // then merge. 2411*fe6060f1SDimitry Andric dag DB = (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), f64:$D, sub_64), 2412*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), f64:$B, sub_64), 0)); 2413*fe6060f1SDimitry Andric dag CA = (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), f64:$C, sub_64), 2414*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), f64:$A, sub_64), 0)); 24150b57cec5SDimitry Andric dag CVDBS = (v4i32 (XVCVDPSXWS DB)); 24160b57cec5SDimitry Andric dag CVCAS = (v4i32 (XVCVDPSXWS CA)); 24170b57cec5SDimitry Andric dag CVDBU = (v4i32 (XVCVDPUXWS DB)); 24180b57cec5SDimitry Andric dag CVCAU = (v4i32 (XVCVDPUXWS CA)); 24190b57cec5SDimitry Andric} 24200b57cec5SDimitry Andric 2421*fe6060f1SDimitry Andricdef DblwdCmp { 2422*fe6060f1SDimitry Andric dag SGTW = (v2i64 (v2i64 (VCMPGTSW v2i64:$vA, v2i64:$vB))); 2423*fe6060f1SDimitry Andric dag UGTW = (v2i64 (v2i64 (VCMPGTUW v2i64:$vA, v2i64:$vB))); 2424*fe6060f1SDimitry Andric dag EQW = (v2i64 (v2i64 (VCMPEQUW v2i64:$vA, v2i64:$vB))); 2425*fe6060f1SDimitry Andric dag UGTWSHAND = (v2i64 (XXLAND (v2i64 (XXSLDWI UGTW, UGTW, 1)), EQW)); 2426*fe6060f1SDimitry Andric dag EQWSHAND = (v2i64 (XXLAND (v2i64 (XXSLDWI EQW, EQW, 1)), EQW)); 2427*fe6060f1SDimitry Andric dag SGTWOR = (v2i64 (XXLOR SGTW, UGTWSHAND)); 2428*fe6060f1SDimitry Andric dag UGTWOR = (v2i64 (XXLOR UGTW, UGTWSHAND)); 2429*fe6060f1SDimitry Andric dag MRGSGT = (v2i64 (XXPERMDI (v2i64 (XXSPLTW SGTWOR, 0)), 2430*fe6060f1SDimitry Andric (v2i64 (XXSPLTW SGTWOR, 2)), 0)); 2431*fe6060f1SDimitry Andric dag MRGUGT = (v2i64 (XXPERMDI (v2i64 (XXSPLTW UGTWOR, 0)), 2432*fe6060f1SDimitry Andric (v2i64 (XXSPLTW UGTWOR, 2)), 0)); 2433*fe6060f1SDimitry Andric dag MRGEQ = (v2i64 (XXPERMDI (v2i64 (XXSPLTW EQWSHAND, 0)), 2434*fe6060f1SDimitry Andric (v2i64 (XXSPLTW EQWSHAND, 2)), 0)); 2435*fe6060f1SDimitry Andric} 2436*fe6060f1SDimitry Andric 24375ffd83dbSDimitry Andric//---------------------------- Anonymous Patterns ----------------------------// 24385ffd83dbSDimitry Andric// Predicate combinations are kept in roughly chronological order in terms of 24395ffd83dbSDimitry Andric// instruction availability in the architecture. For example, VSX came in with 24405ffd83dbSDimitry Andric// ISA 2.06 (Power7). There have since been additions in ISA 2.07 (Power8) and 24415ffd83dbSDimitry Andric// ISA 3.0 (Power9). However, the granularity of features on later subtargets 24425ffd83dbSDimitry Andric// is finer for various reasons. For example, we have Power8Vector, 24435ffd83dbSDimitry Andric// Power8Altivec, DirectMove that all came in with ISA 2.07. The situation is 24445ffd83dbSDimitry Andric// similar with ISA 3.0 with Power9Vector, Power9Altivec, IsISA3_0. Then there 24455ffd83dbSDimitry Andric// are orthogonal predicates such as endianness for which the order was 24465ffd83dbSDimitry Andric// arbitrarily chosen to be Big, Little. 24475ffd83dbSDimitry Andric// 24485ffd83dbSDimitry Andric// Predicate combinations available: 2449e8d8bef9SDimitry Andric// [HasVSX, IsLittleEndian, HasP8Altivec] Altivec patterns using VSX instr. 2450e8d8bef9SDimitry Andric// [HasVSX, IsBigEndian, HasP8Altivec] Altivec patterns using VSX instr. 24515ffd83dbSDimitry Andric// [HasVSX] 24525ffd83dbSDimitry Andric// [HasVSX, IsBigEndian] 24535ffd83dbSDimitry Andric// [HasVSX, IsLittleEndian] 24545ffd83dbSDimitry Andric// [HasVSX, NoP9Vector] 2455e8d8bef9SDimitry Andric// [HasVSX, NoP9Vector, IsLittleEndian] 2456*fe6060f1SDimitry Andric// [HasVSX, NoP9Vector, IsBigEndian] 24575ffd83dbSDimitry Andric// [HasVSX, HasOnlySwappingMemOps] 24585ffd83dbSDimitry Andric// [HasVSX, HasOnlySwappingMemOps, IsBigEndian] 24595ffd83dbSDimitry Andric// [HasVSX, HasP8Vector] 2460*fe6060f1SDimitry Andric// [HasVSX, HasP8Vector, IsBigEndian] 2461e8d8bef9SDimitry Andric// [HasVSX, HasP8Vector, IsBigEndian, IsPPC64] 24625ffd83dbSDimitry Andric// [HasVSX, HasP8Vector, IsLittleEndian] 2463e8d8bef9SDimitry Andric// [HasVSX, HasP8Vector, NoP9Vector, IsBigEndian, IsPPC64] 24645ffd83dbSDimitry Andric// [HasVSX, HasP8Vector, NoP9Vector, IsLittleEndian] 24655ffd83dbSDimitry Andric// [HasVSX, HasDirectMove] 24665ffd83dbSDimitry Andric// [HasVSX, HasDirectMove, IsBigEndian] 24675ffd83dbSDimitry Andric// [HasVSX, HasDirectMove, IsLittleEndian] 2468e8d8bef9SDimitry Andric// [HasVSX, HasDirectMove, NoP9Altivec, IsBigEndian, IsPPC64] 2469e8d8bef9SDimitry Andric// [HasVSX, HasDirectMove, NoP9Vector, IsBigEndian, IsPPC64] 24705ffd83dbSDimitry Andric// [HasVSX, HasDirectMove, NoP9Altivec, IsLittleEndian] 24715ffd83dbSDimitry Andric// [HasVSX, HasDirectMove, NoP9Vector, IsLittleEndian] 24725ffd83dbSDimitry Andric// [HasVSX, HasP9Vector] 2473*fe6060f1SDimitry Andric// [HasVSX, HasP9Vector, NoP10Vector] 2474*fe6060f1SDimitry Andric// [HasVSX, HasP9Vector, IsBigEndian] 2475e8d8bef9SDimitry Andric// [HasVSX, HasP9Vector, IsBigEndian, IsPPC64] 24765ffd83dbSDimitry Andric// [HasVSX, HasP9Vector, IsLittleEndian] 24775ffd83dbSDimitry Andric// [HasVSX, HasP9Altivec] 2478e8d8bef9SDimitry Andric// [HasVSX, HasP9Altivec, IsBigEndian, IsPPC64] 24795ffd83dbSDimitry Andric// [HasVSX, HasP9Altivec, IsLittleEndian] 2480e8d8bef9SDimitry Andric// [HasVSX, IsISA3_0, HasDirectMove, IsBigEndian, IsPPC64] 24815ffd83dbSDimitry Andric// [HasVSX, IsISA3_0, HasDirectMove, IsLittleEndian] 24820b57cec5SDimitry Andric 2483e8d8bef9SDimitry Andric// These Altivec patterns are here because we need a VSX instruction to match 2484e8d8bef9SDimitry Andric// the intrinsic (but only for little endian system). 2485e8d8bef9SDimitry Andriclet Predicates = [HasVSX, IsLittleEndian, HasP8Altivec] in 2486e8d8bef9SDimitry Andric def : Pat<(v16i8 (int_ppc_altivec_crypto_vpermxor v16i8:$a, 2487e8d8bef9SDimitry Andric v16i8:$b, v16i8:$c)), 2488e8d8bef9SDimitry Andric (v16i8 (VPERMXOR $a, $b, (XXLNOR (COPY_TO_REGCLASS $c, VSRC), 2489e8d8bef9SDimitry Andric (COPY_TO_REGCLASS $c, VSRC))))>; 2490e8d8bef9SDimitry Andriclet Predicates = [HasVSX, IsBigEndian, HasP8Altivec] in 2491e8d8bef9SDimitry Andric def : Pat<(v16i8 (int_ppc_altivec_crypto_vpermxor v16i8:$a, 2492e8d8bef9SDimitry Andric v16i8:$b, v16i8:$c)), 2493e8d8bef9SDimitry Andric (v16i8 (VPERMXOR $a, $b, $c))>; 2494e8d8bef9SDimitry Andric 24955ffd83dbSDimitry Andriclet AddedComplexity = 400 in { 24965ffd83dbSDimitry Andric// Valid for any VSX subtarget, regardless of endianness. 24970b57cec5SDimitry Andriclet Predicates = [HasVSX] in { 2498*fe6060f1SDimitry Andricdef : Pat<(v4i32 (vnot v4i32:$A)), 24995ffd83dbSDimitry Andric (v4i32 (XXLNOR $A, $A))>; 2500*fe6060f1SDimitry Andricdef : Pat<(v4i32 (or (and (vnot v4i32:$C), v4i32:$A), 25015ffd83dbSDimitry Andric (and v4i32:$B, v4i32:$C))), 25025ffd83dbSDimitry Andric (v4i32 (XXSEL $A, $B, $C))>; 25035ffd83dbSDimitry Andric 25045ffd83dbSDimitry Andric// Additional fnmsub pattern for PPC specific ISD opcode 25055ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub f64:$A, f64:$B, f64:$C), 25065ffd83dbSDimitry Andric (XSNMSUBADP $C, $A, $B)>; 25075ffd83dbSDimitry Andricdef : Pat<(fneg (PPCfnmsub f64:$A, f64:$B, f64:$C)), 25085ffd83dbSDimitry Andric (XSMSUBADP $C, $A, $B)>; 25095ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub f64:$A, f64:$B, (fneg f64:$C)), 25105ffd83dbSDimitry Andric (XSNMADDADP $C, $A, $B)>; 25115ffd83dbSDimitry Andric 25125ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub v2f64:$A, v2f64:$B, v2f64:$C), 25135ffd83dbSDimitry Andric (XVNMSUBADP $C, $A, $B)>; 25145ffd83dbSDimitry Andricdef : Pat<(fneg (PPCfnmsub v2f64:$A, v2f64:$B, v2f64:$C)), 25155ffd83dbSDimitry Andric (XVMSUBADP $C, $A, $B)>; 25165ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub v2f64:$A, v2f64:$B, (fneg v2f64:$C)), 25175ffd83dbSDimitry Andric (XVNMADDADP $C, $A, $B)>; 25185ffd83dbSDimitry Andric 25195ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub v4f32:$A, v4f32:$B, v4f32:$C), 25205ffd83dbSDimitry Andric (XVNMSUBASP $C, $A, $B)>; 25215ffd83dbSDimitry Andricdef : Pat<(fneg (PPCfnmsub v4f32:$A, v4f32:$B, v4f32:$C)), 25225ffd83dbSDimitry Andric (XVMSUBASP $C, $A, $B)>; 25235ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub v4f32:$A, v4f32:$B, (fneg v4f32:$C)), 25245ffd83dbSDimitry Andric (XVNMADDASP $C, $A, $B)>; 25255ffd83dbSDimitry Andric 2526e8d8bef9SDimitry Andricdef : Pat<(PPCfsqrt f64:$frA), (XSSQRTDP $frA)>; 2527e8d8bef9SDimitry Andricdef : Pat<(PPCfsqrt v2f64:$frA), (XVSQRTDP $frA)>; 2528e8d8bef9SDimitry Andricdef : Pat<(PPCfsqrt v4f32:$frA), (XVSQRTSP $frA)>; 2529e8d8bef9SDimitry Andric 25305ffd83dbSDimitry Andricdef : Pat<(v2f64 (bitconvert v4f32:$A)), 25315ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VSRC)>; 25325ffd83dbSDimitry Andricdef : Pat<(v2f64 (bitconvert v4i32:$A)), 25335ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VSRC)>; 25345ffd83dbSDimitry Andricdef : Pat<(v2f64 (bitconvert v8i16:$A)), 25355ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VSRC)>; 25365ffd83dbSDimitry Andricdef : Pat<(v2f64 (bitconvert v16i8:$A)), 25375ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VSRC)>; 25385ffd83dbSDimitry Andric 25395ffd83dbSDimitry Andricdef : Pat<(v4f32 (bitconvert v2f64:$A)), 25405ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25415ffd83dbSDimitry Andricdef : Pat<(v4i32 (bitconvert v2f64:$A)), 25425ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25435ffd83dbSDimitry Andricdef : Pat<(v8i16 (bitconvert v2f64:$A)), 25445ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25455ffd83dbSDimitry Andricdef : Pat<(v16i8 (bitconvert v2f64:$A)), 25465ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25475ffd83dbSDimitry Andric 25485ffd83dbSDimitry Andricdef : Pat<(v2i64 (bitconvert v4f32:$A)), 25495ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VSRC)>; 25505ffd83dbSDimitry Andricdef : Pat<(v2i64 (bitconvert v4i32:$A)), 25515ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VSRC)>; 25525ffd83dbSDimitry Andricdef : Pat<(v2i64 (bitconvert v8i16:$A)), 25535ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VSRC)>; 25545ffd83dbSDimitry Andricdef : Pat<(v2i64 (bitconvert v16i8:$A)), 25555ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VSRC)>; 25565ffd83dbSDimitry Andric 25575ffd83dbSDimitry Andricdef : Pat<(v4f32 (bitconvert v2i64:$A)), 25585ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25595ffd83dbSDimitry Andricdef : Pat<(v4i32 (bitconvert v2i64:$A)), 25605ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25615ffd83dbSDimitry Andricdef : Pat<(v8i16 (bitconvert v2i64:$A)), 25625ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25635ffd83dbSDimitry Andricdef : Pat<(v16i8 (bitconvert v2i64:$A)), 25645ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25655ffd83dbSDimitry Andric 25665ffd83dbSDimitry Andricdef : Pat<(v2f64 (bitconvert v2i64:$A)), 25675ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25685ffd83dbSDimitry Andricdef : Pat<(v2i64 (bitconvert v2f64:$A)), 25695ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25705ffd83dbSDimitry Andric 25715ffd83dbSDimitry Andricdef : Pat<(v2f64 (bitconvert v1i128:$A)), 25725ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25735ffd83dbSDimitry Andricdef : Pat<(v1i128 (bitconvert v2f64:$A)), 25745ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25755ffd83dbSDimitry Andric 25765ffd83dbSDimitry Andricdef : Pat<(v2i64 (bitconvert f128:$A)), 25775ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25785ffd83dbSDimitry Andricdef : Pat<(v4i32 (bitconvert f128:$A)), 25795ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25805ffd83dbSDimitry Andricdef : Pat<(v8i16 (bitconvert f128:$A)), 25815ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25825ffd83dbSDimitry Andricdef : Pat<(v16i8 (bitconvert f128:$A)), 25835ffd83dbSDimitry Andric (COPY_TO_REGCLASS $A, VRRC)>; 25845ffd83dbSDimitry Andric 25855ffd83dbSDimitry Andricdef : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 0)), 25865ffd83dbSDimitry Andric (v2f64 (XVCVSXWDP (v2i64 (XXMRGHW $C, $C))))>; 25875ffd83dbSDimitry Andricdef : Pat<(v2f64 (PPCsvec2fp v4i32:$C, 1)), 25885ffd83dbSDimitry Andric (v2f64 (XVCVSXWDP (v2i64 (XXMRGLW $C, $C))))>; 25895ffd83dbSDimitry Andric 25905ffd83dbSDimitry Andricdef : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 0)), 25915ffd83dbSDimitry Andric (v2f64 (XVCVUXWDP (v2i64 (XXMRGHW $C, $C))))>; 25925ffd83dbSDimitry Andricdef : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 1)), 25935ffd83dbSDimitry Andric (v2f64 (XVCVUXWDP (v2i64 (XXMRGLW $C, $C))))>; 25945ffd83dbSDimitry Andric 25955ffd83dbSDimitry Andricdef : Pat<(v2f64 (PPCfpexth v4f32:$C, 0)), (XVCVSPDP (XXMRGHW $C, $C))>; 25965ffd83dbSDimitry Andricdef : Pat<(v2f64 (PPCfpexth v4f32:$C, 1)), (XVCVSPDP (XXMRGLW $C, $C))>; 25975ffd83dbSDimitry Andric 25985ffd83dbSDimitry Andric// Permutes. 25995ffd83dbSDimitry Andricdef : Pat<(v2f64 (PPCxxswapd v2f64:$src)), (XXPERMDI $src, $src, 2)>; 26005ffd83dbSDimitry Andricdef : Pat<(v2i64 (PPCxxswapd v2i64:$src)), (XXPERMDI $src, $src, 2)>; 26015ffd83dbSDimitry Andricdef : Pat<(v4f32 (PPCxxswapd v4f32:$src)), (XXPERMDI $src, $src, 2)>; 26025ffd83dbSDimitry Andricdef : Pat<(v4i32 (PPCxxswapd v4i32:$src)), (XXPERMDI $src, $src, 2)>; 26035ffd83dbSDimitry Andricdef : Pat<(v2f64 (PPCswapNoChain v2f64:$src)), (XXPERMDI $src, $src, 2)>; 26045ffd83dbSDimitry Andric 26055ffd83dbSDimitry Andric// PPCvecshl XT, XA, XA, 2 can be selected to both XXSLDWI XT,XA,XA,2 and 26065ffd83dbSDimitry Andric// XXSWAPD XT,XA (i.e. XXPERMDI XT,XA,XA,2), the later one is more profitable. 26075ffd83dbSDimitry Andricdef : Pat<(v4i32 (PPCvecshl v4i32:$src, v4i32:$src, 2)), 26085ffd83dbSDimitry Andric (XXPERMDI $src, $src, 2)>; 26095ffd83dbSDimitry Andric 26105ffd83dbSDimitry Andric// Selects. 26115ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLT)), 26125ffd83dbSDimitry Andric (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>; 26135ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULT)), 26145ffd83dbSDimitry Andric (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>; 26155ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETLE)), 26165ffd83dbSDimitry Andric (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>; 26175ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETULE)), 26185ffd83dbSDimitry Andric (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>; 26195ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETEQ)), 26205ffd83dbSDimitry Andric (SELECT_VSRC (CREQV $lhs, $rhs), $tval, $fval)>; 26215ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGE)), 26225ffd83dbSDimitry Andric (SELECT_VSRC (CRORC $rhs, $lhs), $tval, $fval)>; 26235ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGE)), 26245ffd83dbSDimitry Andric (SELECT_VSRC (CRORC $lhs, $rhs), $tval, $fval)>; 26255ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETGT)), 26265ffd83dbSDimitry Andric (SELECT_VSRC (CRANDC $rhs, $lhs), $tval, $fval)>; 26275ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETUGT)), 26285ffd83dbSDimitry Andric (SELECT_VSRC (CRANDC $lhs, $rhs), $tval, $fval)>; 26295ffd83dbSDimitry Andricdef : Pat<(v2f64 (selectcc i1:$lhs, i1:$rhs, v2f64:$tval, v2f64:$fval, SETNE)), 26305ffd83dbSDimitry Andric (SELECT_VSRC (CRXOR $lhs, $rhs), $tval, $fval)>; 26315ffd83dbSDimitry Andric 26325ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)), 26335ffd83dbSDimitry Andric (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>; 26345ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)), 26355ffd83dbSDimitry Andric (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>; 26365ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)), 26375ffd83dbSDimitry Andric (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>; 26385ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)), 26395ffd83dbSDimitry Andric (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>; 26405ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)), 26415ffd83dbSDimitry Andric (SELECT_VSFRC (CREQV $lhs, $rhs), $tval, $fval)>; 26425ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)), 26435ffd83dbSDimitry Andric (SELECT_VSFRC (CRORC $rhs, $lhs), $tval, $fval)>; 26445ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)), 26455ffd83dbSDimitry Andric (SELECT_VSFRC (CRORC $lhs, $rhs), $tval, $fval)>; 26465ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)), 26475ffd83dbSDimitry Andric (SELECT_VSFRC (CRANDC $rhs, $lhs), $tval, $fval)>; 26485ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)), 26495ffd83dbSDimitry Andric (SELECT_VSFRC (CRANDC $lhs, $rhs), $tval, $fval)>; 26505ffd83dbSDimitry Andricdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)), 26515ffd83dbSDimitry Andric (SELECT_VSFRC (CRXOR $lhs, $rhs), $tval, $fval)>; 26525ffd83dbSDimitry Andric 26535ffd83dbSDimitry Andric// Divides. 26545ffd83dbSDimitry Andricdef : Pat<(int_ppc_vsx_xvdivsp v4f32:$A, v4f32:$B), 26555ffd83dbSDimitry Andric (XVDIVSP $A, $B)>; 26565ffd83dbSDimitry Andricdef : Pat<(int_ppc_vsx_xvdivdp v2f64:$A, v2f64:$B), 26575ffd83dbSDimitry Andric (XVDIVDP $A, $B)>; 26585ffd83dbSDimitry Andric 2659e8d8bef9SDimitry Andric// Vector test for software divide and sqrt. 2660e8d8bef9SDimitry Andricdef : Pat<(i32 (int_ppc_vsx_xvtdivdp v2f64:$A, v2f64:$B)), 2661e8d8bef9SDimitry Andric (COPY_TO_REGCLASS (XVTDIVDP $A, $B), GPRC)>; 2662e8d8bef9SDimitry Andricdef : Pat<(i32 (int_ppc_vsx_xvtdivsp v4f32:$A, v4f32:$B)), 2663e8d8bef9SDimitry Andric (COPY_TO_REGCLASS (XVTDIVSP $A, $B), GPRC)>; 2664e8d8bef9SDimitry Andricdef : Pat<(i32 (int_ppc_vsx_xvtsqrtdp v2f64:$A)), 2665e8d8bef9SDimitry Andric (COPY_TO_REGCLASS (XVTSQRTDP $A), GPRC)>; 2666e8d8bef9SDimitry Andricdef : Pat<(i32 (int_ppc_vsx_xvtsqrtsp v4f32:$A)), 2667e8d8bef9SDimitry Andric (COPY_TO_REGCLASS (XVTSQRTSP $A), GPRC)>; 2668e8d8bef9SDimitry Andric 26695ffd83dbSDimitry Andric// Reciprocal estimate 26705ffd83dbSDimitry Andricdef : Pat<(int_ppc_vsx_xvresp v4f32:$A), 26715ffd83dbSDimitry Andric (XVRESP $A)>; 26725ffd83dbSDimitry Andricdef : Pat<(int_ppc_vsx_xvredp v2f64:$A), 26735ffd83dbSDimitry Andric (XVREDP $A)>; 26745ffd83dbSDimitry Andric 26755ffd83dbSDimitry Andric// Recip. square root estimate 26765ffd83dbSDimitry Andricdef : Pat<(int_ppc_vsx_xvrsqrtesp v4f32:$A), 26775ffd83dbSDimitry Andric (XVRSQRTESP $A)>; 26785ffd83dbSDimitry Andricdef : Pat<(int_ppc_vsx_xvrsqrtedp v2f64:$A), 26795ffd83dbSDimitry Andric (XVRSQRTEDP $A)>; 26805ffd83dbSDimitry Andric 26815ffd83dbSDimitry Andric// Vector selection 26825ffd83dbSDimitry Andricdef : Pat<(v16i8 (vselect v16i8:$vA, v16i8:$vB, v16i8:$vC)), 26835ffd83dbSDimitry Andric (COPY_TO_REGCLASS 26845ffd83dbSDimitry Andric (XXSEL (COPY_TO_REGCLASS $vC, VSRC), 26855ffd83dbSDimitry Andric (COPY_TO_REGCLASS $vB, VSRC), 26865ffd83dbSDimitry Andric (COPY_TO_REGCLASS $vA, VSRC)), VRRC)>; 26875ffd83dbSDimitry Andricdef : Pat<(v8i16 (vselect v8i16:$vA, v8i16:$vB, v8i16:$vC)), 26885ffd83dbSDimitry Andric (COPY_TO_REGCLASS 26895ffd83dbSDimitry Andric (XXSEL (COPY_TO_REGCLASS $vC, VSRC), 26905ffd83dbSDimitry Andric (COPY_TO_REGCLASS $vB, VSRC), 26915ffd83dbSDimitry Andric (COPY_TO_REGCLASS $vA, VSRC)), VRRC)>; 26925ffd83dbSDimitry Andricdef : Pat<(vselect v4i32:$vA, v4i32:$vB, v4i32:$vC), 26935ffd83dbSDimitry Andric (XXSEL $vC, $vB, $vA)>; 26945ffd83dbSDimitry Andricdef : Pat<(vselect v2i64:$vA, v2i64:$vB, v2i64:$vC), 26955ffd83dbSDimitry Andric (XXSEL $vC, $vB, $vA)>; 26965ffd83dbSDimitry Andricdef : Pat<(vselect v4i32:$vA, v4f32:$vB, v4f32:$vC), 26975ffd83dbSDimitry Andric (XXSEL $vC, $vB, $vA)>; 26985ffd83dbSDimitry Andricdef : Pat<(vselect v2i64:$vA, v2f64:$vB, v2f64:$vC), 26995ffd83dbSDimitry Andric (XXSEL $vC, $vB, $vA)>; 2700*fe6060f1SDimitry Andricdef : Pat<(v1i128 (vselect v1i128:$vA, v1i128:$vB, v1i128:$vC)), 2701*fe6060f1SDimitry Andric (COPY_TO_REGCLASS 2702*fe6060f1SDimitry Andric (XXSEL (COPY_TO_REGCLASS $vC, VSRC), 2703*fe6060f1SDimitry Andric (COPY_TO_REGCLASS $vB, VSRC), 2704*fe6060f1SDimitry Andric (COPY_TO_REGCLASS $vA, VSRC)), VRRC)>; 27055ffd83dbSDimitry Andric 27065ffd83dbSDimitry Andricdef : Pat<(v4f32 (any_fmaxnum v4f32:$src1, v4f32:$src2)), 27075ffd83dbSDimitry Andric (v4f32 (XVMAXSP $src1, $src2))>; 27085ffd83dbSDimitry Andricdef : Pat<(v4f32 (any_fminnum v4f32:$src1, v4f32:$src2)), 27095ffd83dbSDimitry Andric (v4f32 (XVMINSP $src1, $src2))>; 27105ffd83dbSDimitry Andricdef : Pat<(v2f64 (any_fmaxnum v2f64:$src1, v2f64:$src2)), 27115ffd83dbSDimitry Andric (v2f64 (XVMAXDP $src1, $src2))>; 27125ffd83dbSDimitry Andricdef : Pat<(v2f64 (any_fminnum v2f64:$src1, v2f64:$src2)), 27135ffd83dbSDimitry Andric (v2f64 (XVMINDP $src1, $src2))>; 27145ffd83dbSDimitry Andric 27155ffd83dbSDimitry Andric// f32 abs 27165ffd83dbSDimitry Andricdef : Pat<(f32 (fabs f32:$S)), 27175ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSABSDP 27185ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 27195ffd83dbSDimitry Andric 27205ffd83dbSDimitry Andric// f32 nabs 27215ffd83dbSDimitry Andricdef : Pat<(f32 (fneg (fabs f32:$S))), 27225ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSNABSDP 27235ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 27245ffd83dbSDimitry Andric 27255ffd83dbSDimitry Andric// f32 Min. 27265ffd83dbSDimitry Andricdef : Pat<(f32 (fminnum_ieee f32:$A, f32:$B)), 27275ffd83dbSDimitry Andric (f32 FpMinMax.F32Min)>; 27285ffd83dbSDimitry Andricdef : Pat<(f32 (fminnum_ieee (fcanonicalize f32:$A), f32:$B)), 27295ffd83dbSDimitry Andric (f32 FpMinMax.F32Min)>; 27305ffd83dbSDimitry Andricdef : Pat<(f32 (fminnum_ieee f32:$A, (fcanonicalize f32:$B))), 27315ffd83dbSDimitry Andric (f32 FpMinMax.F32Min)>; 27325ffd83dbSDimitry Andricdef : Pat<(f32 (fminnum_ieee (fcanonicalize f32:$A), (fcanonicalize f32:$B))), 27335ffd83dbSDimitry Andric (f32 FpMinMax.F32Min)>; 27345ffd83dbSDimitry Andric// F32 Max. 27355ffd83dbSDimitry Andricdef : Pat<(f32 (fmaxnum_ieee f32:$A, f32:$B)), 27365ffd83dbSDimitry Andric (f32 FpMinMax.F32Max)>; 27375ffd83dbSDimitry Andricdef : Pat<(f32 (fmaxnum_ieee (fcanonicalize f32:$A), f32:$B)), 27385ffd83dbSDimitry Andric (f32 FpMinMax.F32Max)>; 27395ffd83dbSDimitry Andricdef : Pat<(f32 (fmaxnum_ieee f32:$A, (fcanonicalize f32:$B))), 27405ffd83dbSDimitry Andric (f32 FpMinMax.F32Max)>; 27415ffd83dbSDimitry Andricdef : Pat<(f32 (fmaxnum_ieee (fcanonicalize f32:$A), (fcanonicalize f32:$B))), 27425ffd83dbSDimitry Andric (f32 FpMinMax.F32Max)>; 27435ffd83dbSDimitry Andric 27445ffd83dbSDimitry Andric// f64 Min. 27455ffd83dbSDimitry Andricdef : Pat<(f64 (fminnum_ieee f64:$A, f64:$B)), 27465ffd83dbSDimitry Andric (f64 (XSMINDP $A, $B))>; 27475ffd83dbSDimitry Andricdef : Pat<(f64 (fminnum_ieee (fcanonicalize f64:$A), f64:$B)), 27485ffd83dbSDimitry Andric (f64 (XSMINDP $A, $B))>; 27495ffd83dbSDimitry Andricdef : Pat<(f64 (fminnum_ieee f64:$A, (fcanonicalize f64:$B))), 27505ffd83dbSDimitry Andric (f64 (XSMINDP $A, $B))>; 27515ffd83dbSDimitry Andricdef : Pat<(f64 (fminnum_ieee (fcanonicalize f64:$A), (fcanonicalize f64:$B))), 27525ffd83dbSDimitry Andric (f64 (XSMINDP $A, $B))>; 27535ffd83dbSDimitry Andric// f64 Max. 27545ffd83dbSDimitry Andricdef : Pat<(f64 (fmaxnum_ieee f64:$A, f64:$B)), 27555ffd83dbSDimitry Andric (f64 (XSMAXDP $A, $B))>; 27565ffd83dbSDimitry Andricdef : Pat<(f64 (fmaxnum_ieee (fcanonicalize f64:$A), f64:$B)), 27575ffd83dbSDimitry Andric (f64 (XSMAXDP $A, $B))>; 27585ffd83dbSDimitry Andricdef : Pat<(f64 (fmaxnum_ieee f64:$A, (fcanonicalize f64:$B))), 27595ffd83dbSDimitry Andric (f64 (XSMAXDP $A, $B))>; 27605ffd83dbSDimitry Andricdef : Pat<(f64 (fmaxnum_ieee (fcanonicalize f64:$A), (fcanonicalize f64:$B))), 27615ffd83dbSDimitry Andric (f64 (XSMAXDP $A, $B))>; 27625ffd83dbSDimitry Andric 2763*fe6060f1SDimitry Andricdef : Pat<(int_ppc_vsx_stxvd2x_be v2f64:$rS, ForceXForm:$dst), 2764*fe6060f1SDimitry Andric (STXVD2X $rS, ForceXForm:$dst)>; 2765*fe6060f1SDimitry Andricdef : Pat<(int_ppc_vsx_stxvw4x_be v4i32:$rS, ForceXForm:$dst), 2766*fe6060f1SDimitry Andric (STXVW4X $rS, ForceXForm:$dst)>; 2767*fe6060f1SDimitry Andricdef : Pat<(v4i32 (int_ppc_vsx_lxvw4x_be ForceXForm:$src)), (LXVW4X ForceXForm:$src)>; 2768*fe6060f1SDimitry Andricdef : Pat<(v2f64 (int_ppc_vsx_lxvd2x_be ForceXForm:$src)), (LXVD2X ForceXForm:$src)>; 27695ffd83dbSDimitry Andric 27705ffd83dbSDimitry Andric// Rounding for single precision. 27715ffd83dbSDimitry Andricdef : Pat<(f32 (any_fround f32:$S)), 27725ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSRDPI 27735ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 2774e8d8bef9SDimitry Andricdef : Pat<(f32 (fnearbyint f32:$S)), 27755ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSRDPIC 27765ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 27775ffd83dbSDimitry Andricdef : Pat<(f32 (any_ffloor f32:$S)), 27785ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSRDPIM 27795ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 27805ffd83dbSDimitry Andricdef : Pat<(f32 (any_fceil f32:$S)), 27815ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSRDPIP 27825ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 27835ffd83dbSDimitry Andricdef : Pat<(f32 (any_ftrunc f32:$S)), 27845ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSRDPIZ 27855ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 27865ffd83dbSDimitry Andricdef : Pat<(f32 (any_frint f32:$S)), 27875ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSRDPIC 27885ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 2789e8d8bef9SDimitry Andricdef : Pat<(v4f32 (any_frint v4f32:$S)), (v4f32 (XVRSPIC $S))>; 27905ffd83dbSDimitry Andric 27915ffd83dbSDimitry Andric// Rounding for double precision. 2792e8d8bef9SDimitry Andricdef : Pat<(f64 (any_frint f64:$S)), (f64 (XSRDPIC $S))>; 2793e8d8bef9SDimitry Andricdef : Pat<(v2f64 (any_frint v2f64:$S)), (v2f64 (XVRDPIC $S))>; 27945ffd83dbSDimitry Andric 27955ffd83dbSDimitry Andric// Materialize a zero-vector of long long 27965ffd83dbSDimitry Andricdef : Pat<(v2i64 immAllZerosV), 27975ffd83dbSDimitry Andric (v2i64 (XXLXORz))>; 27985ffd83dbSDimitry Andric 27990b57cec5SDimitry Andric// Build vectors of floating point converted to i32. 28000b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.A, 28010b57cec5SDimitry Andric DblToInt.A, DblToInt.A)), 2802*fe6060f1SDimitry Andric (v4i32 (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPSXWS $A), sub_64), 1))>; 28030b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.A, 28040b57cec5SDimitry Andric DblToUInt.A, DblToUInt.A)), 2805*fe6060f1SDimitry Andric (v4i32 (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPUXWS $A), sub_64), 1))>; 28060b57cec5SDimitry Andricdef : Pat<(v2i64 (build_vector DblToLong.A, DblToLong.A)), 2807*fe6060f1SDimitry Andric (v2i64 (XXPERMDI (SUBREG_TO_REG (i64 1), (XSCVDPSXDS $A), sub_64), 2808*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSXDS $A), sub_64), 0))>; 28090b57cec5SDimitry Andricdef : Pat<(v2i64 (build_vector DblToULong.A, DblToULong.A)), 2810*fe6060f1SDimitry Andric (v2i64 (XXPERMDI (SUBREG_TO_REG (i64 1), (XSCVDPUXDS $A), sub_64), 2811*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPUXDS $A), sub_64), 0))>; 28125ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 28135ffd83dbSDimitry Andric v4i32, FltToIntLoad.A, 2814*fe6060f1SDimitry Andric (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPSXWSs (XFLOADf32 ForceXForm:$A)), sub_64), 1), 2815*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSXWSs (XFLOADf32 ForceXForm:$A)), sub_64)>; 28165ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 28175ffd83dbSDimitry Andric v4i32, FltToUIntLoad.A, 2818*fe6060f1SDimitry Andric (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPUXWSs (XFLOADf32 ForceXForm:$A)), sub_64), 1), 2819*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPUXWSs (XFLOADf32 ForceXForm:$A)), sub_64)>; 2820*fe6060f1SDimitry Andricdef : Pat<(v4f32 (build_vector (f32 (fpround f64:$A)), (f32 (fpround f64:$A)), 2821*fe6060f1SDimitry Andric (f32 (fpround f64:$A)), (f32 (fpround f64:$A)))), 2822*fe6060f1SDimitry Andric (v4f32 (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$A), sub_64), 0))>; 2823*fe6060f1SDimitry Andric 28240b57cec5SDimitry Andricdef : Pat<(v4f32 (build_vector f32:$A, f32:$A, f32:$A, f32:$A)), 28250b57cec5SDimitry Andric (v4f32 (XXSPLTW (v4f32 (XSCVDPSPN $A)), 0))>; 2826*fe6060f1SDimitry Andricdef : Pat<(v2f64 (PPCldsplat ForceXForm:$A)), 2827*fe6060f1SDimitry Andric (v2f64 (LXVDSX ForceXForm:$A))>; 2828*fe6060f1SDimitry Andricdef : Pat<(v2i64 (PPCldsplat ForceXForm:$A)), 2829*fe6060f1SDimitry Andric (v2i64 (LXVDSX ForceXForm:$A))>; 28300b57cec5SDimitry Andric 28310b57cec5SDimitry Andric// Build vectors of floating point converted to i64. 28320b57cec5SDimitry Andricdef : Pat<(v2i64 (build_vector FltToLong.A, FltToLong.A)), 28330b57cec5SDimitry Andric (v2i64 (XXPERMDIs 28340b57cec5SDimitry Andric (COPY_TO_REGCLASS (XSCVDPSXDSs $A), VSFRC), 0))>; 28350b57cec5SDimitry Andricdef : Pat<(v2i64 (build_vector FltToULong.A, FltToULong.A)), 28360b57cec5SDimitry Andric (v2i64 (XXPERMDIs 28370b57cec5SDimitry Andric (COPY_TO_REGCLASS (XSCVDPUXDSs $A), VSFRC), 0))>; 28385ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 28395ffd83dbSDimitry Andric v2i64, DblToLongLoad.A, 2840*fe6060f1SDimitry Andric (XVCVDPSXDS (LXVDSX ForceXForm:$A)), (XVCVDPSXDS (LXVDSX ForceXForm:$A))>; 28415ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 28425ffd83dbSDimitry Andric v2i64, DblToULongLoad.A, 2843*fe6060f1SDimitry Andric (XVCVDPUXDS (LXVDSX ForceXForm:$A)), (XVCVDPUXDS (LXVDSX ForceXForm:$A))>; 2844*fe6060f1SDimitry Andric 2845*fe6060f1SDimitry Andric// Doubleword vector predicate comparisons without Power8. 2846*fe6060f1SDimitry Andriclet AddedComplexity = 0 in { 2847*fe6060f1SDimitry Andricdef : Pat<(v2i64 (PPCvcmp_rec v2i64:$vA, v2i64:$vB, 967)), 2848*fe6060f1SDimitry Andric (VCMPGTUB_rec DblwdCmp.MRGSGT, (v2i64 (XXLXORz)))>; 2849*fe6060f1SDimitry Andricdef : Pat<(v2i64 (PPCvcmp_rec v2i64:$vA, v2i64:$vB, 711)), 2850*fe6060f1SDimitry Andric (VCMPGTUB_rec DblwdCmp.MRGUGT, (v2i64 (XXLXORz)))>; 2851*fe6060f1SDimitry Andricdef : Pat<(v2i64 (PPCvcmp_rec v2i64:$vA, v2i64:$vB, 199)), 2852*fe6060f1SDimitry Andric (VCMPGTUB_rec DblwdCmp.MRGEQ, (v2i64 (XXLXORz)))>; 2853*fe6060f1SDimitry Andric} // AddedComplexity = 0 2854*fe6060f1SDimitry Andric 2855*fe6060f1SDimitry Andric// XL Compat builtins. 2856*fe6060f1SDimitry Andricdef : Pat<(int_ppc_fmsub f64:$A, f64:$B, f64:$C), (XSMSUBMDP $A, $B, $C)>; 2857*fe6060f1SDimitry Andricdef : Pat<(int_ppc_fnmsub f64:$A, f64:$B, f64:$C), (XSNMSUBMDP $A, $B, $C)>; 2858*fe6060f1SDimitry Andricdef : Pat<(int_ppc_fnmadd f64:$A, f64:$B, f64:$C), (XSNMADDMDP $A, $B, $C)>; 2859*fe6060f1SDimitry Andricdef : Pat<(int_ppc_fre f64:$A), (XSREDP $A)>; 2860*fe6060f1SDimitry Andricdef : Pat<(int_ppc_frsqrte vsfrc:$XB), (XSRSQRTEDP $XB)>; 28615ffd83dbSDimitry Andric} // HasVSX 28620b57cec5SDimitry Andric 28635ffd83dbSDimitry Andric// Any big endian VSX subtarget. 28645ffd83dbSDimitry Andriclet Predicates = [HasVSX, IsBigEndian] in { 28655ffd83dbSDimitry Andricdef : Pat<(v2f64 (scalar_to_vector f64:$A)), 28665ffd83dbSDimitry Andric (v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>; 28670b57cec5SDimitry Andric 28685ffd83dbSDimitry Andricdef : Pat<(f64 (extractelt v2f64:$S, 0)), 28695ffd83dbSDimitry Andric (f64 (EXTRACT_SUBREG $S, sub_64))>; 28705ffd83dbSDimitry Andricdef : Pat<(f64 (extractelt v2f64:$S, 1)), 28715ffd83dbSDimitry Andric (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>; 28725ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))), 28735ffd83dbSDimitry Andric (f64 (XSCVSXDDP (COPY_TO_REGCLASS $S, VSFRC)))>; 28745ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))), 28755ffd83dbSDimitry Andric (f64 (XSCVSXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>; 28765ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))), 28775ffd83dbSDimitry Andric (f64 (XSCVUXDDP (COPY_TO_REGCLASS $S, VSFRC)))>; 28785ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))), 28795ffd83dbSDimitry Andric (f64 (XSCVUXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>; 28800b57cec5SDimitry Andric 28815ffd83dbSDimitry Andricdef : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)), 28825ffd83dbSDimitry Andric (f64 VectorExtractions.BE_VARIABLE_DOUBLE)>; 28830b57cec5SDimitry Andric 28840b57cec5SDimitry Andricdef : Pat<(v2f64 (build_vector f64:$A, f64:$B)), 28850b57cec5SDimitry Andric (v2f64 (XXPERMDI 2886*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), $A, sub_64), 2887*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), $B, sub_64), 0))>; 2888480093f4SDimitry Andric// Using VMRGEW to assemble the final vector would be a lower latency 2889480093f4SDimitry Andric// solution. However, we choose to go with the slightly higher latency 2890480093f4SDimitry Andric// XXPERMDI for 2 reasons: 2891480093f4SDimitry Andric// 1. This is likely to occur in unrolled loops where regpressure is high, 2892480093f4SDimitry Andric// so we want to use the latter as it has access to all 64 VSX registers. 2893480093f4SDimitry Andric// 2. Using Altivec instructions in this sequence would likely cause the 2894480093f4SDimitry Andric// allocation of Altivec registers even for the loads which in turn would 2895480093f4SDimitry Andric// force the use of LXSIWZX for the loads, adding a cycle of latency to 2896480093f4SDimitry Andric// each of the loads which would otherwise be able to use LFIWZX. 2897480093f4SDimitry Andricdef : Pat<(v4f32 (build_vector LoadFP.A, LoadFP.B, LoadFP.C, LoadFP.D)), 2898480093f4SDimitry Andric (v4f32 (XXPERMDI (XXMRGHW MrgFP.LD32A, MrgFP.LD32B), 2899480093f4SDimitry Andric (XXMRGHW MrgFP.LD32C, MrgFP.LD32D), 3))>; 29000b57cec5SDimitry Andricdef : Pat<(v4f32 (build_vector f32:$A, f32:$B, f32:$C, f32:$D)), 29010b57cec5SDimitry Andric (VMRGEW MrgFP.AC, MrgFP.BD)>; 29020b57cec5SDimitry Andricdef : Pat<(v4f32 (build_vector DblToFlt.A0, DblToFlt.A1, 29030b57cec5SDimitry Andric DblToFlt.B0, DblToFlt.B1)), 29040b57cec5SDimitry Andric (v4f32 (VMRGEW MrgFP.ABhToFlt, MrgFP.ABlToFlt))>; 29050b57cec5SDimitry Andric 29060b57cec5SDimitry Andric// Convert 4 doubles to a vector of ints. 29070b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.B, 29080b57cec5SDimitry Andric DblToInt.C, DblToInt.D)), 29090b57cec5SDimitry Andric (v4i32 (VMRGEW MrgWords.CVACS, MrgWords.CVBDS))>; 29100b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.B, 29110b57cec5SDimitry Andric DblToUInt.C, DblToUInt.D)), 29120b57cec5SDimitry Andric (v4i32 (VMRGEW MrgWords.CVACU, MrgWords.CVBDU))>; 29130b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector ExtDbl.A0S, ExtDbl.A1S, 29140b57cec5SDimitry Andric ExtDbl.B0S, ExtDbl.B1S)), 29150b57cec5SDimitry Andric (v4i32 (VMRGEW MrgWords.CVA0B0S, MrgWords.CVA1B1S))>; 29160b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U, 29170b57cec5SDimitry Andric ExtDbl.B0U, ExtDbl.B1U)), 29180b57cec5SDimitry Andric (v4i32 (VMRGEW MrgWords.CVA0B0U, MrgWords.CVA1B1U))>; 29195ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 29205ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 1))))), 29215ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXMRGHW $A, $A)))>; 29225ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))), 29235ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 0))))), 29245ffd83dbSDimitry Andric (v2f64 (XXPERMDI (XVCVSPDP (XXMRGHW $A, $A)), 29255ffd83dbSDimitry Andric (XVCVSPDP (XXMRGHW $A, $A)), 2))>; 29265ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 29275ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 2))))), 29285ffd83dbSDimitry Andric (v2f64 (XVCVSPDP $A))>; 29295ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))), 29305ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 3))))), 29315ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXSLDWI $A, $A, 3)))>; 29325ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 2))), 29335ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 3))))), 29345ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXMRGLW $A, $A)))>; 29355ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))), 29365ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 2))))), 29375ffd83dbSDimitry Andric (v2f64 (XXPERMDI (XVCVSPDP (XXMRGLW $A, $A)), 29385ffd83dbSDimitry Andric (XVCVSPDP (XXMRGLW $A, $A)), 2))>; 29395ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 29405ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$B, 0))))), 29415ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXPERMDI $A, $B, 0)))>; 29425ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))), 29435ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$B, 3))))), 29445ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXSLDWI (XXPERMDI $A, $B, 3), 29455ffd83dbSDimitry Andric (XXPERMDI $A, $B, 3), 1)))>; 2946*fe6060f1SDimitry Andricdef : Pat<(v2i64 (fp_to_sint 2947*fe6060f1SDimitry Andric (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 2948*fe6060f1SDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 2)))))), 2949*fe6060f1SDimitry Andric (v2i64 (XVCVSPSXDS $A))>; 2950*fe6060f1SDimitry Andricdef : Pat<(v2i64 (fp_to_uint 2951*fe6060f1SDimitry Andric (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 2952*fe6060f1SDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 2)))))), 2953*fe6060f1SDimitry Andric (v2i64 (XVCVSPUXDS $A))>; 2954*fe6060f1SDimitry Andricdef : Pat<(v2i64 (fp_to_sint 2955*fe6060f1SDimitry Andric (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))), 2956*fe6060f1SDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 3)))))), 2957*fe6060f1SDimitry Andric (v2i64 (XVCVSPSXDS (XXSLDWI $A, $A, 1)))>; 2958*fe6060f1SDimitry Andricdef : Pat<(v2i64 (fp_to_uint 2959*fe6060f1SDimitry Andric (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))), 2960*fe6060f1SDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 3)))))), 2961*fe6060f1SDimitry Andric (v2i64 (XVCVSPUXDS (XXSLDWI $A, $A, 1)))>; 29625ffd83dbSDimitry Andricdef : Pat<WToDPExtractConv.BV02S, 29635ffd83dbSDimitry Andric (v2f64 (XVCVSXWDP $A))>; 29645ffd83dbSDimitry Andricdef : Pat<WToDPExtractConv.BV13S, 29655ffd83dbSDimitry Andric (v2f64 (XVCVSXWDP (XXSLDWI $A, $A, 3)))>; 29665ffd83dbSDimitry Andricdef : Pat<WToDPExtractConv.BV02U, 29675ffd83dbSDimitry Andric (v2f64 (XVCVUXWDP $A))>; 29685ffd83dbSDimitry Andricdef : Pat<WToDPExtractConv.BV13U, 29695ffd83dbSDimitry Andric (v2f64 (XVCVUXWDP (XXSLDWI $A, $A, 3)))>; 2970*fe6060f1SDimitry Andricdef : Pat<(v2f64 (insertelt v2f64:$A, f64:$B, 0)), 2971*fe6060f1SDimitry Andric (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $B, sub_64), $A, 1))>; 2972*fe6060f1SDimitry Andricdef : Pat<(v2f64 (insertelt v2f64:$A, f64:$B, 1)), 2973*fe6060f1SDimitry Andric (v2f64 (XXPERMDI $A, (SUBREG_TO_REG (i64 1), $B, sub_64), 0))>; 29745ffd83dbSDimitry Andric} // HasVSX, IsBigEndian 29750b57cec5SDimitry Andric 29765ffd83dbSDimitry Andric// Any little endian VSX subtarget. 29775ffd83dbSDimitry Andriclet Predicates = [HasVSX, IsLittleEndian] in { 29785ffd83dbSDimitry Andricdefm : ScalToVecWPermute<v2f64, (f64 f64:$A), 29795ffd83dbSDimitry Andric (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64), 29805ffd83dbSDimitry Andric (SUBREG_TO_REG (i64 1), $A, sub_64), 0), 29815ffd83dbSDimitry Andric (SUBREG_TO_REG (i64 1), $A, sub_64)>; 29820b57cec5SDimitry Andric 2983*fe6060f1SDimitry Andricdef : Pat<(f64 (extractelt (v2f64 (bitconvert (v16i8 2984*fe6060f1SDimitry Andric (PPCvperm v16i8:$A, v16i8:$B, v16i8:$C)))), 0)), 2985*fe6060f1SDimitry Andric (f64 (EXTRACT_SUBREG (VPERM $B, $A, $C), sub_64))>; 29865ffd83dbSDimitry Andricdef : Pat<(f64 (extractelt v2f64:$S, 0)), 29875ffd83dbSDimitry Andric (f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>; 29885ffd83dbSDimitry Andricdef : Pat<(f64 (extractelt v2f64:$S, 1)), 29895ffd83dbSDimitry Andric (f64 (EXTRACT_SUBREG $S, sub_64))>; 29900b57cec5SDimitry Andric 2991*fe6060f1SDimitry Andricdef : Pat<(v2f64 (PPCld_vec_be ForceXForm:$src)), (LXVD2X ForceXForm:$src)>; 2992*fe6060f1SDimitry Andricdef : Pat<(PPCst_vec_be v2f64:$rS, ForceXForm:$dst), (STXVD2X $rS, ForceXForm:$dst)>; 2993*fe6060f1SDimitry Andricdef : Pat<(v4f32 (PPCld_vec_be ForceXForm:$src)), (LXVW4X ForceXForm:$src)>; 2994*fe6060f1SDimitry Andricdef : Pat<(PPCst_vec_be v4f32:$rS, ForceXForm:$dst), (STXVW4X $rS, ForceXForm:$dst)>; 2995*fe6060f1SDimitry Andricdef : Pat<(v2i64 (PPCld_vec_be ForceXForm:$src)), (LXVD2X ForceXForm:$src)>; 2996*fe6060f1SDimitry Andricdef : Pat<(PPCst_vec_be v2i64:$rS, ForceXForm:$dst), (STXVD2X $rS, ForceXForm:$dst)>; 2997*fe6060f1SDimitry Andricdef : Pat<(v4i32 (PPCld_vec_be ForceXForm:$src)), (LXVW4X ForceXForm:$src)>; 2998*fe6060f1SDimitry Andricdef : Pat<(PPCst_vec_be v4i32:$rS, ForceXForm:$dst), (STXVW4X $rS, ForceXForm:$dst)>; 29995ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))), 30005ffd83dbSDimitry Andric (f64 (XSCVSXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>; 30015ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))), 30025ffd83dbSDimitry Andric (f64 (XSCVSXDDP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>; 30035ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 0))))), 30045ffd83dbSDimitry Andric (f64 (XSCVUXDDP (COPY_TO_REGCLASS (XXPERMDI $S, $S, 2), VSFRC)))>; 30055ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (PPCmtvsra (i64 (vector_extract v2i64:$S, 1))))), 30065ffd83dbSDimitry Andric (f64 (XSCVUXDDP (COPY_TO_REGCLASS (f64 (COPY_TO_REGCLASS $S, VSRC)), VSFRC)))>; 30070b57cec5SDimitry Andric 30085ffd83dbSDimitry Andricdef : Pat<(f64 (vector_extract v2f64:$S, i64:$Idx)), 30095ffd83dbSDimitry Andric (f64 VectorExtractions.LE_VARIABLE_DOUBLE)>; 30105ffd83dbSDimitry Andric 30110b57cec5SDimitry Andric// Little endian, available on all targets with VSX 30120b57cec5SDimitry Andricdef : Pat<(v2f64 (build_vector f64:$A, f64:$B)), 30130b57cec5SDimitry Andric (v2f64 (XXPERMDI 3014*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), $B, sub_64), 3015*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), $A, sub_64), 0))>; 3016480093f4SDimitry Andric// Using VMRGEW to assemble the final vector would be a lower latency 3017480093f4SDimitry Andric// solution. However, we choose to go with the slightly higher latency 3018480093f4SDimitry Andric// XXPERMDI for 2 reasons: 3019480093f4SDimitry Andric// 1. This is likely to occur in unrolled loops where regpressure is high, 3020480093f4SDimitry Andric// so we want to use the latter as it has access to all 64 VSX registers. 3021480093f4SDimitry Andric// 2. Using Altivec instructions in this sequence would likely cause the 3022480093f4SDimitry Andric// allocation of Altivec registers even for the loads which in turn would 3023480093f4SDimitry Andric// force the use of LXSIWZX for the loads, adding a cycle of latency to 3024480093f4SDimitry Andric// each of the loads which would otherwise be able to use LFIWZX. 3025480093f4SDimitry Andricdef : Pat<(v4f32 (build_vector LoadFP.A, LoadFP.B, LoadFP.C, LoadFP.D)), 3026480093f4SDimitry Andric (v4f32 (XXPERMDI (XXMRGHW MrgFP.LD32D, MrgFP.LD32C), 3027480093f4SDimitry Andric (XXMRGHW MrgFP.LD32B, MrgFP.LD32A), 3))>; 30280b57cec5SDimitry Andricdef : Pat<(v4f32 (build_vector f32:$D, f32:$C, f32:$B, f32:$A)), 30290b57cec5SDimitry Andric (VMRGEW MrgFP.AC, MrgFP.BD)>; 30300b57cec5SDimitry Andricdef : Pat<(v4f32 (build_vector DblToFlt.A0, DblToFlt.A1, 30310b57cec5SDimitry Andric DblToFlt.B0, DblToFlt.B1)), 30320b57cec5SDimitry Andric (v4f32 (VMRGEW MrgFP.BAhToFlt, MrgFP.BAlToFlt))>; 30330b57cec5SDimitry Andric 30340b57cec5SDimitry Andric// Convert 4 doubles to a vector of ints. 30350b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector DblToInt.A, DblToInt.B, 30360b57cec5SDimitry Andric DblToInt.C, DblToInt.D)), 30370b57cec5SDimitry Andric (v4i32 (VMRGEW MrgWords.CVDBS, MrgWords.CVCAS))>; 30380b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector DblToUInt.A, DblToUInt.B, 30390b57cec5SDimitry Andric DblToUInt.C, DblToUInt.D)), 30400b57cec5SDimitry Andric (v4i32 (VMRGEW MrgWords.CVDBU, MrgWords.CVCAU))>; 30410b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector ExtDbl.A0S, ExtDbl.A1S, 30420b57cec5SDimitry Andric ExtDbl.B0S, ExtDbl.B1S)), 30430b57cec5SDimitry Andric (v4i32 (VMRGEW MrgWords.CVB1A1S, MrgWords.CVB0A0S))>; 30440b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U, 30450b57cec5SDimitry Andric ExtDbl.B0U, ExtDbl.B1U)), 30460b57cec5SDimitry Andric (v4i32 (VMRGEW MrgWords.CVB1A1U, MrgWords.CVB0A0U))>; 30475ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 30485ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 1))))), 30495ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXMRGLW $A, $A)))>; 30505ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))), 30515ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 0))))), 30525ffd83dbSDimitry Andric (v2f64 (XXPERMDI (XVCVSPDP (XXMRGLW $A, $A)), 30535ffd83dbSDimitry Andric (XVCVSPDP (XXMRGLW $A, $A)), 2))>; 30545ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 30555ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 2))))), 30565ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXSLDWI $A, $A, 1)))>; 30575ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))), 30585ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 3))))), 30595ffd83dbSDimitry Andric (v2f64 (XVCVSPDP $A))>; 30605ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 2))), 30615ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 3))))), 30625ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXMRGHW $A, $A)))>; 30635ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))), 30645ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 2))))), 30655ffd83dbSDimitry Andric (v2f64 (XXPERMDI (XVCVSPDP (XXMRGHW $A, $A)), 30665ffd83dbSDimitry Andric (XVCVSPDP (XXMRGHW $A, $A)), 2))>; 30675ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 30685ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$B, 0))))), 30695ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXSLDWI (XXPERMDI $B, $A, 3), 30705ffd83dbSDimitry Andric (XXPERMDI $B, $A, 3), 1)))>; 30715ffd83dbSDimitry Andricdef : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))), 30725ffd83dbSDimitry Andric (f64 (fpextend (extractelt v4f32:$B, 3))))), 30735ffd83dbSDimitry Andric (v2f64 (XVCVSPDP (XXPERMDI $B, $A, 0)))>; 3074*fe6060f1SDimitry Andricdef : Pat<(v2i64 (fp_to_sint 3075*fe6060f1SDimitry Andric (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))), 3076*fe6060f1SDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 3)))))), 3077*fe6060f1SDimitry Andric (v2i64 (XVCVSPSXDS $A))>; 3078*fe6060f1SDimitry Andricdef : Pat<(v2i64 (fp_to_uint 3079*fe6060f1SDimitry Andric (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))), 3080*fe6060f1SDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 3)))))), 3081*fe6060f1SDimitry Andric (v2i64 (XVCVSPUXDS $A))>; 3082*fe6060f1SDimitry Andricdef : Pat<(v2i64 (fp_to_sint 3083*fe6060f1SDimitry Andric (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 3084*fe6060f1SDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 2)))))), 3085*fe6060f1SDimitry Andric (v2i64 (XVCVSPSXDS (XXSLDWI $A, $A, 1)))>; 3086*fe6060f1SDimitry Andricdef : Pat<(v2i64 (fp_to_uint 3087*fe6060f1SDimitry Andric (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))), 3088*fe6060f1SDimitry Andric (f64 (fpextend (extractelt v4f32:$A, 2)))))), 3089*fe6060f1SDimitry Andric (v2i64 (XVCVSPUXDS (XXSLDWI $A, $A, 1)))>; 30905ffd83dbSDimitry Andricdef : Pat<WToDPExtractConv.BV02S, 30915ffd83dbSDimitry Andric (v2f64 (XVCVSXWDP (XXSLDWI $A, $A, 1)))>; 30925ffd83dbSDimitry Andricdef : Pat<WToDPExtractConv.BV13S, 30935ffd83dbSDimitry Andric (v2f64 (XVCVSXWDP $A))>; 30945ffd83dbSDimitry Andricdef : Pat<WToDPExtractConv.BV02U, 30955ffd83dbSDimitry Andric (v2f64 (XVCVUXWDP (XXSLDWI $A, $A, 1)))>; 30965ffd83dbSDimitry Andricdef : Pat<WToDPExtractConv.BV13U, 30975ffd83dbSDimitry Andric (v2f64 (XVCVUXWDP $A))>; 3098*fe6060f1SDimitry Andricdef : Pat<(v2f64 (insertelt v2f64:$A, f64:$B, 0)), 3099*fe6060f1SDimitry Andric (v2f64 (XXPERMDI $A, (SUBREG_TO_REG (i64 1), $B, sub_64), 0))>; 3100*fe6060f1SDimitry Andricdef : Pat<(v2f64 (insertelt v2f64:$A, f64:$B, 1)), 3101*fe6060f1SDimitry Andric (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $B, sub_64), $A, 1))>; 31025ffd83dbSDimitry Andric} // HasVSX, IsLittleEndian 31030b57cec5SDimitry Andric 31045ffd83dbSDimitry Andric// Any pre-Power9 VSX subtarget. 31055ffd83dbSDimitry Andriclet Predicates = [HasVSX, NoP9Vector] in { 31065ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3107*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ForceXForm:$dst, 8), 3108*fe6060f1SDimitry Andric (STXSDX (XSCVDPSXDS f64:$src), ForceXForm:$dst)>; 31095ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3110*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ForceXForm:$dst, 8), 3111*fe6060f1SDimitry Andric (STXSDX (XSCVDPUXDS f64:$src), ForceXForm:$dst)>; 31125ffd83dbSDimitry Andric 31135ffd83dbSDimitry Andric// Load-and-splat with fp-to-int conversion (using X-Form VSX/FP loads). 31145ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 31155ffd83dbSDimitry Andric v4i32, DblToIntLoad.A, 3116*fe6060f1SDimitry Andric (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPSXWS (XFLOADf64 ForceXForm:$A)), sub_64), 1), 3117*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSXWS (XFLOADf64 ForceXForm:$A)), sub_64)>; 31185ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 31195ffd83dbSDimitry Andric v4i32, DblToUIntLoad.A, 3120*fe6060f1SDimitry Andric (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPUXWS (XFLOADf64 ForceXForm:$A)), sub_64), 1), 3121*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPUXWS (XFLOADf64 ForceXForm:$A)), sub_64)>; 31225ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 31235ffd83dbSDimitry Andric v2i64, FltToLongLoad.A, 3124*fe6060f1SDimitry Andric (XXPERMDIs (XSCVDPSXDS (COPY_TO_REGCLASS (XFLOADf32 ForceXForm:$A), VSFRC)), 0), 3125*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSXDS (COPY_TO_REGCLASS (XFLOADf32 ForceXForm:$A), 31265ffd83dbSDimitry Andric VSFRC)), sub_64)>; 31275ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 31285ffd83dbSDimitry Andric v2i64, FltToULongLoad.A, 3129*fe6060f1SDimitry Andric (XXPERMDIs (XSCVDPUXDS (COPY_TO_REGCLASS (XFLOADf32 ForceXForm:$A), VSFRC)), 0), 3130*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPUXDS (COPY_TO_REGCLASS (XFLOADf32 ForceXForm:$A), 31315ffd83dbSDimitry Andric VSFRC)), sub_64)>; 31325ffd83dbSDimitry Andric} // HasVSX, NoP9Vector 31335ffd83dbSDimitry Andric 3134e8d8bef9SDimitry Andric// Any little endian pre-Power9 VSX subtarget. 3135e8d8bef9SDimitry Andriclet Predicates = [HasVSX, NoP9Vector, IsLittleEndian] in { 3136e8d8bef9SDimitry Andric// Load-and-splat using only X-Form VSX loads. 3137e8d8bef9SDimitry Andricdefm : ScalToVecWPermute< 3138*fe6060f1SDimitry Andric v2i64, (i64 (load ForceXForm:$src)), 3139*fe6060f1SDimitry Andric (XXPERMDIs (XFLOADf64 ForceXForm:$src), 2), 3140*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XFLOADf64 ForceXForm:$src), sub_64)>; 3141e8d8bef9SDimitry Andricdefm : ScalToVecWPermute< 3142*fe6060f1SDimitry Andric v2f64, (f64 (load ForceXForm:$src)), 3143*fe6060f1SDimitry Andric (XXPERMDIs (XFLOADf64 ForceXForm:$src), 2), 3144*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XFLOADf64 ForceXForm:$src), sub_64)>; 3145e8d8bef9SDimitry Andric} // HasVSX, NoP9Vector, IsLittleEndian 3146e8d8bef9SDimitry Andric 3147*fe6060f1SDimitry Andriclet Predicates = [HasVSX, NoP9Vector, IsBigEndian] in { 3148*fe6060f1SDimitry Andric def : Pat<(v2f64 (int_ppc_vsx_lxvd2x ForceXForm:$src)), 3149*fe6060f1SDimitry Andric (LXVD2X ForceXForm:$src)>; 3150*fe6060f1SDimitry Andric def : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, ForceXForm:$dst), 3151*fe6060f1SDimitry Andric (STXVD2X $rS, ForceXForm:$dst)>; 3152*fe6060f1SDimitry Andric} // HasVSX, NoP9Vector, IsBigEndian 3153*fe6060f1SDimitry Andric 31545ffd83dbSDimitry Andric// Any VSX subtarget that only has loads and stores that load in big endian 31555ffd83dbSDimitry Andric// order regardless of endianness. This is really pre-Power9 subtargets. 31565ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasOnlySwappingMemOps] in { 3157*fe6060f1SDimitry Andric def : Pat<(v2f64 (PPClxvd2x ForceXForm:$src)), (LXVD2X ForceXForm:$src)>; 31585ffd83dbSDimitry Andric 31595ffd83dbSDimitry Andric // Stores. 3160*fe6060f1SDimitry Andric def : Pat<(PPCstxvd2x v2f64:$rS, ForceXForm:$dst), (STXVD2X $rS, ForceXForm:$dst)>; 31615ffd83dbSDimitry Andric} // HasVSX, HasOnlySwappingMemOps 31625ffd83dbSDimitry Andric 3163e8d8bef9SDimitry Andric// Big endian VSX subtarget that only has loads and stores that always 3164e8d8bef9SDimitry Andric// load in big endian order. Really big endian pre-Power9 subtargets. 31655ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasOnlySwappingMemOps, IsBigEndian] in { 3166*fe6060f1SDimitry Andric def : Pat<(v2f64 (load ForceXForm:$src)), (LXVD2X ForceXForm:$src)>; 3167*fe6060f1SDimitry Andric def : Pat<(v2i64 (load ForceXForm:$src)), (LXVD2X ForceXForm:$src)>; 3168*fe6060f1SDimitry Andric def : Pat<(v4i32 (load ForceXForm:$src)), (LXVW4X ForceXForm:$src)>; 3169*fe6060f1SDimitry Andric def : Pat<(v4i32 (int_ppc_vsx_lxvw4x ForceXForm:$src)), (LXVW4X ForceXForm:$src)>; 3170*fe6060f1SDimitry Andric def : Pat<(store v2f64:$rS, ForceXForm:$dst), (STXVD2X $rS, ForceXForm:$dst)>; 3171*fe6060f1SDimitry Andric def : Pat<(store v2i64:$rS, ForceXForm:$dst), (STXVD2X $rS, ForceXForm:$dst)>; 3172*fe6060f1SDimitry Andric def : Pat<(store v4i32:$XT, ForceXForm:$dst), (STXVW4X $XT, ForceXForm:$dst)>; 3173*fe6060f1SDimitry Andric def : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, ForceXForm:$dst), 3174*fe6060f1SDimitry Andric (STXVW4X $rS, ForceXForm:$dst)>; 3175*fe6060f1SDimitry Andric def : Pat<(v2i64 (scalar_to_vector (i64 (load ForceXForm:$src)))), 3176*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XFLOADf64 ForceXForm:$src), sub_64)>; 31775ffd83dbSDimitry Andric} // HasVSX, HasOnlySwappingMemOps, IsBigEndian 31785ffd83dbSDimitry Andric 31795ffd83dbSDimitry Andric// Any Power8 VSX subtarget. 31805ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP8Vector] in { 31815ffd83dbSDimitry Andricdef : Pat<(int_ppc_vsx_xxleqv v4i32:$A, v4i32:$B), 31825ffd83dbSDimitry Andric (XXLEQV $A, $B)>; 3183*fe6060f1SDimitry Andricdef : Pat<(f64 (extloadf32 XForm:$src)), 3184*fe6060f1SDimitry Andric (COPY_TO_REGCLASS (XFLOADf32 XForm:$src), VSFRC)>; 3185*fe6060f1SDimitry Andricdef : Pat<(f32 (fpround (f64 (extloadf32 ForceXForm:$src)))), 3186*fe6060f1SDimitry Andric (f32 (XFLOADf32 ForceXForm:$src))>; 31875ffd83dbSDimitry Andricdef : Pat<(f64 (any_fpextend f32:$src)), 31885ffd83dbSDimitry Andric (COPY_TO_REGCLASS $src, VSFRC)>; 31895ffd83dbSDimitry Andric 31905ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)), 31915ffd83dbSDimitry Andric (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>; 31925ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)), 31935ffd83dbSDimitry Andric (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>; 31945ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)), 31955ffd83dbSDimitry Andric (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>; 31965ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)), 31975ffd83dbSDimitry Andric (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>; 31985ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)), 31995ffd83dbSDimitry Andric (SELECT_VSSRC (CREQV $lhs, $rhs), $tval, $fval)>; 32005ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)), 32015ffd83dbSDimitry Andric (SELECT_VSSRC (CRORC $rhs, $lhs), $tval, $fval)>; 32025ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)), 32035ffd83dbSDimitry Andric (SELECT_VSSRC (CRORC $lhs, $rhs), $tval, $fval)>; 32045ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)), 32055ffd83dbSDimitry Andric (SELECT_VSSRC (CRANDC $rhs, $lhs), $tval, $fval)>; 32065ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)), 32075ffd83dbSDimitry Andric (SELECT_VSSRC (CRANDC $lhs, $rhs), $tval, $fval)>; 32085ffd83dbSDimitry Andricdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)), 32095ffd83dbSDimitry Andric (SELECT_VSSRC (CRXOR $lhs, $rhs), $tval, $fval)>; 32105ffd83dbSDimitry Andric 32115ffd83dbSDimitry Andric// Additional fnmsub pattern for PPC specific ISD opcode 32125ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub f32:$A, f32:$B, f32:$C), 32135ffd83dbSDimitry Andric (XSNMSUBASP $C, $A, $B)>; 32145ffd83dbSDimitry Andricdef : Pat<(fneg (PPCfnmsub f32:$A, f32:$B, f32:$C)), 32155ffd83dbSDimitry Andric (XSMSUBASP $C, $A, $B)>; 32165ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub f32:$A, f32:$B, (fneg f32:$C)), 32175ffd83dbSDimitry Andric (XSNMADDASP $C, $A, $B)>; 32185ffd83dbSDimitry Andric 32195ffd83dbSDimitry Andric// f32 neg 32205ffd83dbSDimitry Andric// Although XSNEGDP is available in P7, we want to select it starting from P8, 32215ffd83dbSDimitry Andric// so that FNMSUBS can be selected for fneg-fmsub pattern on P7. (VSX version, 32225ffd83dbSDimitry Andric// XSNMSUBASP, is available since P8) 32235ffd83dbSDimitry Andricdef : Pat<(f32 (fneg f32:$S)), 32245ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSNEGDP 32255ffd83dbSDimitry Andric (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; 32265ffd83dbSDimitry Andric 32275ffd83dbSDimitry Andric// Instructions for converting float to i32 feeding a store. 32285ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3229*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ForceXForm:$dst, 4), 3230*fe6060f1SDimitry Andric (STIWX (XSCVDPSXWS f64:$src), ForceXForm:$dst)>; 32315ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3232*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ForceXForm:$dst, 4), 3233*fe6060f1SDimitry Andric (STIWX (XSCVDPUXWS f64:$src), ForceXForm:$dst)>; 32345ffd83dbSDimitry Andric 32355ffd83dbSDimitry Andricdef : Pat<(v2i64 (smax v2i64:$src1, v2i64:$src2)), 32365ffd83dbSDimitry Andric (v2i64 (VMAXSD (COPY_TO_REGCLASS $src1, VRRC), 32375ffd83dbSDimitry Andric (COPY_TO_REGCLASS $src2, VRRC)))>; 32385ffd83dbSDimitry Andricdef : Pat<(v2i64 (umax v2i64:$src1, v2i64:$src2)), 32395ffd83dbSDimitry Andric (v2i64 (VMAXUD (COPY_TO_REGCLASS $src1, VRRC), 32405ffd83dbSDimitry Andric (COPY_TO_REGCLASS $src2, VRRC)))>; 32415ffd83dbSDimitry Andricdef : Pat<(v2i64 (smin v2i64:$src1, v2i64:$src2)), 32425ffd83dbSDimitry Andric (v2i64 (VMINSD (COPY_TO_REGCLASS $src1, VRRC), 32435ffd83dbSDimitry Andric (COPY_TO_REGCLASS $src2, VRRC)))>; 32445ffd83dbSDimitry Andricdef : Pat<(v2i64 (umin v2i64:$src1, v2i64:$src2)), 32455ffd83dbSDimitry Andric (v2i64 (VMINUD (COPY_TO_REGCLASS $src1, VRRC), 32465ffd83dbSDimitry Andric (COPY_TO_REGCLASS $src2, VRRC)))>; 32475ffd83dbSDimitry Andric 32485ffd83dbSDimitry Andricdef : Pat<(v1i128 (bitconvert (v16i8 immAllOnesV))), 32495ffd83dbSDimitry Andric (v1i128 (COPY_TO_REGCLASS(XXLEQVOnes), VSRC))>; 32505ffd83dbSDimitry Andricdef : Pat<(v2i64 (bitconvert (v16i8 immAllOnesV))), 32515ffd83dbSDimitry Andric (v2i64 (COPY_TO_REGCLASS(XXLEQVOnes), VSRC))>; 32525ffd83dbSDimitry Andricdef : Pat<(v8i16 (bitconvert (v16i8 immAllOnesV))), 32535ffd83dbSDimitry Andric (v8i16 (COPY_TO_REGCLASS(XXLEQVOnes), VSRC))>; 32545ffd83dbSDimitry Andricdef : Pat<(v16i8 (bitconvert (v16i8 immAllOnesV))), 32555ffd83dbSDimitry Andric (v16i8 (COPY_TO_REGCLASS(XXLEQVOnes), VSRC))>; 3256*fe6060f1SDimitry Andric 3257*fe6060f1SDimitry Andric// XL Compat builtins. 3258*fe6060f1SDimitry Andricdef : Pat<(int_ppc_fmsubs f32:$A, f32:$B, f32:$C), (XSMSUBMSP $A, $B, $C)>; 3259*fe6060f1SDimitry Andricdef : Pat<(int_ppc_fnmsubs f32:$A, f32:$B, f32:$C), (XSNMSUBMSP $A, $B, $C)>; 3260*fe6060f1SDimitry Andricdef : Pat<(int_ppc_fnmadds f32:$A, f32:$B, f32:$C), (XSNMADDMSP $A, $B, $C)>; 3261*fe6060f1SDimitry Andricdef : Pat<(int_ppc_fres f32:$A), (XSRESP $A)>; 3262*fe6060f1SDimitry Andricdef : Pat<(i32 (int_ppc_extract_exp f64:$A)), 3263*fe6060f1SDimitry Andric (EXTRACT_SUBREG (XSXEXPDP (COPY_TO_REGCLASS $A, VSFRC)), sub_32)>; 3264*fe6060f1SDimitry Andricdef : Pat<(int_ppc_extract_sig f64:$A), 3265*fe6060f1SDimitry Andric (XSXSIGDP (COPY_TO_REGCLASS $A, VSFRC))>; 3266*fe6060f1SDimitry Andricdef : Pat<(f64 (int_ppc_insert_exp f64:$A, i64:$B)), 3267*fe6060f1SDimitry Andric (COPY_TO_REGCLASS (XSIEXPDP (COPY_TO_REGCLASS $A, G8RC), $B), F8RC)>; 3268*fe6060f1SDimitry Andric 3269*fe6060f1SDimitry Andricdef : Pat<(int_ppc_stfiw ForceXForm:$dst, f64:$XT), 3270*fe6060f1SDimitry Andric (STXSIWX f64:$XT, ForceXForm:$dst)>; 3271*fe6060f1SDimitry Andricdef : Pat<(int_ppc_frsqrtes vssrc:$XB), (XSRSQRTESP $XB)>; 32725ffd83dbSDimitry Andric} // HasVSX, HasP8Vector 32735ffd83dbSDimitry Andric 3274*fe6060f1SDimitry Andric// Any big endian Power8 VSX subtarget. 3275*fe6060f1SDimitry Andriclet Predicates = [HasVSX, HasP8Vector, IsBigEndian] in { 32765ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.El0SS1, 32775ffd83dbSDimitry Andric (f32 (XSCVSXDSP (COPY_TO_REGCLASS $S1, VSFRC)))>; 32785ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.El1SS1, 32795ffd83dbSDimitry Andric (f32 (XSCVSXDSP (COPY_TO_REGCLASS (XXPERMDI $S1, $S1, 2), VSFRC)))>; 32805ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.El0US1, 32815ffd83dbSDimitry Andric (f32 (XSCVUXDSP (COPY_TO_REGCLASS $S1, VSFRC)))>; 32825ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.El1US1, 32835ffd83dbSDimitry Andric (f32 (XSCVUXDSP (COPY_TO_REGCLASS (XXPERMDI $S1, $S1, 2), VSFRC)))>; 32845ffd83dbSDimitry Andric 32855ffd83dbSDimitry Andric// v4f32 scalar <-> vector conversions (BE) 3286*fe6060f1SDimitry Andricdefm : ScalToVecWPermute<v4f32, (f32 f32:$A), (XSCVDPSPN $A), (XSCVDPSPN $A)>; 32875ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, 0)), 32885ffd83dbSDimitry Andric (f32 (XSCVSPDPN $S))>; 32895ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, 1)), 32905ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>; 32915ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, 2)), 32925ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>; 32935ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, 3)), 32945ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>; 32955ffd83dbSDimitry Andric 32965ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))), 32975ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 0))))>; 32985ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))), 32995ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 1))))>; 33005ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))), 33015ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 2))))>; 33025ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))), 33035ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 3))))>; 33045ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))), 33055ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 0)), VSFRC))>; 33065ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))), 33075ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 1)), VSFRC))>; 33085ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))), 33095ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 2)), VSFRC))>; 33105ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))), 33115ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 3)), VSFRC))>; 33125ffd83dbSDimitry Andric 3313*fe6060f1SDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, i32:$Idx)), 3314*fe6060f1SDimitry Andric (f32 VectorExtractions.BE_32B_VARIABLE_FLOAT)>; 3315*fe6060f1SDimitry Andric 3316*fe6060f1SDimitry Andricdef : Pat<(f64 (vector_extract v2f64:$S, i32:$Idx)), 3317*fe6060f1SDimitry Andric (f64 VectorExtractions.BE_32B_VARIABLE_DOUBLE)>; 3318*fe6060f1SDimitry Andric} // HasVSX, HasP8Vector, IsBigEndian 3319*fe6060f1SDimitry Andric 3320*fe6060f1SDimitry Andric// Big endian Power8 64Bit VSX subtarget. 3321*fe6060f1SDimitry Andriclet Predicates = [HasVSX, HasP8Vector, IsBigEndian, IsPPC64] in { 3322*fe6060f1SDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)), 3323*fe6060f1SDimitry Andric (f32 VectorExtractions.BE_VARIABLE_FLOAT)>; 3324*fe6060f1SDimitry Andric 33255ffd83dbSDimitry Andric// LIWAX - This instruction is used for sign extending i32 -> i64. 33265ffd83dbSDimitry Andric// LIWZX - This instruction will be emitted for i32, f32, and when 33275ffd83dbSDimitry Andric// zero-extending i32 to i64 (zext i32 -> i64). 3328*fe6060f1SDimitry Andricdef : Pat<(v2i64 (scalar_to_vector (i64 (sextloadi32 ForceXForm:$src)))), 3329*fe6060f1SDimitry Andric (v2i64 (SUBREG_TO_REG (i64 1), (LIWAX ForceXForm:$src), sub_64))>; 3330*fe6060f1SDimitry Andricdef : Pat<(v2i64 (scalar_to_vector (i64 (zextloadi32 ForceXForm:$src)))), 3331*fe6060f1SDimitry Andric (v2i64 (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$src), sub_64))>; 3332*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3333*fe6060f1SDimitry Andric v4i32, (i32 (load ForceXForm:$src)), 3334*fe6060f1SDimitry Andric (XXSLDWIs (LIWZX ForceXForm:$src), 1), 3335*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$src), sub_64)>; 3336*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3337*fe6060f1SDimitry Andric v4f32, (f32 (load ForceXForm:$src)), 3338*fe6060f1SDimitry Andric (XXSLDWIs (LIWZX ForceXForm:$src), 1), 3339*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$src), sub_64)>; 33405ffd83dbSDimitry Andric 33415ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.BVU, 33425ffd83dbSDimitry Andric (v4f32 (VPKUDUM (XXSLDWI (XVCVUXDSP $S1), (XVCVUXDSP $S1), 3), 33435ffd83dbSDimitry Andric (XXSLDWI (XVCVUXDSP $S2), (XVCVUXDSP $S2), 3)))>; 33445ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.BVS, 33455ffd83dbSDimitry Andric (v4f32 (VPKUDUM (XXSLDWI (XVCVSXDSP $S1), (XVCVSXDSP $S1), 3), 33465ffd83dbSDimitry Andric (XXSLDWI (XVCVSXDSP $S2), (XVCVSXDSP $S2), 3)))>; 3347*fe6060f1SDimitry Andricdef : Pat<(store (i32 (extractelt v4i32:$A, 1)), ForceXForm:$src), 3348*fe6060f1SDimitry Andric (STIWX (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 3349*fe6060f1SDimitry Andricdef : Pat<(store (f32 (extractelt v4f32:$A, 1)), ForceXForm:$src), 3350*fe6060f1SDimitry Andric (STIWX (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 33515ffd83dbSDimitry Andric 33525ffd83dbSDimitry Andric// Elements in a register on a BE system are in order <0, 1, 2, 3>. 33535ffd83dbSDimitry Andric// The store instructions store the second word from the left. 33545ffd83dbSDimitry Andric// So to align element zero, we need to modulo-left-shift by 3 words. 33555ffd83dbSDimitry Andric// Similar logic applies for elements 2 and 3. 33565ffd83dbSDimitry Andricforeach Idx = [ [0,3], [2,1], [3,2] ] in { 3357*fe6060f1SDimitry Andric def : Pat<(store (i32 (extractelt v4i32:$A, !head(Idx))), ForceXForm:$src), 33585ffd83dbSDimitry Andric (STIWX (EXTRACT_SUBREG (XXSLDWI $A, $A, !head(!tail(Idx))), 3359*fe6060f1SDimitry Andric sub_64), ForceXForm:$src)>; 3360*fe6060f1SDimitry Andric def : Pat<(store (f32 (extractelt v4f32:$A, !head(Idx))), ForceXForm:$src), 33615ffd83dbSDimitry Andric (STIWX (EXTRACT_SUBREG (XXSLDWI $A, $A, !head(!tail(Idx))), 3362*fe6060f1SDimitry Andric sub_64), ForceXForm:$src)>; 33635ffd83dbSDimitry Andric} 3364e8d8bef9SDimitry Andric} // HasVSX, HasP8Vector, IsBigEndian, IsPPC64 33655ffd83dbSDimitry Andric 33665ffd83dbSDimitry Andric// Little endian Power8 VSX subtarget. 33675ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP8Vector, IsLittleEndian] in { 33685ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.El0SS1, 33695ffd83dbSDimitry Andric (f32 (XSCVSXDSP (COPY_TO_REGCLASS (XXPERMDI $S1, $S1, 2), VSFRC)))>; 33705ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.El1SS1, 33715ffd83dbSDimitry Andric (f32 (XSCVSXDSP (COPY_TO_REGCLASS 33725ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS $S1, VSRC)), VSFRC)))>; 33735ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.El0US1, 33745ffd83dbSDimitry Andric (f32 (XSCVUXDSP (COPY_TO_REGCLASS (XXPERMDI $S1, $S1, 2), VSFRC)))>; 33755ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.El1US1, 33765ffd83dbSDimitry Andric (f32 (XSCVUXDSP (COPY_TO_REGCLASS 33775ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS $S1, VSRC)), VSFRC)))>; 33785ffd83dbSDimitry Andric 33795ffd83dbSDimitry Andric// v4f32 scalar <-> vector conversions (LE) 33805ffd83dbSDimitry Andric defm : ScalToVecWPermute<v4f32, (f32 f32:$A), 33815ffd83dbSDimitry Andric (XXSLDWI (XSCVDPSPN $A), (XSCVDPSPN $A), 1), 3382*fe6060f1SDimitry Andric (XSCVDPSPN $A)>; 33835ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, 0)), 33845ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XXSLDWI $S, $S, 3)))>; 33855ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, 1)), 33865ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XXPERMDI $S, $S, 2)))>; 33875ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, 2)), 33885ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XXSLDWI $S, $S, 1)))>; 33895ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, 3)), 33905ffd83dbSDimitry Andric (f32 (XSCVSPDPN $S))>; 33915ffd83dbSDimitry Andricdef : Pat<(f32 (vector_extract v4f32:$S, i64:$Idx)), 33925ffd83dbSDimitry Andric (f32 VectorExtractions.LE_VARIABLE_FLOAT)>; 33935ffd83dbSDimitry Andric 33945ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))), 33955ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 3))))>; 33965ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))), 33975ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 2))))>; 33985ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))), 33995ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 1))))>; 34005ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfids (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))), 34015ffd83dbSDimitry Andric (f32 (XSCVSPDPN (XVCVSXWSP (XXSPLTW $A, 0))))>; 34025ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 0)))))), 34035ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 3)), VSFRC))>; 34045ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 1)))))), 34055ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 2)), VSFRC))>; 34065ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 2)))))), 34075ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 1)), VSFRC))>; 34085ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfid (f64 (PPCmtvsra (i32 (extractelt v4i32:$A, 3)))))), 34095ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (XVCVSXWDP (XXSPLTW $A, 0)), VSFRC))>; 34105ffd83dbSDimitry Andric 34115ffd83dbSDimitry Andric// LIWAX - This instruction is used for sign extending i32 -> i64. 34125ffd83dbSDimitry Andric// LIWZX - This instruction will be emitted for i32, f32, and when 34135ffd83dbSDimitry Andric// zero-extending i32 to i64 (zext i32 -> i64). 34145ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 3415*fe6060f1SDimitry Andric v2i64, (i64 (sextloadi32 ForceXForm:$src)), 3416*fe6060f1SDimitry Andric (XXPERMDIs (LIWAX ForceXForm:$src), 2), 3417*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LIWAX ForceXForm:$src), sub_64)>; 34185ffd83dbSDimitry Andric 34195ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 3420*fe6060f1SDimitry Andric v2i64, (i64 (zextloadi32 ForceXForm:$src)), 3421*fe6060f1SDimitry Andric (XXPERMDIs (LIWZX ForceXForm:$src), 2), 3422*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$src), sub_64)>; 34235ffd83dbSDimitry Andric 34245ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 3425*fe6060f1SDimitry Andric v4i32, (i32 (load ForceXForm:$src)), 3426*fe6060f1SDimitry Andric (XXPERMDIs (LIWZX ForceXForm:$src), 2), 3427*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$src), sub_64)>; 34285ffd83dbSDimitry Andric 34295ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 3430*fe6060f1SDimitry Andric v4f32, (f32 (load ForceXForm:$src)), 3431*fe6060f1SDimitry Andric (XXPERMDIs (LIWZX ForceXForm:$src), 2), 3432*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$src), sub_64)>; 34335ffd83dbSDimitry Andric 34345ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.BVU, 34355ffd83dbSDimitry Andric (v4f32 (VPKUDUM (XXSLDWI (XVCVUXDSP $S2), (XVCVUXDSP $S2), 3), 34365ffd83dbSDimitry Andric (XXSLDWI (XVCVUXDSP $S1), (XVCVUXDSP $S1), 3)))>; 34375ffd83dbSDimitry Andricdef : Pat<DWToSPExtractConv.BVS, 34385ffd83dbSDimitry Andric (v4f32 (VPKUDUM (XXSLDWI (XVCVSXDSP $S2), (XVCVSXDSP $S2), 3), 34395ffd83dbSDimitry Andric (XXSLDWI (XVCVSXDSP $S1), (XVCVSXDSP $S1), 3)))>; 3440*fe6060f1SDimitry Andricdef : Pat<(store (i32 (extractelt v4i32:$A, 2)), ForceXForm:$src), 3441*fe6060f1SDimitry Andric (STIWX (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 3442*fe6060f1SDimitry Andricdef : Pat<(store (f32 (extractelt v4f32:$A, 2)), ForceXForm:$src), 3443*fe6060f1SDimitry Andric (STIWX (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 34445ffd83dbSDimitry Andric 34455ffd83dbSDimitry Andric// Elements in a register on a LE system are in order <3, 2, 1, 0>. 34465ffd83dbSDimitry Andric// The store instructions store the second word from the left. 34475ffd83dbSDimitry Andric// So to align element 3, we need to modulo-left-shift by 3 words. 34485ffd83dbSDimitry Andric// Similar logic applies for elements 0 and 1. 34495ffd83dbSDimitry Andricforeach Idx = [ [0,2], [1,1], [3,3] ] in { 3450*fe6060f1SDimitry Andric def : Pat<(store (i32 (extractelt v4i32:$A, !head(Idx))), ForceXForm:$src), 34515ffd83dbSDimitry Andric (STIWX (EXTRACT_SUBREG (XXSLDWI $A, $A, !head(!tail(Idx))), 3452*fe6060f1SDimitry Andric sub_64), ForceXForm:$src)>; 3453*fe6060f1SDimitry Andric def : Pat<(store (f32 (extractelt v4f32:$A, !head(Idx))), ForceXForm:$src), 34545ffd83dbSDimitry Andric (STIWX (EXTRACT_SUBREG (XXSLDWI $A, $A, !head(!tail(Idx))), 3455*fe6060f1SDimitry Andric sub_64), ForceXForm:$src)>; 34565ffd83dbSDimitry Andric} 34575ffd83dbSDimitry Andric} // HasVSX, HasP8Vector, IsLittleEndian 34585ffd83dbSDimitry Andric 34595ffd83dbSDimitry Andric// Big endian pre-Power9 VSX subtarget. 3460e8d8bef9SDimitry Andriclet Predicates = [HasVSX, HasP8Vector, NoP9Vector, IsBigEndian, IsPPC64] in { 3461*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 0)), ForceXForm:$src), 3462*fe6060f1SDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 3463*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 0)), ForceXForm:$src), 3464*fe6060f1SDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 3465*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 1)), ForceXForm:$src), 34665ffd83dbSDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), sub_64), 3467*fe6060f1SDimitry Andric ForceXForm:$src)>; 3468*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 1)), ForceXForm:$src), 34695ffd83dbSDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), sub_64), 3470*fe6060f1SDimitry Andric ForceXForm:$src)>; 3471e8d8bef9SDimitry Andric} // HasVSX, HasP8Vector, NoP9Vector, IsBigEndian, IsPPC64 34725ffd83dbSDimitry Andric 34735ffd83dbSDimitry Andric// Little endian pre-Power9 VSX subtarget. 34745ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP8Vector, NoP9Vector, IsLittleEndian] in { 3475*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 0)), ForceXForm:$src), 34765ffd83dbSDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), sub_64), 3477*fe6060f1SDimitry Andric ForceXForm:$src)>; 3478*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 0)), ForceXForm:$src), 34795ffd83dbSDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), sub_64), 3480*fe6060f1SDimitry Andric ForceXForm:$src)>; 3481*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 1)), ForceXForm:$src), 3482*fe6060f1SDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 3483*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 1)), ForceXForm:$src), 3484*fe6060f1SDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), ForceXForm:$src)>; 34855ffd83dbSDimitry Andric} // HasVSX, HasP8Vector, NoP9Vector, IsLittleEndian 34865ffd83dbSDimitry Andric 34875ffd83dbSDimitry Andric// Any VSX target with direct moves. 34885ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasDirectMove] in { 34895ffd83dbSDimitry Andric// bitconvert f32 -> i32 34905ffd83dbSDimitry Andric// (convert to 32-bit fp single, shift right 1 word, move to GPR) 3491*fe6060f1SDimitry Andricdef : Pat<(i32 (bitconvert f32:$A)), Bitcast.FltToInt>; 3492*fe6060f1SDimitry Andric 34935ffd83dbSDimitry Andric// bitconvert i32 -> f32 34945ffd83dbSDimitry Andric// (move to FPR, shift left 1 word, convert to 64-bit fp single) 34955ffd83dbSDimitry Andricdef : Pat<(f32 (bitconvert i32:$A)), 34965ffd83dbSDimitry Andric (f32 (XSCVSPDPN 34975ffd83dbSDimitry Andric (XXSLDWI MovesToVSR.LE_WORD_1, MovesToVSR.LE_WORD_1, 1)))>; 34985ffd83dbSDimitry Andric 34995ffd83dbSDimitry Andric// bitconvert f64 -> i64 35005ffd83dbSDimitry Andric// (move to GPR, nothing else needed) 3501*fe6060f1SDimitry Andricdef : Pat<(i64 (bitconvert f64:$A)), Bitcast.DblToLong>; 35025ffd83dbSDimitry Andric 35035ffd83dbSDimitry Andric// bitconvert i64 -> f64 35045ffd83dbSDimitry Andric// (move to FPR, nothing else needed) 35055ffd83dbSDimitry Andricdef : Pat<(f64 (bitconvert i64:$S)), 35065ffd83dbSDimitry Andric (f64 (MTVSRD $S))>; 35075ffd83dbSDimitry Andric 35085ffd83dbSDimitry Andric// Rounding to integer. 35095ffd83dbSDimitry Andricdef : Pat<(i64 (lrint f64:$S)), 35105ffd83dbSDimitry Andric (i64 (MFVSRD (FCTID $S)))>; 35115ffd83dbSDimitry Andricdef : Pat<(i64 (lrint f32:$S)), 35125ffd83dbSDimitry Andric (i64 (MFVSRD (FCTID (COPY_TO_REGCLASS $S, F8RC))))>; 35135ffd83dbSDimitry Andricdef : Pat<(i64 (llrint f64:$S)), 35145ffd83dbSDimitry Andric (i64 (MFVSRD (FCTID $S)))>; 35155ffd83dbSDimitry Andricdef : Pat<(i64 (llrint f32:$S)), 35165ffd83dbSDimitry Andric (i64 (MFVSRD (FCTID (COPY_TO_REGCLASS $S, F8RC))))>; 35175ffd83dbSDimitry Andricdef : Pat<(i64 (lround f64:$S)), 35185ffd83dbSDimitry Andric (i64 (MFVSRD (FCTID (XSRDPI $S))))>; 35195ffd83dbSDimitry Andricdef : Pat<(i64 (lround f32:$S)), 35205ffd83dbSDimitry Andric (i64 (MFVSRD (FCTID (XSRDPI (COPY_TO_REGCLASS $S, VSFRC)))))>; 35215ffd83dbSDimitry Andricdef : Pat<(i64 (llround f64:$S)), 35225ffd83dbSDimitry Andric (i64 (MFVSRD (FCTID (XSRDPI $S))))>; 35235ffd83dbSDimitry Andricdef : Pat<(i64 (llround f32:$S)), 35245ffd83dbSDimitry Andric (i64 (MFVSRD (FCTID (XSRDPI (COPY_TO_REGCLASS $S, VSFRC)))))>; 35255ffd83dbSDimitry Andric 35265ffd83dbSDimitry Andric// Alternate patterns for PPCmtvsrz where the output is v8i16 or v16i8 instead 35275ffd83dbSDimitry Andric// of f64 35285ffd83dbSDimitry Andricdef : Pat<(v8i16 (PPCmtvsrz i32:$A)), 35295ffd83dbSDimitry Andric (v8i16 (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64))>; 35305ffd83dbSDimitry Andricdef : Pat<(v16i8 (PPCmtvsrz i32:$A)), 35315ffd83dbSDimitry Andric (v16i8 (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64))>; 35325ffd83dbSDimitry Andric 35330b57cec5SDimitry Andric// Endianness-neutral constant splat on P8 and newer targets. The reason 35340b57cec5SDimitry Andric// for this pattern is that on targets with direct moves, we don't expand 35350b57cec5SDimitry Andric// BUILD_VECTOR nodes for v4i32. 35360b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector immSExt5NonZero:$A, immSExt5NonZero:$A, 35370b57cec5SDimitry Andric immSExt5NonZero:$A, immSExt5NonZero:$A)), 35380b57cec5SDimitry Andric (v4i32 (VSPLTISW imm:$A))>; 35395ffd83dbSDimitry Andric} // HasVSX, HasDirectMove 35400b57cec5SDimitry Andric 35415ffd83dbSDimitry Andric// Big endian VSX subtarget with direct moves. 35425ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasDirectMove, IsBigEndian] in { 35435ffd83dbSDimitry Andric// v16i8 scalar <-> vector conversions (BE) 3544*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3545*fe6060f1SDimitry Andric v16i8, (i32 i32:$A), 3546*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64), 3547*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64)>; 3548*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3549*fe6060f1SDimitry Andric v8i16, (i32 i32:$A), 3550*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), MovesToVSR.BE_BYTE_0, sub_64), 3551*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64)>; 3552*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3553*fe6060f1SDimitry Andric v4i32, (i32 i32:$A), 3554*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), MovesToVSR.BE_WORD_0, sub_64), 3555*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64)>; 35565ffd83dbSDimitry Andricdef : Pat<(v2i64 (scalar_to_vector i64:$A)), 35575ffd83dbSDimitry Andric (v2i64 (SUBREG_TO_REG (i64 1), MovesToVSR.BE_DWORD_0, sub_64))>; 35585ffd83dbSDimitry Andric 35595ffd83dbSDimitry Andric// v2i64 scalar <-> vector conversions (BE) 35605ffd83dbSDimitry Andricdef : Pat<(i64 (vector_extract v2i64:$S, 0)), 35615ffd83dbSDimitry Andric (i64 VectorExtractions.LE_DWORD_1)>; 35625ffd83dbSDimitry Andricdef : Pat<(i64 (vector_extract v2i64:$S, 1)), 35635ffd83dbSDimitry Andric (i64 VectorExtractions.LE_DWORD_0)>; 35645ffd83dbSDimitry Andricdef : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)), 35655ffd83dbSDimitry Andric (i64 VectorExtractions.BE_VARIABLE_DWORD)>; 35665ffd83dbSDimitry Andric} // HasVSX, HasDirectMove, IsBigEndian 35675ffd83dbSDimitry Andric 35685ffd83dbSDimitry Andric// Little endian VSX subtarget with direct moves. 35695ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasDirectMove, IsLittleEndian] in { 35705ffd83dbSDimitry Andric // v16i8 scalar <-> vector conversions (LE) 35715ffd83dbSDimitry Andric defm : ScalToVecWPermute<v16i8, (i32 i32:$A), 35725ffd83dbSDimitry Andric (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC), 35735ffd83dbSDimitry Andric (COPY_TO_REGCLASS MovesToVSR.LE_WORD_1, VSRC)>; 35745ffd83dbSDimitry Andric defm : ScalToVecWPermute<v8i16, (i32 i32:$A), 35755ffd83dbSDimitry Andric (COPY_TO_REGCLASS MovesToVSR.LE_WORD_0, VSRC), 35765ffd83dbSDimitry Andric (COPY_TO_REGCLASS MovesToVSR.LE_WORD_1, VSRC)>; 35775ffd83dbSDimitry Andric defm : ScalToVecWPermute<v4i32, (i32 i32:$A), MovesToVSR.LE_WORD_0, 35785ffd83dbSDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64)>; 35795ffd83dbSDimitry Andric defm : ScalToVecWPermute<v2i64, (i64 i64:$A), MovesToVSR.LE_DWORD_0, 35805ffd83dbSDimitry Andric MovesToVSR.LE_DWORD_1>; 35815ffd83dbSDimitry Andric 35825ffd83dbSDimitry Andric // v2i64 scalar <-> vector conversions (LE) 35835ffd83dbSDimitry Andric def : Pat<(i64 (vector_extract v2i64:$S, 0)), 35845ffd83dbSDimitry Andric (i64 VectorExtractions.LE_DWORD_0)>; 35855ffd83dbSDimitry Andric def : Pat<(i64 (vector_extract v2i64:$S, 1)), 35865ffd83dbSDimitry Andric (i64 VectorExtractions.LE_DWORD_1)>; 35875ffd83dbSDimitry Andric def : Pat<(i64 (vector_extract v2i64:$S, i64:$Idx)), 35885ffd83dbSDimitry Andric (i64 VectorExtractions.LE_VARIABLE_DWORD)>; 35895ffd83dbSDimitry Andric} // HasVSX, HasDirectMove, IsLittleEndian 35905ffd83dbSDimitry Andric 35915ffd83dbSDimitry Andric// Big endian pre-P9 VSX subtarget with direct moves. 35925ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasDirectMove, NoP9Altivec, IsBigEndian] in { 35935ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 0)), 35945ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_15)>; 35955ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 1)), 35965ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_14)>; 35975ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 2)), 35985ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_13)>; 35995ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 3)), 36005ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_12)>; 36015ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 4)), 36025ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_11)>; 36035ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 5)), 36045ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_10)>; 36055ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 6)), 36065ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_9)>; 36075ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 7)), 36085ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_8)>; 36095ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 8)), 36105ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_7)>; 36115ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 9)), 36125ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_6)>; 36135ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 10)), 36145ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_5)>; 36155ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 11)), 36165ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_4)>; 36175ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 12)), 36185ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_3)>; 36195ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 13)), 36205ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_2)>; 36215ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 14)), 36225ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_1)>; 36235ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 15)), 36245ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_0)>; 36255ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)), 36265ffd83dbSDimitry Andric (i32 VectorExtractions.BE_VARIABLE_BYTE)>; 36275ffd83dbSDimitry Andric 36285ffd83dbSDimitry Andric// v8i16 scalar <-> vector conversions (BE) 36295ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 0)), 36305ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_7)>; 36315ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 1)), 36325ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_6)>; 36335ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 2)), 36345ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_5)>; 36355ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 3)), 36365ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_4)>; 36375ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 4)), 36385ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_3)>; 36395ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 5)), 36405ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_2)>; 36415ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 6)), 36425ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_1)>; 36435ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 7)), 36445ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_0)>; 36455ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)), 36465ffd83dbSDimitry Andric (i32 VectorExtractions.BE_VARIABLE_HALF)>; 36475ffd83dbSDimitry Andric 36485ffd83dbSDimitry Andric// v4i32 scalar <-> vector conversions (BE) 36495ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 0)), 36505ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_3)>; 36515ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 1)), 36525ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_2)>; 36535ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 2)), 36545ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_1)>; 36555ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 3)), 36565ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_0)>; 36575ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)), 36585ffd83dbSDimitry Andric (i32 VectorExtractions.BE_VARIABLE_WORD)>; 36595ffd83dbSDimitry Andric} // HasVSX, HasDirectMove, NoP9Altivec, IsBigEndian 36605ffd83dbSDimitry Andric 36615ffd83dbSDimitry Andric// Little endian pre-P9 VSX subtarget with direct moves. 36625ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasDirectMove, NoP9Altivec, IsLittleEndian] in { 36635ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 0)), 36645ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_0)>; 36655ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 1)), 36665ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_1)>; 36675ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 2)), 36685ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_2)>; 36695ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 3)), 36705ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_3)>; 36715ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 4)), 36725ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_4)>; 36735ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 5)), 36745ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_5)>; 36755ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 6)), 36765ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_6)>; 36775ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 7)), 36785ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_7)>; 36795ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 8)), 36805ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_8)>; 36815ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 9)), 36825ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_9)>; 36835ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 10)), 36845ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_10)>; 36855ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 11)), 36865ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_11)>; 36875ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 12)), 36885ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_12)>; 36895ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 13)), 36905ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_13)>; 36915ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 14)), 36925ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_14)>; 36935ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 15)), 36945ffd83dbSDimitry Andric (i32 VectorExtractions.LE_BYTE_15)>; 36955ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)), 36965ffd83dbSDimitry Andric (i32 VectorExtractions.LE_VARIABLE_BYTE)>; 36975ffd83dbSDimitry Andric 36985ffd83dbSDimitry Andric// v8i16 scalar <-> vector conversions (LE) 36995ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 0)), 37005ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_0)>; 37015ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 1)), 37025ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_1)>; 37035ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 2)), 37045ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_2)>; 37055ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 3)), 37065ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_3)>; 37075ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 4)), 37085ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_4)>; 37095ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 5)), 37105ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_5)>; 37115ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 6)), 37125ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_6)>; 37135ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 7)), 37145ffd83dbSDimitry Andric (i32 VectorExtractions.LE_HALF_7)>; 37155ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)), 37165ffd83dbSDimitry Andric (i32 VectorExtractions.LE_VARIABLE_HALF)>; 37175ffd83dbSDimitry Andric 37185ffd83dbSDimitry Andric// v4i32 scalar <-> vector conversions (LE) 37195ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 0)), 37205ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_0)>; 37215ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 1)), 37225ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_1)>; 37235ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 2)), 37245ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_2)>; 37255ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 3)), 37265ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_3)>; 37275ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)), 37285ffd83dbSDimitry Andric (i32 VectorExtractions.LE_VARIABLE_WORD)>; 37295ffd83dbSDimitry Andric} // HasVSX, HasDirectMove, NoP9Altivec, IsLittleEndian 37305ffd83dbSDimitry Andric 3731e8d8bef9SDimitry Andric// Big endian pre-Power9 64Bit VSX subtarget that has direct moves. 3732e8d8bef9SDimitry Andriclet Predicates = [HasVSX, HasDirectMove, NoP9Vector, IsBigEndian, IsPPC64] in { 37330b57cec5SDimitry Andric// Big endian integer vectors using direct moves. 37340b57cec5SDimitry Andricdef : Pat<(v2i64 (build_vector i64:$A, i64:$B)), 37350b57cec5SDimitry Andric (v2i64 (XXPERMDI 3736*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRD $A), sub_64), 3737*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRD $B), sub_64), 0))>; 37380b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)), 37390b57cec5SDimitry Andric (XXPERMDI 3740*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), 3741*fe6060f1SDimitry Andric (MTVSRD (RLDIMI AnyExts.B, AnyExts.A, 32, 0)), sub_64), 3742*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), 3743*fe6060f1SDimitry Andric (MTVSRD (RLDIMI AnyExts.D, AnyExts.C, 32, 0)), sub_64), 0)>; 37440b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)), 3745*fe6060f1SDimitry Andric (XXSPLTW (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64), 1)>; 3746e8d8bef9SDimitry Andric} // HasVSX, HasDirectMove, NoP9Vector, IsBigEndian, IsPPC64 37470b57cec5SDimitry Andric 37485ffd83dbSDimitry Andric// Little endian pre-Power9 VSX subtarget that has direct moves. 37495ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasDirectMove, NoP9Vector, IsLittleEndian] in { 37500b57cec5SDimitry Andric// Little endian integer vectors using direct moves. 37510b57cec5SDimitry Andricdef : Pat<(v2i64 (build_vector i64:$A, i64:$B)), 37520b57cec5SDimitry Andric (v2i64 (XXPERMDI 3753*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRD $B), sub_64), 3754*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRD $A), sub_64), 0))>; 37550b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)), 37560b57cec5SDimitry Andric (XXPERMDI 3757*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), 3758*fe6060f1SDimitry Andric (MTVSRD (RLDIMI AnyExts.C, AnyExts.D, 32, 0)), sub_64), 3759*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), 3760*fe6060f1SDimitry Andric (MTVSRD (RLDIMI AnyExts.A, AnyExts.B, 32, 0)), sub_64), 0)>; 37610b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)), 3762*fe6060f1SDimitry Andric (XXSPLTW (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64), 1)>; 37630b57cec5SDimitry Andric} 37640b57cec5SDimitry Andric 37655ffd83dbSDimitry Andric// Any Power9 VSX subtarget. 37665ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP9Vector] in { 37675ffd83dbSDimitry Andric// Additional fnmsub pattern for PPC specific ISD opcode 37685ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub f128:$A, f128:$B, f128:$C), 37695ffd83dbSDimitry Andric (XSNMSUBQP $C, $A, $B)>; 37705ffd83dbSDimitry Andricdef : Pat<(fneg (PPCfnmsub f128:$A, f128:$B, f128:$C)), 37715ffd83dbSDimitry Andric (XSMSUBQP $C, $A, $B)>; 37725ffd83dbSDimitry Andricdef : Pat<(PPCfnmsub f128:$A, f128:$B, (fneg f128:$C)), 37735ffd83dbSDimitry Andric (XSNMADDQP $C, $A, $B)>; 37748bcb0991SDimitry Andric 3775e8d8bef9SDimitry Andricdef : Pat<(f128 (any_sint_to_fp i64:$src)), 37765ffd83dbSDimitry Andric (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>; 3777e8d8bef9SDimitry Andricdef : Pat<(f128 (any_sint_to_fp (i64 (PPCmfvsr f64:$src)))), 37785ffd83dbSDimitry Andric (f128 (XSCVSDQP $src))>; 3779e8d8bef9SDimitry Andricdef : Pat<(f128 (any_sint_to_fp (i32 (PPCmfvsr f64:$src)))), 37805ffd83dbSDimitry Andric (f128 (XSCVSDQP (VEXTSW2Ds $src)))>; 3781e8d8bef9SDimitry Andricdef : Pat<(f128 (any_uint_to_fp i64:$src)), 37825ffd83dbSDimitry Andric (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>; 3783e8d8bef9SDimitry Andricdef : Pat<(f128 (any_uint_to_fp (i64 (PPCmfvsr f64:$src)))), 37845ffd83dbSDimitry Andric (f128 (XSCVUDQP $src))>; 37855ffd83dbSDimitry Andric 37865ffd83dbSDimitry Andric// Convert (Un)Signed Word -> QP. 3787e8d8bef9SDimitry Andricdef : Pat<(f128 (any_sint_to_fp i32:$src)), 37885ffd83dbSDimitry Andric (f128 (XSCVSDQP (MTVSRWA $src)))>; 3789*fe6060f1SDimitry Andricdef : Pat<(f128 (any_sint_to_fp (i32 (load ForceXForm:$src)))), 3790*fe6060f1SDimitry Andric (f128 (XSCVSDQP (LIWAX ForceXForm:$src)))>; 3791e8d8bef9SDimitry Andricdef : Pat<(f128 (any_uint_to_fp i32:$src)), 37925ffd83dbSDimitry Andric (f128 (XSCVUDQP (MTVSRWZ $src)))>; 3793*fe6060f1SDimitry Andricdef : Pat<(f128 (any_uint_to_fp (i32 (load ForceXForm:$src)))), 3794*fe6060f1SDimitry Andric (f128 (XSCVUDQP (LIWZX ForceXForm:$src)))>; 37955ffd83dbSDimitry Andric 37965ffd83dbSDimitry Andric// Pattern for matching Vector HP -> Vector SP intrinsic. Defined as a 37975ffd83dbSDimitry Andric// separate pattern so that it can convert the input register class from 37985ffd83dbSDimitry Andric// VRRC(v8i16) to VSRC. 37995ffd83dbSDimitry Andricdef : Pat<(v4f32 (int_ppc_vsx_xvcvhpsp v8i16:$A)), 38005ffd83dbSDimitry Andric (v4f32 (XVCVHPSP (COPY_TO_REGCLASS $A, VSRC)))>; 38015ffd83dbSDimitry Andric 38025ffd83dbSDimitry Andric// Use current rounding mode 38035ffd83dbSDimitry Andricdef : Pat<(f128 (any_fnearbyint f128:$vB)), (f128 (XSRQPI 0, $vB, 3))>; 38045ffd83dbSDimitry Andric// Round to nearest, ties away from zero 38055ffd83dbSDimitry Andricdef : Pat<(f128 (any_fround f128:$vB)), (f128 (XSRQPI 0, $vB, 0))>; 38065ffd83dbSDimitry Andric// Round towards Zero 38075ffd83dbSDimitry Andricdef : Pat<(f128 (any_ftrunc f128:$vB)), (f128 (XSRQPI 1, $vB, 1))>; 38085ffd83dbSDimitry Andric// Round towards +Inf 38095ffd83dbSDimitry Andricdef : Pat<(f128 (any_fceil f128:$vB)), (f128 (XSRQPI 1, $vB, 2))>; 38105ffd83dbSDimitry Andric// Round towards -Inf 38115ffd83dbSDimitry Andricdef : Pat<(f128 (any_ffloor f128:$vB)), (f128 (XSRQPI 1, $vB, 3))>; 38125ffd83dbSDimitry Andric// Use current rounding mode, [with Inexact] 38135ffd83dbSDimitry Andricdef : Pat<(f128 (any_frint f128:$vB)), (f128 (XSRQPIX 0, $vB, 3))>; 38145ffd83dbSDimitry Andric 38155ffd83dbSDimitry Andricdef : Pat<(f128 (int_ppc_scalar_insert_exp_qp f128:$vA, i64:$vB)), 38165ffd83dbSDimitry Andric (f128 (XSIEXPQP $vA, (MTVSRD $vB)))>; 38175ffd83dbSDimitry Andric 38185ffd83dbSDimitry Andricdef : Pat<(i64 (int_ppc_scalar_extract_expq f128:$vA)), 38195ffd83dbSDimitry Andric (i64 (MFVSRD (EXTRACT_SUBREG 38205ffd83dbSDimitry Andric (v2i64 (XSXEXPQP $vA)), sub_64)))>; 38215ffd83dbSDimitry Andric 38225ffd83dbSDimitry Andric// Extra patterns expanding to vector Extract Word/Insert Word 38235ffd83dbSDimitry Andricdef : Pat<(v4i32 (int_ppc_vsx_xxinsertw v4i32:$A, v2i64:$B, imm:$IMM)), 38245ffd83dbSDimitry Andric (v4i32 (XXINSERTW $A, $B, imm:$IMM))>; 38255ffd83dbSDimitry Andricdef : Pat<(v2i64 (int_ppc_vsx_xxextractuw v2i64:$A, imm:$IMM)), 38265ffd83dbSDimitry Andric (v2i64 (COPY_TO_REGCLASS (XXEXTRACTUW $A, imm:$IMM), VSRC))>; 38275ffd83dbSDimitry Andric 38285ffd83dbSDimitry Andric// Vector Reverse 38295ffd83dbSDimitry Andricdef : Pat<(v8i16 (bswap v8i16 :$A)), 38305ffd83dbSDimitry Andric (v8i16 (COPY_TO_REGCLASS (XXBRH (COPY_TO_REGCLASS $A, VSRC)), VRRC))>; 38315ffd83dbSDimitry Andricdef : Pat<(v1i128 (bswap v1i128 :$A)), 38325ffd83dbSDimitry Andric (v1i128 (COPY_TO_REGCLASS (XXBRQ (COPY_TO_REGCLASS $A, VSRC)), VRRC))>; 38335ffd83dbSDimitry Andric 38345ffd83dbSDimitry Andric// D-Form Load/Store 3835*fe6060f1SDimitry Andricforeach Ty = [v4i32, v4f32, v2i64, v2f64] in { 3836*fe6060f1SDimitry Andric def : Pat<(Ty (load DQForm:$src)), (LXV memrix16:$src)>; 3837*fe6060f1SDimitry Andric def : Pat<(Ty (load XForm:$src)), (LXVX XForm:$src)>; 3838*fe6060f1SDimitry Andric def : Pat<(store Ty:$rS, DQForm:$dst), (STXV $rS, memrix16:$dst)>; 3839*fe6060f1SDimitry Andric def : Pat<(store Ty:$rS, XForm:$dst), (STXVX $rS, XForm:$dst)>; 3840*fe6060f1SDimitry Andric} 3841*fe6060f1SDimitry Andric 3842*fe6060f1SDimitry Andricdef : Pat<(f128 (load DQForm:$src)), 38435ffd83dbSDimitry Andric (COPY_TO_REGCLASS (LXV memrix16:$src), VRRC)>; 3844*fe6060f1SDimitry Andricdef : Pat<(f128 (load XForm:$src)), 3845*fe6060f1SDimitry Andric (COPY_TO_REGCLASS (LXVX XForm:$src), VRRC)>; 3846*fe6060f1SDimitry Andricdef : Pat<(v4i32 (int_ppc_vsx_lxvw4x DQForm:$src)), (LXV memrix16:$src)>; 3847*fe6060f1SDimitry Andricdef : Pat<(v2f64 (int_ppc_vsx_lxvd2x DQForm:$src)), (LXV memrix16:$src)>; 3848*fe6060f1SDimitry Andricdef : Pat<(v4i32 (int_ppc_vsx_lxvw4x XForm:$src)), (LXVX XForm:$src)>; 3849*fe6060f1SDimitry Andricdef : Pat<(v2f64 (int_ppc_vsx_lxvd2x XForm:$src)), (LXVX XForm:$src)>; 38505ffd83dbSDimitry Andric 3851*fe6060f1SDimitry Andricdef : Pat<(store f128:$rS, DQForm:$dst), 38525ffd83dbSDimitry Andric (STXV (COPY_TO_REGCLASS $rS, VSRC), memrix16:$dst)>; 3853*fe6060f1SDimitry Andricdef : Pat<(store f128:$rS, XForm:$dst), 3854*fe6060f1SDimitry Andric (STXVX (COPY_TO_REGCLASS $rS, VSRC), XForm:$dst)>; 3855*fe6060f1SDimitry Andricdef : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, DQForm:$dst), 38565ffd83dbSDimitry Andric (STXV $rS, memrix16:$dst)>; 3857*fe6060f1SDimitry Andricdef : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, DQForm:$dst), 38585ffd83dbSDimitry Andric (STXV $rS, memrix16:$dst)>; 3859*fe6060f1SDimitry Andricdef : Pat<(int_ppc_vsx_stxvw4x v4i32:$rS, XForm:$dst), 3860*fe6060f1SDimitry Andric (STXVX $rS, XForm:$dst)>; 3861*fe6060f1SDimitry Andricdef : Pat<(int_ppc_vsx_stxvd2x v2f64:$rS, XForm:$dst), 3862*fe6060f1SDimitry Andric (STXVX $rS, XForm:$dst)>; 38635ffd83dbSDimitry Andric 38645ffd83dbSDimitry Andric// Build vectors from i8 loads 38655ffd83dbSDimitry Andricdefm : ScalToVecWPermute<v8i16, ScalarLoads.ZELi8, 3866*fe6060f1SDimitry Andric (VSPLTHs 3, (LXSIBZX ForceXForm:$src)), 3867*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIBZX ForceXForm:$src), sub_64)>; 38685ffd83dbSDimitry Andricdefm : ScalToVecWPermute<v4i32, ScalarLoads.ZELi8, 3869*fe6060f1SDimitry Andric (XXSPLTWs (LXSIBZX ForceXForm:$src), 1), 3870*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIBZX ForceXForm:$src), sub_64)>; 38715ffd83dbSDimitry Andricdefm : ScalToVecWPermute<v2i64, ScalarLoads.ZELi8i64, 3872*fe6060f1SDimitry Andric (XXPERMDIs (LXSIBZX ForceXForm:$src), 0), 3873*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIBZX ForceXForm:$src), sub_64)>; 3874*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3875*fe6060f1SDimitry Andric v4i32, ScalarLoads.SELi8, 3876*fe6060f1SDimitry Andric (XXSPLTWs (VEXTSB2Ws (LXSIBZX ForceXForm:$src)), 1), 3877*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (VEXTSB2Ws (LXSIBZX ForceXForm:$src)), sub_64)>; 3878*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3879*fe6060f1SDimitry Andric v2i64, ScalarLoads.SELi8i64, 3880*fe6060f1SDimitry Andric (XXPERMDIs (VEXTSB2Ds (LXSIBZX ForceXForm:$src)), 0), 3881*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (VEXTSB2Ds (LXSIBZX ForceXForm:$src)), sub_64)>; 38825ffd83dbSDimitry Andric 38835ffd83dbSDimitry Andric// Build vectors from i16 loads 3884*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3885*fe6060f1SDimitry Andric v4i32, ScalarLoads.ZELi16, 3886*fe6060f1SDimitry Andric (XXSPLTWs (LXSIHZX ForceXForm:$src), 1), 3887*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIHZX ForceXForm:$src), sub_64)>; 3888*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3889*fe6060f1SDimitry Andric v2i64, ScalarLoads.ZELi16i64, 3890*fe6060f1SDimitry Andric (XXPERMDIs (LXSIHZX ForceXForm:$src), 0), 3891*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIHZX ForceXForm:$src), sub_64)>; 3892*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3893*fe6060f1SDimitry Andric v4i32, ScalarLoads.SELi16, 3894*fe6060f1SDimitry Andric (XXSPLTWs (VEXTSH2Ws (LXSIHZX ForceXForm:$src)), 1), 3895*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (VEXTSH2Ws (LXSIHZX ForceXForm:$src)), sub_64)>; 3896*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 3897*fe6060f1SDimitry Andric v2i64, ScalarLoads.SELi16i64, 3898*fe6060f1SDimitry Andric (XXPERMDIs (VEXTSH2Ds (LXSIHZX ForceXForm:$src)), 0), 3899*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (VEXTSH2Ds (LXSIHZX ForceXForm:$src)), sub_64)>; 39005ffd83dbSDimitry Andric 39015ffd83dbSDimitry Andric// Load/convert and convert/store patterns for f16. 3902*fe6060f1SDimitry Andricdef : Pat<(f64 (extloadf16 ForceXForm:$src)), 3903*fe6060f1SDimitry Andric (f64 (XSCVHPDP (LXSIHZX ForceXForm:$src)))>; 3904*fe6060f1SDimitry Andricdef : Pat<(truncstoref16 f64:$src, ForceXForm:$dst), 3905*fe6060f1SDimitry Andric (STXSIHX (XSCVDPHP $src), ForceXForm:$dst)>; 3906*fe6060f1SDimitry Andricdef : Pat<(f32 (extloadf16 ForceXForm:$src)), 3907*fe6060f1SDimitry Andric (f32 (COPY_TO_REGCLASS (XSCVHPDP (LXSIHZX ForceXForm:$src)), VSSRC))>; 3908*fe6060f1SDimitry Andricdef : Pat<(truncstoref16 f32:$src, ForceXForm:$dst), 3909*fe6060f1SDimitry Andric (STXSIHX (XSCVDPHP (COPY_TO_REGCLASS $src, VSFRC)), ForceXForm:$dst)>; 39105ffd83dbSDimitry Andricdef : Pat<(f64 (f16_to_fp i32:$A)), 39115ffd83dbSDimitry Andric (f64 (XSCVHPDP (MTVSRWZ $A)))>; 39125ffd83dbSDimitry Andricdef : Pat<(f32 (f16_to_fp i32:$A)), 39135ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSCVHPDP (MTVSRWZ $A)), VSSRC))>; 39145ffd83dbSDimitry Andricdef : Pat<(i32 (fp_to_f16 f32:$A)), 39155ffd83dbSDimitry Andric (i32 (MFVSRWZ (XSCVDPHP (COPY_TO_REGCLASS $A, VSFRC))))>; 39165ffd83dbSDimitry Andricdef : Pat<(i32 (fp_to_f16 f64:$A)), (i32 (MFVSRWZ (XSCVDPHP $A)))>; 39175ffd83dbSDimitry Andric 39185ffd83dbSDimitry Andric// Vector sign extensions 39195ffd83dbSDimitry Andricdef : Pat<(f64 (PPCVexts f64:$A, 1)), 39205ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (VEXTSB2Ds $A), VSFRC))>; 39215ffd83dbSDimitry Andricdef : Pat<(f64 (PPCVexts f64:$A, 2)), 39225ffd83dbSDimitry Andric (f64 (COPY_TO_REGCLASS (VEXTSH2Ds $A), VSFRC))>; 39235ffd83dbSDimitry Andric 3924*fe6060f1SDimitry Andricdef : Pat<(f64 (extloadf32 DSForm:$src)), 3925*fe6060f1SDimitry Andric (COPY_TO_REGCLASS (DFLOADf32 DSForm:$src), VSFRC)>; 3926*fe6060f1SDimitry Andricdef : Pat<(f32 (fpround (f64 (extloadf32 DSForm:$src)))), 3927*fe6060f1SDimitry Andric (f32 (DFLOADf32 DSForm:$src))>; 39285ffd83dbSDimitry Andric 3929*fe6060f1SDimitry Andricdef : Pat<(v4f32 (PPCldvsxlh XForm:$src)), 3930*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XFLOADf64 XForm:$src), sub_64)>; 3931*fe6060f1SDimitry Andricdef : Pat<(v4f32 (PPCldvsxlh DSForm:$src)), 3932*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (DFLOADf64 DSForm:$src), sub_64)>; 39335ffd83dbSDimitry Andric 39345ffd83dbSDimitry Andric// Convert (Un)Signed DWord in memory -> QP 3935*fe6060f1SDimitry Andricdef : Pat<(f128 (sint_to_fp (i64 (load XForm:$src)))), 3936*fe6060f1SDimitry Andric (f128 (XSCVSDQP (LXSDX XForm:$src)))>; 3937*fe6060f1SDimitry Andricdef : Pat<(f128 (sint_to_fp (i64 (load DSForm:$src)))), 3938*fe6060f1SDimitry Andric (f128 (XSCVSDQP (LXSD DSForm:$src)))>; 3939*fe6060f1SDimitry Andricdef : Pat<(f128 (uint_to_fp (i64 (load XForm:$src)))), 3940*fe6060f1SDimitry Andric (f128 (XSCVUDQP (LXSDX XForm:$src)))>; 3941*fe6060f1SDimitry Andricdef : Pat<(f128 (uint_to_fp (i64 (load DSForm:$src)))), 3942*fe6060f1SDimitry Andric (f128 (XSCVUDQP (LXSD DSForm:$src)))>; 39435ffd83dbSDimitry Andric 39445ffd83dbSDimitry Andric// Convert Unsigned HWord in memory -> QP 39455ffd83dbSDimitry Andricdef : Pat<(f128 (uint_to_fp ScalarLoads.ZELi16)), 3946*fe6060f1SDimitry Andric (f128 (XSCVUDQP (LXSIHZX XForm:$src)))>; 39475ffd83dbSDimitry Andric 39485ffd83dbSDimitry Andric// Convert Unsigned Byte in memory -> QP 39495ffd83dbSDimitry Andricdef : Pat<(f128 (uint_to_fp ScalarLoads.ZELi8)), 3950*fe6060f1SDimitry Andric (f128 (XSCVUDQP (LXSIBZX ForceXForm:$src)))>; 39515ffd83dbSDimitry Andric 39525ffd83dbSDimitry Andric// Truncate & Convert QP -> (Un)Signed (D)Word. 3953e8d8bef9SDimitry Andricdef : Pat<(i64 (any_fp_to_sint f128:$src)), (i64 (MFVRD (XSCVQPSDZ $src)))>; 3954e8d8bef9SDimitry Andricdef : Pat<(i64 (any_fp_to_uint f128:$src)), (i64 (MFVRD (XSCVQPUDZ $src)))>; 3955e8d8bef9SDimitry Andricdef : Pat<(i32 (any_fp_to_sint f128:$src)), 39565ffd83dbSDimitry Andric (i32 (MFVSRWZ (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC)))>; 3957e8d8bef9SDimitry Andricdef : Pat<(i32 (any_fp_to_uint f128:$src)), 39585ffd83dbSDimitry Andric (i32 (MFVSRWZ (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC)))>; 39595ffd83dbSDimitry Andric 39605ffd83dbSDimitry Andric// Instructions for store(fptosi). 39615ffd83dbSDimitry Andric// The 8-byte version is repeated here due to availability of D-Form STXSD. 39625ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3963*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), XForm:$dst, 8), 39645ffd83dbSDimitry Andric (STXSDX (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), 3965*fe6060f1SDimitry Andric XForm:$dst)>; 39665ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3967*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), DSForm:$dst, 8), 39685ffd83dbSDimitry Andric (STXSD (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), 3969*fe6060f1SDimitry Andric DSForm:$dst)>; 39705ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3971*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), ForceXForm:$dst, 4), 3972*fe6060f1SDimitry Andric (STXSIWX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), ForceXForm:$dst)>; 39735ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3974*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), ForceXForm:$dst, 2), 3975*fe6060f1SDimitry Andric (STXSIHX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), ForceXForm:$dst)>; 39765ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3977*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), ForceXForm:$dst, 1), 3978*fe6060f1SDimitry Andric (STXSIBX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), ForceXForm:$dst)>; 39795ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3980*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), XForm:$dst, 8), 3981*fe6060f1SDimitry Andric (STXSDX (XSCVDPSXDS f64:$src), XForm:$dst)>; 39825ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3983*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), DSForm:$dst, 8), 3984*fe6060f1SDimitry Andric (STXSD (XSCVDPSXDS f64:$src), DSForm:$dst)>; 39855ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3986*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ForceXForm:$dst, 2), 3987*fe6060f1SDimitry Andric (STXSIHX (XSCVDPSXWS f64:$src), ForceXForm:$dst)>; 39885ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3989*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ForceXForm:$dst, 1), 3990*fe6060f1SDimitry Andric (STXSIBX (XSCVDPSXWS f64:$src), ForceXForm:$dst)>; 39915ffd83dbSDimitry Andric 39925ffd83dbSDimitry Andric// Instructions for store(fptoui). 39935ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3994*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), XForm:$dst, 8), 39955ffd83dbSDimitry Andric (STXSDX (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), 3996*fe6060f1SDimitry Andric XForm:$dst)>; 39975ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 3998*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), DSForm:$dst, 8), 39995ffd83dbSDimitry Andric (STXSD (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), 4000*fe6060f1SDimitry Andric DSForm:$dst)>; 40015ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 4002*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), ForceXForm:$dst, 4), 4003*fe6060f1SDimitry Andric (STXSIWX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), ForceXForm:$dst)>; 40045ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 4005*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), ForceXForm:$dst, 2), 4006*fe6060f1SDimitry Andric (STXSIHX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), ForceXForm:$dst)>; 40075ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 4008*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), ForceXForm:$dst, 1), 4009*fe6060f1SDimitry Andric (STXSIBX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), ForceXForm:$dst)>; 40105ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 4011*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), XForm:$dst, 8), 4012*fe6060f1SDimitry Andric (STXSDX (XSCVDPUXDS f64:$src), XForm:$dst)>; 40135ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 4014*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), DSForm:$dst, 8), 4015*fe6060f1SDimitry Andric (STXSD (XSCVDPUXDS f64:$src), DSForm:$dst)>; 40165ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 4017*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ForceXForm:$dst, 2), 4018*fe6060f1SDimitry Andric (STXSIHX (XSCVDPUXWS f64:$src), ForceXForm:$dst)>; 40195ffd83dbSDimitry Andricdef : Pat<(PPCstore_scal_int_from_vsr 4020*fe6060f1SDimitry Andric (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ForceXForm:$dst, 1), 4021*fe6060f1SDimitry Andric (STXSIBX (XSCVDPUXWS f64:$src), ForceXForm:$dst)>; 40225ffd83dbSDimitry Andric 40235ffd83dbSDimitry Andric// Round & Convert QP -> DP/SP 40245ffd83dbSDimitry Andricdef : Pat<(f64 (any_fpround f128:$src)), (f64 (XSCVQPDP $src))>; 40255ffd83dbSDimitry Andricdef : Pat<(f32 (any_fpround f128:$src)), (f32 (XSRSP (XSCVQPDPO $src)))>; 40265ffd83dbSDimitry Andric 40275ffd83dbSDimitry Andric// Convert SP -> QP 40285ffd83dbSDimitry Andricdef : Pat<(f128 (any_fpextend f32:$src)), 40295ffd83dbSDimitry Andric (f128 (XSCVDPQP (COPY_TO_REGCLASS $src, VFRC)))>; 40305ffd83dbSDimitry Andric 40315ffd83dbSDimitry Andricdef : Pat<(f32 (PPCxsmaxc f32:$XA, f32:$XB)), 40325ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSMAXCDP (COPY_TO_REGCLASS $XA, VSSRC), 40335ffd83dbSDimitry Andric (COPY_TO_REGCLASS $XB, VSSRC)), 40345ffd83dbSDimitry Andric VSSRC))>; 40355ffd83dbSDimitry Andricdef : Pat<(f32 (PPCxsminc f32:$XA, f32:$XB)), 40365ffd83dbSDimitry Andric (f32 (COPY_TO_REGCLASS (XSMINCDP (COPY_TO_REGCLASS $XA, VSSRC), 40375ffd83dbSDimitry Andric (COPY_TO_REGCLASS $XB, VSSRC)), 40385ffd83dbSDimitry Andric VSSRC))>; 40395ffd83dbSDimitry Andric 40400b57cec5SDimitry Andric// Endianness-neutral patterns for const splats with ISA 3.0 instructions. 4041*fe6060f1SDimitry Andricdefm : ScalToVecWPermute<v4i32, (i32 i32:$A), (MTVSRWS $A), 4042*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (MTVSRWZ $A), sub_64)>; 40430b57cec5SDimitry Andricdef : Pat<(v4i32 (build_vector i32:$A, i32:$A, i32:$A, i32:$A)), 40440b57cec5SDimitry Andric (v4i32 (MTVSRWS $A))>; 40458bcb0991SDimitry Andricdef : Pat<(v16i8 (build_vector immNonAllOneAnyExt8:$A, immNonAllOneAnyExt8:$A, 40468bcb0991SDimitry Andric immNonAllOneAnyExt8:$A, immNonAllOneAnyExt8:$A, 40478bcb0991SDimitry Andric immNonAllOneAnyExt8:$A, immNonAllOneAnyExt8:$A, 40488bcb0991SDimitry Andric immNonAllOneAnyExt8:$A, immNonAllOneAnyExt8:$A, 40498bcb0991SDimitry Andric immNonAllOneAnyExt8:$A, immNonAllOneAnyExt8:$A, 40508bcb0991SDimitry Andric immNonAllOneAnyExt8:$A, immNonAllOneAnyExt8:$A, 40518bcb0991SDimitry Andric immNonAllOneAnyExt8:$A, immNonAllOneAnyExt8:$A, 40528bcb0991SDimitry Andric immNonAllOneAnyExt8:$A, immNonAllOneAnyExt8:$A)), 40530b57cec5SDimitry Andric (v16i8 (COPY_TO_REGCLASS (XXSPLTIB imm:$A), VSRC))>; 4054*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 4055*fe6060f1SDimitry Andric v4i32, FltToIntLoad.A, 4056*fe6060f1SDimitry Andric (XVCVSPSXWS (LXVWSX ForceXForm:$A)), 4057*fe6060f1SDimitry Andric (XVCVSPSXWS (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$A), sub_64))>; 4058*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 4059*fe6060f1SDimitry Andric v4i32, FltToUIntLoad.A, 4060*fe6060f1SDimitry Andric (XVCVSPUXWS (LXVWSX ForceXForm:$A)), 4061*fe6060f1SDimitry Andric (XVCVSPUXWS (SUBREG_TO_REG (i64 1), (LIWZX ForceXForm:$A), sub_64))>; 40625ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 40635ffd83dbSDimitry Andric v4i32, DblToIntLoadP9.A, 4064*fe6060f1SDimitry Andric (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPSXWS (DFLOADf64 DSForm:$A)), sub_64), 1), 4065*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSXWS (DFLOADf64 DSForm:$A)), sub_64)>; 40665ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 40675ffd83dbSDimitry Andric v4i32, DblToUIntLoadP9.A, 4068*fe6060f1SDimitry Andric (XXSPLTW (SUBREG_TO_REG (i64 1), (XSCVDPUXWS (DFLOADf64 DSForm:$A)), sub_64), 1), 4069*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPUXWS (DFLOADf64 DSForm:$A)), sub_64)>; 40705ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 40715ffd83dbSDimitry Andric v2i64, FltToLongLoadP9.A, 4072*fe6060f1SDimitry Andric (XXPERMDIs (XSCVDPSXDS (COPY_TO_REGCLASS (DFLOADf32 DSForm:$A), VSFRC)), 0), 40735ffd83dbSDimitry Andric (SUBREG_TO_REG 40745ffd83dbSDimitry Andric (i64 1), 4075*fe6060f1SDimitry Andric (XSCVDPSXDS (COPY_TO_REGCLASS (DFLOADf32 DSForm:$A), VSFRC)), sub_64)>; 40765ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 40775ffd83dbSDimitry Andric v2i64, FltToULongLoadP9.A, 4078*fe6060f1SDimitry Andric (XXPERMDIs (XSCVDPUXDS (COPY_TO_REGCLASS (DFLOADf32 DSForm:$A), VSFRC)), 0), 40795ffd83dbSDimitry Andric (SUBREG_TO_REG 40805ffd83dbSDimitry Andric (i64 1), 4081*fe6060f1SDimitry Andric (XSCVDPUXDS (COPY_TO_REGCLASS (DFLOADf32 DSForm:$A), VSFRC)), sub_64)>; 4082*fe6060f1SDimitry Andricdef : Pat<(v4f32 (PPCldsplat ForceXForm:$A)), 4083*fe6060f1SDimitry Andric (v4f32 (LXVWSX ForceXForm:$A))>; 4084*fe6060f1SDimitry Andricdef : Pat<(v4i32 (PPCldsplat ForceXForm:$A)), 4085*fe6060f1SDimitry Andric (v4i32 (LXVWSX ForceXForm:$A))>; 40865ffd83dbSDimitry Andric} // HasVSX, HasP9Vector 40875ffd83dbSDimitry Andric 4088*fe6060f1SDimitry Andric// Any Power9 VSX subtarget with equivalent length but better Power10 VSX 4089*fe6060f1SDimitry Andric// patterns. 4090*fe6060f1SDimitry Andric// Two identical blocks are required due to the slightly different predicates: 4091*fe6060f1SDimitry Andric// One without P10 instructions, the other is BigEndian only with P10 instructions. 4092*fe6060f1SDimitry Andriclet Predicates = [HasVSX, HasP9Vector, NoP10Vector] in { 4093*fe6060f1SDimitry Andric// Little endian Power10 subtargets produce a shorter pattern but require a 4094*fe6060f1SDimitry Andric// COPY_TO_REGCLASS. The COPY_TO_REGCLASS makes it appear to need two instructions 4095*fe6060f1SDimitry Andric// to perform the operation, when only one instruction is produced in practice. 4096*fe6060f1SDimitry Andric// The NoP10Vector predicate excludes these patterns from Power10 VSX subtargets. 4097*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 4098*fe6060f1SDimitry Andric v16i8, ScalarLoads.Li8, 4099*fe6060f1SDimitry Andric (VSPLTBs 7, (LXSIBZX ForceXForm:$src)), 4100*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIBZX ForceXForm:$src), sub_64)>; 4101*fe6060f1SDimitry Andric// Build vectors from i16 loads 4102*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 4103*fe6060f1SDimitry Andric v8i16, ScalarLoads.Li16, 4104*fe6060f1SDimitry Andric (VSPLTHs 3, (LXSIHZX ForceXForm:$src)), 4105*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIHZX ForceXForm:$src), sub_64)>; 4106*fe6060f1SDimitry Andric} // HasVSX, HasP9Vector, NoP10Vector 4107*fe6060f1SDimitry Andric 4108*fe6060f1SDimitry Andric// Any big endian Power9 VSX subtarget 4109*fe6060f1SDimitry Andriclet Predicates = [HasVSX, HasP9Vector, IsBigEndian] in { 4110*fe6060f1SDimitry Andric// Power10 VSX subtargets produce a shorter pattern for little endian targets 4111*fe6060f1SDimitry Andric// but this is still the best pattern for Power9 and Power10 VSX big endian 4112*fe6060f1SDimitry Andric// Build vectors from i8 loads 4113*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 4114*fe6060f1SDimitry Andric v16i8, ScalarLoads.Li8, 4115*fe6060f1SDimitry Andric (VSPLTBs 7, (LXSIBZX ForceXForm:$src)), 4116*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIBZX ForceXForm:$src), sub_64)>; 4117*fe6060f1SDimitry Andric// Build vectors from i16 loads 4118*fe6060f1SDimitry Andricdefm : ScalToVecWPermute< 4119*fe6060f1SDimitry Andric v8i16, ScalarLoads.Li16, 4120*fe6060f1SDimitry Andric (VSPLTHs 3, (LXSIHZX ForceXForm:$src)), 4121*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (LXSIHZX ForceXForm:$src), sub_64)>; 4122*fe6060f1SDimitry Andric 41235ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))), 41245ffd83dbSDimitry Andric (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>; 41255ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))), 41265ffd83dbSDimitry Andric (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>; 41275ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))), 41285ffd83dbSDimitry Andric (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>; 41295ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))), 41305ffd83dbSDimitry Andric (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>; 41315ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))), 41325ffd83dbSDimitry Andric (f64 (XSCVUXDDP (XXEXTRACTUW $A, 0)))>; 41335ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))), 41345ffd83dbSDimitry Andric (f64 (XSCVUXDDP (XXEXTRACTUW $A, 4)))>; 41355ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))), 41365ffd83dbSDimitry Andric (f64 (XSCVUXDDP (XXEXTRACTUW $A, 8)))>; 41375ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))), 41385ffd83dbSDimitry Andric (f64 (XSCVUXDDP (XXEXTRACTUW $A, 12)))>; 41395ffd83dbSDimitry Andricdef : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)), 41405ffd83dbSDimitry Andric (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>; 41415ffd83dbSDimitry Andricdef : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)), 41425ffd83dbSDimitry Andric (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>; 41435ffd83dbSDimitry Andricdef : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)), 41445ffd83dbSDimitry Andric (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>; 41455ffd83dbSDimitry Andricdef : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)), 41465ffd83dbSDimitry Andric (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>; 41475ffd83dbSDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)), 41485ffd83dbSDimitry Andric (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>; 41495ffd83dbSDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)), 41505ffd83dbSDimitry Andric (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>; 41515ffd83dbSDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)), 41525ffd83dbSDimitry Andric (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>; 41535ffd83dbSDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)), 41545ffd83dbSDimitry Andric (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>; 41555ffd83dbSDimitry Andric 4156*fe6060f1SDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, (f32 (fpround f64:$B)), 0)), 4157*fe6060f1SDimitry Andric (v4f32 (XXINSERTW v4f32:$A, 4158*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$B), sub_64), 0))>; 4159*fe6060f1SDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, (f32 (fpround f64:$B)), 1)), 4160*fe6060f1SDimitry Andric (v4f32 (XXINSERTW v4f32:$A, 4161*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$B), sub_64), 4))>; 4162*fe6060f1SDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, (f32 (fpround f64:$B)), 2)), 4163*fe6060f1SDimitry Andric (v4f32 (XXINSERTW v4f32:$A, 4164*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$B), sub_64), 8))>; 4165*fe6060f1SDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, (f32 (fpround f64:$B)), 3)), 4166*fe6060f1SDimitry Andric (v4f32 (XXINSERTW v4f32:$A, 4167*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$B), sub_64), 12))>; 4168*fe6060f1SDimitry Andric 41695ffd83dbSDimitry Andric// Scalar stores of i8 4170*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 0)), ForceXForm:$dst), 4171*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 9)), VSRC), ForceXForm:$dst)>; 4172*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 1)), ForceXForm:$dst), 4173*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 10)), VSRC), ForceXForm:$dst)>; 4174*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 2)), ForceXForm:$dst), 4175*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 11)), VSRC), ForceXForm:$dst)>; 4176*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 3)), ForceXForm:$dst), 4177*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 12)), VSRC), ForceXForm:$dst)>; 4178*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 4)), ForceXForm:$dst), 4179*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 13)), VSRC), ForceXForm:$dst)>; 4180*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 5)), ForceXForm:$dst), 4181*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 14)), VSRC), ForceXForm:$dst)>; 4182*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 6)), ForceXForm:$dst), 4183*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 15)), VSRC), ForceXForm:$dst)>; 4184*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 7)), ForceXForm:$dst), 4185*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS $S, VSRC), ForceXForm:$dst)>; 4186*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 8)), ForceXForm:$dst), 4187*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 1)), VSRC), ForceXForm:$dst)>; 4188*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 9)), ForceXForm:$dst), 4189*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 2)), VSRC), ForceXForm:$dst)>; 4190*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 10)), ForceXForm:$dst), 4191*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 3)), VSRC), ForceXForm:$dst)>; 4192*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 11)), ForceXForm:$dst), 4193*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 4)), VSRC), ForceXForm:$dst)>; 4194*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 12)), ForceXForm:$dst), 4195*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 5)), VSRC), ForceXForm:$dst)>; 4196*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 13)), ForceXForm:$dst), 4197*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 6)), VSRC), ForceXForm:$dst)>; 4198*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 14)), ForceXForm:$dst), 4199*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 7)), VSRC), ForceXForm:$dst)>; 4200*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 15)), ForceXForm:$dst), 4201*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 8)), VSRC), ForceXForm:$dst)>; 42025ffd83dbSDimitry Andric 42035ffd83dbSDimitry Andric// Scalar stores of i16 4204*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 0)), ForceXForm:$dst), 4205*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 10)), VSRC), ForceXForm:$dst)>; 4206*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 1)), ForceXForm:$dst), 4207*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 12)), VSRC), ForceXForm:$dst)>; 4208*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 2)), ForceXForm:$dst), 4209*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 14)), VSRC), ForceXForm:$dst)>; 4210*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 3)), ForceXForm:$dst), 4211*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS $S, VSRC), ForceXForm:$dst)>; 4212*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 4)), ForceXForm:$dst), 4213*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 2)), VSRC), ForceXForm:$dst)>; 4214*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 5)), ForceXForm:$dst), 4215*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 4)), VSRC), ForceXForm:$dst)>; 4216*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 6)), ForceXForm:$dst), 4217*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 6)), VSRC), ForceXForm:$dst)>; 4218*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 7)), ForceXForm:$dst), 4219*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 8)), VSRC), ForceXForm:$dst)>; 4220*fe6060f1SDimitry Andric} // HasVSX, HasP9Vector, IsBigEndian 42215ffd83dbSDimitry Andric 4222*fe6060f1SDimitry Andric// Big endian 64Bit Power9 subtarget. 4223*fe6060f1SDimitry Andriclet Predicates = [HasVSX, HasP9Vector, IsBigEndian, IsPPC64] in { 4224*fe6060f1SDimitry Andricdef : Pat<(v2i64 (scalar_to_vector (i64 (load DSForm:$src)))), 4225*fe6060f1SDimitry Andric (v2i64 (SUBREG_TO_REG (i64 1), (DFLOADf64 DSForm:$src), sub_64))>; 4226*fe6060f1SDimitry Andricdef : Pat<(v2i64 (scalar_to_vector (i64 (load XForm:$src)))), 4227*fe6060f1SDimitry Andric (v2i64 (SUBREG_TO_REG (i64 1), (XFLOADf64 XForm:$src), sub_64))>; 42285ffd83dbSDimitry Andric 4229*fe6060f1SDimitry Andricdef : Pat<(v2f64 (scalar_to_vector (f64 (load DSForm:$src)))), 4230*fe6060f1SDimitry Andric (v2f64 (SUBREG_TO_REG (i64 1), (DFLOADf64 DSForm:$src), sub_64))>; 4231*fe6060f1SDimitry Andricdef : Pat<(v2f64 (scalar_to_vector (f64 (load XForm:$src)))), 4232*fe6060f1SDimitry Andric (v2f64 (SUBREG_TO_REG (i64 1), (XFLOADf64 XForm:$src), sub_64))>; 4233*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 1)), XForm:$src), 42345ffd83dbSDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), 4235*fe6060f1SDimitry Andric sub_64), XForm:$src)>; 4236*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 1)), XForm:$src), 42375ffd83dbSDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), 4238*fe6060f1SDimitry Andric sub_64), XForm:$src)>; 4239*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 0)), XForm:$src), 4240*fe6060f1SDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), XForm:$src)>; 4241*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 0)), XForm:$src), 4242*fe6060f1SDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), XForm:$src)>; 4243*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 1)), DSForm:$src), 42445ffd83dbSDimitry Andric (DFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), 4245*fe6060f1SDimitry Andric sub_64), DSForm:$src)>; 4246*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 1)), DSForm:$src), 42475ffd83dbSDimitry Andric (DFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), 4248*fe6060f1SDimitry Andric sub_64), DSForm:$src)>; 4249*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 0)), DSForm:$src), 4250*fe6060f1SDimitry Andric (DFSTOREf64 (EXTRACT_SUBREG $A, sub_64), DSForm:$src)>; 4251*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 0)), DSForm:$src), 4252*fe6060f1SDimitry Andric (DFSTOREf64 (EXTRACT_SUBREG $A, sub_64), DSForm:$src)>; 42535ffd83dbSDimitry Andric 42545ffd83dbSDimitry Andric// (Un)Signed DWord vector extract -> QP 42555ffd83dbSDimitry Andricdef : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 0)))), 42565ffd83dbSDimitry Andric (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>; 42575ffd83dbSDimitry Andricdef : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 1)))), 42585ffd83dbSDimitry Andric (f128 (XSCVSDQP 42595ffd83dbSDimitry Andric (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>; 42605ffd83dbSDimitry Andricdef : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 0)))), 42615ffd83dbSDimitry Andric (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>; 42625ffd83dbSDimitry Andricdef : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 1)))), 42635ffd83dbSDimitry Andric (f128 (XSCVUDQP 42645ffd83dbSDimitry Andric (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>; 42655ffd83dbSDimitry Andric 42665ffd83dbSDimitry Andric// (Un)Signed Word vector extract -> QP 42675ffd83dbSDimitry Andricdef : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, 1)))), 42685ffd83dbSDimitry Andric (f128 (XSCVSDQP (EXTRACT_SUBREG (VEXTSW2D $src), sub_64)))>; 42695ffd83dbSDimitry Andricforeach Idx = [0,2,3] in { 42705ffd83dbSDimitry Andric def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, Idx)))), 42715ffd83dbSDimitry Andric (f128 (XSCVSDQP (EXTRACT_SUBREG 42725ffd83dbSDimitry Andric (VEXTSW2D (VSPLTW Idx, $src)), sub_64)))>; 42735ffd83dbSDimitry Andric} 42745ffd83dbSDimitry Andricforeach Idx = 0-3 in { 42755ffd83dbSDimitry Andric def : Pat<(f128 (uint_to_fp (i32 (extractelt v4i32:$src, Idx)))), 42765ffd83dbSDimitry Andric (f128 (XSCVUDQP (XXEXTRACTUW $src, !shl(Idx, 2))))>; 42770b57cec5SDimitry Andric} 42780b57cec5SDimitry Andric 4279*fe6060f1SDimitry Andric// (Un)Signed HWord vector extract -> QP/DP/SP 42805ffd83dbSDimitry Andricforeach Idx = 0-7 in { 42815ffd83dbSDimitry Andric def : Pat<(f128 (sint_to_fp 42825ffd83dbSDimitry Andric (i32 (sext_inreg 42835ffd83dbSDimitry Andric (vector_extract v8i16:$src, Idx), i16)))), 42845ffd83dbSDimitry Andric (f128 (XSCVSDQP (EXTRACT_SUBREG 42855ffd83dbSDimitry Andric (VEXTSH2D (VEXTRACTUH !add(Idx, Idx), $src)), 42865ffd83dbSDimitry Andric sub_64)))>; 42875ffd83dbSDimitry Andric // The SDAG adds the `and` since an `i16` is being extracted as an `i32`. 42885ffd83dbSDimitry Andric def : Pat<(f128 (uint_to_fp 42895ffd83dbSDimitry Andric (and (i32 (vector_extract v8i16:$src, Idx)), 65535))), 42905ffd83dbSDimitry Andric (f128 (XSCVUDQP (EXTRACT_SUBREG 42915ffd83dbSDimitry Andric (VEXTRACTUH !add(Idx, Idx), $src), sub_64)))>; 4292*fe6060f1SDimitry Andric def : Pat<(f32 (PPCfcfidus 4293*fe6060f1SDimitry Andric (f64 (PPCmtvsrz (and (i32 (vector_extract v8i16:$src, Idx)), 4294*fe6060f1SDimitry Andric 65535))))), 4295*fe6060f1SDimitry Andric (f32 (XSCVUXDSP (EXTRACT_SUBREG 4296*fe6060f1SDimitry Andric (VEXTRACTUH !add(Idx, Idx), $src), sub_64)))>; 4297*fe6060f1SDimitry Andric def : Pat<(f32 (PPCfcfids 4298*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4299*fe6060f1SDimitry Andric (i32 (sext_inreg (vector_extract v8i16:$src, Idx), 4300*fe6060f1SDimitry Andric i16)))))), 4301*fe6060f1SDimitry Andric (f32 (XSCVSXDSP (EXTRACT_SUBREG 4302*fe6060f1SDimitry Andric (VEXTSH2D (VEXTRACTUH !add(Idx, Idx), $src)), 4303*fe6060f1SDimitry Andric sub_64)))>; 4304*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfidu 4305*fe6060f1SDimitry Andric (f64 (PPCmtvsrz 4306*fe6060f1SDimitry Andric (and (i32 (vector_extract v8i16:$src, Idx)), 4307*fe6060f1SDimitry Andric 65535))))), 4308*fe6060f1SDimitry Andric (f64 (XSCVUXDDP (EXTRACT_SUBREG 4309*fe6060f1SDimitry Andric (VEXTRACTUH !add(Idx, Idx), $src), sub_64)))>; 4310*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfid 4311*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4312*fe6060f1SDimitry Andric (i32 (sext_inreg (vector_extract v8i16:$src, Idx), 4313*fe6060f1SDimitry Andric i16)))))), 4314*fe6060f1SDimitry Andric (f64 (XSCVSXDDP (EXTRACT_SUBREG 4315*fe6060f1SDimitry Andric (VEXTSH2D (VEXTRACTUH !add(Idx, Idx), $src)), 4316*fe6060f1SDimitry Andric sub_64)))>; 43170b57cec5SDimitry Andric} 43180b57cec5SDimitry Andric 43195ffd83dbSDimitry Andric// (Un)Signed Byte vector extract -> QP 43205ffd83dbSDimitry Andricforeach Idx = 0-15 in { 43215ffd83dbSDimitry Andric def : Pat<(f128 (sint_to_fp 43225ffd83dbSDimitry Andric (i32 (sext_inreg (vector_extract v16i8:$src, Idx), 43235ffd83dbSDimitry Andric i8)))), 43245ffd83dbSDimitry Andric (f128 (XSCVSDQP (EXTRACT_SUBREG 43255ffd83dbSDimitry Andric (VEXTSB2D (VEXTRACTUB Idx, $src)), sub_64)))>; 43265ffd83dbSDimitry Andric def : Pat<(f128 (uint_to_fp 43275ffd83dbSDimitry Andric (and (i32 (vector_extract v16i8:$src, Idx)), 255))), 43285ffd83dbSDimitry Andric (f128 (XSCVUDQP 43295ffd83dbSDimitry Andric (EXTRACT_SUBREG (VEXTRACTUB Idx, $src), sub_64)))>; 4330*fe6060f1SDimitry Andric 4331*fe6060f1SDimitry Andric def : Pat<(f32 (PPCfcfidus 4332*fe6060f1SDimitry Andric (f64 (PPCmtvsrz 4333*fe6060f1SDimitry Andric (and (i32 (vector_extract v16i8:$src, Idx)), 4334*fe6060f1SDimitry Andric 255))))), 4335*fe6060f1SDimitry Andric (f32 (XSCVUXDSP (EXTRACT_SUBREG 4336*fe6060f1SDimitry Andric (VEXTRACTUB !add(Idx, Idx), $src), sub_64)))>; 4337*fe6060f1SDimitry Andric def : Pat<(f32 (PPCfcfids 4338*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4339*fe6060f1SDimitry Andric (i32 (sext_inreg (vector_extract v16i8:$src, Idx), 4340*fe6060f1SDimitry Andric i8)))))), 4341*fe6060f1SDimitry Andric (f32 (XSCVSXDSP (EXTRACT_SUBREG 4342*fe6060f1SDimitry Andric (VEXTSH2D (VEXTRACTUB !add(Idx, Idx), $src)), 4343*fe6060f1SDimitry Andric sub_64)))>; 4344*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfidu 4345*fe6060f1SDimitry Andric (f64 (PPCmtvsrz 4346*fe6060f1SDimitry Andric (and (i32 (vector_extract v16i8:$src, Idx)), 4347*fe6060f1SDimitry Andric 255))))), 4348*fe6060f1SDimitry Andric (f64 (XSCVUXDDP (EXTRACT_SUBREG 4349*fe6060f1SDimitry Andric (VEXTRACTUB !add(Idx, Idx), $src), sub_64)))>; 4350*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfid 4351*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4352*fe6060f1SDimitry Andric (i32 (sext_inreg (vector_extract v16i8:$src, Idx), 4353*fe6060f1SDimitry Andric i8)))))), 4354*fe6060f1SDimitry Andric (f64 (XSCVSXDDP (EXTRACT_SUBREG 4355*fe6060f1SDimitry Andric (VEXTSH2D (VEXTRACTUB !add(Idx, Idx), $src)), 4356*fe6060f1SDimitry Andric sub_64)))>; 43570b57cec5SDimitry Andric} 43580b57cec5SDimitry Andric 43595ffd83dbSDimitry Andric// Unsiged int in vsx register -> QP 43605ffd83dbSDimitry Andricdef : Pat<(f128 (uint_to_fp (i32 (PPCmfvsr f64:$src)))), 43615ffd83dbSDimitry Andric (f128 (XSCVUDQP 43625ffd83dbSDimitry Andric (XXEXTRACTUW (SUBREG_TO_REG (i64 1), $src, sub_64), 4)))>; 4363e8d8bef9SDimitry Andric} // HasVSX, HasP9Vector, IsBigEndian, IsPPC64 43645ffd83dbSDimitry Andric 43655ffd83dbSDimitry Andric// Little endian Power9 subtarget. 43665ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP9Vector, IsLittleEndian] in { 43675ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))), 43685ffd83dbSDimitry Andric (f32 (XSCVUXDSP (XXEXTRACTUW $A, 12)))>; 43695ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))), 43705ffd83dbSDimitry Andric (f32 (XSCVUXDSP (XXEXTRACTUW $A, 8)))>; 43715ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))), 43725ffd83dbSDimitry Andric (f32 (XSCVUXDSP (XXEXTRACTUW $A, 4)))>; 43735ffd83dbSDimitry Andricdef : Pat<(f32 (PPCfcfidus (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))), 43745ffd83dbSDimitry Andric (f32 (XSCVUXDSP (XXEXTRACTUW $A, 0)))>; 43755ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 0)))))), 43765ffd83dbSDimitry Andric (f64 (XSCVUXDDP (XXEXTRACTUW $A, 12)))>; 43775ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 1)))))), 43785ffd83dbSDimitry Andric (f64 (XSCVUXDDP (XXEXTRACTUW $A, 8)))>; 43795ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 2)))))), 43805ffd83dbSDimitry Andric (f64 (XSCVUXDDP (XXEXTRACTUW $A, 4)))>; 43815ffd83dbSDimitry Andricdef : Pat<(f64 (PPCfcfidu (f64 (PPCmtvsrz (i32 (extractelt v4i32:$A, 3)))))), 43825ffd83dbSDimitry Andric (f64 (XSCVUXDDP (XXEXTRACTUW $A, 0)))>; 43835ffd83dbSDimitry Andricdef : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 0)), 43845ffd83dbSDimitry Andric (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 12))>; 43855ffd83dbSDimitry Andricdef : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 1)), 43865ffd83dbSDimitry Andric (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 8))>; 43875ffd83dbSDimitry Andricdef : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 2)), 43885ffd83dbSDimitry Andric (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 4))>; 43895ffd83dbSDimitry Andricdef : Pat<(v4i32 (insertelt v4i32:$A, i32:$B, 3)), 43905ffd83dbSDimitry Andric (v4i32 (XXINSERTW v4i32:$A, AlignValues.I32_TO_BE_WORD1, 0))>; 43915ffd83dbSDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 0)), 43925ffd83dbSDimitry Andric (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 12))>; 43935ffd83dbSDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 1)), 43945ffd83dbSDimitry Andric (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 8))>; 43955ffd83dbSDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 2)), 43965ffd83dbSDimitry Andric (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 4))>; 43975ffd83dbSDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, f32:$B, 3)), 43985ffd83dbSDimitry Andric (v4f32 (XXINSERTW v4f32:$A, AlignValues.F32_TO_BE_WORD1, 0))>; 43995ffd83dbSDimitry Andric 4400*fe6060f1SDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, (f32 (fpround f64:$B)), 0)), 4401*fe6060f1SDimitry Andric (v4f32 (XXINSERTW v4f32:$A, 4402*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$B), sub_64), 12))>; 4403*fe6060f1SDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, (f32 (fpround f64:$B)), 1)), 4404*fe6060f1SDimitry Andric (v4f32 (XXINSERTW v4f32:$A, 4405*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$B), sub_64), 8))>; 4406*fe6060f1SDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, (f32 (fpround f64:$B)), 2)), 4407*fe6060f1SDimitry Andric (v4f32 (XXINSERTW v4f32:$A, 4408*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$B), sub_64), 4))>; 4409*fe6060f1SDimitry Andricdef : Pat<(v4f32 (insertelt v4f32:$A, (f32 (fpround f64:$B)), 3)), 4410*fe6060f1SDimitry Andric (v4f32 (XXINSERTW v4f32:$A, 4411*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XSCVDPSP f64:$B), sub_64), 0))>; 44125ffd83dbSDimitry Andric 4413*fe6060f1SDimitry Andricdef : Pat<(v8i16 (PPCld_vec_be ForceXForm:$src)), 4414*fe6060f1SDimitry Andric (COPY_TO_REGCLASS (LXVH8X ForceXForm:$src), VRRC)>; 4415*fe6060f1SDimitry Andricdef : Pat<(PPCst_vec_be v8i16:$rS, ForceXForm:$dst), 4416*fe6060f1SDimitry Andric (STXVH8X (COPY_TO_REGCLASS $rS, VSRC), ForceXForm:$dst)>; 4417*fe6060f1SDimitry Andric 4418*fe6060f1SDimitry Andricdef : Pat<(v16i8 (PPCld_vec_be ForceXForm:$src)), 4419*fe6060f1SDimitry Andric (COPY_TO_REGCLASS (LXVB16X ForceXForm:$src), VRRC)>; 4420*fe6060f1SDimitry Andricdef : Pat<(PPCst_vec_be v16i8:$rS, ForceXForm:$dst), 4421*fe6060f1SDimitry Andric (STXVB16X (COPY_TO_REGCLASS $rS, VSRC), ForceXForm:$dst)>; 44225ffd83dbSDimitry Andric 44235ffd83dbSDimitry Andric// Scalar stores of i8 4424*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 0)), ForceXForm:$dst), 4425*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 8)), VSRC), ForceXForm:$dst)>; 4426*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 1)), ForceXForm:$dst), 4427*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 7)), VSRC), ForceXForm:$dst)>; 4428*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 2)), ForceXForm:$dst), 4429*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 6)), VSRC), ForceXForm:$dst)>; 4430*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 3)), ForceXForm:$dst), 4431*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 5)), VSRC), ForceXForm:$dst)>; 4432*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 4)), ForceXForm:$dst), 4433*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 4)), VSRC), ForceXForm:$dst)>; 4434*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 5)), ForceXForm:$dst), 4435*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 3)), VSRC), ForceXForm:$dst)>; 4436*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 6)), ForceXForm:$dst), 4437*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 2)), VSRC), ForceXForm:$dst)>; 4438*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 7)), ForceXForm:$dst), 4439*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 1)), VSRC), ForceXForm:$dst)>; 4440*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 8)), ForceXForm:$dst), 4441*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS $S, VSRC), ForceXForm:$dst)>; 4442*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 9)), ForceXForm:$dst), 4443*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 15)), VSRC), ForceXForm:$dst)>; 4444*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 10)), ForceXForm:$dst), 4445*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 14)), VSRC), ForceXForm:$dst)>; 4446*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 11)), ForceXForm:$dst), 4447*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 13)), VSRC), ForceXForm:$dst)>; 4448*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 12)), ForceXForm:$dst), 4449*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 12)), VSRC), ForceXForm:$dst)>; 4450*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 13)), ForceXForm:$dst), 4451*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 11)), VSRC), ForceXForm:$dst)>; 4452*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 14)), ForceXForm:$dst), 4453*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 10)), VSRC), ForceXForm:$dst)>; 4454*fe6060f1SDimitry Andricdef : Pat<(truncstorei8 (i32 (vector_extract v16i8:$S, 15)), ForceXForm:$dst), 4455*fe6060f1SDimitry Andric (STXSIBXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 9)), VSRC), ForceXForm:$dst)>; 44565ffd83dbSDimitry Andric 44575ffd83dbSDimitry Andric// Scalar stores of i16 4458*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 0)), ForceXForm:$dst), 4459*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 8)), VSRC), ForceXForm:$dst)>; 4460*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 1)), ForceXForm:$dst), 4461*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 6)), VSRC), ForceXForm:$dst)>; 4462*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 2)), ForceXForm:$dst), 4463*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 4)), VSRC), ForceXForm:$dst)>; 4464*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 3)), ForceXForm:$dst), 4465*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 2)), VSRC), ForceXForm:$dst)>; 4466*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 4)), ForceXForm:$dst), 4467*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS $S, VSRC), ForceXForm:$dst)>; 4468*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 5)), ForceXForm:$dst), 4469*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 14)), VSRC), ForceXForm:$dst)>; 4470*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 6)), ForceXForm:$dst), 4471*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 12)), VSRC), ForceXForm:$dst)>; 4472*fe6060f1SDimitry Andricdef : Pat<(truncstorei16 (i32 (vector_extract v8i16:$S, 7)), ForceXForm:$dst), 4473*fe6060f1SDimitry Andric (STXSIHXv (COPY_TO_REGCLASS (v16i8 (VSLDOI $S, $S, 10)), VSRC), ForceXForm:$dst)>; 44745ffd83dbSDimitry Andric 44755ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 4476*fe6060f1SDimitry Andric v2i64, (i64 (load DSForm:$src)), 4477*fe6060f1SDimitry Andric (XXPERMDIs (DFLOADf64 DSForm:$src), 2), 4478*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (DFLOADf64 DSForm:$src), sub_64)>; 44795ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 4480*fe6060f1SDimitry Andric v2i64, (i64 (load XForm:$src)), 4481*fe6060f1SDimitry Andric (XXPERMDIs (XFLOADf64 XForm:$src), 2), 4482*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XFLOADf64 XForm:$src), sub_64)>; 44835ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 4484*fe6060f1SDimitry Andric v2f64, (f64 (load DSForm:$src)), 4485*fe6060f1SDimitry Andric (XXPERMDIs (DFLOADf64 DSForm:$src), 2), 4486*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (DFLOADf64 DSForm:$src), sub_64)>; 44875ffd83dbSDimitry Andricdefm : ScalToVecWPermute< 4488*fe6060f1SDimitry Andric v2f64, (f64 (load XForm:$src)), 4489*fe6060f1SDimitry Andric (XXPERMDIs (XFLOADf64 XForm:$src), 2), 4490*fe6060f1SDimitry Andric (SUBREG_TO_REG (i64 1), (XFLOADf64 XForm:$src), sub_64)>; 44915ffd83dbSDimitry Andric 4492*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 0)), XForm:$src), 44935ffd83dbSDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), 4494*fe6060f1SDimitry Andric sub_64), XForm:$src)>; 4495*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 0)), XForm:$src), 44965ffd83dbSDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), 4497*fe6060f1SDimitry Andric sub_64), XForm:$src)>; 4498*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 1)), XForm:$src), 4499*fe6060f1SDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), XForm:$src)>; 4500*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 1)), XForm:$src), 4501*fe6060f1SDimitry Andric (XFSTOREf64 (EXTRACT_SUBREG $A, sub_64), XForm:$src)>; 4502*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 0)), DSForm:$src), 45035ffd83dbSDimitry Andric (DFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), 4504*fe6060f1SDimitry Andric sub_64), DSForm:$src)>; 4505*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 0)), DSForm:$src), 45065ffd83dbSDimitry Andric (DFSTOREf64 (EXTRACT_SUBREG (XXPERMDI $A, $A, 2), sub_64), 4507*fe6060f1SDimitry Andric DSForm:$src)>; 4508*fe6060f1SDimitry Andricdef : Pat<(store (i64 (extractelt v2i64:$A, 1)), DSForm:$src), 4509*fe6060f1SDimitry Andric (DFSTOREf64 (EXTRACT_SUBREG $A, sub_64), DSForm:$src)>; 4510*fe6060f1SDimitry Andricdef : Pat<(store (f64 (extractelt v2f64:$A, 1)), DSForm:$src), 4511*fe6060f1SDimitry Andric (DFSTOREf64 (EXTRACT_SUBREG $A, sub_64), DSForm:$src)>; 45125ffd83dbSDimitry Andric 45135ffd83dbSDimitry Andric// (Un)Signed DWord vector extract -> QP 45145ffd83dbSDimitry Andricdef : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 0)))), 45155ffd83dbSDimitry Andric (f128 (XSCVSDQP 45165ffd83dbSDimitry Andric (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>; 45175ffd83dbSDimitry Andricdef : Pat<(f128 (sint_to_fp (i64 (extractelt v2i64:$src, 1)))), 45185ffd83dbSDimitry Andric (f128 (XSCVSDQP (COPY_TO_REGCLASS $src, VFRC)))>; 45195ffd83dbSDimitry Andricdef : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 0)))), 45205ffd83dbSDimitry Andric (f128 (XSCVUDQP 45215ffd83dbSDimitry Andric (EXTRACT_SUBREG (XXPERMDI $src, $src, 3), sub_64)))>; 45225ffd83dbSDimitry Andricdef : Pat<(f128 (uint_to_fp (i64 (extractelt v2i64:$src, 1)))), 45235ffd83dbSDimitry Andric (f128 (XSCVUDQP (COPY_TO_REGCLASS $src, VFRC)))>; 45245ffd83dbSDimitry Andric 45255ffd83dbSDimitry Andric// (Un)Signed Word vector extract -> QP 45265ffd83dbSDimitry Andricforeach Idx = [[0,3],[1,2],[3,0]] in { 45275ffd83dbSDimitry Andric def : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, !head(Idx))))), 45285ffd83dbSDimitry Andric (f128 (XSCVSDQP (EXTRACT_SUBREG 45295ffd83dbSDimitry Andric (VEXTSW2D (VSPLTW !head(!tail(Idx)), $src)), 45305ffd83dbSDimitry Andric sub_64)))>; 45315ffd83dbSDimitry Andric} 45325ffd83dbSDimitry Andricdef : Pat<(f128 (sint_to_fp (i32 (extractelt v4i32:$src, 2)))), 45335ffd83dbSDimitry Andric (f128 (XSCVSDQP (EXTRACT_SUBREG (VEXTSW2D $src), sub_64)))>; 45345ffd83dbSDimitry Andric 45355ffd83dbSDimitry Andricforeach Idx = [[0,12],[1,8],[2,4],[3,0]] in { 45365ffd83dbSDimitry Andric def : Pat<(f128 (uint_to_fp (i32 (extractelt v4i32:$src, !head(Idx))))), 45375ffd83dbSDimitry Andric (f128 (XSCVUDQP (XXEXTRACTUW $src, !head(!tail(Idx)))))>; 45380b57cec5SDimitry Andric} 45390b57cec5SDimitry Andric 4540*fe6060f1SDimitry Andric// (Un)Signed HWord vector extract -> QP/DP/SP 45415ffd83dbSDimitry Andric// The Nested foreach lists identifies the vector element and corresponding 45425ffd83dbSDimitry Andric// register byte location. 45435ffd83dbSDimitry Andricforeach Idx = [[0,14],[1,12],[2,10],[3,8],[4,6],[5,4],[6,2],[7,0]] in { 45445ffd83dbSDimitry Andric def : Pat<(f128 (sint_to_fp 45455ffd83dbSDimitry Andric (i32 (sext_inreg 45465ffd83dbSDimitry Andric (vector_extract v8i16:$src, !head(Idx)), i16)))), 45475ffd83dbSDimitry Andric (f128 (XSCVSDQP 45485ffd83dbSDimitry Andric (EXTRACT_SUBREG (VEXTSH2D 45495ffd83dbSDimitry Andric (VEXTRACTUH !head(!tail(Idx)), $src)), 45505ffd83dbSDimitry Andric sub_64)))>; 45515ffd83dbSDimitry Andric def : Pat<(f128 (uint_to_fp 45525ffd83dbSDimitry Andric (and (i32 (vector_extract v8i16:$src, !head(Idx))), 45535ffd83dbSDimitry Andric 65535))), 45545ffd83dbSDimitry Andric (f128 (XSCVUDQP (EXTRACT_SUBREG 45555ffd83dbSDimitry Andric (VEXTRACTUH !head(!tail(Idx)), $src), sub_64)))>; 4556*fe6060f1SDimitry Andric def : Pat<(f32 (PPCfcfidus 4557*fe6060f1SDimitry Andric (f64 (PPCmtvsrz 4558*fe6060f1SDimitry Andric (and (i32 (vector_extract v8i16:$src, !head(Idx))), 4559*fe6060f1SDimitry Andric 65535))))), 4560*fe6060f1SDimitry Andric (f32 (XSCVUXDSP (EXTRACT_SUBREG 4561*fe6060f1SDimitry Andric (VEXTRACTUH !head(!tail(Idx)), $src), sub_64)))>; 4562*fe6060f1SDimitry Andric def : Pat<(f32 (PPCfcfids 4563*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4564*fe6060f1SDimitry Andric (i32 (sext_inreg (vector_extract v8i16:$src, 4565*fe6060f1SDimitry Andric !head(Idx)), i16)))))), 4566*fe6060f1SDimitry Andric (f32 (XSCVSXDSP 4567*fe6060f1SDimitry Andric (EXTRACT_SUBREG 4568*fe6060f1SDimitry Andric (VEXTSH2D (VEXTRACTUH !head(!tail(Idx)), $src)), 4569*fe6060f1SDimitry Andric sub_64)))>; 4570*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfidu 4571*fe6060f1SDimitry Andric (f64 (PPCmtvsrz 4572*fe6060f1SDimitry Andric (and (i32 (vector_extract v8i16:$src, !head(Idx))), 4573*fe6060f1SDimitry Andric 65535))))), 4574*fe6060f1SDimitry Andric (f64 (XSCVUXDDP (EXTRACT_SUBREG 4575*fe6060f1SDimitry Andric (VEXTRACTUH !head(!tail(Idx)), $src), sub_64)))>; 4576*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfid 4577*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4578*fe6060f1SDimitry Andric (i32 (sext_inreg 4579*fe6060f1SDimitry Andric (vector_extract v8i16:$src, !head(Idx)), i16)))))), 4580*fe6060f1SDimitry Andric (f64 (XSCVSXDDP 4581*fe6060f1SDimitry Andric (EXTRACT_SUBREG (VEXTSH2D 4582*fe6060f1SDimitry Andric (VEXTRACTUH !head(!tail(Idx)), $src)), 4583*fe6060f1SDimitry Andric sub_64)))>; 45840b57cec5SDimitry Andric} 45850b57cec5SDimitry Andric 4586*fe6060f1SDimitry Andric// (Un)Signed Byte vector extract -> QP/DP/SP 45875ffd83dbSDimitry Andricforeach Idx = [[0,15],[1,14],[2,13],[3,12],[4,11],[5,10],[6,9],[7,8],[8,7], 45885ffd83dbSDimitry Andric [9,6],[10,5],[11,4],[12,3],[13,2],[14,1],[15,0]] in { 45895ffd83dbSDimitry Andric def : Pat<(f128 (sint_to_fp 45905ffd83dbSDimitry Andric (i32 (sext_inreg 45915ffd83dbSDimitry Andric (vector_extract v16i8:$src, !head(Idx)), i8)))), 45925ffd83dbSDimitry Andric (f128 (XSCVSDQP 45935ffd83dbSDimitry Andric (EXTRACT_SUBREG 45945ffd83dbSDimitry Andric (VEXTSB2D (VEXTRACTUB !head(!tail(Idx)), $src)), 45955ffd83dbSDimitry Andric sub_64)))>; 45965ffd83dbSDimitry Andric def : Pat<(f128 (uint_to_fp 45975ffd83dbSDimitry Andric (and (i32 (vector_extract v16i8:$src, !head(Idx))), 45985ffd83dbSDimitry Andric 255))), 45995ffd83dbSDimitry Andric (f128 (XSCVUDQP 46005ffd83dbSDimitry Andric (EXTRACT_SUBREG 46015ffd83dbSDimitry Andric (VEXTRACTUB !head(!tail(Idx)), $src), sub_64)))>; 4602*fe6060f1SDimitry Andric 4603*fe6060f1SDimitry Andric def : Pat<(f32 (PPCfcfidus 4604*fe6060f1SDimitry Andric (f64 (PPCmtvsrz 4605*fe6060f1SDimitry Andric (and (i32 (vector_extract v16i8:$src, !head(Idx))), 4606*fe6060f1SDimitry Andric 255))))), 4607*fe6060f1SDimitry Andric (f32 (XSCVUXDSP (EXTRACT_SUBREG 4608*fe6060f1SDimitry Andric (VEXTRACTUB !head(!tail(Idx)), $src), sub_64)))>; 4609*fe6060f1SDimitry Andric def : Pat<(f32 (PPCfcfids 4610*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4611*fe6060f1SDimitry Andric (i32 (sext_inreg 4612*fe6060f1SDimitry Andric (vector_extract v16i8:$src, !head(Idx)), i8)))))), 4613*fe6060f1SDimitry Andric (f32 (XSCVSXDSP 4614*fe6060f1SDimitry Andric (EXTRACT_SUBREG (VEXTSH2D 4615*fe6060f1SDimitry Andric (VEXTRACTUB !head(!tail(Idx)), $src)), 4616*fe6060f1SDimitry Andric sub_64)))>; 4617*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfidu 4618*fe6060f1SDimitry Andric (f64 (PPCmtvsrz 4619*fe6060f1SDimitry Andric (and (i32 4620*fe6060f1SDimitry Andric (vector_extract v16i8:$src, !head(Idx))), 255))))), 4621*fe6060f1SDimitry Andric (f64 (XSCVUXDDP (EXTRACT_SUBREG 4622*fe6060f1SDimitry Andric (VEXTRACTUB !head(!tail(Idx)), $src), sub_64)))>; 4623*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfidu 4624*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4625*fe6060f1SDimitry Andric (i32 (sext_inreg 4626*fe6060f1SDimitry Andric (vector_extract v16i8:$src, !head(Idx)), i8)))))), 4627*fe6060f1SDimitry Andric (f64 (XSCVSXDDP 4628*fe6060f1SDimitry Andric (EXTRACT_SUBREG (VEXTSH2D 4629*fe6060f1SDimitry Andric (VEXTRACTUB !head(!tail(Idx)), $src)), 4630*fe6060f1SDimitry Andric sub_64)))>; 4631*fe6060f1SDimitry Andric 4632*fe6060f1SDimitry Andric def : Pat<(f64 (PPCfcfid 4633*fe6060f1SDimitry Andric (f64 (PPCmtvsra 4634*fe6060f1SDimitry Andric (i32 (sext_inreg 4635*fe6060f1SDimitry Andric (vector_extract v16i8:$src, !head(Idx)), i8)))))), 4636*fe6060f1SDimitry Andric (f64 (XSCVSXDDP 4637*fe6060f1SDimitry Andric (EXTRACT_SUBREG (VEXTSH2D 4638*fe6060f1SDimitry Andric (VEXTRACTUH !head(!tail(Idx)), $src)), 4639*fe6060f1SDimitry Andric sub_64)))>; 46405ffd83dbSDimitry Andric} 46415ffd83dbSDimitry Andric 46425ffd83dbSDimitry Andric// Unsiged int in vsx register -> QP 46435ffd83dbSDimitry Andricdef : Pat<(f128 (uint_to_fp (i32 (PPCmfvsr f64:$src)))), 46445ffd83dbSDimitry Andric (f128 (XSCVUDQP 46455ffd83dbSDimitry Andric (XXEXTRACTUW (SUBREG_TO_REG (i64 1), $src, sub_64), 8)))>; 46465ffd83dbSDimitry Andric} // HasVSX, HasP9Vector, IsLittleEndian 46475ffd83dbSDimitry Andric 46485ffd83dbSDimitry Andric// Any Power9 VSX subtarget that supports Power9 Altivec. 46495ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP9Altivec] in { 46500b57cec5SDimitry Andric// Put this P9Altivec related definition here since it's possible to be 46510b57cec5SDimitry Andric// selected to VSX instruction xvnegsp, avoid possible undef. 46520b57cec5SDimitry Andricdef : Pat<(v4i32 (PPCvabsd v4i32:$A, v4i32:$B, (i32 0))), 46530b57cec5SDimitry Andric (v4i32 (VABSDUW $A, $B))>; 46540b57cec5SDimitry Andric 46550b57cec5SDimitry Andricdef : Pat<(v8i16 (PPCvabsd v8i16:$A, v8i16:$B, (i32 0))), 46560b57cec5SDimitry Andric (v8i16 (VABSDUH $A, $B))>; 46570b57cec5SDimitry Andric 46580b57cec5SDimitry Andricdef : Pat<(v16i8 (PPCvabsd v16i8:$A, v16i8:$B, (i32 0))), 46590b57cec5SDimitry Andric (v16i8 (VABSDUB $A, $B))>; 46600b57cec5SDimitry Andric 46610b57cec5SDimitry Andric// As PPCVABSD description, the last operand indicates whether do the 46620b57cec5SDimitry Andric// sign bit flip. 46630b57cec5SDimitry Andricdef : Pat<(v4i32 (PPCvabsd v4i32:$A, v4i32:$B, (i32 1))), 46640b57cec5SDimitry Andric (v4i32 (VABSDUW (XVNEGSP $A), (XVNEGSP $B)))>; 46655ffd83dbSDimitry Andric} // HasVSX, HasP9Altivec 46665ffd83dbSDimitry Andric 4667e8d8bef9SDimitry Andric// Big endian Power9 64Bit VSX subtargets with P9 Altivec support. 4668e8d8bef9SDimitry Andriclet Predicates = [HasVSX, HasP9Altivec, IsBigEndian, IsPPC64] in { 46695ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v16i8:$S, i64:$Idx)))), 46705ffd83dbSDimitry Andric (VEXTUBLX $Idx, $S)>; 46715ffd83dbSDimitry Andric 46725ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, i64:$Idx)))), 46735ffd83dbSDimitry Andric (VEXTUHLX (RLWINM8 $Idx, 1, 28, 30), $S)>; 46745ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 0)))), 46755ffd83dbSDimitry Andric (VEXTUHLX (LI8 0), $S)>; 46765ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 1)))), 46775ffd83dbSDimitry Andric (VEXTUHLX (LI8 2), $S)>; 46785ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 2)))), 46795ffd83dbSDimitry Andric (VEXTUHLX (LI8 4), $S)>; 46805ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 3)))), 46815ffd83dbSDimitry Andric (VEXTUHLX (LI8 6), $S)>; 46825ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 4)))), 46835ffd83dbSDimitry Andric (VEXTUHLX (LI8 8), $S)>; 46845ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 5)))), 46855ffd83dbSDimitry Andric (VEXTUHLX (LI8 10), $S)>; 46865ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 6)))), 46875ffd83dbSDimitry Andric (VEXTUHLX (LI8 12), $S)>; 46885ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 7)))), 46895ffd83dbSDimitry Andric (VEXTUHLX (LI8 14), $S)>; 46905ffd83dbSDimitry Andric 46915ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, i64:$Idx)))), 46925ffd83dbSDimitry Andric (VEXTUWLX (RLWINM8 $Idx, 2, 28, 29), $S)>; 46935ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 0)))), 46945ffd83dbSDimitry Andric (VEXTUWLX (LI8 0), $S)>; 46955ffd83dbSDimitry Andric 46965ffd83dbSDimitry Andric// For extracting BE word 1, MFVSRWZ is better than VEXTUWLX 46975ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 1)))), 46985ffd83dbSDimitry Andric (INSERT_SUBREG (i64 (IMPLICIT_DEF)), 46995ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_2), sub_32)>; 47005ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 2)))), 47015ffd83dbSDimitry Andric (VEXTUWLX (LI8 8), $S)>; 47025ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 3)))), 47035ffd83dbSDimitry Andric (VEXTUWLX (LI8 12), $S)>; 47045ffd83dbSDimitry Andric 47055ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, i64:$Idx)))), 47065ffd83dbSDimitry Andric (EXTSW (VEXTUWLX (RLWINM8 $Idx, 2, 28, 29), $S))>; 47075ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 0)))), 47085ffd83dbSDimitry Andric (EXTSW (VEXTUWLX (LI8 0), $S))>; 47095ffd83dbSDimitry Andric// For extracting BE word 1, MFVSRWZ is better than VEXTUWLX 47105ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 1)))), 47115ffd83dbSDimitry Andric (EXTSW (INSERT_SUBREG (i64 (IMPLICIT_DEF)), 47125ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_2), sub_32))>; 47135ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 2)))), 47145ffd83dbSDimitry Andric (EXTSW (VEXTUWLX (LI8 8), $S))>; 47155ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 3)))), 47165ffd83dbSDimitry Andric (EXTSW (VEXTUWLX (LI8 12), $S))>; 47175ffd83dbSDimitry Andric 47185ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)), 47195ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX $Idx, $S), sub_32))>; 47205ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 0)), 47215ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 0), $S), sub_32))>; 47225ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 1)), 47235ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 1), $S), sub_32))>; 47245ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 2)), 47255ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 2), $S), sub_32))>; 47265ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 3)), 47275ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 3), $S), sub_32))>; 47285ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 4)), 47295ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 4), $S), sub_32))>; 47305ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 5)), 47315ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 5), $S), sub_32))>; 47325ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 6)), 47335ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 6), $S), sub_32))>; 47345ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 7)), 47355ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 7), $S), sub_32))>; 47365ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 8)), 47375ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 8), $S), sub_32))>; 47385ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 9)), 47395ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 9), $S), sub_32))>; 47405ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 10)), 47415ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 10), $S), sub_32))>; 47425ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 11)), 47435ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 11), $S), sub_32))>; 47445ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 12)), 47455ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 12), $S), sub_32))>; 47465ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 13)), 47475ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 13), $S), sub_32))>; 47485ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 14)), 47495ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 14), $S), sub_32))>; 47505ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 15)), 47515ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBLX (LI8 15), $S), sub_32))>; 47525ffd83dbSDimitry Andric 47535ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)), 47545ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX 47555ffd83dbSDimitry Andric (RLWINM8 $Idx, 1, 28, 30), $S), sub_32))>; 47565ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 0)), 47575ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 0), $S), sub_32))>; 47585ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 1)), 47595ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 2), $S), sub_32))>; 47605ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 2)), 47615ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 4), $S), sub_32))>; 47625ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 3)), 47635ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 6), $S), sub_32))>; 47645ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 4)), 47655ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 8), $S), sub_32))>; 47665ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 5)), 47675ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 10), $S), sub_32))>; 47685ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 6)), 47695ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 12), $S), sub_32))>; 47705ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 6)), 47715ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHLX (LI8 14), $S), sub_32))>; 47725ffd83dbSDimitry Andric 47735ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)), 47745ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUWLX 47755ffd83dbSDimitry Andric (RLWINM8 $Idx, 2, 28, 29), $S), sub_32))>; 47765ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 0)), 47775ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 0), $S), sub_32))>; 47785ffd83dbSDimitry Andric// For extracting BE word 1, MFVSRWZ is better than VEXTUWLX 47795ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 1)), 47805ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_2)>; 47815ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 2)), 47825ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 8), $S), sub_32))>; 47835ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 3)), 47845ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUWLX (LI8 12), $S), sub_32))>; 47855ffd83dbSDimitry Andric 47865ffd83dbSDimitry Andric// P9 Altivec instructions that can be used to build vectors. 47875ffd83dbSDimitry Andric// Adding them to PPCInstrVSX.td rather than PPCAltivecVSX.td to compete 47885ffd83dbSDimitry Andric// with complexities of existing build vector patterns in this file. 47895ffd83dbSDimitry Andricdef : Pat<(v2i64 (build_vector WordToDWord.BE_A0, WordToDWord.BE_A1)), 47905ffd83dbSDimitry Andric (v2i64 (VEXTSW2D $A))>; 47915ffd83dbSDimitry Andricdef : Pat<(v2i64 (build_vector HWordToDWord.BE_A0, HWordToDWord.BE_A1)), 47925ffd83dbSDimitry Andric (v2i64 (VEXTSH2D $A))>; 47935ffd83dbSDimitry Andricdef : Pat<(v4i32 (build_vector HWordToWord.BE_A0, HWordToWord.BE_A1, 47945ffd83dbSDimitry Andric HWordToWord.BE_A2, HWordToWord.BE_A3)), 47955ffd83dbSDimitry Andric (v4i32 (VEXTSH2W $A))>; 47965ffd83dbSDimitry Andricdef : Pat<(v4i32 (build_vector ByteToWord.BE_A0, ByteToWord.BE_A1, 47975ffd83dbSDimitry Andric ByteToWord.BE_A2, ByteToWord.BE_A3)), 47985ffd83dbSDimitry Andric (v4i32 (VEXTSB2W $A))>; 47995ffd83dbSDimitry Andricdef : Pat<(v2i64 (build_vector ByteToDWord.BE_A0, ByteToDWord.BE_A1)), 48005ffd83dbSDimitry Andric (v2i64 (VEXTSB2D $A))>; 4801e8d8bef9SDimitry Andric} // HasVSX, HasP9Altivec, IsBigEndian, IsPPC64 48025ffd83dbSDimitry Andric 48035ffd83dbSDimitry Andric// Little endian Power9 VSX subtargets with P9 Altivec support. 48045ffd83dbSDimitry Andriclet Predicates = [HasVSX, HasP9Altivec, IsLittleEndian] in { 48055ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v16i8:$S, i64:$Idx)))), 48065ffd83dbSDimitry Andric (VEXTUBRX $Idx, $S)>; 48075ffd83dbSDimitry Andric 48085ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, i64:$Idx)))), 48095ffd83dbSDimitry Andric (VEXTUHRX (RLWINM8 $Idx, 1, 28, 30), $S)>; 48105ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 0)))), 48115ffd83dbSDimitry Andric (VEXTUHRX (LI8 0), $S)>; 48125ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 1)))), 48135ffd83dbSDimitry Andric (VEXTUHRX (LI8 2), $S)>; 48145ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 2)))), 48155ffd83dbSDimitry Andric (VEXTUHRX (LI8 4), $S)>; 48165ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 3)))), 48175ffd83dbSDimitry Andric (VEXTUHRX (LI8 6), $S)>; 48185ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 4)))), 48195ffd83dbSDimitry Andric (VEXTUHRX (LI8 8), $S)>; 48205ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 5)))), 48215ffd83dbSDimitry Andric (VEXTUHRX (LI8 10), $S)>; 48225ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 6)))), 48235ffd83dbSDimitry Andric (VEXTUHRX (LI8 12), $S)>; 48245ffd83dbSDimitry Andricdef : Pat<(i64 (anyext (i32 (vector_extract v8i16:$S, 7)))), 48255ffd83dbSDimitry Andric (VEXTUHRX (LI8 14), $S)>; 48265ffd83dbSDimitry Andric 48275ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, i64:$Idx)))), 48285ffd83dbSDimitry Andric (VEXTUWRX (RLWINM8 $Idx, 2, 28, 29), $S)>; 48295ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 0)))), 48305ffd83dbSDimitry Andric (VEXTUWRX (LI8 0), $S)>; 48315ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 1)))), 48325ffd83dbSDimitry Andric (VEXTUWRX (LI8 4), $S)>; 48335ffd83dbSDimitry Andric// For extracting LE word 2, MFVSRWZ is better than VEXTUWRX 48345ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 2)))), 48355ffd83dbSDimitry Andric (INSERT_SUBREG (i64 (IMPLICIT_DEF)), 48365ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_2), sub_32)>; 48375ffd83dbSDimitry Andricdef : Pat<(i64 (zext (i32 (vector_extract v4i32:$S, 3)))), 48385ffd83dbSDimitry Andric (VEXTUWRX (LI8 12), $S)>; 48395ffd83dbSDimitry Andric 48405ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, i64:$Idx)))), 48415ffd83dbSDimitry Andric (EXTSW (VEXTUWRX (RLWINM8 $Idx, 2, 28, 29), $S))>; 48425ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 0)))), 48435ffd83dbSDimitry Andric (EXTSW (VEXTUWRX (LI8 0), $S))>; 48445ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 1)))), 48455ffd83dbSDimitry Andric (EXTSW (VEXTUWRX (LI8 4), $S))>; 48465ffd83dbSDimitry Andric// For extracting LE word 2, MFVSRWZ is better than VEXTUWRX 48475ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 2)))), 48485ffd83dbSDimitry Andric (EXTSW (INSERT_SUBREG (i64 (IMPLICIT_DEF)), 48495ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_2), sub_32))>; 48505ffd83dbSDimitry Andricdef : Pat<(i64 (sext (i32 (vector_extract v4i32:$S, 3)))), 48515ffd83dbSDimitry Andric (EXTSW (VEXTUWRX (LI8 12), $S))>; 48525ffd83dbSDimitry Andric 48535ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, i64:$Idx)), 48545ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX $Idx, $S), sub_32))>; 48555ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 0)), 48565ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 0), $S), sub_32))>; 48575ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 1)), 48585ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 1), $S), sub_32))>; 48595ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 2)), 48605ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 2), $S), sub_32))>; 48615ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 3)), 48625ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 3), $S), sub_32))>; 48635ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 4)), 48645ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 4), $S), sub_32))>; 48655ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 5)), 48665ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 5), $S), sub_32))>; 48675ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 6)), 48685ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 6), $S), sub_32))>; 48695ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 7)), 48705ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 7), $S), sub_32))>; 48715ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 8)), 48725ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 8), $S), sub_32))>; 48735ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 9)), 48745ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 9), $S), sub_32))>; 48755ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 10)), 48765ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 10), $S), sub_32))>; 48775ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 11)), 48785ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 11), $S), sub_32))>; 48795ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 12)), 48805ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 12), $S), sub_32))>; 48815ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 13)), 48825ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 13), $S), sub_32))>; 48835ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 14)), 48845ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 14), $S), sub_32))>; 48855ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v16i8:$S, 15)), 48865ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUBRX (LI8 15), $S), sub_32))>; 48875ffd83dbSDimitry Andric 48885ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, i64:$Idx)), 48895ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX 48905ffd83dbSDimitry Andric (RLWINM8 $Idx, 1, 28, 30), $S), sub_32))>; 48915ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 0)), 48925ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 0), $S), sub_32))>; 48935ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 1)), 48945ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 2), $S), sub_32))>; 48955ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 2)), 48965ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 4), $S), sub_32))>; 48975ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 3)), 48985ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 6), $S), sub_32))>; 48995ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 4)), 49005ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 8), $S), sub_32))>; 49015ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 5)), 49025ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 10), $S), sub_32))>; 49035ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 6)), 49045ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 12), $S), sub_32))>; 49055ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v8i16:$S, 6)), 49065ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUHRX (LI8 14), $S), sub_32))>; 49075ffd83dbSDimitry Andric 49085ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, i64:$Idx)), 49095ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUWRX 49105ffd83dbSDimitry Andric (RLWINM8 $Idx, 2, 28, 29), $S), sub_32))>; 49115ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 0)), 49125ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 0), $S), sub_32))>; 49135ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 1)), 49145ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 4), $S), sub_32))>; 49155ffd83dbSDimitry Andric// For extracting LE word 2, MFVSRWZ is better than VEXTUWRX 49165ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 2)), 49175ffd83dbSDimitry Andric (i32 VectorExtractions.LE_WORD_2)>; 49185ffd83dbSDimitry Andricdef : Pat<(i32 (vector_extract v4i32:$S, 3)), 49195ffd83dbSDimitry Andric (i32 (EXTRACT_SUBREG (VEXTUWRX (LI8 12), $S), sub_32))>; 49205ffd83dbSDimitry Andric 49215ffd83dbSDimitry Andric// P9 Altivec instructions that can be used to build vectors. 49225ffd83dbSDimitry Andric// Adding them to PPCInstrVSX.td rather than PPCAltivecVSX.td to compete 49235ffd83dbSDimitry Andric// with complexities of existing build vector patterns in this file. 49245ffd83dbSDimitry Andricdef : Pat<(v2i64 (build_vector WordToDWord.LE_A0, WordToDWord.LE_A1)), 49255ffd83dbSDimitry Andric (v2i64 (VEXTSW2D $A))>; 49265ffd83dbSDimitry Andricdef : Pat<(v2i64 (build_vector HWordToDWord.LE_A0, HWordToDWord.LE_A1)), 49275ffd83dbSDimitry Andric (v2i64 (VEXTSH2D $A))>; 49285ffd83dbSDimitry Andricdef : Pat<(v4i32 (build_vector HWordToWord.LE_A0, HWordToWord.LE_A1, 49295ffd83dbSDimitry Andric HWordToWord.LE_A2, HWordToWord.LE_A3)), 49305ffd83dbSDimitry Andric (v4i32 (VEXTSH2W $A))>; 49315ffd83dbSDimitry Andricdef : Pat<(v4i32 (build_vector ByteToWord.LE_A0, ByteToWord.LE_A1, 49325ffd83dbSDimitry Andric ByteToWord.LE_A2, ByteToWord.LE_A3)), 49335ffd83dbSDimitry Andric (v4i32 (VEXTSB2W $A))>; 49345ffd83dbSDimitry Andricdef : Pat<(v2i64 (build_vector ByteToDWord.LE_A0, ByteToDWord.LE_A1)), 49355ffd83dbSDimitry Andric (v2i64 (VEXTSB2D $A))>; 49365ffd83dbSDimitry Andric} // HasVSX, HasP9Altivec, IsLittleEndian 49375ffd83dbSDimitry Andric 4938e8d8bef9SDimitry Andric// Big endian 64Bit VSX subtarget that supports additional direct moves from 4939e8d8bef9SDimitry Andric// ISA3.0. 4940e8d8bef9SDimitry Andriclet Predicates = [HasVSX, IsISA3_0, HasDirectMove, IsBigEndian, IsPPC64] in { 49415ffd83dbSDimitry Andricdef : Pat<(i64 (extractelt v2i64:$A, 1)), 49425ffd83dbSDimitry Andric (i64 (MFVSRLD $A))>; 49435ffd83dbSDimitry Andric// Better way to build integer vectors if we have MTVSRDD. Big endian. 49445ffd83dbSDimitry Andricdef : Pat<(v2i64 (build_vector i64:$rB, i64:$rA)), 49455ffd83dbSDimitry Andric (v2i64 (MTVSRDD $rB, $rA))>; 49465ffd83dbSDimitry Andricdef : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)), 49475ffd83dbSDimitry Andric (MTVSRDD 49485ffd83dbSDimitry Andric (RLDIMI AnyExts.B, AnyExts.A, 32, 0), 49495ffd83dbSDimitry Andric (RLDIMI AnyExts.D, AnyExts.C, 32, 0))>; 49505ffd83dbSDimitry Andric 49515ffd83dbSDimitry Andricdef : Pat<(f128 (PPCbuild_fp128 i64:$rB, i64:$rA)), 49525ffd83dbSDimitry Andric (f128 (COPY_TO_REGCLASS (MTVSRDD $rB, $rA), VRRC))>; 4953e8d8bef9SDimitry Andric} // HasVSX, IsISA3_0, HasDirectMove, IsBigEndian, IsPPC64 49545ffd83dbSDimitry Andric 49555ffd83dbSDimitry Andric// Little endian VSX subtarget that supports direct moves from ISA3.0. 49565ffd83dbSDimitry Andriclet Predicates = [HasVSX, IsISA3_0, HasDirectMove, IsLittleEndian] in { 49575ffd83dbSDimitry Andricdef : Pat<(i64 (extractelt v2i64:$A, 0)), 49585ffd83dbSDimitry Andric (i64 (MFVSRLD $A))>; 49595ffd83dbSDimitry Andric// Better way to build integer vectors if we have MTVSRDD. Little endian. 49605ffd83dbSDimitry Andricdef : Pat<(v2i64 (build_vector i64:$rA, i64:$rB)), 49615ffd83dbSDimitry Andric (v2i64 (MTVSRDD $rB, $rA))>; 49625ffd83dbSDimitry Andricdef : Pat<(v4i32 (build_vector i32:$A, i32:$B, i32:$C, i32:$D)), 49635ffd83dbSDimitry Andric (MTVSRDD 49645ffd83dbSDimitry Andric (RLDIMI AnyExts.C, AnyExts.D, 32, 0), 49655ffd83dbSDimitry Andric (RLDIMI AnyExts.A, AnyExts.B, 32, 0))>; 49665ffd83dbSDimitry Andric 49675ffd83dbSDimitry Andricdef : Pat<(f128 (PPCbuild_fp128 i64:$rA, i64:$rB)), 49685ffd83dbSDimitry Andric (f128 (COPY_TO_REGCLASS (MTVSRDD $rB, $rA), VRRC))>; 49695ffd83dbSDimitry Andric} // HasVSX, IsISA3_0, HasDirectMove, IsLittleEndian 49705ffd83dbSDimitry Andric} // AddedComplexity = 400 49715ffd83dbSDimitry Andric 49725ffd83dbSDimitry Andric//---------------------------- Instruction aliases ---------------------------// 49735ffd83dbSDimitry Andricdef : InstAlias<"xvmovdp $XT, $XB", 49745ffd83dbSDimitry Andric (XVCPSGNDP vsrc:$XT, vsrc:$XB, vsrc:$XB)>; 49755ffd83dbSDimitry Andricdef : InstAlias<"xvmovsp $XT, $XB", 49765ffd83dbSDimitry Andric (XVCPSGNSP vsrc:$XT, vsrc:$XB, vsrc:$XB)>; 49775ffd83dbSDimitry Andric 4978e8d8bef9SDimitry Andric// Certain versions of the AIX assembler may missassemble these mnemonics. 4979e8d8bef9SDimitry Andriclet Predicates = [ModernAs] in { 49805ffd83dbSDimitry Andric def : InstAlias<"xxspltd $XT, $XB, 0", 49815ffd83dbSDimitry Andric (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 0)>; 49825ffd83dbSDimitry Andric def : InstAlias<"xxspltd $XT, $XB, 1", 49835ffd83dbSDimitry Andric (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 3)>; 4984e8d8bef9SDimitry Andric def : InstAlias<"xxspltd $XT, $XB, 0", 4985e8d8bef9SDimitry Andric (XXPERMDIs vsrc:$XT, vsfrc:$XB, 0)>; 4986e8d8bef9SDimitry Andric def : InstAlias<"xxspltd $XT, $XB, 1", 4987e8d8bef9SDimitry Andric (XXPERMDIs vsrc:$XT, vsfrc:$XB, 3)>; 4988e8d8bef9SDimitry Andric} 4989e8d8bef9SDimitry Andric 49905ffd83dbSDimitry Andricdef : InstAlias<"xxmrghd $XT, $XA, $XB", 49915ffd83dbSDimitry Andric (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 0)>; 49925ffd83dbSDimitry Andricdef : InstAlias<"xxmrgld $XT, $XA, $XB", 49935ffd83dbSDimitry Andric (XXPERMDI vsrc:$XT, vsrc:$XA, vsrc:$XB, 3)>; 49945ffd83dbSDimitry Andricdef : InstAlias<"xxswapd $XT, $XB", 49955ffd83dbSDimitry Andric (XXPERMDI vsrc:$XT, vsrc:$XB, vsrc:$XB, 2)>; 49965ffd83dbSDimitry Andricdef : InstAlias<"xxswapd $XT, $XB", 49975ffd83dbSDimitry Andric (XXPERMDIs vsrc:$XT, vsfrc:$XB, 2)>; 49985ffd83dbSDimitry Andricdef : InstAlias<"mfvrd $rA, $XT", 49995ffd83dbSDimitry Andric (MFVRD g8rc:$rA, vrrc:$XT), 0>; 50005ffd83dbSDimitry Andricdef : InstAlias<"mffprd $rA, $src", 50015ffd83dbSDimitry Andric (MFVSRD g8rc:$rA, f8rc:$src)>; 50025ffd83dbSDimitry Andricdef : InstAlias<"mtvrd $XT, $rA", 50035ffd83dbSDimitry Andric (MTVRD vrrc:$XT, g8rc:$rA), 0>; 50045ffd83dbSDimitry Andricdef : InstAlias<"mtfprd $dst, $rA", 50055ffd83dbSDimitry Andric (MTVSRD f8rc:$dst, g8rc:$rA)>; 50065ffd83dbSDimitry Andricdef : InstAlias<"mfvrwz $rA, $XT", 50075ffd83dbSDimitry Andric (MFVRWZ gprc:$rA, vrrc:$XT), 0>; 50085ffd83dbSDimitry Andricdef : InstAlias<"mffprwz $rA, $src", 50095ffd83dbSDimitry Andric (MFVSRWZ gprc:$rA, f8rc:$src)>; 50105ffd83dbSDimitry Andricdef : InstAlias<"mtvrwa $XT, $rA", 50115ffd83dbSDimitry Andric (MTVRWA vrrc:$XT, gprc:$rA), 0>; 50125ffd83dbSDimitry Andricdef : InstAlias<"mtfprwa $dst, $rA", 50135ffd83dbSDimitry Andric (MTVSRWA f8rc:$dst, gprc:$rA)>; 50145ffd83dbSDimitry Andricdef : InstAlias<"mtvrwz $XT, $rA", 50155ffd83dbSDimitry Andric (MTVRWZ vrrc:$XT, gprc:$rA), 0>; 50165ffd83dbSDimitry Andricdef : InstAlias<"mtfprwz $dst, $rA", 50175ffd83dbSDimitry Andric (MTVSRWZ f8rc:$dst, gprc:$rA)>; 5018