1*9880d681SAndroid Build Coastguard Worker//=- AArch64InstrInfo.td - Describe the AArch64 Instructions -*- 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// AArch64 Instruction definitions. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker// ARM Instruction Predicate Definitions. 16*9880d681SAndroid Build Coastguard Worker// 17*9880d681SAndroid Build Coastguard Workerdef HasV8_1a : Predicate<"Subtarget->hasV8_1aOps()">, 18*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"HasV8_1aOps", "armv8.1a">; 19*9880d681SAndroid Build Coastguard Workerdef HasV8_2a : Predicate<"Subtarget->hasV8_2aOps()">, 20*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"HasV8_2aOps", "armv8.2a">; 21*9880d681SAndroid Build Coastguard Workerdef HasFPARMv8 : Predicate<"Subtarget->hasFPARMv8()">, 22*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"FeatureFPARMv8", "fp-armv8">; 23*9880d681SAndroid Build Coastguard Workerdef HasNEON : Predicate<"Subtarget->hasNEON()">, 24*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"FeatureNEON", "neon">; 25*9880d681SAndroid Build Coastguard Workerdef HasCrypto : Predicate<"Subtarget->hasCrypto()">, 26*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"FeatureCrypto", "crypto">; 27*9880d681SAndroid Build Coastguard Workerdef HasCRC : Predicate<"Subtarget->hasCRC()">, 28*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"FeatureCRC", "crc">; 29*9880d681SAndroid Build Coastguard Workerdef HasRAS : Predicate<"Subtarget->hasRAS()">, 30*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"FeatureRAS", "ras">; 31*9880d681SAndroid Build Coastguard Workerdef HasPerfMon : Predicate<"Subtarget->hasPerfMon()">; 32*9880d681SAndroid Build Coastguard Workerdef HasFullFP16 : Predicate<"Subtarget->hasFullFP16()">, 33*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"FeatureFullFP16", "fullfp16">; 34*9880d681SAndroid Build Coastguard Workerdef HasSPE : Predicate<"Subtarget->hasSPE()">, 35*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"FeatureSPE", "spe">; 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdef IsLE : Predicate<"Subtarget->isLittleEndian()">; 38*9880d681SAndroid Build Coastguard Workerdef IsBE : Predicate<"!Subtarget->isLittleEndian()">; 39*9880d681SAndroid Build Coastguard Workerdef UseAlternateSExtLoadCVTF32 40*9880d681SAndroid Build Coastguard Worker : Predicate<"Subtarget->useAlternateSExtLoadCVTF32Pattern()">; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 43*9880d681SAndroid Build Coastguard Worker// AArch64-specific DAG Nodes. 44*9880d681SAndroid Build Coastguard Worker// 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker// SDTBinaryArithWithFlagsOut - RES1, FLAGS = op LHS, RHS 47*9880d681SAndroid Build Coastguard Workerdef SDTBinaryArithWithFlagsOut : SDTypeProfile<2, 2, 48*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 2>, 49*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 3>, 50*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, SDTCisVT<1, i32>]>; 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker// SDTBinaryArithWithFlagsIn - RES1, FLAGS = op LHS, RHS, FLAGS 53*9880d681SAndroid Build Coastguard Workerdef SDTBinaryArithWithFlagsIn : SDTypeProfile<1, 3, 54*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 1>, 55*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 2>, 56*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, 57*9880d681SAndroid Build Coastguard Worker SDTCisVT<3, i32>]>; 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker// SDTBinaryArithWithFlagsInOut - RES1, FLAGS = op LHS, RHS, FLAGS 60*9880d681SAndroid Build Coastguard Workerdef SDTBinaryArithWithFlagsInOut : SDTypeProfile<2, 3, 61*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 2>, 62*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 3>, 63*9880d681SAndroid Build Coastguard Worker SDTCisInt<0>, 64*9880d681SAndroid Build Coastguard Worker SDTCisVT<1, i32>, 65*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i32>]>; 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64Brcond : SDTypeProfile<0, 3, 68*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>, 69*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, i32>]>; 70*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64cbz : SDTypeProfile<0, 2, [SDTCisInt<0>, SDTCisVT<1, OtherVT>]>; 71*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64tbz : SDTypeProfile<0, 3, [SDTCisInt<0>, SDTCisInt<1>, 72*9880d681SAndroid Build Coastguard Worker SDTCisVT<2, OtherVT>]>; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64CSel : SDTypeProfile<1, 4, 76*9880d681SAndroid Build Coastguard Worker [SDTCisSameAs<0, 1>, 77*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 2>, 78*9880d681SAndroid Build Coastguard Worker SDTCisInt<3>, 79*9880d681SAndroid Build Coastguard Worker SDTCisVT<4, i32>]>; 80*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64CCMP : SDTypeProfile<1, 5, 81*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, i32>, 82*9880d681SAndroid Build Coastguard Worker SDTCisInt<1>, 83*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1, 2>, 84*9880d681SAndroid Build Coastguard Worker SDTCisInt<3>, 85*9880d681SAndroid Build Coastguard Worker SDTCisInt<4>, 86*9880d681SAndroid Build Coastguard Worker SDTCisVT<5, i32>]>; 87*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64FCCMP : SDTypeProfile<1, 5, 88*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, i32>, 89*9880d681SAndroid Build Coastguard Worker SDTCisFP<1>, 90*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1, 2>, 91*9880d681SAndroid Build Coastguard Worker SDTCisInt<3>, 92*9880d681SAndroid Build Coastguard Worker SDTCisInt<4>, 93*9880d681SAndroid Build Coastguard Worker SDTCisVT<5, i32>]>; 94*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64FCmp : SDTypeProfile<0, 2, 95*9880d681SAndroid Build Coastguard Worker [SDTCisFP<0>, 96*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 1>]>; 97*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64Dup : SDTypeProfile<1, 1, [SDTCisVec<0>]>; 98*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64DupLane : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<2>]>; 99*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64Zip : SDTypeProfile<1, 2, [SDTCisVec<0>, 100*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 1>, 101*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0, 2>]>; 102*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64MOVIedit : SDTypeProfile<1, 1, [SDTCisInt<1>]>; 103*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64MOVIshift : SDTypeProfile<1, 2, [SDTCisInt<1>, SDTCisInt<2>]>; 104*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64vecimm : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 105*9880d681SAndroid Build Coastguard Worker SDTCisInt<2>, SDTCisInt<3>]>; 106*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64UnaryVec: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0,1>]>; 107*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64ExtVec: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 108*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, SDTCisInt<3>]>; 109*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64vshift : SDTypeProfile<1, 2, [SDTCisSameAs<0,1>, SDTCisInt<2>]>; 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64unvec : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0,1>]>; 112*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64fcmpz : SDTypeProfile<1, 1, []>; 113*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64fcmp : SDTypeProfile<1, 2, [SDTCisSameAs<1,2>]>; 114*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64binvec : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, 115*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>]>; 116*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64trivec : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, 117*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,2>, 118*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<0,3>]>; 119*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64TCRET : SDTypeProfile<0, 2, [SDTCisPtrTy<0>]>; 120*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64PREFETCH : SDTypeProfile<0, 2, [SDTCisVT<0, i32>, SDTCisPtrTy<1>]>; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64ITOF : SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisSameAs<0,1>]>; 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64TLSDescCall : SDTypeProfile<0, -2, [SDTCisPtrTy<0>, 125*9880d681SAndroid Build Coastguard Worker SDTCisPtrTy<1>]>; 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker// Generates the general dynamic sequences, i.e. 128*9880d681SAndroid Build Coastguard Worker// adrp x0, :tlsdesc:var 129*9880d681SAndroid Build Coastguard Worker// ldr x1, [x0, #:tlsdesc_lo12:var] 130*9880d681SAndroid Build Coastguard Worker// add x0, x0, #:tlsdesc_lo12:var 131*9880d681SAndroid Build Coastguard Worker// .tlsdesccall var 132*9880d681SAndroid Build Coastguard Worker// blr x1 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker// (the TPIDR_EL0 offset is put directly in X0, hence no "result" here) 135*9880d681SAndroid Build Coastguard Worker// number of operands (the variable) 136*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64TLSDescCallSeq : SDTypeProfile<0,1, 137*9880d681SAndroid Build Coastguard Worker [SDTCisPtrTy<0>]>; 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64WrapperLarge : SDTypeProfile<1, 4, 140*9880d681SAndroid Build Coastguard Worker [SDTCisVT<0, i64>, SDTCisVT<1, i32>, 141*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1, 2>, SDTCisSameAs<1, 3>, 142*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1, 4>]>; 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker// Node definitions. 146*9880d681SAndroid Build Coastguard Workerdef AArch64adrp : SDNode<"AArch64ISD::ADRP", SDTIntUnaryOp, []>; 147*9880d681SAndroid Build Coastguard Workerdef AArch64addlow : SDNode<"AArch64ISD::ADDlow", SDTIntBinOp, []>; 148*9880d681SAndroid Build Coastguard Workerdef AArch64LOADgot : SDNode<"AArch64ISD::LOADgot", SDTIntUnaryOp>; 149*9880d681SAndroid Build Coastguard Workerdef AArch64callseq_start : SDNode<"ISD::CALLSEQ_START", 150*9880d681SAndroid Build Coastguard Worker SDCallSeqStart<[ SDTCisVT<0, i32> ]>, 151*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOutGlue]>; 152*9880d681SAndroid Build Coastguard Workerdef AArch64callseq_end : SDNode<"ISD::CALLSEQ_END", 153*9880d681SAndroid Build Coastguard Worker SDCallSeqEnd<[ SDTCisVT<0, i32>, 154*9880d681SAndroid Build Coastguard Worker SDTCisVT<1, i32> ]>, 155*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 156*9880d681SAndroid Build Coastguard Workerdef AArch64call : SDNode<"AArch64ISD::CALL", 157*9880d681SAndroid Build Coastguard Worker SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>, 158*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, 159*9880d681SAndroid Build Coastguard Worker SDNPVariadic]>; 160*9880d681SAndroid Build Coastguard Workerdef AArch64brcond : SDNode<"AArch64ISD::BRCOND", SDT_AArch64Brcond, 161*9880d681SAndroid Build Coastguard Worker [SDNPHasChain]>; 162*9880d681SAndroid Build Coastguard Workerdef AArch64cbz : SDNode<"AArch64ISD::CBZ", SDT_AArch64cbz, 163*9880d681SAndroid Build Coastguard Worker [SDNPHasChain]>; 164*9880d681SAndroid Build Coastguard Workerdef AArch64cbnz : SDNode<"AArch64ISD::CBNZ", SDT_AArch64cbz, 165*9880d681SAndroid Build Coastguard Worker [SDNPHasChain]>; 166*9880d681SAndroid Build Coastguard Workerdef AArch64tbz : SDNode<"AArch64ISD::TBZ", SDT_AArch64tbz, 167*9880d681SAndroid Build Coastguard Worker [SDNPHasChain]>; 168*9880d681SAndroid Build Coastguard Workerdef AArch64tbnz : SDNode<"AArch64ISD::TBNZ", SDT_AArch64tbz, 169*9880d681SAndroid Build Coastguard Worker [SDNPHasChain]>; 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdef AArch64csel : SDNode<"AArch64ISD::CSEL", SDT_AArch64CSel>; 173*9880d681SAndroid Build Coastguard Workerdef AArch64csinv : SDNode<"AArch64ISD::CSINV", SDT_AArch64CSel>; 174*9880d681SAndroid Build Coastguard Workerdef AArch64csneg : SDNode<"AArch64ISD::CSNEG", SDT_AArch64CSel>; 175*9880d681SAndroid Build Coastguard Workerdef AArch64csinc : SDNode<"AArch64ISD::CSINC", SDT_AArch64CSel>; 176*9880d681SAndroid Build Coastguard Workerdef AArch64retflag : SDNode<"AArch64ISD::RET_FLAG", SDTNone, 177*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 178*9880d681SAndroid Build Coastguard Workerdef AArch64adc : SDNode<"AArch64ISD::ADC", SDTBinaryArithWithFlagsIn >; 179*9880d681SAndroid Build Coastguard Workerdef AArch64sbc : SDNode<"AArch64ISD::SBC", SDTBinaryArithWithFlagsIn>; 180*9880d681SAndroid Build Coastguard Workerdef AArch64add_flag : SDNode<"AArch64ISD::ADDS", SDTBinaryArithWithFlagsOut, 181*9880d681SAndroid Build Coastguard Worker [SDNPCommutative]>; 182*9880d681SAndroid Build Coastguard Workerdef AArch64sub_flag : SDNode<"AArch64ISD::SUBS", SDTBinaryArithWithFlagsOut>; 183*9880d681SAndroid Build Coastguard Workerdef AArch64and_flag : SDNode<"AArch64ISD::ANDS", SDTBinaryArithWithFlagsOut, 184*9880d681SAndroid Build Coastguard Worker [SDNPCommutative]>; 185*9880d681SAndroid Build Coastguard Workerdef AArch64adc_flag : SDNode<"AArch64ISD::ADCS", SDTBinaryArithWithFlagsInOut>; 186*9880d681SAndroid Build Coastguard Workerdef AArch64sbc_flag : SDNode<"AArch64ISD::SBCS", SDTBinaryArithWithFlagsInOut>; 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerdef AArch64ccmp : SDNode<"AArch64ISD::CCMP", SDT_AArch64CCMP>; 189*9880d681SAndroid Build Coastguard Workerdef AArch64ccmn : SDNode<"AArch64ISD::CCMN", SDT_AArch64CCMP>; 190*9880d681SAndroid Build Coastguard Workerdef AArch64fccmp : SDNode<"AArch64ISD::FCCMP", SDT_AArch64FCCMP>; 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdef AArch64threadpointer : SDNode<"AArch64ISD::THREAD_POINTER", SDTPtrLeaf>; 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdef AArch64fcmp : SDNode<"AArch64ISD::FCMP", SDT_AArch64FCmp>; 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdef AArch64dup : SDNode<"AArch64ISD::DUP", SDT_AArch64Dup>; 197*9880d681SAndroid Build Coastguard Workerdef AArch64duplane8 : SDNode<"AArch64ISD::DUPLANE8", SDT_AArch64DupLane>; 198*9880d681SAndroid Build Coastguard Workerdef AArch64duplane16 : SDNode<"AArch64ISD::DUPLANE16", SDT_AArch64DupLane>; 199*9880d681SAndroid Build Coastguard Workerdef AArch64duplane32 : SDNode<"AArch64ISD::DUPLANE32", SDT_AArch64DupLane>; 200*9880d681SAndroid Build Coastguard Workerdef AArch64duplane64 : SDNode<"AArch64ISD::DUPLANE64", SDT_AArch64DupLane>; 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Workerdef AArch64zip1 : SDNode<"AArch64ISD::ZIP1", SDT_AArch64Zip>; 203*9880d681SAndroid Build Coastguard Workerdef AArch64zip2 : SDNode<"AArch64ISD::ZIP2", SDT_AArch64Zip>; 204*9880d681SAndroid Build Coastguard Workerdef AArch64uzp1 : SDNode<"AArch64ISD::UZP1", SDT_AArch64Zip>; 205*9880d681SAndroid Build Coastguard Workerdef AArch64uzp2 : SDNode<"AArch64ISD::UZP2", SDT_AArch64Zip>; 206*9880d681SAndroid Build Coastguard Workerdef AArch64trn1 : SDNode<"AArch64ISD::TRN1", SDT_AArch64Zip>; 207*9880d681SAndroid Build Coastguard Workerdef AArch64trn2 : SDNode<"AArch64ISD::TRN2", SDT_AArch64Zip>; 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdef AArch64movi_edit : SDNode<"AArch64ISD::MOVIedit", SDT_AArch64MOVIedit>; 210*9880d681SAndroid Build Coastguard Workerdef AArch64movi_shift : SDNode<"AArch64ISD::MOVIshift", SDT_AArch64MOVIshift>; 211*9880d681SAndroid Build Coastguard Workerdef AArch64movi_msl : SDNode<"AArch64ISD::MOVImsl", SDT_AArch64MOVIshift>; 212*9880d681SAndroid Build Coastguard Workerdef AArch64mvni_shift : SDNode<"AArch64ISD::MVNIshift", SDT_AArch64MOVIshift>; 213*9880d681SAndroid Build Coastguard Workerdef AArch64mvni_msl : SDNode<"AArch64ISD::MVNImsl", SDT_AArch64MOVIshift>; 214*9880d681SAndroid Build Coastguard Workerdef AArch64movi : SDNode<"AArch64ISD::MOVI", SDT_AArch64MOVIedit>; 215*9880d681SAndroid Build Coastguard Workerdef AArch64fmov : SDNode<"AArch64ISD::FMOV", SDT_AArch64MOVIedit>; 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerdef AArch64rev16 : SDNode<"AArch64ISD::REV16", SDT_AArch64UnaryVec>; 218*9880d681SAndroid Build Coastguard Workerdef AArch64rev32 : SDNode<"AArch64ISD::REV32", SDT_AArch64UnaryVec>; 219*9880d681SAndroid Build Coastguard Workerdef AArch64rev64 : SDNode<"AArch64ISD::REV64", SDT_AArch64UnaryVec>; 220*9880d681SAndroid Build Coastguard Workerdef AArch64ext : SDNode<"AArch64ISD::EXT", SDT_AArch64ExtVec>; 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdef AArch64vashr : SDNode<"AArch64ISD::VASHR", SDT_AArch64vshift>; 223*9880d681SAndroid Build Coastguard Workerdef AArch64vlshr : SDNode<"AArch64ISD::VLSHR", SDT_AArch64vshift>; 224*9880d681SAndroid Build Coastguard Workerdef AArch64vshl : SDNode<"AArch64ISD::VSHL", SDT_AArch64vshift>; 225*9880d681SAndroid Build Coastguard Workerdef AArch64sqshli : SDNode<"AArch64ISD::SQSHL_I", SDT_AArch64vshift>; 226*9880d681SAndroid Build Coastguard Workerdef AArch64uqshli : SDNode<"AArch64ISD::UQSHL_I", SDT_AArch64vshift>; 227*9880d681SAndroid Build Coastguard Workerdef AArch64sqshlui : SDNode<"AArch64ISD::SQSHLU_I", SDT_AArch64vshift>; 228*9880d681SAndroid Build Coastguard Workerdef AArch64srshri : SDNode<"AArch64ISD::SRSHR_I", SDT_AArch64vshift>; 229*9880d681SAndroid Build Coastguard Workerdef AArch64urshri : SDNode<"AArch64ISD::URSHR_I", SDT_AArch64vshift>; 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdef AArch64not: SDNode<"AArch64ISD::NOT", SDT_AArch64unvec>; 232*9880d681SAndroid Build Coastguard Workerdef AArch64bit: SDNode<"AArch64ISD::BIT", SDT_AArch64trivec>; 233*9880d681SAndroid Build Coastguard Workerdef AArch64bsl: SDNode<"AArch64ISD::BSL", SDT_AArch64trivec>; 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Workerdef AArch64cmeq: SDNode<"AArch64ISD::CMEQ", SDT_AArch64binvec>; 236*9880d681SAndroid Build Coastguard Workerdef AArch64cmge: SDNode<"AArch64ISD::CMGE", SDT_AArch64binvec>; 237*9880d681SAndroid Build Coastguard Workerdef AArch64cmgt: SDNode<"AArch64ISD::CMGT", SDT_AArch64binvec>; 238*9880d681SAndroid Build Coastguard Workerdef AArch64cmhi: SDNode<"AArch64ISD::CMHI", SDT_AArch64binvec>; 239*9880d681SAndroid Build Coastguard Workerdef AArch64cmhs: SDNode<"AArch64ISD::CMHS", SDT_AArch64binvec>; 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Workerdef AArch64fcmeq: SDNode<"AArch64ISD::FCMEQ", SDT_AArch64fcmp>; 242*9880d681SAndroid Build Coastguard Workerdef AArch64fcmge: SDNode<"AArch64ISD::FCMGE", SDT_AArch64fcmp>; 243*9880d681SAndroid Build Coastguard Workerdef AArch64fcmgt: SDNode<"AArch64ISD::FCMGT", SDT_AArch64fcmp>; 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdef AArch64cmeqz: SDNode<"AArch64ISD::CMEQz", SDT_AArch64unvec>; 246*9880d681SAndroid Build Coastguard Workerdef AArch64cmgez: SDNode<"AArch64ISD::CMGEz", SDT_AArch64unvec>; 247*9880d681SAndroid Build Coastguard Workerdef AArch64cmgtz: SDNode<"AArch64ISD::CMGTz", SDT_AArch64unvec>; 248*9880d681SAndroid Build Coastguard Workerdef AArch64cmlez: SDNode<"AArch64ISD::CMLEz", SDT_AArch64unvec>; 249*9880d681SAndroid Build Coastguard Workerdef AArch64cmltz: SDNode<"AArch64ISD::CMLTz", SDT_AArch64unvec>; 250*9880d681SAndroid Build Coastguard Workerdef AArch64cmtst : PatFrag<(ops node:$LHS, node:$RHS), 251*9880d681SAndroid Build Coastguard Worker (AArch64not (AArch64cmeqz (and node:$LHS, node:$RHS)))>; 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdef AArch64fcmeqz: SDNode<"AArch64ISD::FCMEQz", SDT_AArch64fcmpz>; 254*9880d681SAndroid Build Coastguard Workerdef AArch64fcmgez: SDNode<"AArch64ISD::FCMGEz", SDT_AArch64fcmpz>; 255*9880d681SAndroid Build Coastguard Workerdef AArch64fcmgtz: SDNode<"AArch64ISD::FCMGTz", SDT_AArch64fcmpz>; 256*9880d681SAndroid Build Coastguard Workerdef AArch64fcmlez: SDNode<"AArch64ISD::FCMLEz", SDT_AArch64fcmpz>; 257*9880d681SAndroid Build Coastguard Workerdef AArch64fcmltz: SDNode<"AArch64ISD::FCMLTz", SDT_AArch64fcmpz>; 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdef AArch64bici: SDNode<"AArch64ISD::BICi", SDT_AArch64vecimm>; 260*9880d681SAndroid Build Coastguard Workerdef AArch64orri: SDNode<"AArch64ISD::ORRi", SDT_AArch64vecimm>; 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerdef AArch64neg : SDNode<"AArch64ISD::NEG", SDT_AArch64unvec>; 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workerdef AArch64tcret: SDNode<"AArch64ISD::TC_RETURN", SDT_AArch64TCRET, 265*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Workerdef AArch64Prefetch : SDNode<"AArch64ISD::PREFETCH", SDT_AArch64PREFETCH, 268*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPSideEffect]>; 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Workerdef AArch64sitof: SDNode<"AArch64ISD::SITOF", SDT_AArch64ITOF>; 271*9880d681SAndroid Build Coastguard Workerdef AArch64uitof: SDNode<"AArch64ISD::UITOF", SDT_AArch64ITOF>; 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerdef AArch64tlsdesc_callseq : SDNode<"AArch64ISD::TLSDESC_CALLSEQ", 274*9880d681SAndroid Build Coastguard Worker SDT_AArch64TLSDescCallSeq, 275*9880d681SAndroid Build Coastguard Worker [SDNPInGlue, SDNPOutGlue, SDNPHasChain, 276*9880d681SAndroid Build Coastguard Worker SDNPVariadic]>; 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Workerdef AArch64WrapperLarge : SDNode<"AArch64ISD::WrapperLarge", 280*9880d681SAndroid Build Coastguard Worker SDT_AArch64WrapperLarge>; 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Workerdef AArch64NvCast : SDNode<"AArch64ISD::NVCAST", SDTUnaryOp>; 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64mull : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisInt<1>, 285*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1, 2>]>; 286*9880d681SAndroid Build Coastguard Workerdef AArch64smull : SDNode<"AArch64ISD::SMULL", SDT_AArch64mull>; 287*9880d681SAndroid Build Coastguard Workerdef AArch64umull : SDNode<"AArch64ISD::UMULL", SDT_AArch64mull>; 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdef AArch64frecpe : SDNode<"AArch64ISD::FRECPE", SDTFPUnaryOp>; 290*9880d681SAndroid Build Coastguard Workerdef AArch64frsqrte : SDNode<"AArch64ISD::FRSQRTE", SDTFPUnaryOp>; 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Workerdef AArch64saddv : SDNode<"AArch64ISD::SADDV", SDT_AArch64UnaryVec>; 293*9880d681SAndroid Build Coastguard Workerdef AArch64uaddv : SDNode<"AArch64ISD::UADDV", SDT_AArch64UnaryVec>; 294*9880d681SAndroid Build Coastguard Workerdef AArch64sminv : SDNode<"AArch64ISD::SMINV", SDT_AArch64UnaryVec>; 295*9880d681SAndroid Build Coastguard Workerdef AArch64uminv : SDNode<"AArch64ISD::UMINV", SDT_AArch64UnaryVec>; 296*9880d681SAndroid Build Coastguard Workerdef AArch64smaxv : SDNode<"AArch64ISD::SMAXV", SDT_AArch64UnaryVec>; 297*9880d681SAndroid Build Coastguard Workerdef AArch64umaxv : SDNode<"AArch64ISD::UMAXV", SDT_AArch64UnaryVec>; 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Worker// AArch64 Instruction Predicate Definitions. 304*9880d681SAndroid Build Coastguard Workerdef IsDarwin : Predicate<"Subtarget->isTargetDarwin()">; 305*9880d681SAndroid Build Coastguard Workerdef IsNotDarwin: Predicate<"!Subtarget->isTargetDarwin()">; 306*9880d681SAndroid Build Coastguard Workerdef ForCodeSize : Predicate<"ForCodeSize">; 307*9880d681SAndroid Build Coastguard Workerdef NotForCodeSize : Predicate<"!ForCodeSize">; 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Workerinclude "AArch64InstrFormats.td" 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 314*9880d681SAndroid Build Coastguard Worker// Miscellaneous instructions. 315*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Workerlet Defs = [SP], Uses = [SP], hasSideEffects = 1, isCodeGenOnly = 1 in { 318*9880d681SAndroid Build Coastguard Worker// We set Sched to empty list because we expect these instructions to simply get 319*9880d681SAndroid Build Coastguard Worker// removed in most cases. 320*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKDOWN : Pseudo<(outs), (ins i32imm:$amt), 321*9880d681SAndroid Build Coastguard Worker [(AArch64callseq_start timm:$amt)]>, Sched<[]>; 322*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKUP : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), 323*9880d681SAndroid Build Coastguard Worker [(AArch64callseq_end timm:$amt1, timm:$amt2)]>, 324*9880d681SAndroid Build Coastguard Worker Sched<[]>; 325*9880d681SAndroid Build Coastguard Worker} // Defs = [SP], Uses = [SP], hasSideEffects = 1, isCodeGenOnly = 1 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isCodeGenOnly = 1 in { 328*9880d681SAndroid Build Coastguard Worker// FIXME: The following pseudo instructions are only needed because remat 329*9880d681SAndroid Build Coastguard Worker// cannot handle multiple instructions. When that changes, they can be 330*9880d681SAndroid Build Coastguard Worker// removed, along with the AArch64Wrapper node. 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in 333*9880d681SAndroid Build Coastguard Workerdef LOADgot : Pseudo<(outs GPR64:$dst), (ins i64imm:$addr), 334*9880d681SAndroid Build Coastguard Worker [(set GPR64:$dst, (AArch64LOADgot tglobaladdr:$addr))]>, 335*9880d681SAndroid Build Coastguard Worker Sched<[WriteLDAdr]>; 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Worker// The MOVaddr instruction should match only when the add is not folded 338*9880d681SAndroid Build Coastguard Worker// into a load or store address. 339*9880d681SAndroid Build Coastguard Workerdef MOVaddr 340*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low), 341*9880d681SAndroid Build Coastguard Worker [(set GPR64:$dst, (AArch64addlow (AArch64adrp tglobaladdr:$hi), 342*9880d681SAndroid Build Coastguard Worker tglobaladdr:$low))]>, 343*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdrAdr]>; 344*9880d681SAndroid Build Coastguard Workerdef MOVaddrJT 345*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low), 346*9880d681SAndroid Build Coastguard Worker [(set GPR64:$dst, (AArch64addlow (AArch64adrp tjumptable:$hi), 347*9880d681SAndroid Build Coastguard Worker tjumptable:$low))]>, 348*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdrAdr]>; 349*9880d681SAndroid Build Coastguard Workerdef MOVaddrCP 350*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low), 351*9880d681SAndroid Build Coastguard Worker [(set GPR64:$dst, (AArch64addlow (AArch64adrp tconstpool:$hi), 352*9880d681SAndroid Build Coastguard Worker tconstpool:$low))]>, 353*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdrAdr]>; 354*9880d681SAndroid Build Coastguard Workerdef MOVaddrBA 355*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low), 356*9880d681SAndroid Build Coastguard Worker [(set GPR64:$dst, (AArch64addlow (AArch64adrp tblockaddress:$hi), 357*9880d681SAndroid Build Coastguard Worker tblockaddress:$low))]>, 358*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdrAdr]>; 359*9880d681SAndroid Build Coastguard Workerdef MOVaddrTLS 360*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low), 361*9880d681SAndroid Build Coastguard Worker [(set GPR64:$dst, (AArch64addlow (AArch64adrp tglobaltlsaddr:$hi), 362*9880d681SAndroid Build Coastguard Worker tglobaltlsaddr:$low))]>, 363*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdrAdr]>; 364*9880d681SAndroid Build Coastguard Workerdef MOVaddrEXT 365*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low), 366*9880d681SAndroid Build Coastguard Worker [(set GPR64:$dst, (AArch64addlow (AArch64adrp texternalsym:$hi), 367*9880d681SAndroid Build Coastguard Worker texternalsym:$low))]>, 368*9880d681SAndroid Build Coastguard Worker Sched<[WriteAdrAdr]>; 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker} // isReMaterializable, isCodeGenOnly 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64LOADgot tglobaltlsaddr:$addr), 373*9880d681SAndroid Build Coastguard Worker (LOADgot tglobaltlsaddr:$addr)>; 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64LOADgot texternalsym:$addr), 376*9880d681SAndroid Build Coastguard Worker (LOADgot texternalsym:$addr)>; 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64LOADgot tconstpool:$addr), 379*9880d681SAndroid Build Coastguard Worker (LOADgot tconstpool:$addr)>; 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 382*9880d681SAndroid Build Coastguard Worker// System instructions. 383*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerdef HINT : HintI<"hint">; 386*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"nop", (HINT 0b000)>; 387*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"yield",(HINT 0b001)>; 388*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"wfe", (HINT 0b010)>; 389*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"wfi", (HINT 0b011)>; 390*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sev", (HINT 0b100)>; 391*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sevl", (HINT 0b101)>; 392*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"esb", (HINT 0b10000)>, Requires<[HasRAS]>; 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Worker// v8.2a Statistical Profiling extension 395*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"psb $op", (HINT psbhint_op:$op)>, Requires<[HasSPE]>; 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Worker// As far as LLVM is concerned this writes to the system's exclusive monitors. 398*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 1 in 399*9880d681SAndroid Build Coastguard Workerdef CLREX : CRmSystemI<imm0_15, 0b010, "clrex">; 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Worker// NOTE: ideally, this would have mayStore = 0, mayLoad = 0, but we cannot 402*9880d681SAndroid Build Coastguard Worker// model patterns with sufficiently fine granularity. 403*9880d681SAndroid Build Coastguard Workerlet mayLoad = ?, mayStore = ? in { 404*9880d681SAndroid Build Coastguard Workerdef DMB : CRmSystemI<barrier_op, 0b101, "dmb", 405*9880d681SAndroid Build Coastguard Worker [(int_aarch64_dmb (i32 imm32_0_15:$CRm))]>; 406*9880d681SAndroid Build Coastguard Worker 407*9880d681SAndroid Build Coastguard Workerdef DSB : CRmSystemI<barrier_op, 0b100, "dsb", 408*9880d681SAndroid Build Coastguard Worker [(int_aarch64_dsb (i32 imm32_0_15:$CRm))]>; 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Workerdef ISB : CRmSystemI<barrier_op, 0b110, "isb", 411*9880d681SAndroid Build Coastguard Worker [(int_aarch64_isb (i32 imm32_0_15:$CRm))]>; 412*9880d681SAndroid Build Coastguard Worker} 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"clrex", (CLREX 0xf)>; 415*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"isb", (ISB 0xf)>; 416*9880d681SAndroid Build Coastguard Worker 417*9880d681SAndroid Build Coastguard Workerdef MRS : MRSI; 418*9880d681SAndroid Build Coastguard Workerdef MSR : MSRI; 419*9880d681SAndroid Build Coastguard Workerdef MSRpstateImm1 : MSRpstateImm0_1; 420*9880d681SAndroid Build Coastguard Workerdef MSRpstateImm4 : MSRpstateImm0_15; 421*9880d681SAndroid Build Coastguard Worker 422*9880d681SAndroid Build Coastguard Worker// The thread pointer (on Linux, at least, where this has been implemented) is 423*9880d681SAndroid Build Coastguard Worker// TPIDR_EL0. 424*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64threadpointer), (MRS 0xde82)>; 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Worker// The cycle counter PMC register is PMCCNTR_EL0. 427*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasPerfMon] in 428*9880d681SAndroid Build Coastguard Workerdef : Pat<(readcyclecounter), (MRS 0xdce8)>; 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Worker// Generic system instructions 431*9880d681SAndroid Build Coastguard Workerdef SYSxt : SystemXtI<0, "sys">; 432*9880d681SAndroid Build Coastguard Workerdef SYSLxt : SystemLXtI<1, "sysl">; 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sys $op1, $Cn, $Cm, $op2", 435*9880d681SAndroid Build Coastguard Worker (SYSxt imm0_7:$op1, sys_cr_op:$Cn, 436*9880d681SAndroid Build Coastguard Worker sys_cr_op:$Cm, imm0_7:$op2, XZR)>; 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 439*9880d681SAndroid Build Coastguard Worker// Move immediate instructions. 440*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 441*9880d681SAndroid Build Coastguard Worker 442*9880d681SAndroid Build Coastguard Workerdefm MOVK : InsertImmediate<0b11, "movk">; 443*9880d681SAndroid Build Coastguard Workerdefm MOVN : MoveImmediate<0b00, "movn">; 444*9880d681SAndroid Build Coastguard Worker 445*9880d681SAndroid Build Coastguard Workerlet PostEncoderMethod = "fixMOVZ" in 446*9880d681SAndroid Build Coastguard Workerdefm MOVZ : MoveImmediate<0b10, "movz">; 447*9880d681SAndroid Build Coastguard Worker 448*9880d681SAndroid Build Coastguard Worker// First group of aliases covers an implicit "lsl #0". 449*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $dst, $imm", (MOVKWi GPR32:$dst, imm0_65535:$imm, 0)>; 450*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $dst, $imm", (MOVKXi GPR64:$dst, imm0_65535:$imm, 0)>; 451*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $dst, $imm", (MOVNWi GPR32:$dst, imm0_65535:$imm, 0)>; 452*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $dst, $imm", (MOVNXi GPR64:$dst, imm0_65535:$imm, 0)>; 453*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $dst, $imm", (MOVZWi GPR32:$dst, imm0_65535:$imm, 0)>; 454*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $dst, $imm", (MOVZXi GPR64:$dst, imm0_65535:$imm, 0)>; 455*9880d681SAndroid Build Coastguard Worker 456*9880d681SAndroid Build Coastguard Worker// Next, we have various ELF relocations with the ":XYZ_g0:sym" syntax. 457*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g3:$sym, 48)>; 458*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g2:$sym, 32)>; 459*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g1:$sym, 16)>; 460*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g0:$sym, 0)>; 461*9880d681SAndroid Build Coastguard Worker 462*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g3:$sym, 48)>; 463*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g2:$sym, 32)>; 464*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g1:$sym, 16)>; 465*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g0:$sym, 0)>; 466*9880d681SAndroid Build Coastguard Worker 467*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g3:$sym, 48)>; 468*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g2:$sym, 32)>; 469*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g1:$sym, 16)>; 470*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g0:$sym, 0)>; 471*9880d681SAndroid Build Coastguard Worker 472*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movz_symbol_g1:$sym, 16)>; 473*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movz_symbol_g0:$sym, 0)>; 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNWi GPR32:$Rd, movz_symbol_g1:$sym, 16)>; 476*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNWi GPR32:$Rd, movz_symbol_g0:$sym, 0)>; 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKWi GPR32:$Rd, movk_symbol_g1:$sym, 16)>; 479*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKWi GPR32:$Rd, movk_symbol_g0:$sym, 0)>; 480*9880d681SAndroid Build Coastguard Worker 481*9880d681SAndroid Build Coastguard Worker// Final group of aliases covers true "mov $Rd, $imm" cases. 482*9880d681SAndroid Build Coastguard Workermulticlass movw_mov_alias<string basename,Instruction INST, RegisterClass GPR, 483*9880d681SAndroid Build Coastguard Worker int width, int shift> { 484*9880d681SAndroid Build Coastguard Worker def _asmoperand : AsmOperandClass { 485*9880d681SAndroid Build Coastguard Worker let Name = basename # width # "_lsl" # shift # "MovAlias"; 486*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "is" # basename # "MovAlias<" # width # ", " 487*9880d681SAndroid Build Coastguard Worker # shift # ">"; 488*9880d681SAndroid Build Coastguard Worker let RenderMethod = "add" # basename # "MovAliasOperands<" # shift # ">"; 489*9880d681SAndroid Build Coastguard Worker } 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Worker def _movimm : Operand<i32> { 492*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_asmoperand"); 493*9880d681SAndroid Build Coastguard Worker } 494*9880d681SAndroid Build Coastguard Worker 495*9880d681SAndroid Build Coastguard Worker def : InstAlias<"mov $Rd, $imm", 496*9880d681SAndroid Build Coastguard Worker (INST GPR:$Rd, !cast<Operand>(NAME # "_movimm"):$imm, shift)>; 497*9880d681SAndroid Build Coastguard Worker} 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZWi, GPR32, 32, 0>; 500*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZWi, GPR32, 32, 16>; 501*9880d681SAndroid Build Coastguard Worker 502*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZXi, GPR64, 64, 0>; 503*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZXi, GPR64, 64, 16>; 504*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZXi, GPR64, 64, 32>; 505*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZXi, GPR64, 64, 48>; 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNWi, GPR32, 32, 0>; 508*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNWi, GPR32, 32, 16>; 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNXi, GPR64, 64, 0>; 511*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNXi, GPR64, 64, 16>; 512*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNXi, GPR64, 64, 32>; 513*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNXi, GPR64, 64, 48>; 514*9880d681SAndroid Build Coastguard Worker 515*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isCodeGenOnly = 1, isMoveImm = 1, 516*9880d681SAndroid Build Coastguard Worker isAsCheapAsAMove = 1 in { 517*9880d681SAndroid Build Coastguard Worker// FIXME: The following pseudo instructions are only needed because remat 518*9880d681SAndroid Build Coastguard Worker// cannot handle multiple instructions. When that changes, we can select 519*9880d681SAndroid Build Coastguard Worker// directly to the real instructions and get rid of these pseudos. 520*9880d681SAndroid Build Coastguard Worker 521*9880d681SAndroid Build Coastguard Workerdef MOVi32imm 522*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GPR32:$dst), (ins i32imm:$src), 523*9880d681SAndroid Build Coastguard Worker [(set GPR32:$dst, imm:$src)]>, 524*9880d681SAndroid Build Coastguard Worker Sched<[WriteImm]>; 525*9880d681SAndroid Build Coastguard Workerdef MOVi64imm 526*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs GPR64:$dst), (ins i64imm:$src), 527*9880d681SAndroid Build Coastguard Worker [(set GPR64:$dst, imm:$src)]>, 528*9880d681SAndroid Build Coastguard Worker Sched<[WriteImm]>; 529*9880d681SAndroid Build Coastguard Worker} // isReMaterializable, isCodeGenOnly 530*9880d681SAndroid Build Coastguard Worker 531*9880d681SAndroid Build Coastguard Worker// If possible, we want to use MOVi32imm even for 64-bit moves. This gives the 532*9880d681SAndroid Build Coastguard Worker// eventual expansion code fewer bits to worry about getting right. Marshalling 533*9880d681SAndroid Build Coastguard Worker// the types is a little tricky though: 534*9880d681SAndroid Build Coastguard Workerdef i64imm_32bit : ImmLeaf<i64, [{ 535*9880d681SAndroid Build Coastguard Worker return (Imm & 0xffffffffULL) == static_cast<uint64_t>(Imm); 536*9880d681SAndroid Build Coastguard Worker}]>; 537*9880d681SAndroid Build Coastguard Worker 538*9880d681SAndroid Build Coastguard Workerdef s64imm_32bit : ImmLeaf<i64, [{ 539*9880d681SAndroid Build Coastguard Worker int64_t Imm64 = static_cast<int64_t>(Imm); 540*9880d681SAndroid Build Coastguard Worker return Imm64 >= std::numeric_limits<int32_t>::min() && 541*9880d681SAndroid Build Coastguard Worker Imm64 <= std::numeric_limits<int32_t>::max(); 542*9880d681SAndroid Build Coastguard Worker}]>; 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Workerdef trunc_imm : SDNodeXForm<imm, [{ 545*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(N->getZExtValue(), SDLoc(N), MVT::i32); 546*9880d681SAndroid Build Coastguard Worker}]>; 547*9880d681SAndroid Build Coastguard Worker 548*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 i64imm_32bit:$src), 549*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (MOVi32imm (trunc_imm imm:$src)), sub_32)>; 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Worker// Materialize FP constants via MOVi32imm/MOVi64imm (MachO large code model). 552*9880d681SAndroid Build Coastguard Workerdef bitcast_fpimm_to_i32 : SDNodeXForm<fpimm, [{ 553*9880d681SAndroid Build Coastguard Workerreturn CurDAG->getTargetConstant( 554*9880d681SAndroid Build Coastguard Worker N->getValueAPF().bitcastToAPInt().getZExtValue(), SDLoc(N), MVT::i32); 555*9880d681SAndroid Build Coastguard Worker}]>; 556*9880d681SAndroid Build Coastguard Worker 557*9880d681SAndroid Build Coastguard Workerdef bitcast_fpimm_to_i64 : SDNodeXForm<fpimm, [{ 558*9880d681SAndroid Build Coastguard Workerreturn CurDAG->getTargetConstant( 559*9880d681SAndroid Build Coastguard Worker N->getValueAPF().bitcastToAPInt().getZExtValue(), SDLoc(N), MVT::i64); 560*9880d681SAndroid Build Coastguard Worker}]>; 561*9880d681SAndroid Build Coastguard Worker 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 fpimm:$in), 564*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (MOVi32imm (bitcast_fpimm_to_i32 f32:$in)), FPR32)>; 565*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 fpimm:$in), 566*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (MOVi64imm (bitcast_fpimm_to_i64 f64:$in)), FPR64)>; 567*9880d681SAndroid Build Coastguard Worker 568*9880d681SAndroid Build Coastguard Worker 569*9880d681SAndroid Build Coastguard Worker// Deal with the various forms of (ELF) large addressing with MOVZ/MOVK 570*9880d681SAndroid Build Coastguard Worker// sequences. 571*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64WrapperLarge tglobaladdr:$g3, tglobaladdr:$g2, 572*9880d681SAndroid Build Coastguard Worker tglobaladdr:$g1, tglobaladdr:$g0), 573*9880d681SAndroid Build Coastguard Worker (MOVKXi (MOVKXi (MOVKXi (MOVZXi tglobaladdr:$g3, 48), 574*9880d681SAndroid Build Coastguard Worker tglobaladdr:$g2, 32), 575*9880d681SAndroid Build Coastguard Worker tglobaladdr:$g1, 16), 576*9880d681SAndroid Build Coastguard Worker tglobaladdr:$g0, 0)>; 577*9880d681SAndroid Build Coastguard Worker 578*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64WrapperLarge tblockaddress:$g3, tblockaddress:$g2, 579*9880d681SAndroid Build Coastguard Worker tblockaddress:$g1, tblockaddress:$g0), 580*9880d681SAndroid Build Coastguard Worker (MOVKXi (MOVKXi (MOVKXi (MOVZXi tblockaddress:$g3, 48), 581*9880d681SAndroid Build Coastguard Worker tblockaddress:$g2, 32), 582*9880d681SAndroid Build Coastguard Worker tblockaddress:$g1, 16), 583*9880d681SAndroid Build Coastguard Worker tblockaddress:$g0, 0)>; 584*9880d681SAndroid Build Coastguard Worker 585*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64WrapperLarge tconstpool:$g3, tconstpool:$g2, 586*9880d681SAndroid Build Coastguard Worker tconstpool:$g1, tconstpool:$g0), 587*9880d681SAndroid Build Coastguard Worker (MOVKXi (MOVKXi (MOVKXi (MOVZXi tconstpool:$g3, 48), 588*9880d681SAndroid Build Coastguard Worker tconstpool:$g2, 32), 589*9880d681SAndroid Build Coastguard Worker tconstpool:$g1, 16), 590*9880d681SAndroid Build Coastguard Worker tconstpool:$g0, 0)>; 591*9880d681SAndroid Build Coastguard Worker 592*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64WrapperLarge tjumptable:$g3, tjumptable:$g2, 593*9880d681SAndroid Build Coastguard Worker tjumptable:$g1, tjumptable:$g0), 594*9880d681SAndroid Build Coastguard Worker (MOVKXi (MOVKXi (MOVKXi (MOVZXi tjumptable:$g3, 48), 595*9880d681SAndroid Build Coastguard Worker tjumptable:$g2, 32), 596*9880d681SAndroid Build Coastguard Worker tjumptable:$g1, 16), 597*9880d681SAndroid Build Coastguard Worker tjumptable:$g0, 0)>; 598*9880d681SAndroid Build Coastguard Worker 599*9880d681SAndroid Build Coastguard Worker 600*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 601*9880d681SAndroid Build Coastguard Worker// Arithmetic instructions. 602*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 603*9880d681SAndroid Build Coastguard Worker 604*9880d681SAndroid Build Coastguard Worker// Add/subtract with carry. 605*9880d681SAndroid Build Coastguard Workerdefm ADC : AddSubCarry<0, "adc", "adcs", AArch64adc, AArch64adc_flag>; 606*9880d681SAndroid Build Coastguard Workerdefm SBC : AddSubCarry<1, "sbc", "sbcs", AArch64sbc, AArch64sbc_flag>; 607*9880d681SAndroid Build Coastguard Worker 608*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ngc $dst, $src", (SBCWr GPR32:$dst, WZR, GPR32:$src)>; 609*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ngc $dst, $src", (SBCXr GPR64:$dst, XZR, GPR64:$src)>; 610*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ngcs $dst, $src", (SBCSWr GPR32:$dst, WZR, GPR32:$src)>; 611*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ngcs $dst, $src", (SBCSXr GPR64:$dst, XZR, GPR64:$src)>; 612*9880d681SAndroid Build Coastguard Worker 613*9880d681SAndroid Build Coastguard Worker// Add/subtract 614*9880d681SAndroid Build Coastguard Workerdefm ADD : AddSub<0, "add", "sub", add>; 615*9880d681SAndroid Build Coastguard Workerdefm SUB : AddSub<1, "sub", "add">; 616*9880d681SAndroid Build Coastguard Worker 617*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src", 618*9880d681SAndroid Build Coastguard Worker (ADDWri GPR32sponly:$dst, GPR32sp:$src, 0, 0)>; 619*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src", 620*9880d681SAndroid Build Coastguard Worker (ADDWri GPR32sp:$dst, GPR32sponly:$src, 0, 0)>; 621*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src", 622*9880d681SAndroid Build Coastguard Worker (ADDXri GPR64sponly:$dst, GPR64sp:$src, 0, 0)>; 623*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src", 624*9880d681SAndroid Build Coastguard Worker (ADDXri GPR64sp:$dst, GPR64sponly:$src, 0, 0)>; 625*9880d681SAndroid Build Coastguard Worker 626*9880d681SAndroid Build Coastguard Workerdefm ADDS : AddSubS<0, "adds", AArch64add_flag, "cmn", "subs", "cmp">; 627*9880d681SAndroid Build Coastguard Workerdefm SUBS : AddSubS<1, "subs", AArch64sub_flag, "cmp", "adds", "cmn">; 628*9880d681SAndroid Build Coastguard Worker 629*9880d681SAndroid Build Coastguard Worker// Use SUBS instead of SUB to enable CSE between SUBS and SUB. 630*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32sp:$Rn, addsub_shifted_imm32:$imm), 631*9880d681SAndroid Build Coastguard Worker (SUBSWri GPR32sp:$Rn, addsub_shifted_imm32:$imm)>; 632*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64sp:$Rn, addsub_shifted_imm64:$imm), 633*9880d681SAndroid Build Coastguard Worker (SUBSXri GPR64sp:$Rn, addsub_shifted_imm64:$imm)>; 634*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32:$Rn, GPR32:$Rm), 635*9880d681SAndroid Build Coastguard Worker (SUBSWrr GPR32:$Rn, GPR32:$Rm)>; 636*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64:$Rn, GPR64:$Rm), 637*9880d681SAndroid Build Coastguard Worker (SUBSXrr GPR64:$Rn, GPR64:$Rm)>; 638*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32:$Rn, arith_shifted_reg32:$Rm), 639*9880d681SAndroid Build Coastguard Worker (SUBSWrs GPR32:$Rn, arith_shifted_reg32:$Rm)>; 640*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64:$Rn, arith_shifted_reg64:$Rm), 641*9880d681SAndroid Build Coastguard Worker (SUBSXrs GPR64:$Rn, arith_shifted_reg64:$Rm)>; 642*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 1 in { 643*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32sp:$R2, arith_extended_reg32<i32>:$R3), 644*9880d681SAndroid Build Coastguard Worker (SUBSWrx GPR32sp:$R2, arith_extended_reg32<i32>:$R3)>; 645*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64sp:$R2, arith_extended_reg32to64<i64>:$R3), 646*9880d681SAndroid Build Coastguard Worker (SUBSXrx GPR64sp:$R2, arith_extended_reg32to64<i64>:$R3)>; 647*9880d681SAndroid Build Coastguard Worker} 648*9880d681SAndroid Build Coastguard Worker 649*9880d681SAndroid Build Coastguard Worker// Because of the immediate format for add/sub-imm instructions, the 650*9880d681SAndroid Build Coastguard Worker// expression (add x, -1) must be transformed to (SUB{W,X}ri x, 1). 651*9880d681SAndroid Build Coastguard Worker// These patterns capture that transformation. 652*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 1 in { 653*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GPR32:$Rn, neg_addsub_shifted_imm32:$imm), 654*9880d681SAndroid Build Coastguard Worker (SUBSWri GPR32:$Rn, neg_addsub_shifted_imm32:$imm)>; 655*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GPR64:$Rn, neg_addsub_shifted_imm64:$imm), 656*9880d681SAndroid Build Coastguard Worker (SUBSXri GPR64:$Rn, neg_addsub_shifted_imm64:$imm)>; 657*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32:$Rn, neg_addsub_shifted_imm32:$imm), 658*9880d681SAndroid Build Coastguard Worker (ADDWri GPR32:$Rn, neg_addsub_shifted_imm32:$imm)>; 659*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64:$Rn, neg_addsub_shifted_imm64:$imm), 660*9880d681SAndroid Build Coastguard Worker (ADDXri GPR64:$Rn, neg_addsub_shifted_imm64:$imm)>; 661*9880d681SAndroid Build Coastguard Worker} 662*9880d681SAndroid Build Coastguard Worker 663*9880d681SAndroid Build Coastguard Worker// Because of the immediate format for add/sub-imm instructions, the 664*9880d681SAndroid Build Coastguard Worker// expression (add x, -1) must be transformed to (SUB{W,X}ri x, 1). 665*9880d681SAndroid Build Coastguard Worker// These patterns capture that transformation. 666*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 1 in { 667*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64add_flag GPR32:$Rn, neg_addsub_shifted_imm32:$imm), 668*9880d681SAndroid Build Coastguard Worker (SUBSWri GPR32:$Rn, neg_addsub_shifted_imm32:$imm)>; 669*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64add_flag GPR64:$Rn, neg_addsub_shifted_imm64:$imm), 670*9880d681SAndroid Build Coastguard Worker (SUBSXri GPR64:$Rn, neg_addsub_shifted_imm64:$imm)>; 671*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64sub_flag GPR32:$Rn, neg_addsub_shifted_imm32:$imm), 672*9880d681SAndroid Build Coastguard Worker (ADDSWri GPR32:$Rn, neg_addsub_shifted_imm32:$imm)>; 673*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64sub_flag GPR64:$Rn, neg_addsub_shifted_imm64:$imm), 674*9880d681SAndroid Build Coastguard Worker (ADDSXri GPR64:$Rn, neg_addsub_shifted_imm64:$imm)>; 675*9880d681SAndroid Build Coastguard Worker} 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"neg $dst, $src", (SUBWrs GPR32:$dst, WZR, GPR32:$src, 0), 3>; 678*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"neg $dst, $src", (SUBXrs GPR64:$dst, XZR, GPR64:$src, 0), 3>; 679*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"neg $dst, $src$shift", 680*9880d681SAndroid Build Coastguard Worker (SUBWrs GPR32:$dst, WZR, GPR32:$src, arith_shift32:$shift), 2>; 681*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"neg $dst, $src$shift", 682*9880d681SAndroid Build Coastguard Worker (SUBXrs GPR64:$dst, XZR, GPR64:$src, arith_shift64:$shift), 2>; 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"negs $dst, $src", (SUBSWrs GPR32:$dst, WZR, GPR32:$src, 0), 3>; 685*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"negs $dst, $src", (SUBSXrs GPR64:$dst, XZR, GPR64:$src, 0), 3>; 686*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"negs $dst, $src$shift", 687*9880d681SAndroid Build Coastguard Worker (SUBSWrs GPR32:$dst, WZR, GPR32:$src, arith_shift32:$shift), 2>; 688*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"negs $dst, $src$shift", 689*9880d681SAndroid Build Coastguard Worker (SUBSXrs GPR64:$dst, XZR, GPR64:$src, arith_shift64:$shift), 2>; 690*9880d681SAndroid Build Coastguard Worker 691*9880d681SAndroid Build Coastguard Worker 692*9880d681SAndroid Build Coastguard Worker// Unsigned/Signed divide 693*9880d681SAndroid Build Coastguard Workerdefm UDIV : Div<0, "udiv", udiv>; 694*9880d681SAndroid Build Coastguard Workerdefm SDIV : Div<1, "sdiv", sdiv>; 695*9880d681SAndroid Build Coastguard Worker 696*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_udiv GPR32:$Rn, GPR32:$Rm), (UDIVWr $Rn, $Rm)>; 697*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_udiv GPR64:$Rn, GPR64:$Rm), (UDIVXr $Rn, $Rm)>; 698*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_sdiv GPR32:$Rn, GPR32:$Rm), (SDIVWr $Rn, $Rm)>; 699*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_sdiv GPR64:$Rn, GPR64:$Rm), (SDIVXr $Rn, $Rm)>; 700*9880d681SAndroid Build Coastguard Worker 701*9880d681SAndroid Build Coastguard Worker// Variable shift 702*9880d681SAndroid Build Coastguard Workerdefm ASRV : Shift<0b10, "asr", sra>; 703*9880d681SAndroid Build Coastguard Workerdefm LSLV : Shift<0b00, "lsl", shl>; 704*9880d681SAndroid Build Coastguard Workerdefm LSRV : Shift<0b01, "lsr", srl>; 705*9880d681SAndroid Build Coastguard Workerdefm RORV : Shift<0b11, "ror", rotr>; 706*9880d681SAndroid Build Coastguard Worker 707*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"asrv", ASRVWr, GPR32>; 708*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"asrv", ASRVXr, GPR64>; 709*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"lslv", LSLVWr, GPR32>; 710*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"lslv", LSLVXr, GPR64>; 711*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"lsrv", LSRVWr, GPR32>; 712*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"lsrv", LSRVXr, GPR64>; 713*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"rorv", RORVWr, GPR32>; 714*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"rorv", RORVXr, GPR64>; 715*9880d681SAndroid Build Coastguard Worker 716*9880d681SAndroid Build Coastguard Worker// Multiply-add 717*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 7 in { 718*9880d681SAndroid Build Coastguard Workerdefm MADD : MulAccum<0, "madd", add>; 719*9880d681SAndroid Build Coastguard Workerdefm MSUB : MulAccum<1, "msub", sub>; 720*9880d681SAndroid Build Coastguard Worker 721*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (mul GPR32:$Rn, GPR32:$Rm)), 722*9880d681SAndroid Build Coastguard Worker (MADDWrrr GPR32:$Rn, GPR32:$Rm, WZR)>; 723*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul GPR64:$Rn, GPR64:$Rm)), 724*9880d681SAndroid Build Coastguard Worker (MADDXrrr GPR64:$Rn, GPR64:$Rm, XZR)>; 725*9880d681SAndroid Build Coastguard Worker 726*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (ineg (mul GPR32:$Rn, GPR32:$Rm))), 727*9880d681SAndroid Build Coastguard Worker (MSUBWrrr GPR32:$Rn, GPR32:$Rm, WZR)>; 728*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul GPR64:$Rn, GPR64:$Rm))), 729*9880d681SAndroid Build Coastguard Worker (MSUBXrrr GPR64:$Rn, GPR64:$Rm, XZR)>; 730*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (mul (ineg GPR32:$Rn), GPR32:$Rm)), 731*9880d681SAndroid Build Coastguard Worker (MSUBWrrr GPR32:$Rn, GPR32:$Rm, WZR)>; 732*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (ineg GPR64:$Rn), GPR64:$Rm)), 733*9880d681SAndroid Build Coastguard Worker (MSUBXrrr GPR64:$Rn, GPR64:$Rm, XZR)>; 734*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 7 735*9880d681SAndroid Build Coastguard Worker 736*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 5 in { 737*9880d681SAndroid Build Coastguard Workerdef SMADDLrrr : WideMulAccum<0, 0b001, "smaddl", add, sext>; 738*9880d681SAndroid Build Coastguard Workerdef SMSUBLrrr : WideMulAccum<1, 0b001, "smsubl", sub, sext>; 739*9880d681SAndroid Build Coastguard Workerdef UMADDLrrr : WideMulAccum<0, 0b101, "umaddl", add, zext>; 740*9880d681SAndroid Build Coastguard Workerdef UMSUBLrrr : WideMulAccum<1, 0b101, "umsubl", sub, zext>; 741*9880d681SAndroid Build Coastguard Worker 742*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (sext GPR32:$Rn), (sext GPR32:$Rm))), 743*9880d681SAndroid Build Coastguard Worker (SMADDLrrr GPR32:$Rn, GPR32:$Rm, XZR)>; 744*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (zext GPR32:$Rn), (zext GPR32:$Rm))), 745*9880d681SAndroid Build Coastguard Worker (UMADDLrrr GPR32:$Rn, GPR32:$Rm, XZR)>; 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (sext GPR32:$Rn), (sext GPR32:$Rm)))), 748*9880d681SAndroid Build Coastguard Worker (SMSUBLrrr GPR32:$Rn, GPR32:$Rm, XZR)>; 749*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (zext GPR32:$Rn), (zext GPR32:$Rm)))), 750*9880d681SAndroid Build Coastguard Worker (UMSUBLrrr GPR32:$Rn, GPR32:$Rm, XZR)>; 751*9880d681SAndroid Build Coastguard Worker 752*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (sext GPR32:$Rn), (s64imm_32bit:$C))), 753*9880d681SAndroid Build Coastguard Worker (SMADDLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), XZR)>; 754*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (zext GPR32:$Rn), (i64imm_32bit:$C))), 755*9880d681SAndroid Build Coastguard Worker (UMADDLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), XZR)>; 756*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (sext_inreg GPR64:$Rn, i32), (s64imm_32bit:$C))), 757*9880d681SAndroid Build Coastguard Worker (SMADDLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)), 758*9880d681SAndroid Build Coastguard Worker (MOVi32imm (trunc_imm imm:$C)), XZR)>; 759*9880d681SAndroid Build Coastguard Worker 760*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (sext GPR32:$Rn), (s64imm_32bit:$C)))), 761*9880d681SAndroid Build Coastguard Worker (SMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), XZR)>; 762*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (zext GPR32:$Rn), (i64imm_32bit:$C)))), 763*9880d681SAndroid Build Coastguard Worker (UMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), XZR)>; 764*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (sext_inreg GPR64:$Rn, i32), (s64imm_32bit:$C)))), 765*9880d681SAndroid Build Coastguard Worker (SMSUBLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)), 766*9880d681SAndroid Build Coastguard Worker (MOVi32imm (trunc_imm imm:$C)), XZR)>; 767*9880d681SAndroid Build Coastguard Worker 768*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (add (mul (sext GPR32:$Rn), (s64imm_32bit:$C)), GPR64:$Ra)), 769*9880d681SAndroid Build Coastguard Worker (SMADDLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>; 770*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (add (mul (zext GPR32:$Rn), (i64imm_32bit:$C)), GPR64:$Ra)), 771*9880d681SAndroid Build Coastguard Worker (UMADDLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>; 772*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (add (mul (sext_inreg GPR64:$Rn, i32), (s64imm_32bit:$C)), 773*9880d681SAndroid Build Coastguard Worker GPR64:$Ra)), 774*9880d681SAndroid Build Coastguard Worker (SMADDLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)), 775*9880d681SAndroid Build Coastguard Worker (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>; 776*9880d681SAndroid Build Coastguard Worker 777*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sub GPR64:$Ra, (mul (sext GPR32:$Rn), (s64imm_32bit:$C)))), 778*9880d681SAndroid Build Coastguard Worker (SMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>; 779*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sub GPR64:$Ra, (mul (zext GPR32:$Rn), (i64imm_32bit:$C)))), 780*9880d681SAndroid Build Coastguard Worker (UMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>; 781*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sub GPR64:$Ra, (mul (sext_inreg GPR64:$Rn, i32), 782*9880d681SAndroid Build Coastguard Worker (s64imm_32bit:$C)))), 783*9880d681SAndroid Build Coastguard Worker (SMSUBLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)), 784*9880d681SAndroid Build Coastguard Worker (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>; 785*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 5 786*9880d681SAndroid Build Coastguard Worker 787*9880d681SAndroid Build Coastguard Workerdef : MulAccumWAlias<"mul", MADDWrrr>; 788*9880d681SAndroid Build Coastguard Workerdef : MulAccumXAlias<"mul", MADDXrrr>; 789*9880d681SAndroid Build Coastguard Workerdef : MulAccumWAlias<"mneg", MSUBWrrr>; 790*9880d681SAndroid Build Coastguard Workerdef : MulAccumXAlias<"mneg", MSUBXrrr>; 791*9880d681SAndroid Build Coastguard Workerdef : WideMulAccumAlias<"smull", SMADDLrrr>; 792*9880d681SAndroid Build Coastguard Workerdef : WideMulAccumAlias<"smnegl", SMSUBLrrr>; 793*9880d681SAndroid Build Coastguard Workerdef : WideMulAccumAlias<"umull", UMADDLrrr>; 794*9880d681SAndroid Build Coastguard Workerdef : WideMulAccumAlias<"umnegl", UMSUBLrrr>; 795*9880d681SAndroid Build Coastguard Worker 796*9880d681SAndroid Build Coastguard Worker// Multiply-high 797*9880d681SAndroid Build Coastguard Workerdef SMULHrr : MulHi<0b010, "smulh", mulhs>; 798*9880d681SAndroid Build Coastguard Workerdef UMULHrr : MulHi<0b110, "umulh", mulhu>; 799*9880d681SAndroid Build Coastguard Worker 800*9880d681SAndroid Build Coastguard Worker// CRC32 801*9880d681SAndroid Build Coastguard Workerdef CRC32Brr : BaseCRC32<0, 0b00, 0, GPR32, int_aarch64_crc32b, "crc32b">; 802*9880d681SAndroid Build Coastguard Workerdef CRC32Hrr : BaseCRC32<0, 0b01, 0, GPR32, int_aarch64_crc32h, "crc32h">; 803*9880d681SAndroid Build Coastguard Workerdef CRC32Wrr : BaseCRC32<0, 0b10, 0, GPR32, int_aarch64_crc32w, "crc32w">; 804*9880d681SAndroid Build Coastguard Workerdef CRC32Xrr : BaseCRC32<1, 0b11, 0, GPR64, int_aarch64_crc32x, "crc32x">; 805*9880d681SAndroid Build Coastguard Worker 806*9880d681SAndroid Build Coastguard Workerdef CRC32CBrr : BaseCRC32<0, 0b00, 1, GPR32, int_aarch64_crc32cb, "crc32cb">; 807*9880d681SAndroid Build Coastguard Workerdef CRC32CHrr : BaseCRC32<0, 0b01, 1, GPR32, int_aarch64_crc32ch, "crc32ch">; 808*9880d681SAndroid Build Coastguard Workerdef CRC32CWrr : BaseCRC32<0, 0b10, 1, GPR32, int_aarch64_crc32cw, "crc32cw">; 809*9880d681SAndroid Build Coastguard Workerdef CRC32CXrr : BaseCRC32<1, 0b11, 1, GPR64, int_aarch64_crc32cx, "crc32cx">; 810*9880d681SAndroid Build Coastguard Worker 811*9880d681SAndroid Build Coastguard Worker// v8.1 atomic CAS 812*9880d681SAndroid Build Coastguard Workerdefm CAS : CompareAndSwap<0, 0, "">; 813*9880d681SAndroid Build Coastguard Workerdefm CASA : CompareAndSwap<1, 0, "a">; 814*9880d681SAndroid Build Coastguard Workerdefm CASL : CompareAndSwap<0, 1, "l">; 815*9880d681SAndroid Build Coastguard Workerdefm CASAL : CompareAndSwap<1, 1, "al">; 816*9880d681SAndroid Build Coastguard Worker 817*9880d681SAndroid Build Coastguard Worker// v8.1 atomic CASP 818*9880d681SAndroid Build Coastguard Workerdefm CASP : CompareAndSwapPair<0, 0, "">; 819*9880d681SAndroid Build Coastguard Workerdefm CASPA : CompareAndSwapPair<1, 0, "a">; 820*9880d681SAndroid Build Coastguard Workerdefm CASPL : CompareAndSwapPair<0, 1, "l">; 821*9880d681SAndroid Build Coastguard Workerdefm CASPAL : CompareAndSwapPair<1, 1, "al">; 822*9880d681SAndroid Build Coastguard Worker 823*9880d681SAndroid Build Coastguard Worker// v8.1 atomic SWP 824*9880d681SAndroid Build Coastguard Workerdefm SWP : Swap<0, 0, "">; 825*9880d681SAndroid Build Coastguard Workerdefm SWPA : Swap<1, 0, "a">; 826*9880d681SAndroid Build Coastguard Workerdefm SWPL : Swap<0, 1, "l">; 827*9880d681SAndroid Build Coastguard Workerdefm SWPAL : Swap<1, 1, "al">; 828*9880d681SAndroid Build Coastguard Worker 829*9880d681SAndroid Build Coastguard Worker// v8.1 atomic LD<OP>(register). Performs load and then ST<OP>(register) 830*9880d681SAndroid Build Coastguard Workerdefm LDADD : LDOPregister<0b000, "add", 0, 0, "">; 831*9880d681SAndroid Build Coastguard Workerdefm LDADDA : LDOPregister<0b000, "add", 1, 0, "a">; 832*9880d681SAndroid Build Coastguard Workerdefm LDADDL : LDOPregister<0b000, "add", 0, 1, "l">; 833*9880d681SAndroid Build Coastguard Workerdefm LDADDAL : LDOPregister<0b000, "add", 1, 1, "al">; 834*9880d681SAndroid Build Coastguard Worker 835*9880d681SAndroid Build Coastguard Workerdefm LDCLR : LDOPregister<0b001, "clr", 0, 0, "">; 836*9880d681SAndroid Build Coastguard Workerdefm LDCLRA : LDOPregister<0b001, "clr", 1, 0, "a">; 837*9880d681SAndroid Build Coastguard Workerdefm LDCLRL : LDOPregister<0b001, "clr", 0, 1, "l">; 838*9880d681SAndroid Build Coastguard Workerdefm LDCLRAL : LDOPregister<0b001, "clr", 1, 1, "al">; 839*9880d681SAndroid Build Coastguard Worker 840*9880d681SAndroid Build Coastguard Workerdefm LDEOR : LDOPregister<0b010, "eor", 0, 0, "">; 841*9880d681SAndroid Build Coastguard Workerdefm LDEORA : LDOPregister<0b010, "eor", 1, 0, "a">; 842*9880d681SAndroid Build Coastguard Workerdefm LDEORL : LDOPregister<0b010, "eor", 0, 1, "l">; 843*9880d681SAndroid Build Coastguard Workerdefm LDEORAL : LDOPregister<0b010, "eor", 1, 1, "al">; 844*9880d681SAndroid Build Coastguard Worker 845*9880d681SAndroid Build Coastguard Workerdefm LDSET : LDOPregister<0b011, "set", 0, 0, "">; 846*9880d681SAndroid Build Coastguard Workerdefm LDSETA : LDOPregister<0b011, "set", 1, 0, "a">; 847*9880d681SAndroid Build Coastguard Workerdefm LDSETL : LDOPregister<0b011, "set", 0, 1, "l">; 848*9880d681SAndroid Build Coastguard Workerdefm LDSETAL : LDOPregister<0b011, "set", 1, 1, "al">; 849*9880d681SAndroid Build Coastguard Worker 850*9880d681SAndroid Build Coastguard Workerdefm LDSMAX : LDOPregister<0b100, "smax", 0, 0, "">; 851*9880d681SAndroid Build Coastguard Workerdefm LDSMAXA : LDOPregister<0b100, "smax", 1, 0, "a">; 852*9880d681SAndroid Build Coastguard Workerdefm LDSMAXL : LDOPregister<0b100, "smax", 0, 1, "l">; 853*9880d681SAndroid Build Coastguard Workerdefm LDSMAXAL : LDOPregister<0b100, "smax", 1, 1, "al">; 854*9880d681SAndroid Build Coastguard Worker 855*9880d681SAndroid Build Coastguard Workerdefm LDSMIN : LDOPregister<0b101, "smin", 0, 0, "">; 856*9880d681SAndroid Build Coastguard Workerdefm LDSMINA : LDOPregister<0b101, "smin", 1, 0, "a">; 857*9880d681SAndroid Build Coastguard Workerdefm LDSMINL : LDOPregister<0b101, "smin", 0, 1, "l">; 858*9880d681SAndroid Build Coastguard Workerdefm LDSMINAL : LDOPregister<0b101, "smin", 1, 1, "al">; 859*9880d681SAndroid Build Coastguard Worker 860*9880d681SAndroid Build Coastguard Workerdefm LDUMAX : LDOPregister<0b110, "umax", 0, 0, "">; 861*9880d681SAndroid Build Coastguard Workerdefm LDUMAXA : LDOPregister<0b110, "umax", 1, 0, "a">; 862*9880d681SAndroid Build Coastguard Workerdefm LDUMAXL : LDOPregister<0b110, "umax", 0, 1, "l">; 863*9880d681SAndroid Build Coastguard Workerdefm LDUMAXAL : LDOPregister<0b110, "umax", 1, 1, "al">; 864*9880d681SAndroid Build Coastguard Worker 865*9880d681SAndroid Build Coastguard Workerdefm LDUMIN : LDOPregister<0b111, "umin", 0, 0, "">; 866*9880d681SAndroid Build Coastguard Workerdefm LDUMINA : LDOPregister<0b111, "umin", 1, 0, "a">; 867*9880d681SAndroid Build Coastguard Workerdefm LDUMINL : LDOPregister<0b111, "umin", 0, 1, "l">; 868*9880d681SAndroid Build Coastguard Workerdefm LDUMINAL : LDOPregister<0b111, "umin", 1, 1, "al">; 869*9880d681SAndroid Build Coastguard Worker 870*9880d681SAndroid Build Coastguard Worker// v8.1 atomic ST<OP>(register) as aliases to "LD<OP>(register) when Rt=xZR" 871*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stadd","LDADD">; // STADDx 872*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stclr","LDCLR">; // STCLRx 873*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"steor","LDEOR">; // STEORx 874*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stset","LDSET">; // STSETx 875*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stsmax","LDSMAX">;// STSMAXx 876*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stsmin","LDSMIN">;// STSMINx 877*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stumax","LDUMAX">;// STUMAXx 878*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stumin","LDUMIN">;// STUMINx 879*9880d681SAndroid Build Coastguard Worker 880*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 881*9880d681SAndroid Build Coastguard Worker// Logical instructions. 882*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 883*9880d681SAndroid Build Coastguard Worker 884*9880d681SAndroid Build Coastguard Worker// (immediate) 885*9880d681SAndroid Build Coastguard Workerdefm ANDS : LogicalImmS<0b11, "ands", AArch64and_flag, "bics">; 886*9880d681SAndroid Build Coastguard Workerdefm AND : LogicalImm<0b00, "and", and, "bic">; 887*9880d681SAndroid Build Coastguard Workerdefm EOR : LogicalImm<0b10, "eor", xor, "eon">; 888*9880d681SAndroid Build Coastguard Workerdefm ORR : LogicalImm<0b01, "orr", or, "orn">; 889*9880d681SAndroid Build Coastguard Worker 890*9880d681SAndroid Build Coastguard Worker// FIXME: these aliases *are* canonical sometimes (when movz can't be 891*9880d681SAndroid Build Coastguard Worker// used). Actually, it seems to be working right now, but putting logical_immXX 892*9880d681SAndroid Build Coastguard Worker// here is a bit dodgy on the AsmParser side too. 893*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $imm", (ORRWri GPR32sp:$dst, WZR, 894*9880d681SAndroid Build Coastguard Worker logical_imm32:$imm), 0>; 895*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $imm", (ORRXri GPR64sp:$dst, XZR, 896*9880d681SAndroid Build Coastguard Worker logical_imm64:$imm), 0>; 897*9880d681SAndroid Build Coastguard Worker 898*9880d681SAndroid Build Coastguard Worker 899*9880d681SAndroid Build Coastguard Worker// (register) 900*9880d681SAndroid Build Coastguard Workerdefm ANDS : LogicalRegS<0b11, 0, "ands", AArch64and_flag>; 901*9880d681SAndroid Build Coastguard Workerdefm BICS : LogicalRegS<0b11, 1, "bics", 902*9880d681SAndroid Build Coastguard Worker BinOpFrag<(AArch64and_flag node:$LHS, (not node:$RHS))>>; 903*9880d681SAndroid Build Coastguard Workerdefm AND : LogicalReg<0b00, 0, "and", and>; 904*9880d681SAndroid Build Coastguard Workerdefm BIC : LogicalReg<0b00, 1, "bic", 905*9880d681SAndroid Build Coastguard Worker BinOpFrag<(and node:$LHS, (not node:$RHS))>>; 906*9880d681SAndroid Build Coastguard Workerdefm EON : LogicalReg<0b10, 1, "eon", 907*9880d681SAndroid Build Coastguard Worker BinOpFrag<(not (xor node:$LHS, node:$RHS))>>; 908*9880d681SAndroid Build Coastguard Workerdefm EOR : LogicalReg<0b10, 0, "eor", xor>; 909*9880d681SAndroid Build Coastguard Workerdefm ORN : LogicalReg<0b01, 1, "orn", 910*9880d681SAndroid Build Coastguard Worker BinOpFrag<(or node:$LHS, (not node:$RHS))>>; 911*9880d681SAndroid Build Coastguard Workerdefm ORR : LogicalReg<0b01, 0, "orr", or>; 912*9880d681SAndroid Build Coastguard Worker 913*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src", (ORRWrs GPR32:$dst, WZR, GPR32:$src, 0), 2>; 914*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src", (ORRXrs GPR64:$dst, XZR, GPR64:$src, 0), 2>; 915*9880d681SAndroid Build Coastguard Worker 916*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn $Wd, $Wm", (ORNWrs GPR32:$Wd, WZR, GPR32:$Wm, 0), 3>; 917*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn $Xd, $Xm", (ORNXrs GPR64:$Xd, XZR, GPR64:$Xm, 0), 3>; 918*9880d681SAndroid Build Coastguard Worker 919*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn $Wd, $Wm$sh", 920*9880d681SAndroid Build Coastguard Worker (ORNWrs GPR32:$Wd, WZR, GPR32:$Wm, logical_shift32:$sh), 2>; 921*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn $Xd, $Xm$sh", 922*9880d681SAndroid Build Coastguard Worker (ORNXrs GPR64:$Xd, XZR, GPR64:$Xm, logical_shift64:$sh), 2>; 923*9880d681SAndroid Build Coastguard Worker 924*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2", 925*9880d681SAndroid Build Coastguard Worker (ANDSWri WZR, GPR32:$src1, logical_imm32:$src2), 2>; 926*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2", 927*9880d681SAndroid Build Coastguard Worker (ANDSXri XZR, GPR64:$src1, logical_imm64:$src2), 2>; 928*9880d681SAndroid Build Coastguard Worker 929*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2", 930*9880d681SAndroid Build Coastguard Worker (ANDSWrs WZR, GPR32:$src1, GPR32:$src2, 0), 3>; 931*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2", 932*9880d681SAndroid Build Coastguard Worker (ANDSXrs XZR, GPR64:$src1, GPR64:$src2, 0), 3>; 933*9880d681SAndroid Build Coastguard Worker 934*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2$sh", 935*9880d681SAndroid Build Coastguard Worker (ANDSWrs WZR, GPR32:$src1, GPR32:$src2, logical_shift32:$sh), 2>; 936*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2$sh", 937*9880d681SAndroid Build Coastguard Worker (ANDSXrs XZR, GPR64:$src1, GPR64:$src2, logical_shift64:$sh), 2>; 938*9880d681SAndroid Build Coastguard Worker 939*9880d681SAndroid Build Coastguard Worker 940*9880d681SAndroid Build Coastguard Workerdef : Pat<(not GPR32:$Wm), (ORNWrr WZR, GPR32:$Wm)>; 941*9880d681SAndroid Build Coastguard Workerdef : Pat<(not GPR64:$Xm), (ORNXrr XZR, GPR64:$Xm)>; 942*9880d681SAndroid Build Coastguard Worker 943*9880d681SAndroid Build Coastguard Worker 944*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 945*9880d681SAndroid Build Coastguard Worker// One operand data processing instructions. 946*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 947*9880d681SAndroid Build Coastguard Worker 948*9880d681SAndroid Build Coastguard Workerdefm CLS : OneOperandData<0b101, "cls">; 949*9880d681SAndroid Build Coastguard Workerdefm CLZ : OneOperandData<0b100, "clz", ctlz>; 950*9880d681SAndroid Build Coastguard Workerdefm RBIT : OneOperandData<0b000, "rbit">; 951*9880d681SAndroid Build Coastguard Worker 952*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_rbit GPR32:$Rn), (RBITWr $Rn)>; 953*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_rbit GPR64:$Rn), (RBITXr $Rn)>; 954*9880d681SAndroid Build Coastguard Worker 955*9880d681SAndroid Build Coastguard Workerdef REV16Wr : OneWRegData<0b001, "rev16", 956*9880d681SAndroid Build Coastguard Worker UnOpFrag<(rotr (bswap node:$LHS), (i64 16))>>; 957*9880d681SAndroid Build Coastguard Workerdef REV16Xr : OneXRegData<0b001, "rev16", null_frag>; 958*9880d681SAndroid Build Coastguard Worker 959*9880d681SAndroid Build Coastguard Workerdef : Pat<(cttz GPR32:$Rn), 960*9880d681SAndroid Build Coastguard Worker (CLZWr (RBITWr GPR32:$Rn))>; 961*9880d681SAndroid Build Coastguard Workerdef : Pat<(cttz GPR64:$Rn), 962*9880d681SAndroid Build Coastguard Worker (CLZXr (RBITXr GPR64:$Rn))>; 963*9880d681SAndroid Build Coastguard Workerdef : Pat<(ctlz (or (shl (xor (sra GPR32:$Rn, (i64 31)), GPR32:$Rn), (i64 1)), 964*9880d681SAndroid Build Coastguard Worker (i32 1))), 965*9880d681SAndroid Build Coastguard Worker (CLSWr GPR32:$Rn)>; 966*9880d681SAndroid Build Coastguard Workerdef : Pat<(ctlz (or (shl (xor (sra GPR64:$Rn, (i64 63)), GPR64:$Rn), (i64 1)), 967*9880d681SAndroid Build Coastguard Worker (i64 1))), 968*9880d681SAndroid Build Coastguard Worker (CLSXr GPR64:$Rn)>; 969*9880d681SAndroid Build Coastguard Worker 970*9880d681SAndroid Build Coastguard Worker// Unlike the other one operand instructions, the instructions with the "rev" 971*9880d681SAndroid Build Coastguard Worker// mnemonic do *not* just different in the size bit, but actually use different 972*9880d681SAndroid Build Coastguard Worker// opcode bits for the different sizes. 973*9880d681SAndroid Build Coastguard Workerdef REVWr : OneWRegData<0b010, "rev", bswap>; 974*9880d681SAndroid Build Coastguard Workerdef REVXr : OneXRegData<0b011, "rev", bswap>; 975*9880d681SAndroid Build Coastguard Workerdef REV32Xr : OneXRegData<0b010, "rev32", 976*9880d681SAndroid Build Coastguard Worker UnOpFrag<(rotr (bswap node:$LHS), (i64 32))>>; 977*9880d681SAndroid Build Coastguard Worker 978*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rev64 $Rd, $Rn", (REVXr GPR64:$Rd, GPR64:$Rn), 0>; 979*9880d681SAndroid Build Coastguard Worker 980*9880d681SAndroid Build Coastguard Worker// The bswap commutes with the rotr so we want a pattern for both possible 981*9880d681SAndroid Build Coastguard Worker// orders. 982*9880d681SAndroid Build Coastguard Workerdef : Pat<(bswap (rotr GPR32:$Rn, (i64 16))), (REV16Wr GPR32:$Rn)>; 983*9880d681SAndroid Build Coastguard Workerdef : Pat<(bswap (rotr GPR64:$Rn, (i64 32))), (REV32Xr GPR64:$Rn)>; 984*9880d681SAndroid Build Coastguard Worker 985*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 986*9880d681SAndroid Build Coastguard Worker// Bitfield immediate extraction instruction. 987*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 988*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 989*9880d681SAndroid Build Coastguard Workerdefm EXTR : ExtractImm<"extr">; 990*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ror $dst, $src, $shift", 991*9880d681SAndroid Build Coastguard Worker (EXTRWrri GPR32:$dst, GPR32:$src, GPR32:$src, imm0_31:$shift)>; 992*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ror $dst, $src, $shift", 993*9880d681SAndroid Build Coastguard Worker (EXTRXrri GPR64:$dst, GPR64:$src, GPR64:$src, imm0_63:$shift)>; 994*9880d681SAndroid Build Coastguard Worker 995*9880d681SAndroid Build Coastguard Workerdef : Pat<(rotr GPR32:$Rn, (i64 imm0_31:$imm)), 996*9880d681SAndroid Build Coastguard Worker (EXTRWrri GPR32:$Rn, GPR32:$Rn, imm0_31:$imm)>; 997*9880d681SAndroid Build Coastguard Workerdef : Pat<(rotr GPR64:$Rn, (i64 imm0_63:$imm)), 998*9880d681SAndroid Build Coastguard Worker (EXTRXrri GPR64:$Rn, GPR64:$Rn, imm0_63:$imm)>; 999*9880d681SAndroid Build Coastguard Worker 1000*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1001*9880d681SAndroid Build Coastguard Worker// Other bitfield immediate instructions. 1002*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1003*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 1004*9880d681SAndroid Build Coastguard Workerdefm BFM : BitfieldImmWith2RegArgs<0b01, "bfm">; 1005*9880d681SAndroid Build Coastguard Workerdefm SBFM : BitfieldImm<0b00, "sbfm">; 1006*9880d681SAndroid Build Coastguard Workerdefm UBFM : BitfieldImm<0b10, "ubfm">; 1007*9880d681SAndroid Build Coastguard Worker} 1008*9880d681SAndroid Build Coastguard Worker 1009*9880d681SAndroid Build Coastguard Workerdef i32shift_a : Operand<i64>, SDNodeXForm<imm, [{ 1010*9880d681SAndroid Build Coastguard Worker uint64_t enc = (32 - N->getZExtValue()) & 0x1f; 1011*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1012*9880d681SAndroid Build Coastguard Worker}]>; 1013*9880d681SAndroid Build Coastguard Worker 1014*9880d681SAndroid Build Coastguard Workerdef i32shift_b : Operand<i64>, SDNodeXForm<imm, [{ 1015*9880d681SAndroid Build Coastguard Worker uint64_t enc = 31 - N->getZExtValue(); 1016*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1017*9880d681SAndroid Build Coastguard Worker}]>; 1018*9880d681SAndroid Build Coastguard Worker 1019*9880d681SAndroid Build Coastguard Worker// min(7, 31 - shift_amt) 1020*9880d681SAndroid Build Coastguard Workerdef i32shift_sext_i8 : Operand<i64>, SDNodeXForm<imm, [{ 1021*9880d681SAndroid Build Coastguard Worker uint64_t enc = 31 - N->getZExtValue(); 1022*9880d681SAndroid Build Coastguard Worker enc = enc > 7 ? 7 : enc; 1023*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1024*9880d681SAndroid Build Coastguard Worker}]>; 1025*9880d681SAndroid Build Coastguard Worker 1026*9880d681SAndroid Build Coastguard Worker// min(15, 31 - shift_amt) 1027*9880d681SAndroid Build Coastguard Workerdef i32shift_sext_i16 : Operand<i64>, SDNodeXForm<imm, [{ 1028*9880d681SAndroid Build Coastguard Worker uint64_t enc = 31 - N->getZExtValue(); 1029*9880d681SAndroid Build Coastguard Worker enc = enc > 15 ? 15 : enc; 1030*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1031*9880d681SAndroid Build Coastguard Worker}]>; 1032*9880d681SAndroid Build Coastguard Worker 1033*9880d681SAndroid Build Coastguard Workerdef i64shift_a : Operand<i64>, SDNodeXForm<imm, [{ 1034*9880d681SAndroid Build Coastguard Worker uint64_t enc = (64 - N->getZExtValue()) & 0x3f; 1035*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1036*9880d681SAndroid Build Coastguard Worker}]>; 1037*9880d681SAndroid Build Coastguard Worker 1038*9880d681SAndroid Build Coastguard Workerdef i64shift_b : Operand<i64>, SDNodeXForm<imm, [{ 1039*9880d681SAndroid Build Coastguard Worker uint64_t enc = 63 - N->getZExtValue(); 1040*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1041*9880d681SAndroid Build Coastguard Worker}]>; 1042*9880d681SAndroid Build Coastguard Worker 1043*9880d681SAndroid Build Coastguard Worker// min(7, 63 - shift_amt) 1044*9880d681SAndroid Build Coastguard Workerdef i64shift_sext_i8 : Operand<i64>, SDNodeXForm<imm, [{ 1045*9880d681SAndroid Build Coastguard Worker uint64_t enc = 63 - N->getZExtValue(); 1046*9880d681SAndroid Build Coastguard Worker enc = enc > 7 ? 7 : enc; 1047*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1048*9880d681SAndroid Build Coastguard Worker}]>; 1049*9880d681SAndroid Build Coastguard Worker 1050*9880d681SAndroid Build Coastguard Worker// min(15, 63 - shift_amt) 1051*9880d681SAndroid Build Coastguard Workerdef i64shift_sext_i16 : Operand<i64>, SDNodeXForm<imm, [{ 1052*9880d681SAndroid Build Coastguard Worker uint64_t enc = 63 - N->getZExtValue(); 1053*9880d681SAndroid Build Coastguard Worker enc = enc > 15 ? 15 : enc; 1054*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1055*9880d681SAndroid Build Coastguard Worker}]>; 1056*9880d681SAndroid Build Coastguard Worker 1057*9880d681SAndroid Build Coastguard Worker// min(31, 63 - shift_amt) 1058*9880d681SAndroid Build Coastguard Workerdef i64shift_sext_i32 : Operand<i64>, SDNodeXForm<imm, [{ 1059*9880d681SAndroid Build Coastguard Worker uint64_t enc = 63 - N->getZExtValue(); 1060*9880d681SAndroid Build Coastguard Worker enc = enc > 31 ? 31 : enc; 1061*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64); 1062*9880d681SAndroid Build Coastguard Worker}]>; 1063*9880d681SAndroid Build Coastguard Worker 1064*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl GPR32:$Rn, (i64 imm0_31:$imm)), 1065*9880d681SAndroid Build Coastguard Worker (UBFMWri GPR32:$Rn, (i64 (i32shift_a imm0_31:$imm)), 1066*9880d681SAndroid Build Coastguard Worker (i64 (i32shift_b imm0_31:$imm)))>; 1067*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl GPR64:$Rn, (i64 imm0_63:$imm)), 1068*9880d681SAndroid Build Coastguard Worker (UBFMXri GPR64:$Rn, (i64 (i64shift_a imm0_63:$imm)), 1069*9880d681SAndroid Build Coastguard Worker (i64 (i64shift_b imm0_63:$imm)))>; 1070*9880d681SAndroid Build Coastguard Worker 1071*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in { 1072*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra GPR32:$Rn, (i64 imm0_31:$imm)), 1073*9880d681SAndroid Build Coastguard Worker (SBFMWri GPR32:$Rn, imm0_31:$imm, 31)>; 1074*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra GPR64:$Rn, (i64 imm0_63:$imm)), 1075*9880d681SAndroid Build Coastguard Worker (SBFMXri GPR64:$Rn, imm0_63:$imm, 63)>; 1076*9880d681SAndroid Build Coastguard Worker} 1077*9880d681SAndroid Build Coastguard Worker 1078*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"asr $dst, $src, $shift", 1079*9880d681SAndroid Build Coastguard Worker (SBFMWri GPR32:$dst, GPR32:$src, imm0_31:$shift, 31)>; 1080*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"asr $dst, $src, $shift", 1081*9880d681SAndroid Build Coastguard Worker (SBFMXri GPR64:$dst, GPR64:$src, imm0_63:$shift, 63)>; 1082*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtb $dst, $src", (SBFMWri GPR32:$dst, GPR32:$src, 0, 7)>; 1083*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtb $dst, $src", (SBFMXri GPR64:$dst, GPR64:$src, 0, 7)>; 1084*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxth $dst, $src", (SBFMWri GPR32:$dst, GPR32:$src, 0, 15)>; 1085*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxth $dst, $src", (SBFMXri GPR64:$dst, GPR64:$src, 0, 15)>; 1086*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtw $dst, $src", (SBFMXri GPR64:$dst, GPR64:$src, 0, 31)>; 1087*9880d681SAndroid Build Coastguard Worker 1088*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl GPR32:$Rn, (i64 imm0_31:$imm)), 1089*9880d681SAndroid Build Coastguard Worker (UBFMWri GPR32:$Rn, imm0_31:$imm, 31)>; 1090*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl GPR64:$Rn, (i64 imm0_63:$imm)), 1091*9880d681SAndroid Build Coastguard Worker (UBFMXri GPR64:$Rn, imm0_63:$imm, 63)>; 1092*9880d681SAndroid Build Coastguard Worker 1093*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"lsr $dst, $src, $shift", 1094*9880d681SAndroid Build Coastguard Worker (UBFMWri GPR32:$dst, GPR32:$src, imm0_31:$shift, 31)>; 1095*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"lsr $dst, $src, $shift", 1096*9880d681SAndroid Build Coastguard Worker (UBFMXri GPR64:$dst, GPR64:$src, imm0_63:$shift, 63)>; 1097*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtb $dst, $src", (UBFMWri GPR32:$dst, GPR32:$src, 0, 7)>; 1098*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtb $dst, $src", (UBFMXri GPR64:$dst, GPR64:$src, 0, 7)>; 1099*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxth $dst, $src", (UBFMWri GPR32:$dst, GPR32:$src, 0, 15)>; 1100*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxth $dst, $src", (UBFMXri GPR64:$dst, GPR64:$src, 0, 15)>; 1101*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtw $dst, $src", (UBFMXri GPR64:$dst, GPR64:$src, 0, 31)>; 1102*9880d681SAndroid Build Coastguard Worker 1103*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1104*9880d681SAndroid Build Coastguard Worker// Conditional comparison instructions. 1105*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1106*9880d681SAndroid Build Coastguard Workerdefm CCMN : CondComparison<0, "ccmn", AArch64ccmn>; 1107*9880d681SAndroid Build Coastguard Workerdefm CCMP : CondComparison<1, "ccmp", AArch64ccmp>; 1108*9880d681SAndroid Build Coastguard Worker 1109*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1110*9880d681SAndroid Build Coastguard Worker// Conditional select instructions. 1111*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1112*9880d681SAndroid Build Coastguard Workerdefm CSEL : CondSelect<0, 0b00, "csel">; 1113*9880d681SAndroid Build Coastguard Worker 1114*9880d681SAndroid Build Coastguard Workerdef inc : PatFrag<(ops node:$in), (add node:$in, 1)>; 1115*9880d681SAndroid Build Coastguard Workerdefm CSINC : CondSelectOp<0, 0b01, "csinc", inc>; 1116*9880d681SAndroid Build Coastguard Workerdefm CSINV : CondSelectOp<1, 0b00, "csinv", not>; 1117*9880d681SAndroid Build Coastguard Workerdefm CSNEG : CondSelectOp<1, 0b01, "csneg", ineg>; 1118*9880d681SAndroid Build Coastguard Worker 1119*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csinv GPR32:$tval, GPR32:$fval, (i32 imm:$cc), NZCV), 1120*9880d681SAndroid Build Coastguard Worker (CSINVWr GPR32:$tval, GPR32:$fval, (i32 imm:$cc))>; 1121*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csinv GPR64:$tval, GPR64:$fval, (i32 imm:$cc), NZCV), 1122*9880d681SAndroid Build Coastguard Worker (CSINVXr GPR64:$tval, GPR64:$fval, (i32 imm:$cc))>; 1123*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csneg GPR32:$tval, GPR32:$fval, (i32 imm:$cc), NZCV), 1124*9880d681SAndroid Build Coastguard Worker (CSNEGWr GPR32:$tval, GPR32:$fval, (i32 imm:$cc))>; 1125*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csneg GPR64:$tval, GPR64:$fval, (i32 imm:$cc), NZCV), 1126*9880d681SAndroid Build Coastguard Worker (CSNEGXr GPR64:$tval, GPR64:$fval, (i32 imm:$cc))>; 1127*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csinc GPR32:$tval, GPR32:$fval, (i32 imm:$cc), NZCV), 1128*9880d681SAndroid Build Coastguard Worker (CSINCWr GPR32:$tval, GPR32:$fval, (i32 imm:$cc))>; 1129*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csinc GPR64:$tval, GPR64:$fval, (i32 imm:$cc), NZCV), 1130*9880d681SAndroid Build Coastguard Worker (CSINCXr GPR64:$tval, GPR64:$fval, (i32 imm:$cc))>; 1131*9880d681SAndroid Build Coastguard Worker 1132*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i32 0), (i32 1), (i32 imm:$cc), NZCV), 1133*9880d681SAndroid Build Coastguard Worker (CSINCWr WZR, WZR, (i32 imm:$cc))>; 1134*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i64 0), (i64 1), (i32 imm:$cc), NZCV), 1135*9880d681SAndroid Build Coastguard Worker (CSINCXr XZR, XZR, (i32 imm:$cc))>; 1136*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i32 0), (i32 -1), (i32 imm:$cc), NZCV), 1137*9880d681SAndroid Build Coastguard Worker (CSINVWr WZR, WZR, (i32 imm:$cc))>; 1138*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i64 0), (i64 -1), (i32 imm:$cc), NZCV), 1139*9880d681SAndroid Build Coastguard Worker (CSINVXr XZR, XZR, (i32 imm:$cc))>; 1140*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel GPR32:$tval, (i32 -1), (i32 imm:$cc), NZCV), 1141*9880d681SAndroid Build Coastguard Worker (CSINVWr GPR32:$tval, WZR, (i32 imm:$cc))>; 1142*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel GPR64:$tval, (i64 -1), (i32 imm:$cc), NZCV), 1143*9880d681SAndroid Build Coastguard Worker (CSINVXr GPR64:$tval, XZR, (i32 imm:$cc))>; 1144*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i32 -1), GPR32:$fval, (i32 imm:$cc), NZCV), 1145*9880d681SAndroid Build Coastguard Worker (CSINVWr GPR32:$fval, WZR, (i32 (inv_cond_XFORM imm:$cc)))>; 1146*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i64 -1), GPR64:$fval, (i32 imm:$cc), NZCV), 1147*9880d681SAndroid Build Coastguard Worker (CSINVXr GPR64:$fval, XZR, (i32 (inv_cond_XFORM imm:$cc)))>; 1148*9880d681SAndroid Build Coastguard Worker 1149*9880d681SAndroid Build Coastguard Worker// The inverse of the condition code from the alias instruction is what is used 1150*9880d681SAndroid Build Coastguard Worker// in the aliased instruction. The parser all ready inverts the condition code 1151*9880d681SAndroid Build Coastguard Worker// for these aliases. 1152*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cset $dst, $cc", 1153*9880d681SAndroid Build Coastguard Worker (CSINCWr GPR32:$dst, WZR, WZR, inv_ccode:$cc)>; 1154*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cset $dst, $cc", 1155*9880d681SAndroid Build Coastguard Worker (CSINCXr GPR64:$dst, XZR, XZR, inv_ccode:$cc)>; 1156*9880d681SAndroid Build Coastguard Worker 1157*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"csetm $dst, $cc", 1158*9880d681SAndroid Build Coastguard Worker (CSINVWr GPR32:$dst, WZR, WZR, inv_ccode:$cc)>; 1159*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"csetm $dst, $cc", 1160*9880d681SAndroid Build Coastguard Worker (CSINVXr GPR64:$dst, XZR, XZR, inv_ccode:$cc)>; 1161*9880d681SAndroid Build Coastguard Worker 1162*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cinc $dst, $src, $cc", 1163*9880d681SAndroid Build Coastguard Worker (CSINCWr GPR32:$dst, GPR32:$src, GPR32:$src, inv_ccode:$cc)>; 1164*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cinc $dst, $src, $cc", 1165*9880d681SAndroid Build Coastguard Worker (CSINCXr GPR64:$dst, GPR64:$src, GPR64:$src, inv_ccode:$cc)>; 1166*9880d681SAndroid Build Coastguard Worker 1167*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cinv $dst, $src, $cc", 1168*9880d681SAndroid Build Coastguard Worker (CSINVWr GPR32:$dst, GPR32:$src, GPR32:$src, inv_ccode:$cc)>; 1169*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cinv $dst, $src, $cc", 1170*9880d681SAndroid Build Coastguard Worker (CSINVXr GPR64:$dst, GPR64:$src, GPR64:$src, inv_ccode:$cc)>; 1171*9880d681SAndroid Build Coastguard Worker 1172*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cneg $dst, $src, $cc", 1173*9880d681SAndroid Build Coastguard Worker (CSNEGWr GPR32:$dst, GPR32:$src, GPR32:$src, inv_ccode:$cc)>; 1174*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cneg $dst, $src, $cc", 1175*9880d681SAndroid Build Coastguard Worker (CSNEGXr GPR64:$dst, GPR64:$src, GPR64:$src, inv_ccode:$cc)>; 1176*9880d681SAndroid Build Coastguard Worker 1177*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1178*9880d681SAndroid Build Coastguard Worker// PC-relative instructions. 1179*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1180*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1 in { 1181*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, mayStore = 0, mayLoad = 0 in { 1182*9880d681SAndroid Build Coastguard Workerdef ADR : ADRI<0, "adr", adrlabel, []>; 1183*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0 1184*9880d681SAndroid Build Coastguard Worker 1185*9880d681SAndroid Build Coastguard Workerdef ADRP : ADRI<1, "adrp", adrplabel, 1186*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Xd, (AArch64adrp tglobaladdr:$label))]>; 1187*9880d681SAndroid Build Coastguard Worker} // isReMaterializable = 1 1188*9880d681SAndroid Build Coastguard Worker 1189*9880d681SAndroid Build Coastguard Worker// page address of a constant pool entry, block address 1190*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64adrp tconstpool:$cp), (ADRP tconstpool:$cp)>; 1191*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64adrp tblockaddress:$cp), (ADRP tblockaddress:$cp)>; 1192*9880d681SAndroid Build Coastguard Worker 1193*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1194*9880d681SAndroid Build Coastguard Worker// Unconditional branch (register) instructions. 1195*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1196*9880d681SAndroid Build Coastguard Worker 1197*9880d681SAndroid Build Coastguard Workerlet isReturn = 1, isTerminator = 1, isBarrier = 1 in { 1198*9880d681SAndroid Build Coastguard Workerdef RET : BranchReg<0b0010, "ret", []>; 1199*9880d681SAndroid Build Coastguard Workerdef DRPS : SpecialReturn<0b0101, "drps">; 1200*9880d681SAndroid Build Coastguard Workerdef ERET : SpecialReturn<0b0100, "eret">; 1201*9880d681SAndroid Build Coastguard Worker} // isReturn = 1, isTerminator = 1, isBarrier = 1 1202*9880d681SAndroid Build Coastguard Worker 1203*9880d681SAndroid Build Coastguard Worker// Default to the LR register. 1204*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ret", (RET LR)>; 1205*9880d681SAndroid Build Coastguard Worker 1206*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [LR], Uses = [SP] in { 1207*9880d681SAndroid Build Coastguard Workerdef BLR : BranchReg<0b0001, "blr", [(AArch64call GPR64:$Rn)]>; 1208*9880d681SAndroid Build Coastguard Worker} // isCall 1209*9880d681SAndroid Build Coastguard Worker 1210*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in { 1211*9880d681SAndroid Build Coastguard Workerdef BR : BranchReg<0b0000, "br", [(brind GPR64:$Rn)]>; 1212*9880d681SAndroid Build Coastguard Worker} // isBranch, isTerminator, isBarrier, isIndirectBranch 1213*9880d681SAndroid Build Coastguard Worker 1214*9880d681SAndroid Build Coastguard Worker// Create a separate pseudo-instruction for codegen to use so that we don't 1215*9880d681SAndroid Build Coastguard Worker// flag lr as used in every function. It'll be restored before the RET by the 1216*9880d681SAndroid Build Coastguard Worker// epilogue if it's legitimately used. 1217*9880d681SAndroid Build Coastguard Workerdef RET_ReallyLR : Pseudo<(outs), (ins), [(AArch64retflag)]>, 1218*9880d681SAndroid Build Coastguard Worker Sched<[WriteBrReg]> { 1219*9880d681SAndroid Build Coastguard Worker let isTerminator = 1; 1220*9880d681SAndroid Build Coastguard Worker let isBarrier = 1; 1221*9880d681SAndroid Build Coastguard Worker let isReturn = 1; 1222*9880d681SAndroid Build Coastguard Worker} 1223*9880d681SAndroid Build Coastguard Worker 1224*9880d681SAndroid Build Coastguard Worker// This is a directive-like pseudo-instruction. The purpose is to insert an 1225*9880d681SAndroid Build Coastguard Worker// R_AARCH64_TLSDESC_CALL relocation at the offset of the following instruction 1226*9880d681SAndroid Build Coastguard Worker// (which in the usual case is a BLR). 1227*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1 in 1228*9880d681SAndroid Build Coastguard Workerdef TLSDESCCALL : Pseudo<(outs), (ins i64imm:$sym), []>, Sched<[]> { 1229*9880d681SAndroid Build Coastguard Worker let AsmString = ".tlsdesccall $sym"; 1230*9880d681SAndroid Build Coastguard Worker} 1231*9880d681SAndroid Build Coastguard Worker 1232*9880d681SAndroid Build Coastguard Worker// FIXME: maybe the scratch register used shouldn't be fixed to X1? 1233*9880d681SAndroid Build Coastguard Worker// FIXME: can "hasSideEffects be dropped? 1234*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [LR, X0, X1], hasSideEffects = 1, 1235*9880d681SAndroid Build Coastguard Worker isCodeGenOnly = 1 in 1236*9880d681SAndroid Build Coastguard Workerdef TLSDESC_CALLSEQ 1237*9880d681SAndroid Build Coastguard Worker : Pseudo<(outs), (ins i64imm:$sym), 1238*9880d681SAndroid Build Coastguard Worker [(AArch64tlsdesc_callseq tglobaltlsaddr:$sym)]>, 1239*9880d681SAndroid Build Coastguard Worker Sched<[WriteI, WriteLD, WriteI, WriteBrReg]>; 1240*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64tlsdesc_callseq texternalsym:$sym), 1241*9880d681SAndroid Build Coastguard Worker (TLSDESC_CALLSEQ texternalsym:$sym)>; 1242*9880d681SAndroid Build Coastguard Worker 1243*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1244*9880d681SAndroid Build Coastguard Worker// Conditional branch (immediate) instruction. 1245*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1246*9880d681SAndroid Build Coastguard Workerdef Bcc : BranchCond; 1247*9880d681SAndroid Build Coastguard Worker 1248*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1249*9880d681SAndroid Build Coastguard Worker// Compare-and-branch instructions. 1250*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1251*9880d681SAndroid Build Coastguard Workerdefm CBZ : CmpBranch<0, "cbz", AArch64cbz>; 1252*9880d681SAndroid Build Coastguard Workerdefm CBNZ : CmpBranch<1, "cbnz", AArch64cbnz>; 1253*9880d681SAndroid Build Coastguard Worker 1254*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1255*9880d681SAndroid Build Coastguard Worker// Test-bit-and-branch instructions. 1256*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1257*9880d681SAndroid Build Coastguard Workerdefm TBZ : TestBranch<0, "tbz", AArch64tbz>; 1258*9880d681SAndroid Build Coastguard Workerdefm TBNZ : TestBranch<1, "tbnz", AArch64tbnz>; 1259*9880d681SAndroid Build Coastguard Worker 1260*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1261*9880d681SAndroid Build Coastguard Worker// Unconditional branch (immediate) instructions. 1262*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1263*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, isBarrier = 1 in { 1264*9880d681SAndroid Build Coastguard Workerdef B : BranchImm<0, "b", [(br bb:$addr)]>; 1265*9880d681SAndroid Build Coastguard Worker} // isBranch, isTerminator, isBarrier 1266*9880d681SAndroid Build Coastguard Worker 1267*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [LR], Uses = [SP] in { 1268*9880d681SAndroid Build Coastguard Workerdef BL : CallImm<1, "bl", [(AArch64call tglobaladdr:$addr)]>; 1269*9880d681SAndroid Build Coastguard Worker} // isCall 1270*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64call texternalsym:$func), (BL texternalsym:$func)>; 1271*9880d681SAndroid Build Coastguard Worker 1272*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1273*9880d681SAndroid Build Coastguard Worker// Exception generation instructions. 1274*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1275*9880d681SAndroid Build Coastguard Workerdef BRK : ExceptionGeneration<0b001, 0b00, "brk">; 1276*9880d681SAndroid Build Coastguard Workerdef DCPS1 : ExceptionGeneration<0b101, 0b01, "dcps1">; 1277*9880d681SAndroid Build Coastguard Workerdef DCPS2 : ExceptionGeneration<0b101, 0b10, "dcps2">; 1278*9880d681SAndroid Build Coastguard Workerdef DCPS3 : ExceptionGeneration<0b101, 0b11, "dcps3">; 1279*9880d681SAndroid Build Coastguard Workerdef HLT : ExceptionGeneration<0b010, 0b00, "hlt">; 1280*9880d681SAndroid Build Coastguard Workerdef HVC : ExceptionGeneration<0b000, 0b10, "hvc">; 1281*9880d681SAndroid Build Coastguard Workerdef SMC : ExceptionGeneration<0b000, 0b11, "smc">; 1282*9880d681SAndroid Build Coastguard Workerdef SVC : ExceptionGeneration<0b000, 0b01, "svc">; 1283*9880d681SAndroid Build Coastguard Worker 1284*9880d681SAndroid Build Coastguard Worker// DCPSn defaults to an immediate operand of zero if unspecified. 1285*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"dcps1", (DCPS1 0)>; 1286*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"dcps2", (DCPS2 0)>; 1287*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"dcps3", (DCPS3 0)>; 1288*9880d681SAndroid Build Coastguard Worker 1289*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1290*9880d681SAndroid Build Coastguard Worker// Load instructions. 1291*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1292*9880d681SAndroid Build Coastguard Worker 1293*9880d681SAndroid Build Coastguard Worker// Pair (indexed, offset) 1294*9880d681SAndroid Build Coastguard Workerdefm LDPW : LoadPairOffset<0b00, 0, GPR32, simm7s4, "ldp">; 1295*9880d681SAndroid Build Coastguard Workerdefm LDPX : LoadPairOffset<0b10, 0, GPR64, simm7s8, "ldp">; 1296*9880d681SAndroid Build Coastguard Workerdefm LDPS : LoadPairOffset<0b00, 1, FPR32, simm7s4, "ldp">; 1297*9880d681SAndroid Build Coastguard Workerdefm LDPD : LoadPairOffset<0b01, 1, FPR64, simm7s8, "ldp">; 1298*9880d681SAndroid Build Coastguard Workerdefm LDPQ : LoadPairOffset<0b10, 1, FPR128, simm7s16, "ldp">; 1299*9880d681SAndroid Build Coastguard Worker 1300*9880d681SAndroid Build Coastguard Workerdefm LDPSW : LoadPairOffset<0b01, 0, GPR64, simm7s4, "ldpsw">; 1301*9880d681SAndroid Build Coastguard Worker 1302*9880d681SAndroid Build Coastguard Worker// Pair (pre-indexed) 1303*9880d681SAndroid Build Coastguard Workerdef LDPWpre : LoadPairPreIdx<0b00, 0, GPR32, simm7s4, "ldp">; 1304*9880d681SAndroid Build Coastguard Workerdef LDPXpre : LoadPairPreIdx<0b10, 0, GPR64, simm7s8, "ldp">; 1305*9880d681SAndroid Build Coastguard Workerdef LDPSpre : LoadPairPreIdx<0b00, 1, FPR32, simm7s4, "ldp">; 1306*9880d681SAndroid Build Coastguard Workerdef LDPDpre : LoadPairPreIdx<0b01, 1, FPR64, simm7s8, "ldp">; 1307*9880d681SAndroid Build Coastguard Workerdef LDPQpre : LoadPairPreIdx<0b10, 1, FPR128, simm7s16, "ldp">; 1308*9880d681SAndroid Build Coastguard Worker 1309*9880d681SAndroid Build Coastguard Workerdef LDPSWpre : LoadPairPreIdx<0b01, 0, GPR64, simm7s4, "ldpsw">; 1310*9880d681SAndroid Build Coastguard Worker 1311*9880d681SAndroid Build Coastguard Worker// Pair (post-indexed) 1312*9880d681SAndroid Build Coastguard Workerdef LDPWpost : LoadPairPostIdx<0b00, 0, GPR32, simm7s4, "ldp">; 1313*9880d681SAndroid Build Coastguard Workerdef LDPXpost : LoadPairPostIdx<0b10, 0, GPR64, simm7s8, "ldp">; 1314*9880d681SAndroid Build Coastguard Workerdef LDPSpost : LoadPairPostIdx<0b00, 1, FPR32, simm7s4, "ldp">; 1315*9880d681SAndroid Build Coastguard Workerdef LDPDpost : LoadPairPostIdx<0b01, 1, FPR64, simm7s8, "ldp">; 1316*9880d681SAndroid Build Coastguard Workerdef LDPQpost : LoadPairPostIdx<0b10, 1, FPR128, simm7s16, "ldp">; 1317*9880d681SAndroid Build Coastguard Worker 1318*9880d681SAndroid Build Coastguard Workerdef LDPSWpost : LoadPairPostIdx<0b01, 0, GPR64, simm7s4, "ldpsw">; 1319*9880d681SAndroid Build Coastguard Worker 1320*9880d681SAndroid Build Coastguard Worker 1321*9880d681SAndroid Build Coastguard Worker// Pair (no allocate) 1322*9880d681SAndroid Build Coastguard Workerdefm LDNPW : LoadPairNoAlloc<0b00, 0, GPR32, simm7s4, "ldnp">; 1323*9880d681SAndroid Build Coastguard Workerdefm LDNPX : LoadPairNoAlloc<0b10, 0, GPR64, simm7s8, "ldnp">; 1324*9880d681SAndroid Build Coastguard Workerdefm LDNPS : LoadPairNoAlloc<0b00, 1, FPR32, simm7s4, "ldnp">; 1325*9880d681SAndroid Build Coastguard Workerdefm LDNPD : LoadPairNoAlloc<0b01, 1, FPR64, simm7s8, "ldnp">; 1326*9880d681SAndroid Build Coastguard Workerdefm LDNPQ : LoadPairNoAlloc<0b10, 1, FPR128, simm7s16, "ldnp">; 1327*9880d681SAndroid Build Coastguard Worker 1328*9880d681SAndroid Build Coastguard Worker//--- 1329*9880d681SAndroid Build Coastguard Worker// (register offset) 1330*9880d681SAndroid Build Coastguard Worker//--- 1331*9880d681SAndroid Build Coastguard Worker 1332*9880d681SAndroid Build Coastguard Worker// Integer 1333*9880d681SAndroid Build Coastguard Workerdefm LDRBB : Load8RO<0b00, 0, 0b01, GPR32, "ldrb", i32, zextloadi8>; 1334*9880d681SAndroid Build Coastguard Workerdefm LDRHH : Load16RO<0b01, 0, 0b01, GPR32, "ldrh", i32, zextloadi16>; 1335*9880d681SAndroid Build Coastguard Workerdefm LDRW : Load32RO<0b10, 0, 0b01, GPR32, "ldr", i32, load>; 1336*9880d681SAndroid Build Coastguard Workerdefm LDRX : Load64RO<0b11, 0, 0b01, GPR64, "ldr", i64, load>; 1337*9880d681SAndroid Build Coastguard Worker 1338*9880d681SAndroid Build Coastguard Worker// Floating-point 1339*9880d681SAndroid Build Coastguard Workerdefm LDRB : Load8RO<0b00, 1, 0b01, FPR8, "ldr", untyped, load>; 1340*9880d681SAndroid Build Coastguard Workerdefm LDRH : Load16RO<0b01, 1, 0b01, FPR16, "ldr", f16, load>; 1341*9880d681SAndroid Build Coastguard Workerdefm LDRS : Load32RO<0b10, 1, 0b01, FPR32, "ldr", f32, load>; 1342*9880d681SAndroid Build Coastguard Workerdefm LDRD : Load64RO<0b11, 1, 0b01, FPR64, "ldr", f64, load>; 1343*9880d681SAndroid Build Coastguard Workerdefm LDRQ : Load128RO<0b00, 1, 0b11, FPR128, "ldr", f128, load>; 1344*9880d681SAndroid Build Coastguard Worker 1345*9880d681SAndroid Build Coastguard Worker// Load sign-extended half-word 1346*9880d681SAndroid Build Coastguard Workerdefm LDRSHW : Load16RO<0b01, 0, 0b11, GPR32, "ldrsh", i32, sextloadi16>; 1347*9880d681SAndroid Build Coastguard Workerdefm LDRSHX : Load16RO<0b01, 0, 0b10, GPR64, "ldrsh", i64, sextloadi16>; 1348*9880d681SAndroid Build Coastguard Worker 1349*9880d681SAndroid Build Coastguard Worker// Load sign-extended byte 1350*9880d681SAndroid Build Coastguard Workerdefm LDRSBW : Load8RO<0b00, 0, 0b11, GPR32, "ldrsb", i32, sextloadi8>; 1351*9880d681SAndroid Build Coastguard Workerdefm LDRSBX : Load8RO<0b00, 0, 0b10, GPR64, "ldrsb", i64, sextloadi8>; 1352*9880d681SAndroid Build Coastguard Worker 1353*9880d681SAndroid Build Coastguard Worker// Load sign-extended word 1354*9880d681SAndroid Build Coastguard Workerdefm LDRSW : Load32RO<0b10, 0, 0b10, GPR64, "ldrsw", i64, sextloadi32>; 1355*9880d681SAndroid Build Coastguard Worker 1356*9880d681SAndroid Build Coastguard Worker// Pre-fetch. 1357*9880d681SAndroid Build Coastguard Workerdefm PRFM : PrefetchRO<0b11, 0, 0b10, "prfm">; 1358*9880d681SAndroid Build Coastguard Worker 1359*9880d681SAndroid Build Coastguard Worker// For regular load, we do not have any alignment requirement. 1360*9880d681SAndroid Build Coastguard Worker// Thus, it is safe to directly map the vector loads with interesting 1361*9880d681SAndroid Build Coastguard Worker// addressing modes. 1362*9880d681SAndroid Build Coastguard Worker// FIXME: We could do the same for bitconvert to floating point vectors. 1363*9880d681SAndroid Build Coastguard Workermulticlass ScalToVecROLoadPat<ROAddrMode ro, SDPatternOperator loadop, 1364*9880d681SAndroid Build Coastguard Worker ValueType ScalTy, ValueType VecTy, 1365*9880d681SAndroid Build Coastguard Worker Instruction LOADW, Instruction LOADX, 1366*9880d681SAndroid Build Coastguard Worker SubRegIndex sub> { 1367*9880d681SAndroid Build Coastguard Worker def : Pat<(VecTy (scalar_to_vector (ScalTy 1368*9880d681SAndroid Build Coastguard Worker (loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$offset))))), 1369*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (VecTy (IMPLICIT_DEF)), 1370*9880d681SAndroid Build Coastguard Worker (LOADW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$offset), 1371*9880d681SAndroid Build Coastguard Worker sub)>; 1372*9880d681SAndroid Build Coastguard Worker 1373*9880d681SAndroid Build Coastguard Worker def : Pat<(VecTy (scalar_to_vector (ScalTy 1374*9880d681SAndroid Build Coastguard Worker (loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$offset))))), 1375*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (VecTy (IMPLICIT_DEF)), 1376*9880d681SAndroid Build Coastguard Worker (LOADX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$offset), 1377*9880d681SAndroid Build Coastguard Worker sub)>; 1378*9880d681SAndroid Build Coastguard Worker} 1379*9880d681SAndroid Build Coastguard Worker 1380*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in { 1381*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro8, extloadi8, i32, v8i8, LDRBroW, LDRBroX, bsub>; 1382*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro8, extloadi8, i32, v16i8, LDRBroW, LDRBroX, bsub>; 1383*9880d681SAndroid Build Coastguard Worker 1384*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro16, extloadi16, i32, v4i16, LDRHroW, LDRHroX, hsub>; 1385*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro16, extloadi16, i32, v8i16, LDRHroW, LDRHroX, hsub>; 1386*9880d681SAndroid Build Coastguard Worker 1387*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro16, load, i32, v4f16, LDRHroW, LDRHroX, hsub>; 1388*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro16, load, i32, v8f16, LDRHroW, LDRHroX, hsub>; 1389*9880d681SAndroid Build Coastguard Worker 1390*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro32, load, i32, v2i32, LDRSroW, LDRSroX, ssub>; 1391*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro32, load, i32, v4i32, LDRSroW, LDRSroX, ssub>; 1392*9880d681SAndroid Build Coastguard Worker 1393*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro32, load, f32, v2f32, LDRSroW, LDRSroX, ssub>; 1394*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro32, load, f32, v4f32, LDRSroW, LDRSroX, ssub>; 1395*9880d681SAndroid Build Coastguard Worker 1396*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro64, load, i64, v2i64, LDRDroW, LDRDroX, dsub>; 1397*9880d681SAndroid Build Coastguard Worker 1398*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro64, load, f64, v2f64, LDRDroW, LDRDroX, dsub>; 1399*9880d681SAndroid Build Coastguard Worker 1400*9880d681SAndroid Build Coastguard Worker 1401*9880d681SAndroid Build Coastguard Workerdef : Pat <(v1i64 (scalar_to_vector (i64 1402*9880d681SAndroid Build Coastguard Worker (load (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm, 1403*9880d681SAndroid Build Coastguard Worker ro_Wextend64:$extend))))), 1404*9880d681SAndroid Build Coastguard Worker (LDRDroW GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend)>; 1405*9880d681SAndroid Build Coastguard Worker 1406*9880d681SAndroid Build Coastguard Workerdef : Pat <(v1i64 (scalar_to_vector (i64 1407*9880d681SAndroid Build Coastguard Worker (load (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm, 1408*9880d681SAndroid Build Coastguard Worker ro_Xextend64:$extend))))), 1409*9880d681SAndroid Build Coastguard Worker (LDRDroX GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend)>; 1410*9880d681SAndroid Build Coastguard Worker} 1411*9880d681SAndroid Build Coastguard Worker 1412*9880d681SAndroid Build Coastguard Worker// Match all load 64 bits width whose type is compatible with FPR64 1413*9880d681SAndroid Build Coastguard Workermulticlass VecROLoadPat<ROAddrMode ro, ValueType VecTy, 1414*9880d681SAndroid Build Coastguard Worker Instruction LOADW, Instruction LOADX> { 1415*9880d681SAndroid Build Coastguard Worker 1416*9880d681SAndroid Build Coastguard Worker def : Pat<(VecTy (load (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend))), 1417*9880d681SAndroid Build Coastguard Worker (LOADW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>; 1418*9880d681SAndroid Build Coastguard Worker 1419*9880d681SAndroid Build Coastguard Worker def : Pat<(VecTy (load (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend))), 1420*9880d681SAndroid Build Coastguard Worker (LOADX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>; 1421*9880d681SAndroid Build Coastguard Worker} 1422*9880d681SAndroid Build Coastguard Worker 1423*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in { 1424*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 1425*9880d681SAndroid Build Coastguard Worker // We must do vector loads with LD1 in big-endian. 1426*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro64, v2i32, LDRDroW, LDRDroX>; 1427*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro64, v2f32, LDRDroW, LDRDroX>; 1428*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro64, v8i8, LDRDroW, LDRDroX>; 1429*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro64, v4i16, LDRDroW, LDRDroX>; 1430*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro64, v4f16, LDRDroW, LDRDroX>; 1431*9880d681SAndroid Build Coastguard Worker} 1432*9880d681SAndroid Build Coastguard Worker 1433*9880d681SAndroid Build Coastguard Workerdefm : VecROLoadPat<ro64, v1i64, LDRDroW, LDRDroX>; 1434*9880d681SAndroid Build Coastguard Workerdefm : VecROLoadPat<ro64, v1f64, LDRDroW, LDRDroX>; 1435*9880d681SAndroid Build Coastguard Worker 1436*9880d681SAndroid Build Coastguard Worker// Match all load 128 bits width whose type is compatible with FPR128 1437*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 1438*9880d681SAndroid Build Coastguard Worker // We must do vector loads with LD1 in big-endian. 1439*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro128, v2i64, LDRQroW, LDRQroX>; 1440*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro128, v2f64, LDRQroW, LDRQroX>; 1441*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro128, v4i32, LDRQroW, LDRQroX>; 1442*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro128, v4f32, LDRQroW, LDRQroX>; 1443*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro128, v8i16, LDRQroW, LDRQroX>; 1444*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro128, v8f16, LDRQroW, LDRQroX>; 1445*9880d681SAndroid Build Coastguard Worker defm : VecROLoadPat<ro128, v16i8, LDRQroW, LDRQroX>; 1446*9880d681SAndroid Build Coastguard Worker} 1447*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 10 1448*9880d681SAndroid Build Coastguard Worker 1449*9880d681SAndroid Build Coastguard Worker// zextload -> i64 1450*9880d681SAndroid Build Coastguard Workermulticlass ExtLoadTo64ROPat<ROAddrMode ro, SDPatternOperator loadop, 1451*9880d681SAndroid Build Coastguard Worker Instruction INSTW, Instruction INSTX> { 1452*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend))), 1453*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), 1454*9880d681SAndroid Build Coastguard Worker (INSTW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend), 1455*9880d681SAndroid Build Coastguard Worker sub_32)>; 1456*9880d681SAndroid Build Coastguard Worker 1457*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend))), 1458*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), 1459*9880d681SAndroid Build Coastguard Worker (INSTX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend), 1460*9880d681SAndroid Build Coastguard Worker sub_32)>; 1461*9880d681SAndroid Build Coastguard Worker} 1462*9880d681SAndroid Build Coastguard Worker 1463*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in { 1464*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo64ROPat<ro8, zextloadi8, LDRBBroW, LDRBBroX>; 1465*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo64ROPat<ro16, zextloadi16, LDRHHroW, LDRHHroX>; 1466*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo64ROPat<ro32, zextloadi32, LDRWroW, LDRWroX>; 1467*9880d681SAndroid Build Coastguard Worker 1468*9880d681SAndroid Build Coastguard Worker // zextloadi1 -> zextloadi8 1469*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo64ROPat<ro8, zextloadi1, LDRBBroW, LDRBBroX>; 1470*9880d681SAndroid Build Coastguard Worker 1471*9880d681SAndroid Build Coastguard Worker // extload -> zextload 1472*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo64ROPat<ro8, extloadi8, LDRBBroW, LDRBBroX>; 1473*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo64ROPat<ro16, extloadi16, LDRHHroW, LDRHHroX>; 1474*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo64ROPat<ro32, extloadi32, LDRWroW, LDRWroX>; 1475*9880d681SAndroid Build Coastguard Worker 1476*9880d681SAndroid Build Coastguard Worker // extloadi1 -> zextloadi8 1477*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo64ROPat<ro8, extloadi1, LDRBBroW, LDRBBroX>; 1478*9880d681SAndroid Build Coastguard Worker} 1479*9880d681SAndroid Build Coastguard Worker 1480*9880d681SAndroid Build Coastguard Worker 1481*9880d681SAndroid Build Coastguard Worker// zextload -> i64 1482*9880d681SAndroid Build Coastguard Workermulticlass ExtLoadTo32ROPat<ROAddrMode ro, SDPatternOperator loadop, 1483*9880d681SAndroid Build Coastguard Worker Instruction INSTW, Instruction INSTX> { 1484*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend))), 1485*9880d681SAndroid Build Coastguard Worker (INSTW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>; 1486*9880d681SAndroid Build Coastguard Worker 1487*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend))), 1488*9880d681SAndroid Build Coastguard Worker (INSTX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>; 1489*9880d681SAndroid Build Coastguard Worker 1490*9880d681SAndroid Build Coastguard Worker} 1491*9880d681SAndroid Build Coastguard Worker 1492*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in { 1493*9880d681SAndroid Build Coastguard Worker // extload -> zextload 1494*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo32ROPat<ro8, extloadi8, LDRBBroW, LDRBBroX>; 1495*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo32ROPat<ro16, extloadi16, LDRHHroW, LDRHHroX>; 1496*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo32ROPat<ro32, extloadi32, LDRWroW, LDRWroX>; 1497*9880d681SAndroid Build Coastguard Worker 1498*9880d681SAndroid Build Coastguard Worker // zextloadi1 -> zextloadi8 1499*9880d681SAndroid Build Coastguard Worker defm : ExtLoadTo32ROPat<ro8, zextloadi1, LDRBBroW, LDRBBroX>; 1500*9880d681SAndroid Build Coastguard Worker} 1501*9880d681SAndroid Build Coastguard Worker 1502*9880d681SAndroid Build Coastguard Worker//--- 1503*9880d681SAndroid Build Coastguard Worker// (unsigned immediate) 1504*9880d681SAndroid Build Coastguard Worker//--- 1505*9880d681SAndroid Build Coastguard Workerdefm LDRX : LoadUI<0b11, 0, 0b01, GPR64, uimm12s8, "ldr", 1506*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rt, 1507*9880d681SAndroid Build Coastguard Worker (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)))]>; 1508*9880d681SAndroid Build Coastguard Workerdefm LDRW : LoadUI<0b10, 0, 0b01, GPR32, uimm12s4, "ldr", 1509*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1510*9880d681SAndroid Build Coastguard Worker (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset)))]>; 1511*9880d681SAndroid Build Coastguard Workerdefm LDRB : LoadUI<0b00, 1, 0b01, FPR8, uimm12s1, "ldr", 1512*9880d681SAndroid Build Coastguard Worker [(set FPR8:$Rt, 1513*9880d681SAndroid Build Coastguard Worker (load (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset)))]>; 1514*9880d681SAndroid Build Coastguard Workerdefm LDRH : LoadUI<0b01, 1, 0b01, FPR16, uimm12s2, "ldr", 1515*9880d681SAndroid Build Coastguard Worker [(set (f16 FPR16:$Rt), 1516*9880d681SAndroid Build Coastguard Worker (load (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset)))]>; 1517*9880d681SAndroid Build Coastguard Workerdefm LDRS : LoadUI<0b10, 1, 0b01, FPR32, uimm12s4, "ldr", 1518*9880d681SAndroid Build Coastguard Worker [(set (f32 FPR32:$Rt), 1519*9880d681SAndroid Build Coastguard Worker (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset)))]>; 1520*9880d681SAndroid Build Coastguard Workerdefm LDRD : LoadUI<0b11, 1, 0b01, FPR64, uimm12s8, "ldr", 1521*9880d681SAndroid Build Coastguard Worker [(set (f64 FPR64:$Rt), 1522*9880d681SAndroid Build Coastguard Worker (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)))]>; 1523*9880d681SAndroid Build Coastguard Workerdefm LDRQ : LoadUI<0b00, 1, 0b11, FPR128, uimm12s16, "ldr", 1524*9880d681SAndroid Build Coastguard Worker [(set (f128 FPR128:$Rt), 1525*9880d681SAndroid Build Coastguard Worker (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)))]>; 1526*9880d681SAndroid Build Coastguard Worker 1527*9880d681SAndroid Build Coastguard Worker// For regular load, we do not have any alignment requirement. 1528*9880d681SAndroid Build Coastguard Worker// Thus, it is safe to directly map the vector loads with interesting 1529*9880d681SAndroid Build Coastguard Worker// addressing modes. 1530*9880d681SAndroid Build Coastguard Worker// FIXME: We could do the same for bitconvert to floating point vectors. 1531*9880d681SAndroid Build Coastguard Workerdef : Pat <(v8i8 (scalar_to_vector (i32 1532*9880d681SAndroid Build Coastguard Worker (extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))), 1533*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i8 (IMPLICIT_DEF)), 1534*9880d681SAndroid Build Coastguard Worker (LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub)>; 1535*9880d681SAndroid Build Coastguard Workerdef : Pat <(v16i8 (scalar_to_vector (i32 1536*9880d681SAndroid Build Coastguard Worker (extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))), 1537*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 1538*9880d681SAndroid Build Coastguard Worker (LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub)>; 1539*9880d681SAndroid Build Coastguard Workerdef : Pat <(v4i16 (scalar_to_vector (i32 1540*9880d681SAndroid Build Coastguard Worker (extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))), 1541*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i16 (IMPLICIT_DEF)), 1542*9880d681SAndroid Build Coastguard Worker (LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub)>; 1543*9880d681SAndroid Build Coastguard Workerdef : Pat <(v8i16 (scalar_to_vector (i32 1544*9880d681SAndroid Build Coastguard Worker (extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))), 1545*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), 1546*9880d681SAndroid Build Coastguard Worker (LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub)>; 1547*9880d681SAndroid Build Coastguard Workerdef : Pat <(v2i32 (scalar_to_vector (i32 1548*9880d681SAndroid Build Coastguard Worker (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))))), 1549*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v2i32 (IMPLICIT_DEF)), 1550*9880d681SAndroid Build Coastguard Worker (LDRSui GPR64sp:$Rn, uimm12s4:$offset), ssub)>; 1551*9880d681SAndroid Build Coastguard Workerdef : Pat <(v4i32 (scalar_to_vector (i32 1552*9880d681SAndroid Build Coastguard Worker (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))))), 1553*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), 1554*9880d681SAndroid Build Coastguard Worker (LDRSui GPR64sp:$Rn, uimm12s4:$offset), ssub)>; 1555*9880d681SAndroid Build Coastguard Workerdef : Pat <(v1i64 (scalar_to_vector (i64 1556*9880d681SAndroid Build Coastguard Worker (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))))), 1557*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>; 1558*9880d681SAndroid Build Coastguard Workerdef : Pat <(v2i64 (scalar_to_vector (i64 1559*9880d681SAndroid Build Coastguard Worker (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))))), 1560*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), 1561*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset), dsub)>; 1562*9880d681SAndroid Build Coastguard Worker 1563*9880d681SAndroid Build Coastguard Worker// Match all load 64 bits width whose type is compatible with FPR64 1564*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 1565*9880d681SAndroid Build Coastguard Worker // We must use LD1 to perform vector loads in big-endian. 1566*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f32 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))), 1567*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>; 1568*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i8 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))), 1569*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>; 1570*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i16 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))), 1571*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>; 1572*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i32 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))), 1573*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>; 1574*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f16 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))), 1575*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>; 1576*9880d681SAndroid Build Coastguard Worker} 1577*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))), 1578*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>; 1579*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))), 1580*9880d681SAndroid Build Coastguard Worker (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>; 1581*9880d681SAndroid Build Coastguard Worker 1582*9880d681SAndroid Build Coastguard Worker// Match all load 128 bits width whose type is compatible with FPR128 1583*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 1584*9880d681SAndroid Build Coastguard Worker // We must use LD1 to perform vector loads in big-endian. 1585*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))), 1586*9880d681SAndroid Build Coastguard Worker (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>; 1587*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))), 1588*9880d681SAndroid Build Coastguard Worker (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>; 1589*9880d681SAndroid Build Coastguard Worker def : Pat<(v16i8 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))), 1590*9880d681SAndroid Build Coastguard Worker (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>; 1591*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i16 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))), 1592*9880d681SAndroid Build Coastguard Worker (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>; 1593*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))), 1594*9880d681SAndroid Build Coastguard Worker (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>; 1595*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))), 1596*9880d681SAndroid Build Coastguard Worker (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>; 1597*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f16 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))), 1598*9880d681SAndroid Build Coastguard Worker (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>; 1599*9880d681SAndroid Build Coastguard Worker} 1600*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))), 1601*9880d681SAndroid Build Coastguard Worker (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>; 1602*9880d681SAndroid Build Coastguard Worker 1603*9880d681SAndroid Build Coastguard Workerdefm LDRHH : LoadUI<0b01, 0, 0b01, GPR32, uimm12s2, "ldrh", 1604*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1605*9880d681SAndroid Build Coastguard Worker (zextloadi16 (am_indexed16 GPR64sp:$Rn, 1606*9880d681SAndroid Build Coastguard Worker uimm12s2:$offset)))]>; 1607*9880d681SAndroid Build Coastguard Workerdefm LDRBB : LoadUI<0b00, 0, 0b01, GPR32, uimm12s1, "ldrb", 1608*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1609*9880d681SAndroid Build Coastguard Worker (zextloadi8 (am_indexed8 GPR64sp:$Rn, 1610*9880d681SAndroid Build Coastguard Worker uimm12s1:$offset)))]>; 1611*9880d681SAndroid Build Coastguard Worker// zextload -> i64 1612*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))), 1613*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDRBBui GPR64sp:$Rn, uimm12s1:$offset), sub_32)>; 1614*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))), 1615*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDRHHui GPR64sp:$Rn, uimm12s2:$offset), sub_32)>; 1616*9880d681SAndroid Build Coastguard Worker 1617*9880d681SAndroid Build Coastguard Worker// zextloadi1 -> zextloadi8 1618*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zextloadi1 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))), 1619*9880d681SAndroid Build Coastguard Worker (LDRBBui GPR64sp:$Rn, uimm12s1:$offset)>; 1620*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi1 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))), 1621*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDRBBui GPR64sp:$Rn, uimm12s1:$offset), sub_32)>; 1622*9880d681SAndroid Build Coastguard Worker 1623*9880d681SAndroid Build Coastguard Worker// extload -> zextload 1624*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))), 1625*9880d681SAndroid Build Coastguard Worker (LDRHHui GPR64sp:$Rn, uimm12s2:$offset)>; 1626*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))), 1627*9880d681SAndroid Build Coastguard Worker (LDRBBui GPR64sp:$Rn, uimm12s1:$offset)>; 1628*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi1 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))), 1629*9880d681SAndroid Build Coastguard Worker (LDRBBui GPR64sp:$Rn, uimm12s1:$offset)>; 1630*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi32 (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))), 1631*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDRWui GPR64sp:$Rn, uimm12s4:$offset), sub_32)>; 1632*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))), 1633*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDRHHui GPR64sp:$Rn, uimm12s2:$offset), sub_32)>; 1634*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))), 1635*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDRBBui GPR64sp:$Rn, uimm12s1:$offset), sub_32)>; 1636*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi1 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))), 1637*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDRBBui GPR64sp:$Rn, uimm12s1:$offset), sub_32)>; 1638*9880d681SAndroid Build Coastguard Worker 1639*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word 1640*9880d681SAndroid Build Coastguard Workerdefm LDRSHW : LoadUI<0b01, 0, 0b11, GPR32, uimm12s2, "ldrsh", 1641*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1642*9880d681SAndroid Build Coastguard Worker (sextloadi16 (am_indexed16 GPR64sp:$Rn, 1643*9880d681SAndroid Build Coastguard Worker uimm12s2:$offset)))]>; 1644*9880d681SAndroid Build Coastguard Workerdefm LDRSHX : LoadUI<0b01, 0, 0b10, GPR64, uimm12s2, "ldrsh", 1645*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rt, 1646*9880d681SAndroid Build Coastguard Worker (sextloadi16 (am_indexed16 GPR64sp:$Rn, 1647*9880d681SAndroid Build Coastguard Worker uimm12s2:$offset)))]>; 1648*9880d681SAndroid Build Coastguard Worker 1649*9880d681SAndroid Build Coastguard Worker// load sign-extended byte 1650*9880d681SAndroid Build Coastguard Workerdefm LDRSBW : LoadUI<0b00, 0, 0b11, GPR32, uimm12s1, "ldrsb", 1651*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1652*9880d681SAndroid Build Coastguard Worker (sextloadi8 (am_indexed8 GPR64sp:$Rn, 1653*9880d681SAndroid Build Coastguard Worker uimm12s1:$offset)))]>; 1654*9880d681SAndroid Build Coastguard Workerdefm LDRSBX : LoadUI<0b00, 0, 0b10, GPR64, uimm12s1, "ldrsb", 1655*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rt, 1656*9880d681SAndroid Build Coastguard Worker (sextloadi8 (am_indexed8 GPR64sp:$Rn, 1657*9880d681SAndroid Build Coastguard Worker uimm12s1:$offset)))]>; 1658*9880d681SAndroid Build Coastguard Worker 1659*9880d681SAndroid Build Coastguard Worker// load sign-extended word 1660*9880d681SAndroid Build Coastguard Workerdefm LDRSW : LoadUI<0b10, 0, 0b10, GPR64, uimm12s4, "ldrsw", 1661*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rt, 1662*9880d681SAndroid Build Coastguard Worker (sextloadi32 (am_indexed32 GPR64sp:$Rn, 1663*9880d681SAndroid Build Coastguard Worker uimm12s4:$offset)))]>; 1664*9880d681SAndroid Build Coastguard Worker 1665*9880d681SAndroid Build Coastguard Worker// load zero-extended word 1666*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi32 (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))), 1667*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDRWui GPR64sp:$Rn, uimm12s4:$offset), sub_32)>; 1668*9880d681SAndroid Build Coastguard Worker 1669*9880d681SAndroid Build Coastguard Worker// Pre-fetch. 1670*9880d681SAndroid Build Coastguard Workerdef PRFMui : PrefetchUI<0b11, 0, 0b10, "prfm", 1671*9880d681SAndroid Build Coastguard Worker [(AArch64Prefetch imm:$Rt, 1672*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, 1673*9880d681SAndroid Build Coastguard Worker uimm12s8:$offset))]>; 1674*9880d681SAndroid Build Coastguard Worker 1675*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"prfm $Rt, [$Rn]", (PRFMui prfop:$Rt, GPR64sp:$Rn, 0)>; 1676*9880d681SAndroid Build Coastguard Worker 1677*9880d681SAndroid Build Coastguard Worker//--- 1678*9880d681SAndroid Build Coastguard Worker// (literal) 1679*9880d681SAndroid Build Coastguard Workerdef LDRWl : LoadLiteral<0b00, 0, GPR32, "ldr">; 1680*9880d681SAndroid Build Coastguard Workerdef LDRXl : LoadLiteral<0b01, 0, GPR64, "ldr">; 1681*9880d681SAndroid Build Coastguard Workerdef LDRSl : LoadLiteral<0b00, 1, FPR32, "ldr">; 1682*9880d681SAndroid Build Coastguard Workerdef LDRDl : LoadLiteral<0b01, 1, FPR64, "ldr">; 1683*9880d681SAndroid Build Coastguard Workerdef LDRQl : LoadLiteral<0b10, 1, FPR128, "ldr">; 1684*9880d681SAndroid Build Coastguard Worker 1685*9880d681SAndroid Build Coastguard Worker// load sign-extended word 1686*9880d681SAndroid Build Coastguard Workerdef LDRSWl : LoadLiteral<0b10, 0, GPR64, "ldrsw">; 1687*9880d681SAndroid Build Coastguard Worker 1688*9880d681SAndroid Build Coastguard Worker// prefetch 1689*9880d681SAndroid Build Coastguard Workerdef PRFMl : PrefetchLiteral<0b11, 0, "prfm", []>; 1690*9880d681SAndroid Build Coastguard Worker// [(AArch64Prefetch imm:$Rt, tglobaladdr:$label)]>; 1691*9880d681SAndroid Build Coastguard Worker 1692*9880d681SAndroid Build Coastguard Worker//--- 1693*9880d681SAndroid Build Coastguard Worker// (unscaled immediate) 1694*9880d681SAndroid Build Coastguard Workerdefm LDURX : LoadUnscaled<0b11, 0, 0b01, GPR64, "ldur", 1695*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rt, 1696*9880d681SAndroid Build Coastguard Worker (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset)))]>; 1697*9880d681SAndroid Build Coastguard Workerdefm LDURW : LoadUnscaled<0b10, 0, 0b01, GPR32, "ldur", 1698*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1699*9880d681SAndroid Build Coastguard Worker (load (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>; 1700*9880d681SAndroid Build Coastguard Workerdefm LDURB : LoadUnscaled<0b00, 1, 0b01, FPR8, "ldur", 1701*9880d681SAndroid Build Coastguard Worker [(set FPR8:$Rt, 1702*9880d681SAndroid Build Coastguard Worker (load (am_unscaled8 GPR64sp:$Rn, simm9:$offset)))]>; 1703*9880d681SAndroid Build Coastguard Workerdefm LDURH : LoadUnscaled<0b01, 1, 0b01, FPR16, "ldur", 1704*9880d681SAndroid Build Coastguard Worker [(set FPR16:$Rt, 1705*9880d681SAndroid Build Coastguard Worker (load (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>; 1706*9880d681SAndroid Build Coastguard Workerdefm LDURS : LoadUnscaled<0b10, 1, 0b01, FPR32, "ldur", 1707*9880d681SAndroid Build Coastguard Worker [(set (f32 FPR32:$Rt), 1708*9880d681SAndroid Build Coastguard Worker (load (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>; 1709*9880d681SAndroid Build Coastguard Workerdefm LDURD : LoadUnscaled<0b11, 1, 0b01, FPR64, "ldur", 1710*9880d681SAndroid Build Coastguard Worker [(set (f64 FPR64:$Rt), 1711*9880d681SAndroid Build Coastguard Worker (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset)))]>; 1712*9880d681SAndroid Build Coastguard Workerdefm LDURQ : LoadUnscaled<0b00, 1, 0b11, FPR128, "ldur", 1713*9880d681SAndroid Build Coastguard Worker [(set (f128 FPR128:$Rt), 1714*9880d681SAndroid Build Coastguard Worker (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset)))]>; 1715*9880d681SAndroid Build Coastguard Worker 1716*9880d681SAndroid Build Coastguard Workerdefm LDURHH 1717*9880d681SAndroid Build Coastguard Worker : LoadUnscaled<0b01, 0, 0b01, GPR32, "ldurh", 1718*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1719*9880d681SAndroid Build Coastguard Worker (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>; 1720*9880d681SAndroid Build Coastguard Workerdefm LDURBB 1721*9880d681SAndroid Build Coastguard Worker : LoadUnscaled<0b00, 0, 0b01, GPR32, "ldurb", 1722*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1723*9880d681SAndroid Build Coastguard Worker (zextloadi8 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>; 1724*9880d681SAndroid Build Coastguard Worker 1725*9880d681SAndroid Build Coastguard Worker// Match all load 64 bits width whose type is compatible with FPR64 1726*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 1727*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f32 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))), 1728*9880d681SAndroid Build Coastguard Worker (LDURDi GPR64sp:$Rn, simm9:$offset)>; 1729*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i32 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))), 1730*9880d681SAndroid Build Coastguard Worker (LDURDi GPR64sp:$Rn, simm9:$offset)>; 1731*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i16 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))), 1732*9880d681SAndroid Build Coastguard Worker (LDURDi GPR64sp:$Rn, simm9:$offset)>; 1733*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i8 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))), 1734*9880d681SAndroid Build Coastguard Worker (LDURDi GPR64sp:$Rn, simm9:$offset)>; 1735*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f16 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))), 1736*9880d681SAndroid Build Coastguard Worker (LDURDi GPR64sp:$Rn, simm9:$offset)>; 1737*9880d681SAndroid Build Coastguard Worker} 1738*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))), 1739*9880d681SAndroid Build Coastguard Worker (LDURDi GPR64sp:$Rn, simm9:$offset)>; 1740*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))), 1741*9880d681SAndroid Build Coastguard Worker (LDURDi GPR64sp:$Rn, simm9:$offset)>; 1742*9880d681SAndroid Build Coastguard Worker 1743*9880d681SAndroid Build Coastguard Worker// Match all load 128 bits width whose type is compatible with FPR128 1744*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 1745*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))), 1746*9880d681SAndroid Build Coastguard Worker (LDURQi GPR64sp:$Rn, simm9:$offset)>; 1747*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))), 1748*9880d681SAndroid Build Coastguard Worker (LDURQi GPR64sp:$Rn, simm9:$offset)>; 1749*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))), 1750*9880d681SAndroid Build Coastguard Worker (LDURQi GPR64sp:$Rn, simm9:$offset)>; 1751*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))), 1752*9880d681SAndroid Build Coastguard Worker (LDURQi GPR64sp:$Rn, simm9:$offset)>; 1753*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i16 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))), 1754*9880d681SAndroid Build Coastguard Worker (LDURQi GPR64sp:$Rn, simm9:$offset)>; 1755*9880d681SAndroid Build Coastguard Worker def : Pat<(v16i8 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))), 1756*9880d681SAndroid Build Coastguard Worker (LDURQi GPR64sp:$Rn, simm9:$offset)>; 1757*9880d681SAndroid Build Coastguard Worker def : Pat<(v8f16 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))), 1758*9880d681SAndroid Build Coastguard Worker (LDURQi GPR64sp:$Rn, simm9:$offset)>; 1759*9880d681SAndroid Build Coastguard Worker} 1760*9880d681SAndroid Build Coastguard Worker 1761*9880d681SAndroid Build Coastguard Worker// anyext -> zext 1762*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))), 1763*9880d681SAndroid Build Coastguard Worker (LDURHHi GPR64sp:$Rn, simm9:$offset)>; 1764*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1765*9880d681SAndroid Build Coastguard Worker (LDURBBi GPR64sp:$Rn, simm9:$offset)>; 1766*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi1 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1767*9880d681SAndroid Build Coastguard Worker (LDURBBi GPR64sp:$Rn, simm9:$offset)>; 1768*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi32 (am_unscaled32 GPR64sp:$Rn, simm9:$offset))), 1769*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURWi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1770*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))), 1771*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURHHi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1772*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1773*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1774*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi1 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1775*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1776*9880d681SAndroid Build Coastguard Worker// unscaled zext 1777*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))), 1778*9880d681SAndroid Build Coastguard Worker (LDURHHi GPR64sp:$Rn, simm9:$offset)>; 1779*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1780*9880d681SAndroid Build Coastguard Worker (LDURBBi GPR64sp:$Rn, simm9:$offset)>; 1781*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zextloadi1 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1782*9880d681SAndroid Build Coastguard Worker (LDURBBi GPR64sp:$Rn, simm9:$offset)>; 1783*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi32 (am_unscaled32 GPR64sp:$Rn, simm9:$offset))), 1784*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURWi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1785*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))), 1786*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURHHi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1787*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1788*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1789*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi1 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1790*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1791*9880d681SAndroid Build Coastguard Worker 1792*9880d681SAndroid Build Coastguard Worker 1793*9880d681SAndroid Build Coastguard Worker//--- 1794*9880d681SAndroid Build Coastguard Worker// LDR mnemonics fall back to LDUR for negative or unaligned offsets. 1795*9880d681SAndroid Build Coastguard Worker 1796*9880d681SAndroid Build Coastguard Worker// Define new assembler match classes as we want to only match these when 1797*9880d681SAndroid Build Coastguard Worker// the don't otherwise match the scaled addressing mode for LDR/STR. Don't 1798*9880d681SAndroid Build Coastguard Worker// associate a DiagnosticType either, as we want the diagnostic for the 1799*9880d681SAndroid Build Coastguard Worker// canonical form (the scaled operand) to take precedence. 1800*9880d681SAndroid Build Coastguard Workerclass SImm9OffsetOperand<int Width> : AsmOperandClass { 1801*9880d681SAndroid Build Coastguard Worker let Name = "SImm9OffsetFB" # Width; 1802*9880d681SAndroid Build Coastguard Worker let PredicateMethod = "isSImm9OffsetFB<" # Width # ">"; 1803*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands"; 1804*9880d681SAndroid Build Coastguard Worker} 1805*9880d681SAndroid Build Coastguard Worker 1806*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB8Operand : SImm9OffsetOperand<8>; 1807*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB16Operand : SImm9OffsetOperand<16>; 1808*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB32Operand : SImm9OffsetOperand<32>; 1809*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB64Operand : SImm9OffsetOperand<64>; 1810*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB128Operand : SImm9OffsetOperand<128>; 1811*9880d681SAndroid Build Coastguard Worker 1812*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb8 : Operand<i64> { 1813*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm9OffsetFB8Operand; 1814*9880d681SAndroid Build Coastguard Worker} 1815*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb16 : Operand<i64> { 1816*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm9OffsetFB16Operand; 1817*9880d681SAndroid Build Coastguard Worker} 1818*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb32 : Operand<i64> { 1819*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm9OffsetFB32Operand; 1820*9880d681SAndroid Build Coastguard Worker} 1821*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb64 : Operand<i64> { 1822*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm9OffsetFB64Operand; 1823*9880d681SAndroid Build Coastguard Worker} 1824*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb128 : Operand<i64> { 1825*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = SImm9OffsetFB128Operand; 1826*9880d681SAndroid Build Coastguard Worker} 1827*9880d681SAndroid Build Coastguard Worker 1828*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]", 1829*9880d681SAndroid Build Coastguard Worker (LDURXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>; 1830*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]", 1831*9880d681SAndroid Build Coastguard Worker (LDURWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>; 1832*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]", 1833*9880d681SAndroid Build Coastguard Worker (LDURBi FPR8:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>; 1834*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]", 1835*9880d681SAndroid Build Coastguard Worker (LDURHi FPR16:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>; 1836*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]", 1837*9880d681SAndroid Build Coastguard Worker (LDURSi FPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>; 1838*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]", 1839*9880d681SAndroid Build Coastguard Worker (LDURDi FPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>; 1840*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]", 1841*9880d681SAndroid Build Coastguard Worker (LDURQi FPR128:$Rt, GPR64sp:$Rn, simm9_offset_fb128:$offset), 0>; 1842*9880d681SAndroid Build Coastguard Worker 1843*9880d681SAndroid Build Coastguard Worker// zextload -> i64 1844*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))), 1845*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1846*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))), 1847*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), (LDURHHi GPR64sp:$Rn, simm9:$offset), sub_32)>; 1848*9880d681SAndroid Build Coastguard Worker 1849*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word 1850*9880d681SAndroid Build Coastguard Workerdefm LDURSHW 1851*9880d681SAndroid Build Coastguard Worker : LoadUnscaled<0b01, 0, 0b11, GPR32, "ldursh", 1852*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1853*9880d681SAndroid Build Coastguard Worker (sextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>; 1854*9880d681SAndroid Build Coastguard Workerdefm LDURSHX 1855*9880d681SAndroid Build Coastguard Worker : LoadUnscaled<0b01, 0, 0b10, GPR64, "ldursh", 1856*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rt, 1857*9880d681SAndroid Build Coastguard Worker (sextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>; 1858*9880d681SAndroid Build Coastguard Worker 1859*9880d681SAndroid Build Coastguard Worker// load sign-extended byte 1860*9880d681SAndroid Build Coastguard Workerdefm LDURSBW 1861*9880d681SAndroid Build Coastguard Worker : LoadUnscaled<0b00, 0, 0b11, GPR32, "ldursb", 1862*9880d681SAndroid Build Coastguard Worker [(set GPR32:$Rt, 1863*9880d681SAndroid Build Coastguard Worker (sextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset)))]>; 1864*9880d681SAndroid Build Coastguard Workerdefm LDURSBX 1865*9880d681SAndroid Build Coastguard Worker : LoadUnscaled<0b00, 0, 0b10, GPR64, "ldursb", 1866*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rt, 1867*9880d681SAndroid Build Coastguard Worker (sextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset)))]>; 1868*9880d681SAndroid Build Coastguard Worker 1869*9880d681SAndroid Build Coastguard Worker// load sign-extended word 1870*9880d681SAndroid Build Coastguard Workerdefm LDURSW 1871*9880d681SAndroid Build Coastguard Worker : LoadUnscaled<0b10, 0, 0b10, GPR64, "ldursw", 1872*9880d681SAndroid Build Coastguard Worker [(set GPR64:$Rt, 1873*9880d681SAndroid Build Coastguard Worker (sextloadi32 (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>; 1874*9880d681SAndroid Build Coastguard Worker 1875*9880d681SAndroid Build Coastguard Worker// zero and sign extending aliases from generic LDR* mnemonics to LDUR*. 1876*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrb $Rt, [$Rn, $offset]", 1877*9880d681SAndroid Build Coastguard Worker (LDURBBi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>; 1878*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrh $Rt, [$Rn, $offset]", 1879*9880d681SAndroid Build Coastguard Worker (LDURHHi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>; 1880*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsb $Rt, [$Rn, $offset]", 1881*9880d681SAndroid Build Coastguard Worker (LDURSBWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>; 1882*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsb $Rt, [$Rn, $offset]", 1883*9880d681SAndroid Build Coastguard Worker (LDURSBXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>; 1884*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsh $Rt, [$Rn, $offset]", 1885*9880d681SAndroid Build Coastguard Worker (LDURSHWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>; 1886*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsh $Rt, [$Rn, $offset]", 1887*9880d681SAndroid Build Coastguard Worker (LDURSHXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>; 1888*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsw $Rt, [$Rn, $offset]", 1889*9880d681SAndroid Build Coastguard Worker (LDURSWi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>; 1890*9880d681SAndroid Build Coastguard Worker 1891*9880d681SAndroid Build Coastguard Worker// Pre-fetch. 1892*9880d681SAndroid Build Coastguard Workerdefm PRFUM : PrefetchUnscaled<0b11, 0, 0b10, "prfum", 1893*9880d681SAndroid Build Coastguard Worker [(AArch64Prefetch imm:$Rt, 1894*9880d681SAndroid Build Coastguard Worker (am_unscaled64 GPR64sp:$Rn, simm9:$offset))]>; 1895*9880d681SAndroid Build Coastguard Worker 1896*9880d681SAndroid Build Coastguard Worker//--- 1897*9880d681SAndroid Build Coastguard Worker// (unscaled immediate, unprivileged) 1898*9880d681SAndroid Build Coastguard Workerdefm LDTRX : LoadUnprivileged<0b11, 0, 0b01, GPR64, "ldtr">; 1899*9880d681SAndroid Build Coastguard Workerdefm LDTRW : LoadUnprivileged<0b10, 0, 0b01, GPR32, "ldtr">; 1900*9880d681SAndroid Build Coastguard Worker 1901*9880d681SAndroid Build Coastguard Workerdefm LDTRH : LoadUnprivileged<0b01, 0, 0b01, GPR32, "ldtrh">; 1902*9880d681SAndroid Build Coastguard Workerdefm LDTRB : LoadUnprivileged<0b00, 0, 0b01, GPR32, "ldtrb">; 1903*9880d681SAndroid Build Coastguard Worker 1904*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word 1905*9880d681SAndroid Build Coastguard Workerdefm LDTRSHW : LoadUnprivileged<0b01, 0, 0b11, GPR32, "ldtrsh">; 1906*9880d681SAndroid Build Coastguard Workerdefm LDTRSHX : LoadUnprivileged<0b01, 0, 0b10, GPR64, "ldtrsh">; 1907*9880d681SAndroid Build Coastguard Worker 1908*9880d681SAndroid Build Coastguard Worker// load sign-extended byte 1909*9880d681SAndroid Build Coastguard Workerdefm LDTRSBW : LoadUnprivileged<0b00, 0, 0b11, GPR32, "ldtrsb">; 1910*9880d681SAndroid Build Coastguard Workerdefm LDTRSBX : LoadUnprivileged<0b00, 0, 0b10, GPR64, "ldtrsb">; 1911*9880d681SAndroid Build Coastguard Worker 1912*9880d681SAndroid Build Coastguard Worker// load sign-extended word 1913*9880d681SAndroid Build Coastguard Workerdefm LDTRSW : LoadUnprivileged<0b10, 0, 0b10, GPR64, "ldtrsw">; 1914*9880d681SAndroid Build Coastguard Worker 1915*9880d681SAndroid Build Coastguard Worker//--- 1916*9880d681SAndroid Build Coastguard Worker// (immediate pre-indexed) 1917*9880d681SAndroid Build Coastguard Workerdef LDRWpre : LoadPreIdx<0b10, 0, 0b01, GPR32, "ldr">; 1918*9880d681SAndroid Build Coastguard Workerdef LDRXpre : LoadPreIdx<0b11, 0, 0b01, GPR64, "ldr">; 1919*9880d681SAndroid Build Coastguard Workerdef LDRBpre : LoadPreIdx<0b00, 1, 0b01, FPR8, "ldr">; 1920*9880d681SAndroid Build Coastguard Workerdef LDRHpre : LoadPreIdx<0b01, 1, 0b01, FPR16, "ldr">; 1921*9880d681SAndroid Build Coastguard Workerdef LDRSpre : LoadPreIdx<0b10, 1, 0b01, FPR32, "ldr">; 1922*9880d681SAndroid Build Coastguard Workerdef LDRDpre : LoadPreIdx<0b11, 1, 0b01, FPR64, "ldr">; 1923*9880d681SAndroid Build Coastguard Workerdef LDRQpre : LoadPreIdx<0b00, 1, 0b11, FPR128, "ldr">; 1924*9880d681SAndroid Build Coastguard Worker 1925*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word 1926*9880d681SAndroid Build Coastguard Workerdef LDRSHWpre : LoadPreIdx<0b01, 0, 0b11, GPR32, "ldrsh">; 1927*9880d681SAndroid Build Coastguard Workerdef LDRSHXpre : LoadPreIdx<0b01, 0, 0b10, GPR64, "ldrsh">; 1928*9880d681SAndroid Build Coastguard Worker 1929*9880d681SAndroid Build Coastguard Worker// load sign-extended byte 1930*9880d681SAndroid Build Coastguard Workerdef LDRSBWpre : LoadPreIdx<0b00, 0, 0b11, GPR32, "ldrsb">; 1931*9880d681SAndroid Build Coastguard Workerdef LDRSBXpre : LoadPreIdx<0b00, 0, 0b10, GPR64, "ldrsb">; 1932*9880d681SAndroid Build Coastguard Worker 1933*9880d681SAndroid Build Coastguard Worker// load zero-extended byte 1934*9880d681SAndroid Build Coastguard Workerdef LDRBBpre : LoadPreIdx<0b00, 0, 0b01, GPR32, "ldrb">; 1935*9880d681SAndroid Build Coastguard Workerdef LDRHHpre : LoadPreIdx<0b01, 0, 0b01, GPR32, "ldrh">; 1936*9880d681SAndroid Build Coastguard Worker 1937*9880d681SAndroid Build Coastguard Worker// load sign-extended word 1938*9880d681SAndroid Build Coastguard Workerdef LDRSWpre : LoadPreIdx<0b10, 0, 0b10, GPR64, "ldrsw">; 1939*9880d681SAndroid Build Coastguard Worker 1940*9880d681SAndroid Build Coastguard Worker//--- 1941*9880d681SAndroid Build Coastguard Worker// (immediate post-indexed) 1942*9880d681SAndroid Build Coastguard Workerdef LDRWpost : LoadPostIdx<0b10, 0, 0b01, GPR32, "ldr">; 1943*9880d681SAndroid Build Coastguard Workerdef LDRXpost : LoadPostIdx<0b11, 0, 0b01, GPR64, "ldr">; 1944*9880d681SAndroid Build Coastguard Workerdef LDRBpost : LoadPostIdx<0b00, 1, 0b01, FPR8, "ldr">; 1945*9880d681SAndroid Build Coastguard Workerdef LDRHpost : LoadPostIdx<0b01, 1, 0b01, FPR16, "ldr">; 1946*9880d681SAndroid Build Coastguard Workerdef LDRSpost : LoadPostIdx<0b10, 1, 0b01, FPR32, "ldr">; 1947*9880d681SAndroid Build Coastguard Workerdef LDRDpost : LoadPostIdx<0b11, 1, 0b01, FPR64, "ldr">; 1948*9880d681SAndroid Build Coastguard Workerdef LDRQpost : LoadPostIdx<0b00, 1, 0b11, FPR128, "ldr">; 1949*9880d681SAndroid Build Coastguard Worker 1950*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word 1951*9880d681SAndroid Build Coastguard Workerdef LDRSHWpost : LoadPostIdx<0b01, 0, 0b11, GPR32, "ldrsh">; 1952*9880d681SAndroid Build Coastguard Workerdef LDRSHXpost : LoadPostIdx<0b01, 0, 0b10, GPR64, "ldrsh">; 1953*9880d681SAndroid Build Coastguard Worker 1954*9880d681SAndroid Build Coastguard Worker// load sign-extended byte 1955*9880d681SAndroid Build Coastguard Workerdef LDRSBWpost : LoadPostIdx<0b00, 0, 0b11, GPR32, "ldrsb">; 1956*9880d681SAndroid Build Coastguard Workerdef LDRSBXpost : LoadPostIdx<0b00, 0, 0b10, GPR64, "ldrsb">; 1957*9880d681SAndroid Build Coastguard Worker 1958*9880d681SAndroid Build Coastguard Worker// load zero-extended byte 1959*9880d681SAndroid Build Coastguard Workerdef LDRBBpost : LoadPostIdx<0b00, 0, 0b01, GPR32, "ldrb">; 1960*9880d681SAndroid Build Coastguard Workerdef LDRHHpost : LoadPostIdx<0b01, 0, 0b01, GPR32, "ldrh">; 1961*9880d681SAndroid Build Coastguard Worker 1962*9880d681SAndroid Build Coastguard Worker// load sign-extended word 1963*9880d681SAndroid Build Coastguard Workerdef LDRSWpost : LoadPostIdx<0b10, 0, 0b10, GPR64, "ldrsw">; 1964*9880d681SAndroid Build Coastguard Worker 1965*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1966*9880d681SAndroid Build Coastguard Worker// Store instructions. 1967*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1968*9880d681SAndroid Build Coastguard Worker 1969*9880d681SAndroid Build Coastguard Worker// Pair (indexed, offset) 1970*9880d681SAndroid Build Coastguard Worker// FIXME: Use dedicated range-checked addressing mode operand here. 1971*9880d681SAndroid Build Coastguard Workerdefm STPW : StorePairOffset<0b00, 0, GPR32, simm7s4, "stp">; 1972*9880d681SAndroid Build Coastguard Workerdefm STPX : StorePairOffset<0b10, 0, GPR64, simm7s8, "stp">; 1973*9880d681SAndroid Build Coastguard Workerdefm STPS : StorePairOffset<0b00, 1, FPR32, simm7s4, "stp">; 1974*9880d681SAndroid Build Coastguard Workerdefm STPD : StorePairOffset<0b01, 1, FPR64, simm7s8, "stp">; 1975*9880d681SAndroid Build Coastguard Workerdefm STPQ : StorePairOffset<0b10, 1, FPR128, simm7s16, "stp">; 1976*9880d681SAndroid Build Coastguard Worker 1977*9880d681SAndroid Build Coastguard Worker// Pair (pre-indexed) 1978*9880d681SAndroid Build Coastguard Workerdef STPWpre : StorePairPreIdx<0b00, 0, GPR32, simm7s4, "stp">; 1979*9880d681SAndroid Build Coastguard Workerdef STPXpre : StorePairPreIdx<0b10, 0, GPR64, simm7s8, "stp">; 1980*9880d681SAndroid Build Coastguard Workerdef STPSpre : StorePairPreIdx<0b00, 1, FPR32, simm7s4, "stp">; 1981*9880d681SAndroid Build Coastguard Workerdef STPDpre : StorePairPreIdx<0b01, 1, FPR64, simm7s8, "stp">; 1982*9880d681SAndroid Build Coastguard Workerdef STPQpre : StorePairPreIdx<0b10, 1, FPR128, simm7s16, "stp">; 1983*9880d681SAndroid Build Coastguard Worker 1984*9880d681SAndroid Build Coastguard Worker// Pair (pre-indexed) 1985*9880d681SAndroid Build Coastguard Workerdef STPWpost : StorePairPostIdx<0b00, 0, GPR32, simm7s4, "stp">; 1986*9880d681SAndroid Build Coastguard Workerdef STPXpost : StorePairPostIdx<0b10, 0, GPR64, simm7s8, "stp">; 1987*9880d681SAndroid Build Coastguard Workerdef STPSpost : StorePairPostIdx<0b00, 1, FPR32, simm7s4, "stp">; 1988*9880d681SAndroid Build Coastguard Workerdef STPDpost : StorePairPostIdx<0b01, 1, FPR64, simm7s8, "stp">; 1989*9880d681SAndroid Build Coastguard Workerdef STPQpost : StorePairPostIdx<0b10, 1, FPR128, simm7s16, "stp">; 1990*9880d681SAndroid Build Coastguard Worker 1991*9880d681SAndroid Build Coastguard Worker// Pair (no allocate) 1992*9880d681SAndroid Build Coastguard Workerdefm STNPW : StorePairNoAlloc<0b00, 0, GPR32, simm7s4, "stnp">; 1993*9880d681SAndroid Build Coastguard Workerdefm STNPX : StorePairNoAlloc<0b10, 0, GPR64, simm7s8, "stnp">; 1994*9880d681SAndroid Build Coastguard Workerdefm STNPS : StorePairNoAlloc<0b00, 1, FPR32, simm7s4, "stnp">; 1995*9880d681SAndroid Build Coastguard Workerdefm STNPD : StorePairNoAlloc<0b01, 1, FPR64, simm7s8, "stnp">; 1996*9880d681SAndroid Build Coastguard Workerdefm STNPQ : StorePairNoAlloc<0b10, 1, FPR128, simm7s16, "stnp">; 1997*9880d681SAndroid Build Coastguard Worker 1998*9880d681SAndroid Build Coastguard Worker//--- 1999*9880d681SAndroid Build Coastguard Worker// (Register offset) 2000*9880d681SAndroid Build Coastguard Worker 2001*9880d681SAndroid Build Coastguard Worker// Integer 2002*9880d681SAndroid Build Coastguard Workerdefm STRBB : Store8RO< 0b00, 0, 0b00, GPR32, "strb", i32, truncstorei8>; 2003*9880d681SAndroid Build Coastguard Workerdefm STRHH : Store16RO<0b01, 0, 0b00, GPR32, "strh", i32, truncstorei16>; 2004*9880d681SAndroid Build Coastguard Workerdefm STRW : Store32RO<0b10, 0, 0b00, GPR32, "str", i32, store>; 2005*9880d681SAndroid Build Coastguard Workerdefm STRX : Store64RO<0b11, 0, 0b00, GPR64, "str", i64, store>; 2006*9880d681SAndroid Build Coastguard Worker 2007*9880d681SAndroid Build Coastguard Worker 2008*9880d681SAndroid Build Coastguard Worker// Floating-point 2009*9880d681SAndroid Build Coastguard Workerdefm STRB : Store8RO< 0b00, 1, 0b00, FPR8, "str", untyped, store>; 2010*9880d681SAndroid Build Coastguard Workerdefm STRH : Store16RO<0b01, 1, 0b00, FPR16, "str", f16, store>; 2011*9880d681SAndroid Build Coastguard Workerdefm STRS : Store32RO<0b10, 1, 0b00, FPR32, "str", f32, store>; 2012*9880d681SAndroid Build Coastguard Workerdefm STRD : Store64RO<0b11, 1, 0b00, FPR64, "str", f64, store>; 2013*9880d681SAndroid Build Coastguard Workerdefm STRQ : Store128RO<0b00, 1, 0b10, FPR128, "str", f128, store>; 2014*9880d681SAndroid Build Coastguard Worker 2015*9880d681SAndroid Build Coastguard Workermulticlass TruncStoreFrom64ROPat<ROAddrMode ro, SDPatternOperator storeop, 2016*9880d681SAndroid Build Coastguard Worker Instruction STRW, Instruction STRX> { 2017*9880d681SAndroid Build Coastguard Worker 2018*9880d681SAndroid Build Coastguard Worker def : Pat<(storeop GPR64:$Rt, 2019*9880d681SAndroid Build Coastguard Worker (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)), 2020*9880d681SAndroid Build Coastguard Worker (STRW (EXTRACT_SUBREG GPR64:$Rt, sub_32), 2021*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>; 2022*9880d681SAndroid Build Coastguard Worker 2023*9880d681SAndroid Build Coastguard Worker def : Pat<(storeop GPR64:$Rt, 2024*9880d681SAndroid Build Coastguard Worker (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)), 2025*9880d681SAndroid Build Coastguard Worker (STRX (EXTRACT_SUBREG GPR64:$Rt, sub_32), 2026*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>; 2027*9880d681SAndroid Build Coastguard Worker} 2028*9880d681SAndroid Build Coastguard Worker 2029*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in { 2030*9880d681SAndroid Build Coastguard Worker // truncstore i64 2031*9880d681SAndroid Build Coastguard Worker defm : TruncStoreFrom64ROPat<ro8, truncstorei8, STRBBroW, STRBBroX>; 2032*9880d681SAndroid Build Coastguard Worker defm : TruncStoreFrom64ROPat<ro16, truncstorei16, STRHHroW, STRHHroX>; 2033*9880d681SAndroid Build Coastguard Worker defm : TruncStoreFrom64ROPat<ro32, truncstorei32, STRWroW, STRWroX>; 2034*9880d681SAndroid Build Coastguard Worker} 2035*9880d681SAndroid Build Coastguard Worker 2036*9880d681SAndroid Build Coastguard Workermulticlass VecROStorePat<ROAddrMode ro, ValueType VecTy, RegisterClass FPR, 2037*9880d681SAndroid Build Coastguard Worker Instruction STRW, Instruction STRX> { 2038*9880d681SAndroid Build Coastguard Worker def : Pat<(store (VecTy FPR:$Rt), 2039*9880d681SAndroid Build Coastguard Worker (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)), 2040*9880d681SAndroid Build Coastguard Worker (STRW FPR:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>; 2041*9880d681SAndroid Build Coastguard Worker 2042*9880d681SAndroid Build Coastguard Worker def : Pat<(store (VecTy FPR:$Rt), 2043*9880d681SAndroid Build Coastguard Worker (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)), 2044*9880d681SAndroid Build Coastguard Worker (STRX FPR:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>; 2045*9880d681SAndroid Build Coastguard Worker} 2046*9880d681SAndroid Build Coastguard Worker 2047*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in { 2048*9880d681SAndroid Build Coastguard Worker// Match all store 64 bits width whose type is compatible with FPR64 2049*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 2050*9880d681SAndroid Build Coastguard Worker // We must use ST1 to store vectors in big-endian. 2051*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro64, v2i32, FPR64, STRDroW, STRDroX>; 2052*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro64, v2f32, FPR64, STRDroW, STRDroX>; 2053*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro64, v4i16, FPR64, STRDroW, STRDroX>; 2054*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro64, v8i8, FPR64, STRDroW, STRDroX>; 2055*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro64, v4f16, FPR64, STRDroW, STRDroX>; 2056*9880d681SAndroid Build Coastguard Worker} 2057*9880d681SAndroid Build Coastguard Worker 2058*9880d681SAndroid Build Coastguard Workerdefm : VecROStorePat<ro64, v1i64, FPR64, STRDroW, STRDroX>; 2059*9880d681SAndroid Build Coastguard Workerdefm : VecROStorePat<ro64, v1f64, FPR64, STRDroW, STRDroX>; 2060*9880d681SAndroid Build Coastguard Worker 2061*9880d681SAndroid Build Coastguard Worker// Match all store 128 bits width whose type is compatible with FPR128 2062*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 2063*9880d681SAndroid Build Coastguard Worker // We must use ST1 to store vectors in big-endian. 2064*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro128, v2i64, FPR128, STRQroW, STRQroX>; 2065*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro128, v2f64, FPR128, STRQroW, STRQroX>; 2066*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro128, v4i32, FPR128, STRQroW, STRQroX>; 2067*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro128, v4f32, FPR128, STRQroW, STRQroX>; 2068*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro128, v8i16, FPR128, STRQroW, STRQroX>; 2069*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro128, v16i8, FPR128, STRQroW, STRQroX>; 2070*9880d681SAndroid Build Coastguard Worker defm : VecROStorePat<ro128, v8f16, FPR128, STRQroW, STRQroX>; 2071*9880d681SAndroid Build Coastguard Worker} 2072*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 10 2073*9880d681SAndroid Build Coastguard Worker 2074*9880d681SAndroid Build Coastguard Worker// Match stores from lane 0 to the appropriate subreg's store. 2075*9880d681SAndroid Build Coastguard Workermulticlass VecROStoreLane0Pat<ROAddrMode ro, SDPatternOperator storeop, 2076*9880d681SAndroid Build Coastguard Worker ValueType VecTy, ValueType STy, 2077*9880d681SAndroid Build Coastguard Worker SubRegIndex SubRegIdx, 2078*9880d681SAndroid Build Coastguard Worker Instruction STRW, Instruction STRX> { 2079*9880d681SAndroid Build Coastguard Worker 2080*9880d681SAndroid Build Coastguard Worker def : Pat<(storeop (STy (vector_extract (VecTy VecListOne128:$Vt), 0)), 2081*9880d681SAndroid Build Coastguard Worker (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)), 2082*9880d681SAndroid Build Coastguard Worker (STRW (EXTRACT_SUBREG VecListOne128:$Vt, SubRegIdx), 2083*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>; 2084*9880d681SAndroid Build Coastguard Worker 2085*9880d681SAndroid Build Coastguard Worker def : Pat<(storeop (STy (vector_extract (VecTy VecListOne128:$Vt), 0)), 2086*9880d681SAndroid Build Coastguard Worker (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)), 2087*9880d681SAndroid Build Coastguard Worker (STRX (EXTRACT_SUBREG VecListOne128:$Vt, SubRegIdx), 2088*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>; 2089*9880d681SAndroid Build Coastguard Worker} 2090*9880d681SAndroid Build Coastguard Worker 2091*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 19 in { 2092*9880d681SAndroid Build Coastguard Worker defm : VecROStoreLane0Pat<ro16, truncstorei16, v8i16, i32, hsub, STRHroW, STRHroX>; 2093*9880d681SAndroid Build Coastguard Worker defm : VecROStoreLane0Pat<ro16, store , v8i16, i16, hsub, STRHroW, STRHroX>; 2094*9880d681SAndroid Build Coastguard Worker defm : VecROStoreLane0Pat<ro32, truncstorei32, v4i32, i32, ssub, STRSroW, STRSroX>; 2095*9880d681SAndroid Build Coastguard Worker defm : VecROStoreLane0Pat<ro32, store , v4i32, i32, ssub, STRSroW, STRSroX>; 2096*9880d681SAndroid Build Coastguard Worker defm : VecROStoreLane0Pat<ro32, store , v4f32, f32, ssub, STRSroW, STRSroX>; 2097*9880d681SAndroid Build Coastguard Worker defm : VecROStoreLane0Pat<ro64, store , v2i64, i64, dsub, STRDroW, STRDroX>; 2098*9880d681SAndroid Build Coastguard Worker defm : VecROStoreLane0Pat<ro64, store , v2f64, f64, dsub, STRDroW, STRDroX>; 2099*9880d681SAndroid Build Coastguard Worker} 2100*9880d681SAndroid Build Coastguard Worker 2101*9880d681SAndroid Build Coastguard Worker//--- 2102*9880d681SAndroid Build Coastguard Worker// (unsigned immediate) 2103*9880d681SAndroid Build Coastguard Workerdefm STRX : StoreUI<0b11, 0, 0b00, GPR64, uimm12s8, "str", 2104*9880d681SAndroid Build Coastguard Worker [(store GPR64:$Rt, 2105*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))]>; 2106*9880d681SAndroid Build Coastguard Workerdefm STRW : StoreUI<0b10, 0, 0b00, GPR32, uimm12s4, "str", 2107*9880d681SAndroid Build Coastguard Worker [(store GPR32:$Rt, 2108*9880d681SAndroid Build Coastguard Worker (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))]>; 2109*9880d681SAndroid Build Coastguard Workerdefm STRB : StoreUI<0b00, 1, 0b00, FPR8, uimm12s1, "str", 2110*9880d681SAndroid Build Coastguard Worker [(store FPR8:$Rt, 2111*9880d681SAndroid Build Coastguard Worker (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))]>; 2112*9880d681SAndroid Build Coastguard Workerdefm STRH : StoreUI<0b01, 1, 0b00, FPR16, uimm12s2, "str", 2113*9880d681SAndroid Build Coastguard Worker [(store (f16 FPR16:$Rt), 2114*9880d681SAndroid Build Coastguard Worker (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))]>; 2115*9880d681SAndroid Build Coastguard Workerdefm STRS : StoreUI<0b10, 1, 0b00, FPR32, uimm12s4, "str", 2116*9880d681SAndroid Build Coastguard Worker [(store (f32 FPR32:$Rt), 2117*9880d681SAndroid Build Coastguard Worker (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))]>; 2118*9880d681SAndroid Build Coastguard Workerdefm STRD : StoreUI<0b11, 1, 0b00, FPR64, uimm12s8, "str", 2119*9880d681SAndroid Build Coastguard Worker [(store (f64 FPR64:$Rt), 2120*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))]>; 2121*9880d681SAndroid Build Coastguard Workerdefm STRQ : StoreUI<0b00, 1, 0b10, FPR128, uimm12s16, "str", []>; 2122*9880d681SAndroid Build Coastguard Worker 2123*9880d681SAndroid Build Coastguard Workerdefm STRHH : StoreUI<0b01, 0, 0b00, GPR32, uimm12s2, "strh", 2124*9880d681SAndroid Build Coastguard Worker [(truncstorei16 GPR32:$Rt, 2125*9880d681SAndroid Build Coastguard Worker (am_indexed16 GPR64sp:$Rn, 2126*9880d681SAndroid Build Coastguard Worker uimm12s2:$offset))]>; 2127*9880d681SAndroid Build Coastguard Workerdefm STRBB : StoreUI<0b00, 0, 0b00, GPR32, uimm12s1, "strb", 2128*9880d681SAndroid Build Coastguard Worker [(truncstorei8 GPR32:$Rt, 2129*9880d681SAndroid Build Coastguard Worker (am_indexed8 GPR64sp:$Rn, 2130*9880d681SAndroid Build Coastguard Worker uimm12s1:$offset))]>; 2131*9880d681SAndroid Build Coastguard Worker 2132*9880d681SAndroid Build Coastguard Worker// Match all store 64 bits width whose type is compatible with FPR64 2133*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in { 2134*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 2135*9880d681SAndroid Build Coastguard Worker // We must use ST1 to store vectors in big-endian. 2136*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2f32 FPR64:$Rt), 2137*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)), 2138*9880d681SAndroid Build Coastguard Worker (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>; 2139*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8i8 FPR64:$Rt), 2140*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)), 2141*9880d681SAndroid Build Coastguard Worker (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>; 2142*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4i16 FPR64:$Rt), 2143*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)), 2144*9880d681SAndroid Build Coastguard Worker (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>; 2145*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2i32 FPR64:$Rt), 2146*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)), 2147*9880d681SAndroid Build Coastguard Worker (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>; 2148*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4f16 FPR64:$Rt), 2149*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)), 2150*9880d681SAndroid Build Coastguard Worker (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>; 2151*9880d681SAndroid Build Coastguard Worker} 2152*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (v1f64 FPR64:$Rt), 2153*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)), 2154*9880d681SAndroid Build Coastguard Worker (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>; 2155*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (v1i64 FPR64:$Rt), 2156*9880d681SAndroid Build Coastguard Worker (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)), 2157*9880d681SAndroid Build Coastguard Worker (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>; 2158*9880d681SAndroid Build Coastguard Worker 2159*9880d681SAndroid Build Coastguard Worker// Match all store 128 bits width whose type is compatible with FPR128 2160*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 2161*9880d681SAndroid Build Coastguard Worker // We must use ST1 to store vectors in big-endian. 2162*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4f32 FPR128:$Rt), 2163*9880d681SAndroid Build Coastguard Worker (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)), 2164*9880d681SAndroid Build Coastguard Worker (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>; 2165*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2f64 FPR128:$Rt), 2166*9880d681SAndroid Build Coastguard Worker (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)), 2167*9880d681SAndroid Build Coastguard Worker (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>; 2168*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v16i8 FPR128:$Rt), 2169*9880d681SAndroid Build Coastguard Worker (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)), 2170*9880d681SAndroid Build Coastguard Worker (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>; 2171*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8i16 FPR128:$Rt), 2172*9880d681SAndroid Build Coastguard Worker (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)), 2173*9880d681SAndroid Build Coastguard Worker (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>; 2174*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4i32 FPR128:$Rt), 2175*9880d681SAndroid Build Coastguard Worker (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)), 2176*9880d681SAndroid Build Coastguard Worker (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>; 2177*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2i64 FPR128:$Rt), 2178*9880d681SAndroid Build Coastguard Worker (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)), 2179*9880d681SAndroid Build Coastguard Worker (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>; 2180*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8f16 FPR128:$Rt), 2181*9880d681SAndroid Build Coastguard Worker (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)), 2182*9880d681SAndroid Build Coastguard Worker (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>; 2183*9880d681SAndroid Build Coastguard Worker} 2184*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (f128 FPR128:$Rt), 2185*9880d681SAndroid Build Coastguard Worker (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)), 2186*9880d681SAndroid Build Coastguard Worker (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>; 2187*9880d681SAndroid Build Coastguard Worker 2188*9880d681SAndroid Build Coastguard Worker// truncstore i64 2189*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei32 GPR64:$Rt, 2190*9880d681SAndroid Build Coastguard Worker (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset)), 2191*9880d681SAndroid Build Coastguard Worker (STRWui (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, uimm12s4:$offset)>; 2192*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei16 GPR64:$Rt, 2193*9880d681SAndroid Build Coastguard Worker (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset)), 2194*9880d681SAndroid Build Coastguard Worker (STRHHui (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, uimm12s2:$offset)>; 2195*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei8 GPR64:$Rt, (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset)), 2196*9880d681SAndroid Build Coastguard Worker (STRBBui (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, uimm12s1:$offset)>; 2197*9880d681SAndroid Build Coastguard Worker 2198*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 10 2199*9880d681SAndroid Build Coastguard Worker 2200*9880d681SAndroid Build Coastguard Worker//--- 2201*9880d681SAndroid Build Coastguard Worker// (unscaled immediate) 2202*9880d681SAndroid Build Coastguard Workerdefm STURX : StoreUnscaled<0b11, 0, 0b00, GPR64, "stur", 2203*9880d681SAndroid Build Coastguard Worker [(store GPR64:$Rt, 2204*9880d681SAndroid Build Coastguard Worker (am_unscaled64 GPR64sp:$Rn, simm9:$offset))]>; 2205*9880d681SAndroid Build Coastguard Workerdefm STURW : StoreUnscaled<0b10, 0, 0b00, GPR32, "stur", 2206*9880d681SAndroid Build Coastguard Worker [(store GPR32:$Rt, 2207*9880d681SAndroid Build Coastguard Worker (am_unscaled32 GPR64sp:$Rn, simm9:$offset))]>; 2208*9880d681SAndroid Build Coastguard Workerdefm STURB : StoreUnscaled<0b00, 1, 0b00, FPR8, "stur", 2209*9880d681SAndroid Build Coastguard Worker [(store FPR8:$Rt, 2210*9880d681SAndroid Build Coastguard Worker (am_unscaled8 GPR64sp:$Rn, simm9:$offset))]>; 2211*9880d681SAndroid Build Coastguard Workerdefm STURH : StoreUnscaled<0b01, 1, 0b00, FPR16, "stur", 2212*9880d681SAndroid Build Coastguard Worker [(store (f16 FPR16:$Rt), 2213*9880d681SAndroid Build Coastguard Worker (am_unscaled16 GPR64sp:$Rn, simm9:$offset))]>; 2214*9880d681SAndroid Build Coastguard Workerdefm STURS : StoreUnscaled<0b10, 1, 0b00, FPR32, "stur", 2215*9880d681SAndroid Build Coastguard Worker [(store (f32 FPR32:$Rt), 2216*9880d681SAndroid Build Coastguard Worker (am_unscaled32 GPR64sp:$Rn, simm9:$offset))]>; 2217*9880d681SAndroid Build Coastguard Workerdefm STURD : StoreUnscaled<0b11, 1, 0b00, FPR64, "stur", 2218*9880d681SAndroid Build Coastguard Worker [(store (f64 FPR64:$Rt), 2219*9880d681SAndroid Build Coastguard Worker (am_unscaled64 GPR64sp:$Rn, simm9:$offset))]>; 2220*9880d681SAndroid Build Coastguard Workerdefm STURQ : StoreUnscaled<0b00, 1, 0b10, FPR128, "stur", 2221*9880d681SAndroid Build Coastguard Worker [(store (f128 FPR128:$Rt), 2222*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset))]>; 2223*9880d681SAndroid Build Coastguard Workerdefm STURHH : StoreUnscaled<0b01, 0, 0b00, GPR32, "sturh", 2224*9880d681SAndroid Build Coastguard Worker [(truncstorei16 GPR32:$Rt, 2225*9880d681SAndroid Build Coastguard Worker (am_unscaled16 GPR64sp:$Rn, simm9:$offset))]>; 2226*9880d681SAndroid Build Coastguard Workerdefm STURBB : StoreUnscaled<0b00, 0, 0b00, GPR32, "sturb", 2227*9880d681SAndroid Build Coastguard Worker [(truncstorei8 GPR32:$Rt, 2228*9880d681SAndroid Build Coastguard Worker (am_unscaled8 GPR64sp:$Rn, simm9:$offset))]>; 2229*9880d681SAndroid Build Coastguard Worker 2230*9880d681SAndroid Build Coastguard Worker// Match all store 64 bits width whose type is compatible with FPR64 2231*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 2232*9880d681SAndroid Build Coastguard Worker // We must use ST1 to store vectors in big-endian. 2233*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2f32 FPR64:$Rt), 2234*9880d681SAndroid Build Coastguard Worker (am_unscaled64 GPR64sp:$Rn, simm9:$offset)), 2235*9880d681SAndroid Build Coastguard Worker (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2236*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8i8 FPR64:$Rt), 2237*9880d681SAndroid Build Coastguard Worker (am_unscaled64 GPR64sp:$Rn, simm9:$offset)), 2238*9880d681SAndroid Build Coastguard Worker (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2239*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4i16 FPR64:$Rt), 2240*9880d681SAndroid Build Coastguard Worker (am_unscaled64 GPR64sp:$Rn, simm9:$offset)), 2241*9880d681SAndroid Build Coastguard Worker (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2242*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2i32 FPR64:$Rt), 2243*9880d681SAndroid Build Coastguard Worker (am_unscaled64 GPR64sp:$Rn, simm9:$offset)), 2244*9880d681SAndroid Build Coastguard Worker (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2245*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4f16 FPR64:$Rt), 2246*9880d681SAndroid Build Coastguard Worker (am_unscaled64 GPR64sp:$Rn, simm9:$offset)), 2247*9880d681SAndroid Build Coastguard Worker (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2248*9880d681SAndroid Build Coastguard Worker} 2249*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (v1f64 FPR64:$Rt), (am_unscaled64 GPR64sp:$Rn, simm9:$offset)), 2250*9880d681SAndroid Build Coastguard Worker (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2251*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (v1i64 FPR64:$Rt), (am_unscaled64 GPR64sp:$Rn, simm9:$offset)), 2252*9880d681SAndroid Build Coastguard Worker (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2253*9880d681SAndroid Build Coastguard Worker 2254*9880d681SAndroid Build Coastguard Worker// Match all store 128 bits width whose type is compatible with FPR128 2255*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 2256*9880d681SAndroid Build Coastguard Worker // We must use ST1 to store vectors in big-endian. 2257*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4f32 FPR128:$Rt), 2258*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset)), 2259*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2260*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2f64 FPR128:$Rt), 2261*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset)), 2262*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2263*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v16i8 FPR128:$Rt), 2264*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset)), 2265*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2266*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8i16 FPR128:$Rt), 2267*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset)), 2268*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2269*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v4i32 FPR128:$Rt), 2270*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset)), 2271*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2272*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2i64 FPR128:$Rt), 2273*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset)), 2274*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2275*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v2f64 FPR128:$Rt), 2276*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset)), 2277*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2278*9880d681SAndroid Build Coastguard Worker def : Pat<(store (v8f16 FPR128:$Rt), 2279*9880d681SAndroid Build Coastguard Worker (am_unscaled128 GPR64sp:$Rn, simm9:$offset)), 2280*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>; 2281*9880d681SAndroid Build Coastguard Worker} 2282*9880d681SAndroid Build Coastguard Worker 2283*9880d681SAndroid Build Coastguard Worker// unscaled i64 truncating stores 2284*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei32 GPR64:$Rt, (am_unscaled32 GPR64sp:$Rn, simm9:$offset)), 2285*9880d681SAndroid Build Coastguard Worker (STURWi (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, simm9:$offset)>; 2286*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei16 GPR64:$Rt, (am_unscaled16 GPR64sp:$Rn, simm9:$offset)), 2287*9880d681SAndroid Build Coastguard Worker (STURHHi (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, simm9:$offset)>; 2288*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei8 GPR64:$Rt, (am_unscaled8 GPR64sp:$Rn, simm9:$offset)), 2289*9880d681SAndroid Build Coastguard Worker (STURBBi (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, simm9:$offset)>; 2290*9880d681SAndroid Build Coastguard Worker 2291*9880d681SAndroid Build Coastguard Worker//--- 2292*9880d681SAndroid Build Coastguard Worker// STR mnemonics fall back to STUR for negative or unaligned offsets. 2293*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]", 2294*9880d681SAndroid Build Coastguard Worker (STURXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>; 2295*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]", 2296*9880d681SAndroid Build Coastguard Worker (STURWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>; 2297*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]", 2298*9880d681SAndroid Build Coastguard Worker (STURBi FPR8:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>; 2299*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]", 2300*9880d681SAndroid Build Coastguard Worker (STURHi FPR16:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>; 2301*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]", 2302*9880d681SAndroid Build Coastguard Worker (STURSi FPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>; 2303*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]", 2304*9880d681SAndroid Build Coastguard Worker (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>; 2305*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]", 2306*9880d681SAndroid Build Coastguard Worker (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9_offset_fb128:$offset), 0>; 2307*9880d681SAndroid Build Coastguard Worker 2308*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"strb $Rt, [$Rn, $offset]", 2309*9880d681SAndroid Build Coastguard Worker (STURBBi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>; 2310*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"strh $Rt, [$Rn, $offset]", 2311*9880d681SAndroid Build Coastguard Worker (STURHHi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>; 2312*9880d681SAndroid Build Coastguard Worker 2313*9880d681SAndroid Build Coastguard Worker//--- 2314*9880d681SAndroid Build Coastguard Worker// (unscaled immediate, unprivileged) 2315*9880d681SAndroid Build Coastguard Workerdefm STTRW : StoreUnprivileged<0b10, 0, 0b00, GPR32, "sttr">; 2316*9880d681SAndroid Build Coastguard Workerdefm STTRX : StoreUnprivileged<0b11, 0, 0b00, GPR64, "sttr">; 2317*9880d681SAndroid Build Coastguard Worker 2318*9880d681SAndroid Build Coastguard Workerdefm STTRH : StoreUnprivileged<0b01, 0, 0b00, GPR32, "sttrh">; 2319*9880d681SAndroid Build Coastguard Workerdefm STTRB : StoreUnprivileged<0b00, 0, 0b00, GPR32, "sttrb">; 2320*9880d681SAndroid Build Coastguard Worker 2321*9880d681SAndroid Build Coastguard Worker//--- 2322*9880d681SAndroid Build Coastguard Worker// (immediate pre-indexed) 2323*9880d681SAndroid Build Coastguard Workerdef STRWpre : StorePreIdx<0b10, 0, 0b00, GPR32, "str", pre_store, i32>; 2324*9880d681SAndroid Build Coastguard Workerdef STRXpre : StorePreIdx<0b11, 0, 0b00, GPR64, "str", pre_store, i64>; 2325*9880d681SAndroid Build Coastguard Workerdef STRBpre : StorePreIdx<0b00, 1, 0b00, FPR8, "str", pre_store, untyped>; 2326*9880d681SAndroid Build Coastguard Workerdef STRHpre : StorePreIdx<0b01, 1, 0b00, FPR16, "str", pre_store, f16>; 2327*9880d681SAndroid Build Coastguard Workerdef STRSpre : StorePreIdx<0b10, 1, 0b00, FPR32, "str", pre_store, f32>; 2328*9880d681SAndroid Build Coastguard Workerdef STRDpre : StorePreIdx<0b11, 1, 0b00, FPR64, "str", pre_store, f64>; 2329*9880d681SAndroid Build Coastguard Workerdef STRQpre : StorePreIdx<0b00, 1, 0b10, FPR128, "str", pre_store, f128>; 2330*9880d681SAndroid Build Coastguard Worker 2331*9880d681SAndroid Build Coastguard Workerdef STRBBpre : StorePreIdx<0b00, 0, 0b00, GPR32, "strb", pre_truncsti8, i32>; 2332*9880d681SAndroid Build Coastguard Workerdef STRHHpre : StorePreIdx<0b01, 0, 0b00, GPR32, "strh", pre_truncsti16, i32>; 2333*9880d681SAndroid Build Coastguard Worker 2334*9880d681SAndroid Build Coastguard Worker// truncstore i64 2335*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti32 GPR64:$Rt, GPR64sp:$addr, simm9:$off), 2336*9880d681SAndroid Build Coastguard Worker (STRWpre (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr, 2337*9880d681SAndroid Build Coastguard Worker simm9:$off)>; 2338*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti16 GPR64:$Rt, GPR64sp:$addr, simm9:$off), 2339*9880d681SAndroid Build Coastguard Worker (STRHHpre (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr, 2340*9880d681SAndroid Build Coastguard Worker simm9:$off)>; 2341*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti8 GPR64:$Rt, GPR64sp:$addr, simm9:$off), 2342*9880d681SAndroid Build Coastguard Worker (STRBBpre (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr, 2343*9880d681SAndroid Build Coastguard Worker simm9:$off)>; 2344*9880d681SAndroid Build Coastguard Worker 2345*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v8i8 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2346*9880d681SAndroid Build Coastguard Worker (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2347*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v4i16 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2348*9880d681SAndroid Build Coastguard Worker (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2349*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v2i32 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2350*9880d681SAndroid Build Coastguard Worker (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2351*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v2f32 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2352*9880d681SAndroid Build Coastguard Worker (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2353*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v1i64 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2354*9880d681SAndroid Build Coastguard Worker (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2355*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v1f64 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2356*9880d681SAndroid Build Coastguard Worker (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2357*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v4f16 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2358*9880d681SAndroid Build Coastguard Worker (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2359*9880d681SAndroid Build Coastguard Worker 2360*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v16i8 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2361*9880d681SAndroid Build Coastguard Worker (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2362*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v8i16 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2363*9880d681SAndroid Build Coastguard Worker (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2364*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v4i32 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2365*9880d681SAndroid Build Coastguard Worker (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2366*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v4f32 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2367*9880d681SAndroid Build Coastguard Worker (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2368*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v2i64 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2369*9880d681SAndroid Build Coastguard Worker (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2370*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v2f64 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2371*9880d681SAndroid Build Coastguard Worker (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2372*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v8f16 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2373*9880d681SAndroid Build Coastguard Worker (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2374*9880d681SAndroid Build Coastguard Worker 2375*9880d681SAndroid Build Coastguard Worker//--- 2376*9880d681SAndroid Build Coastguard Worker// (immediate post-indexed) 2377*9880d681SAndroid Build Coastguard Workerdef STRWpost : StorePostIdx<0b10, 0, 0b00, GPR32, "str", post_store, i32>; 2378*9880d681SAndroid Build Coastguard Workerdef STRXpost : StorePostIdx<0b11, 0, 0b00, GPR64, "str", post_store, i64>; 2379*9880d681SAndroid Build Coastguard Workerdef STRBpost : StorePostIdx<0b00, 1, 0b00, FPR8, "str", post_store, untyped>; 2380*9880d681SAndroid Build Coastguard Workerdef STRHpost : StorePostIdx<0b01, 1, 0b00, FPR16, "str", post_store, f16>; 2381*9880d681SAndroid Build Coastguard Workerdef STRSpost : StorePostIdx<0b10, 1, 0b00, FPR32, "str", post_store, f32>; 2382*9880d681SAndroid Build Coastguard Workerdef STRDpost : StorePostIdx<0b11, 1, 0b00, FPR64, "str", post_store, f64>; 2383*9880d681SAndroid Build Coastguard Workerdef STRQpost : StorePostIdx<0b00, 1, 0b10, FPR128, "str", post_store, f128>; 2384*9880d681SAndroid Build Coastguard Worker 2385*9880d681SAndroid Build Coastguard Workerdef STRBBpost : StorePostIdx<0b00, 0, 0b00, GPR32, "strb", post_truncsti8, i32>; 2386*9880d681SAndroid Build Coastguard Workerdef STRHHpost : StorePostIdx<0b01, 0, 0b00, GPR32, "strh", post_truncsti16, i32>; 2387*9880d681SAndroid Build Coastguard Worker 2388*9880d681SAndroid Build Coastguard Worker// truncstore i64 2389*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_truncsti32 GPR64:$Rt, GPR64sp:$addr, simm9:$off), 2390*9880d681SAndroid Build Coastguard Worker (STRWpost (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr, 2391*9880d681SAndroid Build Coastguard Worker simm9:$off)>; 2392*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_truncsti16 GPR64:$Rt, GPR64sp:$addr, simm9:$off), 2393*9880d681SAndroid Build Coastguard Worker (STRHHpost (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr, 2394*9880d681SAndroid Build Coastguard Worker simm9:$off)>; 2395*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_truncsti8 GPR64:$Rt, GPR64sp:$addr, simm9:$off), 2396*9880d681SAndroid Build Coastguard Worker (STRBBpost (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr, 2397*9880d681SAndroid Build Coastguard Worker simm9:$off)>; 2398*9880d681SAndroid Build Coastguard Worker 2399*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v8i8 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2400*9880d681SAndroid Build Coastguard Worker (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2401*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v4i16 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2402*9880d681SAndroid Build Coastguard Worker (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2403*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v2i32 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2404*9880d681SAndroid Build Coastguard Worker (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2405*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v2f32 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2406*9880d681SAndroid Build Coastguard Worker (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2407*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v1i64 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2408*9880d681SAndroid Build Coastguard Worker (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2409*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v1f64 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2410*9880d681SAndroid Build Coastguard Worker (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2411*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v4f16 FPR64:$Rt), GPR64sp:$addr, simm9:$off), 2412*9880d681SAndroid Build Coastguard Worker (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>; 2413*9880d681SAndroid Build Coastguard Worker 2414*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v16i8 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2415*9880d681SAndroid Build Coastguard Worker (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2416*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v8i16 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2417*9880d681SAndroid Build Coastguard Worker (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2418*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v4i32 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2419*9880d681SAndroid Build Coastguard Worker (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2420*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v4f32 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2421*9880d681SAndroid Build Coastguard Worker (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2422*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v2i64 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2423*9880d681SAndroid Build Coastguard Worker (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2424*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v2f64 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2425*9880d681SAndroid Build Coastguard Worker (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2426*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v8f16 FPR128:$Rt), GPR64sp:$addr, simm9:$off), 2427*9880d681SAndroid Build Coastguard Worker (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>; 2428*9880d681SAndroid Build Coastguard Worker 2429*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2430*9880d681SAndroid Build Coastguard Worker// Load/store exclusive instructions. 2431*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2432*9880d681SAndroid Build Coastguard Worker 2433*9880d681SAndroid Build Coastguard Workerdef LDARW : LoadAcquire <0b10, 1, 1, 0, 1, GPR32, "ldar">; 2434*9880d681SAndroid Build Coastguard Workerdef LDARX : LoadAcquire <0b11, 1, 1, 0, 1, GPR64, "ldar">; 2435*9880d681SAndroid Build Coastguard Workerdef LDARB : LoadAcquire <0b00, 1, 1, 0, 1, GPR32, "ldarb">; 2436*9880d681SAndroid Build Coastguard Workerdef LDARH : LoadAcquire <0b01, 1, 1, 0, 1, GPR32, "ldarh">; 2437*9880d681SAndroid Build Coastguard Worker 2438*9880d681SAndroid Build Coastguard Workerdef LDAXRW : LoadExclusive <0b10, 0, 1, 0, 1, GPR32, "ldaxr">; 2439*9880d681SAndroid Build Coastguard Workerdef LDAXRX : LoadExclusive <0b11, 0, 1, 0, 1, GPR64, "ldaxr">; 2440*9880d681SAndroid Build Coastguard Workerdef LDAXRB : LoadExclusive <0b00, 0, 1, 0, 1, GPR32, "ldaxrb">; 2441*9880d681SAndroid Build Coastguard Workerdef LDAXRH : LoadExclusive <0b01, 0, 1, 0, 1, GPR32, "ldaxrh">; 2442*9880d681SAndroid Build Coastguard Worker 2443*9880d681SAndroid Build Coastguard Workerdef LDXRW : LoadExclusive <0b10, 0, 1, 0, 0, GPR32, "ldxr">; 2444*9880d681SAndroid Build Coastguard Workerdef LDXRX : LoadExclusive <0b11, 0, 1, 0, 0, GPR64, "ldxr">; 2445*9880d681SAndroid Build Coastguard Workerdef LDXRB : LoadExclusive <0b00, 0, 1, 0, 0, GPR32, "ldxrb">; 2446*9880d681SAndroid Build Coastguard Workerdef LDXRH : LoadExclusive <0b01, 0, 1, 0, 0, GPR32, "ldxrh">; 2447*9880d681SAndroid Build Coastguard Worker 2448*9880d681SAndroid Build Coastguard Workerdef STLRW : StoreRelease <0b10, 1, 0, 0, 1, GPR32, "stlr">; 2449*9880d681SAndroid Build Coastguard Workerdef STLRX : StoreRelease <0b11, 1, 0, 0, 1, GPR64, "stlr">; 2450*9880d681SAndroid Build Coastguard Workerdef STLRB : StoreRelease <0b00, 1, 0, 0, 1, GPR32, "stlrb">; 2451*9880d681SAndroid Build Coastguard Workerdef STLRH : StoreRelease <0b01, 1, 0, 0, 1, GPR32, "stlrh">; 2452*9880d681SAndroid Build Coastguard Worker 2453*9880d681SAndroid Build Coastguard Workerdef STLXRW : StoreExclusive<0b10, 0, 0, 0, 1, GPR32, "stlxr">; 2454*9880d681SAndroid Build Coastguard Workerdef STLXRX : StoreExclusive<0b11, 0, 0, 0, 1, GPR64, "stlxr">; 2455*9880d681SAndroid Build Coastguard Workerdef STLXRB : StoreExclusive<0b00, 0, 0, 0, 1, GPR32, "stlxrb">; 2456*9880d681SAndroid Build Coastguard Workerdef STLXRH : StoreExclusive<0b01, 0, 0, 0, 1, GPR32, "stlxrh">; 2457*9880d681SAndroid Build Coastguard Worker 2458*9880d681SAndroid Build Coastguard Workerdef STXRW : StoreExclusive<0b10, 0, 0, 0, 0, GPR32, "stxr">; 2459*9880d681SAndroid Build Coastguard Workerdef STXRX : StoreExclusive<0b11, 0, 0, 0, 0, GPR64, "stxr">; 2460*9880d681SAndroid Build Coastguard Workerdef STXRB : StoreExclusive<0b00, 0, 0, 0, 0, GPR32, "stxrb">; 2461*9880d681SAndroid Build Coastguard Workerdef STXRH : StoreExclusive<0b01, 0, 0, 0, 0, GPR32, "stxrh">; 2462*9880d681SAndroid Build Coastguard Worker 2463*9880d681SAndroid Build Coastguard Workerdef LDAXPW : LoadExclusivePair<0b10, 0, 1, 1, 1, GPR32, "ldaxp">; 2464*9880d681SAndroid Build Coastguard Workerdef LDAXPX : LoadExclusivePair<0b11, 0, 1, 1, 1, GPR64, "ldaxp">; 2465*9880d681SAndroid Build Coastguard Worker 2466*9880d681SAndroid Build Coastguard Workerdef LDXPW : LoadExclusivePair<0b10, 0, 1, 1, 0, GPR32, "ldxp">; 2467*9880d681SAndroid Build Coastguard Workerdef LDXPX : LoadExclusivePair<0b11, 0, 1, 1, 0, GPR64, "ldxp">; 2468*9880d681SAndroid Build Coastguard Worker 2469*9880d681SAndroid Build Coastguard Workerdef STLXPW : StoreExclusivePair<0b10, 0, 0, 1, 1, GPR32, "stlxp">; 2470*9880d681SAndroid Build Coastguard Workerdef STLXPX : StoreExclusivePair<0b11, 0, 0, 1, 1, GPR64, "stlxp">; 2471*9880d681SAndroid Build Coastguard Worker 2472*9880d681SAndroid Build Coastguard Workerdef STXPW : StoreExclusivePair<0b10, 0, 0, 1, 0, GPR32, "stxp">; 2473*9880d681SAndroid Build Coastguard Workerdef STXPX : StoreExclusivePair<0b11, 0, 0, 1, 0, GPR64, "stxp">; 2474*9880d681SAndroid Build Coastguard Worker 2475*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV8_1a] in { 2476*9880d681SAndroid Build Coastguard Worker // v8.1a "Limited Order Region" extension load-acquire instructions 2477*9880d681SAndroid Build Coastguard Worker def LDLARW : LoadAcquire <0b10, 1, 1, 0, 0, GPR32, "ldlar">; 2478*9880d681SAndroid Build Coastguard Worker def LDLARX : LoadAcquire <0b11, 1, 1, 0, 0, GPR64, "ldlar">; 2479*9880d681SAndroid Build Coastguard Worker def LDLARB : LoadAcquire <0b00, 1, 1, 0, 0, GPR32, "ldlarb">; 2480*9880d681SAndroid Build Coastguard Worker def LDLARH : LoadAcquire <0b01, 1, 1, 0, 0, GPR32, "ldlarh">; 2481*9880d681SAndroid Build Coastguard Worker 2482*9880d681SAndroid Build Coastguard Worker // v8.1a "Limited Order Region" extension store-release instructions 2483*9880d681SAndroid Build Coastguard Worker def STLLRW : StoreRelease <0b10, 1, 0, 0, 0, GPR32, "stllr">; 2484*9880d681SAndroid Build Coastguard Worker def STLLRX : StoreRelease <0b11, 1, 0, 0, 0, GPR64, "stllr">; 2485*9880d681SAndroid Build Coastguard Worker def STLLRB : StoreRelease <0b00, 1, 0, 0, 0, GPR32, "stllrb">; 2486*9880d681SAndroid Build Coastguard Worker def STLLRH : StoreRelease <0b01, 1, 0, 0, 0, GPR32, "stllrh">; 2487*9880d681SAndroid Build Coastguard Worker} 2488*9880d681SAndroid Build Coastguard Worker 2489*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2490*9880d681SAndroid Build Coastguard Worker// Scaled floating point to integer conversion instructions. 2491*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2492*9880d681SAndroid Build Coastguard Worker 2493*9880d681SAndroid Build Coastguard Workerdefm FCVTAS : FPToIntegerUnscaled<0b00, 0b100, "fcvtas", int_aarch64_neon_fcvtas>; 2494*9880d681SAndroid Build Coastguard Workerdefm FCVTAU : FPToIntegerUnscaled<0b00, 0b101, "fcvtau", int_aarch64_neon_fcvtau>; 2495*9880d681SAndroid Build Coastguard Workerdefm FCVTMS : FPToIntegerUnscaled<0b10, 0b000, "fcvtms", int_aarch64_neon_fcvtms>; 2496*9880d681SAndroid Build Coastguard Workerdefm FCVTMU : FPToIntegerUnscaled<0b10, 0b001, "fcvtmu", int_aarch64_neon_fcvtmu>; 2497*9880d681SAndroid Build Coastguard Workerdefm FCVTNS : FPToIntegerUnscaled<0b00, 0b000, "fcvtns", int_aarch64_neon_fcvtns>; 2498*9880d681SAndroid Build Coastguard Workerdefm FCVTNU : FPToIntegerUnscaled<0b00, 0b001, "fcvtnu", int_aarch64_neon_fcvtnu>; 2499*9880d681SAndroid Build Coastguard Workerdefm FCVTPS : FPToIntegerUnscaled<0b01, 0b000, "fcvtps", int_aarch64_neon_fcvtps>; 2500*9880d681SAndroid Build Coastguard Workerdefm FCVTPU : FPToIntegerUnscaled<0b01, 0b001, "fcvtpu", int_aarch64_neon_fcvtpu>; 2501*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : FPToIntegerUnscaled<0b11, 0b000, "fcvtzs", fp_to_sint>; 2502*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : FPToIntegerUnscaled<0b11, 0b001, "fcvtzu", fp_to_uint>; 2503*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : FPToIntegerScaled<0b11, 0b000, "fcvtzs", fp_to_sint>; 2504*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : FPToIntegerScaled<0b11, 0b001, "fcvtzu", fp_to_uint>; 2505*9880d681SAndroid Build Coastguard Worker 2506*9880d681SAndroid Build Coastguard Workermulticlass FPToIntegerIntPats<Intrinsic round, string INST> { 2507*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (round f16:$Rn)), (!cast<Instruction>(INST # UWHr) $Rn)>; 2508*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (round f16:$Rn)), (!cast<Instruction>(INST # UXHr) $Rn)>; 2509*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (round f32:$Rn)), (!cast<Instruction>(INST # UWSr) $Rn)>; 2510*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (round f32:$Rn)), (!cast<Instruction>(INST # UXSr) $Rn)>; 2511*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (round f64:$Rn)), (!cast<Instruction>(INST # UWDr) $Rn)>; 2512*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (round f64:$Rn)), (!cast<Instruction>(INST # UXDr) $Rn)>; 2513*9880d681SAndroid Build Coastguard Worker 2514*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (round (fmul f16:$Rn, fixedpoint_f16_i32:$scale))), 2515*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # SWHri) $Rn, $scale)>; 2516*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (round (fmul f16:$Rn, fixedpoint_f16_i64:$scale))), 2517*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # SXHri) $Rn, $scale)>; 2518*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (round (fmul f32:$Rn, fixedpoint_f32_i32:$scale))), 2519*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # SWSri) $Rn, $scale)>; 2520*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (round (fmul f32:$Rn, fixedpoint_f32_i64:$scale))), 2521*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # SXSri) $Rn, $scale)>; 2522*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (round (fmul f64:$Rn, fixedpoint_f64_i32:$scale))), 2523*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # SWDri) $Rn, $scale)>; 2524*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (round (fmul f64:$Rn, fixedpoint_f64_i64:$scale))), 2525*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # SXDri) $Rn, $scale)>; 2526*9880d681SAndroid Build Coastguard Worker} 2527*9880d681SAndroid Build Coastguard Worker 2528*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerIntPats<int_aarch64_neon_fcvtzs, "FCVTZS">; 2529*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerIntPats<int_aarch64_neon_fcvtzu, "FCVTZU">; 2530*9880d681SAndroid Build Coastguard Worker 2531*9880d681SAndroid Build Coastguard Workermulticlass FPToIntegerPats<SDNode to_int, SDNode round, string INST> { 2532*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (to_int (round f32:$Rn))), 2533*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # UWSr) f32:$Rn)>; 2534*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (to_int (round f32:$Rn))), 2535*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # UXSr) f32:$Rn)>; 2536*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (to_int (round f64:$Rn))), 2537*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # UWDr) f64:$Rn)>; 2538*9880d681SAndroid Build Coastguard Worker def : Pat<(i64 (to_int (round f64:$Rn))), 2539*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(INST # UXDr) f64:$Rn)>; 2540*9880d681SAndroid Build Coastguard Worker} 2541*9880d681SAndroid Build Coastguard Worker 2542*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_sint, fceil, "FCVTPS">; 2543*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_uint, fceil, "FCVTPU">; 2544*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_sint, ffloor, "FCVTMS">; 2545*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_uint, ffloor, "FCVTMU">; 2546*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_sint, ftrunc, "FCVTZS">; 2547*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_uint, ftrunc, "FCVTZU">; 2548*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_sint, frnd, "FCVTAS">; 2549*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_uint, frnd, "FCVTAU">; 2550*9880d681SAndroid Build Coastguard Worker 2551*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2552*9880d681SAndroid Build Coastguard Worker// Scaled integer to floating point conversion instructions. 2553*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2554*9880d681SAndroid Build Coastguard Worker 2555*9880d681SAndroid Build Coastguard Workerdefm SCVTF : IntegerToFP<0, "scvtf", sint_to_fp>; 2556*9880d681SAndroid Build Coastguard Workerdefm UCVTF : IntegerToFP<1, "ucvtf", uint_to_fp>; 2557*9880d681SAndroid Build Coastguard Worker 2558*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2559*9880d681SAndroid Build Coastguard Worker// Unscaled integer to floating point conversion instruction. 2560*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2561*9880d681SAndroid Build Coastguard Worker 2562*9880d681SAndroid Build Coastguard Workerdefm FMOV : UnscaledConversion<"fmov">; 2563*9880d681SAndroid Build Coastguard Worker 2564*9880d681SAndroid Build Coastguard Worker// Add pseudo ops for FMOV 0 so we can mark them as isReMaterializable 2565*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isCodeGenOnly = 1, isAsCheapAsAMove = 1 in { 2566*9880d681SAndroid Build Coastguard Workerdef FMOVS0 : Pseudo<(outs FPR32:$Rd), (ins), [(set f32:$Rd, (fpimm0))]>, 2567*9880d681SAndroid Build Coastguard Worker Sched<[WriteF]>; 2568*9880d681SAndroid Build Coastguard Workerdef FMOVD0 : Pseudo<(outs FPR64:$Rd), (ins), [(set f64:$Rd, (fpimm0))]>, 2569*9880d681SAndroid Build Coastguard Worker Sched<[WriteF]>; 2570*9880d681SAndroid Build Coastguard Worker} 2571*9880d681SAndroid Build Coastguard Worker 2572*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2573*9880d681SAndroid Build Coastguard Worker// Floating point conversion instruction. 2574*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2575*9880d681SAndroid Build Coastguard Worker 2576*9880d681SAndroid Build Coastguard Workerdefm FCVT : FPConversion<"fcvt">; 2577*9880d681SAndroid Build Coastguard Worker 2578*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2579*9880d681SAndroid Build Coastguard Worker// Floating point single operand instructions. 2580*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2581*9880d681SAndroid Build Coastguard Worker 2582*9880d681SAndroid Build Coastguard Workerdefm FABS : SingleOperandFPData<0b0001, "fabs", fabs>; 2583*9880d681SAndroid Build Coastguard Workerdefm FMOV : SingleOperandFPData<0b0000, "fmov">; 2584*9880d681SAndroid Build Coastguard Workerdefm FNEG : SingleOperandFPData<0b0010, "fneg", fneg>; 2585*9880d681SAndroid Build Coastguard Workerdefm FRINTA : SingleOperandFPData<0b1100, "frinta", frnd>; 2586*9880d681SAndroid Build Coastguard Workerdefm FRINTI : SingleOperandFPData<0b1111, "frinti", fnearbyint>; 2587*9880d681SAndroid Build Coastguard Workerdefm FRINTM : SingleOperandFPData<0b1010, "frintm", ffloor>; 2588*9880d681SAndroid Build Coastguard Workerdefm FRINTN : SingleOperandFPData<0b1000, "frintn", int_aarch64_neon_frintn>; 2589*9880d681SAndroid Build Coastguard Workerdefm FRINTP : SingleOperandFPData<0b1001, "frintp", fceil>; 2590*9880d681SAndroid Build Coastguard Worker 2591*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_frintn (v1f64 FPR64:$Rn))), 2592*9880d681SAndroid Build Coastguard Worker (FRINTNDr FPR64:$Rn)>; 2593*9880d681SAndroid Build Coastguard Worker 2594*9880d681SAndroid Build Coastguard Workerdefm FRINTX : SingleOperandFPData<0b1110, "frintx", frint>; 2595*9880d681SAndroid Build Coastguard Workerdefm FRINTZ : SingleOperandFPData<0b1011, "frintz", ftrunc>; 2596*9880d681SAndroid Build Coastguard Worker 2597*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteFDiv] in { 2598*9880d681SAndroid Build Coastguard Workerdefm FSQRT : SingleOperandFPData<0b0011, "fsqrt", fsqrt>; 2599*9880d681SAndroid Build Coastguard Worker} 2600*9880d681SAndroid Build Coastguard Worker 2601*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2602*9880d681SAndroid Build Coastguard Worker// Floating point two operand instructions. 2603*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2604*9880d681SAndroid Build Coastguard Worker 2605*9880d681SAndroid Build Coastguard Workerdefm FADD : TwoOperandFPData<0b0010, "fadd", fadd>; 2606*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteFDiv] in { 2607*9880d681SAndroid Build Coastguard Workerdefm FDIV : TwoOperandFPData<0b0001, "fdiv", fdiv>; 2608*9880d681SAndroid Build Coastguard Worker} 2609*9880d681SAndroid Build Coastguard Workerdefm FMAXNM : TwoOperandFPData<0b0110, "fmaxnm", fmaxnum>; 2610*9880d681SAndroid Build Coastguard Workerdefm FMAX : TwoOperandFPData<0b0100, "fmax", fmaxnan>; 2611*9880d681SAndroid Build Coastguard Workerdefm FMINNM : TwoOperandFPData<0b0111, "fminnm", fminnum>; 2612*9880d681SAndroid Build Coastguard Workerdefm FMIN : TwoOperandFPData<0b0101, "fmin", fminnan>; 2613*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteFMul] in { 2614*9880d681SAndroid Build Coastguard Workerdefm FMUL : TwoOperandFPData<0b0000, "fmul", fmul>; 2615*9880d681SAndroid Build Coastguard Workerdefm FNMUL : TwoOperandFPDataNeg<0b1000, "fnmul", fmul>; 2616*9880d681SAndroid Build Coastguard Worker} 2617*9880d681SAndroid Build Coastguard Workerdefm FSUB : TwoOperandFPData<0b0011, "fsub", fsub>; 2618*9880d681SAndroid Build Coastguard Worker 2619*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (fmaxnan (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))), 2620*9880d681SAndroid Build Coastguard Worker (FMAXDrr FPR64:$Rn, FPR64:$Rm)>; 2621*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (fminnan (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))), 2622*9880d681SAndroid Build Coastguard Worker (FMINDrr FPR64:$Rn, FPR64:$Rm)>; 2623*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (fmaxnum (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))), 2624*9880d681SAndroid Build Coastguard Worker (FMAXNMDrr FPR64:$Rn, FPR64:$Rm)>; 2625*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (fminnum (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))), 2626*9880d681SAndroid Build Coastguard Worker (FMINNMDrr FPR64:$Rn, FPR64:$Rm)>; 2627*9880d681SAndroid Build Coastguard Worker 2628*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2629*9880d681SAndroid Build Coastguard Worker// Floating point three operand instructions. 2630*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2631*9880d681SAndroid Build Coastguard Worker 2632*9880d681SAndroid Build Coastguard Workerdefm FMADD : ThreeOperandFPData<0, 0, "fmadd", fma>; 2633*9880d681SAndroid Build Coastguard Workerdefm FMSUB : ThreeOperandFPData<0, 1, "fmsub", 2634*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$LHS, (fneg node:$MHS), node:$RHS)> >; 2635*9880d681SAndroid Build Coastguard Workerdefm FNMADD : ThreeOperandFPData<1, 0, "fnmadd", 2636*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fneg (fma node:$LHS, node:$MHS, node:$RHS))> >; 2637*9880d681SAndroid Build Coastguard Workerdefm FNMSUB : ThreeOperandFPData<1, 1, "fnmsub", 2638*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$LHS, node:$MHS, (fneg node:$RHS))> >; 2639*9880d681SAndroid Build Coastguard Worker 2640*9880d681SAndroid Build Coastguard Worker// The following def pats catch the case where the LHS of an FMA is negated. 2641*9880d681SAndroid Build Coastguard Worker// The TriOpFrag above catches the case where the middle operand is negated. 2642*9880d681SAndroid Build Coastguard Worker 2643*9880d681SAndroid Build Coastguard Worker// N.b. FMSUB etc have the accumulator at the *end* of (outs), unlike 2644*9880d681SAndroid Build Coastguard Worker// the NEON variant. 2645*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma (fneg FPR32:$Rn), FPR32:$Rm, FPR32:$Ra)), 2646*9880d681SAndroid Build Coastguard Worker (FMSUBSrrr FPR32:$Rn, FPR32:$Rm, FPR32:$Ra)>; 2647*9880d681SAndroid Build Coastguard Worker 2648*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma (fneg FPR64:$Rn), FPR64:$Rm, FPR64:$Ra)), 2649*9880d681SAndroid Build Coastguard Worker (FMSUBDrrr FPR64:$Rn, FPR64:$Rm, FPR64:$Ra)>; 2650*9880d681SAndroid Build Coastguard Worker 2651*9880d681SAndroid Build Coastguard Worker// We handled -(a + b*c) for FNMADD above, now it's time for "(-a) + (-b)*c" and 2652*9880d681SAndroid Build Coastguard Worker// "(-a) + b*(-c)". 2653*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma (fneg FPR32:$Rn), FPR32:$Rm, (fneg FPR32:$Ra))), 2654*9880d681SAndroid Build Coastguard Worker (FNMADDSrrr FPR32:$Rn, FPR32:$Rm, FPR32:$Ra)>; 2655*9880d681SAndroid Build Coastguard Worker 2656*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma (fneg FPR64:$Rn), FPR64:$Rm, (fneg FPR64:$Ra))), 2657*9880d681SAndroid Build Coastguard Worker (FNMADDDrrr FPR64:$Rn, FPR64:$Rm, FPR64:$Ra)>; 2658*9880d681SAndroid Build Coastguard Worker 2659*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma FPR32:$Rn, (fneg FPR32:$Rm), (fneg FPR32:$Ra))), 2660*9880d681SAndroid Build Coastguard Worker (FNMADDSrrr FPR32:$Rn, FPR32:$Rm, FPR32:$Ra)>; 2661*9880d681SAndroid Build Coastguard Worker 2662*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma FPR64:$Rn, (fneg FPR64:$Rm), (fneg FPR64:$Ra))), 2663*9880d681SAndroid Build Coastguard Worker (FNMADDDrrr FPR64:$Rn, FPR64:$Rm, FPR64:$Ra)>; 2664*9880d681SAndroid Build Coastguard Worker 2665*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2666*9880d681SAndroid Build Coastguard Worker// Floating point comparison instructions. 2667*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2668*9880d681SAndroid Build Coastguard Worker 2669*9880d681SAndroid Build Coastguard Workerdefm FCMPE : FPComparison<1, "fcmpe">; 2670*9880d681SAndroid Build Coastguard Workerdefm FCMP : FPComparison<0, "fcmp", AArch64fcmp>; 2671*9880d681SAndroid Build Coastguard Worker 2672*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2673*9880d681SAndroid Build Coastguard Worker// Floating point conditional comparison instructions. 2674*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2675*9880d681SAndroid Build Coastguard Worker 2676*9880d681SAndroid Build Coastguard Workerdefm FCCMPE : FPCondComparison<1, "fccmpe">; 2677*9880d681SAndroid Build Coastguard Workerdefm FCCMP : FPCondComparison<0, "fccmp", AArch64fccmp>; 2678*9880d681SAndroid Build Coastguard Worker 2679*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2680*9880d681SAndroid Build Coastguard Worker// Floating point conditional select instruction. 2681*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2682*9880d681SAndroid Build Coastguard Worker 2683*9880d681SAndroid Build Coastguard Workerdefm FCSEL : FPCondSelect<"fcsel">; 2684*9880d681SAndroid Build Coastguard Worker 2685*9880d681SAndroid Build Coastguard Worker// CSEL instructions providing f128 types need to be handled by a 2686*9880d681SAndroid Build Coastguard Worker// pseudo-instruction since the eventual code will need to introduce basic 2687*9880d681SAndroid Build Coastguard Worker// blocks and control flow. 2688*9880d681SAndroid Build Coastguard Workerdef F128CSEL : Pseudo<(outs FPR128:$Rd), 2689*9880d681SAndroid Build Coastguard Worker (ins FPR128:$Rn, FPR128:$Rm, ccode:$cond), 2690*9880d681SAndroid Build Coastguard Worker [(set (f128 FPR128:$Rd), 2691*9880d681SAndroid Build Coastguard Worker (AArch64csel FPR128:$Rn, FPR128:$Rm, 2692*9880d681SAndroid Build Coastguard Worker (i32 imm:$cond), NZCV))]> { 2693*9880d681SAndroid Build Coastguard Worker let Uses = [NZCV]; 2694*9880d681SAndroid Build Coastguard Worker let usesCustomInserter = 1; 2695*9880d681SAndroid Build Coastguard Worker let hasNoSchedulingInfo = 1; 2696*9880d681SAndroid Build Coastguard Worker} 2697*9880d681SAndroid Build Coastguard Worker 2698*9880d681SAndroid Build Coastguard Worker 2699*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2700*9880d681SAndroid Build Coastguard Worker// Floating point immediate move. 2701*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2702*9880d681SAndroid Build Coastguard Worker 2703*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1 in { 2704*9880d681SAndroid Build Coastguard Workerdefm FMOV : FPMoveImmediate<"fmov">; 2705*9880d681SAndroid Build Coastguard Worker} 2706*9880d681SAndroid Build Coastguard Worker 2707*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2708*9880d681SAndroid Build Coastguard Worker// Advanced SIMD two vector instructions. 2709*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2710*9880d681SAndroid Build Coastguard Worker 2711*9880d681SAndroid Build Coastguard Workerdefm UABDL : SIMDLongThreeVectorBHSabdl<1, 0b0111, "uabdl", 2712*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_uabd>; 2713*9880d681SAndroid Build Coastguard Worker// Match UABDL in log2-shuffle patterns. 2714*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v8i16 (AArch64vashr v8i16:$src, (i32 15))), 2715*9880d681SAndroid Build Coastguard Worker (v8i16 (add (sub (zext (v8i8 V64:$opA)), 2716*9880d681SAndroid Build Coastguard Worker (zext (v8i8 V64:$opB))), 2717*9880d681SAndroid Build Coastguard Worker (AArch64vashr v8i16:$src, (i32 15))))), 2718*9880d681SAndroid Build Coastguard Worker (UABDLv8i8_v8i16 V64:$opA, V64:$opB)>; 2719*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v8i16 (AArch64vashr v8i16:$src, (i32 15))), 2720*9880d681SAndroid Build Coastguard Worker (v8i16 (add (sub (zext (extract_high_v16i8 V128:$opA)), 2721*9880d681SAndroid Build Coastguard Worker (zext (extract_high_v16i8 V128:$opB))), 2722*9880d681SAndroid Build Coastguard Worker (AArch64vashr v8i16:$src, (i32 15))))), 2723*9880d681SAndroid Build Coastguard Worker (UABDLv16i8_v8i16 V128:$opA, V128:$opB)>; 2724*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v4i32 (AArch64vashr v4i32:$src, (i32 31))), 2725*9880d681SAndroid Build Coastguard Worker (v4i32 (add (sub (zext (v4i16 V64:$opA)), 2726*9880d681SAndroid Build Coastguard Worker (zext (v4i16 V64:$opB))), 2727*9880d681SAndroid Build Coastguard Worker (AArch64vashr v4i32:$src, (i32 31))))), 2728*9880d681SAndroid Build Coastguard Worker (UABDLv4i16_v4i32 V64:$opA, V64:$opB)>; 2729*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v4i32 (AArch64vashr v4i32:$src, (i32 31))), 2730*9880d681SAndroid Build Coastguard Worker (v4i32 (add (sub (zext (extract_high_v8i16 V128:$opA)), 2731*9880d681SAndroid Build Coastguard Worker (zext (extract_high_v8i16 V128:$opB))), 2732*9880d681SAndroid Build Coastguard Worker (AArch64vashr v4i32:$src, (i32 31))))), 2733*9880d681SAndroid Build Coastguard Worker (UABDLv8i16_v4i32 V128:$opA, V128:$opB)>; 2734*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v2i64 (AArch64vashr v2i64:$src, (i32 63))), 2735*9880d681SAndroid Build Coastguard Worker (v2i64 (add (sub (zext (v2i32 V64:$opA)), 2736*9880d681SAndroid Build Coastguard Worker (zext (v2i32 V64:$opB))), 2737*9880d681SAndroid Build Coastguard Worker (AArch64vashr v2i64:$src, (i32 63))))), 2738*9880d681SAndroid Build Coastguard Worker (UABDLv2i32_v2i64 V64:$opA, V64:$opB)>; 2739*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v2i64 (AArch64vashr v2i64:$src, (i32 63))), 2740*9880d681SAndroid Build Coastguard Worker (v2i64 (add (sub (zext (extract_high_v4i32 V128:$opA)), 2741*9880d681SAndroid Build Coastguard Worker (zext (extract_high_v4i32 V128:$opB))), 2742*9880d681SAndroid Build Coastguard Worker (AArch64vashr v2i64:$src, (i32 63))))), 2743*9880d681SAndroid Build Coastguard Worker (UABDLv4i32_v2i64 V128:$opA, V128:$opB)>; 2744*9880d681SAndroid Build Coastguard Worker 2745*9880d681SAndroid Build Coastguard Workerdefm ABS : SIMDTwoVectorBHSD<0, 0b01011, "abs", int_aarch64_neon_abs>; 2746*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v8i8 (AArch64vashr V64:$src, (i32 7))), 2747*9880d681SAndroid Build Coastguard Worker (v8i8 (add V64:$src, (AArch64vashr V64:$src, (i32 7))))), 2748*9880d681SAndroid Build Coastguard Worker (ABSv8i8 V64:$src)>; 2749*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v4i16 (AArch64vashr V64:$src, (i32 15))), 2750*9880d681SAndroid Build Coastguard Worker (v4i16 (add V64:$src, (AArch64vashr V64:$src, (i32 15))))), 2751*9880d681SAndroid Build Coastguard Worker (ABSv4i16 V64:$src)>; 2752*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v2i32 (AArch64vashr V64:$src, (i32 31))), 2753*9880d681SAndroid Build Coastguard Worker (v2i32 (add V64:$src, (AArch64vashr V64:$src, (i32 31))))), 2754*9880d681SAndroid Build Coastguard Worker (ABSv2i32 V64:$src)>; 2755*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v16i8 (AArch64vashr V128:$src, (i32 7))), 2756*9880d681SAndroid Build Coastguard Worker (v16i8 (add V128:$src, (AArch64vashr V128:$src, (i32 7))))), 2757*9880d681SAndroid Build Coastguard Worker (ABSv16i8 V128:$src)>; 2758*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v8i16 (AArch64vashr V128:$src, (i32 15))), 2759*9880d681SAndroid Build Coastguard Worker (v8i16 (add V128:$src, (AArch64vashr V128:$src, (i32 15))))), 2760*9880d681SAndroid Build Coastguard Worker (ABSv8i16 V128:$src)>; 2761*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v4i32 (AArch64vashr V128:$src, (i32 31))), 2762*9880d681SAndroid Build Coastguard Worker (v4i32 (add V128:$src, (AArch64vashr V128:$src, (i32 31))))), 2763*9880d681SAndroid Build Coastguard Worker (ABSv4i32 V128:$src)>; 2764*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v2i64 (AArch64vashr V128:$src, (i32 63))), 2765*9880d681SAndroid Build Coastguard Worker (v2i64 (add V128:$src, (AArch64vashr V128:$src, (i32 63))))), 2766*9880d681SAndroid Build Coastguard Worker (ABSv2i64 V128:$src)>; 2767*9880d681SAndroid Build Coastguard Worker 2768*9880d681SAndroid Build Coastguard Workerdefm CLS : SIMDTwoVectorBHS<0, 0b00100, "cls", int_aarch64_neon_cls>; 2769*9880d681SAndroid Build Coastguard Workerdefm CLZ : SIMDTwoVectorBHS<1, 0b00100, "clz", ctlz>; 2770*9880d681SAndroid Build Coastguard Workerdefm CMEQ : SIMDCmpTwoVector<0, 0b01001, "cmeq", AArch64cmeqz>; 2771*9880d681SAndroid Build Coastguard Workerdefm CMGE : SIMDCmpTwoVector<1, 0b01000, "cmge", AArch64cmgez>; 2772*9880d681SAndroid Build Coastguard Workerdefm CMGT : SIMDCmpTwoVector<0, 0b01000, "cmgt", AArch64cmgtz>; 2773*9880d681SAndroid Build Coastguard Workerdefm CMLE : SIMDCmpTwoVector<1, 0b01001, "cmle", AArch64cmlez>; 2774*9880d681SAndroid Build Coastguard Workerdefm CMLT : SIMDCmpTwoVector<0, 0b01010, "cmlt", AArch64cmltz>; 2775*9880d681SAndroid Build Coastguard Workerdefm CNT : SIMDTwoVectorB<0, 0b00, 0b00101, "cnt", ctpop>; 2776*9880d681SAndroid Build Coastguard Workerdefm FABS : SIMDTwoVectorFP<0, 1, 0b01111, "fabs", fabs>; 2777*9880d681SAndroid Build Coastguard Worker 2778*9880d681SAndroid Build Coastguard Workerdefm FCMEQ : SIMDFPCmpTwoVector<0, 1, 0b01101, "fcmeq", AArch64fcmeqz>; 2779*9880d681SAndroid Build Coastguard Workerdefm FCMGE : SIMDFPCmpTwoVector<1, 1, 0b01100, "fcmge", AArch64fcmgez>; 2780*9880d681SAndroid Build Coastguard Workerdefm FCMGT : SIMDFPCmpTwoVector<0, 1, 0b01100, "fcmgt", AArch64fcmgtz>; 2781*9880d681SAndroid Build Coastguard Workerdefm FCMLE : SIMDFPCmpTwoVector<1, 1, 0b01101, "fcmle", AArch64fcmlez>; 2782*9880d681SAndroid Build Coastguard Workerdefm FCMLT : SIMDFPCmpTwoVector<0, 1, 0b01110, "fcmlt", AArch64fcmltz>; 2783*9880d681SAndroid Build Coastguard Workerdefm FCVTAS : SIMDTwoVectorFPToInt<0,0,0b11100, "fcvtas",int_aarch64_neon_fcvtas>; 2784*9880d681SAndroid Build Coastguard Workerdefm FCVTAU : SIMDTwoVectorFPToInt<1,0,0b11100, "fcvtau",int_aarch64_neon_fcvtau>; 2785*9880d681SAndroid Build Coastguard Workerdefm FCVTL : SIMDFPWidenTwoVector<0, 0, 0b10111, "fcvtl">; 2786*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (int_aarch64_neon_vcvthf2fp (v4i16 V64:$Rn))), 2787*9880d681SAndroid Build Coastguard Worker (FCVTLv4i16 V64:$Rn)>; 2788*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (int_aarch64_neon_vcvthf2fp (extract_subvector (v8i16 V128:$Rn), 2789*9880d681SAndroid Build Coastguard Worker (i64 4)))), 2790*9880d681SAndroid Build Coastguard Worker (FCVTLv8i16 V128:$Rn)>; 2791*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (fextend (v2f32 V64:$Rn))), (FCVTLv2i32 V64:$Rn)>; 2792*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (fextend (v2f32 (extract_subvector (v4f32 V128:$Rn), 2793*9880d681SAndroid Build Coastguard Worker (i64 2))))), 2794*9880d681SAndroid Build Coastguard Worker (FCVTLv4i32 V128:$Rn)>; 2795*9880d681SAndroid Build Coastguard Worker 2796*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fextend (v4f16 V64:$Rn))), (FCVTLv4i16 V64:$Rn)>; 2797*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fextend (v4f16 (extract_subvector (v8f16 V128:$Rn), 2798*9880d681SAndroid Build Coastguard Worker (i64 4))))), 2799*9880d681SAndroid Build Coastguard Worker (FCVTLv8i16 V128:$Rn)>; 2800*9880d681SAndroid Build Coastguard Worker 2801*9880d681SAndroid Build Coastguard Workerdefm FCVTMS : SIMDTwoVectorFPToInt<0,0,0b11011, "fcvtms",int_aarch64_neon_fcvtms>; 2802*9880d681SAndroid Build Coastguard Workerdefm FCVTMU : SIMDTwoVectorFPToInt<1,0,0b11011, "fcvtmu",int_aarch64_neon_fcvtmu>; 2803*9880d681SAndroid Build Coastguard Workerdefm FCVTNS : SIMDTwoVectorFPToInt<0,0,0b11010, "fcvtns",int_aarch64_neon_fcvtns>; 2804*9880d681SAndroid Build Coastguard Workerdefm FCVTNU : SIMDTwoVectorFPToInt<1,0,0b11010, "fcvtnu",int_aarch64_neon_fcvtnu>; 2805*9880d681SAndroid Build Coastguard Workerdefm FCVTN : SIMDFPNarrowTwoVector<0, 0, 0b10110, "fcvtn">; 2806*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (int_aarch64_neon_vcvtfp2hf (v4f32 V128:$Rn))), 2807*9880d681SAndroid Build Coastguard Worker (FCVTNv4i16 V128:$Rn)>; 2808*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors V64:$Rd, 2809*9880d681SAndroid Build Coastguard Worker (v4i16 (int_aarch64_neon_vcvtfp2hf (v4f32 V128:$Rn)))), 2810*9880d681SAndroid Build Coastguard Worker (FCVTNv8i16 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), V128:$Rn)>; 2811*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (fround (v2f64 V128:$Rn))), (FCVTNv2i32 V128:$Rn)>; 2812*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (fround (v4f32 V128:$Rn))), (FCVTNv4i16 V128:$Rn)>; 2813*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors V64:$Rd, (v2f32 (fround (v2f64 V128:$Rn)))), 2814*9880d681SAndroid Build Coastguard Worker (FCVTNv4i32 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), V128:$Rn)>; 2815*9880d681SAndroid Build Coastguard Workerdefm FCVTPS : SIMDTwoVectorFPToInt<0,1,0b11010, "fcvtps",int_aarch64_neon_fcvtps>; 2816*9880d681SAndroid Build Coastguard Workerdefm FCVTPU : SIMDTwoVectorFPToInt<1,1,0b11010, "fcvtpu",int_aarch64_neon_fcvtpu>; 2817*9880d681SAndroid Build Coastguard Workerdefm FCVTXN : SIMDFPInexactCvtTwoVector<1, 0, 0b10110, "fcvtxn", 2818*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_fcvtxn>; 2819*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : SIMDTwoVectorFPToInt<0, 1, 0b11011, "fcvtzs", fp_to_sint>; 2820*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : SIMDTwoVectorFPToInt<1, 1, 0b11011, "fcvtzu", fp_to_uint>; 2821*9880d681SAndroid Build Coastguard Worker 2822*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (int_aarch64_neon_fcvtzs v4f16:$Rn)), (FCVTZSv4f16 $Rn)>; 2823*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (int_aarch64_neon_fcvtzs v8f16:$Rn)), (FCVTZSv8f16 $Rn)>; 2824*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (int_aarch64_neon_fcvtzs v2f32:$Rn)), (FCVTZSv2f32 $Rn)>; 2825*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (int_aarch64_neon_fcvtzs v4f32:$Rn)), (FCVTZSv4f32 $Rn)>; 2826*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (int_aarch64_neon_fcvtzs v2f64:$Rn)), (FCVTZSv2f64 $Rn)>; 2827*9880d681SAndroid Build Coastguard Worker 2828*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (int_aarch64_neon_fcvtzu v4f16:$Rn)), (FCVTZUv4f16 $Rn)>; 2829*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (int_aarch64_neon_fcvtzu v8f16:$Rn)), (FCVTZUv8f16 $Rn)>; 2830*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (int_aarch64_neon_fcvtzu v2f32:$Rn)), (FCVTZUv2f32 $Rn)>; 2831*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (int_aarch64_neon_fcvtzu v4f32:$Rn)), (FCVTZUv4f32 $Rn)>; 2832*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (int_aarch64_neon_fcvtzu v2f64:$Rn)), (FCVTZUv2f64 $Rn)>; 2833*9880d681SAndroid Build Coastguard Worker 2834*9880d681SAndroid Build Coastguard Workerdefm FNEG : SIMDTwoVectorFP<1, 1, 0b01111, "fneg", fneg>; 2835*9880d681SAndroid Build Coastguard Workerdefm FRECPE : SIMDTwoVectorFP<0, 1, 0b11101, "frecpe", int_aarch64_neon_frecpe>; 2836*9880d681SAndroid Build Coastguard Workerdefm FRINTA : SIMDTwoVectorFP<1, 0, 0b11000, "frinta", frnd>; 2837*9880d681SAndroid Build Coastguard Workerdefm FRINTI : SIMDTwoVectorFP<1, 1, 0b11001, "frinti", fnearbyint>; 2838*9880d681SAndroid Build Coastguard Workerdefm FRINTM : SIMDTwoVectorFP<0, 0, 0b11001, "frintm", ffloor>; 2839*9880d681SAndroid Build Coastguard Workerdefm FRINTN : SIMDTwoVectorFP<0, 0, 0b11000, "frintn", int_aarch64_neon_frintn>; 2840*9880d681SAndroid Build Coastguard Workerdefm FRINTP : SIMDTwoVectorFP<0, 1, 0b11000, "frintp", fceil>; 2841*9880d681SAndroid Build Coastguard Workerdefm FRINTX : SIMDTwoVectorFP<1, 0, 0b11001, "frintx", frint>; 2842*9880d681SAndroid Build Coastguard Workerdefm FRINTZ : SIMDTwoVectorFP<0, 1, 0b11001, "frintz", ftrunc>; 2843*9880d681SAndroid Build Coastguard Workerdefm FRSQRTE: SIMDTwoVectorFP<1, 1, 0b11101, "frsqrte", int_aarch64_neon_frsqrte>; 2844*9880d681SAndroid Build Coastguard Workerdefm FSQRT : SIMDTwoVectorFP<1, 1, 0b11111, "fsqrt", fsqrt>; 2845*9880d681SAndroid Build Coastguard Workerdefm NEG : SIMDTwoVectorBHSD<1, 0b01011, "neg", 2846*9880d681SAndroid Build Coastguard Worker UnOpFrag<(sub immAllZerosV, node:$LHS)> >; 2847*9880d681SAndroid Build Coastguard Workerdefm NOT : SIMDTwoVectorB<1, 0b00, 0b00101, "not", vnot>; 2848*9880d681SAndroid Build Coastguard Worker// Aliases for MVN -> NOT. 2849*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn{ $Vd.8b, $Vn.8b|.8b $Vd, $Vn}", 2850*9880d681SAndroid Build Coastguard Worker (NOTv8i8 V64:$Vd, V64:$Vn)>; 2851*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn{ $Vd.16b, $Vn.16b|.16b $Vd, $Vn}", 2852*9880d681SAndroid Build Coastguard Worker (NOTv16i8 V128:$Vd, V128:$Vn)>; 2853*9880d681SAndroid Build Coastguard Worker 2854*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v8i8 V64:$Rn)), (NEGv8i8 V64:$Rn)>; 2855*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v16i8 V128:$Rn)), (NEGv16i8 V128:$Rn)>; 2856*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v4i16 V64:$Rn)), (NEGv4i16 V64:$Rn)>; 2857*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v8i16 V128:$Rn)), (NEGv8i16 V128:$Rn)>; 2858*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v2i32 V64:$Rn)), (NEGv2i32 V64:$Rn)>; 2859*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v4i32 V128:$Rn)), (NEGv4i32 V128:$Rn)>; 2860*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v2i64 V128:$Rn)), (NEGv2i64 V128:$Rn)>; 2861*9880d681SAndroid Build Coastguard Worker 2862*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v8i8 V64:$Rn)), (NOTv8i8 V64:$Rn)>; 2863*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v16i8 V128:$Rn)), (NOTv16i8 V128:$Rn)>; 2864*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v4i16 V64:$Rn)), (NOTv8i8 V64:$Rn)>; 2865*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v8i16 V128:$Rn)), (NOTv16i8 V128:$Rn)>; 2866*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v2i32 V64:$Rn)), (NOTv8i8 V64:$Rn)>; 2867*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v1i64 V64:$Rn)), (NOTv8i8 V64:$Rn)>; 2868*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v4i32 V128:$Rn)), (NOTv16i8 V128:$Rn)>; 2869*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v2i64 V128:$Rn)), (NOTv16i8 V128:$Rn)>; 2870*9880d681SAndroid Build Coastguard Worker 2871*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v4i16 V64:$Rn)), (NOTv8i8 V64:$Rn)>; 2872*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v8i16 V128:$Rn)), (NOTv16i8 V128:$Rn)>; 2873*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v2i32 V64:$Rn)), (NOTv8i8 V64:$Rn)>; 2874*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v4i32 V128:$Rn)), (NOTv16i8 V128:$Rn)>; 2875*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v2i64 V128:$Rn)), (NOTv16i8 V128:$Rn)>; 2876*9880d681SAndroid Build Coastguard Worker 2877*9880d681SAndroid Build Coastguard Workerdefm RBIT : SIMDTwoVectorB<1, 0b01, 0b00101, "rbit", int_aarch64_neon_rbit>; 2878*9880d681SAndroid Build Coastguard Workerdefm REV16 : SIMDTwoVectorB<0, 0b00, 0b00001, "rev16", AArch64rev16>; 2879*9880d681SAndroid Build Coastguard Workerdefm REV32 : SIMDTwoVectorBH<1, 0b00000, "rev32", AArch64rev32>; 2880*9880d681SAndroid Build Coastguard Workerdefm REV64 : SIMDTwoVectorBHS<0, 0b00000, "rev64", AArch64rev64>; 2881*9880d681SAndroid Build Coastguard Workerdefm SADALP : SIMDLongTwoVectorTied<0, 0b00110, "sadalp", 2882*9880d681SAndroid Build Coastguard Worker BinOpFrag<(add node:$LHS, (int_aarch64_neon_saddlp node:$RHS))> >; 2883*9880d681SAndroid Build Coastguard Workerdefm SADDLP : SIMDLongTwoVector<0, 0b00010, "saddlp", int_aarch64_neon_saddlp>; 2884*9880d681SAndroid Build Coastguard Workerdefm SCVTF : SIMDTwoVectorIntToFP<0, 0, 0b11101, "scvtf", sint_to_fp>; 2885*9880d681SAndroid Build Coastguard Workerdefm SHLL : SIMDVectorLShiftLongBySizeBHS; 2886*9880d681SAndroid Build Coastguard Workerdefm SQABS : SIMDTwoVectorBHSD<0, 0b00111, "sqabs", int_aarch64_neon_sqabs>; 2887*9880d681SAndroid Build Coastguard Workerdefm SQNEG : SIMDTwoVectorBHSD<1, 0b00111, "sqneg", int_aarch64_neon_sqneg>; 2888*9880d681SAndroid Build Coastguard Workerdefm SQXTN : SIMDMixedTwoVector<0, 0b10100, "sqxtn", int_aarch64_neon_sqxtn>; 2889*9880d681SAndroid Build Coastguard Workerdefm SQXTUN : SIMDMixedTwoVector<1, 0b10010, "sqxtun", int_aarch64_neon_sqxtun>; 2890*9880d681SAndroid Build Coastguard Workerdefm SUQADD : SIMDTwoVectorBHSDTied<0, 0b00011, "suqadd",int_aarch64_neon_suqadd>; 2891*9880d681SAndroid Build Coastguard Workerdefm UADALP : SIMDLongTwoVectorTied<1, 0b00110, "uadalp", 2892*9880d681SAndroid Build Coastguard Worker BinOpFrag<(add node:$LHS, (int_aarch64_neon_uaddlp node:$RHS))> >; 2893*9880d681SAndroid Build Coastguard Workerdefm UADDLP : SIMDLongTwoVector<1, 0b00010, "uaddlp", 2894*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_uaddlp>; 2895*9880d681SAndroid Build Coastguard Workerdefm UCVTF : SIMDTwoVectorIntToFP<1, 0, 0b11101, "ucvtf", uint_to_fp>; 2896*9880d681SAndroid Build Coastguard Workerdefm UQXTN : SIMDMixedTwoVector<1, 0b10100, "uqxtn", int_aarch64_neon_uqxtn>; 2897*9880d681SAndroid Build Coastguard Workerdefm URECPE : SIMDTwoVectorS<0, 1, 0b11100, "urecpe", int_aarch64_neon_urecpe>; 2898*9880d681SAndroid Build Coastguard Workerdefm URSQRTE: SIMDTwoVectorS<1, 1, 0b11100, "ursqrte", int_aarch64_neon_ursqrte>; 2899*9880d681SAndroid Build Coastguard Workerdefm USQADD : SIMDTwoVectorBHSDTied<1, 0b00011, "usqadd",int_aarch64_neon_usqadd>; 2900*9880d681SAndroid Build Coastguard Workerdefm XTN : SIMDMixedTwoVector<0, 0b10010, "xtn", trunc>; 2901*9880d681SAndroid Build Coastguard Worker 2902*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64rev32 V64:$Rn)), (REV32v4i16 V64:$Rn)>; 2903*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64rev64 V64:$Rn)), (REV64v4i16 V64:$Rn)>; 2904*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64rev32 V128:$Rn)), (REV32v8i16 V128:$Rn)>; 2905*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64rev64 V128:$Rn)), (REV64v8i16 V128:$Rn)>; 2906*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64rev64 V64:$Rn)), (REV64v2i32 V64:$Rn)>; 2907*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64rev64 V128:$Rn)), (REV64v4i32 V128:$Rn)>; 2908*9880d681SAndroid Build Coastguard Worker 2909*9880d681SAndroid Build Coastguard Worker// Patterns for vector long shift (by element width). These need to match all 2910*9880d681SAndroid Build Coastguard Worker// three of zext, sext and anyext so it's easier to pull the patterns out of the 2911*9880d681SAndroid Build Coastguard Worker// definition. 2912*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorLShiftLongBySizeBHSPats<SDPatternOperator ext> { 2913*9880d681SAndroid Build Coastguard Worker def : Pat<(AArch64vshl (v8i16 (ext (v8i8 V64:$Rn))), (i32 8)), 2914*9880d681SAndroid Build Coastguard Worker (SHLLv8i8 V64:$Rn)>; 2915*9880d681SAndroid Build Coastguard Worker def : Pat<(AArch64vshl (v8i16 (ext (extract_high_v16i8 V128:$Rn))), (i32 8)), 2916*9880d681SAndroid Build Coastguard Worker (SHLLv16i8 V128:$Rn)>; 2917*9880d681SAndroid Build Coastguard Worker def : Pat<(AArch64vshl (v4i32 (ext (v4i16 V64:$Rn))), (i32 16)), 2918*9880d681SAndroid Build Coastguard Worker (SHLLv4i16 V64:$Rn)>; 2919*9880d681SAndroid Build Coastguard Worker def : Pat<(AArch64vshl (v4i32 (ext (extract_high_v8i16 V128:$Rn))), (i32 16)), 2920*9880d681SAndroid Build Coastguard Worker (SHLLv8i16 V128:$Rn)>; 2921*9880d681SAndroid Build Coastguard Worker def : Pat<(AArch64vshl (v2i64 (ext (v2i32 V64:$Rn))), (i32 32)), 2922*9880d681SAndroid Build Coastguard Worker (SHLLv2i32 V64:$Rn)>; 2923*9880d681SAndroid Build Coastguard Worker def : Pat<(AArch64vshl (v2i64 (ext (extract_high_v4i32 V128:$Rn))), (i32 32)), 2924*9880d681SAndroid Build Coastguard Worker (SHLLv4i32 V128:$Rn)>; 2925*9880d681SAndroid Build Coastguard Worker} 2926*9880d681SAndroid Build Coastguard Worker 2927*9880d681SAndroid Build Coastguard Workerdefm : SIMDVectorLShiftLongBySizeBHSPats<anyext>; 2928*9880d681SAndroid Build Coastguard Workerdefm : SIMDVectorLShiftLongBySizeBHSPats<zext>; 2929*9880d681SAndroid Build Coastguard Workerdefm : SIMDVectorLShiftLongBySizeBHSPats<sext>; 2930*9880d681SAndroid Build Coastguard Worker 2931*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2932*9880d681SAndroid Build Coastguard Worker// Advanced SIMD three vector instructions. 2933*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2934*9880d681SAndroid Build Coastguard Worker 2935*9880d681SAndroid Build Coastguard Workerdefm ADD : SIMDThreeSameVector<0, 0b10000, "add", add>; 2936*9880d681SAndroid Build Coastguard Workerdefm ADDP : SIMDThreeSameVector<0, 0b10111, "addp", int_aarch64_neon_addp>; 2937*9880d681SAndroid Build Coastguard Workerdefm CMEQ : SIMDThreeSameVector<1, 0b10001, "cmeq", AArch64cmeq>; 2938*9880d681SAndroid Build Coastguard Workerdefm CMGE : SIMDThreeSameVector<0, 0b00111, "cmge", AArch64cmge>; 2939*9880d681SAndroid Build Coastguard Workerdefm CMGT : SIMDThreeSameVector<0, 0b00110, "cmgt", AArch64cmgt>; 2940*9880d681SAndroid Build Coastguard Workerdefm CMHI : SIMDThreeSameVector<1, 0b00110, "cmhi", AArch64cmhi>; 2941*9880d681SAndroid Build Coastguard Workerdefm CMHS : SIMDThreeSameVector<1, 0b00111, "cmhs", AArch64cmhs>; 2942*9880d681SAndroid Build Coastguard Workerdefm CMTST : SIMDThreeSameVector<0, 0b10001, "cmtst", AArch64cmtst>; 2943*9880d681SAndroid Build Coastguard Workerdefm FABD : SIMDThreeSameVectorFP<1,1,0b010,"fabd", int_aarch64_neon_fabd>; 2944*9880d681SAndroid Build Coastguard Workerdefm FACGE : SIMDThreeSameVectorFPCmp<1,0,0b101,"facge",int_aarch64_neon_facge>; 2945*9880d681SAndroid Build Coastguard Workerdefm FACGT : SIMDThreeSameVectorFPCmp<1,1,0b101,"facgt",int_aarch64_neon_facgt>; 2946*9880d681SAndroid Build Coastguard Workerdefm FADDP : SIMDThreeSameVectorFP<1,0,0b010,"faddp",int_aarch64_neon_addp>; 2947*9880d681SAndroid Build Coastguard Workerdefm FADD : SIMDThreeSameVectorFP<0,0,0b010,"fadd", fadd>; 2948*9880d681SAndroid Build Coastguard Workerdefm FCMEQ : SIMDThreeSameVectorFPCmp<0, 0, 0b100, "fcmeq", AArch64fcmeq>; 2949*9880d681SAndroid Build Coastguard Workerdefm FCMGE : SIMDThreeSameVectorFPCmp<1, 0, 0b100, "fcmge", AArch64fcmge>; 2950*9880d681SAndroid Build Coastguard Workerdefm FCMGT : SIMDThreeSameVectorFPCmp<1, 1, 0b100, "fcmgt", AArch64fcmgt>; 2951*9880d681SAndroid Build Coastguard Workerdefm FDIV : SIMDThreeSameVectorFP<1,0,0b111,"fdiv", fdiv>; 2952*9880d681SAndroid Build Coastguard Workerdefm FMAXNMP : SIMDThreeSameVectorFP<1,0,0b000,"fmaxnmp", int_aarch64_neon_fmaxnmp>; 2953*9880d681SAndroid Build Coastguard Workerdefm FMAXNM : SIMDThreeSameVectorFP<0,0,0b000,"fmaxnm", fmaxnum>; 2954*9880d681SAndroid Build Coastguard Workerdefm FMAXP : SIMDThreeSameVectorFP<1,0,0b110,"fmaxp", int_aarch64_neon_fmaxp>; 2955*9880d681SAndroid Build Coastguard Workerdefm FMAX : SIMDThreeSameVectorFP<0,0,0b110,"fmax", fmaxnan>; 2956*9880d681SAndroid Build Coastguard Workerdefm FMINNMP : SIMDThreeSameVectorFP<1,1,0b000,"fminnmp", int_aarch64_neon_fminnmp>; 2957*9880d681SAndroid Build Coastguard Workerdefm FMINNM : SIMDThreeSameVectorFP<0,1,0b000,"fminnm", fminnum>; 2958*9880d681SAndroid Build Coastguard Workerdefm FMINP : SIMDThreeSameVectorFP<1,1,0b110,"fminp", int_aarch64_neon_fminp>; 2959*9880d681SAndroid Build Coastguard Workerdefm FMIN : SIMDThreeSameVectorFP<0,1,0b110,"fmin", fminnan>; 2960*9880d681SAndroid Build Coastguard Worker 2961*9880d681SAndroid Build Coastguard Worker// NOTE: The operands of the PatFrag are reordered on FMLA/FMLS because the 2962*9880d681SAndroid Build Coastguard Worker// instruction expects the addend first, while the fma intrinsic puts it last. 2963*9880d681SAndroid Build Coastguard Workerdefm FMLA : SIMDThreeSameVectorFPTied<0, 0, 0b001, "fmla", 2964*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$RHS, node:$MHS, node:$LHS)> >; 2965*9880d681SAndroid Build Coastguard Workerdefm FMLS : SIMDThreeSameVectorFPTied<0, 1, 0b001, "fmls", 2966*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$MHS, (fneg node:$RHS), node:$LHS)> >; 2967*9880d681SAndroid Build Coastguard Worker 2968*9880d681SAndroid Build Coastguard Worker// The following def pats catch the case where the LHS of an FMA is negated. 2969*9880d681SAndroid Build Coastguard Worker// The TriOpFrag above catches the case where the middle operand is negated. 2970*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (fma (fneg V64:$Rn), V64:$Rm, V64:$Rd)), 2971*9880d681SAndroid Build Coastguard Worker (FMLSv2f32 V64:$Rd, V64:$Rn, V64:$Rm)>; 2972*9880d681SAndroid Build Coastguard Worker 2973*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fma (fneg V128:$Rn), V128:$Rm, V128:$Rd)), 2974*9880d681SAndroid Build Coastguard Worker (FMLSv4f32 V128:$Rd, V128:$Rn, V128:$Rm)>; 2975*9880d681SAndroid Build Coastguard Worker 2976*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (fma (fneg V128:$Rn), V128:$Rm, V128:$Rd)), 2977*9880d681SAndroid Build Coastguard Worker (FMLSv2f64 V128:$Rd, V128:$Rn, V128:$Rm)>; 2978*9880d681SAndroid Build Coastguard Worker 2979*9880d681SAndroid Build Coastguard Workerdefm FMULX : SIMDThreeSameVectorFP<0,0,0b011,"fmulx", int_aarch64_neon_fmulx>; 2980*9880d681SAndroid Build Coastguard Workerdefm FMUL : SIMDThreeSameVectorFP<1,0,0b011,"fmul", fmul>; 2981*9880d681SAndroid Build Coastguard Workerdefm FRECPS : SIMDThreeSameVectorFP<0,0,0b111,"frecps", int_aarch64_neon_frecps>; 2982*9880d681SAndroid Build Coastguard Workerdefm FRSQRTS : SIMDThreeSameVectorFP<0,1,0b111,"frsqrts", int_aarch64_neon_frsqrts>; 2983*9880d681SAndroid Build Coastguard Workerdefm FSUB : SIMDThreeSameVectorFP<0,1,0b010,"fsub", fsub>; 2984*9880d681SAndroid Build Coastguard Workerdefm MLA : SIMDThreeSameVectorBHSTied<0, 0b10010, "mla", 2985*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (mul node:$MHS, node:$RHS))> >; 2986*9880d681SAndroid Build Coastguard Workerdefm MLS : SIMDThreeSameVectorBHSTied<1, 0b10010, "mls", 2987*9880d681SAndroid Build Coastguard Worker TriOpFrag<(sub node:$LHS, (mul node:$MHS, node:$RHS))> >; 2988*9880d681SAndroid Build Coastguard Workerdefm MUL : SIMDThreeSameVectorBHS<0, 0b10011, "mul", mul>; 2989*9880d681SAndroid Build Coastguard Workerdefm PMUL : SIMDThreeSameVectorB<1, 0b10011, "pmul", int_aarch64_neon_pmul>; 2990*9880d681SAndroid Build Coastguard Workerdefm SABA : SIMDThreeSameVectorBHSTied<0, 0b01111, "saba", 2991*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (int_aarch64_neon_sabd node:$MHS, node:$RHS))> >; 2992*9880d681SAndroid Build Coastguard Workerdefm SABD : SIMDThreeSameVectorBHS<0,0b01110,"sabd", int_aarch64_neon_sabd>; 2993*9880d681SAndroid Build Coastguard Workerdefm SHADD : SIMDThreeSameVectorBHS<0,0b00000,"shadd", int_aarch64_neon_shadd>; 2994*9880d681SAndroid Build Coastguard Workerdefm SHSUB : SIMDThreeSameVectorBHS<0,0b00100,"shsub", int_aarch64_neon_shsub>; 2995*9880d681SAndroid Build Coastguard Workerdefm SMAXP : SIMDThreeSameVectorBHS<0,0b10100,"smaxp", int_aarch64_neon_smaxp>; 2996*9880d681SAndroid Build Coastguard Workerdefm SMAX : SIMDThreeSameVectorBHS<0,0b01100,"smax", smax>; 2997*9880d681SAndroid Build Coastguard Workerdefm SMINP : SIMDThreeSameVectorBHS<0,0b10101,"sminp", int_aarch64_neon_sminp>; 2998*9880d681SAndroid Build Coastguard Workerdefm SMIN : SIMDThreeSameVectorBHS<0,0b01101,"smin", smin>; 2999*9880d681SAndroid Build Coastguard Workerdefm SQADD : SIMDThreeSameVector<0,0b00001,"sqadd", int_aarch64_neon_sqadd>; 3000*9880d681SAndroid Build Coastguard Workerdefm SQDMULH : SIMDThreeSameVectorHS<0,0b10110,"sqdmulh",int_aarch64_neon_sqdmulh>; 3001*9880d681SAndroid Build Coastguard Workerdefm SQRDMULH : SIMDThreeSameVectorHS<1,0b10110,"sqrdmulh",int_aarch64_neon_sqrdmulh>; 3002*9880d681SAndroid Build Coastguard Workerdefm SQRSHL : SIMDThreeSameVector<0,0b01011,"sqrshl", int_aarch64_neon_sqrshl>; 3003*9880d681SAndroid Build Coastguard Workerdefm SQSHL : SIMDThreeSameVector<0,0b01001,"sqshl", int_aarch64_neon_sqshl>; 3004*9880d681SAndroid Build Coastguard Workerdefm SQSUB : SIMDThreeSameVector<0,0b00101,"sqsub", int_aarch64_neon_sqsub>; 3005*9880d681SAndroid Build Coastguard Workerdefm SRHADD : SIMDThreeSameVectorBHS<0,0b00010,"srhadd",int_aarch64_neon_srhadd>; 3006*9880d681SAndroid Build Coastguard Workerdefm SRSHL : SIMDThreeSameVector<0,0b01010,"srshl", int_aarch64_neon_srshl>; 3007*9880d681SAndroid Build Coastguard Workerdefm SSHL : SIMDThreeSameVector<0,0b01000,"sshl", int_aarch64_neon_sshl>; 3008*9880d681SAndroid Build Coastguard Workerdefm SUB : SIMDThreeSameVector<1,0b10000,"sub", sub>; 3009*9880d681SAndroid Build Coastguard Workerdefm UABA : SIMDThreeSameVectorBHSTied<1, 0b01111, "uaba", 3010*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (int_aarch64_neon_uabd node:$MHS, node:$RHS))> >; 3011*9880d681SAndroid Build Coastguard Workerdefm UABD : SIMDThreeSameVectorBHS<1,0b01110,"uabd", int_aarch64_neon_uabd>; 3012*9880d681SAndroid Build Coastguard Workerdefm UHADD : SIMDThreeSameVectorBHS<1,0b00000,"uhadd", int_aarch64_neon_uhadd>; 3013*9880d681SAndroid Build Coastguard Workerdefm UHSUB : SIMDThreeSameVectorBHS<1,0b00100,"uhsub", int_aarch64_neon_uhsub>; 3014*9880d681SAndroid Build Coastguard Workerdefm UMAXP : SIMDThreeSameVectorBHS<1,0b10100,"umaxp", int_aarch64_neon_umaxp>; 3015*9880d681SAndroid Build Coastguard Workerdefm UMAX : SIMDThreeSameVectorBHS<1,0b01100,"umax", umax>; 3016*9880d681SAndroid Build Coastguard Workerdefm UMINP : SIMDThreeSameVectorBHS<1,0b10101,"uminp", int_aarch64_neon_uminp>; 3017*9880d681SAndroid Build Coastguard Workerdefm UMIN : SIMDThreeSameVectorBHS<1,0b01101,"umin", umin>; 3018*9880d681SAndroid Build Coastguard Workerdefm UQADD : SIMDThreeSameVector<1,0b00001,"uqadd", int_aarch64_neon_uqadd>; 3019*9880d681SAndroid Build Coastguard Workerdefm UQRSHL : SIMDThreeSameVector<1,0b01011,"uqrshl", int_aarch64_neon_uqrshl>; 3020*9880d681SAndroid Build Coastguard Workerdefm UQSHL : SIMDThreeSameVector<1,0b01001,"uqshl", int_aarch64_neon_uqshl>; 3021*9880d681SAndroid Build Coastguard Workerdefm UQSUB : SIMDThreeSameVector<1,0b00101,"uqsub", int_aarch64_neon_uqsub>; 3022*9880d681SAndroid Build Coastguard Workerdefm URHADD : SIMDThreeSameVectorBHS<1,0b00010,"urhadd", int_aarch64_neon_urhadd>; 3023*9880d681SAndroid Build Coastguard Workerdefm URSHL : SIMDThreeSameVector<1,0b01010,"urshl", int_aarch64_neon_urshl>; 3024*9880d681SAndroid Build Coastguard Workerdefm USHL : SIMDThreeSameVector<1,0b01000,"ushl", int_aarch64_neon_ushl>; 3025*9880d681SAndroid Build Coastguard Workerdefm SQRDMLAH : SIMDThreeSameVectorSQRDMLxHTiedHS<1,0b10000,"sqrdmlah", 3026*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqadd>; 3027*9880d681SAndroid Build Coastguard Workerdefm SQRDMLSH : SIMDThreeSameVectorSQRDMLxHTiedHS<1,0b10001,"sqrdmlsh", 3028*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqsub>; 3029*9880d681SAndroid Build Coastguard Worker 3030*9880d681SAndroid Build Coastguard Workerdefm AND : SIMDLogicalThreeVector<0, 0b00, "and", and>; 3031*9880d681SAndroid Build Coastguard Workerdefm BIC : SIMDLogicalThreeVector<0, 0b01, "bic", 3032*9880d681SAndroid Build Coastguard Worker BinOpFrag<(and node:$LHS, (vnot node:$RHS))> >; 3033*9880d681SAndroid Build Coastguard Workerdefm BIF : SIMDLogicalThreeVector<1, 0b11, "bif">; 3034*9880d681SAndroid Build Coastguard Workerdefm BIT : SIMDLogicalThreeVectorTied<1, 0b10, "bit", AArch64bit>; 3035*9880d681SAndroid Build Coastguard Workerdefm BSL : SIMDLogicalThreeVectorTied<1, 0b01, "bsl", 3036*9880d681SAndroid Build Coastguard Worker TriOpFrag<(or (and node:$LHS, node:$MHS), (and (vnot node:$LHS), node:$RHS))>>; 3037*9880d681SAndroid Build Coastguard Workerdefm EOR : SIMDLogicalThreeVector<1, 0b00, "eor", xor>; 3038*9880d681SAndroid Build Coastguard Workerdefm ORN : SIMDLogicalThreeVector<0, 0b11, "orn", 3039*9880d681SAndroid Build Coastguard Worker BinOpFrag<(or node:$LHS, (vnot node:$RHS))> >; 3040*9880d681SAndroid Build Coastguard Workerdefm ORR : SIMDLogicalThreeVector<0, 0b10, "orr", or>; 3041*9880d681SAndroid Build Coastguard Worker 3042*9880d681SAndroid Build Coastguard Worker 3043*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v8i8 V64:$Rd), V64:$Rn, V64:$Rm), 3044*9880d681SAndroid Build Coastguard Worker (BSLv8i8 V64:$Rd, V64:$Rn, V64:$Rm)>; 3045*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v4i16 V64:$Rd), V64:$Rn, V64:$Rm), 3046*9880d681SAndroid Build Coastguard Worker (BSLv8i8 V64:$Rd, V64:$Rn, V64:$Rm)>; 3047*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v2i32 V64:$Rd), V64:$Rn, V64:$Rm), 3048*9880d681SAndroid Build Coastguard Worker (BSLv8i8 V64:$Rd, V64:$Rn, V64:$Rm)>; 3049*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v1i64 V64:$Rd), V64:$Rn, V64:$Rm), 3050*9880d681SAndroid Build Coastguard Worker (BSLv8i8 V64:$Rd, V64:$Rn, V64:$Rm)>; 3051*9880d681SAndroid Build Coastguard Worker 3052*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v16i8 V128:$Rd), V128:$Rn, V128:$Rm), 3053*9880d681SAndroid Build Coastguard Worker (BSLv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>; 3054*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v8i16 V128:$Rd), V128:$Rn, V128:$Rm), 3055*9880d681SAndroid Build Coastguard Worker (BSLv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>; 3056*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v4i32 V128:$Rd), V128:$Rn, V128:$Rm), 3057*9880d681SAndroid Build Coastguard Worker (BSLv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>; 3058*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v2i64 V128:$Rd), V128:$Rn, V128:$Rm), 3059*9880d681SAndroid Build Coastguard Worker (BSLv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>; 3060*9880d681SAndroid Build Coastguard Worker 3061*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.16b, $src.16b|.16b\t$dst, $src}", 3062*9880d681SAndroid Build Coastguard Worker (ORRv16i8 V128:$dst, V128:$src, V128:$src), 1>; 3063*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.8h, $src.8h|.8h\t$dst, $src}", 3064*9880d681SAndroid Build Coastguard Worker (ORRv16i8 V128:$dst, V128:$src, V128:$src), 0>; 3065*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.4s, $src.4s|.4s\t$dst, $src}", 3066*9880d681SAndroid Build Coastguard Worker (ORRv16i8 V128:$dst, V128:$src, V128:$src), 0>; 3067*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.2d, $src.2d|.2d\t$dst, $src}", 3068*9880d681SAndroid Build Coastguard Worker (ORRv16i8 V128:$dst, V128:$src, V128:$src), 0>; 3069*9880d681SAndroid Build Coastguard Worker 3070*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.8b, $src.8b|.8b\t$dst, $src}", 3071*9880d681SAndroid Build Coastguard Worker (ORRv8i8 V64:$dst, V64:$src, V64:$src), 1>; 3072*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.4h, $src.4h|.4h\t$dst, $src}", 3073*9880d681SAndroid Build Coastguard Worker (ORRv8i8 V64:$dst, V64:$src, V64:$src), 0>; 3074*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.2s, $src.2s|.2s\t$dst, $src}", 3075*9880d681SAndroid Build Coastguard Worker (ORRv8i8 V64:$dst, V64:$src, V64:$src), 0>; 3076*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.1d, $src.1d|.1d\t$dst, $src}", 3077*9880d681SAndroid Build Coastguard Worker (ORRv8i8 V64:$dst, V64:$src, V64:$src), 0>; 3078*9880d681SAndroid Build Coastguard Worker 3079*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.8b, $src1.8b, $src2.8b" # 3080*9880d681SAndroid Build Coastguard Worker "|cmls.8b\t$dst, $src1, $src2}", 3081*9880d681SAndroid Build Coastguard Worker (CMHSv8i8 V64:$dst, V64:$src2, V64:$src1), 0>; 3082*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.16b, $src1.16b, $src2.16b" # 3083*9880d681SAndroid Build Coastguard Worker "|cmls.16b\t$dst, $src1, $src2}", 3084*9880d681SAndroid Build Coastguard Worker (CMHSv16i8 V128:$dst, V128:$src2, V128:$src1), 0>; 3085*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.4h, $src1.4h, $src2.4h" # 3086*9880d681SAndroid Build Coastguard Worker "|cmls.4h\t$dst, $src1, $src2}", 3087*9880d681SAndroid Build Coastguard Worker (CMHSv4i16 V64:$dst, V64:$src2, V64:$src1), 0>; 3088*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.8h, $src1.8h, $src2.8h" # 3089*9880d681SAndroid Build Coastguard Worker "|cmls.8h\t$dst, $src1, $src2}", 3090*9880d681SAndroid Build Coastguard Worker (CMHSv8i16 V128:$dst, V128:$src2, V128:$src1), 0>; 3091*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.2s, $src1.2s, $src2.2s" # 3092*9880d681SAndroid Build Coastguard Worker "|cmls.2s\t$dst, $src1, $src2}", 3093*9880d681SAndroid Build Coastguard Worker (CMHSv2i32 V64:$dst, V64:$src2, V64:$src1), 0>; 3094*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.4s, $src1.4s, $src2.4s" # 3095*9880d681SAndroid Build Coastguard Worker "|cmls.4s\t$dst, $src1, $src2}", 3096*9880d681SAndroid Build Coastguard Worker (CMHSv4i32 V128:$dst, V128:$src2, V128:$src1), 0>; 3097*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.2d, $src1.2d, $src2.2d" # 3098*9880d681SAndroid Build Coastguard Worker "|cmls.2d\t$dst, $src1, $src2}", 3099*9880d681SAndroid Build Coastguard Worker (CMHSv2i64 V128:$dst, V128:$src2, V128:$src1), 0>; 3100*9880d681SAndroid Build Coastguard Worker 3101*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.8b, $src1.8b, $src2.8b" # 3102*9880d681SAndroid Build Coastguard Worker "|cmlo.8b\t$dst, $src1, $src2}", 3103*9880d681SAndroid Build Coastguard Worker (CMHIv8i8 V64:$dst, V64:$src2, V64:$src1), 0>; 3104*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.16b, $src1.16b, $src2.16b" # 3105*9880d681SAndroid Build Coastguard Worker "|cmlo.16b\t$dst, $src1, $src2}", 3106*9880d681SAndroid Build Coastguard Worker (CMHIv16i8 V128:$dst, V128:$src2, V128:$src1), 0>; 3107*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.4h, $src1.4h, $src2.4h" # 3108*9880d681SAndroid Build Coastguard Worker "|cmlo.4h\t$dst, $src1, $src2}", 3109*9880d681SAndroid Build Coastguard Worker (CMHIv4i16 V64:$dst, V64:$src2, V64:$src1), 0>; 3110*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.8h, $src1.8h, $src2.8h" # 3111*9880d681SAndroid Build Coastguard Worker "|cmlo.8h\t$dst, $src1, $src2}", 3112*9880d681SAndroid Build Coastguard Worker (CMHIv8i16 V128:$dst, V128:$src2, V128:$src1), 0>; 3113*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.2s, $src1.2s, $src2.2s" # 3114*9880d681SAndroid Build Coastguard Worker "|cmlo.2s\t$dst, $src1, $src2}", 3115*9880d681SAndroid Build Coastguard Worker (CMHIv2i32 V64:$dst, V64:$src2, V64:$src1), 0>; 3116*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.4s, $src1.4s, $src2.4s" # 3117*9880d681SAndroid Build Coastguard Worker "|cmlo.4s\t$dst, $src1, $src2}", 3118*9880d681SAndroid Build Coastguard Worker (CMHIv4i32 V128:$dst, V128:$src2, V128:$src1), 0>; 3119*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.2d, $src1.2d, $src2.2d" # 3120*9880d681SAndroid Build Coastguard Worker "|cmlo.2d\t$dst, $src1, $src2}", 3121*9880d681SAndroid Build Coastguard Worker (CMHIv2i64 V128:$dst, V128:$src2, V128:$src1), 0>; 3122*9880d681SAndroid Build Coastguard Worker 3123*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.8b, $src1.8b, $src2.8b" # 3124*9880d681SAndroid Build Coastguard Worker "|cmle.8b\t$dst, $src1, $src2}", 3125*9880d681SAndroid Build Coastguard Worker (CMGEv8i8 V64:$dst, V64:$src2, V64:$src1), 0>; 3126*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.16b, $src1.16b, $src2.16b" # 3127*9880d681SAndroid Build Coastguard Worker "|cmle.16b\t$dst, $src1, $src2}", 3128*9880d681SAndroid Build Coastguard Worker (CMGEv16i8 V128:$dst, V128:$src2, V128:$src1), 0>; 3129*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.4h, $src1.4h, $src2.4h" # 3130*9880d681SAndroid Build Coastguard Worker "|cmle.4h\t$dst, $src1, $src2}", 3131*9880d681SAndroid Build Coastguard Worker (CMGEv4i16 V64:$dst, V64:$src2, V64:$src1), 0>; 3132*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.8h, $src1.8h, $src2.8h" # 3133*9880d681SAndroid Build Coastguard Worker "|cmle.8h\t$dst, $src1, $src2}", 3134*9880d681SAndroid Build Coastguard Worker (CMGEv8i16 V128:$dst, V128:$src2, V128:$src1), 0>; 3135*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.2s, $src1.2s, $src2.2s" # 3136*9880d681SAndroid Build Coastguard Worker "|cmle.2s\t$dst, $src1, $src2}", 3137*9880d681SAndroid Build Coastguard Worker (CMGEv2i32 V64:$dst, V64:$src2, V64:$src1), 0>; 3138*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.4s, $src1.4s, $src2.4s" # 3139*9880d681SAndroid Build Coastguard Worker "|cmle.4s\t$dst, $src1, $src2}", 3140*9880d681SAndroid Build Coastguard Worker (CMGEv4i32 V128:$dst, V128:$src2, V128:$src1), 0>; 3141*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.2d, $src1.2d, $src2.2d" # 3142*9880d681SAndroid Build Coastguard Worker "|cmle.2d\t$dst, $src1, $src2}", 3143*9880d681SAndroid Build Coastguard Worker (CMGEv2i64 V128:$dst, V128:$src2, V128:$src1), 0>; 3144*9880d681SAndroid Build Coastguard Worker 3145*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.8b, $src1.8b, $src2.8b" # 3146*9880d681SAndroid Build Coastguard Worker "|cmlt.8b\t$dst, $src1, $src2}", 3147*9880d681SAndroid Build Coastguard Worker (CMGTv8i8 V64:$dst, V64:$src2, V64:$src1), 0>; 3148*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.16b, $src1.16b, $src2.16b" # 3149*9880d681SAndroid Build Coastguard Worker "|cmlt.16b\t$dst, $src1, $src2}", 3150*9880d681SAndroid Build Coastguard Worker (CMGTv16i8 V128:$dst, V128:$src2, V128:$src1), 0>; 3151*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.4h, $src1.4h, $src2.4h" # 3152*9880d681SAndroid Build Coastguard Worker "|cmlt.4h\t$dst, $src1, $src2}", 3153*9880d681SAndroid Build Coastguard Worker (CMGTv4i16 V64:$dst, V64:$src2, V64:$src1), 0>; 3154*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.8h, $src1.8h, $src2.8h" # 3155*9880d681SAndroid Build Coastguard Worker "|cmlt.8h\t$dst, $src1, $src2}", 3156*9880d681SAndroid Build Coastguard Worker (CMGTv8i16 V128:$dst, V128:$src2, V128:$src1), 0>; 3157*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.2s, $src1.2s, $src2.2s" # 3158*9880d681SAndroid Build Coastguard Worker "|cmlt.2s\t$dst, $src1, $src2}", 3159*9880d681SAndroid Build Coastguard Worker (CMGTv2i32 V64:$dst, V64:$src2, V64:$src1), 0>; 3160*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.4s, $src1.4s, $src2.4s" # 3161*9880d681SAndroid Build Coastguard Worker "|cmlt.4s\t$dst, $src1, $src2}", 3162*9880d681SAndroid Build Coastguard Worker (CMGTv4i32 V128:$dst, V128:$src2, V128:$src1), 0>; 3163*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.2d, $src1.2d, $src2.2d" # 3164*9880d681SAndroid Build Coastguard Worker "|cmlt.2d\t$dst, $src1, $src2}", 3165*9880d681SAndroid Build Coastguard Worker (CMGTv2i64 V128:$dst, V128:$src2, V128:$src1), 0>; 3166*9880d681SAndroid Build Coastguard Worker 3167*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in { 3168*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.4h, $src1.4h, $src2.4h" # 3169*9880d681SAndroid Build Coastguard Worker "|fcmle.4h\t$dst, $src1, $src2}", 3170*9880d681SAndroid Build Coastguard Worker (FCMGEv4f16 V64:$dst, V64:$src2, V64:$src1), 0>; 3171*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.8h, $src1.8h, $src2.8h" # 3172*9880d681SAndroid Build Coastguard Worker "|fcmle.8h\t$dst, $src1, $src2}", 3173*9880d681SAndroid Build Coastguard Worker (FCMGEv8f16 V128:$dst, V128:$src2, V128:$src1), 0>; 3174*9880d681SAndroid Build Coastguard Worker} 3175*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.2s, $src1.2s, $src2.2s" # 3176*9880d681SAndroid Build Coastguard Worker "|fcmle.2s\t$dst, $src1, $src2}", 3177*9880d681SAndroid Build Coastguard Worker (FCMGEv2f32 V64:$dst, V64:$src2, V64:$src1), 0>; 3178*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.4s, $src1.4s, $src2.4s" # 3179*9880d681SAndroid Build Coastguard Worker "|fcmle.4s\t$dst, $src1, $src2}", 3180*9880d681SAndroid Build Coastguard Worker (FCMGEv4f32 V128:$dst, V128:$src2, V128:$src1), 0>; 3181*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.2d, $src1.2d, $src2.2d" # 3182*9880d681SAndroid Build Coastguard Worker "|fcmle.2d\t$dst, $src1, $src2}", 3183*9880d681SAndroid Build Coastguard Worker (FCMGEv2f64 V128:$dst, V128:$src2, V128:$src1), 0>; 3184*9880d681SAndroid Build Coastguard Worker 3185*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in { 3186*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.4h, $src1.4h, $src2.4h" # 3187*9880d681SAndroid Build Coastguard Worker "|fcmlt.4h\t$dst, $src1, $src2}", 3188*9880d681SAndroid Build Coastguard Worker (FCMGTv4f16 V64:$dst, V64:$src2, V64:$src1), 0>; 3189*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.8h, $src1.8h, $src2.8h" # 3190*9880d681SAndroid Build Coastguard Worker "|fcmlt.8h\t$dst, $src1, $src2}", 3191*9880d681SAndroid Build Coastguard Worker (FCMGTv8f16 V128:$dst, V128:$src2, V128:$src1), 0>; 3192*9880d681SAndroid Build Coastguard Worker} 3193*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.2s, $src1.2s, $src2.2s" # 3194*9880d681SAndroid Build Coastguard Worker "|fcmlt.2s\t$dst, $src1, $src2}", 3195*9880d681SAndroid Build Coastguard Worker (FCMGTv2f32 V64:$dst, V64:$src2, V64:$src1), 0>; 3196*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.4s, $src1.4s, $src2.4s" # 3197*9880d681SAndroid Build Coastguard Worker "|fcmlt.4s\t$dst, $src1, $src2}", 3198*9880d681SAndroid Build Coastguard Worker (FCMGTv4f32 V128:$dst, V128:$src2, V128:$src1), 0>; 3199*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.2d, $src1.2d, $src2.2d" # 3200*9880d681SAndroid Build Coastguard Worker "|fcmlt.2d\t$dst, $src1, $src2}", 3201*9880d681SAndroid Build Coastguard Worker (FCMGTv2f64 V128:$dst, V128:$src2, V128:$src1), 0>; 3202*9880d681SAndroid Build Coastguard Worker 3203*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in { 3204*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.4h, $src1.4h, $src2.4h" # 3205*9880d681SAndroid Build Coastguard Worker "|facle.4h\t$dst, $src1, $src2}", 3206*9880d681SAndroid Build Coastguard Worker (FACGEv4f16 V64:$dst, V64:$src2, V64:$src1), 0>; 3207*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.8h, $src1.8h, $src2.8h" # 3208*9880d681SAndroid Build Coastguard Worker "|facle.8h\t$dst, $src1, $src2}", 3209*9880d681SAndroid Build Coastguard Worker (FACGEv8f16 V128:$dst, V128:$src2, V128:$src1), 0>; 3210*9880d681SAndroid Build Coastguard Worker} 3211*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.2s, $src1.2s, $src2.2s" # 3212*9880d681SAndroid Build Coastguard Worker "|facle.2s\t$dst, $src1, $src2}", 3213*9880d681SAndroid Build Coastguard Worker (FACGEv2f32 V64:$dst, V64:$src2, V64:$src1), 0>; 3214*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.4s, $src1.4s, $src2.4s" # 3215*9880d681SAndroid Build Coastguard Worker "|facle.4s\t$dst, $src1, $src2}", 3216*9880d681SAndroid Build Coastguard Worker (FACGEv4f32 V128:$dst, V128:$src2, V128:$src1), 0>; 3217*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.2d, $src1.2d, $src2.2d" # 3218*9880d681SAndroid Build Coastguard Worker "|facle.2d\t$dst, $src1, $src2}", 3219*9880d681SAndroid Build Coastguard Worker (FACGEv2f64 V128:$dst, V128:$src2, V128:$src1), 0>; 3220*9880d681SAndroid Build Coastguard Worker 3221*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in { 3222*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.4h, $src1.4h, $src2.4h" # 3223*9880d681SAndroid Build Coastguard Worker "|faclt.4h\t$dst, $src1, $src2}", 3224*9880d681SAndroid Build Coastguard Worker (FACGTv4f16 V64:$dst, V64:$src2, V64:$src1), 0>; 3225*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.8h, $src1.8h, $src2.8h" # 3226*9880d681SAndroid Build Coastguard Worker "|faclt.8h\t$dst, $src1, $src2}", 3227*9880d681SAndroid Build Coastguard Worker (FACGTv8f16 V128:$dst, V128:$src2, V128:$src1), 0>; 3228*9880d681SAndroid Build Coastguard Worker} 3229*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.2s, $src1.2s, $src2.2s" # 3230*9880d681SAndroid Build Coastguard Worker "|faclt.2s\t$dst, $src1, $src2}", 3231*9880d681SAndroid Build Coastguard Worker (FACGTv2f32 V64:$dst, V64:$src2, V64:$src1), 0>; 3232*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.4s, $src1.4s, $src2.4s" # 3233*9880d681SAndroid Build Coastguard Worker "|faclt.4s\t$dst, $src1, $src2}", 3234*9880d681SAndroid Build Coastguard Worker (FACGTv4f32 V128:$dst, V128:$src2, V128:$src1), 0>; 3235*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.2d, $src1.2d, $src2.2d" # 3236*9880d681SAndroid Build Coastguard Worker "|faclt.2d\t$dst, $src1, $src2}", 3237*9880d681SAndroid Build Coastguard Worker (FACGTv2f64 V128:$dst, V128:$src2, V128:$src1), 0>; 3238*9880d681SAndroid Build Coastguard Worker 3239*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3240*9880d681SAndroid Build Coastguard Worker// Advanced SIMD three scalar instructions. 3241*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3242*9880d681SAndroid Build Coastguard Worker 3243*9880d681SAndroid Build Coastguard Workerdefm ADD : SIMDThreeScalarD<0, 0b10000, "add", add>; 3244*9880d681SAndroid Build Coastguard Workerdefm CMEQ : SIMDThreeScalarD<1, 0b10001, "cmeq", AArch64cmeq>; 3245*9880d681SAndroid Build Coastguard Workerdefm CMGE : SIMDThreeScalarD<0, 0b00111, "cmge", AArch64cmge>; 3246*9880d681SAndroid Build Coastguard Workerdefm CMGT : SIMDThreeScalarD<0, 0b00110, "cmgt", AArch64cmgt>; 3247*9880d681SAndroid Build Coastguard Workerdefm CMHI : SIMDThreeScalarD<1, 0b00110, "cmhi", AArch64cmhi>; 3248*9880d681SAndroid Build Coastguard Workerdefm CMHS : SIMDThreeScalarD<1, 0b00111, "cmhs", AArch64cmhs>; 3249*9880d681SAndroid Build Coastguard Workerdefm CMTST : SIMDThreeScalarD<0, 0b10001, "cmtst", AArch64cmtst>; 3250*9880d681SAndroid Build Coastguard Workerdefm FABD : SIMDFPThreeScalar<1, 1, 0b010, "fabd", int_aarch64_sisd_fabd>; 3251*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_fabd (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))), 3252*9880d681SAndroid Build Coastguard Worker (FABD64 FPR64:$Rn, FPR64:$Rm)>; 3253*9880d681SAndroid Build Coastguard Workerdefm FACGE : SIMDThreeScalarFPCmp<1, 0, 0b101, "facge", 3254*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_facge>; 3255*9880d681SAndroid Build Coastguard Workerdefm FACGT : SIMDThreeScalarFPCmp<1, 1, 0b101, "facgt", 3256*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_facgt>; 3257*9880d681SAndroid Build Coastguard Workerdefm FCMEQ : SIMDThreeScalarFPCmp<0, 0, 0b100, "fcmeq", AArch64fcmeq>; 3258*9880d681SAndroid Build Coastguard Workerdefm FCMGE : SIMDThreeScalarFPCmp<1, 0, 0b100, "fcmge", AArch64fcmge>; 3259*9880d681SAndroid Build Coastguard Workerdefm FCMGT : SIMDThreeScalarFPCmp<1, 1, 0b100, "fcmgt", AArch64fcmgt>; 3260*9880d681SAndroid Build Coastguard Workerdefm FMULX : SIMDFPThreeScalar<0, 0, 0b011, "fmulx", int_aarch64_neon_fmulx>; 3261*9880d681SAndroid Build Coastguard Workerdefm FRECPS : SIMDFPThreeScalar<0, 0, 0b111, "frecps", int_aarch64_neon_frecps>; 3262*9880d681SAndroid Build Coastguard Workerdefm FRSQRTS : SIMDFPThreeScalar<0, 1, 0b111, "frsqrts", int_aarch64_neon_frsqrts>; 3263*9880d681SAndroid Build Coastguard Workerdefm SQADD : SIMDThreeScalarBHSD<0, 0b00001, "sqadd", int_aarch64_neon_sqadd>; 3264*9880d681SAndroid Build Coastguard Workerdefm SQDMULH : SIMDThreeScalarHS< 0, 0b10110, "sqdmulh", int_aarch64_neon_sqdmulh>; 3265*9880d681SAndroid Build Coastguard Workerdefm SQRDMULH : SIMDThreeScalarHS< 1, 0b10110, "sqrdmulh", int_aarch64_neon_sqrdmulh>; 3266*9880d681SAndroid Build Coastguard Workerdefm SQRSHL : SIMDThreeScalarBHSD<0, 0b01011, "sqrshl",int_aarch64_neon_sqrshl>; 3267*9880d681SAndroid Build Coastguard Workerdefm SQSHL : SIMDThreeScalarBHSD<0, 0b01001, "sqshl", int_aarch64_neon_sqshl>; 3268*9880d681SAndroid Build Coastguard Workerdefm SQSUB : SIMDThreeScalarBHSD<0, 0b00101, "sqsub", int_aarch64_neon_sqsub>; 3269*9880d681SAndroid Build Coastguard Workerdefm SRSHL : SIMDThreeScalarD< 0, 0b01010, "srshl", int_aarch64_neon_srshl>; 3270*9880d681SAndroid Build Coastguard Workerdefm SSHL : SIMDThreeScalarD< 0, 0b01000, "sshl", int_aarch64_neon_sshl>; 3271*9880d681SAndroid Build Coastguard Workerdefm SUB : SIMDThreeScalarD< 1, 0b10000, "sub", sub>; 3272*9880d681SAndroid Build Coastguard Workerdefm UQADD : SIMDThreeScalarBHSD<1, 0b00001, "uqadd", int_aarch64_neon_uqadd>; 3273*9880d681SAndroid Build Coastguard Workerdefm UQRSHL : SIMDThreeScalarBHSD<1, 0b01011, "uqrshl",int_aarch64_neon_uqrshl>; 3274*9880d681SAndroid Build Coastguard Workerdefm UQSHL : SIMDThreeScalarBHSD<1, 0b01001, "uqshl", int_aarch64_neon_uqshl>; 3275*9880d681SAndroid Build Coastguard Workerdefm UQSUB : SIMDThreeScalarBHSD<1, 0b00101, "uqsub", int_aarch64_neon_uqsub>; 3276*9880d681SAndroid Build Coastguard Workerdefm URSHL : SIMDThreeScalarD< 1, 0b01010, "urshl", int_aarch64_neon_urshl>; 3277*9880d681SAndroid Build Coastguard Workerdefm USHL : SIMDThreeScalarD< 1, 0b01000, "ushl", int_aarch64_neon_ushl>; 3278*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV8_1a] in { 3279*9880d681SAndroid Build Coastguard Worker defm SQRDMLAH : SIMDThreeScalarHSTied<1, 0, 0b10000, "sqrdmlah">; 3280*9880d681SAndroid Build Coastguard Worker defm SQRDMLSH : SIMDThreeScalarHSTied<1, 0, 0b10001, "sqrdmlsh">; 3281*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (int_aarch64_neon_sqadd 3282*9880d681SAndroid Build Coastguard Worker (i32 FPR32:$Rd), 3283*9880d681SAndroid Build Coastguard Worker (i32 (int_aarch64_neon_sqrdmulh (i32 FPR32:$Rn), 3284*9880d681SAndroid Build Coastguard Worker (i32 FPR32:$Rm))))), 3285*9880d681SAndroid Build Coastguard Worker (SQRDMLAHv1i32 FPR32:$Rd, FPR32:$Rn, FPR32:$Rm)>; 3286*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (int_aarch64_neon_sqsub 3287*9880d681SAndroid Build Coastguard Worker (i32 FPR32:$Rd), 3288*9880d681SAndroid Build Coastguard Worker (i32 (int_aarch64_neon_sqrdmulh (i32 FPR32:$Rn), 3289*9880d681SAndroid Build Coastguard Worker (i32 FPR32:$Rm))))), 3290*9880d681SAndroid Build Coastguard Worker (SQRDMLSHv1i32 FPR32:$Rd, FPR32:$Rn, FPR32:$Rm)>; 3291*9880d681SAndroid Build Coastguard Worker} 3292*9880d681SAndroid Build Coastguard Worker 3293*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmls $dst, $src1, $src2", 3294*9880d681SAndroid Build Coastguard Worker (CMHSv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>; 3295*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmle $dst, $src1, $src2", 3296*9880d681SAndroid Build Coastguard Worker (CMGEv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>; 3297*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmlo $dst, $src1, $src2", 3298*9880d681SAndroid Build Coastguard Worker (CMHIv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>; 3299*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmlt $dst, $src1, $src2", 3300*9880d681SAndroid Build Coastguard Worker (CMGTv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>; 3301*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"fcmle $dst, $src1, $src2", 3302*9880d681SAndroid Build Coastguard Worker (FCMGE32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>; 3303*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"fcmle $dst, $src1, $src2", 3304*9880d681SAndroid Build Coastguard Worker (FCMGE64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>; 3305*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"fcmlt $dst, $src1, $src2", 3306*9880d681SAndroid Build Coastguard Worker (FCMGT32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>; 3307*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"fcmlt $dst, $src1, $src2", 3308*9880d681SAndroid Build Coastguard Worker (FCMGT64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>; 3309*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"facle $dst, $src1, $src2", 3310*9880d681SAndroid Build Coastguard Worker (FACGE32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>; 3311*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"facle $dst, $src1, $src2", 3312*9880d681SAndroid Build Coastguard Worker (FACGE64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>; 3313*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"faclt $dst, $src1, $src2", 3314*9880d681SAndroid Build Coastguard Worker (FACGT32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>; 3315*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"faclt $dst, $src1, $src2", 3316*9880d681SAndroid Build Coastguard Worker (FACGT64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>; 3317*9880d681SAndroid Build Coastguard Worker 3318*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3319*9880d681SAndroid Build Coastguard Worker// Advanced SIMD three scalar instructions (mixed operands). 3320*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3321*9880d681SAndroid Build Coastguard Workerdefm SQDMULL : SIMDThreeScalarMixedHS<0, 0b11010, "sqdmull", 3322*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqdmulls_scalar>; 3323*9880d681SAndroid Build Coastguard Workerdefm SQDMLAL : SIMDThreeScalarMixedTiedHS<0, 0b10010, "sqdmlal">; 3324*9880d681SAndroid Build Coastguard Workerdefm SQDMLSL : SIMDThreeScalarMixedTiedHS<0, 0b10110, "sqdmlsl">; 3325*9880d681SAndroid Build Coastguard Worker 3326*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_sqadd (i64 FPR64:$Rd), 3327*9880d681SAndroid Build Coastguard Worker (i64 (int_aarch64_neon_sqdmulls_scalar (i32 FPR32:$Rn), 3328*9880d681SAndroid Build Coastguard Worker (i32 FPR32:$Rm))))), 3329*9880d681SAndroid Build Coastguard Worker (SQDMLALi32 FPR64:$Rd, FPR32:$Rn, FPR32:$Rm)>; 3330*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_sqsub (i64 FPR64:$Rd), 3331*9880d681SAndroid Build Coastguard Worker (i64 (int_aarch64_neon_sqdmulls_scalar (i32 FPR32:$Rn), 3332*9880d681SAndroid Build Coastguard Worker (i32 FPR32:$Rm))))), 3333*9880d681SAndroid Build Coastguard Worker (SQDMLSLi32 FPR64:$Rd, FPR32:$Rn, FPR32:$Rm)>; 3334*9880d681SAndroid Build Coastguard Worker 3335*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3336*9880d681SAndroid Build Coastguard Worker// Advanced SIMD two scalar instructions. 3337*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3338*9880d681SAndroid Build Coastguard Worker 3339*9880d681SAndroid Build Coastguard Workerdefm ABS : SIMDTwoScalarD< 0, 0b01011, "abs", int_aarch64_neon_abs>; 3340*9880d681SAndroid Build Coastguard Workerdefm CMEQ : SIMDCmpTwoScalarD< 0, 0b01001, "cmeq", AArch64cmeqz>; 3341*9880d681SAndroid Build Coastguard Workerdefm CMGE : SIMDCmpTwoScalarD< 1, 0b01000, "cmge", AArch64cmgez>; 3342*9880d681SAndroid Build Coastguard Workerdefm CMGT : SIMDCmpTwoScalarD< 0, 0b01000, "cmgt", AArch64cmgtz>; 3343*9880d681SAndroid Build Coastguard Workerdefm CMLE : SIMDCmpTwoScalarD< 1, 0b01001, "cmle", AArch64cmlez>; 3344*9880d681SAndroid Build Coastguard Workerdefm CMLT : SIMDCmpTwoScalarD< 0, 0b01010, "cmlt", AArch64cmltz>; 3345*9880d681SAndroid Build Coastguard Workerdefm FCMEQ : SIMDFPCmpTwoScalar<0, 1, 0b01101, "fcmeq", AArch64fcmeqz>; 3346*9880d681SAndroid Build Coastguard Workerdefm FCMGE : SIMDFPCmpTwoScalar<1, 1, 0b01100, "fcmge", AArch64fcmgez>; 3347*9880d681SAndroid Build Coastguard Workerdefm FCMGT : SIMDFPCmpTwoScalar<0, 1, 0b01100, "fcmgt", AArch64fcmgtz>; 3348*9880d681SAndroid Build Coastguard Workerdefm FCMLE : SIMDFPCmpTwoScalar<1, 1, 0b01101, "fcmle", AArch64fcmlez>; 3349*9880d681SAndroid Build Coastguard Workerdefm FCMLT : SIMDFPCmpTwoScalar<0, 1, 0b01110, "fcmlt", AArch64fcmltz>; 3350*9880d681SAndroid Build Coastguard Workerdefm FCVTAS : SIMDFPTwoScalar< 0, 0, 0b11100, "fcvtas">; 3351*9880d681SAndroid Build Coastguard Workerdefm FCVTAU : SIMDFPTwoScalar< 1, 0, 0b11100, "fcvtau">; 3352*9880d681SAndroid Build Coastguard Workerdefm FCVTMS : SIMDFPTwoScalar< 0, 0, 0b11011, "fcvtms">; 3353*9880d681SAndroid Build Coastguard Workerdefm FCVTMU : SIMDFPTwoScalar< 1, 0, 0b11011, "fcvtmu">; 3354*9880d681SAndroid Build Coastguard Workerdefm FCVTNS : SIMDFPTwoScalar< 0, 0, 0b11010, "fcvtns">; 3355*9880d681SAndroid Build Coastguard Workerdefm FCVTNU : SIMDFPTwoScalar< 1, 0, 0b11010, "fcvtnu">; 3356*9880d681SAndroid Build Coastguard Workerdefm FCVTPS : SIMDFPTwoScalar< 0, 1, 0b11010, "fcvtps">; 3357*9880d681SAndroid Build Coastguard Workerdefm FCVTPU : SIMDFPTwoScalar< 1, 1, 0b11010, "fcvtpu">; 3358*9880d681SAndroid Build Coastguard Workerdef FCVTXNv1i64 : SIMDInexactCvtTwoScalar<0b10110, "fcvtxn">; 3359*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : SIMDFPTwoScalar< 0, 1, 0b11011, "fcvtzs">; 3360*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : SIMDFPTwoScalar< 1, 1, 0b11011, "fcvtzu">; 3361*9880d681SAndroid Build Coastguard Workerdefm FRECPE : SIMDFPTwoScalar< 0, 1, 0b11101, "frecpe">; 3362*9880d681SAndroid Build Coastguard Workerdefm FRECPX : SIMDFPTwoScalar< 0, 1, 0b11111, "frecpx">; 3363*9880d681SAndroid Build Coastguard Workerdefm FRSQRTE : SIMDFPTwoScalar< 1, 1, 0b11101, "frsqrte">; 3364*9880d681SAndroid Build Coastguard Workerdefm NEG : SIMDTwoScalarD< 1, 0b01011, "neg", 3365*9880d681SAndroid Build Coastguard Worker UnOpFrag<(sub immAllZerosV, node:$LHS)> >; 3366*9880d681SAndroid Build Coastguard Workerdefm SCVTF : SIMDFPTwoScalarCVT< 0, 0, 0b11101, "scvtf", AArch64sitof>; 3367*9880d681SAndroid Build Coastguard Workerdefm SQABS : SIMDTwoScalarBHSD< 0, 0b00111, "sqabs", int_aarch64_neon_sqabs>; 3368*9880d681SAndroid Build Coastguard Workerdefm SQNEG : SIMDTwoScalarBHSD< 1, 0b00111, "sqneg", int_aarch64_neon_sqneg>; 3369*9880d681SAndroid Build Coastguard Workerdefm SQXTN : SIMDTwoScalarMixedBHS< 0, 0b10100, "sqxtn", int_aarch64_neon_scalar_sqxtn>; 3370*9880d681SAndroid Build Coastguard Workerdefm SQXTUN : SIMDTwoScalarMixedBHS< 1, 0b10010, "sqxtun", int_aarch64_neon_scalar_sqxtun>; 3371*9880d681SAndroid Build Coastguard Workerdefm SUQADD : SIMDTwoScalarBHSDTied< 0, 0b00011, "suqadd", 3372*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_suqadd>; 3373*9880d681SAndroid Build Coastguard Workerdefm UCVTF : SIMDFPTwoScalarCVT< 1, 0, 0b11101, "ucvtf", AArch64uitof>; 3374*9880d681SAndroid Build Coastguard Workerdefm UQXTN : SIMDTwoScalarMixedBHS<1, 0b10100, "uqxtn", int_aarch64_neon_scalar_uqxtn>; 3375*9880d681SAndroid Build Coastguard Workerdefm USQADD : SIMDTwoScalarBHSDTied< 1, 0b00011, "usqadd", 3376*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_usqadd>; 3377*9880d681SAndroid Build Coastguard Worker 3378*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v1i64 V64:$Rn)), (NEGv1i64 V64:$Rn)>; 3379*9880d681SAndroid Build Coastguard Worker 3380*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtas (v1f64 FPR64:$Rn))), 3381*9880d681SAndroid Build Coastguard Worker (FCVTASv1i64 FPR64:$Rn)>; 3382*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtau (v1f64 FPR64:$Rn))), 3383*9880d681SAndroid Build Coastguard Worker (FCVTAUv1i64 FPR64:$Rn)>; 3384*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtms (v1f64 FPR64:$Rn))), 3385*9880d681SAndroid Build Coastguard Worker (FCVTMSv1i64 FPR64:$Rn)>; 3386*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtmu (v1f64 FPR64:$Rn))), 3387*9880d681SAndroid Build Coastguard Worker (FCVTMUv1i64 FPR64:$Rn)>; 3388*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtns (v1f64 FPR64:$Rn))), 3389*9880d681SAndroid Build Coastguard Worker (FCVTNSv1i64 FPR64:$Rn)>; 3390*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtnu (v1f64 FPR64:$Rn))), 3391*9880d681SAndroid Build Coastguard Worker (FCVTNUv1i64 FPR64:$Rn)>; 3392*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtps (v1f64 FPR64:$Rn))), 3393*9880d681SAndroid Build Coastguard Worker (FCVTPSv1i64 FPR64:$Rn)>; 3394*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtpu (v1f64 FPR64:$Rn))), 3395*9880d681SAndroid Build Coastguard Worker (FCVTPUv1i64 FPR64:$Rn)>; 3396*9880d681SAndroid Build Coastguard Worker 3397*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_frecpe (f32 FPR32:$Rn))), 3398*9880d681SAndroid Build Coastguard Worker (FRECPEv1i32 FPR32:$Rn)>; 3399*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_frecpe (f64 FPR64:$Rn))), 3400*9880d681SAndroid Build Coastguard Worker (FRECPEv1i64 FPR64:$Rn)>; 3401*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_frecpe (v1f64 FPR64:$Rn))), 3402*9880d681SAndroid Build Coastguard Worker (FRECPEv1i64 FPR64:$Rn)>; 3403*9880d681SAndroid Build Coastguard Worker 3404*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (AArch64frecpe (f32 FPR32:$Rn))), 3405*9880d681SAndroid Build Coastguard Worker (FRECPEv1i32 FPR32:$Rn)>; 3406*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64frecpe (v2f32 V64:$Rn))), 3407*9880d681SAndroid Build Coastguard Worker (FRECPEv2f32 V64:$Rn)>; 3408*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64frecpe (v4f32 FPR128:$Rn))), 3409*9880d681SAndroid Build Coastguard Worker (FRECPEv4f32 FPR128:$Rn)>; 3410*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (AArch64frecpe (f64 FPR64:$Rn))), 3411*9880d681SAndroid Build Coastguard Worker (FRECPEv1i64 FPR64:$Rn)>; 3412*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (AArch64frecpe (v1f64 FPR64:$Rn))), 3413*9880d681SAndroid Build Coastguard Worker (FRECPEv1i64 FPR64:$Rn)>; 3414*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64frecpe (v2f64 FPR128:$Rn))), 3415*9880d681SAndroid Build Coastguard Worker (FRECPEv2f64 FPR128:$Rn)>; 3416*9880d681SAndroid Build Coastguard Worker 3417*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_frecpx (f32 FPR32:$Rn))), 3418*9880d681SAndroid Build Coastguard Worker (FRECPXv1i32 FPR32:$Rn)>; 3419*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_frecpx (f64 FPR64:$Rn))), 3420*9880d681SAndroid Build Coastguard Worker (FRECPXv1i64 FPR64:$Rn)>; 3421*9880d681SAndroid Build Coastguard Worker 3422*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_frsqrte (f32 FPR32:$Rn))), 3423*9880d681SAndroid Build Coastguard Worker (FRSQRTEv1i32 FPR32:$Rn)>; 3424*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_frsqrte (f64 FPR64:$Rn))), 3425*9880d681SAndroid Build Coastguard Worker (FRSQRTEv1i64 FPR64:$Rn)>; 3426*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_frsqrte (v1f64 FPR64:$Rn))), 3427*9880d681SAndroid Build Coastguard Worker (FRSQRTEv1i64 FPR64:$Rn)>; 3428*9880d681SAndroid Build Coastguard Worker 3429*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (AArch64frsqrte (f32 FPR32:$Rn))), 3430*9880d681SAndroid Build Coastguard Worker (FRSQRTEv1i32 FPR32:$Rn)>; 3431*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64frsqrte (v2f32 V64:$Rn))), 3432*9880d681SAndroid Build Coastguard Worker (FRSQRTEv2f32 V64:$Rn)>; 3433*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64frsqrte (v4f32 FPR128:$Rn))), 3434*9880d681SAndroid Build Coastguard Worker (FRSQRTEv4f32 FPR128:$Rn)>; 3435*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (AArch64frsqrte (f64 FPR64:$Rn))), 3436*9880d681SAndroid Build Coastguard Worker (FRSQRTEv1i64 FPR64:$Rn)>; 3437*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (AArch64frsqrte (v1f64 FPR64:$Rn))), 3438*9880d681SAndroid Build Coastguard Worker (FRSQRTEv1i64 FPR64:$Rn)>; 3439*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64frsqrte (v2f64 FPR128:$Rn))), 3440*9880d681SAndroid Build Coastguard Worker (FRSQRTEv2f64 FPR128:$Rn)>; 3441*9880d681SAndroid Build Coastguard Worker 3442*9880d681SAndroid Build Coastguard Worker// If an integer is about to be converted to a floating point value, 3443*9880d681SAndroid Build Coastguard Worker// just load it on the floating point unit. 3444*9880d681SAndroid Build Coastguard Worker// Here are the patterns for 8 and 16-bits to float. 3445*9880d681SAndroid Build Coastguard Worker// 8-bits -> float. 3446*9880d681SAndroid Build Coastguard Workermulticlass UIntToFPROLoadPat<ValueType DstTy, ValueType SrcTy, 3447*9880d681SAndroid Build Coastguard Worker SDPatternOperator loadop, Instruction UCVTF, 3448*9880d681SAndroid Build Coastguard Worker ROAddrMode ro, Instruction LDRW, Instruction LDRX, 3449*9880d681SAndroid Build Coastguard Worker SubRegIndex sub> { 3450*9880d681SAndroid Build Coastguard Worker def : Pat<(DstTy (uint_to_fp (SrcTy 3451*9880d681SAndroid Build Coastguard Worker (loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, 3452*9880d681SAndroid Build Coastguard Worker ro.Wext:$extend))))), 3453*9880d681SAndroid Build Coastguard Worker (UCVTF (INSERT_SUBREG (DstTy (IMPLICIT_DEF)), 3454*9880d681SAndroid Build Coastguard Worker (LDRW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend), 3455*9880d681SAndroid Build Coastguard Worker sub))>; 3456*9880d681SAndroid Build Coastguard Worker 3457*9880d681SAndroid Build Coastguard Worker def : Pat<(DstTy (uint_to_fp (SrcTy 3458*9880d681SAndroid Build Coastguard Worker (loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, 3459*9880d681SAndroid Build Coastguard Worker ro.Wext:$extend))))), 3460*9880d681SAndroid Build Coastguard Worker (UCVTF (INSERT_SUBREG (DstTy (IMPLICIT_DEF)), 3461*9880d681SAndroid Build Coastguard Worker (LDRX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend), 3462*9880d681SAndroid Build Coastguard Worker sub))>; 3463*9880d681SAndroid Build Coastguard Worker} 3464*9880d681SAndroid Build Coastguard Worker 3465*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f32, i32, zextloadi8, 3466*9880d681SAndroid Build Coastguard Worker UCVTFv1i32, ro8, LDRBroW, LDRBroX, bsub>; 3467*9880d681SAndroid Build Coastguard Workerdef : Pat <(f32 (uint_to_fp (i32 3468*9880d681SAndroid Build Coastguard Worker (zextloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))), 3469*9880d681SAndroid Build Coastguard Worker (UCVTFv1i32 (INSERT_SUBREG (f32 (IMPLICIT_DEF)), 3470*9880d681SAndroid Build Coastguard Worker (LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub))>; 3471*9880d681SAndroid Build Coastguard Workerdef : Pat <(f32 (uint_to_fp (i32 3472*9880d681SAndroid Build Coastguard Worker (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))))), 3473*9880d681SAndroid Build Coastguard Worker (UCVTFv1i32 (INSERT_SUBREG (f32 (IMPLICIT_DEF)), 3474*9880d681SAndroid Build Coastguard Worker (LDURBi GPR64sp:$Rn, simm9:$offset), bsub))>; 3475*9880d681SAndroid Build Coastguard Worker// 16-bits -> float. 3476*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f32, i32, zextloadi16, 3477*9880d681SAndroid Build Coastguard Worker UCVTFv1i32, ro16, LDRHroW, LDRHroX, hsub>; 3478*9880d681SAndroid Build Coastguard Workerdef : Pat <(f32 (uint_to_fp (i32 3479*9880d681SAndroid Build Coastguard Worker (zextloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))), 3480*9880d681SAndroid Build Coastguard Worker (UCVTFv1i32 (INSERT_SUBREG (f32 (IMPLICIT_DEF)), 3481*9880d681SAndroid Build Coastguard Worker (LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub))>; 3482*9880d681SAndroid Build Coastguard Workerdef : Pat <(f32 (uint_to_fp (i32 3483*9880d681SAndroid Build Coastguard Worker (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))))), 3484*9880d681SAndroid Build Coastguard Worker (UCVTFv1i32 (INSERT_SUBREG (f32 (IMPLICIT_DEF)), 3485*9880d681SAndroid Build Coastguard Worker (LDURHi GPR64sp:$Rn, simm9:$offset), hsub))>; 3486*9880d681SAndroid Build Coastguard Worker// 32-bits are handled in target specific dag combine: 3487*9880d681SAndroid Build Coastguard Worker// performIntToFpCombine. 3488*9880d681SAndroid Build Coastguard Worker// 64-bits integer to 32-bits floating point, not possible with 3489*9880d681SAndroid Build Coastguard Worker// UCVTF on floating point registers (both source and destination 3490*9880d681SAndroid Build Coastguard Worker// must have the same size). 3491*9880d681SAndroid Build Coastguard Worker 3492*9880d681SAndroid Build Coastguard Worker// Here are the patterns for 8, 16, 32, and 64-bits to double. 3493*9880d681SAndroid Build Coastguard Worker// 8-bits -> double. 3494*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f64, i32, zextloadi8, 3495*9880d681SAndroid Build Coastguard Worker UCVTFv1i64, ro8, LDRBroW, LDRBroX, bsub>; 3496*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32 3497*9880d681SAndroid Build Coastguard Worker (zextloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))), 3498*9880d681SAndroid Build Coastguard Worker (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 3499*9880d681SAndroid Build Coastguard Worker (LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub))>; 3500*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32 3501*9880d681SAndroid Build Coastguard Worker (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))))), 3502*9880d681SAndroid Build Coastguard Worker (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 3503*9880d681SAndroid Build Coastguard Worker (LDURBi GPR64sp:$Rn, simm9:$offset), bsub))>; 3504*9880d681SAndroid Build Coastguard Worker// 16-bits -> double. 3505*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f64, i32, zextloadi16, 3506*9880d681SAndroid Build Coastguard Worker UCVTFv1i64, ro16, LDRHroW, LDRHroX, hsub>; 3507*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32 3508*9880d681SAndroid Build Coastguard Worker (zextloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))), 3509*9880d681SAndroid Build Coastguard Worker (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 3510*9880d681SAndroid Build Coastguard Worker (LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub))>; 3511*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32 3512*9880d681SAndroid Build Coastguard Worker (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))))), 3513*9880d681SAndroid Build Coastguard Worker (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 3514*9880d681SAndroid Build Coastguard Worker (LDURHi GPR64sp:$Rn, simm9:$offset), hsub))>; 3515*9880d681SAndroid Build Coastguard Worker// 32-bits -> double. 3516*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f64, i32, load, 3517*9880d681SAndroid Build Coastguard Worker UCVTFv1i64, ro32, LDRSroW, LDRSroX, ssub>; 3518*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32 3519*9880d681SAndroid Build Coastguard Worker (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))))), 3520*9880d681SAndroid Build Coastguard Worker (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 3521*9880d681SAndroid Build Coastguard Worker (LDRSui GPR64sp:$Rn, uimm12s4:$offset), ssub))>; 3522*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32 3523*9880d681SAndroid Build Coastguard Worker (load (am_unscaled32 GPR64sp:$Rn, simm9:$offset))))), 3524*9880d681SAndroid Build Coastguard Worker (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 3525*9880d681SAndroid Build Coastguard Worker (LDURSi GPR64sp:$Rn, simm9:$offset), ssub))>; 3526*9880d681SAndroid Build Coastguard Worker// 64-bits -> double are handled in target specific dag combine: 3527*9880d681SAndroid Build Coastguard Worker// performIntToFpCombine. 3528*9880d681SAndroid Build Coastguard Worker 3529*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3530*9880d681SAndroid Build Coastguard Worker// Advanced SIMD three different-sized vector instructions. 3531*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 3532*9880d681SAndroid Build Coastguard Worker 3533*9880d681SAndroid Build Coastguard Workerdefm ADDHN : SIMDNarrowThreeVectorBHS<0,0b0100,"addhn", int_aarch64_neon_addhn>; 3534*9880d681SAndroid Build Coastguard Workerdefm SUBHN : SIMDNarrowThreeVectorBHS<0,0b0110,"subhn", int_aarch64_neon_subhn>; 3535*9880d681SAndroid Build Coastguard Workerdefm RADDHN : SIMDNarrowThreeVectorBHS<1,0b0100,"raddhn",int_aarch64_neon_raddhn>; 3536*9880d681SAndroid Build Coastguard Workerdefm RSUBHN : SIMDNarrowThreeVectorBHS<1,0b0110,"rsubhn",int_aarch64_neon_rsubhn>; 3537*9880d681SAndroid Build Coastguard Workerdefm PMULL : SIMDDifferentThreeVectorBD<0,0b1110,"pmull",int_aarch64_neon_pmull>; 3538*9880d681SAndroid Build Coastguard Workerdefm SABAL : SIMDLongThreeVectorTiedBHSabal<0,0b0101,"sabal", 3539*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sabd>; 3540*9880d681SAndroid Build Coastguard Workerdefm SABDL : SIMDLongThreeVectorBHSabdl<0, 0b0111, "sabdl", 3541*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sabd>; 3542*9880d681SAndroid Build Coastguard Workerdefm SADDL : SIMDLongThreeVectorBHS< 0, 0b0000, "saddl", 3543*9880d681SAndroid Build Coastguard Worker BinOpFrag<(add (sext node:$LHS), (sext node:$RHS))>>; 3544*9880d681SAndroid Build Coastguard Workerdefm SADDW : SIMDWideThreeVectorBHS< 0, 0b0001, "saddw", 3545*9880d681SAndroid Build Coastguard Worker BinOpFrag<(add node:$LHS, (sext node:$RHS))>>; 3546*9880d681SAndroid Build Coastguard Workerdefm SMLAL : SIMDLongThreeVectorTiedBHS<0, 0b1000, "smlal", 3547*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (int_aarch64_neon_smull node:$MHS, node:$RHS))>>; 3548*9880d681SAndroid Build Coastguard Workerdefm SMLSL : SIMDLongThreeVectorTiedBHS<0, 0b1010, "smlsl", 3549*9880d681SAndroid Build Coastguard Worker TriOpFrag<(sub node:$LHS, (int_aarch64_neon_smull node:$MHS, node:$RHS))>>; 3550*9880d681SAndroid Build Coastguard Workerdefm SMULL : SIMDLongThreeVectorBHS<0, 0b1100, "smull", int_aarch64_neon_smull>; 3551*9880d681SAndroid Build Coastguard Workerdefm SQDMLAL : SIMDLongThreeVectorSQDMLXTiedHS<0, 0b1001, "sqdmlal", 3552*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqadd>; 3553*9880d681SAndroid Build Coastguard Workerdefm SQDMLSL : SIMDLongThreeVectorSQDMLXTiedHS<0, 0b1011, "sqdmlsl", 3554*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqsub>; 3555*9880d681SAndroid Build Coastguard Workerdefm SQDMULL : SIMDLongThreeVectorHS<0, 0b1101, "sqdmull", 3556*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqdmull>; 3557*9880d681SAndroid Build Coastguard Workerdefm SSUBL : SIMDLongThreeVectorBHS<0, 0b0010, "ssubl", 3558*9880d681SAndroid Build Coastguard Worker BinOpFrag<(sub (sext node:$LHS), (sext node:$RHS))>>; 3559*9880d681SAndroid Build Coastguard Workerdefm SSUBW : SIMDWideThreeVectorBHS<0, 0b0011, "ssubw", 3560*9880d681SAndroid Build Coastguard Worker BinOpFrag<(sub node:$LHS, (sext node:$RHS))>>; 3561*9880d681SAndroid Build Coastguard Workerdefm UABAL : SIMDLongThreeVectorTiedBHSabal<1, 0b0101, "uabal", 3562*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_uabd>; 3563*9880d681SAndroid Build Coastguard Workerdefm UADDL : SIMDLongThreeVectorBHS<1, 0b0000, "uaddl", 3564*9880d681SAndroid Build Coastguard Worker BinOpFrag<(add (zext node:$LHS), (zext node:$RHS))>>; 3565*9880d681SAndroid Build Coastguard Workerdefm UADDW : SIMDWideThreeVectorBHS<1, 0b0001, "uaddw", 3566*9880d681SAndroid Build Coastguard Worker BinOpFrag<(add node:$LHS, (zext node:$RHS))>>; 3567*9880d681SAndroid Build Coastguard Workerdefm UMLAL : SIMDLongThreeVectorTiedBHS<1, 0b1000, "umlal", 3568*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (int_aarch64_neon_umull node:$MHS, node:$RHS))>>; 3569*9880d681SAndroid Build Coastguard Workerdefm UMLSL : SIMDLongThreeVectorTiedBHS<1, 0b1010, "umlsl", 3570*9880d681SAndroid Build Coastguard Worker TriOpFrag<(sub node:$LHS, (int_aarch64_neon_umull node:$MHS, node:$RHS))>>; 3571*9880d681SAndroid Build Coastguard Workerdefm UMULL : SIMDLongThreeVectorBHS<1, 0b1100, "umull", int_aarch64_neon_umull>; 3572*9880d681SAndroid Build Coastguard Workerdefm USUBL : SIMDLongThreeVectorBHS<1, 0b0010, "usubl", 3573*9880d681SAndroid Build Coastguard Worker BinOpFrag<(sub (zext node:$LHS), (zext node:$RHS))>>; 3574*9880d681SAndroid Build Coastguard Workerdefm USUBW : SIMDWideThreeVectorBHS< 1, 0b0011, "usubw", 3575*9880d681SAndroid Build Coastguard Worker BinOpFrag<(sub node:$LHS, (zext node:$RHS))>>; 3576*9880d681SAndroid Build Coastguard Worker 3577*9880d681SAndroid Build Coastguard Worker// Additional patterns for SMULL and UMULL 3578*9880d681SAndroid Build Coastguard Workermulticlass Neon_mul_widen_patterns<SDPatternOperator opnode, 3579*9880d681SAndroid Build Coastguard Worker Instruction INST8B, Instruction INST4H, Instruction INST2S> { 3580*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i16 (opnode (v8i8 V64:$Rn), (v8i8 V64:$Rm))), 3581*9880d681SAndroid Build Coastguard Worker (INST8B V64:$Rn, V64:$Rm)>; 3582*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (opnode (v4i16 V64:$Rn), (v4i16 V64:$Rm))), 3583*9880d681SAndroid Build Coastguard Worker (INST4H V64:$Rn, V64:$Rm)>; 3584*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (opnode (v2i32 V64:$Rn), (v2i32 V64:$Rm))), 3585*9880d681SAndroid Build Coastguard Worker (INST2S V64:$Rn, V64:$Rm)>; 3586*9880d681SAndroid Build Coastguard Worker} 3587*9880d681SAndroid Build Coastguard Worker 3588*9880d681SAndroid Build Coastguard Workerdefm : Neon_mul_widen_patterns<AArch64smull, SMULLv8i8_v8i16, 3589*9880d681SAndroid Build Coastguard Worker SMULLv4i16_v4i32, SMULLv2i32_v2i64>; 3590*9880d681SAndroid Build Coastguard Workerdefm : Neon_mul_widen_patterns<AArch64umull, UMULLv8i8_v8i16, 3591*9880d681SAndroid Build Coastguard Worker UMULLv4i16_v4i32, UMULLv2i32_v2i64>; 3592*9880d681SAndroid Build Coastguard Worker 3593*9880d681SAndroid Build Coastguard Worker// Additional patterns for SMLAL/SMLSL and UMLAL/UMLSL 3594*9880d681SAndroid Build Coastguard Workermulticlass Neon_mulacc_widen_patterns<SDPatternOperator opnode, 3595*9880d681SAndroid Build Coastguard Worker Instruction INST8B, Instruction INST4H, Instruction INST2S> { 3596*9880d681SAndroid Build Coastguard Worker def : Pat<(v8i16 (opnode (v8i16 V128:$Rd), (v8i8 V64:$Rn), (v8i8 V64:$Rm))), 3597*9880d681SAndroid Build Coastguard Worker (INST8B V128:$Rd, V64:$Rn, V64:$Rm)>; 3598*9880d681SAndroid Build Coastguard Worker def : Pat<(v4i32 (opnode (v4i32 V128:$Rd), (v4i16 V64:$Rn), (v4i16 V64:$Rm))), 3599*9880d681SAndroid Build Coastguard Worker (INST4H V128:$Rd, V64:$Rn, V64:$Rm)>; 3600*9880d681SAndroid Build Coastguard Worker def : Pat<(v2i64 (opnode (v2i64 V128:$Rd), (v2i32 V64:$Rn), (v2i32 V64:$Rm))), 3601*9880d681SAndroid Build Coastguard Worker (INST2S V128:$Rd, V64:$Rn, V64:$Rm)>; 3602*9880d681SAndroid Build Coastguard Worker} 3603*9880d681SAndroid Build Coastguard Worker 3604*9880d681SAndroid Build Coastguard Workerdefm : Neon_mulacc_widen_patterns< 3605*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (AArch64smull node:$MHS, node:$RHS))>, 3606*9880d681SAndroid Build Coastguard Worker SMLALv8i8_v8i16, SMLALv4i16_v4i32, SMLALv2i32_v2i64>; 3607*9880d681SAndroid Build Coastguard Workerdefm : Neon_mulacc_widen_patterns< 3608*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (AArch64umull node:$MHS, node:$RHS))>, 3609*9880d681SAndroid Build Coastguard Worker UMLALv8i8_v8i16, UMLALv4i16_v4i32, UMLALv2i32_v2i64>; 3610*9880d681SAndroid Build Coastguard Workerdefm : Neon_mulacc_widen_patterns< 3611*9880d681SAndroid Build Coastguard Worker TriOpFrag<(sub node:$LHS, (AArch64smull node:$MHS, node:$RHS))>, 3612*9880d681SAndroid Build Coastguard Worker SMLSLv8i8_v8i16, SMLSLv4i16_v4i32, SMLSLv2i32_v2i64>; 3613*9880d681SAndroid Build Coastguard Workerdefm : Neon_mulacc_widen_patterns< 3614*9880d681SAndroid Build Coastguard Worker TriOpFrag<(sub node:$LHS, (AArch64umull node:$MHS, node:$RHS))>, 3615*9880d681SAndroid Build Coastguard Worker UMLSLv8i8_v8i16, UMLSLv4i16_v4i32, UMLSLv2i32_v2i64>; 3616*9880d681SAndroid Build Coastguard Worker 3617*9880d681SAndroid Build Coastguard Worker// Patterns for 64-bit pmull 3618*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_pmull64 V64:$Rn, V64:$Rm), 3619*9880d681SAndroid Build Coastguard Worker (PMULLv1i64 V64:$Rn, V64:$Rm)>; 3620*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_pmull64 (extractelt (v2i64 V128:$Rn), (i64 1)), 3621*9880d681SAndroid Build Coastguard Worker (extractelt (v2i64 V128:$Rm), (i64 1))), 3622*9880d681SAndroid Build Coastguard Worker (PMULLv2i64 V128:$Rn, V128:$Rm)>; 3623*9880d681SAndroid Build Coastguard Worker 3624*9880d681SAndroid Build Coastguard Worker// CodeGen patterns for addhn and subhn instructions, which can actually be 3625*9880d681SAndroid Build Coastguard Worker// written in LLVM IR without too much difficulty. 3626*9880d681SAndroid Build Coastguard Worker 3627*9880d681SAndroid Build Coastguard Worker// ADDHN 3628*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (trunc (v8i16 (AArch64vlshr (add V128:$Rn, V128:$Rm), (i32 8))))), 3629*9880d681SAndroid Build Coastguard Worker (ADDHNv8i16_v8i8 V128:$Rn, V128:$Rm)>; 3630*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (trunc (v4i32 (AArch64vlshr (add V128:$Rn, V128:$Rm), 3631*9880d681SAndroid Build Coastguard Worker (i32 16))))), 3632*9880d681SAndroid Build Coastguard Worker (ADDHNv4i32_v4i16 V128:$Rn, V128:$Rm)>; 3633*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (trunc (v2i64 (AArch64vlshr (add V128:$Rn, V128:$Rm), 3634*9880d681SAndroid Build Coastguard Worker (i32 32))))), 3635*9880d681SAndroid Build Coastguard Worker (ADDHNv2i64_v2i32 V128:$Rn, V128:$Rm)>; 3636*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v8i8 V64:$Rd), 3637*9880d681SAndroid Build Coastguard Worker (trunc (v8i16 (AArch64vlshr (add V128:$Rn, V128:$Rm), 3638*9880d681SAndroid Build Coastguard Worker (i32 8))))), 3639*9880d681SAndroid Build Coastguard Worker (ADDHNv8i16_v16i8 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub), 3640*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 3641*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v4i16 V64:$Rd), 3642*9880d681SAndroid Build Coastguard Worker (trunc (v4i32 (AArch64vlshr (add V128:$Rn, V128:$Rm), 3643*9880d681SAndroid Build Coastguard Worker (i32 16))))), 3644*9880d681SAndroid Build Coastguard Worker (ADDHNv4i32_v8i16 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub), 3645*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 3646*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v2i32 V64:$Rd), 3647*9880d681SAndroid Build Coastguard Worker (trunc (v2i64 (AArch64vlshr (add V128:$Rn, V128:$Rm), 3648*9880d681SAndroid Build Coastguard Worker (i32 32))))), 3649*9880d681SAndroid Build Coastguard Worker (ADDHNv2i64_v4i32 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub), 3650*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 3651*9880d681SAndroid Build Coastguard Worker 3652*9880d681SAndroid Build Coastguard Worker// SUBHN 3653*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (trunc (v8i16 (AArch64vlshr (sub V128:$Rn, V128:$Rm), (i32 8))))), 3654*9880d681SAndroid Build Coastguard Worker (SUBHNv8i16_v8i8 V128:$Rn, V128:$Rm)>; 3655*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (trunc (v4i32 (AArch64vlshr (sub V128:$Rn, V128:$Rm), 3656*9880d681SAndroid Build Coastguard Worker (i32 16))))), 3657*9880d681SAndroid Build Coastguard Worker (SUBHNv4i32_v4i16 V128:$Rn, V128:$Rm)>; 3658*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (trunc (v2i64 (AArch64vlshr (sub V128:$Rn, V128:$Rm), 3659*9880d681SAndroid Build Coastguard Worker (i32 32))))), 3660*9880d681SAndroid Build Coastguard Worker (SUBHNv2i64_v2i32 V128:$Rn, V128:$Rm)>; 3661*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v8i8 V64:$Rd), 3662*9880d681SAndroid Build Coastguard Worker (trunc (v8i16 (AArch64vlshr (sub V128:$Rn, V128:$Rm), 3663*9880d681SAndroid Build Coastguard Worker (i32 8))))), 3664*9880d681SAndroid Build Coastguard Worker (SUBHNv8i16_v16i8 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub), 3665*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 3666*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v4i16 V64:$Rd), 3667*9880d681SAndroid Build Coastguard Worker (trunc (v4i32 (AArch64vlshr (sub V128:$Rn, V128:$Rm), 3668*9880d681SAndroid Build Coastguard Worker (i32 16))))), 3669*9880d681SAndroid Build Coastguard Worker (SUBHNv4i32_v8i16 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub), 3670*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 3671*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v2i32 V64:$Rd), 3672*9880d681SAndroid Build Coastguard Worker (trunc (v2i64 (AArch64vlshr (sub V128:$Rn, V128:$Rm), 3673*9880d681SAndroid Build Coastguard Worker (i32 32))))), 3674*9880d681SAndroid Build Coastguard Worker (SUBHNv2i64_v4i32 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub), 3675*9880d681SAndroid Build Coastguard Worker V128:$Rn, V128:$Rm)>; 3676*9880d681SAndroid Build Coastguard Worker 3677*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3678*9880d681SAndroid Build Coastguard Worker// AdvSIMD bitwise extract from vector instruction. 3679*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3680*9880d681SAndroid Build Coastguard Worker 3681*9880d681SAndroid Build Coastguard Workerdefm EXT : SIMDBitwiseExtract<"ext">; 3682*9880d681SAndroid Build Coastguard Worker 3683*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64ext V64:$Rn, V64:$Rm, (i32 imm:$imm))), 3684*9880d681SAndroid Build Coastguard Worker (EXTv8i8 V64:$Rn, V64:$Rm, imm:$imm)>; 3685*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))), 3686*9880d681SAndroid Build Coastguard Worker (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>; 3687*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64ext V64:$Rn, V64:$Rm, (i32 imm:$imm))), 3688*9880d681SAndroid Build Coastguard Worker (EXTv8i8 V64:$Rn, V64:$Rm, imm:$imm)>; 3689*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64ext V64:$Rn, V64:$Rm, (i32 imm:$imm))), 3690*9880d681SAndroid Build Coastguard Worker (EXTv8i8 V64:$Rn, V64:$Rm, imm:$imm)>; 3691*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))), 3692*9880d681SAndroid Build Coastguard Worker (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>; 3693*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))), 3694*9880d681SAndroid Build Coastguard Worker (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>; 3695*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))), 3696*9880d681SAndroid Build Coastguard Worker (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>; 3697*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))), 3698*9880d681SAndroid Build Coastguard Worker (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>; 3699*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64ext V64:$Rn, V64:$Rm, (i32 imm:$imm))), 3700*9880d681SAndroid Build Coastguard Worker (EXTv8i8 V64:$Rn, V64:$Rm, imm:$imm)>; 3701*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))), 3702*9880d681SAndroid Build Coastguard Worker (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>; 3703*9880d681SAndroid Build Coastguard Worker 3704*9880d681SAndroid Build Coastguard Worker// We use EXT to handle extract_subvector to copy the upper 64-bits of a 3705*9880d681SAndroid Build Coastguard Worker// 128-bit vector. 3706*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (extract_subvector V128:$Rn, (i64 8))), 3707*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>; 3708*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (extract_subvector V128:$Rn, (i64 4))), 3709*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>; 3710*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvector V128:$Rn, (i64 2))), 3711*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>; 3712*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (extract_subvector V128:$Rn, (i64 1))), 3713*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>; 3714*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (extract_subvector V128:$Rn, (i64 4))), 3715*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>; 3716*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (extract_subvector V128:$Rn, (i64 2))), 3717*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>; 3718*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (extract_subvector V128:$Rn, (i64 1))), 3719*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>; 3720*9880d681SAndroid Build Coastguard Worker 3721*9880d681SAndroid Build Coastguard Worker 3722*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3723*9880d681SAndroid Build Coastguard Worker// AdvSIMD zip vector 3724*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3725*9880d681SAndroid Build Coastguard Worker 3726*9880d681SAndroid Build Coastguard Workerdefm TRN1 : SIMDZipVector<0b010, "trn1", AArch64trn1>; 3727*9880d681SAndroid Build Coastguard Workerdefm TRN2 : SIMDZipVector<0b110, "trn2", AArch64trn2>; 3728*9880d681SAndroid Build Coastguard Workerdefm UZP1 : SIMDZipVector<0b001, "uzp1", AArch64uzp1>; 3729*9880d681SAndroid Build Coastguard Workerdefm UZP2 : SIMDZipVector<0b101, "uzp2", AArch64uzp2>; 3730*9880d681SAndroid Build Coastguard Workerdefm ZIP1 : SIMDZipVector<0b011, "zip1", AArch64zip1>; 3731*9880d681SAndroid Build Coastguard Workerdefm ZIP2 : SIMDZipVector<0b111, "zip2", AArch64zip2>; 3732*9880d681SAndroid Build Coastguard Worker 3733*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3734*9880d681SAndroid Build Coastguard Worker// AdvSIMD TBL/TBX instructions 3735*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3736*9880d681SAndroid Build Coastguard Worker 3737*9880d681SAndroid Build Coastguard Workerdefm TBL : SIMDTableLookup< 0, "tbl">; 3738*9880d681SAndroid Build Coastguard Workerdefm TBX : SIMDTableLookupTied<1, "tbx">; 3739*9880d681SAndroid Build Coastguard Worker 3740*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (int_aarch64_neon_tbl1 (v16i8 VecListOne128:$Rn), (v8i8 V64:$Ri))), 3741*9880d681SAndroid Build Coastguard Worker (TBLv8i8One VecListOne128:$Rn, V64:$Ri)>; 3742*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (int_aarch64_neon_tbl1 (v16i8 V128:$Ri), (v16i8 V128:$Rn))), 3743*9880d681SAndroid Build Coastguard Worker (TBLv16i8One V128:$Ri, V128:$Rn)>; 3744*9880d681SAndroid Build Coastguard Worker 3745*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (int_aarch64_neon_tbx1 (v8i8 V64:$Rd), 3746*9880d681SAndroid Build Coastguard Worker (v16i8 VecListOne128:$Rn), (v8i8 V64:$Ri))), 3747*9880d681SAndroid Build Coastguard Worker (TBXv8i8One V64:$Rd, VecListOne128:$Rn, V64:$Ri)>; 3748*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (int_aarch64_neon_tbx1 (v16i8 V128:$Rd), 3749*9880d681SAndroid Build Coastguard Worker (v16i8 V128:$Ri), (v16i8 V128:$Rn))), 3750*9880d681SAndroid Build Coastguard Worker (TBXv16i8One V128:$Rd, V128:$Ri, V128:$Rn)>; 3751*9880d681SAndroid Build Coastguard Worker 3752*9880d681SAndroid Build Coastguard Worker 3753*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3754*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar CPY instruction 3755*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3756*9880d681SAndroid Build Coastguard Worker 3757*9880d681SAndroid Build Coastguard Workerdefm CPY : SIMDScalarCPY<"cpy">; 3758*9880d681SAndroid Build Coastguard Worker 3759*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3760*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar pairwise instructions 3761*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3762*9880d681SAndroid Build Coastguard Worker 3763*9880d681SAndroid Build Coastguard Workerdefm ADDP : SIMDPairwiseScalarD<0, 0b11011, "addp">; 3764*9880d681SAndroid Build Coastguard Workerdefm FADDP : SIMDFPPairwiseScalar<0, 0b01101, "faddp">; 3765*9880d681SAndroid Build Coastguard Workerdefm FMAXNMP : SIMDFPPairwiseScalar<0, 0b01100, "fmaxnmp">; 3766*9880d681SAndroid Build Coastguard Workerdefm FMAXP : SIMDFPPairwiseScalar<0, 0b01111, "fmaxp">; 3767*9880d681SAndroid Build Coastguard Workerdefm FMINNMP : SIMDFPPairwiseScalar<1, 0b01100, "fminnmp">; 3768*9880d681SAndroid Build Coastguard Workerdefm FMINP : SIMDFPPairwiseScalar<1, 0b01111, "fminp">; 3769*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64saddv V128:$Rn)), 3770*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), (ADDPv2i64p V128:$Rn), dsub)>; 3771*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64uaddv V128:$Rn)), 3772*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), (ADDPv2i64p V128:$Rn), dsub)>; 3773*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_faddv (v2f32 V64:$Rn))), 3774*9880d681SAndroid Build Coastguard Worker (FADDPv2i32p V64:$Rn)>; 3775*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_faddv (v4f32 V128:$Rn))), 3776*9880d681SAndroid Build Coastguard Worker (FADDPv2i32p (EXTRACT_SUBREG (FADDPv4f32 V128:$Rn, V128:$Rn), dsub))>; 3777*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_faddv (v2f64 V128:$Rn))), 3778*9880d681SAndroid Build Coastguard Worker (FADDPv2i64p V128:$Rn)>; 3779*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_fmaxnmv (v2f32 V64:$Rn))), 3780*9880d681SAndroid Build Coastguard Worker (FMAXNMPv2i32p V64:$Rn)>; 3781*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_fmaxnmv (v2f64 V128:$Rn))), 3782*9880d681SAndroid Build Coastguard Worker (FMAXNMPv2i64p V128:$Rn)>; 3783*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_fmaxv (v2f32 V64:$Rn))), 3784*9880d681SAndroid Build Coastguard Worker (FMAXPv2i32p V64:$Rn)>; 3785*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_fmaxv (v2f64 V128:$Rn))), 3786*9880d681SAndroid Build Coastguard Worker (FMAXPv2i64p V128:$Rn)>; 3787*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_fminnmv (v2f32 V64:$Rn))), 3788*9880d681SAndroid Build Coastguard Worker (FMINNMPv2i32p V64:$Rn)>; 3789*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_fminnmv (v2f64 V128:$Rn))), 3790*9880d681SAndroid Build Coastguard Worker (FMINNMPv2i64p V128:$Rn)>; 3791*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_fminv (v2f32 V64:$Rn))), 3792*9880d681SAndroid Build Coastguard Worker (FMINPv2i32p V64:$Rn)>; 3793*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_fminv (v2f64 V128:$Rn))), 3794*9880d681SAndroid Build Coastguard Worker (FMINPv2i64p V128:$Rn)>; 3795*9880d681SAndroid Build Coastguard Worker 3796*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3797*9880d681SAndroid Build Coastguard Worker// AdvSIMD INS/DUP instructions 3798*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 3799*9880d681SAndroid Build Coastguard Worker 3800*9880d681SAndroid Build Coastguard Workerdef DUPv8i8gpr : SIMDDupFromMain<0, {?,?,?,?,1}, ".8b", v8i8, V64, GPR32>; 3801*9880d681SAndroid Build Coastguard Workerdef DUPv16i8gpr : SIMDDupFromMain<1, {?,?,?,?,1}, ".16b", v16i8, V128, GPR32>; 3802*9880d681SAndroid Build Coastguard Workerdef DUPv4i16gpr : SIMDDupFromMain<0, {?,?,?,1,0}, ".4h", v4i16, V64, GPR32>; 3803*9880d681SAndroid Build Coastguard Workerdef DUPv8i16gpr : SIMDDupFromMain<1, {?,?,?,1,0}, ".8h", v8i16, V128, GPR32>; 3804*9880d681SAndroid Build Coastguard Workerdef DUPv2i32gpr : SIMDDupFromMain<0, {?,?,1,0,0}, ".2s", v2i32, V64, GPR32>; 3805*9880d681SAndroid Build Coastguard Workerdef DUPv4i32gpr : SIMDDupFromMain<1, {?,?,1,0,0}, ".4s", v4i32, V128, GPR32>; 3806*9880d681SAndroid Build Coastguard Workerdef DUPv2i64gpr : SIMDDupFromMain<1, {?,1,0,0,0}, ".2d", v2i64, V128, GPR64>; 3807*9880d681SAndroid Build Coastguard Worker 3808*9880d681SAndroid Build Coastguard Workerdef DUPv2i64lane : SIMDDup64FromElement; 3809*9880d681SAndroid Build Coastguard Workerdef DUPv2i32lane : SIMDDup32FromElement<0, ".2s", v2i32, V64>; 3810*9880d681SAndroid Build Coastguard Workerdef DUPv4i32lane : SIMDDup32FromElement<1, ".4s", v4i32, V128>; 3811*9880d681SAndroid Build Coastguard Workerdef DUPv4i16lane : SIMDDup16FromElement<0, ".4h", v4i16, V64>; 3812*9880d681SAndroid Build Coastguard Workerdef DUPv8i16lane : SIMDDup16FromElement<1, ".8h", v8i16, V128>; 3813*9880d681SAndroid Build Coastguard Workerdef DUPv8i8lane : SIMDDup8FromElement <0, ".8b", v8i8, V64>; 3814*9880d681SAndroid Build Coastguard Workerdef DUPv16i8lane : SIMDDup8FromElement <1, ".16b", v16i8, V128>; 3815*9880d681SAndroid Build Coastguard Worker 3816*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64dup (f32 FPR32:$Rn))), 3817*9880d681SAndroid Build Coastguard Worker (v2f32 (DUPv2i32lane 3818*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR32:$Rn, ssub), 3819*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 3820*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64dup (f32 FPR32:$Rn))), 3821*9880d681SAndroid Build Coastguard Worker (v4f32 (DUPv4i32lane 3822*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR32:$Rn, ssub), 3823*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 3824*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64dup (f64 FPR64:$Rn))), 3825*9880d681SAndroid Build Coastguard Worker (v2f64 (DUPv2i64lane 3826*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR64:$Rn, dsub), 3827*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 3828*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64dup (f16 FPR16:$Rn))), 3829*9880d681SAndroid Build Coastguard Worker (v4f16 (DUPv4i16lane 3830*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), FPR16:$Rn, hsub), 3831*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 3832*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64dup (f16 FPR16:$Rn))), 3833*9880d681SAndroid Build Coastguard Worker (v8f16 (DUPv8i16lane 3834*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), FPR16:$Rn, hsub), 3835*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 3836*9880d681SAndroid Build Coastguard Worker 3837*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64duplane16 (v8f16 V128:$Rn), VectorIndexH:$imm)), 3838*9880d681SAndroid Build Coastguard Worker (DUPv4i16lane V128:$Rn, VectorIndexH:$imm)>; 3839*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64duplane16 (v8f16 V128:$Rn), VectorIndexH:$imm)), 3840*9880d681SAndroid Build Coastguard Worker (DUPv8i16lane V128:$Rn, VectorIndexH:$imm)>; 3841*9880d681SAndroid Build Coastguard Worker 3842*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64duplane32 (v4f32 V128:$Rn), VectorIndexS:$imm)), 3843*9880d681SAndroid Build Coastguard Worker (DUPv2i32lane V128:$Rn, VectorIndexS:$imm)>; 3844*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64duplane32 (v4f32 V128:$Rn), VectorIndexS:$imm)), 3845*9880d681SAndroid Build Coastguard Worker (DUPv4i32lane V128:$Rn, VectorIndexS:$imm)>; 3846*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64duplane64 (v2f64 V128:$Rn), VectorIndexD:$imm)), 3847*9880d681SAndroid Build Coastguard Worker (DUPv2i64lane V128:$Rn, VectorIndexD:$imm)>; 3848*9880d681SAndroid Build Coastguard Worker 3849*9880d681SAndroid Build Coastguard Worker// If there's an (AArch64dup (vector_extract ...) ...), we can use a duplane 3850*9880d681SAndroid Build Coastguard Worker// instruction even if the types don't match: we just have to remap the lane 3851*9880d681SAndroid Build Coastguard Worker// carefully. N.b. this trick only applies to truncations. 3852*9880d681SAndroid Build Coastguard Workerdef VecIndex_x2 : SDNodeXForm<imm, [{ 3853*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(2 * N->getZExtValue(), SDLoc(N), MVT::i64); 3854*9880d681SAndroid Build Coastguard Worker}]>; 3855*9880d681SAndroid Build Coastguard Workerdef VecIndex_x4 : SDNodeXForm<imm, [{ 3856*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(4 * N->getZExtValue(), SDLoc(N), MVT::i64); 3857*9880d681SAndroid Build Coastguard Worker}]>; 3858*9880d681SAndroid Build Coastguard Workerdef VecIndex_x8 : SDNodeXForm<imm, [{ 3859*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(8 * N->getZExtValue(), SDLoc(N), MVT::i64); 3860*9880d681SAndroid Build Coastguard Worker}]>; 3861*9880d681SAndroid Build Coastguard Worker 3862*9880d681SAndroid Build Coastguard Workermulticlass DUPWithTruncPats<ValueType ResVT, ValueType Src64VT, 3863*9880d681SAndroid Build Coastguard Worker ValueType Src128VT, ValueType ScalVT, 3864*9880d681SAndroid Build Coastguard Worker Instruction DUP, SDNodeXForm IdxXFORM> { 3865*9880d681SAndroid Build Coastguard Worker def : Pat<(ResVT (AArch64dup (ScalVT (vector_extract (Src128VT V128:$Rn), 3866*9880d681SAndroid Build Coastguard Worker imm:$idx)))), 3867*9880d681SAndroid Build Coastguard Worker (DUP V128:$Rn, (IdxXFORM imm:$idx))>; 3868*9880d681SAndroid Build Coastguard Worker 3869*9880d681SAndroid Build Coastguard Worker def : Pat<(ResVT (AArch64dup (ScalVT (vector_extract (Src64VT V64:$Rn), 3870*9880d681SAndroid Build Coastguard Worker imm:$idx)))), 3871*9880d681SAndroid Build Coastguard Worker (DUP (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), (IdxXFORM imm:$idx))>; 3872*9880d681SAndroid Build Coastguard Worker} 3873*9880d681SAndroid Build Coastguard Worker 3874*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v8i8, v4i16, v8i16, i32, DUPv8i8lane, VecIndex_x2>; 3875*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v8i8, v2i32, v4i32, i32, DUPv8i8lane, VecIndex_x4>; 3876*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v4i16, v2i32, v4i32, i32, DUPv4i16lane, VecIndex_x2>; 3877*9880d681SAndroid Build Coastguard Worker 3878*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v16i8, v4i16, v8i16, i32, DUPv16i8lane, VecIndex_x2>; 3879*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v16i8, v2i32, v4i32, i32, DUPv16i8lane, VecIndex_x4>; 3880*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v8i16, v2i32, v4i32, i32, DUPv8i16lane, VecIndex_x2>; 3881*9880d681SAndroid Build Coastguard Worker 3882*9880d681SAndroid Build Coastguard Workermulticlass DUPWithTrunci64Pats<ValueType ResVT, Instruction DUP, 3883*9880d681SAndroid Build Coastguard Worker SDNodeXForm IdxXFORM> { 3884*9880d681SAndroid Build Coastguard Worker def : Pat<(ResVT (AArch64dup (i32 (trunc (extractelt (v2i64 V128:$Rn), 3885*9880d681SAndroid Build Coastguard Worker imm:$idx))))), 3886*9880d681SAndroid Build Coastguard Worker (DUP V128:$Rn, (IdxXFORM imm:$idx))>; 3887*9880d681SAndroid Build Coastguard Worker 3888*9880d681SAndroid Build Coastguard Worker def : Pat<(ResVT (AArch64dup (i32 (trunc (extractelt (v1i64 V64:$Rn), 3889*9880d681SAndroid Build Coastguard Worker imm:$idx))))), 3890*9880d681SAndroid Build Coastguard Worker (DUP (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), (IdxXFORM imm:$idx))>; 3891*9880d681SAndroid Build Coastguard Worker} 3892*9880d681SAndroid Build Coastguard Worker 3893*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v8i8, DUPv8i8lane, VecIndex_x8>; 3894*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v4i16, DUPv4i16lane, VecIndex_x4>; 3895*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v2i32, DUPv2i32lane, VecIndex_x2>; 3896*9880d681SAndroid Build Coastguard Worker 3897*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v16i8, DUPv16i8lane, VecIndex_x8>; 3898*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v8i16, DUPv8i16lane, VecIndex_x4>; 3899*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v4i32, DUPv4i32lane, VecIndex_x2>; 3900*9880d681SAndroid Build Coastguard Worker 3901*9880d681SAndroid Build Coastguard Worker// SMOV and UMOV definitions, with some extra patterns for convenience 3902*9880d681SAndroid Build Coastguard Workerdefm SMOV : SMov; 3903*9880d681SAndroid Build Coastguard Workerdefm UMOV : UMov; 3904*9880d681SAndroid Build Coastguard Worker 3905*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v16i8 V128:$Rn), VectorIndexB:$idx), i8), 3906*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi8to32 V128:$Rn, VectorIndexB:$idx))>; 3907*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v16i8 V128:$Rn), VectorIndexB:$idx), i8), 3908*9880d681SAndroid Build Coastguard Worker (i64 (SMOVvi8to64 V128:$Rn, VectorIndexB:$idx))>; 3909*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v8i16 V128:$Rn), VectorIndexH:$idx),i16), 3910*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi16to32 V128:$Rn, VectorIndexH:$idx))>; 3911*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v8i16 V128:$Rn), VectorIndexH:$idx),i16), 3912*9880d681SAndroid Build Coastguard Worker (i64 (SMOVvi16to64 V128:$Rn, VectorIndexH:$idx))>; 3913*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v8i16 V128:$Rn), VectorIndexH:$idx),i16), 3914*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi16to32 V128:$Rn, VectorIndexH:$idx))>; 3915*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext (i32 (vector_extract (v4i32 V128:$Rn), VectorIndexS:$idx))), 3916*9880d681SAndroid Build Coastguard Worker (i64 (SMOVvi32to64 V128:$Rn, VectorIndexS:$idx))>; 3917*9880d681SAndroid Build Coastguard Worker 3918*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (i64 (anyext (i32 (vector_extract (v16i8 V128:$Rn), 3919*9880d681SAndroid Build Coastguard Worker VectorIndexB:$idx)))), i8), 3920*9880d681SAndroid Build Coastguard Worker (i64 (SMOVvi8to64 V128:$Rn, VectorIndexB:$idx))>; 3921*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (i64 (anyext (i32 (vector_extract (v8i16 V128:$Rn), 3922*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx)))), i16), 3923*9880d681SAndroid Build Coastguard Worker (i64 (SMOVvi16to64 V128:$Rn, VectorIndexH:$idx))>; 3924*9880d681SAndroid Build Coastguard Worker 3925*9880d681SAndroid Build Coastguard Worker// Extracting i8 or i16 elements will have the zero-extend transformed to 3926*9880d681SAndroid Build Coastguard Worker// an 'and' mask by type legalization since neither i8 nor i16 are legal types 3927*9880d681SAndroid Build Coastguard Worker// for AArch64. Match these patterns here since UMOV already zeroes out the high 3928*9880d681SAndroid Build Coastguard Worker// bits of the destination register. 3929*9880d681SAndroid Build Coastguard Workerdef : Pat<(and (vector_extract (v16i8 V128:$Rn), VectorIndexB:$idx), 3930*9880d681SAndroid Build Coastguard Worker (i32 0xff)), 3931*9880d681SAndroid Build Coastguard Worker (i32 (UMOVvi8 V128:$Rn, VectorIndexB:$idx))>; 3932*9880d681SAndroid Build Coastguard Workerdef : Pat<(and (vector_extract (v8i16 V128:$Rn), VectorIndexH:$idx), 3933*9880d681SAndroid Build Coastguard Worker (i32 0xffff)), 3934*9880d681SAndroid Build Coastguard Worker (i32 (UMOVvi16 V128:$Rn, VectorIndexH:$idx))>; 3935*9880d681SAndroid Build Coastguard Worker 3936*9880d681SAndroid Build Coastguard Workerdefm INS : SIMDIns; 3937*9880d681SAndroid Build Coastguard Worker 3938*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (scalar_to_vector GPR32:$Rn)), 3939*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3940*9880d681SAndroid Build Coastguard Worker (f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>; 3941*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (scalar_to_vector GPR32:$Rn)), 3942*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3943*9880d681SAndroid Build Coastguard Worker (f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>; 3944*9880d681SAndroid Build Coastguard Worker 3945*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (scalar_to_vector GPR32:$Rn)), 3946*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3947*9880d681SAndroid Build Coastguard Worker (f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>; 3948*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (scalar_to_vector GPR32:$Rn)), 3949*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), 3950*9880d681SAndroid Build Coastguard Worker (f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>; 3951*9880d681SAndroid Build Coastguard Worker 3952*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (scalar_to_vector (i32 FPR32:$Rn))), 3953*9880d681SAndroid Build Coastguard Worker (v2i32 (INSERT_SUBREG (v2i32 (IMPLICIT_DEF)), 3954*9880d681SAndroid Build Coastguard Worker (i32 FPR32:$Rn), ssub))>; 3955*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (scalar_to_vector (i32 FPR32:$Rn))), 3956*9880d681SAndroid Build Coastguard Worker (v4i32 (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), 3957*9880d681SAndroid Build Coastguard Worker (i32 FPR32:$Rn), ssub))>; 3958*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (scalar_to_vector (i64 FPR64:$Rn))), 3959*9880d681SAndroid Build Coastguard Worker (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), 3960*9880d681SAndroid Build Coastguard Worker (i64 FPR64:$Rn), dsub))>; 3961*9880d681SAndroid Build Coastguard Worker 3962*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (scalar_to_vector (f16 FPR16:$Rn))), 3963*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4f16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>; 3964*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (scalar_to_vector (f16 FPR16:$Rn))), 3965*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>; 3966*9880d681SAndroid Build Coastguard Worker 3967*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (scalar_to_vector (f32 FPR32:$Rn))), 3968*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR32:$Rn, ssub)>; 3969*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (scalar_to_vector (f32 FPR32:$Rn))), 3970*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v2f32 (IMPLICIT_DEF)), FPR32:$Rn, ssub)>; 3971*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (scalar_to_vector (f64 FPR64:$Rn))), 3972*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FPR64:$Rn, dsub)>; 3973*9880d681SAndroid Build Coastguard Worker 3974*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (vector_insert (v4f16 V64:$Rn), 3975*9880d681SAndroid Build Coastguard Worker (f16 FPR16:$Rm), (i64 VectorIndexS:$imm))), 3976*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 3977*9880d681SAndroid Build Coastguard Worker (INSvi16lane 3978*9880d681SAndroid Build Coastguard Worker (v8f16 (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), V64:$Rn, dsub)), 3979*9880d681SAndroid Build Coastguard Worker VectorIndexS:$imm, 3980*9880d681SAndroid Build Coastguard Worker (v8f16 (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR16:$Rm, hsub)), 3981*9880d681SAndroid Build Coastguard Worker (i64 0)), 3982*9880d681SAndroid Build Coastguard Worker dsub)>; 3983*9880d681SAndroid Build Coastguard Worker 3984*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (vector_insert (v8f16 V128:$Rn), 3985*9880d681SAndroid Build Coastguard Worker (f16 FPR16:$Rm), (i64 VectorIndexH:$imm))), 3986*9880d681SAndroid Build Coastguard Worker (INSvi16lane 3987*9880d681SAndroid Build Coastguard Worker V128:$Rn, VectorIndexH:$imm, 3988*9880d681SAndroid Build Coastguard Worker (v8f16 (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR16:$Rm, hsub)), 3989*9880d681SAndroid Build Coastguard Worker (i64 0))>; 3990*9880d681SAndroid Build Coastguard Worker 3991*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (vector_insert (v2f32 V64:$Rn), 3992*9880d681SAndroid Build Coastguard Worker (f32 FPR32:$Rm), (i64 VectorIndexS:$imm))), 3993*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 3994*9880d681SAndroid Build Coastguard Worker (INSvi32lane 3995*9880d681SAndroid Build Coastguard Worker (v4f32 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), V64:$Rn, dsub)), 3996*9880d681SAndroid Build Coastguard Worker VectorIndexS:$imm, 3997*9880d681SAndroid Build Coastguard Worker (v4f32 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR32:$Rm, ssub)), 3998*9880d681SAndroid Build Coastguard Worker (i64 0)), 3999*9880d681SAndroid Build Coastguard Worker dsub)>; 4000*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (vector_insert (v4f32 V128:$Rn), 4001*9880d681SAndroid Build Coastguard Worker (f32 FPR32:$Rm), (i64 VectorIndexS:$imm))), 4002*9880d681SAndroid Build Coastguard Worker (INSvi32lane 4003*9880d681SAndroid Build Coastguard Worker V128:$Rn, VectorIndexS:$imm, 4004*9880d681SAndroid Build Coastguard Worker (v4f32 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR32:$Rm, ssub)), 4005*9880d681SAndroid Build Coastguard Worker (i64 0))>; 4006*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (vector_insert (v2f64 V128:$Rn), 4007*9880d681SAndroid Build Coastguard Worker (f64 FPR64:$Rm), (i64 VectorIndexD:$imm))), 4008*9880d681SAndroid Build Coastguard Worker (INSvi64lane 4009*9880d681SAndroid Build Coastguard Worker V128:$Rn, VectorIndexD:$imm, 4010*9880d681SAndroid Build Coastguard Worker (v2f64 (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FPR64:$Rm, dsub)), 4011*9880d681SAndroid Build Coastguard Worker (i64 0))>; 4012*9880d681SAndroid Build Coastguard Worker 4013*9880d681SAndroid Build Coastguard Worker// Copy an element at a constant index in one vector into a constant indexed 4014*9880d681SAndroid Build Coastguard Worker// element of another. 4015*9880d681SAndroid Build Coastguard Worker// FIXME refactor to a shared class/dev parameterized on vector type, vector 4016*9880d681SAndroid Build Coastguard Worker// index type and INS extension 4017*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (int_aarch64_neon_vcopy_lane 4018*9880d681SAndroid Build Coastguard Worker (v16i8 V128:$Vd), VectorIndexB:$idx, (v16i8 V128:$Vs), 4019*9880d681SAndroid Build Coastguard Worker VectorIndexB:$idx2)), 4020*9880d681SAndroid Build Coastguard Worker (v16i8 (INSvi8lane 4021*9880d681SAndroid Build Coastguard Worker V128:$Vd, VectorIndexB:$idx, V128:$Vs, VectorIndexB:$idx2) 4022*9880d681SAndroid Build Coastguard Worker )>; 4023*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (int_aarch64_neon_vcopy_lane 4024*9880d681SAndroid Build Coastguard Worker (v8i16 V128:$Vd), VectorIndexH:$idx, (v8i16 V128:$Vs), 4025*9880d681SAndroid Build Coastguard Worker VectorIndexH:$idx2)), 4026*9880d681SAndroid Build Coastguard Worker (v8i16 (INSvi16lane 4027*9880d681SAndroid Build Coastguard Worker V128:$Vd, VectorIndexH:$idx, V128:$Vs, VectorIndexH:$idx2) 4028*9880d681SAndroid Build Coastguard Worker )>; 4029*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (int_aarch64_neon_vcopy_lane 4030*9880d681SAndroid Build Coastguard Worker (v4i32 V128:$Vd), VectorIndexS:$idx, (v4i32 V128:$Vs), 4031*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx2)), 4032*9880d681SAndroid Build Coastguard Worker (v4i32 (INSvi32lane 4033*9880d681SAndroid Build Coastguard Worker V128:$Vd, VectorIndexS:$idx, V128:$Vs, VectorIndexS:$idx2) 4034*9880d681SAndroid Build Coastguard Worker )>; 4035*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (int_aarch64_neon_vcopy_lane 4036*9880d681SAndroid Build Coastguard Worker (v2i64 V128:$Vd), VectorIndexD:$idx, (v2i64 V128:$Vs), 4037*9880d681SAndroid Build Coastguard Worker VectorIndexD:$idx2)), 4038*9880d681SAndroid Build Coastguard Worker (v2i64 (INSvi64lane 4039*9880d681SAndroid Build Coastguard Worker V128:$Vd, VectorIndexD:$idx, V128:$Vs, VectorIndexD:$idx2) 4040*9880d681SAndroid Build Coastguard Worker )>; 4041*9880d681SAndroid Build Coastguard Worker 4042*9880d681SAndroid Build Coastguard Workermulticlass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64, 4043*9880d681SAndroid Build Coastguard Worker ValueType VTScal, Instruction INS> { 4044*9880d681SAndroid Build Coastguard Worker def : Pat<(VT128 (vector_insert V128:$src, 4045*9880d681SAndroid Build Coastguard Worker (VTScal (vector_extract (VT128 V128:$Rn), imm:$Immn)), 4046*9880d681SAndroid Build Coastguard Worker imm:$Immd)), 4047*9880d681SAndroid Build Coastguard Worker (INS V128:$src, imm:$Immd, V128:$Rn, imm:$Immn)>; 4048*9880d681SAndroid Build Coastguard Worker 4049*9880d681SAndroid Build Coastguard Worker def : Pat<(VT128 (vector_insert V128:$src, 4050*9880d681SAndroid Build Coastguard Worker (VTScal (vector_extract (VT64 V64:$Rn), imm:$Immn)), 4051*9880d681SAndroid Build Coastguard Worker imm:$Immd)), 4052*9880d681SAndroid Build Coastguard Worker (INS V128:$src, imm:$Immd, 4053*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), imm:$Immn)>; 4054*9880d681SAndroid Build Coastguard Worker 4055*9880d681SAndroid Build Coastguard Worker def : Pat<(VT64 (vector_insert V64:$src, 4056*9880d681SAndroid Build Coastguard Worker (VTScal (vector_extract (VT128 V128:$Rn), imm:$Immn)), 4057*9880d681SAndroid Build Coastguard Worker imm:$Immd)), 4058*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (INS (SUBREG_TO_REG (i64 0), V64:$src, dsub), 4059*9880d681SAndroid Build Coastguard Worker imm:$Immd, V128:$Rn, imm:$Immn), 4060*9880d681SAndroid Build Coastguard Worker dsub)>; 4061*9880d681SAndroid Build Coastguard Worker 4062*9880d681SAndroid Build Coastguard Worker def : Pat<(VT64 (vector_insert V64:$src, 4063*9880d681SAndroid Build Coastguard Worker (VTScal (vector_extract (VT64 V64:$Rn), imm:$Immn)), 4064*9880d681SAndroid Build Coastguard Worker imm:$Immd)), 4065*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 4066*9880d681SAndroid Build Coastguard Worker (INS (SUBREG_TO_REG (i64 0), V64:$src, dsub), imm:$Immd, 4067*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), imm:$Immn), 4068*9880d681SAndroid Build Coastguard Worker dsub)>; 4069*9880d681SAndroid Build Coastguard Worker} 4070*9880d681SAndroid Build Coastguard Worker 4071*9880d681SAndroid Build Coastguard Workerdefm : Neon_INS_elt_pattern<v8f16, v4f16, f16, INSvi16lane>; 4072*9880d681SAndroid Build Coastguard Workerdefm : Neon_INS_elt_pattern<v4f32, v2f32, f32, INSvi32lane>; 4073*9880d681SAndroid Build Coastguard Workerdefm : Neon_INS_elt_pattern<v2f64, v1f64, f64, INSvi64lane>; 4074*9880d681SAndroid Build Coastguard Worker 4075*9880d681SAndroid Build Coastguard Worker 4076*9880d681SAndroid Build Coastguard Worker// Floating point vector extractions are codegen'd as either a sequence of 4077*9880d681SAndroid Build Coastguard Worker// subregister extractions, or a MOV (aka CPY here, alias for DUP) if 4078*9880d681SAndroid Build Coastguard Worker// the lane number is anything other than zero. 4079*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v2f64 V128:$Rn), 0), 4080*9880d681SAndroid Build Coastguard Worker (f64 (EXTRACT_SUBREG V128:$Rn, dsub))>; 4081*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v4f32 V128:$Rn), 0), 4082*9880d681SAndroid Build Coastguard Worker (f32 (EXTRACT_SUBREG V128:$Rn, ssub))>; 4083*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v8f16 V128:$Rn), 0), 4084*9880d681SAndroid Build Coastguard Worker (f16 (EXTRACT_SUBREG V128:$Rn, hsub))>; 4085*9880d681SAndroid Build Coastguard Worker 4086*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v2f64 V128:$Rn), VectorIndexD:$idx), 4087*9880d681SAndroid Build Coastguard Worker (f64 (CPYi64 V128:$Rn, VectorIndexD:$idx))>; 4088*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v4f32 V128:$Rn), VectorIndexS:$idx), 4089*9880d681SAndroid Build Coastguard Worker (f32 (CPYi32 V128:$Rn, VectorIndexS:$idx))>; 4090*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v8f16 V128:$Rn), VectorIndexH:$idx), 4091*9880d681SAndroid Build Coastguard Worker (f16 (CPYi16 V128:$Rn, VectorIndexH:$idx))>; 4092*9880d681SAndroid Build Coastguard Worker 4093*9880d681SAndroid Build Coastguard Worker// All concat_vectors operations are canonicalised to act on i64 vectors for 4094*9880d681SAndroid Build Coastguard Worker// AArch64. In the general case we need an instruction, which had just as well be 4095*9880d681SAndroid Build Coastguard Worker// INS. 4096*9880d681SAndroid Build Coastguard Workerclass ConcatPat<ValueType DstTy, ValueType SrcTy> 4097*9880d681SAndroid Build Coastguard Worker : Pat<(DstTy (concat_vectors (SrcTy V64:$Rd), V64:$Rn)), 4098*9880d681SAndroid Build Coastguard Worker (INSvi64lane (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 1, 4099*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rn, dsub), 0)>; 4100*9880d681SAndroid Build Coastguard Worker 4101*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v2i64, v1i64>; 4102*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v2f64, v1f64>; 4103*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v4i32, v2i32>; 4104*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v4f32, v2f32>; 4105*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v8i16, v4i16>; 4106*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v8f16, v4f16>; 4107*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v16i8, v8i8>; 4108*9880d681SAndroid Build Coastguard Worker 4109*9880d681SAndroid Build Coastguard Worker// If the high lanes are undef, though, we can just ignore them: 4110*9880d681SAndroid Build Coastguard Workerclass ConcatUndefPat<ValueType DstTy, ValueType SrcTy> 4111*9880d681SAndroid Build Coastguard Worker : Pat<(DstTy (concat_vectors (SrcTy V64:$Rn), undef)), 4112*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rn, dsub)>; 4113*9880d681SAndroid Build Coastguard Worker 4114*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v2i64, v1i64>; 4115*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v2f64, v1f64>; 4116*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v4i32, v2i32>; 4117*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v4f32, v2f32>; 4118*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v8i16, v4i16>; 4119*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v16i8, v8i8>; 4120*9880d681SAndroid Build Coastguard Worker 4121*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4122*9880d681SAndroid Build Coastguard Worker// AdvSIMD across lanes instructions 4123*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4124*9880d681SAndroid Build Coastguard Worker 4125*9880d681SAndroid Build Coastguard Workerdefm ADDV : SIMDAcrossLanesBHS<0, 0b11011, "addv">; 4126*9880d681SAndroid Build Coastguard Workerdefm SMAXV : SIMDAcrossLanesBHS<0, 0b01010, "smaxv">; 4127*9880d681SAndroid Build Coastguard Workerdefm SMINV : SIMDAcrossLanesBHS<0, 0b11010, "sminv">; 4128*9880d681SAndroid Build Coastguard Workerdefm UMAXV : SIMDAcrossLanesBHS<1, 0b01010, "umaxv">; 4129*9880d681SAndroid Build Coastguard Workerdefm UMINV : SIMDAcrossLanesBHS<1, 0b11010, "uminv">; 4130*9880d681SAndroid Build Coastguard Workerdefm SADDLV : SIMDAcrossLanesHSD<0, 0b00011, "saddlv">; 4131*9880d681SAndroid Build Coastguard Workerdefm UADDLV : SIMDAcrossLanesHSD<1, 0b00011, "uaddlv">; 4132*9880d681SAndroid Build Coastguard Workerdefm FMAXNMV : SIMDFPAcrossLanes<0b01100, 0, "fmaxnmv", int_aarch64_neon_fmaxnmv>; 4133*9880d681SAndroid Build Coastguard Workerdefm FMAXV : SIMDFPAcrossLanes<0b01111, 0, "fmaxv", int_aarch64_neon_fmaxv>; 4134*9880d681SAndroid Build Coastguard Workerdefm FMINNMV : SIMDFPAcrossLanes<0b01100, 1, "fminnmv", int_aarch64_neon_fminnmv>; 4135*9880d681SAndroid Build Coastguard Workerdefm FMINV : SIMDFPAcrossLanes<0b01111, 1, "fminv", int_aarch64_neon_fminv>; 4136*9880d681SAndroid Build Coastguard Worker 4137*9880d681SAndroid Build Coastguard Worker// Patterns for across-vector intrinsics, that have a node equivalent, that 4138*9880d681SAndroid Build Coastguard Worker// returns a vector (with only the low lane defined) instead of a scalar. 4139*9880d681SAndroid Build Coastguard Worker// In effect, opNode is the same as (scalar_to_vector (IntNode)). 4140*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesIntrinsic<string baseOpc, 4141*9880d681SAndroid Build Coastguard Worker SDPatternOperator opNode> { 4142*9880d681SAndroid Build Coastguard Worker// If a lane instruction caught the vector_extract around opNode, we can 4143*9880d681SAndroid Build Coastguard Worker// directly match the latter to the instruction. 4144*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (opNode V64:$Rn)), 4145*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i8 (IMPLICIT_DEF)), 4146*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub)>; 4147*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (opNode V128:$Rn)), 4148*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4149*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub)>; 4150*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (opNode V64:$Rn)), 4151*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i16 (IMPLICIT_DEF)), 4152*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub)>; 4153*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (opNode V128:$Rn)), 4154*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), 4155*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub)>; 4156*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (opNode V128:$Rn)), 4157*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), 4158*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), ssub)>; 4159*9880d681SAndroid Build Coastguard Worker 4160*9880d681SAndroid Build Coastguard Worker 4161*9880d681SAndroid Build Coastguard Worker// If none did, fallback to the explicit patterns, consuming the vector_extract. 4162*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (insert_subvector undef, (v8i8 (opNode V64:$Rn)), 4163*9880d681SAndroid Build Coastguard Worker (i32 0)), (i64 0))), 4164*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (INSERT_SUBREG (v8i8 (IMPLICIT_DEF)), 4165*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), 4166*9880d681SAndroid Build Coastguard Worker bsub), ssub)>; 4167*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (v16i8 (opNode V128:$Rn)), (i64 0))), 4168*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4169*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), 4170*9880d681SAndroid Build Coastguard Worker bsub), ssub)>; 4171*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (insert_subvector undef, 4172*9880d681SAndroid Build Coastguard Worker (v4i16 (opNode V64:$Rn)), (i32 0)), (i64 0))), 4173*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (INSERT_SUBREG (v4i16 (IMPLICIT_DEF)), 4174*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), 4175*9880d681SAndroid Build Coastguard Worker hsub), ssub)>; 4176*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (v8i16 (opNode V128:$Rn)), (i64 0))), 4177*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), 4178*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), 4179*9880d681SAndroid Build Coastguard Worker hsub), ssub)>; 4180*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (v4i32 (opNode V128:$Rn)), (i64 0))), 4181*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), 4182*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), 4183*9880d681SAndroid Build Coastguard Worker ssub), ssub)>; 4184*9880d681SAndroid Build Coastguard Worker 4185*9880d681SAndroid Build Coastguard Worker} 4186*9880d681SAndroid Build Coastguard Worker 4187*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesSignedIntrinsic<string baseOpc, 4188*9880d681SAndroid Build Coastguard Worker SDPatternOperator opNode> 4189*9880d681SAndroid Build Coastguard Worker : SIMDAcrossLanesIntrinsic<baseOpc, opNode> { 4190*9880d681SAndroid Build Coastguard Worker// If there is a sign extension after this intrinsic, consume it as smov already 4191*9880d681SAndroid Build Coastguard Worker// performed it 4192*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg (i32 (vector_extract (insert_subvector undef, 4193*9880d681SAndroid Build Coastguard Worker (opNode (v8i8 V64:$Rn)), (i32 0)), (i64 0))), i8)), 4194*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi8to32 4195*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4196*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub), 4197*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 4198*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg (i32 (vector_extract 4199*9880d681SAndroid Build Coastguard Worker (opNode (v16i8 V128:$Rn)), (i64 0))), i8)), 4200*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi8to32 4201*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4202*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub), 4203*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 4204*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg (i32 (vector_extract (insert_subvector undef, 4205*9880d681SAndroid Build Coastguard Worker (opNode (v4i16 V64:$Rn)), (i32 0)), (i64 0))), i16)), 4206*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi16to32 4207*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4208*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub), 4209*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 4210*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg (i32 (vector_extract 4211*9880d681SAndroid Build Coastguard Worker (opNode (v8i16 V128:$Rn)), (i64 0))), i16)), 4212*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi16to32 4213*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4214*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub), 4215*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 4216*9880d681SAndroid Build Coastguard Worker} 4217*9880d681SAndroid Build Coastguard Worker 4218*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesUnsignedIntrinsic<string baseOpc, 4219*9880d681SAndroid Build Coastguard Worker SDPatternOperator opNode> 4220*9880d681SAndroid Build Coastguard Worker : SIMDAcrossLanesIntrinsic<baseOpc, opNode> { 4221*9880d681SAndroid Build Coastguard Worker// If there is a masking operation keeping only what has been actually 4222*9880d681SAndroid Build Coastguard Worker// generated, consume it. 4223*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (and (i32 (vector_extract (insert_subvector undef, 4224*9880d681SAndroid Build Coastguard Worker (opNode (v8i8 V64:$Rn)), (i32 0)), (i64 0))), maski8_or_more)), 4225*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4226*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4227*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub), 4228*9880d681SAndroid Build Coastguard Worker ssub))>; 4229*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (and (i32 (vector_extract (opNode (v16i8 V128:$Rn)), (i64 0))), 4230*9880d681SAndroid Build Coastguard Worker maski8_or_more)), 4231*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4232*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4233*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub), 4234*9880d681SAndroid Build Coastguard Worker ssub))>; 4235*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (and (i32 (vector_extract (insert_subvector undef, 4236*9880d681SAndroid Build Coastguard Worker (opNode (v4i16 V64:$Rn)), (i32 0)), (i64 0))), maski16_or_more)), 4237*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4238*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4239*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub), 4240*9880d681SAndroid Build Coastguard Worker ssub))>; 4241*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (and (i32 (vector_extract (opNode (v8i16 V128:$Rn)), (i64 0))), 4242*9880d681SAndroid Build Coastguard Worker maski16_or_more)), 4243*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4244*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4245*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub), 4246*9880d681SAndroid Build Coastguard Worker ssub))>; 4247*9880d681SAndroid Build Coastguard Worker} 4248*9880d681SAndroid Build Coastguard Worker 4249*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesSignedIntrinsic<"ADDV", AArch64saddv>; 4250*9880d681SAndroid Build Coastguard Worker// vaddv_[su]32 is special; -> ADDP Vd.2S,Vn.2S,Vm.2S; return Vd.s[0];Vn==Vm 4251*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64saddv (v2i32 V64:$Rn))), 4252*9880d681SAndroid Build Coastguard Worker (ADDPv2i32 V64:$Rn, V64:$Rn)>; 4253*9880d681SAndroid Build Coastguard Worker 4254*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesUnsignedIntrinsic<"ADDV", AArch64uaddv>; 4255*9880d681SAndroid Build Coastguard Worker// vaddv_[su]32 is special; -> ADDP Vd.2S,Vn.2S,Vm.2S; return Vd.s[0];Vn==Vm 4256*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64uaddv (v2i32 V64:$Rn))), 4257*9880d681SAndroid Build Coastguard Worker (ADDPv2i32 V64:$Rn, V64:$Rn)>; 4258*9880d681SAndroid Build Coastguard Worker 4259*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesSignedIntrinsic<"SMAXV", AArch64smaxv>; 4260*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64smaxv (v2i32 V64:$Rn))), 4261*9880d681SAndroid Build Coastguard Worker (SMAXPv2i32 V64:$Rn, V64:$Rn)>; 4262*9880d681SAndroid Build Coastguard Worker 4263*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesSignedIntrinsic<"SMINV", AArch64sminv>; 4264*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64sminv (v2i32 V64:$Rn))), 4265*9880d681SAndroid Build Coastguard Worker (SMINPv2i32 V64:$Rn, V64:$Rn)>; 4266*9880d681SAndroid Build Coastguard Worker 4267*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesUnsignedIntrinsic<"UMAXV", AArch64umaxv>; 4268*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64umaxv (v2i32 V64:$Rn))), 4269*9880d681SAndroid Build Coastguard Worker (UMAXPv2i32 V64:$Rn, V64:$Rn)>; 4270*9880d681SAndroid Build Coastguard Worker 4271*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesUnsignedIntrinsic<"UMINV", AArch64uminv>; 4272*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64uminv (v2i32 V64:$Rn))), 4273*9880d681SAndroid Build Coastguard Worker (UMINPv2i32 V64:$Rn, V64:$Rn)>; 4274*9880d681SAndroid Build Coastguard Worker 4275*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesSignedLongIntrinsic<string baseOpc, Intrinsic intOp> { 4276*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (intOp (v8i8 V64:$Rn))), 4277*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi16to32 4278*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4279*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), hsub), 4280*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 4281*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v16i8 V128:$Rn))), 4282*9880d681SAndroid Build Coastguard Worker (i32 (SMOVvi16to32 4283*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4284*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), hsub), 4285*9880d681SAndroid Build Coastguard Worker (i64 0)))>; 4286*9880d681SAndroid Build Coastguard Worker 4287*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v4i16 V64:$Rn))), 4288*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4289*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4290*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), ssub), 4291*9880d681SAndroid Build Coastguard Worker ssub))>; 4292*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v8i16 V128:$Rn))), 4293*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4294*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4295*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), ssub), 4296*9880d681SAndroid Build Coastguard Worker ssub))>; 4297*9880d681SAndroid Build Coastguard Worker 4298*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (intOp (v4i32 V128:$Rn))), 4299*9880d681SAndroid Build Coastguard Worker (i64 (EXTRACT_SUBREG 4300*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4301*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), dsub), 4302*9880d681SAndroid Build Coastguard Worker dsub))>; 4303*9880d681SAndroid Build Coastguard Worker} 4304*9880d681SAndroid Build Coastguard Worker 4305*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesUnsignedLongIntrinsic<string baseOpc, 4306*9880d681SAndroid Build Coastguard Worker Intrinsic intOp> { 4307*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (intOp (v8i8 V64:$Rn))), 4308*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4309*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4310*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), hsub), 4311*9880d681SAndroid Build Coastguard Worker ssub))>; 4312*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v16i8 V128:$Rn))), 4313*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4314*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4315*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), hsub), 4316*9880d681SAndroid Build Coastguard Worker ssub))>; 4317*9880d681SAndroid Build Coastguard Worker 4318*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v4i16 V64:$Rn))), 4319*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4320*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4321*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), ssub), 4322*9880d681SAndroid Build Coastguard Worker ssub))>; 4323*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v8i16 V128:$Rn))), 4324*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG 4325*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4326*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), ssub), 4327*9880d681SAndroid Build Coastguard Worker ssub))>; 4328*9880d681SAndroid Build Coastguard Worker 4329*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (intOp (v4i32 V128:$Rn))), 4330*9880d681SAndroid Build Coastguard Worker (i64 (EXTRACT_SUBREG 4331*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4332*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), dsub), 4333*9880d681SAndroid Build Coastguard Worker dsub))>; 4334*9880d681SAndroid Build Coastguard Worker} 4335*9880d681SAndroid Build Coastguard Worker 4336*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesSignedLongIntrinsic<"SADDLV", int_aarch64_neon_saddlv>; 4337*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesUnsignedLongIntrinsic<"UADDLV", int_aarch64_neon_uaddlv>; 4338*9880d681SAndroid Build Coastguard Worker 4339*9880d681SAndroid Build Coastguard Worker// The vaddlv_s32 intrinsic gets mapped to SADDLP. 4340*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_saddlv (v2i32 V64:$Rn))), 4341*9880d681SAndroid Build Coastguard Worker (i64 (EXTRACT_SUBREG 4342*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4343*9880d681SAndroid Build Coastguard Worker (SADDLPv2i32_v1i64 V64:$Rn), dsub), 4344*9880d681SAndroid Build Coastguard Worker dsub))>; 4345*9880d681SAndroid Build Coastguard Worker// The vaddlv_u32 intrinsic gets mapped to UADDLP. 4346*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_uaddlv (v2i32 V64:$Rn))), 4347*9880d681SAndroid Build Coastguard Worker (i64 (EXTRACT_SUBREG 4348*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 4349*9880d681SAndroid Build Coastguard Worker (UADDLPv2i32_v1i64 V64:$Rn), dsub), 4350*9880d681SAndroid Build Coastguard Worker dsub))>; 4351*9880d681SAndroid Build Coastguard Worker 4352*9880d681SAndroid Build Coastguard Worker//------------------------------------------------------------------------------ 4353*9880d681SAndroid Build Coastguard Worker// AdvSIMD modified immediate instructions 4354*9880d681SAndroid Build Coastguard Worker//------------------------------------------------------------------------------ 4355*9880d681SAndroid Build Coastguard Worker 4356*9880d681SAndroid Build Coastguard Worker// AdvSIMD BIC 4357*9880d681SAndroid Build Coastguard Workerdefm BIC : SIMDModifiedImmVectorShiftTied<1, 0b11, 0b01, "bic", AArch64bici>; 4358*9880d681SAndroid Build Coastguard Worker// AdvSIMD ORR 4359*9880d681SAndroid Build Coastguard Workerdefm ORR : SIMDModifiedImmVectorShiftTied<0, 0b11, 0b01, "orr", AArch64orri>; 4360*9880d681SAndroid Build Coastguard Worker 4361*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic $Vd.4h, $imm", (BICv4i16 V64:$Vd, imm0_255:$imm, 0)>; 4362*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic $Vd.8h, $imm", (BICv8i16 V128:$Vd, imm0_255:$imm, 0)>; 4363*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic $Vd.2s, $imm", (BICv2i32 V64:$Vd, imm0_255:$imm, 0)>; 4364*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic $Vd.4s, $imm", (BICv4i32 V128:$Vd, imm0_255:$imm, 0)>; 4365*9880d681SAndroid Build Coastguard Worker 4366*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic.4h $Vd, $imm", (BICv4i16 V64:$Vd, imm0_255:$imm, 0), 0>; 4367*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic.8h $Vd, $imm", (BICv8i16 V128:$Vd, imm0_255:$imm, 0), 0>; 4368*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic.2s $Vd, $imm", (BICv2i32 V64:$Vd, imm0_255:$imm, 0), 0>; 4369*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic.4s $Vd, $imm", (BICv4i32 V128:$Vd, imm0_255:$imm, 0), 0>; 4370*9880d681SAndroid Build Coastguard Worker 4371*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr $Vd.4h, $imm", (ORRv4i16 V64:$Vd, imm0_255:$imm, 0)>; 4372*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr $Vd.8h, $imm", (ORRv8i16 V128:$Vd, imm0_255:$imm, 0)>; 4373*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr $Vd.2s, $imm", (ORRv2i32 V64:$Vd, imm0_255:$imm, 0)>; 4374*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr $Vd.4s, $imm", (ORRv4i32 V128:$Vd, imm0_255:$imm, 0)>; 4375*9880d681SAndroid Build Coastguard Worker 4376*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr.4h $Vd, $imm", (ORRv4i16 V64:$Vd, imm0_255:$imm, 0), 0>; 4377*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr.8h $Vd, $imm", (ORRv8i16 V128:$Vd, imm0_255:$imm, 0), 0>; 4378*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr.2s $Vd, $imm", (ORRv2i32 V64:$Vd, imm0_255:$imm, 0), 0>; 4379*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr.4s $Vd, $imm", (ORRv4i32 V128:$Vd, imm0_255:$imm, 0), 0>; 4380*9880d681SAndroid Build Coastguard Worker 4381*9880d681SAndroid Build Coastguard Worker// AdvSIMD FMOV 4382*9880d681SAndroid Build Coastguard Workerdef FMOVv2f64_ns : SIMDModifiedImmVectorNoShift<1, 1, 0, 0b1111, V128, fpimm8, 4383*9880d681SAndroid Build Coastguard Worker "fmov", ".2d", 4384*9880d681SAndroid Build Coastguard Worker [(set (v2f64 V128:$Rd), (AArch64fmov imm0_255:$imm8))]>; 4385*9880d681SAndroid Build Coastguard Workerdef FMOVv2f32_ns : SIMDModifiedImmVectorNoShift<0, 0, 0, 0b1111, V64, fpimm8, 4386*9880d681SAndroid Build Coastguard Worker "fmov", ".2s", 4387*9880d681SAndroid Build Coastguard Worker [(set (v2f32 V64:$Rd), (AArch64fmov imm0_255:$imm8))]>; 4388*9880d681SAndroid Build Coastguard Workerdef FMOVv4f32_ns : SIMDModifiedImmVectorNoShift<1, 0, 0, 0b1111, V128, fpimm8, 4389*9880d681SAndroid Build Coastguard Worker "fmov", ".4s", 4390*9880d681SAndroid Build Coastguard Worker [(set (v4f32 V128:$Rd), (AArch64fmov imm0_255:$imm8))]>; 4391*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in { 4392*9880d681SAndroid Build Coastguard Workerdef FMOVv4f16_ns : SIMDModifiedImmVectorNoShift<0, 0, 1, 0b1111, V64, fpimm8, 4393*9880d681SAndroid Build Coastguard Worker "fmov", ".4h", 4394*9880d681SAndroid Build Coastguard Worker [(set (v4f16 V64:$Rd), (AArch64fmov imm0_255:$imm8))]>; 4395*9880d681SAndroid Build Coastguard Workerdef FMOVv8f16_ns : SIMDModifiedImmVectorNoShift<1, 0, 1, 0b1111, V128, fpimm8, 4396*9880d681SAndroid Build Coastguard Worker "fmov", ".8h", 4397*9880d681SAndroid Build Coastguard Worker [(set (v8f16 V128:$Rd), (AArch64fmov imm0_255:$imm8))]>; 4398*9880d681SAndroid Build Coastguard Worker} // Predicates = [HasNEON, HasFullFP16] 4399*9880d681SAndroid Build Coastguard Worker 4400*9880d681SAndroid Build Coastguard Worker// AdvSIMD MOVI 4401*9880d681SAndroid Build Coastguard Worker 4402*9880d681SAndroid Build Coastguard Worker// EDIT byte mask: scalar 4403*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1 in 4404*9880d681SAndroid Build Coastguard Workerdef MOVID : SIMDModifiedImmScalarNoShift<0, 1, 0b1110, "movi", 4405*9880d681SAndroid Build Coastguard Worker [(set FPR64:$Rd, simdimmtype10:$imm8)]>; 4406*9880d681SAndroid Build Coastguard Worker// The movi_edit node has the immediate value already encoded, so we use 4407*9880d681SAndroid Build Coastguard Worker// a plain imm0_255 here. 4408*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (AArch64movi_edit imm0_255:$shift)), 4409*9880d681SAndroid Build Coastguard Worker (MOVID imm0_255:$shift)>; 4410*9880d681SAndroid Build Coastguard Worker 4411*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 immAllZerosV), (MOVID (i32 0))>; 4412*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 immAllZerosV), (MOVID (i32 0))>; 4413*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 immAllZerosV), (MOVID (i32 0))>; 4414*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 immAllZerosV), (MOVID (i32 0))>; 4415*9880d681SAndroid Build Coastguard Worker 4416*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 immAllOnesV), (MOVID (i32 255))>; 4417*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 immAllOnesV), (MOVID (i32 255))>; 4418*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 immAllOnesV), (MOVID (i32 255))>; 4419*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 immAllOnesV), (MOVID (i32 255))>; 4420*9880d681SAndroid Build Coastguard Worker 4421*9880d681SAndroid Build Coastguard Worker// EDIT byte mask: 2d 4422*9880d681SAndroid Build Coastguard Worker 4423*9880d681SAndroid Build Coastguard Worker// The movi_edit node has the immediate value already encoded, so we use 4424*9880d681SAndroid Build Coastguard Worker// a plain imm0_255 in the pattern 4425*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1 in 4426*9880d681SAndroid Build Coastguard Workerdef MOVIv2d_ns : SIMDModifiedImmVectorNoShift<1, 1, 0, 0b1110, V128, 4427*9880d681SAndroid Build Coastguard Worker simdimmtype10, 4428*9880d681SAndroid Build Coastguard Worker "movi", ".2d", 4429*9880d681SAndroid Build Coastguard Worker [(set (v2i64 V128:$Rd), (AArch64movi_edit imm0_255:$imm8))]>; 4430*9880d681SAndroid Build Coastguard Worker 4431*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 immAllZerosV), (MOVIv2d_ns (i32 0))>; 4432*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 immAllZerosV), (MOVIv2d_ns (i32 0))>; 4433*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 immAllZerosV), (MOVIv2d_ns (i32 0))>; 4434*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 immAllZerosV), (MOVIv2d_ns (i32 0))>; 4435*9880d681SAndroid Build Coastguard Worker 4436*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 immAllOnesV), (MOVIv2d_ns (i32 255))>; 4437*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 immAllOnesV), (MOVIv2d_ns (i32 255))>; 4438*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 immAllOnesV), (MOVIv2d_ns (i32 255))>; 4439*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 immAllOnesV), (MOVIv2d_ns (i32 255))>; 4440*9880d681SAndroid Build Coastguard Worker 4441*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64dup (f64 fpimm0))), (MOVIv2d_ns (i32 0))>; 4442*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64dup (f32 fpimm0))), (MOVIv2d_ns (i32 0))>; 4443*9880d681SAndroid Build Coastguard Worker 4444*9880d681SAndroid Build Coastguard Worker// EDIT per word & halfword: 2s, 4h, 4s, & 8h 4445*9880d681SAndroid Build Coastguard Workerdefm MOVI : SIMDModifiedImmVectorShift<0, 0b10, 0b00, "movi">; 4446*9880d681SAndroid Build Coastguard Worker 4447*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi $Vd.4h, $imm", (MOVIv4i16 V64:$Vd, imm0_255:$imm, 0), 0>; 4448*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi $Vd.8h, $imm", (MOVIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>; 4449*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi $Vd.2s, $imm", (MOVIv2i32 V64:$Vd, imm0_255:$imm, 0), 0>; 4450*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi $Vd.4s, $imm", (MOVIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>; 4451*9880d681SAndroid Build Coastguard Worker 4452*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi.4h $Vd, $imm", (MOVIv4i16 V64:$Vd, imm0_255:$imm, 0), 0>; 4453*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi.8h $Vd, $imm", (MOVIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>; 4454*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi.2s $Vd, $imm", (MOVIv2i32 V64:$Vd, imm0_255:$imm, 0), 0>; 4455*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi.4s $Vd, $imm", (MOVIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>; 4456*9880d681SAndroid Build Coastguard Worker 4457*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))), 4458*9880d681SAndroid Build Coastguard Worker (MOVIv2i32 imm0_255:$imm8, imm:$shift)>; 4459*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))), 4460*9880d681SAndroid Build Coastguard Worker (MOVIv4i32 imm0_255:$imm8, imm:$shift)>; 4461*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))), 4462*9880d681SAndroid Build Coastguard Worker (MOVIv4i16 imm0_255:$imm8, imm:$shift)>; 4463*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))), 4464*9880d681SAndroid Build Coastguard Worker (MOVIv8i16 imm0_255:$imm8, imm:$shift)>; 4465*9880d681SAndroid Build Coastguard Worker 4466*9880d681SAndroid Build Coastguard Worker// EDIT per word: 2s & 4s with MSL shifter 4467*9880d681SAndroid Build Coastguard Workerdef MOVIv2s_msl : SIMDModifiedImmMoveMSL<0, 0, {1,1,0,?}, V64, "movi", ".2s", 4468*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), 4469*9880d681SAndroid Build Coastguard Worker (AArch64movi_msl imm0_255:$imm8, (i32 imm:$shift)))]>; 4470*9880d681SAndroid Build Coastguard Workerdef MOVIv4s_msl : SIMDModifiedImmMoveMSL<1, 0, {1,1,0,?}, V128, "movi", ".4s", 4471*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 4472*9880d681SAndroid Build Coastguard Worker (AArch64movi_msl imm0_255:$imm8, (i32 imm:$shift)))]>; 4473*9880d681SAndroid Build Coastguard Worker 4474*9880d681SAndroid Build Coastguard Worker// Per byte: 8b & 16b 4475*9880d681SAndroid Build Coastguard Workerdef MOVIv8b_ns : SIMDModifiedImmVectorNoShift<0, 0, 0, 0b1110, V64, imm0_255, 4476*9880d681SAndroid Build Coastguard Worker "movi", ".8b", 4477*9880d681SAndroid Build Coastguard Worker [(set (v8i8 V64:$Rd), (AArch64movi imm0_255:$imm8))]>; 4478*9880d681SAndroid Build Coastguard Workerdef MOVIv16b_ns : SIMDModifiedImmVectorNoShift<1, 0, 0, 0b1110, V128, imm0_255, 4479*9880d681SAndroid Build Coastguard Worker "movi", ".16b", 4480*9880d681SAndroid Build Coastguard Worker [(set (v16i8 V128:$Rd), (AArch64movi imm0_255:$imm8))]>; 4481*9880d681SAndroid Build Coastguard Worker 4482*9880d681SAndroid Build Coastguard Worker// AdvSIMD MVNI 4483*9880d681SAndroid Build Coastguard Worker 4484*9880d681SAndroid Build Coastguard Worker// EDIT per word & halfword: 2s, 4h, 4s, & 8h 4485*9880d681SAndroid Build Coastguard Workerdefm MVNI : SIMDModifiedImmVectorShift<1, 0b10, 0b00, "mvni">; 4486*9880d681SAndroid Build Coastguard Worker 4487*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni $Vd.4h, $imm", (MVNIv4i16 V64:$Vd, imm0_255:$imm, 0), 0>; 4488*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni $Vd.8h, $imm", (MVNIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>; 4489*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni $Vd.2s, $imm", (MVNIv2i32 V64:$Vd, imm0_255:$imm, 0), 0>; 4490*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni $Vd.4s, $imm", (MVNIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>; 4491*9880d681SAndroid Build Coastguard Worker 4492*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni.4h $Vd, $imm", (MVNIv4i16 V64:$Vd, imm0_255:$imm, 0), 0>; 4493*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni.8h $Vd, $imm", (MVNIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>; 4494*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni.2s $Vd, $imm", (MVNIv2i32 V64:$Vd, imm0_255:$imm, 0), 0>; 4495*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni.4s $Vd, $imm", (MVNIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>; 4496*9880d681SAndroid Build Coastguard Worker 4497*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))), 4498*9880d681SAndroid Build Coastguard Worker (MVNIv2i32 imm0_255:$imm8, imm:$shift)>; 4499*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))), 4500*9880d681SAndroid Build Coastguard Worker (MVNIv4i32 imm0_255:$imm8, imm:$shift)>; 4501*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))), 4502*9880d681SAndroid Build Coastguard Worker (MVNIv4i16 imm0_255:$imm8, imm:$shift)>; 4503*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))), 4504*9880d681SAndroid Build Coastguard Worker (MVNIv8i16 imm0_255:$imm8, imm:$shift)>; 4505*9880d681SAndroid Build Coastguard Worker 4506*9880d681SAndroid Build Coastguard Worker// EDIT per word: 2s & 4s with MSL shifter 4507*9880d681SAndroid Build Coastguard Workerdef MVNIv2s_msl : SIMDModifiedImmMoveMSL<0, 1, {1,1,0,?}, V64, "mvni", ".2s", 4508*9880d681SAndroid Build Coastguard Worker [(set (v2i32 V64:$Rd), 4509*9880d681SAndroid Build Coastguard Worker (AArch64mvni_msl imm0_255:$imm8, (i32 imm:$shift)))]>; 4510*9880d681SAndroid Build Coastguard Workerdef MVNIv4s_msl : SIMDModifiedImmMoveMSL<1, 1, {1,1,0,?}, V128, "mvni", ".4s", 4511*9880d681SAndroid Build Coastguard Worker [(set (v4i32 V128:$Rd), 4512*9880d681SAndroid Build Coastguard Worker (AArch64mvni_msl imm0_255:$imm8, (i32 imm:$shift)))]>; 4513*9880d681SAndroid Build Coastguard Worker 4514*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4515*9880d681SAndroid Build Coastguard Worker// AdvSIMD indexed element 4516*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4517*9880d681SAndroid Build Coastguard Worker 4518*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 4519*9880d681SAndroid Build Coastguard Worker defm FMLA : SIMDFPIndexedTied<0, 0b0001, "fmla">; 4520*9880d681SAndroid Build Coastguard Worker defm FMLS : SIMDFPIndexedTied<0, 0b0101, "fmls">; 4521*9880d681SAndroid Build Coastguard Worker} 4522*9880d681SAndroid Build Coastguard Worker 4523*9880d681SAndroid Build Coastguard Worker// NOTE: Operands are reordered in the FMLA/FMLS PatFrags because the 4524*9880d681SAndroid Build Coastguard Worker// instruction expects the addend first, while the intrinsic expects it last. 4525*9880d681SAndroid Build Coastguard Worker 4526*9880d681SAndroid Build Coastguard Worker// On the other hand, there are quite a few valid combinatorial options due to 4527*9880d681SAndroid Build Coastguard Worker// the commutativity of multiplication and the fact that (-x) * y = x * (-y). 4528*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLA", 4529*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$RHS, node:$MHS, node:$LHS)>>; 4530*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLA", 4531*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$MHS, node:$RHS, node:$LHS)>>; 4532*9880d681SAndroid Build Coastguard Worker 4533*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLS", 4534*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$MHS, (fneg node:$RHS), node:$LHS)> >; 4535*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLS", 4536*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$RHS, (fneg node:$MHS), node:$LHS)> >; 4537*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLS", 4538*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma (fneg node:$RHS), node:$MHS, node:$LHS)> >; 4539*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLS", 4540*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma (fneg node:$MHS), node:$RHS, node:$LHS)> >; 4541*9880d681SAndroid Build Coastguard Worker 4542*9880d681SAndroid Build Coastguard Workermulticlass FMLSIndexedAfterNegPatterns<SDPatternOperator OpNode> { 4543*9880d681SAndroid Build Coastguard Worker // 3 variants for the .2s version: DUPLANE from 128-bit, DUPLANE from 64-bit 4544*9880d681SAndroid Build Coastguard Worker // and DUP scalar. 4545*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn), 4546*9880d681SAndroid Build Coastguard Worker (AArch64duplane32 (v4f32 (fneg V128:$Rm)), 4547*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))), 4548*9880d681SAndroid Build Coastguard Worker (FMLSv2i32_indexed V64:$Rd, V64:$Rn, V128:$Rm, VectorIndexS:$idx)>; 4549*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn), 4550*9880d681SAndroid Build Coastguard Worker (v2f32 (AArch64duplane32 4551*9880d681SAndroid Build Coastguard Worker (v4f32 (insert_subvector undef, 4552*9880d681SAndroid Build Coastguard Worker (v2f32 (fneg V64:$Rm)), 4553*9880d681SAndroid Build Coastguard Worker (i32 0))), 4554*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)))), 4555*9880d681SAndroid Build Coastguard Worker (FMLSv2i32_indexed V64:$Rd, V64:$Rn, 4556*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), V64:$Rm, dsub), 4557*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)>; 4558*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn), 4559*9880d681SAndroid Build Coastguard Worker (AArch64dup (f32 (fneg FPR32Op:$Rm))))), 4560*9880d681SAndroid Build Coastguard Worker (FMLSv2i32_indexed V64:$Rd, V64:$Rn, 4561*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), FPR32Op:$Rm, ssub), (i64 0))>; 4562*9880d681SAndroid Build Coastguard Worker 4563*9880d681SAndroid Build Coastguard Worker // 3 variants for the .4s version: DUPLANE from 128-bit, DUPLANE from 64-bit 4564*9880d681SAndroid Build Coastguard Worker // and DUP scalar. 4565*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn), 4566*9880d681SAndroid Build Coastguard Worker (AArch64duplane32 (v4f32 (fneg V128:$Rm)), 4567*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))), 4568*9880d681SAndroid Build Coastguard Worker (FMLSv4i32_indexed V128:$Rd, V128:$Rn, V128:$Rm, 4569*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)>; 4570*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn), 4571*9880d681SAndroid Build Coastguard Worker (v4f32 (AArch64duplane32 4572*9880d681SAndroid Build Coastguard Worker (v4f32 (insert_subvector undef, 4573*9880d681SAndroid Build Coastguard Worker (v2f32 (fneg V64:$Rm)), 4574*9880d681SAndroid Build Coastguard Worker (i32 0))), 4575*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)))), 4576*9880d681SAndroid Build Coastguard Worker (FMLSv4i32_indexed V128:$Rd, V128:$Rn, 4577*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), V64:$Rm, dsub), 4578*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)>; 4579*9880d681SAndroid Build Coastguard Worker def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn), 4580*9880d681SAndroid Build Coastguard Worker (AArch64dup (f32 (fneg FPR32Op:$Rm))))), 4581*9880d681SAndroid Build Coastguard Worker (FMLSv4i32_indexed V128:$Rd, V128:$Rn, 4582*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), FPR32Op:$Rm, ssub), (i64 0))>; 4583*9880d681SAndroid Build Coastguard Worker 4584*9880d681SAndroid Build Coastguard Worker // 2 variants for the .2d version: DUPLANE from 128-bit, and DUP scalar 4585*9880d681SAndroid Build Coastguard Worker // (DUPLANE from 64-bit would be trivial). 4586*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn), 4587*9880d681SAndroid Build Coastguard Worker (AArch64duplane64 (v2f64 (fneg V128:$Rm)), 4588*9880d681SAndroid Build Coastguard Worker VectorIndexD:$idx))), 4589*9880d681SAndroid Build Coastguard Worker (FMLSv2i64_indexed 4590*9880d681SAndroid Build Coastguard Worker V128:$Rd, V128:$Rn, V128:$Rm, VectorIndexS:$idx)>; 4591*9880d681SAndroid Build Coastguard Worker def : Pat<(v2f64 (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn), 4592*9880d681SAndroid Build Coastguard Worker (AArch64dup (f64 (fneg FPR64Op:$Rm))))), 4593*9880d681SAndroid Build Coastguard Worker (FMLSv2i64_indexed V128:$Rd, V128:$Rn, 4594*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), FPR64Op:$Rm, dsub), (i64 0))>; 4595*9880d681SAndroid Build Coastguard Worker 4596*9880d681SAndroid Build Coastguard Worker // 2 variants for 32-bit scalar version: extract from .2s or from .4s 4597*9880d681SAndroid Build Coastguard Worker def : Pat<(f32 (OpNode (f32 FPR32:$Rd), (f32 FPR32:$Rn), 4598*9880d681SAndroid Build Coastguard Worker (vector_extract (v4f32 (fneg V128:$Rm)), 4599*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))), 4600*9880d681SAndroid Build Coastguard Worker (FMLSv1i32_indexed FPR32:$Rd, FPR32:$Rn, 4601*9880d681SAndroid Build Coastguard Worker V128:$Rm, VectorIndexS:$idx)>; 4602*9880d681SAndroid Build Coastguard Worker def : Pat<(f32 (OpNode (f32 FPR32:$Rd), (f32 FPR32:$Rn), 4603*9880d681SAndroid Build Coastguard Worker (vector_extract (v4f32 (insert_subvector undef, 4604*9880d681SAndroid Build Coastguard Worker (v2f32 (fneg V64:$Rm)), 4605*9880d681SAndroid Build Coastguard Worker (i32 0))), 4606*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))), 4607*9880d681SAndroid Build Coastguard Worker (FMLSv1i32_indexed FPR32:$Rd, FPR32:$Rn, 4608*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), V64:$Rm, dsub), VectorIndexS:$idx)>; 4609*9880d681SAndroid Build Coastguard Worker 4610*9880d681SAndroid Build Coastguard Worker // 1 variant for 64-bit scalar version: extract from .1d or from .2d 4611*9880d681SAndroid Build Coastguard Worker def : Pat<(f64 (OpNode (f64 FPR64:$Rd), (f64 FPR64:$Rn), 4612*9880d681SAndroid Build Coastguard Worker (vector_extract (v2f64 (fneg V128:$Rm)), 4613*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx))), 4614*9880d681SAndroid Build Coastguard Worker (FMLSv1i64_indexed FPR64:$Rd, FPR64:$Rn, 4615*9880d681SAndroid Build Coastguard Worker V128:$Rm, VectorIndexS:$idx)>; 4616*9880d681SAndroid Build Coastguard Worker} 4617*9880d681SAndroid Build Coastguard Worker 4618*9880d681SAndroid Build Coastguard Workerdefm : FMLSIndexedAfterNegPatterns< 4619*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$RHS, node:$MHS, node:$LHS)> >; 4620*9880d681SAndroid Build Coastguard Workerdefm : FMLSIndexedAfterNegPatterns< 4621*9880d681SAndroid Build Coastguard Worker TriOpFrag<(fma node:$MHS, node:$RHS, node:$LHS)> >; 4622*9880d681SAndroid Build Coastguard Worker 4623*9880d681SAndroid Build Coastguard Workerdefm FMULX : SIMDFPIndexed<1, 0b1001, "fmulx", int_aarch64_neon_fmulx>; 4624*9880d681SAndroid Build Coastguard Workerdefm FMUL : SIMDFPIndexed<0, 0b1001, "fmul", fmul>; 4625*9880d681SAndroid Build Coastguard Worker 4626*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (fmul V64:$Rn, (AArch64dup (f32 FPR32:$Rm)))), 4627*9880d681SAndroid Build Coastguard Worker (FMULv2i32_indexed V64:$Rn, 4628*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR32:$Rm, ssub), 4629*9880d681SAndroid Build Coastguard Worker (i64 0))>; 4630*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fmul V128:$Rn, (AArch64dup (f32 FPR32:$Rm)))), 4631*9880d681SAndroid Build Coastguard Worker (FMULv4i32_indexed V128:$Rn, 4632*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR32:$Rm, ssub), 4633*9880d681SAndroid Build Coastguard Worker (i64 0))>; 4634*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (fmul V128:$Rn, (AArch64dup (f64 FPR64:$Rm)))), 4635*9880d681SAndroid Build Coastguard Worker (FMULv2i64_indexed V128:$Rn, 4636*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR64:$Rm, dsub), 4637*9880d681SAndroid Build Coastguard Worker (i64 0))>; 4638*9880d681SAndroid Build Coastguard Worker 4639*9880d681SAndroid Build Coastguard Workerdefm SQDMULH : SIMDIndexedHS<0, 0b1100, "sqdmulh", int_aarch64_neon_sqdmulh>; 4640*9880d681SAndroid Build Coastguard Workerdefm SQRDMULH : SIMDIndexedHS<0, 0b1101, "sqrdmulh", int_aarch64_neon_sqrdmulh>; 4641*9880d681SAndroid Build Coastguard Workerdefm MLA : SIMDVectorIndexedHSTied<1, 0b0000, "mla", 4642*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (mul node:$MHS, node:$RHS))>>; 4643*9880d681SAndroid Build Coastguard Workerdefm MLS : SIMDVectorIndexedHSTied<1, 0b0100, "mls", 4644*9880d681SAndroid Build Coastguard Worker TriOpFrag<(sub node:$LHS, (mul node:$MHS, node:$RHS))>>; 4645*9880d681SAndroid Build Coastguard Workerdefm MUL : SIMDVectorIndexedHS<0, 0b1000, "mul", mul>; 4646*9880d681SAndroid Build Coastguard Workerdefm SMLAL : SIMDVectorIndexedLongSDTied<0, 0b0010, "smlal", 4647*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (int_aarch64_neon_smull node:$MHS, node:$RHS))>>; 4648*9880d681SAndroid Build Coastguard Workerdefm SMLSL : SIMDVectorIndexedLongSDTied<0, 0b0110, "smlsl", 4649*9880d681SAndroid Build Coastguard Worker TriOpFrag<(sub node:$LHS, (int_aarch64_neon_smull node:$MHS, node:$RHS))>>; 4650*9880d681SAndroid Build Coastguard Workerdefm SMULL : SIMDVectorIndexedLongSD<0, 0b1010, "smull", 4651*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_smull>; 4652*9880d681SAndroid Build Coastguard Workerdefm SQDMLAL : SIMDIndexedLongSQDMLXSDTied<0, 0b0011, "sqdmlal", 4653*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqadd>; 4654*9880d681SAndroid Build Coastguard Workerdefm SQDMLSL : SIMDIndexedLongSQDMLXSDTied<0, 0b0111, "sqdmlsl", 4655*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqsub>; 4656*9880d681SAndroid Build Coastguard Workerdefm SQRDMLAH : SIMDIndexedSQRDMLxHSDTied<1, 0b1101, "sqrdmlah", 4657*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqadd>; 4658*9880d681SAndroid Build Coastguard Workerdefm SQRDMLSH : SIMDIndexedSQRDMLxHSDTied<1, 0b1111, "sqrdmlsh", 4659*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqsub>; 4660*9880d681SAndroid Build Coastguard Workerdefm SQDMULL : SIMDIndexedLongSD<0, 0b1011, "sqdmull", int_aarch64_neon_sqdmull>; 4661*9880d681SAndroid Build Coastguard Workerdefm UMLAL : SIMDVectorIndexedLongSDTied<1, 0b0010, "umlal", 4662*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (int_aarch64_neon_umull node:$MHS, node:$RHS))>>; 4663*9880d681SAndroid Build Coastguard Workerdefm UMLSL : SIMDVectorIndexedLongSDTied<1, 0b0110, "umlsl", 4664*9880d681SAndroid Build Coastguard Worker TriOpFrag<(sub node:$LHS, (int_aarch64_neon_umull node:$MHS, node:$RHS))>>; 4665*9880d681SAndroid Build Coastguard Workerdefm UMULL : SIMDVectorIndexedLongSD<1, 0b1010, "umull", 4666*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_umull>; 4667*9880d681SAndroid Build Coastguard Worker 4668*9880d681SAndroid Build Coastguard Worker// A scalar sqdmull with the second operand being a vector lane can be 4669*9880d681SAndroid Build Coastguard Worker// handled directly with the indexed instruction encoding. 4670*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_sqdmulls_scalar (i32 FPR32:$Rn), 4671*9880d681SAndroid Build Coastguard Worker (vector_extract (v4i32 V128:$Vm), 4672*9880d681SAndroid Build Coastguard Worker VectorIndexS:$idx)), 4673*9880d681SAndroid Build Coastguard Worker (SQDMULLv1i64_indexed FPR32:$Rn, V128:$Vm, VectorIndexS:$idx)>; 4674*9880d681SAndroid Build Coastguard Worker 4675*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4676*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar shift instructions 4677*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4678*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : SIMDFPScalarRShift<0, 0b11111, "fcvtzs">; 4679*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : SIMDFPScalarRShift<1, 0b11111, "fcvtzu">; 4680*9880d681SAndroid Build Coastguard Workerdefm SCVTF : SIMDFPScalarRShift<0, 0b11100, "scvtf">; 4681*9880d681SAndroid Build Coastguard Workerdefm UCVTF : SIMDFPScalarRShift<1, 0b11100, "ucvtf">; 4682*9880d681SAndroid Build Coastguard Worker// Codegen patterns for the above. We don't put these directly on the 4683*9880d681SAndroid Build Coastguard Worker// instructions because TableGen's type inference can't handle the truth. 4684*9880d681SAndroid Build Coastguard Worker// Having the same base pattern for fp <--> int totally freaks it out. 4685*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_vcvtfp2fxs FPR32:$Rn, vecshiftR32:$imm), 4686*9880d681SAndroid Build Coastguard Worker (FCVTZSs FPR32:$Rn, vecshiftR32:$imm)>; 4687*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_vcvtfp2fxu FPR32:$Rn, vecshiftR32:$imm), 4688*9880d681SAndroid Build Coastguard Worker (FCVTZUs FPR32:$Rn, vecshiftR32:$imm)>; 4689*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_vcvtfp2fxs (f64 FPR64:$Rn), vecshiftR64:$imm)), 4690*9880d681SAndroid Build Coastguard Worker (FCVTZSd FPR64:$Rn, vecshiftR64:$imm)>; 4691*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_vcvtfp2fxu (f64 FPR64:$Rn), vecshiftR64:$imm)), 4692*9880d681SAndroid Build Coastguard Worker (FCVTZUd FPR64:$Rn, vecshiftR64:$imm)>; 4693*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_vcvtfp2fxs (v1f64 FPR64:$Rn), 4694*9880d681SAndroid Build Coastguard Worker vecshiftR64:$imm)), 4695*9880d681SAndroid Build Coastguard Worker (FCVTZSd FPR64:$Rn, vecshiftR64:$imm)>; 4696*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_vcvtfp2fxu (v1f64 FPR64:$Rn), 4697*9880d681SAndroid Build Coastguard Worker vecshiftR64:$imm)), 4698*9880d681SAndroid Build Coastguard Worker (FCVTZUd FPR64:$Rn, vecshiftR64:$imm)>; 4699*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_vcvtfxs2fp FPR32:$Rn, vecshiftR32:$imm), 4700*9880d681SAndroid Build Coastguard Worker (SCVTFs FPR32:$Rn, vecshiftR32:$imm)>; 4701*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_vcvtfxu2fp FPR32:$Rn, vecshiftR32:$imm), 4702*9880d681SAndroid Build Coastguard Worker (UCVTFs FPR32:$Rn, vecshiftR32:$imm)>; 4703*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_vcvtfxs2fp (i64 FPR64:$Rn), vecshiftR64:$imm)), 4704*9880d681SAndroid Build Coastguard Worker (SCVTFd FPR64:$Rn, vecshiftR64:$imm)>; 4705*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_vcvtfxu2fp (i64 FPR64:$Rn), vecshiftR64:$imm)), 4706*9880d681SAndroid Build Coastguard Worker (UCVTFd FPR64:$Rn, vecshiftR64:$imm)>; 4707*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_vcvtfxs2fp (v1i64 FPR64:$Rn), 4708*9880d681SAndroid Build Coastguard Worker vecshiftR64:$imm)), 4709*9880d681SAndroid Build Coastguard Worker (SCVTFd FPR64:$Rn, vecshiftR64:$imm)>; 4710*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_vcvtfxu2fp (v1i64 FPR64:$Rn), 4711*9880d681SAndroid Build Coastguard Worker vecshiftR64:$imm)), 4712*9880d681SAndroid Build Coastguard Worker (UCVTFd FPR64:$Rn, vecshiftR64:$imm)>; 4713*9880d681SAndroid Build Coastguard Worker 4714*9880d681SAndroid Build Coastguard Workerdefm SHL : SIMDScalarLShiftD< 0, 0b01010, "shl", AArch64vshl>; 4715*9880d681SAndroid Build Coastguard Workerdefm SLI : SIMDScalarLShiftDTied<1, 0b01010, "sli">; 4716*9880d681SAndroid Build Coastguard Workerdefm SQRSHRN : SIMDScalarRShiftBHS< 0, 0b10011, "sqrshrn", 4717*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqrshrn>; 4718*9880d681SAndroid Build Coastguard Workerdefm SQRSHRUN : SIMDScalarRShiftBHS< 1, 0b10001, "sqrshrun", 4719*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqrshrun>; 4720*9880d681SAndroid Build Coastguard Workerdefm SQSHLU : SIMDScalarLShiftBHSD<1, 0b01100, "sqshlu", AArch64sqshlui>; 4721*9880d681SAndroid Build Coastguard Workerdefm SQSHL : SIMDScalarLShiftBHSD<0, 0b01110, "sqshl", AArch64sqshli>; 4722*9880d681SAndroid Build Coastguard Workerdefm SQSHRN : SIMDScalarRShiftBHS< 0, 0b10010, "sqshrn", 4723*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqshrn>; 4724*9880d681SAndroid Build Coastguard Workerdefm SQSHRUN : SIMDScalarRShiftBHS< 1, 0b10000, "sqshrun", 4725*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqshrun>; 4726*9880d681SAndroid Build Coastguard Workerdefm SRI : SIMDScalarRShiftDTied< 1, 0b01000, "sri">; 4727*9880d681SAndroid Build Coastguard Workerdefm SRSHR : SIMDScalarRShiftD< 0, 0b00100, "srshr", AArch64srshri>; 4728*9880d681SAndroid Build Coastguard Workerdefm SRSRA : SIMDScalarRShiftDTied< 0, 0b00110, "srsra", 4729*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, 4730*9880d681SAndroid Build Coastguard Worker (AArch64srshri node:$MHS, node:$RHS))>>; 4731*9880d681SAndroid Build Coastguard Workerdefm SSHR : SIMDScalarRShiftD< 0, 0b00000, "sshr", AArch64vashr>; 4732*9880d681SAndroid Build Coastguard Workerdefm SSRA : SIMDScalarRShiftDTied< 0, 0b00010, "ssra", 4733*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, 4734*9880d681SAndroid Build Coastguard Worker (AArch64vashr node:$MHS, node:$RHS))>>; 4735*9880d681SAndroid Build Coastguard Workerdefm UQRSHRN : SIMDScalarRShiftBHS< 1, 0b10011, "uqrshrn", 4736*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_uqrshrn>; 4737*9880d681SAndroid Build Coastguard Workerdefm UQSHL : SIMDScalarLShiftBHSD<1, 0b01110, "uqshl", AArch64uqshli>; 4738*9880d681SAndroid Build Coastguard Workerdefm UQSHRN : SIMDScalarRShiftBHS< 1, 0b10010, "uqshrn", 4739*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_uqshrn>; 4740*9880d681SAndroid Build Coastguard Workerdefm URSHR : SIMDScalarRShiftD< 1, 0b00100, "urshr", AArch64urshri>; 4741*9880d681SAndroid Build Coastguard Workerdefm URSRA : SIMDScalarRShiftDTied< 1, 0b00110, "ursra", 4742*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, 4743*9880d681SAndroid Build Coastguard Worker (AArch64urshri node:$MHS, node:$RHS))>>; 4744*9880d681SAndroid Build Coastguard Workerdefm USHR : SIMDScalarRShiftD< 1, 0b00000, "ushr", AArch64vlshr>; 4745*9880d681SAndroid Build Coastguard Workerdefm USRA : SIMDScalarRShiftDTied< 1, 0b00010, "usra", 4746*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, 4747*9880d681SAndroid Build Coastguard Worker (AArch64vlshr node:$MHS, node:$RHS))>>; 4748*9880d681SAndroid Build Coastguard Worker 4749*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4750*9880d681SAndroid Build Coastguard Worker// AdvSIMD vector shift instructions 4751*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 4752*9880d681SAndroid Build Coastguard Workerdefm FCVTZS:SIMDVectorRShiftSD<0, 0b11111, "fcvtzs", int_aarch64_neon_vcvtfp2fxs>; 4753*9880d681SAndroid Build Coastguard Workerdefm FCVTZU:SIMDVectorRShiftSD<1, 0b11111, "fcvtzu", int_aarch64_neon_vcvtfp2fxu>; 4754*9880d681SAndroid Build Coastguard Workerdefm SCVTF: SIMDVectorRShiftToFP<0, 0b11100, "scvtf", 4755*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_vcvtfxs2fp>; 4756*9880d681SAndroid Build Coastguard Workerdefm RSHRN : SIMDVectorRShiftNarrowBHS<0, 0b10001, "rshrn", 4757*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_rshrn>; 4758*9880d681SAndroid Build Coastguard Workerdefm SHL : SIMDVectorLShiftBHSD<0, 0b01010, "shl", AArch64vshl>; 4759*9880d681SAndroid Build Coastguard Workerdefm SHRN : SIMDVectorRShiftNarrowBHS<0, 0b10000, "shrn", 4760*9880d681SAndroid Build Coastguard Worker BinOpFrag<(trunc (AArch64vashr node:$LHS, node:$RHS))>>; 4761*9880d681SAndroid Build Coastguard Workerdefm SLI : SIMDVectorLShiftBHSDTied<1, 0b01010, "sli", int_aarch64_neon_vsli>; 4762*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_vsli (v1i64 FPR64:$Rd), (v1i64 FPR64:$Rn), 4763*9880d681SAndroid Build Coastguard Worker (i32 vecshiftL64:$imm))), 4764*9880d681SAndroid Build Coastguard Worker (SLId FPR64:$Rd, FPR64:$Rn, vecshiftL64:$imm)>; 4765*9880d681SAndroid Build Coastguard Workerdefm SQRSHRN : SIMDVectorRShiftNarrowBHS<0, 0b10011, "sqrshrn", 4766*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqrshrn>; 4767*9880d681SAndroid Build Coastguard Workerdefm SQRSHRUN: SIMDVectorRShiftNarrowBHS<1, 0b10001, "sqrshrun", 4768*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqrshrun>; 4769*9880d681SAndroid Build Coastguard Workerdefm SQSHLU : SIMDVectorLShiftBHSD<1, 0b01100, "sqshlu", AArch64sqshlui>; 4770*9880d681SAndroid Build Coastguard Workerdefm SQSHL : SIMDVectorLShiftBHSD<0, 0b01110, "sqshl", AArch64sqshli>; 4771*9880d681SAndroid Build Coastguard Workerdefm SQSHRN : SIMDVectorRShiftNarrowBHS<0, 0b10010, "sqshrn", 4772*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqshrn>; 4773*9880d681SAndroid Build Coastguard Workerdefm SQSHRUN : SIMDVectorRShiftNarrowBHS<1, 0b10000, "sqshrun", 4774*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_sqshrun>; 4775*9880d681SAndroid Build Coastguard Workerdefm SRI : SIMDVectorRShiftBHSDTied<1, 0b01000, "sri", int_aarch64_neon_vsri>; 4776*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_vsri (v1i64 FPR64:$Rd), (v1i64 FPR64:$Rn), 4777*9880d681SAndroid Build Coastguard Worker (i32 vecshiftR64:$imm))), 4778*9880d681SAndroid Build Coastguard Worker (SRId FPR64:$Rd, FPR64:$Rn, vecshiftR64:$imm)>; 4779*9880d681SAndroid Build Coastguard Workerdefm SRSHR : SIMDVectorRShiftBHSD<0, 0b00100, "srshr", AArch64srshri>; 4780*9880d681SAndroid Build Coastguard Workerdefm SRSRA : SIMDVectorRShiftBHSDTied<0, 0b00110, "srsra", 4781*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, 4782*9880d681SAndroid Build Coastguard Worker (AArch64srshri node:$MHS, node:$RHS))> >; 4783*9880d681SAndroid Build Coastguard Workerdefm SSHLL : SIMDVectorLShiftLongBHSD<0, 0b10100, "sshll", 4784*9880d681SAndroid Build Coastguard Worker BinOpFrag<(AArch64vshl (sext node:$LHS), node:$RHS)>>; 4785*9880d681SAndroid Build Coastguard Worker 4786*9880d681SAndroid Build Coastguard Workerdefm SSHR : SIMDVectorRShiftBHSD<0, 0b00000, "sshr", AArch64vashr>; 4787*9880d681SAndroid Build Coastguard Workerdefm SSRA : SIMDVectorRShiftBHSDTied<0, 0b00010, "ssra", 4788*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (AArch64vashr node:$MHS, node:$RHS))>>; 4789*9880d681SAndroid Build Coastguard Workerdefm UCVTF : SIMDVectorRShiftToFP<1, 0b11100, "ucvtf", 4790*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_vcvtfxu2fp>; 4791*9880d681SAndroid Build Coastguard Workerdefm UQRSHRN : SIMDVectorRShiftNarrowBHS<1, 0b10011, "uqrshrn", 4792*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_uqrshrn>; 4793*9880d681SAndroid Build Coastguard Workerdefm UQSHL : SIMDVectorLShiftBHSD<1, 0b01110, "uqshl", AArch64uqshli>; 4794*9880d681SAndroid Build Coastguard Workerdefm UQSHRN : SIMDVectorRShiftNarrowBHS<1, 0b10010, "uqshrn", 4795*9880d681SAndroid Build Coastguard Worker int_aarch64_neon_uqshrn>; 4796*9880d681SAndroid Build Coastguard Workerdefm URSHR : SIMDVectorRShiftBHSD<1, 0b00100, "urshr", AArch64urshri>; 4797*9880d681SAndroid Build Coastguard Workerdefm URSRA : SIMDVectorRShiftBHSDTied<1, 0b00110, "ursra", 4798*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, 4799*9880d681SAndroid Build Coastguard Worker (AArch64urshri node:$MHS, node:$RHS))> >; 4800*9880d681SAndroid Build Coastguard Workerdefm USHLL : SIMDVectorLShiftLongBHSD<1, 0b10100, "ushll", 4801*9880d681SAndroid Build Coastguard Worker BinOpFrag<(AArch64vshl (zext node:$LHS), node:$RHS)>>; 4802*9880d681SAndroid Build Coastguard Workerdefm USHR : SIMDVectorRShiftBHSD<1, 0b00000, "ushr", AArch64vlshr>; 4803*9880d681SAndroid Build Coastguard Workerdefm USRA : SIMDVectorRShiftBHSDTied<1, 0b00010, "usra", 4804*9880d681SAndroid Build Coastguard Worker TriOpFrag<(add node:$LHS, (AArch64vlshr node:$MHS, node:$RHS))> >; 4805*9880d681SAndroid Build Coastguard Worker 4806*9880d681SAndroid Build Coastguard Worker// SHRN patterns for when a logical right shift was used instead of arithmetic 4807*9880d681SAndroid Build Coastguard Worker// (the immediate guarantees no sign bits actually end up in the result so it 4808*9880d681SAndroid Build Coastguard Worker// doesn't matter). 4809*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (trunc (AArch64vlshr (v8i16 V128:$Rn), vecshiftR16Narrow:$imm))), 4810*9880d681SAndroid Build Coastguard Worker (SHRNv8i8_shift V128:$Rn, vecshiftR16Narrow:$imm)>; 4811*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (trunc (AArch64vlshr (v4i32 V128:$Rn), vecshiftR32Narrow:$imm))), 4812*9880d681SAndroid Build Coastguard Worker (SHRNv4i16_shift V128:$Rn, vecshiftR32Narrow:$imm)>; 4813*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (trunc (AArch64vlshr (v2i64 V128:$Rn), vecshiftR64Narrow:$imm))), 4814*9880d681SAndroid Build Coastguard Worker (SHRNv2i32_shift V128:$Rn, vecshiftR64Narrow:$imm)>; 4815*9880d681SAndroid Build Coastguard Worker 4816*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (concat_vectors (v8i8 V64:$Rd), 4817*9880d681SAndroid Build Coastguard Worker (trunc (AArch64vlshr (v8i16 V128:$Rn), 4818*9880d681SAndroid Build Coastguard Worker vecshiftR16Narrow:$imm)))), 4819*9880d681SAndroid Build Coastguard Worker (SHRNv16i8_shift (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 4820*9880d681SAndroid Build Coastguard Worker V128:$Rn, vecshiftR16Narrow:$imm)>; 4821*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (concat_vectors (v4i16 V64:$Rd), 4822*9880d681SAndroid Build Coastguard Worker (trunc (AArch64vlshr (v4i32 V128:$Rn), 4823*9880d681SAndroid Build Coastguard Worker vecshiftR32Narrow:$imm)))), 4824*9880d681SAndroid Build Coastguard Worker (SHRNv8i16_shift (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 4825*9880d681SAndroid Build Coastguard Worker V128:$Rn, vecshiftR32Narrow:$imm)>; 4826*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (concat_vectors (v2i32 V64:$Rd), 4827*9880d681SAndroid Build Coastguard Worker (trunc (AArch64vlshr (v2i64 V128:$Rn), 4828*9880d681SAndroid Build Coastguard Worker vecshiftR64Narrow:$imm)))), 4829*9880d681SAndroid Build Coastguard Worker (SHRNv4i32_shift (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 4830*9880d681SAndroid Build Coastguard Worker V128:$Rn, vecshiftR32Narrow:$imm)>; 4831*9880d681SAndroid Build Coastguard Worker 4832*9880d681SAndroid Build Coastguard Worker// Vector sign and zero extensions are implemented with SSHLL and USSHLL. 4833*9880d681SAndroid Build Coastguard Worker// Anyexts are implemented as zexts. 4834*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (sext (v8i8 V64:$Rn))), (SSHLLv8i8_shift V64:$Rn, (i32 0))>; 4835*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (zext (v8i8 V64:$Rn))), (USHLLv8i8_shift V64:$Rn, (i32 0))>; 4836*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (anyext (v8i8 V64:$Rn))), (USHLLv8i8_shift V64:$Rn, (i32 0))>; 4837*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (sext (v4i16 V64:$Rn))), (SSHLLv4i16_shift V64:$Rn, (i32 0))>; 4838*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (zext (v4i16 V64:$Rn))), (USHLLv4i16_shift V64:$Rn, (i32 0))>; 4839*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (anyext (v4i16 V64:$Rn))), (USHLLv4i16_shift V64:$Rn, (i32 0))>; 4840*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (sext (v2i32 V64:$Rn))), (SSHLLv2i32_shift V64:$Rn, (i32 0))>; 4841*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (zext (v2i32 V64:$Rn))), (USHLLv2i32_shift V64:$Rn, (i32 0))>; 4842*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (anyext (v2i32 V64:$Rn))), (USHLLv2i32_shift V64:$Rn, (i32 0))>; 4843*9880d681SAndroid Build Coastguard Worker// Also match an extend from the upper half of a 128 bit source register. 4844*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (anyext (v8i8 (extract_subvector V128:$Rn, (i64 8)) ))), 4845*9880d681SAndroid Build Coastguard Worker (USHLLv16i8_shift V128:$Rn, (i32 0))>; 4846*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (zext (v8i8 (extract_subvector V128:$Rn, (i64 8)) ))), 4847*9880d681SAndroid Build Coastguard Worker (USHLLv16i8_shift V128:$Rn, (i32 0))>; 4848*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (sext (v8i8 (extract_subvector V128:$Rn, (i64 8)) ))), 4849*9880d681SAndroid Build Coastguard Worker (SSHLLv16i8_shift V128:$Rn, (i32 0))>; 4850*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (anyext (v4i16 (extract_subvector V128:$Rn, (i64 4)) ))), 4851*9880d681SAndroid Build Coastguard Worker (USHLLv8i16_shift V128:$Rn, (i32 0))>; 4852*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (zext (v4i16 (extract_subvector V128:$Rn, (i64 4)) ))), 4853*9880d681SAndroid Build Coastguard Worker (USHLLv8i16_shift V128:$Rn, (i32 0))>; 4854*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (sext (v4i16 (extract_subvector V128:$Rn, (i64 4)) ))), 4855*9880d681SAndroid Build Coastguard Worker (SSHLLv8i16_shift V128:$Rn, (i32 0))>; 4856*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (anyext (v2i32 (extract_subvector V128:$Rn, (i64 2)) ))), 4857*9880d681SAndroid Build Coastguard Worker (USHLLv4i32_shift V128:$Rn, (i32 0))>; 4858*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (zext (v2i32 (extract_subvector V128:$Rn, (i64 2)) ))), 4859*9880d681SAndroid Build Coastguard Worker (USHLLv4i32_shift V128:$Rn, (i32 0))>; 4860*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (sext (v2i32 (extract_subvector V128:$Rn, (i64 2)) ))), 4861*9880d681SAndroid Build Coastguard Worker (SSHLLv4i32_shift V128:$Rn, (i32 0))>; 4862*9880d681SAndroid Build Coastguard Worker 4863*9880d681SAndroid Build Coastguard Worker// Vector shift sxtl aliases 4864*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl.8h $dst, $src1", 4865*9880d681SAndroid Build Coastguard Worker (SSHLLv8i8_shift V128:$dst, V64:$src1, 0)>; 4866*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl $dst.8h, $src1.8b", 4867*9880d681SAndroid Build Coastguard Worker (SSHLLv8i8_shift V128:$dst, V64:$src1, 0)>; 4868*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl.4s $dst, $src1", 4869*9880d681SAndroid Build Coastguard Worker (SSHLLv4i16_shift V128:$dst, V64:$src1, 0)>; 4870*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl $dst.4s, $src1.4h", 4871*9880d681SAndroid Build Coastguard Worker (SSHLLv4i16_shift V128:$dst, V64:$src1, 0)>; 4872*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl.2d $dst, $src1", 4873*9880d681SAndroid Build Coastguard Worker (SSHLLv2i32_shift V128:$dst, V64:$src1, 0)>; 4874*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl $dst.2d, $src1.2s", 4875*9880d681SAndroid Build Coastguard Worker (SSHLLv2i32_shift V128:$dst, V64:$src1, 0)>; 4876*9880d681SAndroid Build Coastguard Worker 4877*9880d681SAndroid Build Coastguard Worker// Vector shift sxtl2 aliases 4878*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2.8h $dst, $src1", 4879*9880d681SAndroid Build Coastguard Worker (SSHLLv16i8_shift V128:$dst, V128:$src1, 0)>; 4880*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2 $dst.8h, $src1.16b", 4881*9880d681SAndroid Build Coastguard Worker (SSHLLv16i8_shift V128:$dst, V128:$src1, 0)>; 4882*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2.4s $dst, $src1", 4883*9880d681SAndroid Build Coastguard Worker (SSHLLv8i16_shift V128:$dst, V128:$src1, 0)>; 4884*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2 $dst.4s, $src1.8h", 4885*9880d681SAndroid Build Coastguard Worker (SSHLLv8i16_shift V128:$dst, V128:$src1, 0)>; 4886*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2.2d $dst, $src1", 4887*9880d681SAndroid Build Coastguard Worker (SSHLLv4i32_shift V128:$dst, V128:$src1, 0)>; 4888*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2 $dst.2d, $src1.4s", 4889*9880d681SAndroid Build Coastguard Worker (SSHLLv4i32_shift V128:$dst, V128:$src1, 0)>; 4890*9880d681SAndroid Build Coastguard Worker 4891*9880d681SAndroid Build Coastguard Worker// Vector shift uxtl aliases 4892*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl.8h $dst, $src1", 4893*9880d681SAndroid Build Coastguard Worker (USHLLv8i8_shift V128:$dst, V64:$src1, 0)>; 4894*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl $dst.8h, $src1.8b", 4895*9880d681SAndroid Build Coastguard Worker (USHLLv8i8_shift V128:$dst, V64:$src1, 0)>; 4896*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl.4s $dst, $src1", 4897*9880d681SAndroid Build Coastguard Worker (USHLLv4i16_shift V128:$dst, V64:$src1, 0)>; 4898*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl $dst.4s, $src1.4h", 4899*9880d681SAndroid Build Coastguard Worker (USHLLv4i16_shift V128:$dst, V64:$src1, 0)>; 4900*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl.2d $dst, $src1", 4901*9880d681SAndroid Build Coastguard Worker (USHLLv2i32_shift V128:$dst, V64:$src1, 0)>; 4902*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl $dst.2d, $src1.2s", 4903*9880d681SAndroid Build Coastguard Worker (USHLLv2i32_shift V128:$dst, V64:$src1, 0)>; 4904*9880d681SAndroid Build Coastguard Worker 4905*9880d681SAndroid Build Coastguard Worker// Vector shift uxtl2 aliases 4906*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2.8h $dst, $src1", 4907*9880d681SAndroid Build Coastguard Worker (USHLLv16i8_shift V128:$dst, V128:$src1, 0)>; 4908*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2 $dst.8h, $src1.16b", 4909*9880d681SAndroid Build Coastguard Worker (USHLLv16i8_shift V128:$dst, V128:$src1, 0)>; 4910*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2.4s $dst, $src1", 4911*9880d681SAndroid Build Coastguard Worker (USHLLv8i16_shift V128:$dst, V128:$src1, 0)>; 4912*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2 $dst.4s, $src1.8h", 4913*9880d681SAndroid Build Coastguard Worker (USHLLv8i16_shift V128:$dst, V128:$src1, 0)>; 4914*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2.2d $dst, $src1", 4915*9880d681SAndroid Build Coastguard Worker (USHLLv4i32_shift V128:$dst, V128:$src1, 0)>; 4916*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2 $dst.2d, $src1.4s", 4917*9880d681SAndroid Build Coastguard Worker (USHLLv4i32_shift V128:$dst, V128:$src1, 0)>; 4918*9880d681SAndroid Build Coastguard Worker 4919*9880d681SAndroid Build Coastguard Worker// If an integer is about to be converted to a floating point value, 4920*9880d681SAndroid Build Coastguard Worker// just load it on the floating point unit. 4921*9880d681SAndroid Build Coastguard Worker// These patterns are more complex because floating point loads do not 4922*9880d681SAndroid Build Coastguard Worker// support sign extension. 4923*9880d681SAndroid Build Coastguard Worker// The sign extension has to be explicitly added and is only supported for 4924*9880d681SAndroid Build Coastguard Worker// one step: byte-to-half, half-to-word, word-to-doubleword. 4925*9880d681SAndroid Build Coastguard Worker// SCVTF GPR -> FPR is 9 cycles. 4926*9880d681SAndroid Build Coastguard Worker// SCVTF FPR -> FPR is 4 cyclces. 4927*9880d681SAndroid Build Coastguard Worker// (sign extension with lengthen) SXTL FPR -> FPR is 2 cycles. 4928*9880d681SAndroid Build Coastguard Worker// Therefore, we can do 2 sign extensions and one SCVTF FPR -> FPR 4929*9880d681SAndroid Build Coastguard Worker// and still being faster. 4930*9880d681SAndroid Build Coastguard Worker// However, this is not good for code size. 4931*9880d681SAndroid Build Coastguard Worker// 8-bits -> float. 2 sizes step-up. 4932*9880d681SAndroid Build Coastguard Workerclass SExtLoadi8CVTf32Pat<dag addrmode, dag INST> 4933*9880d681SAndroid Build Coastguard Worker : Pat<(f32 (sint_to_fp (i32 (sextloadi8 addrmode)))), 4934*9880d681SAndroid Build Coastguard Worker (SCVTFv1i32 (f32 (EXTRACT_SUBREG 4935*9880d681SAndroid Build Coastguard Worker (SSHLLv4i16_shift 4936*9880d681SAndroid Build Coastguard Worker (f64 4937*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 4938*9880d681SAndroid Build Coastguard Worker (SSHLLv8i8_shift 4939*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 4940*9880d681SAndroid Build Coastguard Worker INST, 4941*9880d681SAndroid Build Coastguard Worker bsub), 4942*9880d681SAndroid Build Coastguard Worker 0), 4943*9880d681SAndroid Build Coastguard Worker dsub)), 4944*9880d681SAndroid Build Coastguard Worker 0), 4945*9880d681SAndroid Build Coastguard Worker ssub)))>, 4946*9880d681SAndroid Build Coastguard Worker Requires<[NotForCodeSize, UseAlternateSExtLoadCVTF32]>; 4947*9880d681SAndroid Build Coastguard Worker 4948*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi8CVTf32Pat<(ro8.Wpat GPR64sp:$Rn, GPR32:$Rm, ro8.Wext:$ext), 4949*9880d681SAndroid Build Coastguard Worker (LDRBroW GPR64sp:$Rn, GPR32:$Rm, ro8.Wext:$ext)>; 4950*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi8CVTf32Pat<(ro8.Xpat GPR64sp:$Rn, GPR64:$Rm, ro8.Xext:$ext), 4951*9880d681SAndroid Build Coastguard Worker (LDRBroX GPR64sp:$Rn, GPR64:$Rm, ro8.Xext:$ext)>; 4952*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi8CVTf32Pat<(am_indexed8 GPR64sp:$Rn, uimm12s1:$offset), 4953*9880d681SAndroid Build Coastguard Worker (LDRBui GPR64sp:$Rn, uimm12s1:$offset)>; 4954*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi8CVTf32Pat<(am_unscaled8 GPR64sp:$Rn, simm9:$offset), 4955*9880d681SAndroid Build Coastguard Worker (LDURBi GPR64sp:$Rn, simm9:$offset)>; 4956*9880d681SAndroid Build Coastguard Worker 4957*9880d681SAndroid Build Coastguard Worker// 16-bits -> float. 1 size step-up. 4958*9880d681SAndroid Build Coastguard Workerclass SExtLoadi16CVTf32Pat<dag addrmode, dag INST> 4959*9880d681SAndroid Build Coastguard Worker : Pat<(f32 (sint_to_fp (i32 (sextloadi16 addrmode)))), 4960*9880d681SAndroid Build Coastguard Worker (SCVTFv1i32 (f32 (EXTRACT_SUBREG 4961*9880d681SAndroid Build Coastguard Worker (SSHLLv4i16_shift 4962*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 4963*9880d681SAndroid Build Coastguard Worker INST, 4964*9880d681SAndroid Build Coastguard Worker hsub), 4965*9880d681SAndroid Build Coastguard Worker 0), 4966*9880d681SAndroid Build Coastguard Worker ssub)))>, Requires<[NotForCodeSize]>; 4967*9880d681SAndroid Build Coastguard Worker 4968*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf32Pat<(ro16.Wpat GPR64sp:$Rn, GPR32:$Rm, ro16.Wext:$ext), 4969*9880d681SAndroid Build Coastguard Worker (LDRHroW GPR64sp:$Rn, GPR32:$Rm, ro16.Wext:$ext)>; 4970*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf32Pat<(ro16.Xpat GPR64sp:$Rn, GPR64:$Rm, ro16.Xext:$ext), 4971*9880d681SAndroid Build Coastguard Worker (LDRHroX GPR64sp:$Rn, GPR64:$Rm, ro16.Xext:$ext)>; 4972*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf32Pat<(am_indexed16 GPR64sp:$Rn, uimm12s2:$offset), 4973*9880d681SAndroid Build Coastguard Worker (LDRHui GPR64sp:$Rn, uimm12s2:$offset)>; 4974*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf32Pat<(am_unscaled16 GPR64sp:$Rn, simm9:$offset), 4975*9880d681SAndroid Build Coastguard Worker (LDURHi GPR64sp:$Rn, simm9:$offset)>; 4976*9880d681SAndroid Build Coastguard Worker 4977*9880d681SAndroid Build Coastguard Worker// 32-bits to 32-bits are handled in target specific dag combine: 4978*9880d681SAndroid Build Coastguard Worker// performIntToFpCombine. 4979*9880d681SAndroid Build Coastguard Worker// 64-bits integer to 32-bits floating point, not possible with 4980*9880d681SAndroid Build Coastguard Worker// SCVTF on floating point registers (both source and destination 4981*9880d681SAndroid Build Coastguard Worker// must have the same size). 4982*9880d681SAndroid Build Coastguard Worker 4983*9880d681SAndroid Build Coastguard Worker// Here are the patterns for 8, 16, 32, and 64-bits to double. 4984*9880d681SAndroid Build Coastguard Worker// 8-bits -> double. 3 size step-up: give up. 4985*9880d681SAndroid Build Coastguard Worker// 16-bits -> double. 2 size step. 4986*9880d681SAndroid Build Coastguard Workerclass SExtLoadi16CVTf64Pat<dag addrmode, dag INST> 4987*9880d681SAndroid Build Coastguard Worker : Pat <(f64 (sint_to_fp (i32 (sextloadi16 addrmode)))), 4988*9880d681SAndroid Build Coastguard Worker (SCVTFv1i64 (f64 (EXTRACT_SUBREG 4989*9880d681SAndroid Build Coastguard Worker (SSHLLv2i32_shift 4990*9880d681SAndroid Build Coastguard Worker (f64 4991*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 4992*9880d681SAndroid Build Coastguard Worker (SSHLLv4i16_shift 4993*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 4994*9880d681SAndroid Build Coastguard Worker INST, 4995*9880d681SAndroid Build Coastguard Worker hsub), 4996*9880d681SAndroid Build Coastguard Worker 0), 4997*9880d681SAndroid Build Coastguard Worker dsub)), 4998*9880d681SAndroid Build Coastguard Worker 0), 4999*9880d681SAndroid Build Coastguard Worker dsub)))>, 5000*9880d681SAndroid Build Coastguard Worker Requires<[NotForCodeSize, UseAlternateSExtLoadCVTF32]>; 5001*9880d681SAndroid Build Coastguard Worker 5002*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf64Pat<(ro16.Wpat GPR64sp:$Rn, GPR32:$Rm, ro16.Wext:$ext), 5003*9880d681SAndroid Build Coastguard Worker (LDRHroW GPR64sp:$Rn, GPR32:$Rm, ro16.Wext:$ext)>; 5004*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf64Pat<(ro16.Xpat GPR64sp:$Rn, GPR64:$Rm, ro16.Xext:$ext), 5005*9880d681SAndroid Build Coastguard Worker (LDRHroX GPR64sp:$Rn, GPR64:$Rm, ro16.Xext:$ext)>; 5006*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf64Pat<(am_indexed16 GPR64sp:$Rn, uimm12s2:$offset), 5007*9880d681SAndroid Build Coastguard Worker (LDRHui GPR64sp:$Rn, uimm12s2:$offset)>; 5008*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf64Pat<(am_unscaled16 GPR64sp:$Rn, simm9:$offset), 5009*9880d681SAndroid Build Coastguard Worker (LDURHi GPR64sp:$Rn, simm9:$offset)>; 5010*9880d681SAndroid Build Coastguard Worker// 32-bits -> double. 1 size step-up. 5011*9880d681SAndroid Build Coastguard Workerclass SExtLoadi32CVTf64Pat<dag addrmode, dag INST> 5012*9880d681SAndroid Build Coastguard Worker : Pat <(f64 (sint_to_fp (i32 (load addrmode)))), 5013*9880d681SAndroid Build Coastguard Worker (SCVTFv1i64 (f64 (EXTRACT_SUBREG 5014*9880d681SAndroid Build Coastguard Worker (SSHLLv2i32_shift 5015*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (f64 (IMPLICIT_DEF)), 5016*9880d681SAndroid Build Coastguard Worker INST, 5017*9880d681SAndroid Build Coastguard Worker ssub), 5018*9880d681SAndroid Build Coastguard Worker 0), 5019*9880d681SAndroid Build Coastguard Worker dsub)))>, Requires<[NotForCodeSize]>; 5020*9880d681SAndroid Build Coastguard Worker 5021*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi32CVTf64Pat<(ro32.Wpat GPR64sp:$Rn, GPR32:$Rm, ro32.Wext:$ext), 5022*9880d681SAndroid Build Coastguard Worker (LDRSroW GPR64sp:$Rn, GPR32:$Rm, ro32.Wext:$ext)>; 5023*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi32CVTf64Pat<(ro32.Xpat GPR64sp:$Rn, GPR64:$Rm, ro32.Xext:$ext), 5024*9880d681SAndroid Build Coastguard Worker (LDRSroX GPR64sp:$Rn, GPR64:$Rm, ro32.Xext:$ext)>; 5025*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi32CVTf64Pat<(am_indexed32 GPR64sp:$Rn, uimm12s4:$offset), 5026*9880d681SAndroid Build Coastguard Worker (LDRSui GPR64sp:$Rn, uimm12s4:$offset)>; 5027*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi32CVTf64Pat<(am_unscaled32 GPR64sp:$Rn, simm9:$offset), 5028*9880d681SAndroid Build Coastguard Worker (LDURSi GPR64sp:$Rn, simm9:$offset)>; 5029*9880d681SAndroid Build Coastguard Worker 5030*9880d681SAndroid Build Coastguard Worker// 64-bits -> double are handled in target specific dag combine: 5031*9880d681SAndroid Build Coastguard Worker// performIntToFpCombine. 5032*9880d681SAndroid Build Coastguard Worker 5033*9880d681SAndroid Build Coastguard Worker 5034*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5035*9880d681SAndroid Build Coastguard Worker// AdvSIMD Load-Store Structure 5036*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5037*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLd1Multiple<"ld1">; 5038*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLd2Multiple<"ld2">; 5039*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLd3Multiple<"ld3">; 5040*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLd4Multiple<"ld4">; 5041*9880d681SAndroid Build Coastguard Worker 5042*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDSt1Multiple<"st1">; 5043*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDSt2Multiple<"st2">; 5044*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDSt3Multiple<"st3">; 5045*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDSt4Multiple<"st4">; 5046*9880d681SAndroid Build Coastguard Worker 5047*9880d681SAndroid Build Coastguard Workerclass Ld1Pat<ValueType ty, Instruction INST> 5048*9880d681SAndroid Build Coastguard Worker : Pat<(ty (load GPR64sp:$Rn)), (INST GPR64sp:$Rn)>; 5049*9880d681SAndroid Build Coastguard Worker 5050*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v16i8, LD1Onev16b>; 5051*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v8i16, LD1Onev8h>; 5052*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v4i32, LD1Onev4s>; 5053*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v2i64, LD1Onev2d>; 5054*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v8i8, LD1Onev8b>; 5055*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v4i16, LD1Onev4h>; 5056*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v2i32, LD1Onev2s>; 5057*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v1i64, LD1Onev1d>; 5058*9880d681SAndroid Build Coastguard Worker 5059*9880d681SAndroid Build Coastguard Workerclass St1Pat<ValueType ty, Instruction INST> 5060*9880d681SAndroid Build Coastguard Worker : Pat<(store ty:$Vt, GPR64sp:$Rn), 5061*9880d681SAndroid Build Coastguard Worker (INST ty:$Vt, GPR64sp:$Rn)>; 5062*9880d681SAndroid Build Coastguard Worker 5063*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v16i8, ST1Onev16b>; 5064*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v8i16, ST1Onev8h>; 5065*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v4i32, ST1Onev4s>; 5066*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v2i64, ST1Onev2d>; 5067*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v8i8, ST1Onev8b>; 5068*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v4i16, ST1Onev4h>; 5069*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v2i32, ST1Onev2s>; 5070*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v1i64, ST1Onev1d>; 5071*9880d681SAndroid Build Coastguard Worker 5072*9880d681SAndroid Build Coastguard Worker//--- 5073*9880d681SAndroid Build Coastguard Worker// Single-element 5074*9880d681SAndroid Build Coastguard Worker//--- 5075*9880d681SAndroid Build Coastguard Worker 5076*9880d681SAndroid Build Coastguard Workerdefm LD1R : SIMDLdR<0, 0b110, 0, "ld1r", "One", 1, 2, 4, 8>; 5077*9880d681SAndroid Build Coastguard Workerdefm LD2R : SIMDLdR<1, 0b110, 0, "ld2r", "Two", 2, 4, 8, 16>; 5078*9880d681SAndroid Build Coastguard Workerdefm LD3R : SIMDLdR<0, 0b111, 0, "ld3r", "Three", 3, 6, 12, 24>; 5079*9880d681SAndroid Build Coastguard Workerdefm LD4R : SIMDLdR<1, 0b111, 0, "ld4r", "Four", 4, 8, 16, 32>; 5080*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasSideEffects = 0 in { 5081*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSingleBTied<0, 0b000, "ld1", VecListOneb, GPR64pi1>; 5082*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSingleHTied<0, 0b010, 0, "ld1", VecListOneh, GPR64pi2>; 5083*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSingleSTied<0, 0b100, 0b00, "ld1", VecListOnes, GPR64pi4>; 5084*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSingleDTied<0, 0b100, 0b01, "ld1", VecListOned, GPR64pi8>; 5085*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSingleBTied<1, 0b000, "ld2", VecListTwob, GPR64pi2>; 5086*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSingleHTied<1, 0b010, 0, "ld2", VecListTwoh, GPR64pi4>; 5087*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSingleSTied<1, 0b100, 0b00, "ld2", VecListTwos, GPR64pi8>; 5088*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSingleDTied<1, 0b100, 0b01, "ld2", VecListTwod, GPR64pi16>; 5089*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSingleBTied<0, 0b001, "ld3", VecListThreeb, GPR64pi3>; 5090*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSingleHTied<0, 0b011, 0, "ld3", VecListThreeh, GPR64pi6>; 5091*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSingleSTied<0, 0b101, 0b00, "ld3", VecListThrees, GPR64pi12>; 5092*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSingleDTied<0, 0b101, 0b01, "ld3", VecListThreed, GPR64pi24>; 5093*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSingleBTied<1, 0b001, "ld4", VecListFourb, GPR64pi4>; 5094*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSingleHTied<1, 0b011, 0, "ld4", VecListFourh, GPR64pi8>; 5095*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSingleSTied<1, 0b101, 0b00, "ld4", VecListFours, GPR64pi16>; 5096*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSingleDTied<1, 0b101, 0b01, "ld4", VecListFourd, GPR64pi32>; 5097*9880d681SAndroid Build Coastguard Worker} 5098*9880d681SAndroid Build Coastguard Worker 5099*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64dup (i32 (extloadi8 GPR64sp:$Rn)))), 5100*9880d681SAndroid Build Coastguard Worker (LD1Rv8b GPR64sp:$Rn)>; 5101*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64dup (i32 (extloadi8 GPR64sp:$Rn)))), 5102*9880d681SAndroid Build Coastguard Worker (LD1Rv16b GPR64sp:$Rn)>; 5103*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64dup (i32 (extloadi16 GPR64sp:$Rn)))), 5104*9880d681SAndroid Build Coastguard Worker (LD1Rv4h GPR64sp:$Rn)>; 5105*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64dup (i32 (extloadi16 GPR64sp:$Rn)))), 5106*9880d681SAndroid Build Coastguard Worker (LD1Rv8h GPR64sp:$Rn)>; 5107*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64dup (i32 (load GPR64sp:$Rn)))), 5108*9880d681SAndroid Build Coastguard Worker (LD1Rv2s GPR64sp:$Rn)>; 5109*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64dup (i32 (load GPR64sp:$Rn)))), 5110*9880d681SAndroid Build Coastguard Worker (LD1Rv4s GPR64sp:$Rn)>; 5111*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64dup (i64 (load GPR64sp:$Rn)))), 5112*9880d681SAndroid Build Coastguard Worker (LD1Rv2d GPR64sp:$Rn)>; 5113*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64dup (i64 (load GPR64sp:$Rn)))), 5114*9880d681SAndroid Build Coastguard Worker (LD1Rv1d GPR64sp:$Rn)>; 5115*9880d681SAndroid Build Coastguard Worker// Grab the floating point version too 5116*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64dup (f32 (load GPR64sp:$Rn)))), 5117*9880d681SAndroid Build Coastguard Worker (LD1Rv2s GPR64sp:$Rn)>; 5118*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64dup (f32 (load GPR64sp:$Rn)))), 5119*9880d681SAndroid Build Coastguard Worker (LD1Rv4s GPR64sp:$Rn)>; 5120*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64dup (f64 (load GPR64sp:$Rn)))), 5121*9880d681SAndroid Build Coastguard Worker (LD1Rv2d GPR64sp:$Rn)>; 5122*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (AArch64dup (f64 (load GPR64sp:$Rn)))), 5123*9880d681SAndroid Build Coastguard Worker (LD1Rv1d GPR64sp:$Rn)>; 5124*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64dup (f16 (load GPR64sp:$Rn)))), 5125*9880d681SAndroid Build Coastguard Worker (LD1Rv4h GPR64sp:$Rn)>; 5126*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64dup (f16 (load GPR64sp:$Rn)))), 5127*9880d681SAndroid Build Coastguard Worker (LD1Rv8h GPR64sp:$Rn)>; 5128*9880d681SAndroid Build Coastguard Worker 5129*9880d681SAndroid Build Coastguard Workerclass Ld1Lane128Pat<SDPatternOperator scalar_load, Operand VecIndex, 5130*9880d681SAndroid Build Coastguard Worker ValueType VTy, ValueType STy, Instruction LD1> 5131*9880d681SAndroid Build Coastguard Worker : Pat<(vector_insert (VTy VecListOne128:$Rd), 5132*9880d681SAndroid Build Coastguard Worker (STy (scalar_load GPR64sp:$Rn)), VecIndex:$idx), 5133*9880d681SAndroid Build Coastguard Worker (LD1 VecListOne128:$Rd, VecIndex:$idx, GPR64sp:$Rn)>; 5134*9880d681SAndroid Build Coastguard Worker 5135*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<extloadi8, VectorIndexB, v16i8, i32, LD1i8>; 5136*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<extloadi16, VectorIndexH, v8i16, i32, LD1i16>; 5137*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load, VectorIndexS, v4i32, i32, LD1i32>; 5138*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load, VectorIndexS, v4f32, f32, LD1i32>; 5139*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load, VectorIndexD, v2i64, i64, LD1i64>; 5140*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load, VectorIndexD, v2f64, f64, LD1i64>; 5141*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load, VectorIndexH, v8f16, f16, LD1i16>; 5142*9880d681SAndroid Build Coastguard Worker 5143*9880d681SAndroid Build Coastguard Workerclass Ld1Lane64Pat<SDPatternOperator scalar_load, Operand VecIndex, 5144*9880d681SAndroid Build Coastguard Worker ValueType VTy, ValueType STy, Instruction LD1> 5145*9880d681SAndroid Build Coastguard Worker : Pat<(vector_insert (VTy VecListOne64:$Rd), 5146*9880d681SAndroid Build Coastguard Worker (STy (scalar_load GPR64sp:$Rn)), VecIndex:$idx), 5147*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG 5148*9880d681SAndroid Build Coastguard Worker (LD1 (SUBREG_TO_REG (i32 0), VecListOne64:$Rd, dsub), 5149*9880d681SAndroid Build Coastguard Worker VecIndex:$idx, GPR64sp:$Rn), 5150*9880d681SAndroid Build Coastguard Worker dsub)>; 5151*9880d681SAndroid Build Coastguard Worker 5152*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<extloadi8, VectorIndexB, v8i8, i32, LD1i8>; 5153*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<extloadi16, VectorIndexH, v4i16, i32, LD1i16>; 5154*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<load, VectorIndexS, v2i32, i32, LD1i32>; 5155*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<load, VectorIndexS, v2f32, f32, LD1i32>; 5156*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<load, VectorIndexH, v4f16, f16, LD1i16>; 5157*9880d681SAndroid Build Coastguard Worker 5158*9880d681SAndroid Build Coastguard Worker 5159*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSt1SingleAliases<"ld1">; 5160*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSt2SingleAliases<"ld2">; 5161*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSt3SingleAliases<"ld3">; 5162*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSt4SingleAliases<"ld4">; 5163*9880d681SAndroid Build Coastguard Worker 5164*9880d681SAndroid Build Coastguard Worker// Stores 5165*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDStSingleB<0, 0b000, "st1", VecListOneb, GPR64pi1>; 5166*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDStSingleH<0, 0b010, 0, "st1", VecListOneh, GPR64pi2>; 5167*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDStSingleS<0, 0b100, 0b00, "st1", VecListOnes, GPR64pi4>; 5168*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDStSingleD<0, 0b100, 0b01, "st1", VecListOned, GPR64pi8>; 5169*9880d681SAndroid Build Coastguard Worker 5170*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 19 in 5171*9880d681SAndroid Build Coastguard Workerclass St1Lane128Pat<SDPatternOperator scalar_store, Operand VecIndex, 5172*9880d681SAndroid Build Coastguard Worker ValueType VTy, ValueType STy, Instruction ST1> 5173*9880d681SAndroid Build Coastguard Worker : Pat<(scalar_store 5174*9880d681SAndroid Build Coastguard Worker (STy (vector_extract (VTy VecListOne128:$Vt), VecIndex:$idx)), 5175*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), 5176*9880d681SAndroid Build Coastguard Worker (ST1 VecListOne128:$Vt, VecIndex:$idx, GPR64sp:$Rn)>; 5177*9880d681SAndroid Build Coastguard Worker 5178*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<truncstorei8, VectorIndexB, v16i8, i32, ST1i8>; 5179*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<truncstorei16, VectorIndexH, v8i16, i32, ST1i16>; 5180*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store, VectorIndexS, v4i32, i32, ST1i32>; 5181*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store, VectorIndexS, v4f32, f32, ST1i32>; 5182*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store, VectorIndexD, v2i64, i64, ST1i64>; 5183*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store, VectorIndexD, v2f64, f64, ST1i64>; 5184*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store, VectorIndexH, v8f16, f16, ST1i16>; 5185*9880d681SAndroid Build Coastguard Worker 5186*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 19 in 5187*9880d681SAndroid Build Coastguard Workerclass St1Lane64Pat<SDPatternOperator scalar_store, Operand VecIndex, 5188*9880d681SAndroid Build Coastguard Worker ValueType VTy, ValueType STy, Instruction ST1> 5189*9880d681SAndroid Build Coastguard Worker : Pat<(scalar_store 5190*9880d681SAndroid Build Coastguard Worker (STy (vector_extract (VTy VecListOne64:$Vt), VecIndex:$idx)), 5191*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn), 5192*9880d681SAndroid Build Coastguard Worker (ST1 (SUBREG_TO_REG (i32 0), VecListOne64:$Vt, dsub), 5193*9880d681SAndroid Build Coastguard Worker VecIndex:$idx, GPR64sp:$Rn)>; 5194*9880d681SAndroid Build Coastguard Worker 5195*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<truncstorei8, VectorIndexB, v8i8, i32, ST1i8>; 5196*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<truncstorei16, VectorIndexH, v4i16, i32, ST1i16>; 5197*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<store, VectorIndexS, v2i32, i32, ST1i32>; 5198*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<store, VectorIndexS, v2f32, f32, ST1i32>; 5199*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<store, VectorIndexH, v4f16, f16, ST1i16>; 5200*9880d681SAndroid Build Coastguard Worker 5201*9880d681SAndroid Build Coastguard Workermulticlass St1LanePost64Pat<SDPatternOperator scalar_store, Operand VecIndex, 5202*9880d681SAndroid Build Coastguard Worker ValueType VTy, ValueType STy, Instruction ST1, 5203*9880d681SAndroid Build Coastguard Worker int offset> { 5204*9880d681SAndroid Build Coastguard Worker def : Pat<(scalar_store 5205*9880d681SAndroid Build Coastguard Worker (STy (vector_extract (VTy VecListOne64:$Vt), VecIndex:$idx)), 5206*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, offset), 5207*9880d681SAndroid Build Coastguard Worker (ST1 (SUBREG_TO_REG (i32 0), VecListOne64:$Vt, dsub), 5208*9880d681SAndroid Build Coastguard Worker VecIndex:$idx, GPR64sp:$Rn, XZR)>; 5209*9880d681SAndroid Build Coastguard Worker 5210*9880d681SAndroid Build Coastguard Worker def : Pat<(scalar_store 5211*9880d681SAndroid Build Coastguard Worker (STy (vector_extract (VTy VecListOne64:$Vt), VecIndex:$idx)), 5212*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64:$Rm), 5213*9880d681SAndroid Build Coastguard Worker (ST1 (SUBREG_TO_REG (i32 0), VecListOne64:$Vt, dsub), 5214*9880d681SAndroid Build Coastguard Worker VecIndex:$idx, GPR64sp:$Rn, $Rm)>; 5215*9880d681SAndroid Build Coastguard Worker} 5216*9880d681SAndroid Build Coastguard Worker 5217*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_truncsti8, VectorIndexB, v8i8, i32, ST1i8_POST, 1>; 5218*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_truncsti16, VectorIndexH, v4i16, i32, ST1i16_POST, 5219*9880d681SAndroid Build Coastguard Worker 2>; 5220*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexS, v2i32, i32, ST1i32_POST, 4>; 5221*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexS, v2f32, f32, ST1i32_POST, 4>; 5222*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexD, v1i64, i64, ST1i64_POST, 8>; 5223*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexD, v1f64, f64, ST1i64_POST, 8>; 5224*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexH, v4f16, f16, ST1i16_POST, 2>; 5225*9880d681SAndroid Build Coastguard Worker 5226*9880d681SAndroid Build Coastguard Workermulticlass St1LanePost128Pat<SDPatternOperator scalar_store, Operand VecIndex, 5227*9880d681SAndroid Build Coastguard Worker ValueType VTy, ValueType STy, Instruction ST1, 5228*9880d681SAndroid Build Coastguard Worker int offset> { 5229*9880d681SAndroid Build Coastguard Worker def : Pat<(scalar_store 5230*9880d681SAndroid Build Coastguard Worker (STy (vector_extract (VTy VecListOne128:$Vt), VecIndex:$idx)), 5231*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, offset), 5232*9880d681SAndroid Build Coastguard Worker (ST1 VecListOne128:$Vt, VecIndex:$idx, GPR64sp:$Rn, XZR)>; 5233*9880d681SAndroid Build Coastguard Worker 5234*9880d681SAndroid Build Coastguard Worker def : Pat<(scalar_store 5235*9880d681SAndroid Build Coastguard Worker (STy (vector_extract (VTy VecListOne128:$Vt), VecIndex:$idx)), 5236*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, GPR64:$Rm), 5237*9880d681SAndroid Build Coastguard Worker (ST1 VecListOne128:$Vt, VecIndex:$idx, GPR64sp:$Rn, $Rm)>; 5238*9880d681SAndroid Build Coastguard Worker} 5239*9880d681SAndroid Build Coastguard Worker 5240*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_truncsti8, VectorIndexB, v16i8, i32, ST1i8_POST, 5241*9880d681SAndroid Build Coastguard Worker 1>; 5242*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_truncsti16, VectorIndexH, v8i16, i32, ST1i16_POST, 5243*9880d681SAndroid Build Coastguard Worker 2>; 5244*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexS, v4i32, i32, ST1i32_POST, 4>; 5245*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexS, v4f32, f32, ST1i32_POST, 4>; 5246*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexD, v2i64, i64, ST1i64_POST, 8>; 5247*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexD, v2f64, f64, ST1i64_POST, 8>; 5248*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexH, v8f16, f16, ST1i16_POST, 2>; 5249*9880d681SAndroid Build Coastguard Worker 5250*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, hasSideEffects = 0 in { 5251*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDStSingleB<1, 0b000, "st2", VecListTwob, GPR64pi2>; 5252*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDStSingleH<1, 0b010, 0, "st2", VecListTwoh, GPR64pi4>; 5253*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDStSingleS<1, 0b100, 0b00, "st2", VecListTwos, GPR64pi8>; 5254*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDStSingleD<1, 0b100, 0b01, "st2", VecListTwod, GPR64pi16>; 5255*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDStSingleB<0, 0b001, "st3", VecListThreeb, GPR64pi3>; 5256*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDStSingleH<0, 0b011, 0, "st3", VecListThreeh, GPR64pi6>; 5257*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDStSingleS<0, 0b101, 0b00, "st3", VecListThrees, GPR64pi12>; 5258*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDStSingleD<0, 0b101, 0b01, "st3", VecListThreed, GPR64pi24>; 5259*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDStSingleB<1, 0b001, "st4", VecListFourb, GPR64pi4>; 5260*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDStSingleH<1, 0b011, 0, "st4", VecListFourh, GPR64pi8>; 5261*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDStSingleS<1, 0b101, 0b00, "st4", VecListFours, GPR64pi16>; 5262*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDStSingleD<1, 0b101, 0b01, "st4", VecListFourd, GPR64pi32>; 5263*9880d681SAndroid Build Coastguard Worker} 5264*9880d681SAndroid Build Coastguard Worker 5265*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDLdSt1SingleAliases<"st1">; 5266*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDLdSt2SingleAliases<"st2">; 5267*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDLdSt3SingleAliases<"st3">; 5268*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDLdSt4SingleAliases<"st4">; 5269*9880d681SAndroid Build Coastguard Worker 5270*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5271*9880d681SAndroid Build Coastguard Worker// Crypto extensions 5272*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5273*9880d681SAndroid Build Coastguard Worker 5274*9880d681SAndroid Build Coastguard Workerdef AESErr : AESTiedInst<0b0100, "aese", int_aarch64_crypto_aese>; 5275*9880d681SAndroid Build Coastguard Workerdef AESDrr : AESTiedInst<0b0101, "aesd", int_aarch64_crypto_aesd>; 5276*9880d681SAndroid Build Coastguard Workerdef AESMCrr : AESInst< 0b0110, "aesmc", int_aarch64_crypto_aesmc>; 5277*9880d681SAndroid Build Coastguard Workerdef AESIMCrr : AESInst< 0b0111, "aesimc", int_aarch64_crypto_aesimc>; 5278*9880d681SAndroid Build Coastguard Worker 5279*9880d681SAndroid Build Coastguard Workerdef SHA1Crrr : SHATiedInstQSV<0b000, "sha1c", int_aarch64_crypto_sha1c>; 5280*9880d681SAndroid Build Coastguard Workerdef SHA1Prrr : SHATiedInstQSV<0b001, "sha1p", int_aarch64_crypto_sha1p>; 5281*9880d681SAndroid Build Coastguard Workerdef SHA1Mrrr : SHATiedInstQSV<0b010, "sha1m", int_aarch64_crypto_sha1m>; 5282*9880d681SAndroid Build Coastguard Workerdef SHA1SU0rrr : SHATiedInstVVV<0b011, "sha1su0", int_aarch64_crypto_sha1su0>; 5283*9880d681SAndroid Build Coastguard Workerdef SHA256Hrrr : SHATiedInstQQV<0b100, "sha256h", int_aarch64_crypto_sha256h>; 5284*9880d681SAndroid Build Coastguard Workerdef SHA256H2rrr : SHATiedInstQQV<0b101, "sha256h2",int_aarch64_crypto_sha256h2>; 5285*9880d681SAndroid Build Coastguard Workerdef SHA256SU1rrr :SHATiedInstVVV<0b110, "sha256su1",int_aarch64_crypto_sha256su1>; 5286*9880d681SAndroid Build Coastguard Worker 5287*9880d681SAndroid Build Coastguard Workerdef SHA1Hrr : SHAInstSS< 0b0000, "sha1h", int_aarch64_crypto_sha1h>; 5288*9880d681SAndroid Build Coastguard Workerdef SHA1SU1rr : SHATiedInstVV<0b0001, "sha1su1", int_aarch64_crypto_sha1su1>; 5289*9880d681SAndroid Build Coastguard Workerdef SHA256SU0rr : SHATiedInstVV<0b0010, "sha256su0",int_aarch64_crypto_sha256su0>; 5290*9880d681SAndroid Build Coastguard Worker 5291*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5292*9880d681SAndroid Build Coastguard Worker// Compiler-pseudos 5293*9880d681SAndroid Build Coastguard Worker//---------------------------------------------------------------------------- 5294*9880d681SAndroid Build Coastguard Worker// FIXME: Like for X86, these should go in their own separate .td file. 5295*9880d681SAndroid Build Coastguard Worker 5296*9880d681SAndroid Build Coastguard Worker// Any instruction that defines a 32-bit result leaves the high half of the 5297*9880d681SAndroid Build Coastguard Worker// register. Truncate can be lowered to EXTRACT_SUBREG. CopyFromReg may 5298*9880d681SAndroid Build Coastguard Worker// be copying from a truncate. But any other 32-bit operation will zero-extend 5299*9880d681SAndroid Build Coastguard Worker// up to 64 bits. 5300*9880d681SAndroid Build Coastguard Worker// FIXME: X86 also checks for CMOV here. Do we need something similar? 5301*9880d681SAndroid Build Coastguard Workerdef def32 : PatLeaf<(i32 GPR32:$src), [{ 5302*9880d681SAndroid Build Coastguard Worker return N->getOpcode() != ISD::TRUNCATE && 5303*9880d681SAndroid Build Coastguard Worker N->getOpcode() != TargetOpcode::EXTRACT_SUBREG && 5304*9880d681SAndroid Build Coastguard Worker N->getOpcode() != ISD::CopyFromReg; 5305*9880d681SAndroid Build Coastguard Worker}]>; 5306*9880d681SAndroid Build Coastguard Worker 5307*9880d681SAndroid Build Coastguard Worker// In the case of a 32-bit def that is known to implicitly zero-extend, 5308*9880d681SAndroid Build Coastguard Worker// we can use a SUBREG_TO_REG. 5309*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zext def32:$src)), (SUBREG_TO_REG (i64 0), GPR32:$src, sub_32)>; 5310*9880d681SAndroid Build Coastguard Worker 5311*9880d681SAndroid Build Coastguard Worker// For an anyext, we don't care what the high bits are, so we can perform an 5312*9880d681SAndroid Build Coastguard Worker// INSERT_SUBREF into an IMPLICIT_DEF. 5313*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (anyext GPR32:$src)), 5314*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$src, sub_32)>; 5315*9880d681SAndroid Build Coastguard Worker 5316*9880d681SAndroid Build Coastguard Worker// When we need to explicitly zero-extend, we use a 32-bit MOV instruction and 5317*9880d681SAndroid Build Coastguard Worker// then assert the extension has happened. 5318*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zext GPR32:$src)), 5319*9880d681SAndroid Build Coastguard Worker (SUBREG_TO_REG (i32 0), (ORRWrs WZR, GPR32:$src, 0), sub_32)>; 5320*9880d681SAndroid Build Coastguard Worker 5321*9880d681SAndroid Build Coastguard Worker// To sign extend, we use a signed bitfield move instruction (SBFM) on the 5322*9880d681SAndroid Build Coastguard Worker// containing super-reg. 5323*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext GPR32:$src)), 5324*9880d681SAndroid Build Coastguard Worker (SBFMXri (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$src, sub_32), 0, 31)>; 5325*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext_inreg GPR64:$src, i32)), (SBFMXri GPR64:$src, 0, 31)>; 5326*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext_inreg GPR64:$src, i16)), (SBFMXri GPR64:$src, 0, 15)>; 5327*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext_inreg GPR64:$src, i8)), (SBFMXri GPR64:$src, 0, 7)>; 5328*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext_inreg GPR64:$src, i1)), (SBFMXri GPR64:$src, 0, 0)>; 5329*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg GPR32:$src, i16)), (SBFMWri GPR32:$src, 0, 15)>; 5330*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg GPR32:$src, i8)), (SBFMWri GPR32:$src, 0, 7)>; 5331*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg GPR32:$src, i1)), (SBFMWri GPR32:$src, 0, 0)>; 5332*9880d681SAndroid Build Coastguard Worker 5333*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (sext_inreg GPR32:$Rn, i8), (i64 imm0_31:$imm)), 5334*9880d681SAndroid Build Coastguard Worker (SBFMWri GPR32:$Rn, (i64 (i32shift_a imm0_31:$imm)), 5335*9880d681SAndroid Build Coastguard Worker (i64 (i32shift_sext_i8 imm0_31:$imm)))>; 5336*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (sext_inreg GPR64:$Rn, i8), (i64 imm0_63:$imm)), 5337*9880d681SAndroid Build Coastguard Worker (SBFMXri GPR64:$Rn, (i64 (i64shift_a imm0_63:$imm)), 5338*9880d681SAndroid Build Coastguard Worker (i64 (i64shift_sext_i8 imm0_63:$imm)))>; 5339*9880d681SAndroid Build Coastguard Worker 5340*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (sext_inreg GPR32:$Rn, i16), (i64 imm0_31:$imm)), 5341*9880d681SAndroid Build Coastguard Worker (SBFMWri GPR32:$Rn, (i64 (i32shift_a imm0_31:$imm)), 5342*9880d681SAndroid Build Coastguard Worker (i64 (i32shift_sext_i16 imm0_31:$imm)))>; 5343*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (sext_inreg GPR64:$Rn, i16), (i64 imm0_63:$imm)), 5344*9880d681SAndroid Build Coastguard Worker (SBFMXri GPR64:$Rn, (i64 (i64shift_a imm0_63:$imm)), 5345*9880d681SAndroid Build Coastguard Worker (i64 (i64shift_sext_i16 imm0_63:$imm)))>; 5346*9880d681SAndroid Build Coastguard Worker 5347*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (i64 (sext GPR32:$Rn)), (i64 imm0_63:$imm)), 5348*9880d681SAndroid Build Coastguard Worker (SBFMXri (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$Rn, sub_32), 5349*9880d681SAndroid Build Coastguard Worker (i64 (i64shift_a imm0_63:$imm)), 5350*9880d681SAndroid Build Coastguard Worker (i64 (i64shift_sext_i32 imm0_63:$imm)))>; 5351*9880d681SAndroid Build Coastguard Worker 5352*9880d681SAndroid Build Coastguard Worker// sra patterns have an AddedComplexity of 10, so make sure we have a higher 5353*9880d681SAndroid Build Coastguard Worker// AddedComplexity for the following patterns since we want to match sext + sra 5354*9880d681SAndroid Build Coastguard Worker// patterns before we attempt to match a single sra node. 5355*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 in { 5356*9880d681SAndroid Build Coastguard Worker// We support all sext + sra combinations which preserve at least one bit of the 5357*9880d681SAndroid Build Coastguard Worker// original value which is to be sign extended. E.g. we support shifts up to 5358*9880d681SAndroid Build Coastguard Worker// bitwidth-1 bits. 5359*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (sext_inreg GPR32:$Rn, i8), (i64 imm0_7:$imm)), 5360*9880d681SAndroid Build Coastguard Worker (SBFMWri GPR32:$Rn, (i64 imm0_7:$imm), 7)>; 5361*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (sext_inreg GPR64:$Rn, i8), (i64 imm0_7:$imm)), 5362*9880d681SAndroid Build Coastguard Worker (SBFMXri GPR64:$Rn, (i64 imm0_7:$imm), 7)>; 5363*9880d681SAndroid Build Coastguard Worker 5364*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (sext_inreg GPR32:$Rn, i16), (i64 imm0_15:$imm)), 5365*9880d681SAndroid Build Coastguard Worker (SBFMWri GPR32:$Rn, (i64 imm0_15:$imm), 15)>; 5366*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (sext_inreg GPR64:$Rn, i16), (i64 imm0_15:$imm)), 5367*9880d681SAndroid Build Coastguard Worker (SBFMXri GPR64:$Rn, (i64 imm0_15:$imm), 15)>; 5368*9880d681SAndroid Build Coastguard Worker 5369*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (i64 (sext GPR32:$Rn)), (i64 imm0_31:$imm)), 5370*9880d681SAndroid Build Coastguard Worker (SBFMXri (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$Rn, sub_32), 5371*9880d681SAndroid Build Coastguard Worker (i64 imm0_31:$imm), 31)>; 5372*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 20 5373*9880d681SAndroid Build Coastguard Worker 5374*9880d681SAndroid Build Coastguard Worker// To truncate, we can simply extract from a subregister. 5375*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (trunc GPR64sp:$src)), 5376*9880d681SAndroid Build Coastguard Worker (i32 (EXTRACT_SUBREG GPR64sp:$src, sub_32))>; 5377*9880d681SAndroid Build Coastguard Worker 5378*9880d681SAndroid Build Coastguard Worker// __builtin_trap() uses the BRK instruction on AArch64. 5379*9880d681SAndroid Build Coastguard Workerdef : Pat<(trap), (BRK 1)>; 5380*9880d681SAndroid Build Coastguard Worker 5381*9880d681SAndroid Build Coastguard Worker// Conversions within AdvSIMD types in the same register size are free. 5382*9880d681SAndroid Build Coastguard Worker// But because we need a consistent lane ordering, in big endian many 5383*9880d681SAndroid Build Coastguard Worker// conversions require one or more REV instructions. 5384*9880d681SAndroid Build Coastguard Worker// 5385*9880d681SAndroid Build Coastguard Worker// Consider a simple memory load followed by a bitconvert then a store. 5386*9880d681SAndroid Build Coastguard Worker// v0 = load v2i32 5387*9880d681SAndroid Build Coastguard Worker// v1 = BITCAST v2i32 v0 to v4i16 5388*9880d681SAndroid Build Coastguard Worker// store v4i16 v2 5389*9880d681SAndroid Build Coastguard Worker// 5390*9880d681SAndroid Build Coastguard Worker// In big endian mode every memory access has an implicit byte swap. LDR and 5391*9880d681SAndroid Build Coastguard Worker// STR do a 64-bit byte swap, whereas LD1/ST1 do a byte swap per lane - that 5392*9880d681SAndroid Build Coastguard Worker// is, they treat the vector as a sequence of elements to be byte-swapped. 5393*9880d681SAndroid Build Coastguard Worker// The two pairs of instructions are fundamentally incompatible. We've decided 5394*9880d681SAndroid Build Coastguard Worker// to use LD1/ST1 only to simplify compiler implementation. 5395*9880d681SAndroid Build Coastguard Worker// 5396*9880d681SAndroid Build Coastguard Worker// LD1/ST1 perform the equivalent of a sequence of LDR/STR + REV. This makes 5397*9880d681SAndroid Build Coastguard Worker// the original code sequence: 5398*9880d681SAndroid Build Coastguard Worker// v0 = load v2i32 5399*9880d681SAndroid Build Coastguard Worker// v1 = REV v2i32 (implicit) 5400*9880d681SAndroid Build Coastguard Worker// v2 = BITCAST v2i32 v1 to v4i16 5401*9880d681SAndroid Build Coastguard Worker// v3 = REV v4i16 v2 (implicit) 5402*9880d681SAndroid Build Coastguard Worker// store v4i16 v3 5403*9880d681SAndroid Build Coastguard Worker// 5404*9880d681SAndroid Build Coastguard Worker// But this is now broken - the value stored is different to the value loaded 5405*9880d681SAndroid Build Coastguard Worker// due to lane reordering. To fix this, on every BITCAST we must perform two 5406*9880d681SAndroid Build Coastguard Worker// other REVs: 5407*9880d681SAndroid Build Coastguard Worker// v0 = load v2i32 5408*9880d681SAndroid Build Coastguard Worker// v1 = REV v2i32 (implicit) 5409*9880d681SAndroid Build Coastguard Worker// v2 = REV v2i32 5410*9880d681SAndroid Build Coastguard Worker// v3 = BITCAST v2i32 v2 to v4i16 5411*9880d681SAndroid Build Coastguard Worker// v4 = REV v4i16 5412*9880d681SAndroid Build Coastguard Worker// v5 = REV v4i16 v4 (implicit) 5413*9880d681SAndroid Build Coastguard Worker// store v4i16 v5 5414*9880d681SAndroid Build Coastguard Worker// 5415*9880d681SAndroid Build Coastguard Worker// This means an extra two instructions, but actually in most cases the two REV 5416*9880d681SAndroid Build Coastguard Worker// instructions can be combined into one. For example: 5417*9880d681SAndroid Build Coastguard Worker// (REV64_2s (REV64_4h X)) === (REV32_4h X) 5418*9880d681SAndroid Build Coastguard Worker// 5419*9880d681SAndroid Build Coastguard Worker// There is also no 128-bit REV instruction. This must be synthesized with an 5420*9880d681SAndroid Build Coastguard Worker// EXT instruction. 5421*9880d681SAndroid Build Coastguard Worker// 5422*9880d681SAndroid Build Coastguard Worker// Most bitconverts require some sort of conversion. The only exceptions are: 5423*9880d681SAndroid Build Coastguard Worker// a) Identity conversions - vNfX <-> vNiX 5424*9880d681SAndroid Build Coastguard Worker// b) Single-lane-to-scalar - v1fX <-> fX or v1iX <-> iX 5425*9880d681SAndroid Build Coastguard Worker// 5426*9880d681SAndroid Build Coastguard Worker 5427*9880d681SAndroid Build Coastguard Worker// Natural vector casts (64 bit) 5428*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (v2i32 FPR64:$src))), (v8i8 FPR64:$src)>; 5429*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (v2i32 FPR64:$src))), (v4i16 FPR64:$src)>; 5430*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64NvCast (v2i32 FPR64:$src))), (v4f16 FPR64:$src)>; 5431*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (v2i32 FPR64:$src))), (v2i32 FPR64:$src)>; 5432*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64NvCast (v2i32 FPR64:$src))), (v2f32 FPR64:$src)>; 5433*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (v2i32 FPR64:$src))), (v1i64 FPR64:$src)>; 5434*9880d681SAndroid Build Coastguard Worker 5435*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (v4i16 FPR64:$src))), (v8i8 FPR64:$src)>; 5436*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (v4i16 FPR64:$src))), (v4i16 FPR64:$src)>; 5437*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64NvCast (v4i16 FPR64:$src))), (v4f16 FPR64:$src)>; 5438*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (v4i16 FPR64:$src))), (v2i32 FPR64:$src)>; 5439*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (v4i16 FPR64:$src))), (v1i64 FPR64:$src)>; 5440*9880d681SAndroid Build Coastguard Worker 5441*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (v8i8 FPR64:$src))), (v8i8 FPR64:$src)>; 5442*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (v8i8 FPR64:$src))), (v4i16 FPR64:$src)>; 5443*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64NvCast (v8i8 FPR64:$src))), (v4f16 FPR64:$src)>; 5444*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (v8i8 FPR64:$src))), (v2i32 FPR64:$src)>; 5445*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (v8i8 FPR64:$src))), (v1i64 FPR64:$src)>; 5446*9880d681SAndroid Build Coastguard Worker 5447*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (f64 FPR64:$src))), (v8i8 FPR64:$src)>; 5448*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (f64 FPR64:$src))), (v4i16 FPR64:$src)>; 5449*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64NvCast (f64 FPR64:$src))), (v4f16 FPR64:$src)>; 5450*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (f64 FPR64:$src))), (v2i32 FPR64:$src)>; 5451*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64NvCast (f64 FPR64:$src))), (v2f32 FPR64:$src)>; 5452*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (f64 FPR64:$src))), (v1i64 FPR64:$src)>; 5453*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (AArch64NvCast (f64 FPR64:$src))), (v1f64 FPR64:$src)>; 5454*9880d681SAndroid Build Coastguard Worker 5455*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (v2f32 FPR64:$src))), (v8i8 FPR64:$src)>; 5456*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (v2f32 FPR64:$src))), (v4i16 FPR64:$src)>; 5457*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (v2f32 FPR64:$src))), (v2i32 FPR64:$src)>; 5458*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64NvCast (v2f32 FPR64:$src))), (v2f32 FPR64:$src)>; 5459*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (v2f32 FPR64:$src))), (v1i64 FPR64:$src)>; 5460*9880d681SAndroid Build Coastguard Worker 5461*9880d681SAndroid Build Coastguard Worker// Natural vector casts (128 bit) 5462*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v4i32 FPR128:$src))), (v16i8 FPR128:$src)>; 5463*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v4i32 FPR128:$src))), (v8i16 FPR128:$src)>; 5464*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v4i32 FPR128:$src))), (v8f16 FPR128:$src)>; 5465*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v4i32 FPR128:$src))), (v4i32 FPR128:$src)>; 5466*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v4i32 FPR128:$src))), (v4f32 FPR128:$src)>; 5467*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v4i32 FPR128:$src))), (v2i64 FPR128:$src)>; 5468*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v4i32 FPR128:$src))), (v2f64 FPR128:$src)>; 5469*9880d681SAndroid Build Coastguard Worker 5470*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v8i16 FPR128:$src))), (v16i8 FPR128:$src)>; 5471*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v8i16 FPR128:$src))), (v8i16 FPR128:$src)>; 5472*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v8i16 FPR128:$src))), (v8f16 FPR128:$src)>; 5473*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v8i16 FPR128:$src))), (v4i32 FPR128:$src)>; 5474*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v8i16 FPR128:$src))), (v2i64 FPR128:$src)>; 5475*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v8i16 FPR128:$src))), (v4f32 FPR128:$src)>; 5476*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v8i16 FPR128:$src))), (v2f64 FPR128:$src)>; 5477*9880d681SAndroid Build Coastguard Worker 5478*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v16i8 FPR128:$src))), (v16i8 FPR128:$src)>; 5479*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v16i8 FPR128:$src))), (v8i16 FPR128:$src)>; 5480*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v16i8 FPR128:$src))), (v8f16 FPR128:$src)>; 5481*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v16i8 FPR128:$src))), (v4i32 FPR128:$src)>; 5482*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v16i8 FPR128:$src))), (v2i64 FPR128:$src)>; 5483*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v16i8 FPR128:$src))), (v4f32 FPR128:$src)>; 5484*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v16i8 FPR128:$src))), (v2f64 FPR128:$src)>; 5485*9880d681SAndroid Build Coastguard Worker 5486*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v2i64 FPR128:$src))), (v16i8 FPR128:$src)>; 5487*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v2i64 FPR128:$src))), (v8i16 FPR128:$src)>; 5488*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v2i64 FPR128:$src))), (v8f16 FPR128:$src)>; 5489*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v2i64 FPR128:$src))), (v4i32 FPR128:$src)>; 5490*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v2i64 FPR128:$src))), (v2i64 FPR128:$src)>; 5491*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v2i64 FPR128:$src))), (v4f32 FPR128:$src)>; 5492*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v2i64 FPR128:$src))), (v2f64 FPR128:$src)>; 5493*9880d681SAndroid Build Coastguard Worker 5494*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v4f32 FPR128:$src))), (v16i8 FPR128:$src)>; 5495*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v4f32 FPR128:$src))), (v8i16 FPR128:$src)>; 5496*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v4f32 FPR128:$src))), (v4i32 FPR128:$src)>; 5497*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v4f32 FPR128:$src))), (v4f32 FPR128:$src)>; 5498*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v4f32 FPR128:$src))), (v2i64 FPR128:$src)>; 5499*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v4f32 FPR128:$src))), (v8f16 FPR128:$src)>; 5500*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v4f32 FPR128:$src))), (v2f64 FPR128:$src)>; 5501*9880d681SAndroid Build Coastguard Worker 5502*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v2f64 FPR128:$src))), (v16i8 FPR128:$src)>; 5503*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v2f64 FPR128:$src))), (v8i16 FPR128:$src)>; 5504*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v2f64 FPR128:$src))), (v4i32 FPR128:$src)>; 5505*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v2f64 FPR128:$src))), (v2i64 FPR128:$src)>; 5506*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v2f64 FPR128:$src))), (v2f64 FPR128:$src)>; 5507*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v2f64 FPR128:$src))), (v8f16 FPR128:$src)>; 5508*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v2f64 FPR128:$src))), (v4f32 FPR128:$src)>; 5509*9880d681SAndroid Build Coastguard Worker 5510*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5511*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5512*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5513*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5514*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5515*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5516*9880d681SAndroid Build Coastguard Worker 5517*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v8i8 V64:$Vn))), 5518*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS V64:$Vn, GPR64)>; 5519*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v4i16 V64:$Vn))), 5520*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS V64:$Vn, GPR64)>; 5521*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v2i32 V64:$Vn))), 5522*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS V64:$Vn, GPR64)>; 5523*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v4f16 V64:$Vn))), 5524*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS V64:$Vn, GPR64)>; 5525*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v2f32 V64:$Vn))), 5526*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS V64:$Vn, GPR64)>; 5527*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v1f64 V64:$Vn))), 5528*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS V64:$Vn, GPR64)>; 5529*9880d681SAndroid Build Coastguard Worker} 5530*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5531*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert GPR64:$Xn)), 5532*9880d681SAndroid Build Coastguard Worker (REV64v8i8 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>; 5533*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert GPR64:$Xn)), 5534*9880d681SAndroid Build Coastguard Worker (REV64v4i16 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>; 5535*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert GPR64:$Xn)), 5536*9880d681SAndroid Build Coastguard Worker (REV64v2i32 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>; 5537*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert GPR64:$Xn)), 5538*9880d681SAndroid Build Coastguard Worker (REV64v4i16 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>; 5539*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert GPR64:$Xn)), 5540*9880d681SAndroid Build Coastguard Worker (REV64v2i32 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>; 5541*9880d681SAndroid Build Coastguard Worker 5542*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v8i8 V64:$Vn))), 5543*9880d681SAndroid Build Coastguard Worker (REV64v8i8 (COPY_TO_REGCLASS V64:$Vn, GPR64))>; 5544*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v4i16 V64:$Vn))), 5545*9880d681SAndroid Build Coastguard Worker (REV64v4i16 (COPY_TO_REGCLASS V64:$Vn, GPR64))>; 5546*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v2i32 V64:$Vn))), 5547*9880d681SAndroid Build Coastguard Worker (REV64v2i32 (COPY_TO_REGCLASS V64:$Vn, GPR64))>; 5548*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v4f16 V64:$Vn))), 5549*9880d681SAndroid Build Coastguard Worker (REV64v4i16 (COPY_TO_REGCLASS V64:$Vn, GPR64))>; 5550*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v2f32 V64:$Vn))), 5551*9880d681SAndroid Build Coastguard Worker (REV64v2i32 (COPY_TO_REGCLASS V64:$Vn, GPR64))>; 5552*9880d681SAndroid Build Coastguard Worker} 5553*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5554*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5555*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v1i64 V64:$Vn))), 5556*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS V64:$Vn, GPR64)>; 5557*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (scalar_to_vector GPR64:$Xn)), 5558*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5559*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (scalar_to_vector GPR64:$Xn)), 5560*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5561*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (scalar_to_vector (f64 FPR64:$Xn))), (v1f64 FPR64:$Xn)>; 5562*9880d681SAndroid Build Coastguard Worker 5563*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (bitconvert (i32 GPR32:$Xn))), 5564*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS GPR32:$Xn, FPR32)>; 5565*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (bitconvert (f32 FPR32:$Xn))), 5566*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS FPR32:$Xn, GPR32)>; 5567*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (i64 GPR64:$Xn))), 5568*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>; 5569*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (f64 FPR64:$Xn))), 5570*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS FPR64:$Xn, GPR64)>; 5571*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v1f64 V64:$Vn))), 5572*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS V64:$Vn, GPR64)>; 5573*9880d681SAndroid Build Coastguard Worker 5574*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5575*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v2i32 FPR64:$src))), (v1i64 FPR64:$src)>; 5576*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v4i16 FPR64:$src))), (v1i64 FPR64:$src)>; 5577*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v8i8 FPR64:$src))), (v1i64 FPR64:$src)>; 5578*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v4f16 FPR64:$src))), (v1i64 FPR64:$src)>; 5579*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v2f32 FPR64:$src))), (v1i64 FPR64:$src)>; 5580*9880d681SAndroid Build Coastguard Worker} 5581*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5582*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v2i32 FPR64:$src))), 5583*9880d681SAndroid Build Coastguard Worker (v1i64 (REV64v2i32 FPR64:$src))>; 5584*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v4i16 FPR64:$src))), 5585*9880d681SAndroid Build Coastguard Worker (v1i64 (REV64v4i16 FPR64:$src))>; 5586*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v8i8 FPR64:$src))), 5587*9880d681SAndroid Build Coastguard Worker (v1i64 (REV64v8i8 FPR64:$src))>; 5588*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v4f16 FPR64:$src))), 5589*9880d681SAndroid Build Coastguard Worker (v1i64 (REV64v4i16 FPR64:$src))>; 5590*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v2f32 FPR64:$src))), 5591*9880d681SAndroid Build Coastguard Worker (v1i64 (REV64v2i32 FPR64:$src))>; 5592*9880d681SAndroid Build Coastguard Worker} 5593*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v1f64 FPR64:$src))), (v1i64 FPR64:$src)>; 5594*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (f64 FPR64:$src))), (v1i64 FPR64:$src)>; 5595*9880d681SAndroid Build Coastguard Worker 5596*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5597*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v1i64 FPR64:$src))), (v2i32 FPR64:$src)>; 5598*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v4i16 FPR64:$src))), (v2i32 FPR64:$src)>; 5599*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v8i8 FPR64:$src))), (v2i32 FPR64:$src)>; 5600*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (f64 FPR64:$src))), (v2i32 FPR64:$src)>; 5601*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v1f64 FPR64:$src))), (v2i32 FPR64:$src)>; 5602*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v4f16 FPR64:$src))), (v2i32 FPR64:$src)>; 5603*9880d681SAndroid Build Coastguard Worker} 5604*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5605*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v1i64 FPR64:$src))), 5606*9880d681SAndroid Build Coastguard Worker (v2i32 (REV64v2i32 FPR64:$src))>; 5607*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v4i16 FPR64:$src))), 5608*9880d681SAndroid Build Coastguard Worker (v2i32 (REV32v4i16 FPR64:$src))>; 5609*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v8i8 FPR64:$src))), 5610*9880d681SAndroid Build Coastguard Worker (v2i32 (REV32v8i8 FPR64:$src))>; 5611*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (f64 FPR64:$src))), 5612*9880d681SAndroid Build Coastguard Worker (v2i32 (REV64v2i32 FPR64:$src))>; 5613*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v1f64 FPR64:$src))), 5614*9880d681SAndroid Build Coastguard Worker (v2i32 (REV64v2i32 FPR64:$src))>; 5615*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v4f16 FPR64:$src))), 5616*9880d681SAndroid Build Coastguard Worker (v2i32 (REV64v4i16 FPR64:$src))>; 5617*9880d681SAndroid Build Coastguard Worker} 5618*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v2f32 FPR64:$src))), (v2i32 FPR64:$src)>; 5619*9880d681SAndroid Build Coastguard Worker 5620*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5621*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v1i64 FPR64:$src))), (v4i16 FPR64:$src)>; 5622*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v2i32 FPR64:$src))), (v4i16 FPR64:$src)>; 5623*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v8i8 FPR64:$src))), (v4i16 FPR64:$src)>; 5624*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (f64 FPR64:$src))), (v4i16 FPR64:$src)>; 5625*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v4f16 FPR64:$src))), (v4i16 FPR64:$src)>; 5626*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v2f32 FPR64:$src))), (v4i16 FPR64:$src)>; 5627*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v1f64 FPR64:$src))), (v4i16 FPR64:$src)>; 5628*9880d681SAndroid Build Coastguard Worker} 5629*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5630*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v1i64 FPR64:$src))), 5631*9880d681SAndroid Build Coastguard Worker (v4i16 (REV64v4i16 FPR64:$src))>; 5632*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v2i32 FPR64:$src))), 5633*9880d681SAndroid Build Coastguard Worker (v4i16 (REV32v4i16 FPR64:$src))>; 5634*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v8i8 FPR64:$src))), 5635*9880d681SAndroid Build Coastguard Worker (v4i16 (REV16v8i8 FPR64:$src))>; 5636*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (f64 FPR64:$src))), 5637*9880d681SAndroid Build Coastguard Worker (v4i16 (REV64v4i16 FPR64:$src))>; 5638*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v4f16 FPR64:$src))), 5639*9880d681SAndroid Build Coastguard Worker (v4i16 (REV32v4i16 FPR64:$src))>; 5640*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v2f32 FPR64:$src))), 5641*9880d681SAndroid Build Coastguard Worker (v4i16 (REV32v4i16 FPR64:$src))>; 5642*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v1f64 FPR64:$src))), 5643*9880d681SAndroid Build Coastguard Worker (v4i16 (REV64v4i16 FPR64:$src))>; 5644*9880d681SAndroid Build Coastguard Worker} 5645*9880d681SAndroid Build Coastguard Worker 5646*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5647*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v1i64 FPR64:$src))), (v4f16 FPR64:$src)>; 5648*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v2i32 FPR64:$src))), (v4f16 FPR64:$src)>; 5649*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v4i16 FPR64:$src))), (v4f16 FPR64:$src)>; 5650*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v8i8 FPR64:$src))), (v4f16 FPR64:$src)>; 5651*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (f64 FPR64:$src))), (v4f16 FPR64:$src)>; 5652*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v2f32 FPR64:$src))), (v4f16 FPR64:$src)>; 5653*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v1f64 FPR64:$src))), (v4f16 FPR64:$src)>; 5654*9880d681SAndroid Build Coastguard Worker} 5655*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5656*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v1i64 FPR64:$src))), 5657*9880d681SAndroid Build Coastguard Worker (v4f16 (REV64v4i16 FPR64:$src))>; 5658*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v2i32 FPR64:$src))), 5659*9880d681SAndroid Build Coastguard Worker (v4f16 (REV64v4i16 FPR64:$src))>; 5660*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v4i16 FPR64:$src))), 5661*9880d681SAndroid Build Coastguard Worker (v4f16 (REV64v4i16 FPR64:$src))>; 5662*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v8i8 FPR64:$src))), 5663*9880d681SAndroid Build Coastguard Worker (v4f16 (REV16v8i8 FPR64:$src))>; 5664*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (f64 FPR64:$src))), 5665*9880d681SAndroid Build Coastguard Worker (v4f16 (REV64v4i16 FPR64:$src))>; 5666*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v2f32 FPR64:$src))), 5667*9880d681SAndroid Build Coastguard Worker (v4f16 (REV64v4i16 FPR64:$src))>; 5668*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v1f64 FPR64:$src))), 5669*9880d681SAndroid Build Coastguard Worker (v4f16 (REV64v4i16 FPR64:$src))>; 5670*9880d681SAndroid Build Coastguard Worker} 5671*9880d681SAndroid Build Coastguard Worker 5672*9880d681SAndroid Build Coastguard Worker 5673*9880d681SAndroid Build Coastguard Worker 5674*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5675*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v1i64 FPR64:$src))), (v8i8 FPR64:$src)>; 5676*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v2i32 FPR64:$src))), (v8i8 FPR64:$src)>; 5677*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v4i16 FPR64:$src))), (v8i8 FPR64:$src)>; 5678*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (f64 FPR64:$src))), (v8i8 FPR64:$src)>; 5679*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v2f32 FPR64:$src))), (v8i8 FPR64:$src)>; 5680*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v1f64 FPR64:$src))), (v8i8 FPR64:$src)>; 5681*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v4f16 FPR64:$src))), (v8i8 FPR64:$src)>; 5682*9880d681SAndroid Build Coastguard Worker} 5683*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5684*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v1i64 FPR64:$src))), 5685*9880d681SAndroid Build Coastguard Worker (v8i8 (REV64v8i8 FPR64:$src))>; 5686*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v2i32 FPR64:$src))), 5687*9880d681SAndroid Build Coastguard Worker (v8i8 (REV32v8i8 FPR64:$src))>; 5688*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v4i16 FPR64:$src))), 5689*9880d681SAndroid Build Coastguard Worker (v8i8 (REV16v8i8 FPR64:$src))>; 5690*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (f64 FPR64:$src))), 5691*9880d681SAndroid Build Coastguard Worker (v8i8 (REV64v8i8 FPR64:$src))>; 5692*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v2f32 FPR64:$src))), 5693*9880d681SAndroid Build Coastguard Worker (v8i8 (REV32v8i8 FPR64:$src))>; 5694*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v1f64 FPR64:$src))), 5695*9880d681SAndroid Build Coastguard Worker (v8i8 (REV64v8i8 FPR64:$src))>; 5696*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (bitconvert (v4f16 FPR64:$src))), 5697*9880d681SAndroid Build Coastguard Worker (v8i8 (REV16v8i8 FPR64:$src))>; 5698*9880d681SAndroid Build Coastguard Worker} 5699*9880d681SAndroid Build Coastguard Worker 5700*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5701*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v2i32 FPR64:$src))), (f64 FPR64:$src)>; 5702*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v4i16 FPR64:$src))), (f64 FPR64:$src)>; 5703*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v2f32 FPR64:$src))), (f64 FPR64:$src)>; 5704*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v8i8 FPR64:$src))), (f64 FPR64:$src)>; 5705*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v4f16 FPR64:$src))), (f64 FPR64:$src)>; 5706*9880d681SAndroid Build Coastguard Worker} 5707*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5708*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v2i32 FPR64:$src))), 5709*9880d681SAndroid Build Coastguard Worker (f64 (REV64v2i32 FPR64:$src))>; 5710*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v4i16 FPR64:$src))), 5711*9880d681SAndroid Build Coastguard Worker (f64 (REV64v4i16 FPR64:$src))>; 5712*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v2f32 FPR64:$src))), 5713*9880d681SAndroid Build Coastguard Worker (f64 (REV64v2i32 FPR64:$src))>; 5714*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v8i8 FPR64:$src))), 5715*9880d681SAndroid Build Coastguard Worker (f64 (REV64v8i8 FPR64:$src))>; 5716*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v4f16 FPR64:$src))), 5717*9880d681SAndroid Build Coastguard Worker (f64 (REV64v4i16 FPR64:$src))>; 5718*9880d681SAndroid Build Coastguard Worker} 5719*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v1i64 FPR64:$src))), (f64 FPR64:$src)>; 5720*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (v1f64 FPR64:$src))), (f64 FPR64:$src)>; 5721*9880d681SAndroid Build Coastguard Worker 5722*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5723*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v2i32 FPR64:$src))), (v1f64 FPR64:$src)>; 5724*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v4i16 FPR64:$src))), (v1f64 FPR64:$src)>; 5725*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v8i8 FPR64:$src))), (v1f64 FPR64:$src)>; 5726*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v2f32 FPR64:$src))), (v1f64 FPR64:$src)>; 5727*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v4f16 FPR64:$src))), (v1f64 FPR64:$src)>; 5728*9880d681SAndroid Build Coastguard Worker} 5729*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5730*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v2i32 FPR64:$src))), 5731*9880d681SAndroid Build Coastguard Worker (v1f64 (REV64v2i32 FPR64:$src))>; 5732*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v4i16 FPR64:$src))), 5733*9880d681SAndroid Build Coastguard Worker (v1f64 (REV64v4i16 FPR64:$src))>; 5734*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v8i8 FPR64:$src))), 5735*9880d681SAndroid Build Coastguard Worker (v1f64 (REV64v8i8 FPR64:$src))>; 5736*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v2f32 FPR64:$src))), 5737*9880d681SAndroid Build Coastguard Worker (v1f64 (REV64v2i32 FPR64:$src))>; 5738*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v4f16 FPR64:$src))), 5739*9880d681SAndroid Build Coastguard Worker (v1f64 (REV64v4i16 FPR64:$src))>; 5740*9880d681SAndroid Build Coastguard Worker} 5741*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v1i64 FPR64:$src))), (v1f64 FPR64:$src)>; 5742*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (f64 FPR64:$src))), (v1f64 FPR64:$src)>; 5743*9880d681SAndroid Build Coastguard Worker 5744*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5745*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v1i64 FPR64:$src))), (v2f32 FPR64:$src)>; 5746*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v4i16 FPR64:$src))), (v2f32 FPR64:$src)>; 5747*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v8i8 FPR64:$src))), (v2f32 FPR64:$src)>; 5748*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v1f64 FPR64:$src))), (v2f32 FPR64:$src)>; 5749*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (f64 FPR64:$src))), (v2f32 FPR64:$src)>; 5750*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v4f16 FPR64:$src))), (v2f32 FPR64:$src)>; 5751*9880d681SAndroid Build Coastguard Worker} 5752*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5753*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v1i64 FPR64:$src))), 5754*9880d681SAndroid Build Coastguard Worker (v2f32 (REV64v2i32 FPR64:$src))>; 5755*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v4i16 FPR64:$src))), 5756*9880d681SAndroid Build Coastguard Worker (v2f32 (REV32v4i16 FPR64:$src))>; 5757*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v8i8 FPR64:$src))), 5758*9880d681SAndroid Build Coastguard Worker (v2f32 (REV32v8i8 FPR64:$src))>; 5759*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v1f64 FPR64:$src))), 5760*9880d681SAndroid Build Coastguard Worker (v2f32 (REV64v2i32 FPR64:$src))>; 5761*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (f64 FPR64:$src))), 5762*9880d681SAndroid Build Coastguard Worker (v2f32 (REV64v2i32 FPR64:$src))>; 5763*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v4f16 FPR64:$src))), 5764*9880d681SAndroid Build Coastguard Worker (v2f32 (REV64v4i16 FPR64:$src))>; 5765*9880d681SAndroid Build Coastguard Worker} 5766*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v2i32 FPR64:$src))), (v2f32 FPR64:$src)>; 5767*9880d681SAndroid Build Coastguard Worker 5768*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5769*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v2i64 FPR128:$src))), (f128 FPR128:$src)>; 5770*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v4i32 FPR128:$src))), (f128 FPR128:$src)>; 5771*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v8i16 FPR128:$src))), (f128 FPR128:$src)>; 5772*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v2f64 FPR128:$src))), (f128 FPR128:$src)>; 5773*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v4f32 FPR128:$src))), (f128 FPR128:$src)>; 5774*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v8f16 FPR128:$src))), (f128 FPR128:$src)>; 5775*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v16i8 FPR128:$src))), (f128 FPR128:$src)>; 5776*9880d681SAndroid Build Coastguard Worker} 5777*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5778*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v2i64 FPR128:$src))), 5779*9880d681SAndroid Build Coastguard Worker (f128 (EXTv16i8 FPR128:$src, FPR128:$src, (i32 8)))>; 5780*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v4i32 FPR128:$src))), 5781*9880d681SAndroid Build Coastguard Worker (f128 (EXTv16i8 (REV64v4i32 FPR128:$src), 5782*9880d681SAndroid Build Coastguard Worker (REV64v4i32 FPR128:$src), (i32 8)))>; 5783*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v8i16 FPR128:$src))), 5784*9880d681SAndroid Build Coastguard Worker (f128 (EXTv16i8 (REV64v8i16 FPR128:$src), 5785*9880d681SAndroid Build Coastguard Worker (REV64v8i16 FPR128:$src), (i32 8)))>; 5786*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v8f16 FPR128:$src))), 5787*9880d681SAndroid Build Coastguard Worker (f128 (EXTv16i8 (REV64v8i16 FPR128:$src), 5788*9880d681SAndroid Build Coastguard Worker (REV64v8i16 FPR128:$src), (i32 8)))>; 5789*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v2f64 FPR128:$src))), 5790*9880d681SAndroid Build Coastguard Worker (f128 (EXTv16i8 FPR128:$src, FPR128:$src, (i32 8)))>; 5791*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v4f32 FPR128:$src))), 5792*9880d681SAndroid Build Coastguard Worker (f128 (EXTv16i8 (REV64v4i32 FPR128:$src), 5793*9880d681SAndroid Build Coastguard Worker (REV64v4i32 FPR128:$src), (i32 8)))>; 5794*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v16i8 FPR128:$src))), 5795*9880d681SAndroid Build Coastguard Worker (f128 (EXTv16i8 (REV64v16i8 FPR128:$src), 5796*9880d681SAndroid Build Coastguard Worker (REV64v16i8 FPR128:$src), (i32 8)))>; 5797*9880d681SAndroid Build Coastguard Worker} 5798*9880d681SAndroid Build Coastguard Worker 5799*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5800*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (f128 FPR128:$src))), (v2f64 FPR128:$src)>; 5801*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v4i32 FPR128:$src))), (v2f64 FPR128:$src)>; 5802*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v8i16 FPR128:$src))), (v2f64 FPR128:$src)>; 5803*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v8f16 FPR128:$src))), (v2f64 FPR128:$src)>; 5804*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v16i8 FPR128:$src))), (v2f64 FPR128:$src)>; 5805*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v4f32 FPR128:$src))), (v2f64 FPR128:$src)>; 5806*9880d681SAndroid Build Coastguard Worker} 5807*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5808*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (f128 FPR128:$src))), 5809*9880d681SAndroid Build Coastguard Worker (v2f64 (EXTv16i8 FPR128:$src, 5810*9880d681SAndroid Build Coastguard Worker FPR128:$src, (i32 8)))>; 5811*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v4i32 FPR128:$src))), 5812*9880d681SAndroid Build Coastguard Worker (v2f64 (REV64v4i32 FPR128:$src))>; 5813*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v8i16 FPR128:$src))), 5814*9880d681SAndroid Build Coastguard Worker (v2f64 (REV64v8i16 FPR128:$src))>; 5815*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v8f16 FPR128:$src))), 5816*9880d681SAndroid Build Coastguard Worker (v2f64 (REV64v8i16 FPR128:$src))>; 5817*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v16i8 FPR128:$src))), 5818*9880d681SAndroid Build Coastguard Worker (v2f64 (REV64v16i8 FPR128:$src))>; 5819*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v4f32 FPR128:$src))), 5820*9880d681SAndroid Build Coastguard Worker (v2f64 (REV64v4i32 FPR128:$src))>; 5821*9880d681SAndroid Build Coastguard Worker} 5822*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v2i64 FPR128:$src))), (v2f64 FPR128:$src)>; 5823*9880d681SAndroid Build Coastguard Worker 5824*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5825*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (f128 FPR128:$src))), (v4f32 FPR128:$src)>; 5826*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8i16 FPR128:$src))), (v4f32 FPR128:$src)>; 5827*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8f16 FPR128:$src))), (v4f32 FPR128:$src)>; 5828*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v16i8 FPR128:$src))), (v4f32 FPR128:$src)>; 5829*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2i64 FPR128:$src))), (v4f32 FPR128:$src)>; 5830*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2f64 FPR128:$src))), (v4f32 FPR128:$src)>; 5831*9880d681SAndroid Build Coastguard Worker} 5832*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5833*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (f128 FPR128:$src))), 5834*9880d681SAndroid Build Coastguard Worker (v4f32 (EXTv16i8 (REV64v4i32 FPR128:$src), 5835*9880d681SAndroid Build Coastguard Worker (REV64v4i32 FPR128:$src), (i32 8)))>; 5836*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8i16 FPR128:$src))), 5837*9880d681SAndroid Build Coastguard Worker (v4f32 (REV32v8i16 FPR128:$src))>; 5838*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8f16 FPR128:$src))), 5839*9880d681SAndroid Build Coastguard Worker (v4f32 (REV32v8i16 FPR128:$src))>; 5840*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v16i8 FPR128:$src))), 5841*9880d681SAndroid Build Coastguard Worker (v4f32 (REV32v16i8 FPR128:$src))>; 5842*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2i64 FPR128:$src))), 5843*9880d681SAndroid Build Coastguard Worker (v4f32 (REV64v4i32 FPR128:$src))>; 5844*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2f64 FPR128:$src))), 5845*9880d681SAndroid Build Coastguard Worker (v4f32 (REV64v4i32 FPR128:$src))>; 5846*9880d681SAndroid Build Coastguard Worker} 5847*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v4i32 FPR128:$src))), (v4f32 FPR128:$src)>; 5848*9880d681SAndroid Build Coastguard Worker 5849*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5850*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (f128 FPR128:$src))), (v2i64 FPR128:$src)>; 5851*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4i32 FPR128:$src))), (v2i64 FPR128:$src)>; 5852*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8i16 FPR128:$src))), (v2i64 FPR128:$src)>; 5853*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v16i8 FPR128:$src))), (v2i64 FPR128:$src)>; 5854*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4f32 FPR128:$src))), (v2i64 FPR128:$src)>; 5855*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8f16 FPR128:$src))), (v2i64 FPR128:$src)>; 5856*9880d681SAndroid Build Coastguard Worker} 5857*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5858*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (f128 FPR128:$src))), 5859*9880d681SAndroid Build Coastguard Worker (v2i64 (EXTv16i8 FPR128:$src, 5860*9880d681SAndroid Build Coastguard Worker FPR128:$src, (i32 8)))>; 5861*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4i32 FPR128:$src))), 5862*9880d681SAndroid Build Coastguard Worker (v2i64 (REV64v4i32 FPR128:$src))>; 5863*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8i16 FPR128:$src))), 5864*9880d681SAndroid Build Coastguard Worker (v2i64 (REV64v8i16 FPR128:$src))>; 5865*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v16i8 FPR128:$src))), 5866*9880d681SAndroid Build Coastguard Worker (v2i64 (REV64v16i8 FPR128:$src))>; 5867*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4f32 FPR128:$src))), 5868*9880d681SAndroid Build Coastguard Worker (v2i64 (REV64v4i32 FPR128:$src))>; 5869*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8f16 FPR128:$src))), 5870*9880d681SAndroid Build Coastguard Worker (v2i64 (REV64v8i16 FPR128:$src))>; 5871*9880d681SAndroid Build Coastguard Worker} 5872*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v2f64 FPR128:$src))), (v2i64 FPR128:$src)>; 5873*9880d681SAndroid Build Coastguard Worker 5874*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5875*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (f128 FPR128:$src))), (v4i32 FPR128:$src)>; 5876*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2i64 FPR128:$src))), (v4i32 FPR128:$src)>; 5877*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8i16 FPR128:$src))), (v4i32 FPR128:$src)>; 5878*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v16i8 FPR128:$src))), (v4i32 FPR128:$src)>; 5879*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2f64 FPR128:$src))), (v4i32 FPR128:$src)>; 5880*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8f16 FPR128:$src))), (v4i32 FPR128:$src)>; 5881*9880d681SAndroid Build Coastguard Worker} 5882*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5883*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (f128 FPR128:$src))), 5884*9880d681SAndroid Build Coastguard Worker (v4i32 (EXTv16i8 (REV64v4i32 FPR128:$src), 5885*9880d681SAndroid Build Coastguard Worker (REV64v4i32 FPR128:$src), 5886*9880d681SAndroid Build Coastguard Worker (i32 8)))>; 5887*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2i64 FPR128:$src))), 5888*9880d681SAndroid Build Coastguard Worker (v4i32 (REV64v4i32 FPR128:$src))>; 5889*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8i16 FPR128:$src))), 5890*9880d681SAndroid Build Coastguard Worker (v4i32 (REV32v8i16 FPR128:$src))>; 5891*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v16i8 FPR128:$src))), 5892*9880d681SAndroid Build Coastguard Worker (v4i32 (REV32v16i8 FPR128:$src))>; 5893*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2f64 FPR128:$src))), 5894*9880d681SAndroid Build Coastguard Worker (v4i32 (REV64v4i32 FPR128:$src))>; 5895*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8f16 FPR128:$src))), 5896*9880d681SAndroid Build Coastguard Worker (v4i32 (REV32v8i16 FPR128:$src))>; 5897*9880d681SAndroid Build Coastguard Worker} 5898*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v4f32 FPR128:$src))), (v4i32 FPR128:$src)>; 5899*9880d681SAndroid Build Coastguard Worker 5900*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5901*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (f128 FPR128:$src))), (v8i16 FPR128:$src)>; 5902*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2i64 FPR128:$src))), (v8i16 FPR128:$src)>; 5903*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4i32 FPR128:$src))), (v8i16 FPR128:$src)>; 5904*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v16i8 FPR128:$src))), (v8i16 FPR128:$src)>; 5905*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2f64 FPR128:$src))), (v8i16 FPR128:$src)>; 5906*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4f32 FPR128:$src))), (v8i16 FPR128:$src)>; 5907*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v8f16 FPR128:$src))), (v8i16 FPR128:$src)>; 5908*9880d681SAndroid Build Coastguard Worker} 5909*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5910*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (f128 FPR128:$src))), 5911*9880d681SAndroid Build Coastguard Worker (v8i16 (EXTv16i8 (REV64v8i16 FPR128:$src), 5912*9880d681SAndroid Build Coastguard Worker (REV64v8i16 FPR128:$src), 5913*9880d681SAndroid Build Coastguard Worker (i32 8)))>; 5914*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2i64 FPR128:$src))), 5915*9880d681SAndroid Build Coastguard Worker (v8i16 (REV64v8i16 FPR128:$src))>; 5916*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4i32 FPR128:$src))), 5917*9880d681SAndroid Build Coastguard Worker (v8i16 (REV32v8i16 FPR128:$src))>; 5918*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v16i8 FPR128:$src))), 5919*9880d681SAndroid Build Coastguard Worker (v8i16 (REV16v16i8 FPR128:$src))>; 5920*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2f64 FPR128:$src))), 5921*9880d681SAndroid Build Coastguard Worker (v8i16 (REV64v8i16 FPR128:$src))>; 5922*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4f32 FPR128:$src))), 5923*9880d681SAndroid Build Coastguard Worker (v8i16 (REV32v8i16 FPR128:$src))>; 5924*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v8f16 FPR128:$src))), 5925*9880d681SAndroid Build Coastguard Worker (v8i16 (REV32v8i16 FPR128:$src))>; 5926*9880d681SAndroid Build Coastguard Worker} 5927*9880d681SAndroid Build Coastguard Worker 5928*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5929*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (f128 FPR128:$src))), (v8f16 FPR128:$src)>; 5930*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v2i64 FPR128:$src))), (v8f16 FPR128:$src)>; 5931*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v4i32 FPR128:$src))), (v8f16 FPR128:$src)>; 5932*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v8i16 FPR128:$src))), (v8f16 FPR128:$src)>; 5933*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v16i8 FPR128:$src))), (v8f16 FPR128:$src)>; 5934*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v2f64 FPR128:$src))), (v8f16 FPR128:$src)>; 5935*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v4f32 FPR128:$src))), (v8f16 FPR128:$src)>; 5936*9880d681SAndroid Build Coastguard Worker} 5937*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5938*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (f128 FPR128:$src))), 5939*9880d681SAndroid Build Coastguard Worker (v8f16 (EXTv16i8 (REV64v8i16 FPR128:$src), 5940*9880d681SAndroid Build Coastguard Worker (REV64v8i16 FPR128:$src), 5941*9880d681SAndroid Build Coastguard Worker (i32 8)))>; 5942*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v2i64 FPR128:$src))), 5943*9880d681SAndroid Build Coastguard Worker (v8f16 (REV64v8i16 FPR128:$src))>; 5944*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v4i32 FPR128:$src))), 5945*9880d681SAndroid Build Coastguard Worker (v8f16 (REV32v8i16 FPR128:$src))>; 5946*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v8i16 FPR128:$src))), 5947*9880d681SAndroid Build Coastguard Worker (v8f16 (REV64v8i16 FPR128:$src))>; 5948*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v16i8 FPR128:$src))), 5949*9880d681SAndroid Build Coastguard Worker (v8f16 (REV16v16i8 FPR128:$src))>; 5950*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v2f64 FPR128:$src))), 5951*9880d681SAndroid Build Coastguard Worker (v8f16 (REV64v8i16 FPR128:$src))>; 5952*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v4f32 FPR128:$src))), 5953*9880d681SAndroid Build Coastguard Worker (v8f16 (REV32v8i16 FPR128:$src))>; 5954*9880d681SAndroid Build Coastguard Worker} 5955*9880d681SAndroid Build Coastguard Worker 5956*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 5957*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (f128 FPR128:$src))), (v16i8 FPR128:$src)>; 5958*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2i64 FPR128:$src))), (v16i8 FPR128:$src)>; 5959*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4i32 FPR128:$src))), (v16i8 FPR128:$src)>; 5960*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8i16 FPR128:$src))), (v16i8 FPR128:$src)>; 5961*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2f64 FPR128:$src))), (v16i8 FPR128:$src)>; 5962*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4f32 FPR128:$src))), (v16i8 FPR128:$src)>; 5963*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8f16 FPR128:$src))), (v16i8 FPR128:$src)>; 5964*9880d681SAndroid Build Coastguard Worker} 5965*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in { 5966*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (f128 FPR128:$src))), 5967*9880d681SAndroid Build Coastguard Worker (v16i8 (EXTv16i8 (REV64v16i8 FPR128:$src), 5968*9880d681SAndroid Build Coastguard Worker (REV64v16i8 FPR128:$src), 5969*9880d681SAndroid Build Coastguard Worker (i32 8)))>; 5970*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2i64 FPR128:$src))), 5971*9880d681SAndroid Build Coastguard Worker (v16i8 (REV64v16i8 FPR128:$src))>; 5972*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4i32 FPR128:$src))), 5973*9880d681SAndroid Build Coastguard Worker (v16i8 (REV32v16i8 FPR128:$src))>; 5974*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8i16 FPR128:$src))), 5975*9880d681SAndroid Build Coastguard Worker (v16i8 (REV16v16i8 FPR128:$src))>; 5976*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2f64 FPR128:$src))), 5977*9880d681SAndroid Build Coastguard Worker (v16i8 (REV64v16i8 FPR128:$src))>; 5978*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4f32 FPR128:$src))), 5979*9880d681SAndroid Build Coastguard Worker (v16i8 (REV32v16i8 FPR128:$src))>; 5980*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8f16 FPR128:$src))), 5981*9880d681SAndroid Build Coastguard Worker (v16i8 (REV16v16i8 FPR128:$src))>; 5982*9880d681SAndroid Build Coastguard Worker} 5983*9880d681SAndroid Build Coastguard Worker 5984*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (extract_subvector V128:$Rn, (i64 0))), 5985*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG V128:$Rn, dsub)>; 5986*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (extract_subvector V128:$Rn, (i64 0))), 5987*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG V128:$Rn, dsub)>; 5988*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (extract_subvector V128:$Rn, (i64 0))), 5989*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG V128:$Rn, dsub)>; 5990*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (extract_subvector V128:$Rn, (i64 0))), 5991*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG V128:$Rn, dsub)>; 5992*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvector V128:$Rn, (i64 0))), 5993*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG V128:$Rn, dsub)>; 5994*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (extract_subvector V128:$Rn, (i64 0))), 5995*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG V128:$Rn, dsub)>; 5996*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (extract_subvector V128:$Rn, (i64 0))), 5997*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG V128:$Rn, dsub)>; 5998*9880d681SAndroid Build Coastguard Worker 5999*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (extract_subvector (v16i8 FPR128:$Rn), (i64 1))), 6000*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (DUPv2i64lane FPR128:$Rn, 1), dsub)>; 6001*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (extract_subvector (v8i16 FPR128:$Rn), (i64 1))), 6002*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (DUPv2i64lane FPR128:$Rn, 1), dsub)>; 6003*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvector (v4i32 FPR128:$Rn), (i64 1))), 6004*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (DUPv2i64lane FPR128:$Rn, 1), dsub)>; 6005*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (extract_subvector (v2i64 FPR128:$Rn), (i64 1))), 6006*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (DUPv2i64lane FPR128:$Rn, 1), dsub)>; 6007*9880d681SAndroid Build Coastguard Worker 6008*9880d681SAndroid Build Coastguard Worker// A 64-bit subvector insert to the first 128-bit vector position 6009*9880d681SAndroid Build Coastguard Worker// is a subregister copy that needs no instruction. 6010*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v1i64 FPR64:$src), (i32 0)), 6011*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), FPR64:$src, dsub)>; 6012*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v1f64 FPR64:$src), (i32 0)), 6013*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FPR64:$src, dsub)>; 6014*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v2i32 FPR64:$src), (i32 0)), 6015*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR64:$src, dsub)>; 6016*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v2f32 FPR64:$src), (i32 0)), 6017*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR64:$src, dsub)>; 6018*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v4i16 FPR64:$src), (i32 0)), 6019*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), FPR64:$src, dsub)>; 6020*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v4f16 FPR64:$src), (i32 0)), 6021*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR64:$src, dsub)>; 6022*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v8i8 FPR64:$src), (i32 0)), 6023*9880d681SAndroid Build Coastguard Worker (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), FPR64:$src, dsub)>; 6024*9880d681SAndroid Build Coastguard Worker 6025*9880d681SAndroid Build Coastguard Worker// Use pair-wise add instructions when summing up the lanes for v2f64, v2i64 6026*9880d681SAndroid Build Coastguard Worker// or v2f32. 6027*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (add (vector_extract (v2i64 FPR128:$Rn), (i64 0)), 6028*9880d681SAndroid Build Coastguard Worker (vector_extract (v2i64 FPR128:$Rn), (i64 1)))), 6029*9880d681SAndroid Build Coastguard Worker (i64 (ADDPv2i64p (v2i64 FPR128:$Rn)))>; 6030*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fadd (vector_extract (v2f64 FPR128:$Rn), (i64 0)), 6031*9880d681SAndroid Build Coastguard Worker (vector_extract (v2f64 FPR128:$Rn), (i64 1)))), 6032*9880d681SAndroid Build Coastguard Worker (f64 (FADDPv2i64p (v2f64 FPR128:$Rn)))>; 6033*9880d681SAndroid Build Coastguard Worker // vector_extract on 64-bit vectors gets promoted to a 128 bit vector, 6034*9880d681SAndroid Build Coastguard Worker // so we match on v4f32 here, not v2f32. This will also catch adding 6035*9880d681SAndroid Build Coastguard Worker // the low two lanes of a true v4f32 vector. 6036*9880d681SAndroid Build Coastguard Workerdef : Pat<(fadd (vector_extract (v4f32 FPR128:$Rn), (i64 0)), 6037*9880d681SAndroid Build Coastguard Worker (vector_extract (v4f32 FPR128:$Rn), (i64 1))), 6038*9880d681SAndroid Build Coastguard Worker (f32 (FADDPv2i32p (EXTRACT_SUBREG FPR128:$Rn, dsub)))>; 6039*9880d681SAndroid Build Coastguard Worker 6040*9880d681SAndroid Build Coastguard Worker// Scalar 64-bit shifts in FPR64 registers. 6041*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_sshl (i64 FPR64:$Rn), (i64 FPR64:$Rm))), 6042*9880d681SAndroid Build Coastguard Worker (SSHLv1i64 FPR64:$Rn, FPR64:$Rm)>; 6043*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_ushl (i64 FPR64:$Rn), (i64 FPR64:$Rm))), 6044*9880d681SAndroid Build Coastguard Worker (USHLv1i64 FPR64:$Rn, FPR64:$Rm)>; 6045*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_srshl (i64 FPR64:$Rn), (i64 FPR64:$Rm))), 6046*9880d681SAndroid Build Coastguard Worker (SRSHLv1i64 FPR64:$Rn, FPR64:$Rm)>; 6047*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_urshl (i64 FPR64:$Rn), (i64 FPR64:$Rm))), 6048*9880d681SAndroid Build Coastguard Worker (URSHLv1i64 FPR64:$Rn, FPR64:$Rm)>; 6049*9880d681SAndroid Build Coastguard Worker 6050*9880d681SAndroid Build Coastguard Worker// Patterns for nontemporal/no-allocate stores. 6051*9880d681SAndroid Build Coastguard Worker// We have to resort to tricks to turn a single-input store into a store pair, 6052*9880d681SAndroid Build Coastguard Worker// because there is no single-input nontemporal store, only STNP. 6053*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in { 6054*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 15 in { 6055*9880d681SAndroid Build Coastguard Workerclass NTStore128Pat<ValueType VT> : 6056*9880d681SAndroid Build Coastguard Worker Pat<(nontemporalstore (VT FPR128:$Rt), 6057*9880d681SAndroid Build Coastguard Worker (am_indexed7s64 GPR64sp:$Rn, simm7s8:$offset)), 6058*9880d681SAndroid Build Coastguard Worker (STNPDi (EXTRACT_SUBREG FPR128:$Rt, dsub), 6059*9880d681SAndroid Build Coastguard Worker (CPYi64 FPR128:$Rt, (i64 1)), 6060*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, simm7s8:$offset)>; 6061*9880d681SAndroid Build Coastguard Worker 6062*9880d681SAndroid Build Coastguard Workerdef : NTStore128Pat<v2i64>; 6063*9880d681SAndroid Build Coastguard Workerdef : NTStore128Pat<v4i32>; 6064*9880d681SAndroid Build Coastguard Workerdef : NTStore128Pat<v8i16>; 6065*9880d681SAndroid Build Coastguard Workerdef : NTStore128Pat<v16i8>; 6066*9880d681SAndroid Build Coastguard Worker 6067*9880d681SAndroid Build Coastguard Workerclass NTStore64Pat<ValueType VT> : 6068*9880d681SAndroid Build Coastguard Worker Pat<(nontemporalstore (VT FPR64:$Rt), 6069*9880d681SAndroid Build Coastguard Worker (am_indexed7s32 GPR64sp:$Rn, simm7s4:$offset)), 6070*9880d681SAndroid Build Coastguard Worker (STNPSi (EXTRACT_SUBREG FPR64:$Rt, ssub), 6071*9880d681SAndroid Build Coastguard Worker (CPYi32 (SUBREG_TO_REG (i64 0), FPR64:$Rt, dsub), (i64 1)), 6072*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, simm7s4:$offset)>; 6073*9880d681SAndroid Build Coastguard Worker 6074*9880d681SAndroid Build Coastguard Worker// FIXME: Shouldn't v1f64 loads/stores be promoted to v1i64? 6075*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v1f64>; 6076*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v1i64>; 6077*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v2i32>; 6078*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v4i16>; 6079*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v8i8>; 6080*9880d681SAndroid Build Coastguard Worker 6081*9880d681SAndroid Build Coastguard Workerdef : Pat<(nontemporalstore GPR64:$Rt, 6082*9880d681SAndroid Build Coastguard Worker (am_indexed7s32 GPR64sp:$Rn, simm7s4:$offset)), 6083*9880d681SAndroid Build Coastguard Worker (STNPWi (EXTRACT_SUBREG GPR64:$Rt, sub_32), 6084*9880d681SAndroid Build Coastguard Worker (EXTRACT_SUBREG (UBFMXri GPR64:$Rt, 32, 63), sub_32), 6085*9880d681SAndroid Build Coastguard Worker GPR64sp:$Rn, simm7s4:$offset)>; 6086*9880d681SAndroid Build Coastguard Worker} // AddedComplexity=10 6087*9880d681SAndroid Build Coastguard Worker} // Predicates = [IsLE] 6088*9880d681SAndroid Build Coastguard Worker 6089*9880d681SAndroid Build Coastguard Worker// Tail call return handling. These are all compiler pseudo-instructions, 6090*9880d681SAndroid Build Coastguard Worker// so no encoding information or anything like that. 6091*9880d681SAndroid Build Coastguard Workerlet isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [SP] in { 6092*9880d681SAndroid Build Coastguard Worker def TCRETURNdi : Pseudo<(outs), (ins i64imm:$dst, i32imm:$FPDiff), []>, 6093*9880d681SAndroid Build Coastguard Worker Sched<[WriteBrReg]>; 6094*9880d681SAndroid Build Coastguard Worker def TCRETURNri : Pseudo<(outs), (ins tcGPR64:$dst, i32imm:$FPDiff), []>, 6095*9880d681SAndroid Build Coastguard Worker Sched<[WriteBrReg]>; 6096*9880d681SAndroid Build Coastguard Worker} 6097*9880d681SAndroid Build Coastguard Worker 6098*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64tcret tcGPR64:$dst, (i32 timm:$FPDiff)), 6099*9880d681SAndroid Build Coastguard Worker (TCRETURNri tcGPR64:$dst, imm:$FPDiff)>; 6100*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64tcret tglobaladdr:$dst, (i32 timm:$FPDiff)), 6101*9880d681SAndroid Build Coastguard Worker (TCRETURNdi texternalsym:$dst, imm:$FPDiff)>; 6102*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64tcret texternalsym:$dst, (i32 timm:$FPDiff)), 6103*9880d681SAndroid Build Coastguard Worker (TCRETURNdi texternalsym:$dst, imm:$FPDiff)>; 6104*9880d681SAndroid Build Coastguard Worker 6105*9880d681SAndroid Build Coastguard Workerinclude "AArch64InstrAtomics.td" 6106