1*9880d681SAndroid Build Coastguard Worker//===- PPCInstrQPX.td - The PowerPC QPX Extension --*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file describes the QPX extension to the PowerPC instruction set. 11*9880d681SAndroid Build Coastguard Worker// Reference: 12*9880d681SAndroid Build Coastguard Worker// Book Q: QPX Architecture Definition. IBM (as updated in) 2011. 13*9880d681SAndroid Build Coastguard Worker// 14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdef PPCRegQFRCAsmOperand : AsmOperandClass { 17*9880d681SAndroid Build Coastguard Worker let Name = "RegQFRC"; let PredicateMethod = "isRegNumber"; 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Workerdef qfrc : RegisterOperand<QFRC> { 20*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = PPCRegQFRCAsmOperand; 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Workerdef PPCRegQSRCAsmOperand : AsmOperandClass { 23*9880d681SAndroid Build Coastguard Worker let Name = "RegQSRC"; let PredicateMethod = "isRegNumber"; 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Workerdef qsrc : RegisterOperand<QSRC> { 26*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = PPCRegQSRCAsmOperand; 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Workerdef PPCRegQBRCAsmOperand : AsmOperandClass { 29*9880d681SAndroid Build Coastguard Worker let Name = "RegQBRC"; let PredicateMethod = "isRegNumber"; 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Workerdef qbrc : RegisterOperand<QBRC> { 32*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = PPCRegQBRCAsmOperand; 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 36*9880d681SAndroid Build Coastguard Worker// Helpers for defining instructions that directly correspond to intrinsics. 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker// QPXA1_Int - A AForm_1 intrinsic definition. 39*9880d681SAndroid Build Coastguard Workerclass QPXA1_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 40*9880d681SAndroid Build Coastguard Worker : AForm_1<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 41*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $FRT, $FRA, $FRC, $FRB"), IIC_FPFused, 42*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>; 43*9880d681SAndroid Build Coastguard Worker// QPXA1s_Int - A AForm_1 intrinsic definition (simple instructions). 44*9880d681SAndroid Build Coastguard Workerclass QPXA1s_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 45*9880d681SAndroid Build Coastguard Worker : AForm_1<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 46*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $FRT, $FRA, $FRC, $FRB"), IIC_VecPerm, 47*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>; 48*9880d681SAndroid Build Coastguard Worker// QPXA2_Int - A AForm_2 intrinsic definition. 49*9880d681SAndroid Build Coastguard Workerclass QPXA2_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 50*9880d681SAndroid Build Coastguard Worker : AForm_2<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 51*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $FRT, $FRA, $FRB"), IIC_FPGeneral, 52*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB))]>; 53*9880d681SAndroid Build Coastguard Worker// QPXA3_Int - A AForm_3 intrinsic definition. 54*9880d681SAndroid Build Coastguard Workerclass QPXA3_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 55*9880d681SAndroid Build Coastguard Worker : AForm_3<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRC), 56*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $FRT, $FRA, $FRC"), IIC_FPGeneral, 57*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRC))]>; 58*9880d681SAndroid Build Coastguard Worker// QPXA4_Int - A AForm_4a intrinsic definition. 59*9880d681SAndroid Build Coastguard Workerclass QPXA4_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 60*9880d681SAndroid Build Coastguard Worker : AForm_4a<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRB), 61*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $FRT, $FRB"), IIC_FPGeneral, 62*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (IntID v4f64:$FRB))]>; 63*9880d681SAndroid Build Coastguard Worker// QPXX18_Int - A XForm_18 intrinsic definition. 64*9880d681SAndroid Build Coastguard Workerclass QPXX18_Int<bits<6> opcode, bits<10> xo, string opc, Intrinsic IntID> 65*9880d681SAndroid Build Coastguard Worker : XForm_18<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 66*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $FRT, $FRA, $FRB"), IIC_FPCompare, 67*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB))]>; 68*9880d681SAndroid Build Coastguard Worker// QPXX19_Int - A XForm_19 intrinsic definition. 69*9880d681SAndroid Build Coastguard Workerclass QPXX19_Int<bits<6> opcode, bits<10> xo, string opc, Intrinsic IntID> 70*9880d681SAndroid Build Coastguard Worker : XForm_19<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRB), 71*9880d681SAndroid Build Coastguard Worker !strconcat(opc, " $FRT, $FRB"), IIC_FPGeneral, 72*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (IntID v4f64:$FRB))]>; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 75*9880d681SAndroid Build Coastguard Worker// Pattern Frags. 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdef extloadv4f32 : PatFrag<(ops node:$ptr), (extload node:$ptr), [{ 78*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getMemoryVT() == MVT::v4f32; 79*9880d681SAndroid Build Coastguard Worker}]>; 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdef truncstorev4f32 : PatFrag<(ops node:$val, node:$ptr), 82*9880d681SAndroid Build Coastguard Worker (truncstore node:$val, node:$ptr), [{ 83*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v4f32; 84*9880d681SAndroid Build Coastguard Worker}]>; 85*9880d681SAndroid Build Coastguard Workerdef pre_truncstv4f32 : PatFrag<(ops node:$val, node:$base, node:$offset), 86*9880d681SAndroid Build Coastguard Worker (pre_truncst node:$val, 87*9880d681SAndroid Build Coastguard Worker node:$base, node:$offset), [{ 88*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v4f32; 89*9880d681SAndroid Build Coastguard Worker}]>; 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdef fround_inexact : PatFrag<(ops node:$val), (fround node:$val), [{ 92*9880d681SAndroid Build Coastguard Worker return cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() == 0; 93*9880d681SAndroid Build Coastguard Worker}]>; 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdef fround_exact : PatFrag<(ops node:$val), (fround node:$val), [{ 96*9880d681SAndroid Build Coastguard Worker return cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() == 1; 97*9880d681SAndroid Build Coastguard Worker}]>; 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerlet FastIselShouldIgnore = 1 in // FastIsel should ignore all u12 instrs. 100*9880d681SAndroid Build Coastguard Worker def u12 : ImmLeaf<i32, [{ return (Imm & 0xFFF) == Imm; }]>; 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 103*9880d681SAndroid Build Coastguard Worker// Instruction Definitions. 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdef HasQPX : Predicate<"PPCSubTarget->hasQPX()">; 106*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasQPX] in { 107*9880d681SAndroid Build Coastguard Workerlet DecoderNamespace = "QPX" in { 108*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { // QPX instructions don't have side effects. 109*9880d681SAndroid Build Coastguard Workerlet Uses = [RM] in { 110*9880d681SAndroid Build Coastguard Worker // Add Instructions 111*9880d681SAndroid Build Coastguard Worker let isCommutable = 1 in { 112*9880d681SAndroid Build Coastguard Worker def QVFADD : AForm_2<4, 21, 113*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 114*9880d681SAndroid Build Coastguard Worker "qvfadd $FRT, $FRA, $FRB", IIC_FPGeneral, 115*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fadd v4f64:$FRA, v4f64:$FRB))]>; 116*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 117*9880d681SAndroid Build Coastguard Worker def QVFADDS : QPXA2_Int<0, 21, "qvfadds", int_ppc_qpx_qvfadds>; 118*9880d681SAndroid Build Coastguard Worker def QVFADDSs : AForm_2<0, 21, 119*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 120*9880d681SAndroid Build Coastguard Worker "qvfadds $FRT, $FRA, $FRB", IIC_FPGeneral, 121*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fadd v4f32:$FRA, v4f32:$FRB))]>; 122*9880d681SAndroid Build Coastguard Worker } 123*9880d681SAndroid Build Coastguard Worker def QVFSUB : AForm_2<4, 20, 124*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 125*9880d681SAndroid Build Coastguard Worker "qvfsub $FRT, $FRA, $FRB", IIC_FPGeneral, 126*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fsub v4f64:$FRA, v4f64:$FRB))]>; 127*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 128*9880d681SAndroid Build Coastguard Worker def QVFSUBS : QPXA2_Int<0, 20, "qvfsubs", int_ppc_qpx_qvfsubs>; 129*9880d681SAndroid Build Coastguard Worker def QVFSUBSs : AForm_2<0, 20, 130*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 131*9880d681SAndroid Build Coastguard Worker "qvfsubs $FRT, $FRA, $FRB", IIC_FPGeneral, 132*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fsub v4f32:$FRA, v4f32:$FRB))]>; 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker // Estimate Instructions 135*9880d681SAndroid Build Coastguard Worker def QVFRE : AForm_4a<4, 24, (outs qfrc:$FRT), (ins qfrc:$FRB), 136*9880d681SAndroid Build Coastguard Worker "qvfre $FRT, $FRB", IIC_FPGeneral, 137*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (PPCfre v4f64:$FRB))]>; 138*9880d681SAndroid Build Coastguard Worker def QVFRES : QPXA4_Int<0, 24, "qvfres", int_ppc_qpx_qvfres>; 139*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 140*9880d681SAndroid Build Coastguard Worker def QVFRESs : AForm_4a<0, 24, (outs qsrc:$FRT), (ins qsrc:$FRB), 141*9880d681SAndroid Build Coastguard Worker "qvfres $FRT, $FRB", IIC_FPGeneral, 142*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (PPCfre v4f32:$FRB))]>; 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker def QVFRSQRTE : AForm_4a<4, 26, (outs qfrc:$FRT), (ins qfrc:$FRB), 145*9880d681SAndroid Build Coastguard Worker "qvfrsqrte $FRT, $FRB", IIC_FPGeneral, 146*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (PPCfrsqrte v4f64:$FRB))]>; 147*9880d681SAndroid Build Coastguard Worker def QVFRSQRTES : QPXA4_Int<0, 26, "qvfrsqrtes", int_ppc_qpx_qvfrsqrtes>; 148*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 149*9880d681SAndroid Build Coastguard Worker def QVFRSQRTESs : AForm_4a<0, 26, (outs qsrc:$FRT), (ins qsrc:$FRB), 150*9880d681SAndroid Build Coastguard Worker "qvfrsqrtes $FRT, $FRB", IIC_FPGeneral, 151*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (PPCfrsqrte v4f32:$FRB))]>; 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker // Multiply Instructions 154*9880d681SAndroid Build Coastguard Worker let isCommutable = 1 in { 155*9880d681SAndroid Build Coastguard Worker def QVFMUL : AForm_3<4, 25, 156*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRC), 157*9880d681SAndroid Build Coastguard Worker "qvfmul $FRT, $FRA, $FRC", IIC_FPGeneral, 158*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fmul v4f64:$FRA, v4f64:$FRC))]>; 159*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 160*9880d681SAndroid Build Coastguard Worker def QVFMULS : QPXA3_Int<0, 25, "qvfmuls", int_ppc_qpx_qvfmuls>; 161*9880d681SAndroid Build Coastguard Worker def QVFMULSs : AForm_3<0, 25, 162*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRC), 163*9880d681SAndroid Build Coastguard Worker "qvfmuls $FRT, $FRA, $FRC", IIC_FPGeneral, 164*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fmul v4f32:$FRA, v4f32:$FRC))]>; 165*9880d681SAndroid Build Coastguard Worker } 166*9880d681SAndroid Build Coastguard Worker def QVFXMUL : QPXA3_Int<4, 17, "qvfxmul", int_ppc_qpx_qvfxmul>; 167*9880d681SAndroid Build Coastguard Worker def QVFXMULS : QPXA3_Int<0, 17, "qvfxmuls", int_ppc_qpx_qvfxmuls>; 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker // Multiply-add instructions 170*9880d681SAndroid Build Coastguard Worker def QVFMADD : AForm_1<4, 29, 171*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 172*9880d681SAndroid Build Coastguard Worker "qvfmadd $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 173*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fma v4f64:$FRA, v4f64:$FRC, v4f64:$FRB))]>; 174*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 175*9880d681SAndroid Build Coastguard Worker def QVFMADDS : QPXA1_Int<0, 29, "qvfmadds", int_ppc_qpx_qvfmadds>; 176*9880d681SAndroid Build Coastguard Worker def QVFMADDSs : AForm_1<0, 29, 177*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC), 178*9880d681SAndroid Build Coastguard Worker "qvfmadds $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 179*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fma v4f32:$FRA, v4f32:$FRC, v4f32:$FRB))]>; 180*9880d681SAndroid Build Coastguard Worker def QVFNMADD : AForm_1<4, 31, 181*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 182*9880d681SAndroid Build Coastguard Worker "qvfnmadd $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 183*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fneg (fma v4f64:$FRA, v4f64:$FRC, 184*9880d681SAndroid Build Coastguard Worker v4f64:$FRB)))]>; 185*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 186*9880d681SAndroid Build Coastguard Worker def QVFNMADDS : QPXA1_Int<0, 31, "qvfnmadds", int_ppc_qpx_qvfnmadds>; 187*9880d681SAndroid Build Coastguard Worker def QVFNMADDSs : AForm_1<0, 31, 188*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC), 189*9880d681SAndroid Build Coastguard Worker "qvfnmadds $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 190*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fneg (fma v4f32:$FRA, v4f32:$FRC, 191*9880d681SAndroid Build Coastguard Worker v4f32:$FRB)))]>; 192*9880d681SAndroid Build Coastguard Worker def QVFMSUB : AForm_1<4, 28, 193*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 194*9880d681SAndroid Build Coastguard Worker "qvfmsub $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 195*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fma v4f64:$FRA, v4f64:$FRC, 196*9880d681SAndroid Build Coastguard Worker (fneg v4f64:$FRB)))]>; 197*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 198*9880d681SAndroid Build Coastguard Worker def QVFMSUBS : QPXA1_Int<0, 28, "qvfmsubs", int_ppc_qpx_qvfmsubs>; 199*9880d681SAndroid Build Coastguard Worker def QVFMSUBSs : AForm_1<0, 28, 200*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC), 201*9880d681SAndroid Build Coastguard Worker "qvfmsubs $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 202*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fma v4f32:$FRA, v4f32:$FRC, 203*9880d681SAndroid Build Coastguard Worker (fneg v4f32:$FRB)))]>; 204*9880d681SAndroid Build Coastguard Worker def QVFNMSUB : AForm_1<4, 30, 205*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 206*9880d681SAndroid Build Coastguard Worker "qvfnmsub $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 207*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fneg (fma v4f64:$FRA, v4f64:$FRC, 208*9880d681SAndroid Build Coastguard Worker (fneg v4f64:$FRB))))]>; 209*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 210*9880d681SAndroid Build Coastguard Worker def QVFNMSUBS : QPXA1_Int<0, 30, "qvfnmsubs", int_ppc_qpx_qvfnmsubs>; 211*9880d681SAndroid Build Coastguard Worker def QVFNMSUBSs : AForm_1<0, 30, 212*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC), 213*9880d681SAndroid Build Coastguard Worker "qvfnmsubs $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 214*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fneg (fma v4f32:$FRA, v4f32:$FRC, 215*9880d681SAndroid Build Coastguard Worker (fneg v4f32:$FRB))))]>; 216*9880d681SAndroid Build Coastguard Worker def QVFXMADD : QPXA1_Int<4, 9, "qvfxmadd", int_ppc_qpx_qvfxmadd>; 217*9880d681SAndroid Build Coastguard Worker def QVFXMADDS : QPXA1_Int<0, 9, "qvfxmadds", int_ppc_qpx_qvfxmadds>; 218*9880d681SAndroid Build Coastguard Worker def QVFXXNPMADD : QPXA1_Int<4, 11, "qvfxxnpmadd", int_ppc_qpx_qvfxxnpmadd>; 219*9880d681SAndroid Build Coastguard Worker def QVFXXNPMADDS : QPXA1_Int<0, 11, "qvfxxnpmadds", int_ppc_qpx_qvfxxnpmadds>; 220*9880d681SAndroid Build Coastguard Worker def QVFXXCPNMADD : QPXA1_Int<4, 3, "qvfxxcpnmadd", int_ppc_qpx_qvfxxcpnmadd>; 221*9880d681SAndroid Build Coastguard Worker def QVFXXCPNMADDS : QPXA1_Int<0, 3, "qvfxxcpnmadds", int_ppc_qpx_qvfxxcpnmadds>; 222*9880d681SAndroid Build Coastguard Worker def QVFXXMADD : QPXA1_Int<4, 1, "qvfxxmadd", int_ppc_qpx_qvfxxmadd>; 223*9880d681SAndroid Build Coastguard Worker def QVFXXMADDS : QPXA1_Int<0, 1, "qvfxxmadds", int_ppc_qpx_qvfxxmadds>; 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker // Select Instruction 226*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 227*9880d681SAndroid Build Coastguard Worker def QVFSEL : QPXA1s_Int<4, 23, "qvfsel", int_ppc_qpx_qvfsel>; 228*9880d681SAndroid Build Coastguard Worker def QVFSELb : AForm_1<4, 23, (outs qfrc:$FRT), 229*9880d681SAndroid Build Coastguard Worker (ins qbrc:$FRA, qfrc:$FRB, qfrc:$FRC), 230*9880d681SAndroid Build Coastguard Worker "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm, 231*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (vselect v4i1:$FRA, 232*9880d681SAndroid Build Coastguard Worker v4f64:$FRC, v4f64:$FRB))]>; 233*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 234*9880d681SAndroid Build Coastguard Worker def QVFSELbs : AForm_1<4, 23, (outs qsrc:$FRT), 235*9880d681SAndroid Build Coastguard Worker (ins qbrc:$FRA, qsrc:$FRB, qsrc:$FRC), 236*9880d681SAndroid Build Coastguard Worker "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm, 237*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (vselect v4i1:$FRA, 238*9880d681SAndroid Build Coastguard Worker v4f32:$FRC, v4f32:$FRB))]>; 239*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 240*9880d681SAndroid Build Coastguard Worker def QVFSELbb: AForm_1<4, 23, (outs qbrc:$FRT), 241*9880d681SAndroid Build Coastguard Worker (ins qbrc:$FRA, qbrc:$FRB, qbrc:$FRC), 242*9880d681SAndroid Build Coastguard Worker "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm, 243*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, (vselect v4i1:$FRA, 244*9880d681SAndroid Build Coastguard Worker v4i1:$FRC, v4i1:$FRB))]>; 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker // SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after 247*9880d681SAndroid Build Coastguard Worker // instruction selection into a branch sequence. 248*9880d681SAndroid Build Coastguard Worker let usesCustomInserter = 1 in { 249*9880d681SAndroid Build Coastguard Worker def SELECT_CC_QFRC: Pseudo<(outs qfrc:$dst), (ins crrc:$cond, qfrc:$T, qfrc:$F, 250*9880d681SAndroid Build Coastguard Worker i32imm:$BROPC), "#SELECT_CC_QFRC", 251*9880d681SAndroid Build Coastguard Worker []>; 252*9880d681SAndroid Build Coastguard Worker def SELECT_CC_QSRC: Pseudo<(outs qsrc:$dst), (ins crrc:$cond, qsrc:$T, qsrc:$F, 253*9880d681SAndroid Build Coastguard Worker i32imm:$BROPC), "#SELECT_CC_QSRC", 254*9880d681SAndroid Build Coastguard Worker []>; 255*9880d681SAndroid Build Coastguard Worker def SELECT_CC_QBRC: Pseudo<(outs qbrc:$dst), (ins crrc:$cond, qbrc:$T, qbrc:$F, 256*9880d681SAndroid Build Coastguard Worker i32imm:$BROPC), "#SELECT_CC_QBRC", 257*9880d681SAndroid Build Coastguard Worker []>; 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker // SELECT_* pseudo instructions, like SELECT_CC_* but taking condition 260*9880d681SAndroid Build Coastguard Worker // register bit directly. 261*9880d681SAndroid Build Coastguard Worker def SELECT_QFRC: Pseudo<(outs qfrc:$dst), (ins crbitrc:$cond, 262*9880d681SAndroid Build Coastguard Worker qfrc:$T, qfrc:$F), "#SELECT_QFRC", 263*9880d681SAndroid Build Coastguard Worker [(set v4f64:$dst, 264*9880d681SAndroid Build Coastguard Worker (select i1:$cond, v4f64:$T, v4f64:$F))]>; 265*9880d681SAndroid Build Coastguard Worker def SELECT_QSRC: Pseudo<(outs qsrc:$dst), (ins crbitrc:$cond, 266*9880d681SAndroid Build Coastguard Worker qsrc:$T, qsrc:$F), "#SELECT_QSRC", 267*9880d681SAndroid Build Coastguard Worker [(set v4f32:$dst, 268*9880d681SAndroid Build Coastguard Worker (select i1:$cond, v4f32:$T, v4f32:$F))]>; 269*9880d681SAndroid Build Coastguard Worker def SELECT_QBRC: Pseudo<(outs qbrc:$dst), (ins crbitrc:$cond, 270*9880d681SAndroid Build Coastguard Worker qbrc:$T, qbrc:$F), "#SELECT_QBRC", 271*9880d681SAndroid Build Coastguard Worker [(set v4i1:$dst, 272*9880d681SAndroid Build Coastguard Worker (select i1:$cond, v4i1:$T, v4i1:$F))]>; 273*9880d681SAndroid Build Coastguard Worker } 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker // Convert and Round Instructions 276*9880d681SAndroid Build Coastguard Worker def QVFCTID : QPXX19_Int<4, 814, "qvfctid", int_ppc_qpx_qvfctid>; 277*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 278*9880d681SAndroid Build Coastguard Worker def QVFCTIDb : XForm_19<4, 814, (outs qbrc:$FRT), (ins qbrc:$FRB), 279*9880d681SAndroid Build Coastguard Worker "qvfctid $FRT, $FRB", IIC_FPGeneral, []>; 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker def QVFCTIDU : QPXX19_Int<4, 942, "qvfctidu", int_ppc_qpx_qvfctidu>; 282*9880d681SAndroid Build Coastguard Worker def QVFCTIDZ : QPXX19_Int<4, 815, "qvfctidz", int_ppc_qpx_qvfctidz>; 283*9880d681SAndroid Build Coastguard Worker def QVFCTIDUZ : QPXX19_Int<4, 943, "qvfctiduz", int_ppc_qpx_qvfctiduz>; 284*9880d681SAndroid Build Coastguard Worker def QVFCTIW : QPXX19_Int<4, 14, "qvfctiw", int_ppc_qpx_qvfctiw>; 285*9880d681SAndroid Build Coastguard Worker def QVFCTIWU : QPXX19_Int<4, 142, "qvfctiwu", int_ppc_qpx_qvfctiwu>; 286*9880d681SAndroid Build Coastguard Worker def QVFCTIWZ : QPXX19_Int<4, 15, "qvfctiwz", int_ppc_qpx_qvfctiwz>; 287*9880d681SAndroid Build Coastguard Worker def QVFCTIWUZ : QPXX19_Int<4, 143, "qvfctiwuz", int_ppc_qpx_qvfctiwuz>; 288*9880d681SAndroid Build Coastguard Worker def QVFCFID : QPXX19_Int<4, 846, "qvfcfid", int_ppc_qpx_qvfcfid>; 289*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 290*9880d681SAndroid Build Coastguard Worker def QVFCFIDb : XForm_19<4, 846, (outs qbrc:$FRT), (ins qbrc:$FRB), 291*9880d681SAndroid Build Coastguard Worker "qvfcfid $FRT, $FRB", IIC_FPGeneral, []>; 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker def QVFCFIDU : QPXX19_Int<4, 974, "qvfcfidu", int_ppc_qpx_qvfcfidu>; 294*9880d681SAndroid Build Coastguard Worker def QVFCFIDS : QPXX19_Int<0, 846, "qvfcfids", int_ppc_qpx_qvfcfids>; 295*9880d681SAndroid Build Coastguard Worker def QVFCFIDUS : QPXX19_Int<0, 974, "qvfcfidus", int_ppc_qpx_qvfcfidus>; 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 298*9880d681SAndroid Build Coastguard Worker def QVFRSP : QPXX19_Int<4, 12, "qvfrsp", int_ppc_qpx_qvfrsp>; 299*9880d681SAndroid Build Coastguard Worker def QVFRSPs : XForm_19<4, 12, 300*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qfrc:$FRB), 301*9880d681SAndroid Build Coastguard Worker "qvfrsp $FRT, $FRB", IIC_FPGeneral, 302*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fround_inexact v4f64:$FRB))]>; 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker def QVFRIZ : XForm_19<4, 424, (outs qfrc:$FRT), (ins qfrc:$FRB), 305*9880d681SAndroid Build Coastguard Worker "qvfriz $FRT, $FRB", IIC_FPGeneral, 306*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (ftrunc v4f64:$FRB))]>; 307*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 308*9880d681SAndroid Build Coastguard Worker def QVFRIZs : XForm_19<4, 424, (outs qsrc:$FRT), (ins qsrc:$FRB), 309*9880d681SAndroid Build Coastguard Worker "qvfriz $FRT, $FRB", IIC_FPGeneral, 310*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (ftrunc v4f32:$FRB))]>; 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker def QVFRIN : XForm_19<4, 392, (outs qfrc:$FRT), (ins qfrc:$FRB), 313*9880d681SAndroid Build Coastguard Worker "qvfrin $FRT, $FRB", IIC_FPGeneral, 314*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (frnd v4f64:$FRB))]>; 315*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 316*9880d681SAndroid Build Coastguard Worker def QVFRINs : XForm_19<4, 392, (outs qsrc:$FRT), (ins qsrc:$FRB), 317*9880d681SAndroid Build Coastguard Worker "qvfrin $FRT, $FRB", IIC_FPGeneral, 318*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (frnd v4f32:$FRB))]>; 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker def QVFRIP : XForm_19<4, 456, (outs qfrc:$FRT), (ins qfrc:$FRB), 321*9880d681SAndroid Build Coastguard Worker "qvfrip $FRT, $FRB", IIC_FPGeneral, 322*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fceil v4f64:$FRB))]>; 323*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 324*9880d681SAndroid Build Coastguard Worker def QVFRIPs : XForm_19<4, 456, (outs qsrc:$FRT), (ins qsrc:$FRB), 325*9880d681SAndroid Build Coastguard Worker "qvfrip $FRT, $FRB", IIC_FPGeneral, 326*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fceil v4f32:$FRB))]>; 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Worker def QVFRIM : XForm_19<4, 488, (outs qfrc:$FRT), (ins qfrc:$FRB), 329*9880d681SAndroid Build Coastguard Worker "qvfrim $FRT, $FRB", IIC_FPGeneral, 330*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (ffloor v4f64:$FRB))]>; 331*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 332*9880d681SAndroid Build Coastguard Worker def QVFRIMs : XForm_19<4, 488, (outs qsrc:$FRT), (ins qsrc:$FRB), 333*9880d681SAndroid Build Coastguard Worker "qvfrim $FRT, $FRB", IIC_FPGeneral, 334*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (ffloor v4f32:$FRB))]>; 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker // Move Instructions 337*9880d681SAndroid Build Coastguard Worker def QVFMR : XForm_19<4, 72, 338*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRB), 339*9880d681SAndroid Build Coastguard Worker "qvfmr $FRT, $FRB", IIC_VecPerm, 340*9880d681SAndroid Build Coastguard Worker [/* (set v4f64:$FRT, v4f64:$FRB) */]>; 341*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 342*9880d681SAndroid Build Coastguard Worker def QVFMRs : XForm_19<4, 72, 343*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRB), 344*9880d681SAndroid Build Coastguard Worker "qvfmr $FRT, $FRB", IIC_VecPerm, 345*9880d681SAndroid Build Coastguard Worker [/* (set v4f32:$FRT, v4f32:$FRB) */]>; 346*9880d681SAndroid Build Coastguard Worker def QVFMRb : XForm_19<4, 72, 347*9880d681SAndroid Build Coastguard Worker (outs qbrc:$FRT), (ins qbrc:$FRB), 348*9880d681SAndroid Build Coastguard Worker "qvfmr $FRT, $FRB", IIC_VecPerm, 349*9880d681SAndroid Build Coastguard Worker [/* (set v4i1:$FRT, v4i1:$FRB) */]>; 350*9880d681SAndroid Build Coastguard Worker } 351*9880d681SAndroid Build Coastguard Worker def QVFNEG : XForm_19<4, 40, 352*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRB), 353*9880d681SAndroid Build Coastguard Worker "qvfneg $FRT, $FRB", IIC_VecPerm, 354*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fneg v4f64:$FRB))]>; 355*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 356*9880d681SAndroid Build Coastguard Worker def QVFNEGs : XForm_19<4, 40, 357*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRB), 358*9880d681SAndroid Build Coastguard Worker "qvfneg $FRT, $FRB", IIC_VecPerm, 359*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fneg v4f32:$FRB))]>; 360*9880d681SAndroid Build Coastguard Worker def QVFABS : XForm_19<4, 264, 361*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRB), 362*9880d681SAndroid Build Coastguard Worker "qvfabs $FRT, $FRB", IIC_VecPerm, 363*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fabs v4f64:$FRB))]>; 364*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 365*9880d681SAndroid Build Coastguard Worker def QVFABSs : XForm_19<4, 264, 366*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRB), 367*9880d681SAndroid Build Coastguard Worker "qvfabs $FRT, $FRB", IIC_VecPerm, 368*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fabs v4f32:$FRB))]>; 369*9880d681SAndroid Build Coastguard Worker def QVFNABS : XForm_19<4, 136, 370*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRB), 371*9880d681SAndroid Build Coastguard Worker "qvfnabs $FRT, $FRB", IIC_VecPerm, 372*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fneg (fabs v4f64:$FRB)))]>; 373*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 374*9880d681SAndroid Build Coastguard Worker def QVFNABSs : XForm_19<4, 136, 375*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRB), 376*9880d681SAndroid Build Coastguard Worker "qvfnabs $FRT, $FRB", IIC_VecPerm, 377*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fneg (fabs v4f32:$FRB)))]>; 378*9880d681SAndroid Build Coastguard Worker def QVFCPSGN : XForm_18<4, 8, 379*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 380*9880d681SAndroid Build Coastguard Worker "qvfcpsgn $FRT, $FRA, $FRB", IIC_VecPerm, 381*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (fcopysign v4f64:$FRB, v4f64:$FRA))]>; 382*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 383*9880d681SAndroid Build Coastguard Worker def QVFCPSGNs : XForm_18<4, 8, 384*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 385*9880d681SAndroid Build Coastguard Worker "qvfcpsgn $FRT, $FRA, $FRB", IIC_VecPerm, 386*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (fcopysign v4f32:$FRB, v4f32:$FRA))]>; 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Worker def QVALIGNI : Z23Form_1<4, 5, 389*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, u2imm:$idx), 390*9880d681SAndroid Build Coastguard Worker "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm, 391*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, 392*9880d681SAndroid Build Coastguard Worker (PPCqvaligni v4f64:$FRA, v4f64:$FRB, 393*9880d681SAndroid Build Coastguard Worker (i32 imm:$idx)))]>; 394*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 395*9880d681SAndroid Build Coastguard Worker def QVALIGNIs : Z23Form_1<4, 5, 396*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, u2imm:$idx), 397*9880d681SAndroid Build Coastguard Worker "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm, 398*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, 399*9880d681SAndroid Build Coastguard Worker (PPCqvaligni v4f32:$FRA, v4f32:$FRB, 400*9880d681SAndroid Build Coastguard Worker (i32 imm:$idx)))]>; 401*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 402*9880d681SAndroid Build Coastguard Worker def QVALIGNIb : Z23Form_1<4, 5, 403*9880d681SAndroid Build Coastguard Worker (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u2imm:$idx), 404*9880d681SAndroid Build Coastguard Worker "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm, 405*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 406*9880d681SAndroid Build Coastguard Worker (PPCqvaligni v4i1:$FRA, v4i1:$FRB, 407*9880d681SAndroid Build Coastguard Worker (i32 imm:$idx)))]>; 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Worker def QVESPLATI : Z23Form_2<4, 37, 410*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, u2imm:$idx), 411*9880d681SAndroid Build Coastguard Worker "qvesplati $FRT, $FRA, $idx", IIC_VecPerm, 412*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, 413*9880d681SAndroid Build Coastguard Worker (PPCqvesplati v4f64:$FRA, (i32 imm:$idx)))]>; 414*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 415*9880d681SAndroid Build Coastguard Worker def QVESPLATIs : Z23Form_2<4, 37, 416*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, u2imm:$idx), 417*9880d681SAndroid Build Coastguard Worker "qvesplati $FRT, $FRA, $idx", IIC_VecPerm, 418*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, 419*9880d681SAndroid Build Coastguard Worker (PPCqvesplati v4f32:$FRA, (i32 imm:$idx)))]>; 420*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 421*9880d681SAndroid Build Coastguard Worker def QVESPLATIb : Z23Form_2<4, 37, 422*9880d681SAndroid Build Coastguard Worker (outs qbrc:$FRT), (ins qbrc:$FRA, u2imm:$idx), 423*9880d681SAndroid Build Coastguard Worker "qvesplati $FRT, $FRA, $idx", IIC_VecPerm, 424*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 425*9880d681SAndroid Build Coastguard Worker (PPCqvesplati v4i1:$FRA, (i32 imm:$idx)))]>; 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Worker def QVFPERM : AForm_1<4, 6, 428*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 429*9880d681SAndroid Build Coastguard Worker "qvfperm $FRT, $FRA, $FRB, $FRC", IIC_VecPerm, 430*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, 431*9880d681SAndroid Build Coastguard Worker (PPCqvfperm v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>; 432*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 433*9880d681SAndroid Build Coastguard Worker def QVFPERMs : AForm_1<4, 6, 434*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qfrc:$FRC), 435*9880d681SAndroid Build Coastguard Worker "qvfperm $FRT, $FRA, $FRB, $FRC", IIC_VecPerm, 436*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, 437*9880d681SAndroid Build Coastguard Worker (PPCqvfperm v4f32:$FRA, v4f32:$FRB, v4f64:$FRC))]>; 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Worker let isReMaterializable = 1, isAsCheapAsAMove = 1 in 440*9880d681SAndroid Build Coastguard Worker def QVGPCI : Z23Form_3<4, 133, 441*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins u12imm:$idx), 442*9880d681SAndroid Build Coastguard Worker "qvgpci $FRT, $idx", IIC_VecPerm, 443*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (PPCqvgpci (u12:$idx)))]>; 444*9880d681SAndroid Build Coastguard Worker 445*9880d681SAndroid Build Coastguard Worker // Compare Instruction 446*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 447*9880d681SAndroid Build Coastguard Worker def QVFTSTNAN : QPXX18_Int<4, 64, "qvftstnan", int_ppc_qpx_qvftstnan>; 448*9880d681SAndroid Build Coastguard Worker def QVFTSTNANb : XForm_18<4, 64, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 449*9880d681SAndroid Build Coastguard Worker "qvftstnan $FRT, $FRA, $FRB", IIC_FPCompare, 450*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 451*9880d681SAndroid Build Coastguard Worker (setcc v4f64:$FRA, v4f64:$FRB, SETUO))]>; 452*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 453*9880d681SAndroid Build Coastguard Worker def QVFTSTNANbs : XForm_18<4, 64, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 454*9880d681SAndroid Build Coastguard Worker "qvftstnan $FRT, $FRA, $FRB", IIC_FPCompare, 455*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 456*9880d681SAndroid Build Coastguard Worker (setcc v4f32:$FRA, v4f32:$FRB, SETUO))]>; 457*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 458*9880d681SAndroid Build Coastguard Worker def QVFCMPLT : QPXX18_Int<4, 96, "qvfcmplt", int_ppc_qpx_qvfcmplt>; 459*9880d681SAndroid Build Coastguard Worker def QVFCMPLTb : XForm_18<4, 96, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 460*9880d681SAndroid Build Coastguard Worker "qvfcmplt $FRT, $FRA, $FRB", IIC_FPCompare, 461*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 462*9880d681SAndroid Build Coastguard Worker (setcc v4f64:$FRA, v4f64:$FRB, SETOLT))]>; 463*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 464*9880d681SAndroid Build Coastguard Worker def QVFCMPLTbs : XForm_18<4, 96, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 465*9880d681SAndroid Build Coastguard Worker "qvfcmplt $FRT, $FRA, $FRB", IIC_FPCompare, 466*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 467*9880d681SAndroid Build Coastguard Worker (setcc v4f32:$FRA, v4f32:$FRB, SETOLT))]>; 468*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 469*9880d681SAndroid Build Coastguard Worker def QVFCMPGT : QPXX18_Int<4, 32, "qvfcmpgt", int_ppc_qpx_qvfcmpgt>; 470*9880d681SAndroid Build Coastguard Worker def QVFCMPGTb : XForm_18<4, 32, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 471*9880d681SAndroid Build Coastguard Worker "qvfcmpgt $FRT, $FRA, $FRB", IIC_FPCompare, 472*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 473*9880d681SAndroid Build Coastguard Worker (setcc v4f64:$FRA, v4f64:$FRB, SETOGT))]>; 474*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 475*9880d681SAndroid Build Coastguard Worker def QVFCMPGTbs : XForm_18<4, 32, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 476*9880d681SAndroid Build Coastguard Worker "qvfcmpgt $FRT, $FRA, $FRB", IIC_FPCompare, 477*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 478*9880d681SAndroid Build Coastguard Worker (setcc v4f32:$FRA, v4f32:$FRB, SETOGT))]>; 479*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 480*9880d681SAndroid Build Coastguard Worker def QVFCMPEQ : QPXX18_Int<4, 0, "qvfcmpeq", int_ppc_qpx_qvfcmpeq>; 481*9880d681SAndroid Build Coastguard Worker def QVFCMPEQb : XForm_18<4, 0, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 482*9880d681SAndroid Build Coastguard Worker "qvfcmpeq $FRT, $FRA, $FRB", IIC_FPCompare, 483*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 484*9880d681SAndroid Build Coastguard Worker (setcc v4f64:$FRA, v4f64:$FRB, SETOEQ))]>; 485*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 486*9880d681SAndroid Build Coastguard Worker def QVFCMPEQbs : XForm_18<4, 0, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 487*9880d681SAndroid Build Coastguard Worker "qvfcmpeq $FRT, $FRA, $FRB", IIC_FPCompare, 488*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, 489*9880d681SAndroid Build Coastguard Worker (setcc v4f32:$FRA, v4f32:$FRB, SETOEQ))]>; 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 492*9880d681SAndroid Build Coastguard Worker def QVFLOGICAL : XForm_20<4, 4, 493*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, u12imm:$tttt), 494*9880d681SAndroid Build Coastguard Worker "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>; 495*9880d681SAndroid Build Coastguard Worker def QVFLOGICALb : XForm_20<4, 4, 496*9880d681SAndroid Build Coastguard Worker (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u12imm:$tttt), 497*9880d681SAndroid Build Coastguard Worker "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>; 498*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 499*9880d681SAndroid Build Coastguard Worker def QVFLOGICALs : XForm_20<4, 4, 500*9880d681SAndroid Build Coastguard Worker (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u12imm:$tttt), 501*9880d681SAndroid Build Coastguard Worker "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>; 502*9880d681SAndroid Build Coastguard Worker 503*9880d681SAndroid Build Coastguard Worker // Load indexed instructions 504*9880d681SAndroid Build Coastguard Worker let mayLoad = 1 in { 505*9880d681SAndroid Build Coastguard Worker def QVLFDX : XForm_1<31, 583, 506*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 507*9880d681SAndroid Build Coastguard Worker "qvlfdx $FRT, $src", IIC_LdStLFD, 508*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (load xoaddr:$src))]>; 509*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 510*9880d681SAndroid Build Coastguard Worker def QVLFDXb : XForm_1<31, 583, 511*9880d681SAndroid Build Coastguard Worker (outs qbrc:$FRT), (ins memrr:$src), 512*9880d681SAndroid Build Coastguard Worker "qvlfdx $FRT, $src", IIC_LdStLFD, []>; 513*9880d681SAndroid Build Coastguard Worker 514*9880d681SAndroid Build Coastguard Worker let RC = 1 in 515*9880d681SAndroid Build Coastguard Worker def QVLFDXA : XForm_1<31, 583, 516*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 517*9880d681SAndroid Build Coastguard Worker "qvlfdxa $FRT, $src", IIC_LdStLFD, []>; 518*9880d681SAndroid Build Coastguard Worker 519*9880d681SAndroid Build Coastguard Worker def QVLFDUX : XForm_1<31, 615, 520*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT, ptr_rc_nor0:$ea_result), 521*9880d681SAndroid Build Coastguard Worker (ins memrr:$src), 522*9880d681SAndroid Build Coastguard Worker "qvlfdux $FRT, $src", IIC_LdStLFDU, []>, 523*9880d681SAndroid Build Coastguard Worker RegConstraint<"$src.ptrreg = $ea_result">, 524*9880d681SAndroid Build Coastguard Worker NoEncode<"$ea_result">; 525*9880d681SAndroid Build Coastguard Worker let RC = 1 in 526*9880d681SAndroid Build Coastguard Worker def QVLFDUXA : XForm_1<31, 615, 527*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 528*9880d681SAndroid Build Coastguard Worker "qvlfduxa $FRT, $src", IIC_LdStLFD, []>; 529*9880d681SAndroid Build Coastguard Worker 530*9880d681SAndroid Build Coastguard Worker def QVLFSX : XForm_1<31, 519, 531*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 532*9880d681SAndroid Build Coastguard Worker "qvlfsx $FRT, $src", IIC_LdStLFD, 533*9880d681SAndroid Build Coastguard Worker [(set v4f64:$FRT, (extloadv4f32 xoaddr:$src))]>; 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 536*9880d681SAndroid Build Coastguard Worker def QVLFSXb : XForm_1<31, 519, 537*9880d681SAndroid Build Coastguard Worker (outs qbrc:$FRT), (ins memrr:$src), 538*9880d681SAndroid Build Coastguard Worker "qvlfsx $FRT, $src", IIC_LdStLFD, 539*9880d681SAndroid Build Coastguard Worker [(set v4i1:$FRT, (PPCqvlfsb xoaddr:$src))]>; 540*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 541*9880d681SAndroid Build Coastguard Worker def QVLFSXs : XForm_1<31, 519, 542*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins memrr:$src), 543*9880d681SAndroid Build Coastguard Worker "qvlfsx $FRT, $src", IIC_LdStLFD, 544*9880d681SAndroid Build Coastguard Worker [(set v4f32:$FRT, (load xoaddr:$src))]>; 545*9880d681SAndroid Build Coastguard Worker 546*9880d681SAndroid Build Coastguard Worker let RC = 1 in 547*9880d681SAndroid Build Coastguard Worker def QVLFSXA : XForm_1<31, 519, 548*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 549*9880d681SAndroid Build Coastguard Worker "qvlfsxa $FRT, $src", IIC_LdStLFD, []>; 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Worker def QVLFSUX : XForm_1<31, 551, 552*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT, ptr_rc_nor0:$ea_result), 553*9880d681SAndroid Build Coastguard Worker (ins memrr:$src), 554*9880d681SAndroid Build Coastguard Worker "qvlfsux $FRT, $src", IIC_LdStLFDU, []>, 555*9880d681SAndroid Build Coastguard Worker RegConstraint<"$src.ptrreg = $ea_result">, 556*9880d681SAndroid Build Coastguard Worker NoEncode<"$ea_result">; 557*9880d681SAndroid Build Coastguard Worker 558*9880d681SAndroid Build Coastguard Worker let RC = 1 in 559*9880d681SAndroid Build Coastguard Worker def QVLFSUXA : XForm_1<31, 551, 560*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 561*9880d681SAndroid Build Coastguard Worker "qvlfsuxa $FRT, $src", IIC_LdStLFD, []>; 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker def QVLFCDX : XForm_1<31, 71, 564*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 565*9880d681SAndroid Build Coastguard Worker "qvlfcdx $FRT, $src", IIC_LdStLFD, []>; 566*9880d681SAndroid Build Coastguard Worker let RC = 1 in 567*9880d681SAndroid Build Coastguard Worker def QVLFCDXA : XForm_1<31, 71, 568*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 569*9880d681SAndroid Build Coastguard Worker "qvlfcdxa $FRT, $src", IIC_LdStLFD, []>; 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Worker def QVLFCDUX : XForm_1<31, 103, 572*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 573*9880d681SAndroid Build Coastguard Worker "qvlfcdux $FRT, $src", IIC_LdStLFD, []>; 574*9880d681SAndroid Build Coastguard Worker let RC = 1 in 575*9880d681SAndroid Build Coastguard Worker def QVLFCDUXA : XForm_1<31, 103, 576*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 577*9880d681SAndroid Build Coastguard Worker "qvlfcduxa $FRT, $src", IIC_LdStLFD, []>; 578*9880d681SAndroid Build Coastguard Worker 579*9880d681SAndroid Build Coastguard Worker def QVLFCSX : XForm_1<31, 7, 580*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 581*9880d681SAndroid Build Coastguard Worker "qvlfcsx $FRT, $src", IIC_LdStLFD, []>; 582*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 583*9880d681SAndroid Build Coastguard Worker def QVLFCSXs : XForm_1<31, 7, 584*9880d681SAndroid Build Coastguard Worker (outs qsrc:$FRT), (ins memrr:$src), 585*9880d681SAndroid Build Coastguard Worker "qvlfcsx $FRT, $src", IIC_LdStLFD, []>; 586*9880d681SAndroid Build Coastguard Worker 587*9880d681SAndroid Build Coastguard Worker let RC = 1 in 588*9880d681SAndroid Build Coastguard Worker def QVLFCSXA : XForm_1<31, 7, 589*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 590*9880d681SAndroid Build Coastguard Worker "qvlfcsxa $FRT, $src", IIC_LdStLFD, []>; 591*9880d681SAndroid Build Coastguard Worker 592*9880d681SAndroid Build Coastguard Worker def QVLFCSUX : XForm_1<31, 39, 593*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 594*9880d681SAndroid Build Coastguard Worker "qvlfcsux $FRT, $src", IIC_LdStLFD, []>; 595*9880d681SAndroid Build Coastguard Worker let RC = 1 in 596*9880d681SAndroid Build Coastguard Worker def QVLFCSUXA : XForm_1<31, 39, 597*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 598*9880d681SAndroid Build Coastguard Worker "qvlfcsuxa $FRT, $src", IIC_LdStLFD, []>; 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Worker def QVLFIWAX : XForm_1<31, 871, 601*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 602*9880d681SAndroid Build Coastguard Worker "qvlfiwax $FRT, $src", IIC_LdStLFD, []>; 603*9880d681SAndroid Build Coastguard Worker let RC = 1 in 604*9880d681SAndroid Build Coastguard Worker def QVLFIWAXA : XForm_1<31, 871, 605*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 606*9880d681SAndroid Build Coastguard Worker "qvlfiwaxa $FRT, $src", IIC_LdStLFD, []>; 607*9880d681SAndroid Build Coastguard Worker 608*9880d681SAndroid Build Coastguard Worker def QVLFIWZX : XForm_1<31, 839, 609*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 610*9880d681SAndroid Build Coastguard Worker "qvlfiwzx $FRT, $src", IIC_LdStLFD, []>; 611*9880d681SAndroid Build Coastguard Worker let RC = 1 in 612*9880d681SAndroid Build Coastguard Worker def QVLFIWZXA : XForm_1<31, 839, 613*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 614*9880d681SAndroid Build Coastguard Worker "qvlfiwzxa $FRT, $src", IIC_LdStLFD, []>; 615*9880d681SAndroid Build Coastguard Worker } 616*9880d681SAndroid Build Coastguard Worker 617*9880d681SAndroid Build Coastguard Worker 618*9880d681SAndroid Build Coastguard Worker def QVLPCLDX : XForm_1<31, 582, 619*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 620*9880d681SAndroid Build Coastguard Worker "qvlpcldx $FRT, $src", IIC_LdStLFD, []>; 621*9880d681SAndroid Build Coastguard Worker def QVLPCLSX : XForm_1<31, 518, 622*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 623*9880d681SAndroid Build Coastguard Worker "qvlpclsx $FRT, $src", IIC_LdStLFD, []>; 624*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 625*9880d681SAndroid Build Coastguard Worker def QVLPCLSXint : XForm_11<31, 518, 626*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins G8RC:$src), 627*9880d681SAndroid Build Coastguard Worker "qvlpclsx $FRT, 0, $src", IIC_LdStLFD, []>; 628*9880d681SAndroid Build Coastguard Worker def QVLPCRDX : XForm_1<31, 70, 629*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 630*9880d681SAndroid Build Coastguard Worker "qvlpcrdx $FRT, $src", IIC_LdStLFD, []>; 631*9880d681SAndroid Build Coastguard Worker def QVLPCRSX : XForm_1<31, 6, 632*9880d681SAndroid Build Coastguard Worker (outs qfrc:$FRT), (ins memrr:$src), 633*9880d681SAndroid Build Coastguard Worker "qvlpcrsx $FRT, $src", IIC_LdStLFD, []>; 634*9880d681SAndroid Build Coastguard Worker 635*9880d681SAndroid Build Coastguard Worker // Store indexed instructions 636*9880d681SAndroid Build Coastguard Worker let mayStore = 1 in { 637*9880d681SAndroid Build Coastguard Worker def QVSTFDX : XForm_8<31, 711, 638*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 639*9880d681SAndroid Build Coastguard Worker "qvstfdx $FRT, $dst", IIC_LdStSTFD, 640*9880d681SAndroid Build Coastguard Worker [(store qfrc:$FRT, xoaddr:$dst)]>; 641*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 642*9880d681SAndroid Build Coastguard Worker def QVSTFDXb : XForm_8<31, 711, 643*9880d681SAndroid Build Coastguard Worker (outs), (ins qbrc:$FRT, memrr:$dst), 644*9880d681SAndroid Build Coastguard Worker "qvstfdx $FRT, $dst", IIC_LdStSTFD, []>; 645*9880d681SAndroid Build Coastguard Worker 646*9880d681SAndroid Build Coastguard Worker let RC = 1 in 647*9880d681SAndroid Build Coastguard Worker def QVSTFDXA : XForm_8<31, 711, 648*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 649*9880d681SAndroid Build Coastguard Worker "qvstfdxa $FRT, $dst", IIC_LdStSTFD, []>; 650*9880d681SAndroid Build Coastguard Worker 651*9880d681SAndroid Build Coastguard Worker def QVSTFDUX : XForm_8<31, 743, (outs ptr_rc_nor0:$ea_res), 652*9880d681SAndroid Build Coastguard Worker (ins qfrc:$FRT, memrr:$dst), 653*9880d681SAndroid Build Coastguard Worker "qvstfdux $FRT, $dst", IIC_LdStSTFDU, []>, 654*9880d681SAndroid Build Coastguard Worker RegConstraint<"$dst.ptrreg = $ea_res">, 655*9880d681SAndroid Build Coastguard Worker NoEncode<"$ea_res">; 656*9880d681SAndroid Build Coastguard Worker 657*9880d681SAndroid Build Coastguard Worker let RC = 1 in 658*9880d681SAndroid Build Coastguard Worker def QVSTFDUXA : XForm_8<31, 743, 659*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 660*9880d681SAndroid Build Coastguard Worker "qvstfduxa $FRT, $dst", IIC_LdStSTFD, []>; 661*9880d681SAndroid Build Coastguard Worker 662*9880d681SAndroid Build Coastguard Worker def QVSTFDXI : XForm_8<31, 709, 663*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 664*9880d681SAndroid Build Coastguard Worker "qvstfdxi $FRT, $dst", IIC_LdStSTFD, []>; 665*9880d681SAndroid Build Coastguard Worker let RC = 1 in 666*9880d681SAndroid Build Coastguard Worker def QVSTFDXIA : XForm_8<31, 709, 667*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 668*9880d681SAndroid Build Coastguard Worker "qvstfdxia $FRT, $dst", IIC_LdStSTFD, []>; 669*9880d681SAndroid Build Coastguard Worker 670*9880d681SAndroid Build Coastguard Worker def QVSTFDUXI : XForm_8<31, 741, 671*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 672*9880d681SAndroid Build Coastguard Worker "qvstfduxi $FRT, $dst", IIC_LdStSTFD, []>; 673*9880d681SAndroid Build Coastguard Worker let RC = 1 in 674*9880d681SAndroid Build Coastguard Worker def QVSTFDUXIA : XForm_8<31, 741, 675*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 676*9880d681SAndroid Build Coastguard Worker "qvstfduxia $FRT, $dst", IIC_LdStSTFD, []>; 677*9880d681SAndroid Build Coastguard Worker 678*9880d681SAndroid Build Coastguard Worker def QVSTFSX : XForm_8<31, 647, 679*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 680*9880d681SAndroid Build Coastguard Worker "qvstfsx $FRT, $dst", IIC_LdStSTFD, 681*9880d681SAndroid Build Coastguard Worker [(truncstorev4f32 qfrc:$FRT, xoaddr:$dst)]>; 682*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 683*9880d681SAndroid Build Coastguard Worker def QVSTFSXs : XForm_8<31, 647, 684*9880d681SAndroid Build Coastguard Worker (outs), (ins qsrc:$FRT, memrr:$dst), 685*9880d681SAndroid Build Coastguard Worker "qvstfsx $FRT, $dst", IIC_LdStSTFD, 686*9880d681SAndroid Build Coastguard Worker [(store qsrc:$FRT, xoaddr:$dst)]>; 687*9880d681SAndroid Build Coastguard Worker 688*9880d681SAndroid Build Coastguard Worker let RC = 1 in 689*9880d681SAndroid Build Coastguard Worker def QVSTFSXA : XForm_8<31, 647, 690*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 691*9880d681SAndroid Build Coastguard Worker "qvstfsxa $FRT, $dst", IIC_LdStSTFD, []>; 692*9880d681SAndroid Build Coastguard Worker 693*9880d681SAndroid Build Coastguard Worker def QVSTFSUX : XForm_8<31, 679, (outs ptr_rc_nor0:$ea_res), 694*9880d681SAndroid Build Coastguard Worker (ins qsrc:$FRT, memrr:$dst), 695*9880d681SAndroid Build Coastguard Worker "qvstfsux $FRT, $dst", IIC_LdStSTFDU, []>, 696*9880d681SAndroid Build Coastguard Worker RegConstraint<"$dst.ptrreg = $ea_res">, 697*9880d681SAndroid Build Coastguard Worker NoEncode<"$ea_res">; 698*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 699*9880d681SAndroid Build Coastguard Worker def QVSTFSUXs: XForm_8<31, 679, (outs ptr_rc_nor0:$ea_res), 700*9880d681SAndroid Build Coastguard Worker (ins qfrc:$FRT, memrr:$dst), 701*9880d681SAndroid Build Coastguard Worker "qvstfsux $FRT, $dst", IIC_LdStSTFDU, []>, 702*9880d681SAndroid Build Coastguard Worker RegConstraint<"$dst.ptrreg = $ea_res">, 703*9880d681SAndroid Build Coastguard Worker NoEncode<"$ea_res">; 704*9880d681SAndroid Build Coastguard Worker 705*9880d681SAndroid Build Coastguard Worker let RC = 1 in 706*9880d681SAndroid Build Coastguard Worker def QVSTFSUXA : XForm_8<31, 679, 707*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 708*9880d681SAndroid Build Coastguard Worker "qvstfsuxa $FRT, $dst", IIC_LdStSTFD, []>; 709*9880d681SAndroid Build Coastguard Worker 710*9880d681SAndroid Build Coastguard Worker def QVSTFSXI : XForm_8<31, 645, 711*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 712*9880d681SAndroid Build Coastguard Worker "qvstfsxi $FRT, $dst", IIC_LdStSTFD, []>; 713*9880d681SAndroid Build Coastguard Worker let RC = 1 in 714*9880d681SAndroid Build Coastguard Worker def QVSTFSXIA : XForm_8<31, 645, 715*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 716*9880d681SAndroid Build Coastguard Worker "qvstfsxia $FRT, $dst", IIC_LdStSTFD, []>; 717*9880d681SAndroid Build Coastguard Worker 718*9880d681SAndroid Build Coastguard Worker def QVSTFSUXI : XForm_8<31, 677, 719*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 720*9880d681SAndroid Build Coastguard Worker "qvstfsuxi $FRT, $dst", IIC_LdStSTFD, []>; 721*9880d681SAndroid Build Coastguard Worker let RC = 1 in 722*9880d681SAndroid Build Coastguard Worker def QVSTFSUXIA : XForm_8<31, 677, 723*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 724*9880d681SAndroid Build Coastguard Worker "qvstfsuxia $FRT, $dst", IIC_LdStSTFD, []>; 725*9880d681SAndroid Build Coastguard Worker 726*9880d681SAndroid Build Coastguard Worker def QVSTFCDX : XForm_8<31, 199, 727*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 728*9880d681SAndroid Build Coastguard Worker "qvstfcdx $FRT, $dst", IIC_LdStSTFD, []>; 729*9880d681SAndroid Build Coastguard Worker let RC = 1 in 730*9880d681SAndroid Build Coastguard Worker def QVSTFCDXA : XForm_8<31, 199, 731*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 732*9880d681SAndroid Build Coastguard Worker "qvstfcdxa $FRT, $dst", IIC_LdStSTFD, []>; 733*9880d681SAndroid Build Coastguard Worker 734*9880d681SAndroid Build Coastguard Worker def QVSTFCSX : XForm_8<31, 135, 735*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 736*9880d681SAndroid Build Coastguard Worker "qvstfcsx $FRT, $dst", IIC_LdStSTFD, []>; 737*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in 738*9880d681SAndroid Build Coastguard Worker def QVSTFCSXs : XForm_8<31, 135, 739*9880d681SAndroid Build Coastguard Worker (outs), (ins qsrc:$FRT, memrr:$dst), 740*9880d681SAndroid Build Coastguard Worker "qvstfcsx $FRT, $dst", IIC_LdStSTFD, []>; 741*9880d681SAndroid Build Coastguard Worker 742*9880d681SAndroid Build Coastguard Worker let RC = 1 in 743*9880d681SAndroid Build Coastguard Worker def QVSTFCSXA : XForm_8<31, 135, 744*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 745*9880d681SAndroid Build Coastguard Worker "qvstfcsxa $FRT, $dst", IIC_LdStSTFD, []>; 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Worker def QVSTFCDUX : XForm_8<31, 231, 748*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 749*9880d681SAndroid Build Coastguard Worker "qvstfcdux $FRT, $dst", IIC_LdStSTFD, []>; 750*9880d681SAndroid Build Coastguard Worker let RC = 1 in 751*9880d681SAndroid Build Coastguard Worker def QVSTFCDUXA : XForm_8<31, 231, 752*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 753*9880d681SAndroid Build Coastguard Worker "qvstfcduxa $FRT, $dst", IIC_LdStSTFD, []>; 754*9880d681SAndroid Build Coastguard Worker 755*9880d681SAndroid Build Coastguard Worker def QVSTFCSUX : XForm_8<31, 167, 756*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 757*9880d681SAndroid Build Coastguard Worker "qvstfcsux $FRT, $dst", IIC_LdStSTFD, []>; 758*9880d681SAndroid Build Coastguard Worker let RC = 1 in 759*9880d681SAndroid Build Coastguard Worker def QVSTFCSUXA : XForm_8<31, 167, 760*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 761*9880d681SAndroid Build Coastguard Worker "qvstfcsuxa $FRT, $dst", IIC_LdStSTFD, []>; 762*9880d681SAndroid Build Coastguard Worker 763*9880d681SAndroid Build Coastguard Worker def QVSTFCDXI : XForm_8<31, 197, 764*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 765*9880d681SAndroid Build Coastguard Worker "qvstfcdxi $FRT, $dst", IIC_LdStSTFD, []>; 766*9880d681SAndroid Build Coastguard Worker let RC = 1 in 767*9880d681SAndroid Build Coastguard Worker def QVSTFCDXIA : XForm_8<31, 197, 768*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 769*9880d681SAndroid Build Coastguard Worker "qvstfcdxia $FRT, $dst", IIC_LdStSTFD, []>; 770*9880d681SAndroid Build Coastguard Worker 771*9880d681SAndroid Build Coastguard Worker def QVSTFCSXI : XForm_8<31, 133, 772*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 773*9880d681SAndroid Build Coastguard Worker "qvstfcsxi $FRT, $dst", IIC_LdStSTFD, []>; 774*9880d681SAndroid Build Coastguard Worker let RC = 1 in 775*9880d681SAndroid Build Coastguard Worker def QVSTFCSXIA : XForm_8<31, 133, 776*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 777*9880d681SAndroid Build Coastguard Worker "qvstfcsxia $FRT, $dst", IIC_LdStSTFD, []>; 778*9880d681SAndroid Build Coastguard Worker 779*9880d681SAndroid Build Coastguard Worker def QVSTFCDUXI : XForm_8<31, 229, 780*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 781*9880d681SAndroid Build Coastguard Worker "qvstfcduxi $FRT, $dst", IIC_LdStSTFD, []>; 782*9880d681SAndroid Build Coastguard Worker let RC = 1 in 783*9880d681SAndroid Build Coastguard Worker def QVSTFCDUXIA : XForm_8<31, 229, 784*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 785*9880d681SAndroid Build Coastguard Worker "qvstfcduxia $FRT, $dst", IIC_LdStSTFD, []>; 786*9880d681SAndroid Build Coastguard Worker 787*9880d681SAndroid Build Coastguard Worker def QVSTFCSUXI : XForm_8<31, 165, 788*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 789*9880d681SAndroid Build Coastguard Worker "qvstfcsuxi $FRT, $dst", IIC_LdStSTFD, []>; 790*9880d681SAndroid Build Coastguard Worker let RC = 1 in 791*9880d681SAndroid Build Coastguard Worker def QVSTFCSUXIA : XForm_8<31, 165, 792*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 793*9880d681SAndroid Build Coastguard Worker "qvstfcsuxia $FRT, $dst", IIC_LdStSTFD, []>; 794*9880d681SAndroid Build Coastguard Worker 795*9880d681SAndroid Build Coastguard Worker def QVSTFIWX : XForm_8<31, 967, 796*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 797*9880d681SAndroid Build Coastguard Worker "qvstfiwx $FRT, $dst", IIC_LdStSTFD, []>; 798*9880d681SAndroid Build Coastguard Worker let RC = 1 in 799*9880d681SAndroid Build Coastguard Worker def QVSTFIWXA : XForm_8<31, 967, 800*9880d681SAndroid Build Coastguard Worker (outs), (ins qfrc:$FRT, memrr:$dst), 801*9880d681SAndroid Build Coastguard Worker "qvstfiwxa $FRT, $dst", IIC_LdStSTFD, []>; 802*9880d681SAndroid Build Coastguard Worker } 803*9880d681SAndroid Build Coastguard Worker} 804*9880d681SAndroid Build Coastguard Worker 805*9880d681SAndroid Build Coastguard Worker} // neverHasSideEffects 806*9880d681SAndroid Build Coastguard Worker} 807*9880d681SAndroid Build Coastguard Worker 808*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfclr $FRT", 809*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRT, qbrc:$FRT, 0)>; 810*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfand $FRT, $FRA, $FRB", 811*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 1)>; 812*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfandc $FRT, $FRA, $FRB", 813*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 4)>; 814*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfctfb $FRT, $FRA", 815*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRA, 5)>; 816*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfxor $FRT, $FRA, $FRB", 817*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 6)>; 818*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfor $FRT, $FRA, $FRB", 819*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 7)>; 820*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfnor $FRT, $FRA, $FRB", 821*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 8)>; 822*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfequ $FRT, $FRA, $FRB", 823*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 9)>; 824*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfnot $FRT, $FRA", 825*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRA, 10)>; 826*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvforc $FRT, $FRA, $FRB", 827*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 13)>; 828*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfnand $FRT, $FRA, $FRB", 829*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 14)>; 830*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfset $FRT", 831*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb qbrc:$FRT, qbrc:$FRT, qbrc:$FRT, 15)>; 832*9880d681SAndroid Build Coastguard Worker 833*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 834*9880d681SAndroid Build Coastguard Worker// Additional QPX Patterns 835*9880d681SAndroid Build Coastguard Worker// 836*9880d681SAndroid Build Coastguard Worker 837*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (scalar_to_vector f64:$A)), 838*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4f64 (IMPLICIT_DEF)), $A, sub_64)>; 839*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (scalar_to_vector f32:$A)), 840*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), $A, sub_64)>; 841*9880d681SAndroid Build Coastguard Worker 842*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, 0)), 843*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG $S, sub_64)>; 844*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, 0)), 845*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG $S, sub_64)>; 846*9880d681SAndroid Build Coastguard Worker 847*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, 1)), 848*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (QVESPLATI $S, 1), sub_64)>; 849*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, 2)), 850*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (QVESPLATI $S, 2), sub_64)>; 851*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, 3)), 852*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (QVESPLATI $S, 3), sub_64)>; 853*9880d681SAndroid Build Coastguard Worker 854*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, 1)), 855*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (QVESPLATIs $S, 1), sub_64)>; 856*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, 2)), 857*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (QVESPLATIs $S, 2), sub_64)>; 858*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, 3)), 859*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (QVESPLATIs $S, 3), sub_64)>; 860*9880d681SAndroid Build Coastguard Worker 861*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, i64:$F)), 862*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (QVFPERM $S, $S, 863*9880d681SAndroid Build Coastguard Worker (QVLPCLSXint (RLDICR $F, 2, 864*9880d681SAndroid Build Coastguard Worker /* 63-2 = */ 61))), 865*9880d681SAndroid Build Coastguard Worker sub_64)>; 866*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, i64:$F)), 867*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (QVFPERMs $S, $S, 868*9880d681SAndroid Build Coastguard Worker (QVLPCLSXint (RLDICR $F, 2, 869*9880d681SAndroid Build Coastguard Worker /* 63-2 = */ 61))), 870*9880d681SAndroid Build Coastguard Worker sub_64)>; 871*9880d681SAndroid Build Coastguard Worker 872*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfperm v4f64:$A, v4f64:$B, v4f64:$C), 873*9880d681SAndroid Build Coastguard Worker (QVFPERM $A, $B, $C)>; 874*9880d681SAndroid Build Coastguard Worker 875*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfcpsgn v4f64:$A, v4f64:$B), 876*9880d681SAndroid Build Coastguard Worker (QVFCPSGN $A, $B)>; 877*9880d681SAndroid Build Coastguard Worker 878*9880d681SAndroid Build Coastguard Worker// FCOPYSIGN's operand types need not agree. 879*9880d681SAndroid Build Coastguard Workerdef : Pat<(fcopysign v4f64:$frB, v4f32:$frA), 880*9880d681SAndroid Build Coastguard Worker (QVFCPSGN (COPY_TO_REGCLASS $frA, QFRC), $frB)>; 881*9880d681SAndroid Build Coastguard Workerdef : Pat<(fcopysign QSRC:$frB, QFRC:$frA), 882*9880d681SAndroid Build Coastguard Worker (QVFCPSGNs (COPY_TO_REGCLASS $frA, QSRC), $frB)>; 883*9880d681SAndroid Build Coastguard Worker 884*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfneg v4f64:$A), (QVFNEG $A)>; 885*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfabs v4f64:$A), (QVFABS $A)>; 886*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfnabs v4f64:$A), (QVFNABS $A)>; 887*9880d681SAndroid Build Coastguard Worker 888*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfriz v4f64:$A), (QVFRIZ $A)>; 889*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfrin v4f64:$A), (QVFRIN $A)>; 890*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfrip v4f64:$A), (QVFRIP $A)>; 891*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfrim v4f64:$A), (QVFRIM $A)>; 892*9880d681SAndroid Build Coastguard Worker 893*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfre v4f64:$A), (QVFRE $A)>; 894*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfrsqrte v4f64:$A), (QVFRSQRTE $A)>; 895*9880d681SAndroid Build Coastguard Worker 896*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfadd v4f64:$A, v4f64:$B), 897*9880d681SAndroid Build Coastguard Worker (QVFADD $A, $B)>; 898*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfsub v4f64:$A, v4f64:$B), 899*9880d681SAndroid Build Coastguard Worker (QVFSUB $A, $B)>; 900*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfmul v4f64:$A, v4f64:$B), 901*9880d681SAndroid Build Coastguard Worker (QVFMUL $A, $B)>; 902*9880d681SAndroid Build Coastguard Worker 903*9880d681SAndroid Build Coastguard Worker// Additional QVFNMSUB patterns: -a*c + b == -(a*c - b) 904*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg v4f64:$A), v4f64:$C, v4f64:$B), 905*9880d681SAndroid Build Coastguard Worker (QVFNMSUB $A, $B, $C)>; 906*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma v4f64:$A, (fneg v4f64:$C), v4f64:$B), 907*9880d681SAndroid Build Coastguard Worker (QVFNMSUB $A, $B, $C)>; 908*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B), 909*9880d681SAndroid Build Coastguard Worker (QVFNMSUBSs $A, $B, $C)>; 910*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B), 911*9880d681SAndroid Build Coastguard Worker (QVFNMSUBSs $A, $B, $C)>; 912*9880d681SAndroid Build Coastguard Worker 913*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfmadd v4f64:$A, v4f64:$B, v4f64:$C), 914*9880d681SAndroid Build Coastguard Worker (QVFMADD $A, $B, $C)>; 915*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfnmadd v4f64:$A, v4f64:$B, v4f64:$C), 916*9880d681SAndroid Build Coastguard Worker (QVFNMADD $A, $B, $C)>; 917*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfmsub v4f64:$A, v4f64:$B, v4f64:$C), 918*9880d681SAndroid Build Coastguard Worker (QVFMSUB $A, $B, $C)>; 919*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfnmsub v4f64:$A, v4f64:$B, v4f64:$C), 920*9880d681SAndroid Build Coastguard Worker (QVFNMSUB $A, $B, $C)>; 921*9880d681SAndroid Build Coastguard Worker 922*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfd xoaddr:$src), 923*9880d681SAndroid Build Coastguard Worker (QVLFDX xoaddr:$src)>; 924*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfda xoaddr:$src), 925*9880d681SAndroid Build Coastguard Worker (QVLFDXA xoaddr:$src)>; 926*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfs xoaddr:$src), 927*9880d681SAndroid Build Coastguard Worker (QVLFSX xoaddr:$src)>; 928*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfsa xoaddr:$src), 929*9880d681SAndroid Build Coastguard Worker (QVLFSXA xoaddr:$src)>; 930*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfcda xoaddr:$src), 931*9880d681SAndroid Build Coastguard Worker (QVLFCDXA xoaddr:$src)>; 932*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfcd xoaddr:$src), 933*9880d681SAndroid Build Coastguard Worker (QVLFCDX xoaddr:$src)>; 934*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfcsa xoaddr:$src), 935*9880d681SAndroid Build Coastguard Worker (QVLFCSXA xoaddr:$src)>; 936*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfcs xoaddr:$src), 937*9880d681SAndroid Build Coastguard Worker (QVLFCSX xoaddr:$src)>; 938*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfda xoaddr:$src), 939*9880d681SAndroid Build Coastguard Worker (QVLFDXA xoaddr:$src)>; 940*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfiwaa xoaddr:$src), 941*9880d681SAndroid Build Coastguard Worker (QVLFIWAXA xoaddr:$src)>; 942*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfiwa xoaddr:$src), 943*9880d681SAndroid Build Coastguard Worker (QVLFIWAX xoaddr:$src)>; 944*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfiwza xoaddr:$src), 945*9880d681SAndroid Build Coastguard Worker (QVLFIWZXA xoaddr:$src)>; 946*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfiwz xoaddr:$src), 947*9880d681SAndroid Build Coastguard Worker (QVLFIWZX xoaddr:$src)>; 948*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfsa xoaddr:$src), 949*9880d681SAndroid Build Coastguard Worker (QVLFSXA xoaddr:$src)>; 950*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlpcld xoaddr:$src), 951*9880d681SAndroid Build Coastguard Worker (QVLPCLDX xoaddr:$src)>; 952*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlpcls xoaddr:$src), 953*9880d681SAndroid Build Coastguard Worker (QVLPCLSX xoaddr:$src)>; 954*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlpcrd xoaddr:$src), 955*9880d681SAndroid Build Coastguard Worker (QVLPCRDX xoaddr:$src)>; 956*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlpcrs xoaddr:$src), 957*9880d681SAndroid Build Coastguard Worker (QVLPCRSX xoaddr:$src)>; 958*9880d681SAndroid Build Coastguard Worker 959*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfd v4f64:$T, xoaddr:$dst), 960*9880d681SAndroid Build Coastguard Worker (QVSTFDX $T, xoaddr:$dst)>; 961*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfs v4f64:$T, xoaddr:$dst), 962*9880d681SAndroid Build Coastguard Worker (QVSTFSX $T, xoaddr:$dst)>; 963*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfcda v4f64:$T, xoaddr:$dst), 964*9880d681SAndroid Build Coastguard Worker (QVSTFCDXA $T, xoaddr:$dst)>; 965*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfcd v4f64:$T, xoaddr:$dst), 966*9880d681SAndroid Build Coastguard Worker (QVSTFCDX $T, xoaddr:$dst)>; 967*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfcsa v4f64:$T, xoaddr:$dst), 968*9880d681SAndroid Build Coastguard Worker (QVSTFCSXA $T, xoaddr:$dst)>; 969*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfcs v4f64:$T, xoaddr:$dst), 970*9880d681SAndroid Build Coastguard Worker (QVSTFCSX $T, xoaddr:$dst)>; 971*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfda v4f64:$T, xoaddr:$dst), 972*9880d681SAndroid Build Coastguard Worker (QVSTFDXA $T, xoaddr:$dst)>; 973*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfiwa v4f64:$T, xoaddr:$dst), 974*9880d681SAndroid Build Coastguard Worker (QVSTFIWXA $T, xoaddr:$dst)>; 975*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfiw v4f64:$T, xoaddr:$dst), 976*9880d681SAndroid Build Coastguard Worker (QVSTFIWX $T, xoaddr:$dst)>; 977*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfsa v4f64:$T, xoaddr:$dst), 978*9880d681SAndroid Build Coastguard Worker (QVSTFSXA $T, xoaddr:$dst)>; 979*9880d681SAndroid Build Coastguard Worker 980*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store v4f64:$rS, iPTR:$ptrreg, iPTR:$ptroff), 981*9880d681SAndroid Build Coastguard Worker (QVSTFDUX $rS, $ptrreg, $ptroff)>; 982*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store v4f32:$rS, iPTR:$ptrreg, iPTR:$ptroff), 983*9880d681SAndroid Build Coastguard Worker (QVSTFSUX $rS, $ptrreg, $ptroff)>; 984*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncstv4f32 v4f64:$rS, iPTR:$ptrreg, iPTR:$ptroff), 985*9880d681SAndroid Build Coastguard Worker (QVSTFSUXs $rS, $ptrreg, $ptroff)>; 986*9880d681SAndroid Build Coastguard Worker 987*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvflogical v4f64:$A, v4f64:$B, (i32 imm:$idx)), 988*9880d681SAndroid Build Coastguard Worker (QVFLOGICAL $A, $B, imm:$idx)>; 989*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvgpci (u12:$idx)), 990*9880d681SAndroid Build Coastguard Worker (QVGPCI imm:$idx)>; 991*9880d681SAndroid Build Coastguard Worker 992*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETOGE), 993*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPLTb $FRA, $FRB), 994*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRA, $FRB), (i32 8))>; 995*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETOLE), 996*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPGTb $FRA, $FRB), 997*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRA, $FRB), (i32 8))>; 998*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETONE), 999*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPEQb $FRA, $FRB), 1000*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRA, $FRB), (i32 8))>; 1001*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETO), 1002*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFTSTNANb $FRA, $FRB), 1003*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRA, $FRB), (i32 10))>; 1004*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUEQ), 1005*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPEQb $FRA, $FRB), 1006*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRA, $FRB), (i32 7))>; 1007*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUGT), 1008*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPGTb $FRA, $FRB), 1009*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRA, $FRB), (i32 7))>; 1010*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUGE), 1011*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFTSTNANb $FRA, $FRB), 1012*9880d681SAndroid Build Coastguard Worker (QVFCMPLTb $FRA, $FRB), (i32 13))>; 1013*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETULT), 1014*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPLTb $FRA, $FRB), 1015*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRA, $FRB), (i32 7))>; 1016*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETULE), 1017*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFTSTNANb $FRA, $FRB), 1018*9880d681SAndroid Build Coastguard Worker (QVFCMPGTb $FRA, $FRB), (i32 13))>; 1019*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUNE), 1020*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFTSTNANb $FRA, $FRB), 1021*9880d681SAndroid Build Coastguard Worker (QVFCMPEQb $FRA, $FRB), (i32 13))>; 1022*9880d681SAndroid Build Coastguard Worker 1023*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETEQ), 1024*9880d681SAndroid Build Coastguard Worker (QVFCMPEQb $FRA, $FRB)>; 1025*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETGT), 1026*9880d681SAndroid Build Coastguard Worker (QVFCMPGTb $FRA, $FRB)>; 1027*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETGE), 1028*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPLTb $FRA, $FRB), 1029*9880d681SAndroid Build Coastguard Worker (QVFCMPLTb $FRA, $FRB), (i32 10))>; 1030*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETLT), 1031*9880d681SAndroid Build Coastguard Worker (QVFCMPLTb $FRA, $FRB)>; 1032*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETLE), 1033*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPGTb $FRA, $FRB), 1034*9880d681SAndroid Build Coastguard Worker (QVFCMPGTb $FRA, $FRB), (i32 10))>; 1035*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETNE), 1036*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPEQb $FRA, $FRB), 1037*9880d681SAndroid Build Coastguard Worker (QVFCMPEQb $FRA, $FRB), (i32 10))>; 1038*9880d681SAndroid Build Coastguard Worker 1039*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETOGE), 1040*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB), 1041*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRA, $FRB), (i32 8))>; 1042*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETOLE), 1043*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB), 1044*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRA, $FRB), (i32 8))>; 1045*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETONE), 1046*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB), 1047*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRA, $FRB), (i32 8))>; 1048*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETO), 1049*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB), 1050*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRA, $FRB), (i32 10))>; 1051*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUEQ), 1052*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB), 1053*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRA, $FRB), (i32 7))>; 1054*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUGT), 1055*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB), 1056*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRA, $FRB), (i32 7))>; 1057*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUGE), 1058*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB), 1059*9880d681SAndroid Build Coastguard Worker (QVFCMPLTbs $FRA, $FRB), (i32 13))>; 1060*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETULT), 1061*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB), 1062*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRA, $FRB), (i32 7))>; 1063*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETULE), 1064*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB), 1065*9880d681SAndroid Build Coastguard Worker (QVFCMPGTbs $FRA, $FRB), (i32 13))>; 1066*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUNE), 1067*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB), 1068*9880d681SAndroid Build Coastguard Worker (QVFCMPEQbs $FRA, $FRB), (i32 13))>; 1069*9880d681SAndroid Build Coastguard Worker 1070*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETEQ), 1071*9880d681SAndroid Build Coastguard Worker (QVFCMPEQbs $FRA, $FRB)>; 1072*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETGT), 1073*9880d681SAndroid Build Coastguard Worker (QVFCMPGTbs $FRA, $FRB)>; 1074*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETGE), 1075*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB), 1076*9880d681SAndroid Build Coastguard Worker (QVFCMPLTbs $FRA, $FRB), (i32 10))>; 1077*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETLT), 1078*9880d681SAndroid Build Coastguard Worker (QVFCMPLTbs $FRA, $FRB)>; 1079*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETLE), 1080*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB), 1081*9880d681SAndroid Build Coastguard Worker (QVFCMPGTbs $FRA, $FRB), (i32 10))>; 1082*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETNE), 1083*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB), 1084*9880d681SAndroid Build Coastguard Worker (QVFCMPEQbs $FRA, $FRB), (i32 10))>; 1085*9880d681SAndroid Build Coastguard Worker 1086*9880d681SAndroid Build Coastguard Workerdef : Pat<(and v4i1:$FRA, (not v4i1:$FRB)), 1087*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRB, (i32 4))>; 1088*9880d681SAndroid Build Coastguard Workerdef : Pat<(not (or v4i1:$FRA, v4i1:$FRB)), 1089*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRB, (i32 8))>; 1090*9880d681SAndroid Build Coastguard Workerdef : Pat<(not (xor v4i1:$FRA, v4i1:$FRB)), 1091*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRB, (i32 9))>; 1092*9880d681SAndroid Build Coastguard Workerdef : Pat<(or v4i1:$FRA, (not v4i1:$FRB)), 1093*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRB, (i32 13))>; 1094*9880d681SAndroid Build Coastguard Workerdef : Pat<(not (and v4i1:$FRA, v4i1:$FRB)), 1095*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRB, (i32 14))>; 1096*9880d681SAndroid Build Coastguard Worker 1097*9880d681SAndroid Build Coastguard Workerdef : Pat<(and v4i1:$FRA, v4i1:$FRB), 1098*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRB, (i32 1))>; 1099*9880d681SAndroid Build Coastguard Workerdef : Pat<(or v4i1:$FRA, v4i1:$FRB), 1100*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRB, (i32 7))>; 1101*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor v4i1:$FRA, v4i1:$FRB), 1102*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRB, (i32 6))>; 1103*9880d681SAndroid Build Coastguard Workerdef : Pat<(not v4i1:$FRA), 1104*9880d681SAndroid Build Coastguard Worker (QVFLOGICALb $FRA, $FRA, (i32 10))>; 1105*9880d681SAndroid Build Coastguard Worker 1106*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (fextend v4f32:$src)), 1107*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS $src, QFRC)>; 1108*9880d681SAndroid Build Coastguard Worker 1109*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fround_exact v4f64:$src)), 1110*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS $src, QSRC)>; 1111*9880d681SAndroid Build Coastguard Worker 1112*9880d681SAndroid Build Coastguard Worker// Extract the underlying floating-point values from the 1113*9880d681SAndroid Build Coastguard Worker// QPX (-1.0, 1.0) boolean representation. 1114*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (PPCqbflt v4i1:$src)), 1115*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS $src, QFRC)>; 1116*9880d681SAndroid Build Coastguard Worker 1117*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETLT)), 1118*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1119*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETULT)), 1120*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1121*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETLE)), 1122*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRORC $lhs, $rhs), $tval, $fval)>; 1123*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETULE)), 1124*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRORC $rhs, $lhs), $tval, $fval)>; 1125*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETEQ)), 1126*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CREQV $lhs, $rhs), $tval, $fval)>; 1127*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETGE)), 1128*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRORC $rhs, $lhs), $tval, $fval)>; 1129*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETUGE)), 1130*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRORC $lhs, $rhs), $tval, $fval)>; 1131*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETGT)), 1132*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1133*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETUGT)), 1134*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1135*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETNE)), 1136*9880d681SAndroid Build Coastguard Worker (SELECT_QFRC (CRXOR $lhs, $rhs), $tval, $fval)>; 1137*9880d681SAndroid Build Coastguard Worker 1138*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETLT)), 1139*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1140*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETULT)), 1141*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1142*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETLE)), 1143*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRORC $lhs, $rhs), $tval, $fval)>; 1144*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETULE)), 1145*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRORC $rhs, $lhs), $tval, $fval)>; 1146*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETEQ)), 1147*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CREQV $lhs, $rhs), $tval, $fval)>; 1148*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETGE)), 1149*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRORC $rhs, $lhs), $tval, $fval)>; 1150*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETUGE)), 1151*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRORC $lhs, $rhs), $tval, $fval)>; 1152*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETGT)), 1153*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1154*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETUGT)), 1155*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1156*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETNE)), 1157*9880d681SAndroid Build Coastguard Worker (SELECT_QSRC (CRXOR $lhs, $rhs), $tval, $fval)>; 1158*9880d681SAndroid Build Coastguard Worker 1159*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETLT)), 1160*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1161*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETULT)), 1162*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1163*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETLE)), 1164*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRORC $lhs, $rhs), $tval, $fval)>; 1165*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETULE)), 1166*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRORC $rhs, $lhs), $tval, $fval)>; 1167*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETEQ)), 1168*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CREQV $lhs, $rhs), $tval, $fval)>; 1169*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETGE)), 1170*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRORC $rhs, $lhs), $tval, $fval)>; 1171*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETUGE)), 1172*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRORC $lhs, $rhs), $tval, $fval)>; 1173*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETGT)), 1174*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1175*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETUGT)), 1176*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1177*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETNE)), 1178*9880d681SAndroid Build Coastguard Worker (SELECT_QBRC (CRXOR $lhs, $rhs), $tval, $fval)>; 1179*9880d681SAndroid Build Coastguard Worker 1180*9880d681SAndroid Build Coastguard Worker} // end HasQPX 1181*9880d681SAndroid Build Coastguard Worker 1182*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasQPX, NoNaNsFPMath] in { 1183*9880d681SAndroid Build Coastguard Workerdef : Pat<(fminnum v4f64:$FRA, v4f64:$FRB), 1184*9880d681SAndroid Build Coastguard Worker (QVFSELb (QVFCMPLTb $FRA, $FRB), $FRB, $FRA)>; 1185*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmaxnum v4f64:$FRA, v4f64:$FRB), 1186*9880d681SAndroid Build Coastguard Worker (QVFSELb (QVFCMPGTb $FRA, $FRB), $FRB, $FRA)>; 1187*9880d681SAndroid Build Coastguard Worker 1188*9880d681SAndroid Build Coastguard Workerdef : Pat<(fminnum v4f32:$FRA, v4f32:$FRB), 1189*9880d681SAndroid Build Coastguard Worker (QVFSELbs (QVFCMPLTbs $FRA, $FRB), $FRB, $FRA)>; 1190*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmaxnum v4f32:$FRA, v4f32:$FRB), 1191*9880d681SAndroid Build Coastguard Worker (QVFSELbs (QVFCMPGTbs $FRA, $FRB), $FRB, $FRA)>; 1192*9880d681SAndroid Build Coastguard Worker} 1193*9880d681SAndroid Build Coastguard Worker 1194*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasQPX, NaNsFPMath] in { 1195*9880d681SAndroid Build Coastguard Worker// When either of these operands is NaN, we should return the other operand. 1196*9880d681SAndroid Build Coastguard Worker// QVFCMPLT/QVFCMPGT return false is either operand is NaN, which means we need 1197*9880d681SAndroid Build Coastguard Worker// to explicitly or with a NaN test on the second operand. 1198*9880d681SAndroid Build Coastguard Workerdef : Pat<(fminnum v4f64:$FRA, v4f64:$FRB), 1199*9880d681SAndroid Build Coastguard Worker (QVFSELb (QVFLOGICALb (QVFCMPLTb $FRA, $FRB), 1200*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRB, $FRB), (i32 7)), 1201*9880d681SAndroid Build Coastguard Worker $FRB, $FRA)>; 1202*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmaxnum v4f64:$FRA, v4f64:$FRB), 1203*9880d681SAndroid Build Coastguard Worker (QVFSELb (QVFLOGICALb (QVFCMPGTb $FRA, $FRB), 1204*9880d681SAndroid Build Coastguard Worker (QVFTSTNANb $FRB, $FRB), (i32 7)), 1205*9880d681SAndroid Build Coastguard Worker $FRB, $FRA)>; 1206*9880d681SAndroid Build Coastguard Worker 1207*9880d681SAndroid Build Coastguard Workerdef : Pat<(fminnum v4f32:$FRA, v4f32:$FRB), 1208*9880d681SAndroid Build Coastguard Worker (QVFSELbs (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB), 1209*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRB, $FRB), (i32 7)), 1210*9880d681SAndroid Build Coastguard Worker $FRB, $FRA)>; 1211*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmaxnum v4f32:$FRA, v4f32:$FRB), 1212*9880d681SAndroid Build Coastguard Worker (QVFSELbs (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB), 1213*9880d681SAndroid Build Coastguard Worker (QVFTSTNANbs $FRB, $FRB), (i32 7)), 1214*9880d681SAndroid Build Coastguard Worker $FRB, $FRA)>; 1215*9880d681SAndroid Build Coastguard Worker} 1216*9880d681SAndroid Build Coastguard Worker 1217