1*9880d681SAndroid Build Coastguard Worker//===-- ARMInstrVFP.td - VFP support for ARM ---------------*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file describes the ARM VFP instruction set. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdef SDT_CMPFP0 : SDTypeProfile<0, 1, [SDTCisFP<0>]>; 15*9880d681SAndroid Build Coastguard Workerdef SDT_VMOVDRR : SDTypeProfile<1, 2, [SDTCisVT<0, f64>, SDTCisVT<1, i32>, 16*9880d681SAndroid Build Coastguard Worker SDTCisSameAs<1, 2>]>; 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdef arm_fmstat : SDNode<"ARMISD::FMSTAT", SDTNone, [SDNPInGlue, SDNPOutGlue]>; 19*9880d681SAndroid Build Coastguard Workerdef arm_cmpfp : SDNode<"ARMISD::CMPFP", SDT_ARMCmp, [SDNPOutGlue]>; 20*9880d681SAndroid Build Coastguard Workerdef arm_cmpfp0 : SDNode<"ARMISD::CMPFPw0", SDT_CMPFP0, [SDNPOutGlue]>; 21*9880d681SAndroid Build Coastguard Workerdef arm_fmdrr : SDNode<"ARMISD::VMOVDRR", SDT_VMOVDRR>; 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 24*9880d681SAndroid Build Coastguard Worker// Operand Definitions. 25*9880d681SAndroid Build Coastguard Worker// 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker// 8-bit floating-point immediate encodings. 28*9880d681SAndroid Build Coastguard Workerdef FPImmOperand : AsmOperandClass { 29*9880d681SAndroid Build Coastguard Worker let Name = "FPImm"; 30*9880d681SAndroid Build Coastguard Worker let ParserMethod = "parseFPImm"; 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdef vfp_f16imm : Operand<f16>, 34*9880d681SAndroid Build Coastguard Worker PatLeaf<(f16 fpimm), [{ 35*9880d681SAndroid Build Coastguard Worker return ARM_AM::getFP16Imm(N->getValueAPF()) != -1; 36*9880d681SAndroid Build Coastguard Worker }], SDNodeXForm<fpimm, [{ 37*9880d681SAndroid Build Coastguard Worker APFloat InVal = N->getValueAPF(); 38*9880d681SAndroid Build Coastguard Worker uint32_t enc = ARM_AM::getFP16Imm(InVal); 39*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, MVT::i32); 40*9880d681SAndroid Build Coastguard Worker }]>> { 41*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFPImmOperand"; 42*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = FPImmOperand; 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdef vfp_f32imm : Operand<f32>, 46*9880d681SAndroid Build Coastguard Worker PatLeaf<(f32 fpimm), [{ 47*9880d681SAndroid Build Coastguard Worker return ARM_AM::getFP32Imm(N->getValueAPF()) != -1; 48*9880d681SAndroid Build Coastguard Worker }], SDNodeXForm<fpimm, [{ 49*9880d681SAndroid Build Coastguard Worker APFloat InVal = N->getValueAPF(); 50*9880d681SAndroid Build Coastguard Worker uint32_t enc = ARM_AM::getFP32Imm(InVal); 51*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32); 52*9880d681SAndroid Build Coastguard Worker }]>> { 53*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFPImmOperand"; 54*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = FPImmOperand; 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdef vfp_f64imm : Operand<f64>, 58*9880d681SAndroid Build Coastguard Worker PatLeaf<(f64 fpimm), [{ 59*9880d681SAndroid Build Coastguard Worker return ARM_AM::getFP64Imm(N->getValueAPF()) != -1; 60*9880d681SAndroid Build Coastguard Worker }], SDNodeXForm<fpimm, [{ 61*9880d681SAndroid Build Coastguard Worker APFloat InVal = N->getValueAPF(); 62*9880d681SAndroid Build Coastguard Worker uint32_t enc = ARM_AM::getFP64Imm(InVal); 63*9880d681SAndroid Build Coastguard Worker return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32); 64*9880d681SAndroid Build Coastguard Worker }]>> { 65*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFPImmOperand"; 66*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = FPImmOperand; 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdef alignedload32 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ 70*9880d681SAndroid Build Coastguard Worker return cast<LoadSDNode>(N)->getAlignment() >= 4; 71*9880d681SAndroid Build Coastguard Worker}]>; 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdef alignedstore32 : PatFrag<(ops node:$val, node:$ptr), 74*9880d681SAndroid Build Coastguard Worker (store node:$val, node:$ptr), [{ 75*9880d681SAndroid Build Coastguard Worker return cast<StoreSDNode>(N)->getAlignment() >= 4; 76*9880d681SAndroid Build Coastguard Worker}]>; 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker// The VCVT to/from fixed-point instructions encode the 'fbits' operand 79*9880d681SAndroid Build Coastguard Worker// (the number of fixed bits) differently than it appears in the assembly 80*9880d681SAndroid Build Coastguard Worker// source. It's encoded as "Size - fbits" where Size is the size of the 81*9880d681SAndroid Build Coastguard Worker// fixed-point representation (32 or 16) and fbits is the value appearing 82*9880d681SAndroid Build Coastguard Worker// in the assembly source, an integer in [0,16] or (0,32], depending on size. 83*9880d681SAndroid Build Coastguard Workerdef fbits32_asm_operand : AsmOperandClass { let Name = "FBits32"; } 84*9880d681SAndroid Build Coastguard Workerdef fbits32 : Operand<i32> { 85*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFBits32"; 86*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = fbits32_asm_operand; 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdef fbits16_asm_operand : AsmOperandClass { let Name = "FBits16"; } 90*9880d681SAndroid Build Coastguard Workerdef fbits16 : Operand<i32> { 91*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printFBits16"; 92*9880d681SAndroid Build Coastguard Worker let ParserMatchClass = fbits16_asm_operand; 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 96*9880d681SAndroid Build Coastguard Worker// Load / store Instructions. 97*9880d681SAndroid Build Coastguard Worker// 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerlet canFoldAsLoad = 1, isReMaterializable = 1 in { 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdef VLDRD : ADI5<0b1101, 0b01, (outs DPR:$Dd), (ins addrmode5:$addr), 102*9880d681SAndroid Build Coastguard Worker IIC_fpLoad64, "vldr", "\t$Dd, $addr", 103*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (f64 (alignedload32 addrmode5:$addr)))]>; 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdef VLDRS : ASI5<0b1101, 0b01, (outs SPR:$Sd), (ins addrmode5:$addr), 106*9880d681SAndroid Build Coastguard Worker IIC_fpLoad32, "vldr", "\t$Sd, $addr", 107*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (alignedload32 addrmode5:$addr))]> { 108*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and VFP 109*9880d681SAndroid Build Coastguard Worker // pipelines. 110*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdef VLDRH : AHI5<0b1101, 0b01, (outs SPR:$Sd), (ins addrmode5fp16:$addr), 114*9880d681SAndroid Build Coastguard Worker IIC_fpLoad16, "vldr", ".16\t$Sd, $addr", 115*9880d681SAndroid Build Coastguard Worker []>, 116*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker} // End of 'let canFoldAsLoad = 1, isReMaterializable = 1 in' 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdef VSTRD : ADI5<0b1101, 0b00, (outs), (ins DPR:$Dd, addrmode5:$addr), 121*9880d681SAndroid Build Coastguard Worker IIC_fpStore64, "vstr", "\t$Dd, $addr", 122*9880d681SAndroid Build Coastguard Worker [(alignedstore32 (f64 DPR:$Dd), addrmode5:$addr)]>; 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdef VSTRS : ASI5<0b1101, 0b00, (outs), (ins SPR:$Sd, addrmode5:$addr), 125*9880d681SAndroid Build Coastguard Worker IIC_fpStore32, "vstr", "\t$Sd, $addr", 126*9880d681SAndroid Build Coastguard Worker [(alignedstore32 SPR:$Sd, addrmode5:$addr)]> { 127*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and VFP 128*9880d681SAndroid Build Coastguard Worker // pipelines. 129*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdef VSTRH : AHI5<0b1101, 0b00, (outs), (ins SPR:$Sd, addrmode5fp16:$addr), 133*9880d681SAndroid Build Coastguard Worker IIC_fpStore16, "vstr", ".16\t$Sd, $addr", 134*9880d681SAndroid Build Coastguard Worker []>, 135*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 138*9880d681SAndroid Build Coastguard Worker// Load / store multiple Instructions. 139*9880d681SAndroid Build Coastguard Worker// 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workermulticlass vfp_ldst_mult<string asm, bit L_bit, 142*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, InstrItinClass itin_upd> { 143*9880d681SAndroid Build Coastguard Worker // Double Precision 144*9880d681SAndroid Build Coastguard Worker def DIA : 145*9880d681SAndroid Build Coastguard Worker AXDI4<(outs), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs, variable_ops), 146*9880d681SAndroid Build Coastguard Worker IndexModeNone, itin, 147*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "ia${p}\t$Rn, $regs"), "", []> { 148*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b01; // Increment After 149*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; // No writeback 150*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 151*9880d681SAndroid Build Coastguard Worker } 152*9880d681SAndroid Build Coastguard Worker def DIA_UPD : 153*9880d681SAndroid Build Coastguard Worker AXDI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs, 154*9880d681SAndroid Build Coastguard Worker variable_ops), 155*9880d681SAndroid Build Coastguard Worker IndexModeUpd, itin_upd, 156*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "ia${p}\t$Rn!, $regs"), "$Rn = $wb", []> { 157*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b01; // Increment After 158*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; // Writeback 159*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 160*9880d681SAndroid Build Coastguard Worker } 161*9880d681SAndroid Build Coastguard Worker def DDB_UPD : 162*9880d681SAndroid Build Coastguard Worker AXDI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs, 163*9880d681SAndroid Build Coastguard Worker variable_ops), 164*9880d681SAndroid Build Coastguard Worker IndexModeUpd, itin_upd, 165*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "db${p}\t$Rn!, $regs"), "$Rn = $wb", []> { 166*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b10; // Decrement Before 167*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; // Writeback 168*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 169*9880d681SAndroid Build Coastguard Worker } 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker // Single Precision 172*9880d681SAndroid Build Coastguard Worker def SIA : 173*9880d681SAndroid Build Coastguard Worker AXSI4<(outs), (ins GPR:$Rn, pred:$p, spr_reglist:$regs, variable_ops), 174*9880d681SAndroid Build Coastguard Worker IndexModeNone, itin, 175*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "ia${p}\t$Rn, $regs"), "", []> { 176*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b01; // Increment After 177*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; // No writeback 178*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 181*9880d681SAndroid Build Coastguard Worker // VFP pipelines. 182*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 183*9880d681SAndroid Build Coastguard Worker } 184*9880d681SAndroid Build Coastguard Worker def SIA_UPD : 185*9880d681SAndroid Build Coastguard Worker AXSI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, spr_reglist:$regs, 186*9880d681SAndroid Build Coastguard Worker variable_ops), 187*9880d681SAndroid Build Coastguard Worker IndexModeUpd, itin_upd, 188*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "ia${p}\t$Rn!, $regs"), "$Rn = $wb", []> { 189*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b01; // Increment After 190*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; // Writeback 191*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 194*9880d681SAndroid Build Coastguard Worker // VFP pipelines. 195*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 196*9880d681SAndroid Build Coastguard Worker } 197*9880d681SAndroid Build Coastguard Worker def SDB_UPD : 198*9880d681SAndroid Build Coastguard Worker AXSI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, spr_reglist:$regs, 199*9880d681SAndroid Build Coastguard Worker variable_ops), 200*9880d681SAndroid Build Coastguard Worker IndexModeUpd, itin_upd, 201*9880d681SAndroid Build Coastguard Worker !strconcat(asm, "db${p}\t$Rn!, $regs"), "$Rn = $wb", []> { 202*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b10; // Decrement Before 203*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; // Writeback 204*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 207*9880d681SAndroid Build Coastguard Worker // VFP pipelines. 208*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 209*9880d681SAndroid Build Coastguard Worker } 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasExtraDefRegAllocReq = 1 in 215*9880d681SAndroid Build Coastguard Workerdefm VLDM : vfp_ldst_mult<"vldm", 1, IIC_fpLoad_m, IIC_fpLoad_mu>; 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, hasExtraSrcRegAllocReq = 1 in 218*9880d681SAndroid Build Coastguard Workerdefm VSTM : vfp_ldst_mult<"vstm", 0, IIC_fpStore_m, IIC_fpStore_mu>; 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker} // hasSideEffects 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdef : MnemonicAlias<"vldm", "vldmia">; 223*9880d681SAndroid Build Coastguard Workerdef : MnemonicAlias<"vstm", "vstmia">; 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 227*9880d681SAndroid Build Coastguard Worker// Lazy load / store multiple Instructions 228*9880d681SAndroid Build Coastguard Worker// 229*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in 230*9880d681SAndroid Build Coastguard Workerdef VLLDM : AXSI4<(outs), (ins GPRnopc:$Rn, pred:$p), IndexModeNone, 231*9880d681SAndroid Build Coastguard Worker IIC_fpLoad_m, "vlldm${p}\t$Rn", "", []>, 232*9880d681SAndroid Build Coastguard Worker Requires<[HasV8MMainline, Has8MSecExt]> { 233*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b00; 234*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; 235*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 236*9880d681SAndroid Build Coastguard Worker let Inst{20} = 1; 237*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0; 238*9880d681SAndroid Build Coastguard Worker let Inst{7-0} = 0; 239*9880d681SAndroid Build Coastguard Worker let mayLoad = 1; 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in 243*9880d681SAndroid Build Coastguard Workerdef VLSTM : AXSI4<(outs), (ins GPRnopc:$Rn, pred:$p), IndexModeNone, 244*9880d681SAndroid Build Coastguard Worker IIC_fpStore_m, "vlstm${p}\t$Rn", "", []>, 245*9880d681SAndroid Build Coastguard Worker Requires<[HasV8MMainline, Has8MSecExt]> { 246*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b00; 247*9880d681SAndroid Build Coastguard Worker let Inst{22} = 0; 248*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; 249*9880d681SAndroid Build Coastguard Worker let Inst{20} = 0; 250*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = 0; 251*9880d681SAndroid Build Coastguard Worker let Inst{7-0} = 0; 252*9880d681SAndroid Build Coastguard Worker let mayStore = 1; 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker// FLDM/FSTM - Load / Store multiple single / double precision registers for 257*9880d681SAndroid Build Coastguard Worker// pre-ARMv6 cores. 258*9880d681SAndroid Build Coastguard Worker// These instructions are deprecated! 259*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmias", "vldmia">; 260*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmdbs", "vldmdb">; 261*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmeas", "vldmdb">; 262*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmfds", "vldmia">; 263*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmiad", "vldmia">; 264*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmdbd", "vldmdb">; 265*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmead", "vldmdb">; 266*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmfdd", "vldmia">; 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmias", "vstmia">; 269*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmdbs", "vstmdb">; 270*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmeas", "vstmia">; 271*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmfds", "vstmdb">; 272*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmiad", "vstmia">; 273*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmdbd", "vstmdb">; 274*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmead", "vstmia">; 275*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmfdd", "vstmdb">; 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"vpush${p} $r", (VSTMDDB_UPD SP, pred:$p, dpr_reglist:$r), 0>, 278*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2]>; 279*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"vpush${p} $r", (VSTMSDB_UPD SP, pred:$p, spr_reglist:$r), 0>, 280*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2]>; 281*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"vpop${p} $r", (VLDMDIA_UPD SP, pred:$p, dpr_reglist:$r), 0>, 282*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2]>; 283*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"vpop${p} $r", (VLDMSIA_UPD SP, pred:$p, spr_reglist:$r), 0>, 284*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2]>; 285*9880d681SAndroid Build Coastguard Workerdefm : VFPDTAnyInstAlias<"vpush${p}", "$r", 286*9880d681SAndroid Build Coastguard Worker (VSTMSDB_UPD SP, pred:$p, spr_reglist:$r)>; 287*9880d681SAndroid Build Coastguard Workerdefm : VFPDTAnyInstAlias<"vpush${p}", "$r", 288*9880d681SAndroid Build Coastguard Worker (VSTMDDB_UPD SP, pred:$p, dpr_reglist:$r)>; 289*9880d681SAndroid Build Coastguard Workerdefm : VFPDTAnyInstAlias<"vpop${p}", "$r", 290*9880d681SAndroid Build Coastguard Worker (VLDMSIA_UPD SP, pred:$p, spr_reglist:$r)>; 291*9880d681SAndroid Build Coastguard Workerdefm : VFPDTAnyInstAlias<"vpop${p}", "$r", 292*9880d681SAndroid Build Coastguard Worker (VLDMDIA_UPD SP, pred:$p, dpr_reglist:$r)>; 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker// FLDMX, FSTMX - Load and store multiple unknown precision registers for 295*9880d681SAndroid Build Coastguard Worker// pre-armv6 cores. 296*9880d681SAndroid Build Coastguard Worker// These instruction are deprecated so we don't want them to get selected. 297*9880d681SAndroid Build Coastguard Workermulticlass vfp_ldstx_mult<string asm, bit L_bit> { 298*9880d681SAndroid Build Coastguard Worker // Unknown precision 299*9880d681SAndroid Build Coastguard Worker def XIA : 300*9880d681SAndroid Build Coastguard Worker AXXI4<(outs), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs, variable_ops), 301*9880d681SAndroid Build Coastguard Worker IndexModeNone, !strconcat(asm, "iax${p}\t$Rn, $regs"), "", []> { 302*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b01; // Increment After 303*9880d681SAndroid Build Coastguard Worker let Inst{21} = 0; // No writeback 304*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 305*9880d681SAndroid Build Coastguard Worker } 306*9880d681SAndroid Build Coastguard Worker def XIA_UPD : 307*9880d681SAndroid Build Coastguard Worker AXXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs, variable_ops), 308*9880d681SAndroid Build Coastguard Worker IndexModeUpd, !strconcat(asm, "iax${p}\t$Rn!, $regs"), "$Rn = $wb", []> { 309*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b01; // Increment After 310*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; // Writeback 311*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 312*9880d681SAndroid Build Coastguard Worker } 313*9880d681SAndroid Build Coastguard Worker def XDB_UPD : 314*9880d681SAndroid Build Coastguard Worker AXXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, dpr_reglist:$regs, variable_ops), 315*9880d681SAndroid Build Coastguard Worker IndexModeUpd, !strconcat(asm, "dbx${p}\t$Rn!, $regs"), "$Rn = $wb", []> { 316*9880d681SAndroid Build Coastguard Worker let Inst{24-23} = 0b10; // Decrement Before 317*9880d681SAndroid Build Coastguard Worker let Inst{21} = 1; // Writeback 318*9880d681SAndroid Build Coastguard Worker let Inst{20} = L_bit; 319*9880d681SAndroid Build Coastguard Worker } 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Workerdefm FLDM : vfp_ldstx_mult<"fldm", 1>; 323*9880d681SAndroid Build Coastguard Workerdefm FSTM : vfp_ldstx_mult<"fstm", 0>; 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmeax", "fldmdbx">; 326*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldmfdx", "fldmiax">; 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmeax", "fstmiax">; 329*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstmfdx", "fstmdbx">; 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 332*9880d681SAndroid Build Coastguard Worker// FP Binary Operations. 333*9880d681SAndroid Build Coastguard Worker// 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Dn = $Dd" in 336*9880d681SAndroid Build Coastguard Workerdef VADDD : ADbI<0b11100, 0b11, 0, 0, 337*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm), 338*9880d681SAndroid Build Coastguard Worker IIC_fpALU64, "vadd", ".f64\t$Dd, $Dn, $Dm", 339*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fadd DPR:$Dn, (f64 DPR:$Dm)))]>; 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Sn = $Sd" in 342*9880d681SAndroid Build Coastguard Workerdef VADDS : ASbIn<0b11100, 0b11, 0, 0, 343*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 344*9880d681SAndroid Build Coastguard Worker IIC_fpALU32, "vadd", ".f32\t$Sd, $Sn, $Sm", 345*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fadd SPR:$Sn, SPR:$Sm))]> { 346*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 347*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 348*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 349*9880d681SAndroid Build Coastguard Worker} 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Sn = $Sd" in 352*9880d681SAndroid Build Coastguard Workerdef VADDH : AHbI<0b11100, 0b11, 0, 0, 353*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 354*9880d681SAndroid Build Coastguard Worker IIC_fpALU16, "vadd", ".f16\t$Sd, $Sn, $Sm", 355*9880d681SAndroid Build Coastguard Worker []>; 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Dn = $Dd" in 358*9880d681SAndroid Build Coastguard Workerdef VSUBD : ADbI<0b11100, 0b11, 1, 0, 359*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm), 360*9880d681SAndroid Build Coastguard Worker IIC_fpALU64, "vsub", ".f64\t$Dd, $Dn, $Dm", 361*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fsub DPR:$Dn, (f64 DPR:$Dm)))]>; 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Sn = $Sd" in 364*9880d681SAndroid Build Coastguard Workerdef VSUBS : ASbIn<0b11100, 0b11, 1, 0, 365*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 366*9880d681SAndroid Build Coastguard Worker IIC_fpALU32, "vsub", ".f32\t$Sd, $Sn, $Sm", 367*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fsub SPR:$Sn, SPR:$Sm))]> { 368*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 369*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 370*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 371*9880d681SAndroid Build Coastguard Worker} 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Sn = $Sd" in 374*9880d681SAndroid Build Coastguard Workerdef VSUBH : AHbI<0b11100, 0b11, 1, 0, 375*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 376*9880d681SAndroid Build Coastguard Worker IIC_fpALU16, "vsub", ".f16\t$Sd, $Sn, $Sm", 377*9880d681SAndroid Build Coastguard Worker []>; 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Dn = $Dd" in 380*9880d681SAndroid Build Coastguard Workerdef VDIVD : ADbI<0b11101, 0b00, 0, 0, 381*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm), 382*9880d681SAndroid Build Coastguard Worker IIC_fpDIV64, "vdiv", ".f64\t$Dd, $Dn, $Dm", 383*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fdiv DPR:$Dn, (f64 DPR:$Dm)))]>; 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Sn = $Sd" in 386*9880d681SAndroid Build Coastguard Workerdef VDIVS : ASbI<0b11101, 0b00, 0, 0, 387*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 388*9880d681SAndroid Build Coastguard Worker IIC_fpDIV32, "vdiv", ".f32\t$Sd, $Sn, $Sm", 389*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fdiv SPR:$Sn, SPR:$Sm))]>; 390*9880d681SAndroid Build Coastguard Worker 391*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Sn = $Sd" in 392*9880d681SAndroid Build Coastguard Workerdef VDIVH : AHbI<0b11101, 0b00, 0, 0, 393*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 394*9880d681SAndroid Build Coastguard Worker IIC_fpDIV16, "vdiv", ".f16\t$Sd, $Sn, $Sm", 395*9880d681SAndroid Build Coastguard Worker []>; 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Dn = $Dd" in 398*9880d681SAndroid Build Coastguard Workerdef VMULD : ADbI<0b11100, 0b10, 0, 0, 399*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm), 400*9880d681SAndroid Build Coastguard Worker IIC_fpMUL64, "vmul", ".f64\t$Dd, $Dn, $Dm", 401*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fmul DPR:$Dn, (f64 DPR:$Dm)))]>; 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Sn = $Sd" in 404*9880d681SAndroid Build Coastguard Workerdef VMULS : ASbIn<0b11100, 0b10, 0, 0, 405*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 406*9880d681SAndroid Build Coastguard Worker IIC_fpMUL32, "vmul", ".f32\t$Sd, $Sn, $Sm", 407*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fmul SPR:$Sn, SPR:$Sm))]> { 408*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 409*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 410*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 411*9880d681SAndroid Build Coastguard Worker} 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Workerlet TwoOperandAliasConstraint = "$Sn = $Sd" in 414*9880d681SAndroid Build Coastguard Workerdef VMULH : AHbI<0b11100, 0b10, 0, 0, 415*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 416*9880d681SAndroid Build Coastguard Worker IIC_fpMUL16, "vmul", ".f16\t$Sd, $Sn, $Sm", 417*9880d681SAndroid Build Coastguard Worker []>; 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Workerdef VNMULD : ADbI<0b11100, 0b10, 1, 0, 420*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm), 421*9880d681SAndroid Build Coastguard Worker IIC_fpMUL64, "vnmul", ".f64\t$Dd, $Dn, $Dm", 422*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fneg (fmul DPR:$Dn, (f64 DPR:$Dm))))]>; 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Workerdef VNMULS : ASbI<0b11100, 0b10, 1, 0, 425*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 426*9880d681SAndroid Build Coastguard Worker IIC_fpMUL32, "vnmul", ".f32\t$Sd, $Sn, $Sm", 427*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fneg (fmul SPR:$Sn, SPR:$Sm)))]> { 428*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 429*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 430*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 431*9880d681SAndroid Build Coastguard Worker} 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Workerdef VNMULH : AHbI<0b11100, 0b10, 1, 0, 434*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 435*9880d681SAndroid Build Coastguard Worker IIC_fpMUL16, "vnmul", ".f16\t$Sd, $Sn, $Sm", 436*9880d681SAndroid Build Coastguard Worker []>; 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Workermulticlass vsel_inst<string op, bits<2> opc, int CC> { 439*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VFPV8", PostEncoderMethod = "", 440*9880d681SAndroid Build Coastguard Worker Uses = [CPSR], AddedComplexity = 4 in { 441*9880d681SAndroid Build Coastguard Worker def H : AHbInp<0b11100, opc, 0, 442*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 443*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vsel", op, ".f16\t$Sd, $Sn, $Sm"), 444*9880d681SAndroid Build Coastguard Worker []>, 445*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker def S : ASbInp<0b11100, opc, 0, 448*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 449*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vsel", op, ".f32\t$Sd, $Sn, $Sm"), 450*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (ARMcmov SPR:$Sm, SPR:$Sn, CC))]>, 451*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8]>; 452*9880d681SAndroid Build Coastguard Worker 453*9880d681SAndroid Build Coastguard Worker def D : ADbInp<0b11100, opc, 0, 454*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm), 455*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vsel", op, ".f64\t$Dd, $Dn, $Dm"), 456*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (ARMcmov (f64 DPR:$Dm), (f64 DPR:$Dn), CC))]>, 457*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8, HasDPVFP]>; 458*9880d681SAndroid Build Coastguard Worker } 459*9880d681SAndroid Build Coastguard Worker} 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker// The CC constants here match ARMCC::CondCodes. 462*9880d681SAndroid Build Coastguard Workerdefm VSELGT : vsel_inst<"gt", 0b11, 12>; 463*9880d681SAndroid Build Coastguard Workerdefm VSELGE : vsel_inst<"ge", 0b10, 10>; 464*9880d681SAndroid Build Coastguard Workerdefm VSELEQ : vsel_inst<"eq", 0b00, 0>; 465*9880d681SAndroid Build Coastguard Workerdefm VSELVS : vsel_inst<"vs", 0b01, 6>; 466*9880d681SAndroid Build Coastguard Worker 467*9880d681SAndroid Build Coastguard Workermulticlass vmaxmin_inst<string op, bit opc, SDNode SD> { 468*9880d681SAndroid Build Coastguard Worker let DecoderNamespace = "VFPV8", PostEncoderMethod = "" in { 469*9880d681SAndroid Build Coastguard Worker def H : AHbInp<0b11101, 0b00, opc, 470*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 471*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat(op, ".f16\t$Sd, $Sn, $Sm"), 472*9880d681SAndroid Build Coastguard Worker []>, 473*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Worker def S : ASbInp<0b11101, 0b00, opc, 476*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm), 477*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat(op, ".f32\t$Sd, $Sn, $Sm"), 478*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (SD SPR:$Sn, SPR:$Sm))]>, 479*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8]>; 480*9880d681SAndroid Build Coastguard Worker 481*9880d681SAndroid Build Coastguard Worker def D : ADbInp<0b11101, 0b00, opc, 482*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm), 483*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat(op, ".f64\t$Dd, $Dn, $Dm"), 484*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (f64 (SD (f64 DPR:$Dn), (f64 DPR:$Dm))))]>, 485*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8, HasDPVFP]>; 486*9880d681SAndroid Build Coastguard Worker } 487*9880d681SAndroid Build Coastguard Worker} 488*9880d681SAndroid Build Coastguard Worker 489*9880d681SAndroid Build Coastguard Workerdefm VMAXNM : vmaxmin_inst<"vmaxnm", 0, fmaxnum>; 490*9880d681SAndroid Build Coastguard Workerdefm VMINNM : vmaxmin_inst<"vminnm", 1, fminnum>; 491*9880d681SAndroid Build Coastguard Worker 492*9880d681SAndroid Build Coastguard Worker// Match reassociated forms only if not sign dependent rounding. 493*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmul (fneg DPR:$a), (f64 DPR:$b)), 494*9880d681SAndroid Build Coastguard Worker (VNMULD DPR:$a, DPR:$b)>, 495*9880d681SAndroid Build Coastguard Worker Requires<[NoHonorSignDependentRounding,HasDPVFP]>; 496*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmul (fneg SPR:$a), SPR:$b), 497*9880d681SAndroid Build Coastguard Worker (VNMULS SPR:$a, SPR:$b)>, Requires<[NoHonorSignDependentRounding]>; 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Worker// These are encoded as unary instructions. 500*9880d681SAndroid Build Coastguard Workerlet Defs = [FPSCR_NZCV] in { 501*9880d681SAndroid Build Coastguard Workerdef VCMPED : ADuI<0b11101, 0b11, 0b0100, 0b11, 0, 502*9880d681SAndroid Build Coastguard Worker (outs), (ins DPR:$Dd, DPR:$Dm), 503*9880d681SAndroid Build Coastguard Worker IIC_fpCMP64, "vcmpe", ".f64\t$Dd, $Dm", 504*9880d681SAndroid Build Coastguard Worker [(arm_cmpfp DPR:$Dd, (f64 DPR:$Dm))]>; 505*9880d681SAndroid Build Coastguard Worker 506*9880d681SAndroid Build Coastguard Workerdef VCMPES : ASuI<0b11101, 0b11, 0b0100, 0b11, 0, 507*9880d681SAndroid Build Coastguard Worker (outs), (ins SPR:$Sd, SPR:$Sm), 508*9880d681SAndroid Build Coastguard Worker IIC_fpCMP32, "vcmpe", ".f32\t$Sd, $Sm", 509*9880d681SAndroid Build Coastguard Worker [(arm_cmpfp SPR:$Sd, SPR:$Sm)]> { 510*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 511*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 512*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 513*9880d681SAndroid Build Coastguard Worker} 514*9880d681SAndroid Build Coastguard Worker 515*9880d681SAndroid Build Coastguard Workerdef VCMPEH : AHuI<0b11101, 0b11, 0b0100, 0b11, 0, 516*9880d681SAndroid Build Coastguard Worker (outs), (ins SPR:$Sd, SPR:$Sm), 517*9880d681SAndroid Build Coastguard Worker IIC_fpCMP16, "vcmpe", ".f16\t$Sd, $Sm", 518*9880d681SAndroid Build Coastguard Worker []>; 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Worker 521*9880d681SAndroid Build Coastguard Worker// FIXME: Verify encoding after integrated assembler is working. 522*9880d681SAndroid Build Coastguard Workerdef VCMPD : ADuI<0b11101, 0b11, 0b0100, 0b01, 0, 523*9880d681SAndroid Build Coastguard Worker (outs), (ins DPR:$Dd, DPR:$Dm), 524*9880d681SAndroid Build Coastguard Worker IIC_fpCMP64, "vcmp", ".f64\t$Dd, $Dm", 525*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]>; 526*9880d681SAndroid Build Coastguard Worker 527*9880d681SAndroid Build Coastguard Workerdef VCMPS : ASuI<0b11101, 0b11, 0b0100, 0b01, 0, 528*9880d681SAndroid Build Coastguard Worker (outs), (ins SPR:$Sd, SPR:$Sm), 529*9880d681SAndroid Build Coastguard Worker IIC_fpCMP32, "vcmp", ".f32\t$Sd, $Sm", 530*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]> { 531*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 532*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 533*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 534*9880d681SAndroid Build Coastguard Worker} 535*9880d681SAndroid Build Coastguard Worker 536*9880d681SAndroid Build Coastguard Workerdef VCMPH : AHuI<0b11101, 0b11, 0b0100, 0b01, 0, 537*9880d681SAndroid Build Coastguard Worker (outs), (ins SPR:$Sd, SPR:$Sm), 538*9880d681SAndroid Build Coastguard Worker IIC_fpCMP16, "vcmp", ".f16\t$Sd, $Sm", 539*9880d681SAndroid Build Coastguard Worker []>; 540*9880d681SAndroid Build Coastguard Worker} // Defs = [FPSCR_NZCV] 541*9880d681SAndroid Build Coastguard Worker 542*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 543*9880d681SAndroid Build Coastguard Worker// FP Unary Operations. 544*9880d681SAndroid Build Coastguard Worker// 545*9880d681SAndroid Build Coastguard Worker 546*9880d681SAndroid Build Coastguard Workerdef VABSD : ADuI<0b11101, 0b11, 0b0000, 0b11, 0, 547*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dm), 548*9880d681SAndroid Build Coastguard Worker IIC_fpUNA64, "vabs", ".f64\t$Dd, $Dm", 549*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fabs (f64 DPR:$Dm)))]>; 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Workerdef VABSS : ASuIn<0b11101, 0b11, 0b0000, 0b11, 0, 552*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 553*9880d681SAndroid Build Coastguard Worker IIC_fpUNA32, "vabs", ".f32\t$Sd, $Sm", 554*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fabs SPR:$Sm))]> { 555*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 556*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 557*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 558*9880d681SAndroid Build Coastguard Worker} 559*9880d681SAndroid Build Coastguard Worker 560*9880d681SAndroid Build Coastguard Workerdef VABSH : AHuI<0b11101, 0b11, 0b0000, 0b11, 0, 561*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 562*9880d681SAndroid Build Coastguard Worker IIC_fpUNA16, "vabs", ".f16\t$Sd, $Sm", 563*9880d681SAndroid Build Coastguard Worker []>; 564*9880d681SAndroid Build Coastguard Worker 565*9880d681SAndroid Build Coastguard Workerlet Defs = [FPSCR_NZCV] in { 566*9880d681SAndroid Build Coastguard Workerdef VCMPEZD : ADuI<0b11101, 0b11, 0b0101, 0b11, 0, 567*9880d681SAndroid Build Coastguard Worker (outs), (ins DPR:$Dd), 568*9880d681SAndroid Build Coastguard Worker IIC_fpCMP64, "vcmpe", ".f64\t$Dd, #0", 569*9880d681SAndroid Build Coastguard Worker [(arm_cmpfp0 (f64 DPR:$Dd))]> { 570*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 571*9880d681SAndroid Build Coastguard Worker let Inst{5} = 0; 572*9880d681SAndroid Build Coastguard Worker} 573*9880d681SAndroid Build Coastguard Worker 574*9880d681SAndroid Build Coastguard Workerdef VCMPEZS : ASuI<0b11101, 0b11, 0b0101, 0b11, 0, 575*9880d681SAndroid Build Coastguard Worker (outs), (ins SPR:$Sd), 576*9880d681SAndroid Build Coastguard Worker IIC_fpCMP32, "vcmpe", ".f32\t$Sd, #0", 577*9880d681SAndroid Build Coastguard Worker [(arm_cmpfp0 SPR:$Sd)]> { 578*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 579*9880d681SAndroid Build Coastguard Worker let Inst{5} = 0; 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 582*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 583*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 584*9880d681SAndroid Build Coastguard Worker} 585*9880d681SAndroid Build Coastguard Worker 586*9880d681SAndroid Build Coastguard Workerdef VCMPEZH : AHuI<0b11101, 0b11, 0b0101, 0b11, 0, 587*9880d681SAndroid Build Coastguard Worker (outs), (ins SPR:$Sd), 588*9880d681SAndroid Build Coastguard Worker IIC_fpCMP16, "vcmpe", ".f16\t$Sd, #0", 589*9880d681SAndroid Build Coastguard Worker []> { 590*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 591*9880d681SAndroid Build Coastguard Worker let Inst{5} = 0; 592*9880d681SAndroid Build Coastguard Worker} 593*9880d681SAndroid Build Coastguard Worker 594*9880d681SAndroid Build Coastguard Worker// FIXME: Verify encoding after integrated assembler is working. 595*9880d681SAndroid Build Coastguard Workerdef VCMPZD : ADuI<0b11101, 0b11, 0b0101, 0b01, 0, 596*9880d681SAndroid Build Coastguard Worker (outs), (ins DPR:$Dd), 597*9880d681SAndroid Build Coastguard Worker IIC_fpCMP64, "vcmp", ".f64\t$Dd, #0", 598*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]> { 599*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 600*9880d681SAndroid Build Coastguard Worker let Inst{5} = 0; 601*9880d681SAndroid Build Coastguard Worker} 602*9880d681SAndroid Build Coastguard Worker 603*9880d681SAndroid Build Coastguard Workerdef VCMPZS : ASuI<0b11101, 0b11, 0b0101, 0b01, 0, 604*9880d681SAndroid Build Coastguard Worker (outs), (ins SPR:$Sd), 605*9880d681SAndroid Build Coastguard Worker IIC_fpCMP32, "vcmp", ".f32\t$Sd, #0", 606*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]> { 607*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 608*9880d681SAndroid Build Coastguard Worker let Inst{5} = 0; 609*9880d681SAndroid Build Coastguard Worker 610*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 611*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 612*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 613*9880d681SAndroid Build Coastguard Worker} 614*9880d681SAndroid Build Coastguard Worker 615*9880d681SAndroid Build Coastguard Workerdef VCMPZH : AHuI<0b11101, 0b11, 0b0101, 0b01, 0, 616*9880d681SAndroid Build Coastguard Worker (outs), (ins SPR:$Sd), 617*9880d681SAndroid Build Coastguard Worker IIC_fpCMP16, "vcmp", ".f16\t$Sd, #0", 618*9880d681SAndroid Build Coastguard Worker []> { 619*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 620*9880d681SAndroid Build Coastguard Worker let Inst{5} = 0; 621*9880d681SAndroid Build Coastguard Worker} 622*9880d681SAndroid Build Coastguard Worker} // Defs = [FPSCR_NZCV] 623*9880d681SAndroid Build Coastguard Worker 624*9880d681SAndroid Build Coastguard Workerdef VCVTDS : ASuI<0b11101, 0b11, 0b0111, 0b11, 0, 625*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins SPR:$Sm), 626*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDS, "vcvt", ".f64.f32\t$Dd, $Sm", 627*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fextend SPR:$Sm))]> { 628*9880d681SAndroid Build Coastguard Worker // Instruction operands. 629*9880d681SAndroid Build Coastguard Worker bits<5> Dd; 630*9880d681SAndroid Build Coastguard Worker bits<5> Sm; 631*9880d681SAndroid Build Coastguard Worker 632*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 633*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Sm{4-1}; 634*9880d681SAndroid Build Coastguard Worker let Inst{5} = Sm{0}; 635*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Dd{3-0}; 636*9880d681SAndroid Build Coastguard Worker let Inst{22} = Dd{4}; 637*9880d681SAndroid Build Coastguard Worker 638*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVFP2, HasDPVFP]; 639*9880d681SAndroid Build Coastguard Worker} 640*9880d681SAndroid Build Coastguard Worker 641*9880d681SAndroid Build Coastguard Worker// Special case encoding: bits 11-8 is 0b1011. 642*9880d681SAndroid Build Coastguard Workerdef VCVTSD : VFPAI<(outs SPR:$Sd), (ins DPR:$Dm), VFPUnaryFrm, 643*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSD, "vcvt", ".f32.f64\t$Sd, $Dm", 644*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fround DPR:$Dm))]> { 645*9880d681SAndroid Build Coastguard Worker // Instruction operands. 646*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 647*9880d681SAndroid Build Coastguard Worker bits<5> Dm; 648*9880d681SAndroid Build Coastguard Worker 649*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 650*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Dm{3-0}; 651*9880d681SAndroid Build Coastguard Worker let Inst{5} = Dm{4}; 652*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 653*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 654*9880d681SAndroid Build Coastguard Worker 655*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b11101; 656*9880d681SAndroid Build Coastguard Worker let Inst{21-16} = 0b110111; 657*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = 0b1011; 658*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = 0b11; 659*9880d681SAndroid Build Coastguard Worker let Inst{4} = 0; 660*9880d681SAndroid Build Coastguard Worker 661*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVFP2, HasDPVFP]; 662*9880d681SAndroid Build Coastguard Worker} 663*9880d681SAndroid Build Coastguard Worker 664*9880d681SAndroid Build Coastguard Worker// Between half, single and double-precision. For disassembly only. 665*9880d681SAndroid Build Coastguard Worker 666*9880d681SAndroid Build Coastguard Worker// FIXME: Verify encoding after integrated assembler is working. 667*9880d681SAndroid Build Coastguard Workerdef VCVTBHS: ASuI<0b11101, 0b11, 0b0010, 0b01, 0, (outs SPR:$Sd), (ins SPR:$Sm), 668*9880d681SAndroid Build Coastguard Worker /* FIXME */ IIC_fpCVTSH, "vcvtb", ".f32.f16\t$Sd, $Sm", 669*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]>, 670*9880d681SAndroid Build Coastguard Worker Requires<[HasFP16]>; 671*9880d681SAndroid Build Coastguard Worker 672*9880d681SAndroid Build Coastguard Workerdef VCVTBSH: ASuI<0b11101, 0b11, 0b0011, 0b01, 0, (outs SPR:$Sd), (ins SPR:$Sm), 673*9880d681SAndroid Build Coastguard Worker /* FIXME */ IIC_fpCVTHS, "vcvtb", ".f16.f32\t$Sd, $Sm", 674*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]>, 675*9880d681SAndroid Build Coastguard Worker Requires<[HasFP16]>; 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Workerdef VCVTTHS: ASuI<0b11101, 0b11, 0b0010, 0b11, 0, (outs SPR:$Sd), (ins SPR:$Sm), 678*9880d681SAndroid Build Coastguard Worker /* FIXME */ IIC_fpCVTSH, "vcvtt", ".f32.f16\t$Sd, $Sm", 679*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]>, 680*9880d681SAndroid Build Coastguard Worker Requires<[HasFP16]>; 681*9880d681SAndroid Build Coastguard Worker 682*9880d681SAndroid Build Coastguard Workerdef VCVTTSH: ASuI<0b11101, 0b11, 0b0011, 0b11, 0, (outs SPR:$Sd), (ins SPR:$Sm), 683*9880d681SAndroid Build Coastguard Worker /* FIXME */ IIC_fpCVTHS, "vcvtt", ".f16.f32\t$Sd, $Sm", 684*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]>, 685*9880d681SAndroid Build Coastguard Worker Requires<[HasFP16]>; 686*9880d681SAndroid Build Coastguard Worker 687*9880d681SAndroid Build Coastguard Workerdef VCVTBHD : ADuI<0b11101, 0b11, 0b0010, 0b01, 0, 688*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins SPR:$Sm), 689*9880d681SAndroid Build Coastguard Worker NoItinerary, "vcvtb", ".f64.f16\t$Dd, $Sm", 690*9880d681SAndroid Build Coastguard Worker []>, Requires<[HasFPARMv8, HasDPVFP]> { 691*9880d681SAndroid Build Coastguard Worker // Instruction operands. 692*9880d681SAndroid Build Coastguard Worker bits<5> Sm; 693*9880d681SAndroid Build Coastguard Worker 694*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 695*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Sm{4-1}; 696*9880d681SAndroid Build Coastguard Worker let Inst{5} = Sm{0}; 697*9880d681SAndroid Build Coastguard Worker} 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Workerdef VCVTBDH : ADuI<0b11101, 0b11, 0b0011, 0b01, 0, 700*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins DPR:$Dm), 701*9880d681SAndroid Build Coastguard Worker NoItinerary, "vcvtb", ".f16.f64\t$Sd, $Dm", 702*9880d681SAndroid Build Coastguard Worker []>, Requires<[HasFPARMv8, HasDPVFP]> { 703*9880d681SAndroid Build Coastguard Worker // Instruction operands. 704*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 705*9880d681SAndroid Build Coastguard Worker bits<5> Dm; 706*9880d681SAndroid Build Coastguard Worker 707*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 708*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Dm{3-0}; 709*9880d681SAndroid Build Coastguard Worker let Inst{5} = Dm{4}; 710*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 711*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 712*9880d681SAndroid Build Coastguard Worker} 713*9880d681SAndroid Build Coastguard Worker 714*9880d681SAndroid Build Coastguard Workerdef VCVTTHD : ADuI<0b11101, 0b11, 0b0010, 0b11, 0, 715*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins SPR:$Sm), 716*9880d681SAndroid Build Coastguard Worker NoItinerary, "vcvtt", ".f64.f16\t$Dd, $Sm", 717*9880d681SAndroid Build Coastguard Worker []>, Requires<[HasFPARMv8, HasDPVFP]> { 718*9880d681SAndroid Build Coastguard Worker // Instruction operands. 719*9880d681SAndroid Build Coastguard Worker bits<5> Sm; 720*9880d681SAndroid Build Coastguard Worker 721*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 722*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Sm{4-1}; 723*9880d681SAndroid Build Coastguard Worker let Inst{5} = Sm{0}; 724*9880d681SAndroid Build Coastguard Worker} 725*9880d681SAndroid Build Coastguard Worker 726*9880d681SAndroid Build Coastguard Workerdef VCVTTDH : ADuI<0b11101, 0b11, 0b0011, 0b11, 0, 727*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins DPR:$Dm), 728*9880d681SAndroid Build Coastguard Worker NoItinerary, "vcvtt", ".f16.f64\t$Sd, $Dm", 729*9880d681SAndroid Build Coastguard Worker []>, Requires<[HasFPARMv8, HasDPVFP]> { 730*9880d681SAndroid Build Coastguard Worker // Instruction operands. 731*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 732*9880d681SAndroid Build Coastguard Worker bits<5> Dm; 733*9880d681SAndroid Build Coastguard Worker 734*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 735*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 736*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 737*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Dm{3-0}; 738*9880d681SAndroid Build Coastguard Worker let Inst{5} = Dm{4}; 739*9880d681SAndroid Build Coastguard Worker} 740*9880d681SAndroid Build Coastguard Worker 741*9880d681SAndroid Build Coastguard Workerdef : Pat<(fp_to_f16 SPR:$a), 742*9880d681SAndroid Build Coastguard Worker (i32 (COPY_TO_REGCLASS (VCVTBSH SPR:$a), GPR))>; 743*9880d681SAndroid Build Coastguard Worker 744*9880d681SAndroid Build Coastguard Workerdef : Pat<(fp_to_f16 (f64 DPR:$a)), 745*9880d681SAndroid Build Coastguard Worker (i32 (COPY_TO_REGCLASS (VCVTBDH DPR:$a), GPR))>; 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Workerdef : Pat<(f16_to_fp GPR:$a), 748*9880d681SAndroid Build Coastguard Worker (VCVTBHS (COPY_TO_REGCLASS GPR:$a, SPR))>; 749*9880d681SAndroid Build Coastguard Worker 750*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (f16_to_fp GPR:$a)), 751*9880d681SAndroid Build Coastguard Worker (VCVTBHD (COPY_TO_REGCLASS GPR:$a, SPR))>; 752*9880d681SAndroid Build Coastguard Worker 753*9880d681SAndroid Build Coastguard Workermulticlass vcvt_inst<string opc, bits<2> rm, 754*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag> { 755*9880d681SAndroid Build Coastguard Worker let PostEncoderMethod = "", DecoderNamespace = "VFPV8" in { 756*9880d681SAndroid Build Coastguard Worker def SH : AHuInp<0b11101, 0b11, 0b1100, 0b11, 0, 757*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 758*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vcvt", opc, ".s32.f16\t$Sd, $Sm"), 759*9880d681SAndroid Build Coastguard Worker []>, 760*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]> { 761*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 762*9880d681SAndroid Build Coastguard Worker } 763*9880d681SAndroid Build Coastguard Worker 764*9880d681SAndroid Build Coastguard Worker def UH : AHuInp<0b11101, 0b11, 0b1100, 0b01, 0, 765*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 766*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vcvt", opc, ".u32.f16\t$Sd, $Sm"), 767*9880d681SAndroid Build Coastguard Worker []>, 768*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]> { 769*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 770*9880d681SAndroid Build Coastguard Worker } 771*9880d681SAndroid Build Coastguard Worker 772*9880d681SAndroid Build Coastguard Worker def SS : ASuInp<0b11101, 0b11, 0b1100, 0b11, 0, 773*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 774*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vcvt", opc, ".s32.f32\t$Sd, $Sm"), 775*9880d681SAndroid Build Coastguard Worker []>, 776*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8]> { 777*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 778*9880d681SAndroid Build Coastguard Worker } 779*9880d681SAndroid Build Coastguard Worker 780*9880d681SAndroid Build Coastguard Worker def US : ASuInp<0b11101, 0b11, 0b1100, 0b01, 0, 781*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 782*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vcvt", opc, ".u32.f32\t$Sd, $Sm"), 783*9880d681SAndroid Build Coastguard Worker []>, 784*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8]> { 785*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 786*9880d681SAndroid Build Coastguard Worker } 787*9880d681SAndroid Build Coastguard Worker 788*9880d681SAndroid Build Coastguard Worker def SD : ASuInp<0b11101, 0b11, 0b1100, 0b11, 0, 789*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins DPR:$Dm), 790*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vcvt", opc, ".s32.f64\t$Sd, $Dm"), 791*9880d681SAndroid Build Coastguard Worker []>, 792*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8, HasDPVFP]> { 793*9880d681SAndroid Build Coastguard Worker bits<5> Dm; 794*9880d681SAndroid Build Coastguard Worker 795*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 796*9880d681SAndroid Build Coastguard Worker 797*9880d681SAndroid Build Coastguard Worker // Encode instruction operands 798*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Dm{3-0}; 799*9880d681SAndroid Build Coastguard Worker let Inst{5} = Dm{4}; 800*9880d681SAndroid Build Coastguard Worker let Inst{8} = 1; 801*9880d681SAndroid Build Coastguard Worker } 802*9880d681SAndroid Build Coastguard Worker 803*9880d681SAndroid Build Coastguard Worker def UD : ASuInp<0b11101, 0b11, 0b1100, 0b01, 0, 804*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins DPR:$Dm), 805*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vcvt", opc, ".u32.f64\t$Sd, $Dm"), 806*9880d681SAndroid Build Coastguard Worker []>, 807*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8, HasDPVFP]> { 808*9880d681SAndroid Build Coastguard Worker bits<5> Dm; 809*9880d681SAndroid Build Coastguard Worker 810*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 811*9880d681SAndroid Build Coastguard Worker 812*9880d681SAndroid Build Coastguard Worker // Encode instruction operands 813*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Dm{3-0}; 814*9880d681SAndroid Build Coastguard Worker let Inst{5} = Dm{4}; 815*9880d681SAndroid Build Coastguard Worker let Inst{8} = 1; 816*9880d681SAndroid Build Coastguard Worker } 817*9880d681SAndroid Build Coastguard Worker } 818*9880d681SAndroid Build Coastguard Worker 819*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFPARMv8] in { 820*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (fp_to_sint (node SPR:$a))), 821*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS 822*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"SS") SPR:$a), 823*9880d681SAndroid Build Coastguard Worker GPR)>; 824*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (fp_to_uint (node SPR:$a))), 825*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS 826*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"US") SPR:$a), 827*9880d681SAndroid Build Coastguard Worker GPR)>; 828*9880d681SAndroid Build Coastguard Worker } 829*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFPARMv8, HasDPVFP] in { 830*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (fp_to_sint (node (f64 DPR:$a)))), 831*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS 832*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"SD") DPR:$a), 833*9880d681SAndroid Build Coastguard Worker GPR)>; 834*9880d681SAndroid Build Coastguard Worker def : Pat<(i32 (fp_to_uint (node (f64 DPR:$a)))), 835*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS 836*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"UD") DPR:$a), 837*9880d681SAndroid Build Coastguard Worker GPR)>; 838*9880d681SAndroid Build Coastguard Worker } 839*9880d681SAndroid Build Coastguard Worker} 840*9880d681SAndroid Build Coastguard Worker 841*9880d681SAndroid Build Coastguard Workerdefm VCVTA : vcvt_inst<"a", 0b00, frnd>; 842*9880d681SAndroid Build Coastguard Workerdefm VCVTN : vcvt_inst<"n", 0b01>; 843*9880d681SAndroid Build Coastguard Workerdefm VCVTP : vcvt_inst<"p", 0b10, fceil>; 844*9880d681SAndroid Build Coastguard Workerdefm VCVTM : vcvt_inst<"m", 0b11, ffloor>; 845*9880d681SAndroid Build Coastguard Worker 846*9880d681SAndroid Build Coastguard Workerdef VNEGD : ADuI<0b11101, 0b11, 0b0001, 0b01, 0, 847*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dm), 848*9880d681SAndroid Build Coastguard Worker IIC_fpUNA64, "vneg", ".f64\t$Dd, $Dm", 849*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fneg (f64 DPR:$Dm)))]>; 850*9880d681SAndroid Build Coastguard Worker 851*9880d681SAndroid Build Coastguard Workerdef VNEGS : ASuIn<0b11101, 0b11, 0b0001, 0b01, 0, 852*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 853*9880d681SAndroid Build Coastguard Worker IIC_fpUNA32, "vneg", ".f32\t$Sd, $Sm", 854*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fneg SPR:$Sm))]> { 855*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 856*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 857*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 858*9880d681SAndroid Build Coastguard Worker} 859*9880d681SAndroid Build Coastguard Worker 860*9880d681SAndroid Build Coastguard Workerdef VNEGH : AHuI<0b11101, 0b11, 0b0001, 0b01, 0, 861*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 862*9880d681SAndroid Build Coastguard Worker IIC_fpUNA16, "vneg", ".f16\t$Sd, $Sm", 863*9880d681SAndroid Build Coastguard Worker []>; 864*9880d681SAndroid Build Coastguard Worker 865*9880d681SAndroid Build Coastguard Workermulticlass vrint_inst_zrx<string opc, bit op, bit op2, SDPatternOperator node> { 866*9880d681SAndroid Build Coastguard Worker def H : AHuI<0b11101, 0b11, 0b0110, 0b11, 0, 867*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 868*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vrint", opc), ".f16\t$Sd, $Sm", 869*9880d681SAndroid Build Coastguard Worker []>, 870*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]> { 871*9880d681SAndroid Build Coastguard Worker let Inst{7} = op2; 872*9880d681SAndroid Build Coastguard Worker let Inst{16} = op; 873*9880d681SAndroid Build Coastguard Worker } 874*9880d681SAndroid Build Coastguard Worker 875*9880d681SAndroid Build Coastguard Worker def S : ASuI<0b11101, 0b11, 0b0110, 0b11, 0, 876*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 877*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vrint", opc), ".f32\t$Sd, $Sm", 878*9880d681SAndroid Build Coastguard Worker [(set (f32 SPR:$Sd), (node (f32 SPR:$Sm)))]>, 879*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8]> { 880*9880d681SAndroid Build Coastguard Worker let Inst{7} = op2; 881*9880d681SAndroid Build Coastguard Worker let Inst{16} = op; 882*9880d681SAndroid Build Coastguard Worker } 883*9880d681SAndroid Build Coastguard Worker def D : ADuI<0b11101, 0b11, 0b0110, 0b11, 0, 884*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dm), 885*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vrint", opc), ".f64\t$Dd, $Dm", 886*9880d681SAndroid Build Coastguard Worker [(set (f64 DPR:$Dd), (node (f64 DPR:$Dm)))]>, 887*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8, HasDPVFP]> { 888*9880d681SAndroid Build Coastguard Worker let Inst{7} = op2; 889*9880d681SAndroid Build Coastguard Worker let Inst{16} = op; 890*9880d681SAndroid Build Coastguard Worker } 891*9880d681SAndroid Build Coastguard Worker 892*9880d681SAndroid Build Coastguard Worker def : InstAlias<!strconcat("vrint", opc, "$p.f16.f16\t$Sd, $Sm"), 893*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"H") SPR:$Sd, SPR:$Sm, pred:$p), 0>, 894*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 895*9880d681SAndroid Build Coastguard Worker def : InstAlias<!strconcat("vrint", opc, "$p.f32.f32\t$Sd, $Sm"), 896*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"S") SPR:$Sd, SPR:$Sm, pred:$p), 0>, 897*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8]>; 898*9880d681SAndroid Build Coastguard Worker def : InstAlias<!strconcat("vrint", opc, "$p.f64.f64\t$Dd, $Dm"), 899*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"D") DPR:$Dd, DPR:$Dm, pred:$p), 0>, 900*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8,HasDPVFP]>; 901*9880d681SAndroid Build Coastguard Worker} 902*9880d681SAndroid Build Coastguard Worker 903*9880d681SAndroid Build Coastguard Workerdefm VRINTZ : vrint_inst_zrx<"z", 0, 1, ftrunc>; 904*9880d681SAndroid Build Coastguard Workerdefm VRINTR : vrint_inst_zrx<"r", 0, 0, fnearbyint>; 905*9880d681SAndroid Build Coastguard Workerdefm VRINTX : vrint_inst_zrx<"x", 1, 0, frint>; 906*9880d681SAndroid Build Coastguard Worker 907*9880d681SAndroid Build Coastguard Workermulticlass vrint_inst_anpm<string opc, bits<2> rm, 908*9880d681SAndroid Build Coastguard Worker SDPatternOperator node = null_frag> { 909*9880d681SAndroid Build Coastguard Worker let PostEncoderMethod = "", DecoderNamespace = "VFPV8" in { 910*9880d681SAndroid Build Coastguard Worker def H : AHuInp<0b11101, 0b11, 0b1000, 0b01, 0, 911*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 912*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vrint", opc, ".f16\t$Sd, $Sm"), 913*9880d681SAndroid Build Coastguard Worker []>, 914*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]> { 915*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 916*9880d681SAndroid Build Coastguard Worker } 917*9880d681SAndroid Build Coastguard Worker def S : ASuInp<0b11101, 0b11, 0b1000, 0b01, 0, 918*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 919*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vrint", opc, ".f32\t$Sd, $Sm"), 920*9880d681SAndroid Build Coastguard Worker [(set (f32 SPR:$Sd), (node (f32 SPR:$Sm)))]>, 921*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8]> { 922*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 923*9880d681SAndroid Build Coastguard Worker } 924*9880d681SAndroid Build Coastguard Worker def D : ADuInp<0b11101, 0b11, 0b1000, 0b01, 0, 925*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dm), 926*9880d681SAndroid Build Coastguard Worker NoItinerary, !strconcat("vrint", opc, ".f64\t$Dd, $Dm"), 927*9880d681SAndroid Build Coastguard Worker [(set (f64 DPR:$Dd), (node (f64 DPR:$Dm)))]>, 928*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8, HasDPVFP]> { 929*9880d681SAndroid Build Coastguard Worker let Inst{17-16} = rm; 930*9880d681SAndroid Build Coastguard Worker } 931*9880d681SAndroid Build Coastguard Worker } 932*9880d681SAndroid Build Coastguard Worker 933*9880d681SAndroid Build Coastguard Worker def : InstAlias<!strconcat("vrint", opc, ".f32.f32\t$Sd, $Sm"), 934*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"S") SPR:$Sd, SPR:$Sm), 0>, 935*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8]>; 936*9880d681SAndroid Build Coastguard Worker def : InstAlias<!strconcat("vrint", opc, ".f64.f64\t$Dd, $Dm"), 937*9880d681SAndroid Build Coastguard Worker (!cast<Instruction>(NAME#"D") DPR:$Dd, DPR:$Dm), 0>, 938*9880d681SAndroid Build Coastguard Worker Requires<[HasFPARMv8,HasDPVFP]>; 939*9880d681SAndroid Build Coastguard Worker} 940*9880d681SAndroid Build Coastguard Worker 941*9880d681SAndroid Build Coastguard Workerdefm VRINTA : vrint_inst_anpm<"a", 0b00, frnd>; 942*9880d681SAndroid Build Coastguard Workerdefm VRINTN : vrint_inst_anpm<"n", 0b01>; 943*9880d681SAndroid Build Coastguard Workerdefm VRINTP : vrint_inst_anpm<"p", 0b10, fceil>; 944*9880d681SAndroid Build Coastguard Workerdefm VRINTM : vrint_inst_anpm<"m", 0b11, ffloor>; 945*9880d681SAndroid Build Coastguard Worker 946*9880d681SAndroid Build Coastguard Workerdef VSQRTD : ADuI<0b11101, 0b11, 0b0001, 0b11, 0, 947*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dm), 948*9880d681SAndroid Build Coastguard Worker IIC_fpSQRT64, "vsqrt", ".f64\t$Dd, $Dm", 949*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fsqrt (f64 DPR:$Dm)))]>; 950*9880d681SAndroid Build Coastguard Worker 951*9880d681SAndroid Build Coastguard Workerdef VSQRTS : ASuI<0b11101, 0b11, 0b0001, 0b11, 0, 952*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 953*9880d681SAndroid Build Coastguard Worker IIC_fpSQRT32, "vsqrt", ".f32\t$Sd, $Sm", 954*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fsqrt SPR:$Sm))]>; 955*9880d681SAndroid Build Coastguard Worker 956*9880d681SAndroid Build Coastguard Workerdef VSQRTH : AHuI<0b11101, 0b11, 0b0001, 0b11, 0, 957*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 958*9880d681SAndroid Build Coastguard Worker IIC_fpSQRT16, "vsqrt", ".f16\t$Sd, $Sm", 959*9880d681SAndroid Build Coastguard Worker []>; 960*9880d681SAndroid Build Coastguard Worker 961*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 962*9880d681SAndroid Build Coastguard Workerdef VMOVD : ADuI<0b11101, 0b11, 0b0000, 0b01, 0, 963*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Dm), 964*9880d681SAndroid Build Coastguard Worker IIC_fpUNA64, "vmov", ".f64\t$Dd, $Dm", []>; 965*9880d681SAndroid Build Coastguard Worker 966*9880d681SAndroid Build Coastguard Workerdef VMOVS : ASuI<0b11101, 0b11, 0b0000, 0b01, 0, 967*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 968*9880d681SAndroid Build Coastguard Worker IIC_fpUNA32, "vmov", ".f32\t$Sd, $Sm", []>; 969*9880d681SAndroid Build Coastguard Worker 970*9880d681SAndroid Build Coastguard Workerlet PostEncoderMethod = "", DecoderNamespace = "VFPV8" in { 971*9880d681SAndroid Build Coastguard Workerdef VMOVH : ASuInp<0b11101, 0b11, 0b0000, 0b01, 0, 972*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 973*9880d681SAndroid Build Coastguard Worker IIC_fpUNA16, "vmovx.f16\t$Sd, $Sm", []>, 974*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 975*9880d681SAndroid Build Coastguard Worker 976*9880d681SAndroid Build Coastguard Workerdef VINSH : ASuInp<0b11101, 0b11, 0b0000, 0b11, 0, 977*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 978*9880d681SAndroid Build Coastguard Worker IIC_fpUNA16, "vins.f16\t$Sd, $Sm", []>, 979*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 980*9880d681SAndroid Build Coastguard Worker} // PostEncoderMethod 981*9880d681SAndroid Build Coastguard Worker} // hasSideEffects 982*9880d681SAndroid Build Coastguard Worker 983*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 984*9880d681SAndroid Build Coastguard Worker// FP <-> GPR Copies. Int <-> FP Conversions. 985*9880d681SAndroid Build Coastguard Worker// 986*9880d681SAndroid Build Coastguard Worker 987*9880d681SAndroid Build Coastguard Workerdef VMOVRS : AVConv2I<0b11100001, 0b1010, 988*9880d681SAndroid Build Coastguard Worker (outs GPR:$Rt), (ins SPR:$Sn), 989*9880d681SAndroid Build Coastguard Worker IIC_fpMOVSI, "vmov", "\t$Rt, $Sn", 990*9880d681SAndroid Build Coastguard Worker [(set GPR:$Rt, (bitconvert SPR:$Sn))]> { 991*9880d681SAndroid Build Coastguard Worker // Instruction operands. 992*9880d681SAndroid Build Coastguard Worker bits<4> Rt; 993*9880d681SAndroid Build Coastguard Worker bits<5> Sn; 994*9880d681SAndroid Build Coastguard Worker 995*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 996*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = Sn{4-1}; 997*9880d681SAndroid Build Coastguard Worker let Inst{7} = Sn{0}; 998*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Rt; 999*9880d681SAndroid Build Coastguard Worker 1000*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = 0b00; 1001*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 1002*9880d681SAndroid Build Coastguard Worker 1003*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and VFP 1004*9880d681SAndroid Build Coastguard Worker // pipelines. 1005*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 1006*9880d681SAndroid Build Coastguard Worker} 1007*9880d681SAndroid Build Coastguard Worker 1008*9880d681SAndroid Build Coastguard Worker// Bitcast i32 -> f32. NEON prefers to use VMOVDRR. 1009*9880d681SAndroid Build Coastguard Workerdef VMOVSR : AVConv4I<0b11100000, 0b1010, 1010*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sn), (ins GPR:$Rt), 1011*9880d681SAndroid Build Coastguard Worker IIC_fpMOVIS, "vmov", "\t$Sn, $Rt", 1012*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sn, (bitconvert GPR:$Rt))]>, 1013*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2, UseVMOVSR]> { 1014*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1015*9880d681SAndroid Build Coastguard Worker bits<5> Sn; 1016*9880d681SAndroid Build Coastguard Worker bits<4> Rt; 1017*9880d681SAndroid Build Coastguard Worker 1018*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1019*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = Sn{4-1}; 1020*9880d681SAndroid Build Coastguard Worker let Inst{7} = Sn{0}; 1021*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Rt; 1022*9880d681SAndroid Build Coastguard Worker 1023*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = 0b00; 1024*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 1025*9880d681SAndroid Build Coastguard Worker 1026*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and VFP 1027*9880d681SAndroid Build Coastguard Worker // pipelines. 1028*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 1029*9880d681SAndroid Build Coastguard Worker} 1030*9880d681SAndroid Build Coastguard Worker 1031*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 1032*9880d681SAndroid Build Coastguard Workerdef VMOVRRD : AVConv3I<0b11000101, 0b1011, 1033*9880d681SAndroid Build Coastguard Worker (outs GPR:$Rt, GPR:$Rt2), (ins DPR:$Dm), 1034*9880d681SAndroid Build Coastguard Worker IIC_fpMOVDI, "vmov", "\t$Rt, $Rt2, $Dm", 1035*9880d681SAndroid Build Coastguard Worker [/* FIXME: Can't write pattern for multiple result instr*/]> { 1036*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1037*9880d681SAndroid Build Coastguard Worker bits<5> Dm; 1038*9880d681SAndroid Build Coastguard Worker bits<4> Rt; 1039*9880d681SAndroid Build Coastguard Worker bits<4> Rt2; 1040*9880d681SAndroid Build Coastguard Worker 1041*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1042*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Dm{3-0}; 1043*9880d681SAndroid Build Coastguard Worker let Inst{5} = Dm{4}; 1044*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Rt; 1045*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = Rt2; 1046*9880d681SAndroid Build Coastguard Worker 1047*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = 0b00; 1048*9880d681SAndroid Build Coastguard Worker 1049*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and VFP 1050*9880d681SAndroid Build Coastguard Worker // pipelines. 1051*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 1052*9880d681SAndroid Build Coastguard Worker 1053*9880d681SAndroid Build Coastguard Worker // This instruction is equivalent to 1054*9880d681SAndroid Build Coastguard Worker // $Rt = EXTRACT_SUBREG $Dm, ssub_0 1055*9880d681SAndroid Build Coastguard Worker // $Rt2 = EXTRACT_SUBREG $Dm, ssub_1 1056*9880d681SAndroid Build Coastguard Worker let isExtractSubreg = 1; 1057*9880d681SAndroid Build Coastguard Worker} 1058*9880d681SAndroid Build Coastguard Worker 1059*9880d681SAndroid Build Coastguard Workerdef VMOVRRS : AVConv3I<0b11000101, 0b1010, 1060*9880d681SAndroid Build Coastguard Worker (outs GPR:$Rt, GPR:$Rt2), (ins SPR:$src1, SPR:$src2), 1061*9880d681SAndroid Build Coastguard Worker IIC_fpMOVDI, "vmov", "\t$Rt, $Rt2, $src1, $src2", 1062*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]> { 1063*9880d681SAndroid Build Coastguard Worker bits<5> src1; 1064*9880d681SAndroid Build Coastguard Worker bits<4> Rt; 1065*9880d681SAndroid Build Coastguard Worker bits<4> Rt2; 1066*9880d681SAndroid Build Coastguard Worker 1067*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1068*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = src1{4-1}; 1069*9880d681SAndroid Build Coastguard Worker let Inst{5} = src1{0}; 1070*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Rt; 1071*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = Rt2; 1072*9880d681SAndroid Build Coastguard Worker 1073*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = 0b00; 1074*9880d681SAndroid Build Coastguard Worker 1075*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and VFP 1076*9880d681SAndroid Build Coastguard Worker // pipelines. 1077*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 1078*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVMOVRRS"; 1079*9880d681SAndroid Build Coastguard Worker} 1080*9880d681SAndroid Build Coastguard Worker} // hasSideEffects 1081*9880d681SAndroid Build Coastguard Worker 1082*9880d681SAndroid Build Coastguard Worker// FMDHR: GPR -> SPR 1083*9880d681SAndroid Build Coastguard Worker// FMDLR: GPR -> SPR 1084*9880d681SAndroid Build Coastguard Worker 1085*9880d681SAndroid Build Coastguard Workerdef VMOVDRR : AVConv5I<0b11000100, 0b1011, 1086*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dm), (ins GPR:$Rt, GPR:$Rt2), 1087*9880d681SAndroid Build Coastguard Worker IIC_fpMOVID, "vmov", "\t$Dm, $Rt, $Rt2", 1088*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dm, (arm_fmdrr GPR:$Rt, GPR:$Rt2))]> { 1089*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1090*9880d681SAndroid Build Coastguard Worker bits<5> Dm; 1091*9880d681SAndroid Build Coastguard Worker bits<4> Rt; 1092*9880d681SAndroid Build Coastguard Worker bits<4> Rt2; 1093*9880d681SAndroid Build Coastguard Worker 1094*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1095*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Dm{3-0}; 1096*9880d681SAndroid Build Coastguard Worker let Inst{5} = Dm{4}; 1097*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Rt; 1098*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = Rt2; 1099*9880d681SAndroid Build Coastguard Worker 1100*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = 0b00; 1101*9880d681SAndroid Build Coastguard Worker 1102*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and VFP 1103*9880d681SAndroid Build Coastguard Worker // pipelines. 1104*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 1105*9880d681SAndroid Build Coastguard Worker 1106*9880d681SAndroid Build Coastguard Worker // This instruction is equivalent to 1107*9880d681SAndroid Build Coastguard Worker // $Dm = REG_SEQUENCE $Rt, ssub_0, $Rt2, ssub_1 1108*9880d681SAndroid Build Coastguard Worker let isRegSequence = 1; 1109*9880d681SAndroid Build Coastguard Worker} 1110*9880d681SAndroid Build Coastguard Worker 1111*9880d681SAndroid Build Coastguard Worker// Hoist an fabs or a fneg of a value coming from integer registers 1112*9880d681SAndroid Build Coastguard Worker// and do the fabs/fneg on the integer value. This is never a lose 1113*9880d681SAndroid Build Coastguard Worker// and could enable the conversion to float to be removed completely. 1114*9880d681SAndroid Build Coastguard Workerdef : Pat<(fabs (arm_fmdrr GPR:$Rl, GPR:$Rh)), 1115*9880d681SAndroid Build Coastguard Worker (VMOVDRR GPR:$Rl, (BFC GPR:$Rh, (i32 0x7FFFFFFF)))>, 1116*9880d681SAndroid Build Coastguard Worker Requires<[IsARM, HasV6T2]>; 1117*9880d681SAndroid Build Coastguard Workerdef : Pat<(fabs (arm_fmdrr GPR:$Rl, GPR:$Rh)), 1118*9880d681SAndroid Build Coastguard Worker (VMOVDRR GPR:$Rl, (t2BFC GPR:$Rh, (i32 0x7FFFFFFF)))>, 1119*9880d681SAndroid Build Coastguard Worker Requires<[IsThumb2, HasV6T2]>; 1120*9880d681SAndroid Build Coastguard Workerdef : Pat<(fneg (arm_fmdrr GPR:$Rl, GPR:$Rh)), 1121*9880d681SAndroid Build Coastguard Worker (VMOVDRR GPR:$Rl, (EORri GPR:$Rh, (i32 0x80000000)))>, 1122*9880d681SAndroid Build Coastguard Worker Requires<[IsARM]>; 1123*9880d681SAndroid Build Coastguard Workerdef : Pat<(fneg (arm_fmdrr GPR:$Rl, GPR:$Rh)), 1124*9880d681SAndroid Build Coastguard Worker (VMOVDRR GPR:$Rl, (t2EORri GPR:$Rh, (i32 0x80000000)))>, 1125*9880d681SAndroid Build Coastguard Worker Requires<[IsThumb2]>; 1126*9880d681SAndroid Build Coastguard Worker 1127*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in 1128*9880d681SAndroid Build Coastguard Workerdef VMOVSRR : AVConv5I<0b11000100, 0b1010, 1129*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst1, SPR:$dst2), (ins GPR:$src1, GPR:$src2), 1130*9880d681SAndroid Build Coastguard Worker IIC_fpMOVID, "vmov", "\t$dst1, $dst2, $src1, $src2", 1131*9880d681SAndroid Build Coastguard Worker [/* For disassembly only; pattern left blank */]> { 1132*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1133*9880d681SAndroid Build Coastguard Worker bits<5> dst1; 1134*9880d681SAndroid Build Coastguard Worker bits<4> src1; 1135*9880d681SAndroid Build Coastguard Worker bits<4> src2; 1136*9880d681SAndroid Build Coastguard Worker 1137*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1138*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = dst1{4-1}; 1139*9880d681SAndroid Build Coastguard Worker let Inst{5} = dst1{0}; 1140*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = src1; 1141*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = src2; 1142*9880d681SAndroid Build Coastguard Worker 1143*9880d681SAndroid Build Coastguard Worker let Inst{7-6} = 0b00; 1144*9880d681SAndroid Build Coastguard Worker 1145*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and VFP 1146*9880d681SAndroid Build Coastguard Worker // pipelines. 1147*9880d681SAndroid Build Coastguard Worker let D = VFPNeonDomain; 1148*9880d681SAndroid Build Coastguard Worker 1149*9880d681SAndroid Build Coastguard Worker let DecoderMethod = "DecodeVMOVSRR"; 1150*9880d681SAndroid Build Coastguard Worker} 1151*9880d681SAndroid Build Coastguard Worker 1152*9880d681SAndroid Build Coastguard Worker// Move H->R, clearing top 16 bits 1153*9880d681SAndroid Build Coastguard Workerdef VMOVRH : AVConv2I<0b11100001, 0b1001, 1154*9880d681SAndroid Build Coastguard Worker (outs GPR:$Rt), (ins SPR:$Sn), 1155*9880d681SAndroid Build Coastguard Worker IIC_fpMOVSI, "vmov", ".f16\t$Rt, $Sn", 1156*9880d681SAndroid Build Coastguard Worker []>, 1157*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]> { 1158*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1159*9880d681SAndroid Build Coastguard Worker bits<4> Rt; 1160*9880d681SAndroid Build Coastguard Worker bits<5> Sn; 1161*9880d681SAndroid Build Coastguard Worker 1162*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1163*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = Sn{4-1}; 1164*9880d681SAndroid Build Coastguard Worker let Inst{7} = Sn{0}; 1165*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Rt; 1166*9880d681SAndroid Build Coastguard Worker 1167*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = 0b00; 1168*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 1169*9880d681SAndroid Build Coastguard Worker} 1170*9880d681SAndroid Build Coastguard Worker 1171*9880d681SAndroid Build Coastguard Worker// Move R->H, clearing top 16 bits 1172*9880d681SAndroid Build Coastguard Workerdef VMOVHR : AVConv4I<0b11100000, 0b1001, 1173*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sn), (ins GPR:$Rt), 1174*9880d681SAndroid Build Coastguard Worker IIC_fpMOVIS, "vmov", ".f16\t$Sn, $Rt", 1175*9880d681SAndroid Build Coastguard Worker []>, 1176*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]> { 1177*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1178*9880d681SAndroid Build Coastguard Worker bits<5> Sn; 1179*9880d681SAndroid Build Coastguard Worker bits<4> Rt; 1180*9880d681SAndroid Build Coastguard Worker 1181*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1182*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = Sn{4-1}; 1183*9880d681SAndroid Build Coastguard Worker let Inst{7} = Sn{0}; 1184*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Rt; 1185*9880d681SAndroid Build Coastguard Worker 1186*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = 0b00; 1187*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 1188*9880d681SAndroid Build Coastguard Worker} 1189*9880d681SAndroid Build Coastguard Worker 1190*9880d681SAndroid Build Coastguard Worker// FMRDH: SPR -> GPR 1191*9880d681SAndroid Build Coastguard Worker// FMRDL: SPR -> GPR 1192*9880d681SAndroid Build Coastguard Worker// FMRRS: SPR -> GPR 1193*9880d681SAndroid Build Coastguard Worker// FMRX: SPR system reg -> GPR 1194*9880d681SAndroid Build Coastguard Worker// FMSRR: GPR -> SPR 1195*9880d681SAndroid Build Coastguard Worker// FMXR: GPR -> VFP system reg 1196*9880d681SAndroid Build Coastguard Worker 1197*9880d681SAndroid Build Coastguard Worker 1198*9880d681SAndroid Build Coastguard Worker// Int -> FP: 1199*9880d681SAndroid Build Coastguard Worker 1200*9880d681SAndroid Build Coastguard Workerclass AVConv1IDs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, 1201*9880d681SAndroid Build Coastguard Worker bits<4> opcod4, dag oops, dag iops, 1202*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, string opc, string asm, 1203*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1204*9880d681SAndroid Build Coastguard Worker : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm, 1205*9880d681SAndroid Build Coastguard Worker pattern> { 1206*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1207*9880d681SAndroid Build Coastguard Worker bits<5> Dd; 1208*9880d681SAndroid Build Coastguard Worker bits<5> Sm; 1209*9880d681SAndroid Build Coastguard Worker 1210*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1211*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Sm{4-1}; 1212*9880d681SAndroid Build Coastguard Worker let Inst{5} = Sm{0}; 1213*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Dd{3-0}; 1214*9880d681SAndroid Build Coastguard Worker let Inst{22} = Dd{4}; 1215*9880d681SAndroid Build Coastguard Worker 1216*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVFP2, HasDPVFP]; 1217*9880d681SAndroid Build Coastguard Worker} 1218*9880d681SAndroid Build Coastguard Worker 1219*9880d681SAndroid Build Coastguard Workerclass AVConv1InSs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, 1220*9880d681SAndroid Build Coastguard Worker bits<4> opcod4, dag oops, dag iops,InstrItinClass itin, 1221*9880d681SAndroid Build Coastguard Worker string opc, string asm, list<dag> pattern> 1222*9880d681SAndroid Build Coastguard Worker : AVConv1In<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm, 1223*9880d681SAndroid Build Coastguard Worker pattern> { 1224*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1225*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 1226*9880d681SAndroid Build Coastguard Worker bits<5> Sm; 1227*9880d681SAndroid Build Coastguard Worker 1228*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1229*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Sm{4-1}; 1230*9880d681SAndroid Build Coastguard Worker let Inst{5} = Sm{0}; 1231*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 1232*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 1233*9880d681SAndroid Build Coastguard Worker} 1234*9880d681SAndroid Build Coastguard Worker 1235*9880d681SAndroid Build Coastguard Workerclass AVConv1IHs_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, 1236*9880d681SAndroid Build Coastguard Worker bits<4> opcod4, dag oops, dag iops, 1237*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, string opc, string asm, 1238*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1239*9880d681SAndroid Build Coastguard Worker : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm, 1240*9880d681SAndroid Build Coastguard Worker pattern> { 1241*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1242*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 1243*9880d681SAndroid Build Coastguard Worker bits<5> Sm; 1244*9880d681SAndroid Build Coastguard Worker 1245*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1246*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Sm{4-1}; 1247*9880d681SAndroid Build Coastguard Worker let Inst{5} = Sm{0}; 1248*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 1249*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 1250*9880d681SAndroid Build Coastguard Worker 1251*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 1252*9880d681SAndroid Build Coastguard Worker} 1253*9880d681SAndroid Build Coastguard Worker 1254*9880d681SAndroid Build Coastguard Workerdef VSITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011, 1255*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins SPR:$Sm), 1256*9880d681SAndroid Build Coastguard Worker IIC_fpCVTID, "vcvt", ".f64.s32\t$Dd, $Sm", 1257*9880d681SAndroid Build Coastguard Worker []> { 1258*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // s32 1259*9880d681SAndroid Build Coastguard Worker} 1260*9880d681SAndroid Build Coastguard Worker 1261*9880d681SAndroid Build Coastguard Workerlet Predicates=[HasVFP2, HasDPVFP] in { 1262*9880d681SAndroid Build Coastguard Worker def : VFPPat<(f64 (sint_to_fp GPR:$a)), 1263*9880d681SAndroid Build Coastguard Worker (VSITOD (COPY_TO_REGCLASS GPR:$a, SPR))>; 1264*9880d681SAndroid Build Coastguard Worker 1265*9880d681SAndroid Build Coastguard Worker def : VFPPat<(f64 (sint_to_fp (i32 (alignedload32 addrmode5:$a)))), 1266*9880d681SAndroid Build Coastguard Worker (VSITOD (VLDRS addrmode5:$a))>; 1267*9880d681SAndroid Build Coastguard Worker} 1268*9880d681SAndroid Build Coastguard Worker 1269*9880d681SAndroid Build Coastguard Workerdef VSITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010, 1270*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd),(ins SPR:$Sm), 1271*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIS, "vcvt", ".f32.s32\t$Sd, $Sm", 1272*9880d681SAndroid Build Coastguard Worker []> { 1273*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // s32 1274*9880d681SAndroid Build Coastguard Worker 1275*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1276*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1277*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1278*9880d681SAndroid Build Coastguard Worker} 1279*9880d681SAndroid Build Coastguard Worker 1280*9880d681SAndroid Build Coastguard Workerdef : VFPNoNEONPat<(f32 (sint_to_fp GPR:$a)), 1281*9880d681SAndroid Build Coastguard Worker (VSITOS (COPY_TO_REGCLASS GPR:$a, SPR))>; 1282*9880d681SAndroid Build Coastguard Worker 1283*9880d681SAndroid Build Coastguard Workerdef : VFPNoNEONPat<(f32 (sint_to_fp (i32 (alignedload32 addrmode5:$a)))), 1284*9880d681SAndroid Build Coastguard Worker (VSITOS (VLDRS addrmode5:$a))>; 1285*9880d681SAndroid Build Coastguard Worker 1286*9880d681SAndroid Build Coastguard Workerdef VSITOH : AVConv1IHs_Encode<0b11101, 0b11, 0b1000, 0b1001, 1287*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1288*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIH, "vcvt", ".f16.s32\t$Sd, $Sm", 1289*9880d681SAndroid Build Coastguard Worker []> { 1290*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // s32 1291*9880d681SAndroid Build Coastguard Worker} 1292*9880d681SAndroid Build Coastguard Worker 1293*9880d681SAndroid Build Coastguard Workerdef VUITOD : AVConv1IDs_Encode<0b11101, 0b11, 0b1000, 0b1011, 1294*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins SPR:$Sm), 1295*9880d681SAndroid Build Coastguard Worker IIC_fpCVTID, "vcvt", ".f64.u32\t$Dd, $Sm", 1296*9880d681SAndroid Build Coastguard Worker []> { 1297*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // u32 1298*9880d681SAndroid Build Coastguard Worker} 1299*9880d681SAndroid Build Coastguard Worker 1300*9880d681SAndroid Build Coastguard Workerlet Predicates=[HasVFP2, HasDPVFP] in { 1301*9880d681SAndroid Build Coastguard Worker def : VFPPat<(f64 (uint_to_fp GPR:$a)), 1302*9880d681SAndroid Build Coastguard Worker (VUITOD (COPY_TO_REGCLASS GPR:$a, SPR))>; 1303*9880d681SAndroid Build Coastguard Worker 1304*9880d681SAndroid Build Coastguard Worker def : VFPPat<(f64 (uint_to_fp (i32 (alignedload32 addrmode5:$a)))), 1305*9880d681SAndroid Build Coastguard Worker (VUITOD (VLDRS addrmode5:$a))>; 1306*9880d681SAndroid Build Coastguard Worker} 1307*9880d681SAndroid Build Coastguard Worker 1308*9880d681SAndroid Build Coastguard Workerdef VUITOS : AVConv1InSs_Encode<0b11101, 0b11, 0b1000, 0b1010, 1309*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1310*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIS, "vcvt", ".f32.u32\t$Sd, $Sm", 1311*9880d681SAndroid Build Coastguard Worker []> { 1312*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // u32 1313*9880d681SAndroid Build Coastguard Worker 1314*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1315*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1316*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1317*9880d681SAndroid Build Coastguard Worker} 1318*9880d681SAndroid Build Coastguard Worker 1319*9880d681SAndroid Build Coastguard Workerdef : VFPNoNEONPat<(f32 (uint_to_fp GPR:$a)), 1320*9880d681SAndroid Build Coastguard Worker (VUITOS (COPY_TO_REGCLASS GPR:$a, SPR))>; 1321*9880d681SAndroid Build Coastguard Worker 1322*9880d681SAndroid Build Coastguard Workerdef : VFPNoNEONPat<(f32 (uint_to_fp (i32 (alignedload32 addrmode5:$a)))), 1323*9880d681SAndroid Build Coastguard Worker (VUITOS (VLDRS addrmode5:$a))>; 1324*9880d681SAndroid Build Coastguard Worker 1325*9880d681SAndroid Build Coastguard Workerdef VUITOH : AVConv1IHs_Encode<0b11101, 0b11, 0b1000, 0b1001, 1326*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1327*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIH, "vcvt", ".f16.u32\t$Sd, $Sm", 1328*9880d681SAndroid Build Coastguard Worker []> { 1329*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // u32 1330*9880d681SAndroid Build Coastguard Worker} 1331*9880d681SAndroid Build Coastguard Worker 1332*9880d681SAndroid Build Coastguard Worker// FP -> Int: 1333*9880d681SAndroid Build Coastguard Worker 1334*9880d681SAndroid Build Coastguard Workerclass AVConv1IsD_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, 1335*9880d681SAndroid Build Coastguard Worker bits<4> opcod4, dag oops, dag iops, 1336*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, string opc, string asm, 1337*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1338*9880d681SAndroid Build Coastguard Worker : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm, 1339*9880d681SAndroid Build Coastguard Worker pattern> { 1340*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1341*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 1342*9880d681SAndroid Build Coastguard Worker bits<5> Dm; 1343*9880d681SAndroid Build Coastguard Worker 1344*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1345*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Dm{3-0}; 1346*9880d681SAndroid Build Coastguard Worker let Inst{5} = Dm{4}; 1347*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 1348*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 1349*9880d681SAndroid Build Coastguard Worker 1350*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVFP2, HasDPVFP]; 1351*9880d681SAndroid Build Coastguard Worker} 1352*9880d681SAndroid Build Coastguard Worker 1353*9880d681SAndroid Build Coastguard Workerclass AVConv1InsS_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, 1354*9880d681SAndroid Build Coastguard Worker bits<4> opcod4, dag oops, dag iops, 1355*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, string opc, string asm, 1356*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1357*9880d681SAndroid Build Coastguard Worker : AVConv1In<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm, 1358*9880d681SAndroid Build Coastguard Worker pattern> { 1359*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1360*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 1361*9880d681SAndroid Build Coastguard Worker bits<5> Sm; 1362*9880d681SAndroid Build Coastguard Worker 1363*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1364*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Sm{4-1}; 1365*9880d681SAndroid Build Coastguard Worker let Inst{5} = Sm{0}; 1366*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 1367*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 1368*9880d681SAndroid Build Coastguard Worker} 1369*9880d681SAndroid Build Coastguard Worker 1370*9880d681SAndroid Build Coastguard Workerclass AVConv1IsH_Encode<bits<5> opcod1, bits<2> opcod2, bits<4> opcod3, 1371*9880d681SAndroid Build Coastguard Worker bits<4> opcod4, dag oops, dag iops, 1372*9880d681SAndroid Build Coastguard Worker InstrItinClass itin, string opc, string asm, 1373*9880d681SAndroid Build Coastguard Worker list<dag> pattern> 1374*9880d681SAndroid Build Coastguard Worker : AVConv1I<opcod1, opcod2, opcod3, opcod4, oops, iops, itin, opc, asm, 1375*9880d681SAndroid Build Coastguard Worker pattern> { 1376*9880d681SAndroid Build Coastguard Worker // Instruction operands. 1377*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 1378*9880d681SAndroid Build Coastguard Worker bits<5> Sm; 1379*9880d681SAndroid Build Coastguard Worker 1380*9880d681SAndroid Build Coastguard Worker // Encode instruction operands. 1381*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = Sm{4-1}; 1382*9880d681SAndroid Build Coastguard Worker let Inst{5} = Sm{0}; 1383*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 1384*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 1385*9880d681SAndroid Build Coastguard Worker 1386*9880d681SAndroid Build Coastguard Worker let Predicates = [HasFullFP16]; 1387*9880d681SAndroid Build Coastguard Worker} 1388*9880d681SAndroid Build Coastguard Worker 1389*9880d681SAndroid Build Coastguard Worker// Always set Z bit in the instruction, i.e. "round towards zero" variants. 1390*9880d681SAndroid Build Coastguard Workerdef VTOSIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011, 1391*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins DPR:$Dm), 1392*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDI, "vcvt", ".s32.f64\t$Sd, $Dm", 1393*9880d681SAndroid Build Coastguard Worker []> { 1394*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // Z bit 1395*9880d681SAndroid Build Coastguard Worker} 1396*9880d681SAndroid Build Coastguard Worker 1397*9880d681SAndroid Build Coastguard Workerlet Predicates=[HasVFP2, HasDPVFP] in { 1398*9880d681SAndroid Build Coastguard Worker def : VFPPat<(i32 (fp_to_sint (f64 DPR:$a))), 1399*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VTOSIZD DPR:$a), GPR)>; 1400*9880d681SAndroid Build Coastguard Worker 1401*9880d681SAndroid Build Coastguard Worker def : VFPPat<(alignedstore32 (i32 (fp_to_sint (f64 DPR:$a))), addrmode5:$ptr), 1402*9880d681SAndroid Build Coastguard Worker (VSTRS (VTOSIZD DPR:$a), addrmode5:$ptr)>; 1403*9880d681SAndroid Build Coastguard Worker} 1404*9880d681SAndroid Build Coastguard Worker 1405*9880d681SAndroid Build Coastguard Workerdef VTOSIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010, 1406*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1407*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSI, "vcvt", ".s32.f32\t$Sd, $Sm", 1408*9880d681SAndroid Build Coastguard Worker []> { 1409*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // Z bit 1410*9880d681SAndroid Build Coastguard Worker 1411*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1412*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1413*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1414*9880d681SAndroid Build Coastguard Worker} 1415*9880d681SAndroid Build Coastguard Worker 1416*9880d681SAndroid Build Coastguard Workerdef : VFPNoNEONPat<(i32 (fp_to_sint SPR:$a)), 1417*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VTOSIZS SPR:$a), GPR)>; 1418*9880d681SAndroid Build Coastguard Worker 1419*9880d681SAndroid Build Coastguard Workerdef : VFPNoNEONPat<(alignedstore32 (i32 (fp_to_sint (f32 SPR:$a))), 1420*9880d681SAndroid Build Coastguard Worker addrmode5:$ptr), 1421*9880d681SAndroid Build Coastguard Worker (VSTRS (VTOSIZS SPR:$a), addrmode5:$ptr)>; 1422*9880d681SAndroid Build Coastguard Worker 1423*9880d681SAndroid Build Coastguard Workerdef VTOSIZH : AVConv1IsH_Encode<0b11101, 0b11, 0b1101, 0b1001, 1424*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1425*9880d681SAndroid Build Coastguard Worker IIC_fpCVTHI, "vcvt", ".s32.f16\t$Sd, $Sm", 1426*9880d681SAndroid Build Coastguard Worker []> { 1427*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // Z bit 1428*9880d681SAndroid Build Coastguard Worker} 1429*9880d681SAndroid Build Coastguard Worker 1430*9880d681SAndroid Build Coastguard Workerdef VTOUIZD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011, 1431*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins DPR:$Dm), 1432*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDI, "vcvt", ".u32.f64\t$Sd, $Dm", 1433*9880d681SAndroid Build Coastguard Worker []> { 1434*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // Z bit 1435*9880d681SAndroid Build Coastguard Worker} 1436*9880d681SAndroid Build Coastguard Worker 1437*9880d681SAndroid Build Coastguard Workerlet Predicates=[HasVFP2, HasDPVFP] in { 1438*9880d681SAndroid Build Coastguard Worker def : VFPPat<(i32 (fp_to_uint (f64 DPR:$a))), 1439*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VTOUIZD DPR:$a), GPR)>; 1440*9880d681SAndroid Build Coastguard Worker 1441*9880d681SAndroid Build Coastguard Worker def : VFPPat<(alignedstore32 (i32 (fp_to_uint (f64 DPR:$a))), addrmode5:$ptr), 1442*9880d681SAndroid Build Coastguard Worker (VSTRS (VTOUIZD DPR:$a), addrmode5:$ptr)>; 1443*9880d681SAndroid Build Coastguard Worker} 1444*9880d681SAndroid Build Coastguard Worker 1445*9880d681SAndroid Build Coastguard Workerdef VTOUIZS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010, 1446*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1447*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSI, "vcvt", ".u32.f32\t$Sd, $Sm", 1448*9880d681SAndroid Build Coastguard Worker []> { 1449*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // Z bit 1450*9880d681SAndroid Build Coastguard Worker 1451*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1452*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1453*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1454*9880d681SAndroid Build Coastguard Worker} 1455*9880d681SAndroid Build Coastguard Worker 1456*9880d681SAndroid Build Coastguard Workerdef : VFPNoNEONPat<(i32 (fp_to_uint SPR:$a)), 1457*9880d681SAndroid Build Coastguard Worker (COPY_TO_REGCLASS (VTOUIZS SPR:$a), GPR)>; 1458*9880d681SAndroid Build Coastguard Worker 1459*9880d681SAndroid Build Coastguard Workerdef : VFPNoNEONPat<(alignedstore32 (i32 (fp_to_uint (f32 SPR:$a))), 1460*9880d681SAndroid Build Coastguard Worker addrmode5:$ptr), 1461*9880d681SAndroid Build Coastguard Worker (VSTRS (VTOUIZS SPR:$a), addrmode5:$ptr)>; 1462*9880d681SAndroid Build Coastguard Worker 1463*9880d681SAndroid Build Coastguard Workerdef VTOUIZH : AVConv1IsH_Encode<0b11101, 0b11, 0b1100, 0b1001, 1464*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1465*9880d681SAndroid Build Coastguard Worker IIC_fpCVTHI, "vcvt", ".u32.f16\t$Sd, $Sm", 1466*9880d681SAndroid Build Coastguard Worker []> { 1467*9880d681SAndroid Build Coastguard Worker let Inst{7} = 1; // Z bit 1468*9880d681SAndroid Build Coastguard Worker} 1469*9880d681SAndroid Build Coastguard Worker 1470*9880d681SAndroid Build Coastguard Worker// And the Z bit '0' variants, i.e. use the rounding mode specified by FPSCR. 1471*9880d681SAndroid Build Coastguard Workerlet Uses = [FPSCR] in { 1472*9880d681SAndroid Build Coastguard Worker// FIXME: Verify encoding after integrated assembler is working. 1473*9880d681SAndroid Build Coastguard Workerdef VTOSIRD : AVConv1IsD_Encode<0b11101, 0b11, 0b1101, 0b1011, 1474*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins DPR:$Dm), 1475*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDI, "vcvtr", ".s32.f64\t$Sd, $Dm", 1476*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (int_arm_vcvtr (f64 DPR:$Dm)))]>{ 1477*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // Z bit 1478*9880d681SAndroid Build Coastguard Worker} 1479*9880d681SAndroid Build Coastguard Worker 1480*9880d681SAndroid Build Coastguard Workerdef VTOSIRS : AVConv1InsS_Encode<0b11101, 0b11, 0b1101, 0b1010, 1481*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1482*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSI, "vcvtr", ".s32.f32\t$Sd, $Sm", 1483*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (int_arm_vcvtr SPR:$Sm))]> { 1484*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // Z bit 1485*9880d681SAndroid Build Coastguard Worker} 1486*9880d681SAndroid Build Coastguard Worker 1487*9880d681SAndroid Build Coastguard Workerdef VTOSIRH : AVConv1IsH_Encode<0b11101, 0b11, 0b1101, 0b1001, 1488*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1489*9880d681SAndroid Build Coastguard Worker IIC_fpCVTHI, "vcvtr", ".s32.f16\t$Sd, $Sm", 1490*9880d681SAndroid Build Coastguard Worker []> { 1491*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // Z bit 1492*9880d681SAndroid Build Coastguard Worker} 1493*9880d681SAndroid Build Coastguard Worker 1494*9880d681SAndroid Build Coastguard Workerdef VTOUIRD : AVConv1IsD_Encode<0b11101, 0b11, 0b1100, 0b1011, 1495*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins DPR:$Dm), 1496*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDI, "vcvtr", ".u32.f64\t$Sd, $Dm", 1497*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (int_arm_vcvtru(f64 DPR:$Dm)))]>{ 1498*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // Z bit 1499*9880d681SAndroid Build Coastguard Worker} 1500*9880d681SAndroid Build Coastguard Worker 1501*9880d681SAndroid Build Coastguard Workerdef VTOUIRS : AVConv1InsS_Encode<0b11101, 0b11, 0b1100, 0b1010, 1502*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1503*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSI, "vcvtr", ".u32.f32\t$Sd, $Sm", 1504*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (int_arm_vcvtru SPR:$Sm))]> { 1505*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // Z bit 1506*9880d681SAndroid Build Coastguard Worker} 1507*9880d681SAndroid Build Coastguard Worker 1508*9880d681SAndroid Build Coastguard Workerdef VTOUIRH : AVConv1IsH_Encode<0b11101, 0b11, 0b1100, 0b1001, 1509*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sm), 1510*9880d681SAndroid Build Coastguard Worker IIC_fpCVTHI, "vcvtr", ".u32.f16\t$Sd, $Sm", 1511*9880d681SAndroid Build Coastguard Worker []> { 1512*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; // Z bit 1513*9880d681SAndroid Build Coastguard Worker} 1514*9880d681SAndroid Build Coastguard Worker} 1515*9880d681SAndroid Build Coastguard Worker 1516*9880d681SAndroid Build Coastguard Worker// Convert between floating-point and fixed-point 1517*9880d681SAndroid Build Coastguard Worker// Data type for fixed-point naming convention: 1518*9880d681SAndroid Build Coastguard Worker// S16 (U=0, sx=0) -> SH 1519*9880d681SAndroid Build Coastguard Worker// U16 (U=1, sx=0) -> UH 1520*9880d681SAndroid Build Coastguard Worker// S32 (U=0, sx=1) -> SL 1521*9880d681SAndroid Build Coastguard Worker// U32 (U=1, sx=1) -> UL 1522*9880d681SAndroid Build Coastguard Worker 1523*9880d681SAndroid Build Coastguard Workerlet Constraints = "$a = $dst" in { 1524*9880d681SAndroid Build Coastguard Worker 1525*9880d681SAndroid Build Coastguard Worker// FP to Fixed-Point: 1526*9880d681SAndroid Build Coastguard Worker 1527*9880d681SAndroid Build Coastguard Worker// Single Precision register 1528*9880d681SAndroid Build Coastguard Workerclass AVConv1XInsS_Encode<bits<5> op1, bits<2> op2, bits<4> op3, bits<4> op4, 1529*9880d681SAndroid Build Coastguard Worker bit op5, dag oops, dag iops, InstrItinClass itin, 1530*9880d681SAndroid Build Coastguard Worker string opc, string asm, list<dag> pattern> 1531*9880d681SAndroid Build Coastguard Worker : AVConv1XI<op1, op2, op3, op4, op5, oops, iops, itin, opc, asm, pattern>, 1532*9880d681SAndroid Build Coastguard Worker Sched<[WriteCvtFP]> { 1533*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1534*9880d681SAndroid Build Coastguard Worker // if dp_operation then UInt(D:Vd) else UInt(Vd:D); 1535*9880d681SAndroid Build Coastguard Worker let Inst{22} = dst{0}; 1536*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = dst{4-1}; 1537*9880d681SAndroid Build Coastguard Worker} 1538*9880d681SAndroid Build Coastguard Worker 1539*9880d681SAndroid Build Coastguard Worker// Double Precision register 1540*9880d681SAndroid Build Coastguard Workerclass AVConv1XInsD_Encode<bits<5> op1, bits<2> op2, bits<4> op3, bits<4> op4, 1541*9880d681SAndroid Build Coastguard Worker bit op5, dag oops, dag iops, InstrItinClass itin, 1542*9880d681SAndroid Build Coastguard Worker string opc, string asm, list<dag> pattern> 1543*9880d681SAndroid Build Coastguard Worker : AVConv1XI<op1, op2, op3, op4, op5, oops, iops, itin, opc, asm, pattern>, 1544*9880d681SAndroid Build Coastguard Worker Sched<[WriteCvtFP]> { 1545*9880d681SAndroid Build Coastguard Worker bits<5> dst; 1546*9880d681SAndroid Build Coastguard Worker // if dp_operation then UInt(D:Vd) else UInt(Vd:D); 1547*9880d681SAndroid Build Coastguard Worker let Inst{22} = dst{4}; 1548*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = dst{3-0}; 1549*9880d681SAndroid Build Coastguard Worker 1550*9880d681SAndroid Build Coastguard Worker let Predicates = [HasVFP2, HasDPVFP]; 1551*9880d681SAndroid Build Coastguard Worker} 1552*9880d681SAndroid Build Coastguard Worker 1553*9880d681SAndroid Build Coastguard Workerdef VTOSHH : AVConv1XInsS_Encode<0b11101, 0b11, 0b1110, 0b1001, 0, 1554*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits16:$fbits), 1555*9880d681SAndroid Build Coastguard Worker IIC_fpCVTHI, "vcvt", ".s16.f16\t$dst, $a, $fbits", []>, 1556*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 1557*9880d681SAndroid Build Coastguard Worker 1558*9880d681SAndroid Build Coastguard Workerdef VTOUHH : AVConv1XInsS_Encode<0b11101, 0b11, 0b1111, 0b1001, 0, 1559*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits16:$fbits), 1560*9880d681SAndroid Build Coastguard Worker IIC_fpCVTHI, "vcvt", ".u16.f16\t$dst, $a, $fbits", []>, 1561*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 1562*9880d681SAndroid Build Coastguard Worker 1563*9880d681SAndroid Build Coastguard Workerdef VTOSLH : AVConv1XInsS_Encode<0b11101, 0b11, 0b1110, 0b1001, 1, 1564*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits32:$fbits), 1565*9880d681SAndroid Build Coastguard Worker IIC_fpCVTHI, "vcvt", ".s32.f16\t$dst, $a, $fbits", []>, 1566*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 1567*9880d681SAndroid Build Coastguard Worker 1568*9880d681SAndroid Build Coastguard Workerdef VTOULH : AVConv1XInsS_Encode<0b11101, 0b11, 0b1111, 0b1001, 1, 1569*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits32:$fbits), 1570*9880d681SAndroid Build Coastguard Worker IIC_fpCVTHI, "vcvt", ".u32.f16\t$dst, $a, $fbits", []>, 1571*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 1572*9880d681SAndroid Build Coastguard Worker 1573*9880d681SAndroid Build Coastguard Workerdef VTOSHS : AVConv1XInsS_Encode<0b11101, 0b11, 0b1110, 0b1010, 0, 1574*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits16:$fbits), 1575*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSI, "vcvt", ".s16.f32\t$dst, $a, $fbits", []> { 1576*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1577*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1578*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1579*9880d681SAndroid Build Coastguard Worker} 1580*9880d681SAndroid Build Coastguard Worker 1581*9880d681SAndroid Build Coastguard Workerdef VTOUHS : AVConv1XInsS_Encode<0b11101, 0b11, 0b1111, 0b1010, 0, 1582*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits16:$fbits), 1583*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSI, "vcvt", ".u16.f32\t$dst, $a, $fbits", []> { 1584*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1585*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1586*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1587*9880d681SAndroid Build Coastguard Worker} 1588*9880d681SAndroid Build Coastguard Worker 1589*9880d681SAndroid Build Coastguard Workerdef VTOSLS : AVConv1XInsS_Encode<0b11101, 0b11, 0b1110, 0b1010, 1, 1590*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits32:$fbits), 1591*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSI, "vcvt", ".s32.f32\t$dst, $a, $fbits", []> { 1592*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1593*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1594*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1595*9880d681SAndroid Build Coastguard Worker} 1596*9880d681SAndroid Build Coastguard Worker 1597*9880d681SAndroid Build Coastguard Workerdef VTOULS : AVConv1XInsS_Encode<0b11101, 0b11, 0b1111, 0b1010, 1, 1598*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits32:$fbits), 1599*9880d681SAndroid Build Coastguard Worker IIC_fpCVTSI, "vcvt", ".u32.f32\t$dst, $a, $fbits", []> { 1600*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1601*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1602*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1603*9880d681SAndroid Build Coastguard Worker} 1604*9880d681SAndroid Build Coastguard Worker 1605*9880d681SAndroid Build Coastguard Workerdef VTOSHD : AVConv1XInsD_Encode<0b11101, 0b11, 0b1110, 0b1011, 0, 1606*9880d681SAndroid Build Coastguard Worker (outs DPR:$dst), (ins DPR:$a, fbits16:$fbits), 1607*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDI, "vcvt", ".s16.f64\t$dst, $a, $fbits", []>; 1608*9880d681SAndroid Build Coastguard Worker 1609*9880d681SAndroid Build Coastguard Workerdef VTOUHD : AVConv1XInsD_Encode<0b11101, 0b11, 0b1111, 0b1011, 0, 1610*9880d681SAndroid Build Coastguard Worker (outs DPR:$dst), (ins DPR:$a, fbits16:$fbits), 1611*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDI, "vcvt", ".u16.f64\t$dst, $a, $fbits", []>; 1612*9880d681SAndroid Build Coastguard Worker 1613*9880d681SAndroid Build Coastguard Workerdef VTOSLD : AVConv1XInsD_Encode<0b11101, 0b11, 0b1110, 0b1011, 1, 1614*9880d681SAndroid Build Coastguard Worker (outs DPR:$dst), (ins DPR:$a, fbits32:$fbits), 1615*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDI, "vcvt", ".s32.f64\t$dst, $a, $fbits", []>; 1616*9880d681SAndroid Build Coastguard Worker 1617*9880d681SAndroid Build Coastguard Workerdef VTOULD : AVConv1XInsD_Encode<0b11101, 0b11, 0b1111, 0b1011, 1, 1618*9880d681SAndroid Build Coastguard Worker (outs DPR:$dst), (ins DPR:$a, fbits32:$fbits), 1619*9880d681SAndroid Build Coastguard Worker IIC_fpCVTDI, "vcvt", ".u32.f64\t$dst, $a, $fbits", []>; 1620*9880d681SAndroid Build Coastguard Worker 1621*9880d681SAndroid Build Coastguard Worker// Fixed-Point to FP: 1622*9880d681SAndroid Build Coastguard Worker 1623*9880d681SAndroid Build Coastguard Workerdef VSHTOH : AVConv1XInsS_Encode<0b11101, 0b11, 0b1010, 0b1001, 0, 1624*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits16:$fbits), 1625*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIH, "vcvt", ".f16.s16\t$dst, $a, $fbits", []>, 1626*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 1627*9880d681SAndroid Build Coastguard Worker 1628*9880d681SAndroid Build Coastguard Workerdef VUHTOH : AVConv1XInsS_Encode<0b11101, 0b11, 0b1011, 0b1001, 0, 1629*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits16:$fbits), 1630*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIH, "vcvt", ".f16.u16\t$dst, $a, $fbits", []>, 1631*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 1632*9880d681SAndroid Build Coastguard Worker 1633*9880d681SAndroid Build Coastguard Workerdef VSLTOH : AVConv1XInsS_Encode<0b11101, 0b11, 0b1010, 0b1001, 1, 1634*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits32:$fbits), 1635*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIH, "vcvt", ".f16.s32\t$dst, $a, $fbits", []>, 1636*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 1637*9880d681SAndroid Build Coastguard Worker 1638*9880d681SAndroid Build Coastguard Workerdef VULTOH : AVConv1XInsS_Encode<0b11101, 0b11, 0b1011, 0b1001, 1, 1639*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits32:$fbits), 1640*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIH, "vcvt", ".f16.u32\t$dst, $a, $fbits", []>, 1641*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16]>; 1642*9880d681SAndroid Build Coastguard Worker 1643*9880d681SAndroid Build Coastguard Workerdef VSHTOS : AVConv1XInsS_Encode<0b11101, 0b11, 0b1010, 0b1010, 0, 1644*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits16:$fbits), 1645*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIS, "vcvt", ".f32.s16\t$dst, $a, $fbits", []> { 1646*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1647*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1648*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1649*9880d681SAndroid Build Coastguard Worker} 1650*9880d681SAndroid Build Coastguard Worker 1651*9880d681SAndroid Build Coastguard Workerdef VUHTOS : AVConv1XInsS_Encode<0b11101, 0b11, 0b1011, 0b1010, 0, 1652*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits16:$fbits), 1653*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIS, "vcvt", ".f32.u16\t$dst, $a, $fbits", []> { 1654*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1655*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1656*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1657*9880d681SAndroid Build Coastguard Worker} 1658*9880d681SAndroid Build Coastguard Worker 1659*9880d681SAndroid Build Coastguard Workerdef VSLTOS : AVConv1XInsS_Encode<0b11101, 0b11, 0b1010, 0b1010, 1, 1660*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits32:$fbits), 1661*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIS, "vcvt", ".f32.s32\t$dst, $a, $fbits", []> { 1662*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1663*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1664*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1665*9880d681SAndroid Build Coastguard Worker} 1666*9880d681SAndroid Build Coastguard Worker 1667*9880d681SAndroid Build Coastguard Workerdef VULTOS : AVConv1XInsS_Encode<0b11101, 0b11, 0b1011, 0b1010, 1, 1668*9880d681SAndroid Build Coastguard Worker (outs SPR:$dst), (ins SPR:$a, fbits32:$fbits), 1669*9880d681SAndroid Build Coastguard Worker IIC_fpCVTIS, "vcvt", ".f32.u32\t$dst, $a, $fbits", []> { 1670*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1671*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1672*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1673*9880d681SAndroid Build Coastguard Worker} 1674*9880d681SAndroid Build Coastguard Worker 1675*9880d681SAndroid Build Coastguard Workerdef VSHTOD : AVConv1XInsD_Encode<0b11101, 0b11, 0b1010, 0b1011, 0, 1676*9880d681SAndroid Build Coastguard Worker (outs DPR:$dst), (ins DPR:$a, fbits16:$fbits), 1677*9880d681SAndroid Build Coastguard Worker IIC_fpCVTID, "vcvt", ".f64.s16\t$dst, $a, $fbits", []>; 1678*9880d681SAndroid Build Coastguard Worker 1679*9880d681SAndroid Build Coastguard Workerdef VUHTOD : AVConv1XInsD_Encode<0b11101, 0b11, 0b1011, 0b1011, 0, 1680*9880d681SAndroid Build Coastguard Worker (outs DPR:$dst), (ins DPR:$a, fbits16:$fbits), 1681*9880d681SAndroid Build Coastguard Worker IIC_fpCVTID, "vcvt", ".f64.u16\t$dst, $a, $fbits", []>; 1682*9880d681SAndroid Build Coastguard Worker 1683*9880d681SAndroid Build Coastguard Workerdef VSLTOD : AVConv1XInsD_Encode<0b11101, 0b11, 0b1010, 0b1011, 1, 1684*9880d681SAndroid Build Coastguard Worker (outs DPR:$dst), (ins DPR:$a, fbits32:$fbits), 1685*9880d681SAndroid Build Coastguard Worker IIC_fpCVTID, "vcvt", ".f64.s32\t$dst, $a, $fbits", []>; 1686*9880d681SAndroid Build Coastguard Worker 1687*9880d681SAndroid Build Coastguard Workerdef VULTOD : AVConv1XInsD_Encode<0b11101, 0b11, 0b1011, 0b1011, 1, 1688*9880d681SAndroid Build Coastguard Worker (outs DPR:$dst), (ins DPR:$a, fbits32:$fbits), 1689*9880d681SAndroid Build Coastguard Worker IIC_fpCVTID, "vcvt", ".f64.u32\t$dst, $a, $fbits", []>; 1690*9880d681SAndroid Build Coastguard Worker 1691*9880d681SAndroid Build Coastguard Worker} // End of 'let Constraints = "$a = $dst" in' 1692*9880d681SAndroid Build Coastguard Worker 1693*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1694*9880d681SAndroid Build Coastguard Worker// FP Multiply-Accumulate Operations. 1695*9880d681SAndroid Build Coastguard Worker// 1696*9880d681SAndroid Build Coastguard Worker 1697*9880d681SAndroid Build Coastguard Workerdef VMLAD : ADbI<0b11100, 0b00, 0, 0, 1698*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm), 1699*9880d681SAndroid Build Coastguard Worker IIC_fpMAC64, "vmla", ".f64\t$Dd, $Dn, $Dm", 1700*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fadd_mlx (fmul_su DPR:$Dn, DPR:$Dm), 1701*9880d681SAndroid Build Coastguard Worker (f64 DPR:$Ddin)))]>, 1702*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Ddin = $Dd">, 1703*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,HasDPVFP,UseFPVMLx,DontUseFusedMAC]>; 1704*9880d681SAndroid Build Coastguard Worker 1705*9880d681SAndroid Build Coastguard Workerdef VMLAS : ASbIn<0b11100, 0b00, 0, 0, 1706*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1707*9880d681SAndroid Build Coastguard Worker IIC_fpMAC32, "vmla", ".f32\t$Sd, $Sn, $Sm", 1708*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fadd_mlx (fmul_su SPR:$Sn, SPR:$Sm), 1709*9880d681SAndroid Build Coastguard Worker SPR:$Sdin))]>, 1710*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1711*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,DontUseNEONForFP,UseFPVMLx,DontUseFusedMAC]> { 1712*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1713*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1714*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1715*9880d681SAndroid Build Coastguard Worker} 1716*9880d681SAndroid Build Coastguard Worker 1717*9880d681SAndroid Build Coastguard Workerdef VMLAH : AHbI<0b11100, 0b00, 0, 0, 1718*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1719*9880d681SAndroid Build Coastguard Worker IIC_fpMAC16, "vmla", ".f16\t$Sd, $Sn, $Sm", 1720*9880d681SAndroid Build Coastguard Worker []>, 1721*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1722*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16,UseFPVMLx,DontUseFusedMAC]>; 1723*9880d681SAndroid Build Coastguard Worker 1724*9880d681SAndroid Build Coastguard Workerdef : Pat<(fadd_mlx DPR:$dstin, (fmul_su DPR:$a, (f64 DPR:$b))), 1725*9880d681SAndroid Build Coastguard Worker (VMLAD DPR:$dstin, DPR:$a, DPR:$b)>, 1726*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,HasDPVFP,UseFPVMLx,DontUseFusedMAC]>; 1727*9880d681SAndroid Build Coastguard Workerdef : Pat<(fadd_mlx SPR:$dstin, (fmul_su SPR:$a, SPR:$b)), 1728*9880d681SAndroid Build Coastguard Worker (VMLAS SPR:$dstin, SPR:$a, SPR:$b)>, 1729*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,DontUseNEONForFP, UseFPVMLx,DontUseFusedMAC]>; 1730*9880d681SAndroid Build Coastguard Worker 1731*9880d681SAndroid Build Coastguard Workerdef VMLSD : ADbI<0b11100, 0b00, 1, 0, 1732*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm), 1733*9880d681SAndroid Build Coastguard Worker IIC_fpMAC64, "vmls", ".f64\t$Dd, $Dn, $Dm", 1734*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fadd_mlx (fneg (fmul_su DPR:$Dn,DPR:$Dm)), 1735*9880d681SAndroid Build Coastguard Worker (f64 DPR:$Ddin)))]>, 1736*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Ddin = $Dd">, 1737*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,HasDPVFP,UseFPVMLx,DontUseFusedMAC]>; 1738*9880d681SAndroid Build Coastguard Worker 1739*9880d681SAndroid Build Coastguard Workerdef VMLSS : ASbIn<0b11100, 0b00, 1, 0, 1740*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1741*9880d681SAndroid Build Coastguard Worker IIC_fpMAC32, "vmls", ".f32\t$Sd, $Sn, $Sm", 1742*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fadd_mlx (fneg (fmul_su SPR:$Sn, SPR:$Sm)), 1743*9880d681SAndroid Build Coastguard Worker SPR:$Sdin))]>, 1744*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1745*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,DontUseNEONForFP,UseFPVMLx,DontUseFusedMAC]> { 1746*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1747*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1748*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1749*9880d681SAndroid Build Coastguard Worker} 1750*9880d681SAndroid Build Coastguard Worker 1751*9880d681SAndroid Build Coastguard Workerdef VMLSH : AHbI<0b11100, 0b00, 1, 0, 1752*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1753*9880d681SAndroid Build Coastguard Worker IIC_fpMAC16, "vmls", ".f16\t$Sd, $Sn, $Sm", 1754*9880d681SAndroid Build Coastguard Worker []>, 1755*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1756*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16,UseFPVMLx,DontUseFusedMAC]>; 1757*9880d681SAndroid Build Coastguard Worker 1758*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx DPR:$dstin, (fmul_su DPR:$a, (f64 DPR:$b))), 1759*9880d681SAndroid Build Coastguard Worker (VMLSD DPR:$dstin, DPR:$a, DPR:$b)>, 1760*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,HasDPVFP,UseFPVMLx,DontUseFusedMAC]>; 1761*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx SPR:$dstin, (fmul_su SPR:$a, SPR:$b)), 1762*9880d681SAndroid Build Coastguard Worker (VMLSS SPR:$dstin, SPR:$a, SPR:$b)>, 1763*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,DontUseNEONForFP,UseFPVMLx,DontUseFusedMAC]>; 1764*9880d681SAndroid Build Coastguard Worker 1765*9880d681SAndroid Build Coastguard Workerdef VNMLAD : ADbI<0b11100, 0b01, 1, 0, 1766*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm), 1767*9880d681SAndroid Build Coastguard Worker IIC_fpMAC64, "vnmla", ".f64\t$Dd, $Dn, $Dm", 1768*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd,(fsub_mlx (fneg (fmul_su DPR:$Dn,DPR:$Dm)), 1769*9880d681SAndroid Build Coastguard Worker (f64 DPR:$Ddin)))]>, 1770*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Ddin = $Dd">, 1771*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,HasDPVFP,UseFPVMLx,DontUseFusedMAC]>; 1772*9880d681SAndroid Build Coastguard Worker 1773*9880d681SAndroid Build Coastguard Workerdef VNMLAS : ASbI<0b11100, 0b01, 1, 0, 1774*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1775*9880d681SAndroid Build Coastguard Worker IIC_fpMAC32, "vnmla", ".f32\t$Sd, $Sn, $Sm", 1776*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fsub_mlx (fneg (fmul_su SPR:$Sn, SPR:$Sm)), 1777*9880d681SAndroid Build Coastguard Worker SPR:$Sdin))]>, 1778*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1779*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,DontUseNEONForFP,UseFPVMLx,DontUseFusedMAC]> { 1780*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1781*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1782*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1783*9880d681SAndroid Build Coastguard Worker} 1784*9880d681SAndroid Build Coastguard Worker 1785*9880d681SAndroid Build Coastguard Workerdef VNMLAH : AHbI<0b11100, 0b01, 1, 0, 1786*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1787*9880d681SAndroid Build Coastguard Worker IIC_fpMAC16, "vnmla", ".f16\t$Sd, $Sn, $Sm", 1788*9880d681SAndroid Build Coastguard Worker []>, 1789*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1790*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16,UseFPVMLx,DontUseFusedMAC]>; 1791*9880d681SAndroid Build Coastguard Worker 1792*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx (fneg (fmul_su DPR:$a, (f64 DPR:$b))), DPR:$dstin), 1793*9880d681SAndroid Build Coastguard Worker (VNMLAD DPR:$dstin, DPR:$a, DPR:$b)>, 1794*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,HasDPVFP,UseFPVMLx,DontUseFusedMAC]>; 1795*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx (fneg (fmul_su SPR:$a, SPR:$b)), SPR:$dstin), 1796*9880d681SAndroid Build Coastguard Worker (VNMLAS SPR:$dstin, SPR:$a, SPR:$b)>, 1797*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,DontUseNEONForFP,UseFPVMLx,DontUseFusedMAC]>; 1798*9880d681SAndroid Build Coastguard Worker 1799*9880d681SAndroid Build Coastguard Workerdef VNMLSD : ADbI<0b11100, 0b01, 0, 0, 1800*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm), 1801*9880d681SAndroid Build Coastguard Worker IIC_fpMAC64, "vnmls", ".f64\t$Dd, $Dn, $Dm", 1802*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fsub_mlx (fmul_su DPR:$Dn, DPR:$Dm), 1803*9880d681SAndroid Build Coastguard Worker (f64 DPR:$Ddin)))]>, 1804*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Ddin = $Dd">, 1805*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,HasDPVFP,UseFPVMLx,DontUseFusedMAC]>; 1806*9880d681SAndroid Build Coastguard Worker 1807*9880d681SAndroid Build Coastguard Workerdef VNMLSS : ASbI<0b11100, 0b01, 0, 0, 1808*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1809*9880d681SAndroid Build Coastguard Worker IIC_fpMAC32, "vnmls", ".f32\t$Sd, $Sn, $Sm", 1810*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fsub_mlx (fmul_su SPR:$Sn, SPR:$Sm), SPR:$Sdin))]>, 1811*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1812*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,DontUseNEONForFP,UseFPVMLx,DontUseFusedMAC]> { 1813*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1814*9880d681SAndroid Build Coastguard Worker // VFP pipelines on A8. 1815*9880d681SAndroid Build Coastguard Worker let D = VFPNeonA8Domain; 1816*9880d681SAndroid Build Coastguard Worker} 1817*9880d681SAndroid Build Coastguard Worker 1818*9880d681SAndroid Build Coastguard Workerdef VNMLSH : AHbI<0b11100, 0b01, 0, 0, 1819*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1820*9880d681SAndroid Build Coastguard Worker IIC_fpMAC16, "vnmls", ".f16\t$Sd, $Sn, $Sm", 1821*9880d681SAndroid Build Coastguard Worker []>, 1822*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1823*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16,UseFPVMLx,DontUseFusedMAC]>; 1824*9880d681SAndroid Build Coastguard Worker 1825*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx (fmul_su DPR:$a, (f64 DPR:$b)), DPR:$dstin), 1826*9880d681SAndroid Build Coastguard Worker (VNMLSD DPR:$dstin, DPR:$a, DPR:$b)>, 1827*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,HasDPVFP,UseFPVMLx,DontUseFusedMAC]>; 1828*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx (fmul_su SPR:$a, SPR:$b), SPR:$dstin), 1829*9880d681SAndroid Build Coastguard Worker (VNMLSS SPR:$dstin, SPR:$a, SPR:$b)>, 1830*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP2,DontUseNEONForFP,UseFPVMLx,DontUseFusedMAC]>; 1831*9880d681SAndroid Build Coastguard Worker 1832*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 1833*9880d681SAndroid Build Coastguard Worker// Fused FP Multiply-Accumulate Operations. 1834*9880d681SAndroid Build Coastguard Worker// 1835*9880d681SAndroid Build Coastguard Workerdef VFMAD : ADbI<0b11101, 0b10, 0, 0, 1836*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm), 1837*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC64, "vfma", ".f64\t$Dd, $Dn, $Dm", 1838*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fadd_mlx (fmul_su DPR:$Dn, DPR:$Dm), 1839*9880d681SAndroid Build Coastguard Worker (f64 DPR:$Ddin)))]>, 1840*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Ddin = $Dd">, 1841*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP,UseFusedMAC]>; 1842*9880d681SAndroid Build Coastguard Worker 1843*9880d681SAndroid Build Coastguard Workerdef VFMAS : ASbIn<0b11101, 0b10, 0, 0, 1844*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1845*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC32, "vfma", ".f32\t$Sd, $Sn, $Sm", 1846*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fadd_mlx (fmul_su SPR:$Sn, SPR:$Sm), 1847*9880d681SAndroid Build Coastguard Worker SPR:$Sdin))]>, 1848*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1849*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,DontUseNEONForFP,UseFusedMAC]> { 1850*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1851*9880d681SAndroid Build Coastguard Worker // VFP pipelines. 1852*9880d681SAndroid Build Coastguard Worker} 1853*9880d681SAndroid Build Coastguard Worker 1854*9880d681SAndroid Build Coastguard Workerdef VFMAH : AHbI<0b11101, 0b10, 0, 0, 1855*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1856*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC16, "vfma", ".f16\t$Sd, $Sn, $Sm", 1857*9880d681SAndroid Build Coastguard Worker []>, 1858*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1859*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16,UseFusedMAC]>; 1860*9880d681SAndroid Build Coastguard Worker 1861*9880d681SAndroid Build Coastguard Workerdef : Pat<(fadd_mlx DPR:$dstin, (fmul_su DPR:$a, (f64 DPR:$b))), 1862*9880d681SAndroid Build Coastguard Worker (VFMAD DPR:$dstin, DPR:$a, DPR:$b)>, 1863*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP,UseFusedMAC]>; 1864*9880d681SAndroid Build Coastguard Workerdef : Pat<(fadd_mlx SPR:$dstin, (fmul_su SPR:$a, SPR:$b)), 1865*9880d681SAndroid Build Coastguard Worker (VFMAS SPR:$dstin, SPR:$a, SPR:$b)>, 1866*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,DontUseNEONForFP,UseFusedMAC]>; 1867*9880d681SAndroid Build Coastguard Worker 1868*9880d681SAndroid Build Coastguard Worker// Match @llvm.fma.* intrinsics 1869*9880d681SAndroid Build Coastguard Worker// (fma x, y, z) -> (vfms z, x, y) 1870*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma DPR:$Dn, DPR:$Dm, DPR:$Ddin)), 1871*9880d681SAndroid Build Coastguard Worker (VFMAD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>, 1872*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP]>; 1873*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma SPR:$Sn, SPR:$Sm, SPR:$Sdin)), 1874*9880d681SAndroid Build Coastguard Worker (VFMAS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>, 1875*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4]>; 1876*9880d681SAndroid Build Coastguard Worker 1877*9880d681SAndroid Build Coastguard Workerdef VFMSD : ADbI<0b11101, 0b10, 1, 0, 1878*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm), 1879*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC64, "vfms", ".f64\t$Dd, $Dn, $Dm", 1880*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fadd_mlx (fneg (fmul_su DPR:$Dn,DPR:$Dm)), 1881*9880d681SAndroid Build Coastguard Worker (f64 DPR:$Ddin)))]>, 1882*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Ddin = $Dd">, 1883*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP,UseFusedMAC]>; 1884*9880d681SAndroid Build Coastguard Worker 1885*9880d681SAndroid Build Coastguard Workerdef VFMSS : ASbIn<0b11101, 0b10, 1, 0, 1886*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1887*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC32, "vfms", ".f32\t$Sd, $Sn, $Sm", 1888*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fadd_mlx (fneg (fmul_su SPR:$Sn, SPR:$Sm)), 1889*9880d681SAndroid Build Coastguard Worker SPR:$Sdin))]>, 1890*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1891*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,DontUseNEONForFP,UseFusedMAC]> { 1892*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1893*9880d681SAndroid Build Coastguard Worker // VFP pipelines. 1894*9880d681SAndroid Build Coastguard Worker} 1895*9880d681SAndroid Build Coastguard Worker 1896*9880d681SAndroid Build Coastguard Workerdef VFMSH : AHbI<0b11101, 0b10, 1, 0, 1897*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1898*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC16, "vfms", ".f16\t$Sd, $Sn, $Sm", 1899*9880d681SAndroid Build Coastguard Worker []>, 1900*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1901*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16,UseFusedMAC]>; 1902*9880d681SAndroid Build Coastguard Worker 1903*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx DPR:$dstin, (fmul_su DPR:$a, (f64 DPR:$b))), 1904*9880d681SAndroid Build Coastguard Worker (VFMSD DPR:$dstin, DPR:$a, DPR:$b)>, 1905*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP,UseFusedMAC]>; 1906*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx SPR:$dstin, (fmul_su SPR:$a, SPR:$b)), 1907*9880d681SAndroid Build Coastguard Worker (VFMSS SPR:$dstin, SPR:$a, SPR:$b)>, 1908*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,DontUseNEONForFP,UseFusedMAC]>; 1909*9880d681SAndroid Build Coastguard Worker 1910*9880d681SAndroid Build Coastguard Worker// Match @llvm.fma.* intrinsics 1911*9880d681SAndroid Build Coastguard Worker// (fma (fneg x), y, z) -> (vfms z, x, y) 1912*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma (fneg DPR:$Dn), DPR:$Dm, DPR:$Ddin)), 1913*9880d681SAndroid Build Coastguard Worker (VFMSD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>, 1914*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP]>; 1915*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma (fneg SPR:$Sn), SPR:$Sm, SPR:$Sdin)), 1916*9880d681SAndroid Build Coastguard Worker (VFMSS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>, 1917*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4]>; 1918*9880d681SAndroid Build Coastguard Worker// (fma x, (fneg y), z) -> (vfms z, x, y) 1919*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma DPR:$Dn, (fneg DPR:$Dm), DPR:$Ddin)), 1920*9880d681SAndroid Build Coastguard Worker (VFMSD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>, 1921*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP]>; 1922*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma SPR:$Sn, (fneg SPR:$Sm), SPR:$Sdin)), 1923*9880d681SAndroid Build Coastguard Worker (VFMSS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>, 1924*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4]>; 1925*9880d681SAndroid Build Coastguard Worker 1926*9880d681SAndroid Build Coastguard Workerdef VFNMAD : ADbI<0b11101, 0b01, 1, 0, 1927*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm), 1928*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC64, "vfnma", ".f64\t$Dd, $Dn, $Dm", 1929*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd,(fsub_mlx (fneg (fmul_su DPR:$Dn,DPR:$Dm)), 1930*9880d681SAndroid Build Coastguard Worker (f64 DPR:$Ddin)))]>, 1931*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Ddin = $Dd">, 1932*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP,UseFusedMAC]>; 1933*9880d681SAndroid Build Coastguard Worker 1934*9880d681SAndroid Build Coastguard Workerdef VFNMAS : ASbI<0b11101, 0b01, 1, 0, 1935*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1936*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC32, "vfnma", ".f32\t$Sd, $Sn, $Sm", 1937*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fsub_mlx (fneg (fmul_su SPR:$Sn, SPR:$Sm)), 1938*9880d681SAndroid Build Coastguard Worker SPR:$Sdin))]>, 1939*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1940*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,DontUseNEONForFP,UseFusedMAC]> { 1941*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1942*9880d681SAndroid Build Coastguard Worker // VFP pipelines. 1943*9880d681SAndroid Build Coastguard Worker} 1944*9880d681SAndroid Build Coastguard Worker 1945*9880d681SAndroid Build Coastguard Workerdef VFNMAH : AHbI<0b11101, 0b01, 1, 0, 1946*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1947*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC16, "vfnma", ".f16\t$Sd, $Sn, $Sm", 1948*9880d681SAndroid Build Coastguard Worker []>, 1949*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1950*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16,UseFusedMAC]>; 1951*9880d681SAndroid Build Coastguard Worker 1952*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx (fneg (fmul_su DPR:$a, (f64 DPR:$b))), DPR:$dstin), 1953*9880d681SAndroid Build Coastguard Worker (VFNMAD DPR:$dstin, DPR:$a, DPR:$b)>, 1954*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP,UseFusedMAC]>; 1955*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx (fneg (fmul_su SPR:$a, SPR:$b)), SPR:$dstin), 1956*9880d681SAndroid Build Coastguard Worker (VFNMAS SPR:$dstin, SPR:$a, SPR:$b)>, 1957*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,DontUseNEONForFP,UseFusedMAC]>; 1958*9880d681SAndroid Build Coastguard Worker 1959*9880d681SAndroid Build Coastguard Worker// Match @llvm.fma.* intrinsics 1960*9880d681SAndroid Build Coastguard Worker// (fneg (fma x, y, z)) -> (vfnma z, x, y) 1961*9880d681SAndroid Build Coastguard Workerdef : Pat<(fneg (fma (f64 DPR:$Dn), (f64 DPR:$Dm), (f64 DPR:$Ddin))), 1962*9880d681SAndroid Build Coastguard Worker (VFNMAD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>, 1963*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP]>; 1964*9880d681SAndroid Build Coastguard Workerdef : Pat<(fneg (fma (f32 SPR:$Sn), (f32 SPR:$Sm), (f32 SPR:$Sdin))), 1965*9880d681SAndroid Build Coastguard Worker (VFNMAS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>, 1966*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4]>; 1967*9880d681SAndroid Build Coastguard Worker// (fma (fneg x), y, (fneg z)) -> (vfnma z, x, y) 1968*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma (fneg DPR:$Dn), DPR:$Dm, (fneg DPR:$Ddin))), 1969*9880d681SAndroid Build Coastguard Worker (VFNMAD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>, 1970*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP]>; 1971*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma (fneg SPR:$Sn), SPR:$Sm, (fneg SPR:$Sdin))), 1972*9880d681SAndroid Build Coastguard Worker (VFNMAS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>, 1973*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4]>; 1974*9880d681SAndroid Build Coastguard Worker 1975*9880d681SAndroid Build Coastguard Workerdef VFNMSD : ADbI<0b11101, 0b01, 0, 0, 1976*9880d681SAndroid Build Coastguard Worker (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm), 1977*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC64, "vfnms", ".f64\t$Dd, $Dn, $Dm", 1978*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, (fsub_mlx (fmul_su DPR:$Dn, DPR:$Dm), 1979*9880d681SAndroid Build Coastguard Worker (f64 DPR:$Ddin)))]>, 1980*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Ddin = $Dd">, 1981*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP,UseFusedMAC]>; 1982*9880d681SAndroid Build Coastguard Worker 1983*9880d681SAndroid Build Coastguard Workerdef VFNMSS : ASbI<0b11101, 0b01, 0, 0, 1984*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1985*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC32, "vfnms", ".f32\t$Sd, $Sn, $Sm", 1986*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, (fsub_mlx (fmul_su SPR:$Sn, SPR:$Sm), SPR:$Sdin))]>, 1987*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1988*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,DontUseNEONForFP,UseFusedMAC]> { 1989*9880d681SAndroid Build Coastguard Worker // Some single precision VFP instructions may be executed on both NEON and 1990*9880d681SAndroid Build Coastguard Worker // VFP pipelines. 1991*9880d681SAndroid Build Coastguard Worker} 1992*9880d681SAndroid Build Coastguard Worker 1993*9880d681SAndroid Build Coastguard Workerdef VFNMSH : AHbI<0b11101, 0b01, 0, 0, 1994*9880d681SAndroid Build Coastguard Worker (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm), 1995*9880d681SAndroid Build Coastguard Worker IIC_fpFMAC16, "vfnms", ".f16\t$Sd, $Sn, $Sm", 1996*9880d681SAndroid Build Coastguard Worker []>, 1997*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sdin = $Sd">, 1998*9880d681SAndroid Build Coastguard Worker Requires<[HasFullFP16,UseFusedMAC]>; 1999*9880d681SAndroid Build Coastguard Worker 2000*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx (fmul_su DPR:$a, (f64 DPR:$b)), DPR:$dstin), 2001*9880d681SAndroid Build Coastguard Worker (VFNMSD DPR:$dstin, DPR:$a, DPR:$b)>, 2002*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP,UseFusedMAC]>; 2003*9880d681SAndroid Build Coastguard Workerdef : Pat<(fsub_mlx (fmul_su SPR:$a, SPR:$b), SPR:$dstin), 2004*9880d681SAndroid Build Coastguard Worker (VFNMSS SPR:$dstin, SPR:$a, SPR:$b)>, 2005*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,DontUseNEONForFP,UseFusedMAC]>; 2006*9880d681SAndroid Build Coastguard Worker 2007*9880d681SAndroid Build Coastguard Worker// Match @llvm.fma.* intrinsics 2008*9880d681SAndroid Build Coastguard Worker 2009*9880d681SAndroid Build Coastguard Worker// (fma x, y, (fneg z)) -> (vfnms z, x, y)) 2010*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma DPR:$Dn, DPR:$Dm, (fneg DPR:$Ddin))), 2011*9880d681SAndroid Build Coastguard Worker (VFNMSD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>, 2012*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP]>; 2013*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma SPR:$Sn, SPR:$Sm, (fneg SPR:$Sdin))), 2014*9880d681SAndroid Build Coastguard Worker (VFNMSS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>, 2015*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4]>; 2016*9880d681SAndroid Build Coastguard Worker// (fneg (fma (fneg x), y, z)) -> (vfnms z, x, y) 2017*9880d681SAndroid Build Coastguard Workerdef : Pat<(fneg (f64 (fma (fneg DPR:$Dn), DPR:$Dm, DPR:$Ddin))), 2018*9880d681SAndroid Build Coastguard Worker (VFNMSD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>, 2019*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP]>; 2020*9880d681SAndroid Build Coastguard Workerdef : Pat<(fneg (f32 (fma (fneg SPR:$Sn), SPR:$Sm, SPR:$Sdin))), 2021*9880d681SAndroid Build Coastguard Worker (VFNMSS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>, 2022*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4]>; 2023*9880d681SAndroid Build Coastguard Worker// (fneg (fma x, (fneg y), z) -> (vfnms z, x, y) 2024*9880d681SAndroid Build Coastguard Workerdef : Pat<(fneg (f64 (fma DPR:$Dn, (fneg DPR:$Dm), DPR:$Ddin))), 2025*9880d681SAndroid Build Coastguard Worker (VFNMSD DPR:$Ddin, DPR:$Dn, DPR:$Dm)>, 2026*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4,HasDPVFP]>; 2027*9880d681SAndroid Build Coastguard Workerdef : Pat<(fneg (f32 (fma SPR:$Sn, (fneg SPR:$Sm), SPR:$Sdin))), 2028*9880d681SAndroid Build Coastguard Worker (VFNMSS SPR:$Sdin, SPR:$Sn, SPR:$Sm)>, 2029*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP4]>; 2030*9880d681SAndroid Build Coastguard Worker 2031*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2032*9880d681SAndroid Build Coastguard Worker// FP Conditional moves. 2033*9880d681SAndroid Build Coastguard Worker// 2034*9880d681SAndroid Build Coastguard Worker 2035*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 2036*9880d681SAndroid Build Coastguard Workerdef VMOVDcc : PseudoInst<(outs DPR:$Dd), (ins DPR:$Dn, DPR:$Dm, cmovpred:$p), 2037*9880d681SAndroid Build Coastguard Worker IIC_fpUNA64, 2038*9880d681SAndroid Build Coastguard Worker [(set (f64 DPR:$Dd), 2039*9880d681SAndroid Build Coastguard Worker (ARMcmov DPR:$Dn, DPR:$Dm, cmovpred:$p))]>, 2040*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Dn = $Dd">, Requires<[HasVFP2,HasDPVFP]>; 2041*9880d681SAndroid Build Coastguard Worker 2042*9880d681SAndroid Build Coastguard Workerdef VMOVScc : PseudoInst<(outs SPR:$Sd), (ins SPR:$Sn, SPR:$Sm, cmovpred:$p), 2043*9880d681SAndroid Build Coastguard Worker IIC_fpUNA32, 2044*9880d681SAndroid Build Coastguard Worker [(set (f32 SPR:$Sd), 2045*9880d681SAndroid Build Coastguard Worker (ARMcmov SPR:$Sn, SPR:$Sm, cmovpred:$p))]>, 2046*9880d681SAndroid Build Coastguard Worker RegConstraint<"$Sn = $Sd">, Requires<[HasVFP2]>; 2047*9880d681SAndroid Build Coastguard Worker} // hasSideEffects 2048*9880d681SAndroid Build Coastguard Worker 2049*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2050*9880d681SAndroid Build Coastguard Worker// Move from VFP System Register to ARM core register. 2051*9880d681SAndroid Build Coastguard Worker// 2052*9880d681SAndroid Build Coastguard Worker 2053*9880d681SAndroid Build Coastguard Workerclass MovFromVFP<bits<4> opc19_16, dag oops, dag iops, string opc, string asm, 2054*9880d681SAndroid Build Coastguard Worker list<dag> pattern>: 2055*9880d681SAndroid Build Coastguard Worker VFPAI<oops, iops, VFPMiscFrm, IIC_fpSTAT, opc, asm, pattern> { 2056*9880d681SAndroid Build Coastguard Worker 2057*9880d681SAndroid Build Coastguard Worker // Instruction operand. 2058*9880d681SAndroid Build Coastguard Worker bits<4> Rt; 2059*9880d681SAndroid Build Coastguard Worker 2060*9880d681SAndroid Build Coastguard Worker let Inst{27-20} = 0b11101111; 2061*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = opc19_16; 2062*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Rt; 2063*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = 0b1010; 2064*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; 2065*9880d681SAndroid Build Coastguard Worker let Inst{6-5} = 0b00; 2066*9880d681SAndroid Build Coastguard Worker let Inst{4} = 1; 2067*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = 0b0000; 2068*9880d681SAndroid Build Coastguard Worker} 2069*9880d681SAndroid Build Coastguard Worker 2070*9880d681SAndroid Build Coastguard Worker// APSR is the application level alias of CPSR. This FPSCR N, Z, C, V flags 2071*9880d681SAndroid Build Coastguard Worker// to APSR. 2072*9880d681SAndroid Build Coastguard Workerlet Defs = [CPSR], Uses = [FPSCR_NZCV], Rt = 0b1111 /* apsr_nzcv */ in 2073*9880d681SAndroid Build Coastguard Workerdef FMSTAT : MovFromVFP<0b0001 /* fpscr */, (outs), (ins), 2074*9880d681SAndroid Build Coastguard Worker "vmrs", "\tAPSR_nzcv, fpscr", [(arm_fmstat)]>; 2075*9880d681SAndroid Build Coastguard Worker 2076*9880d681SAndroid Build Coastguard Worker// Application level FPSCR -> GPR 2077*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, Uses = [FPSCR] in 2078*9880d681SAndroid Build Coastguard Workerdef VMRS : MovFromVFP<0b0001 /* fpscr */, (outs GPR:$Rt), (ins), 2079*9880d681SAndroid Build Coastguard Worker "vmrs", "\t$Rt, fpscr", 2080*9880d681SAndroid Build Coastguard Worker [(set GPR:$Rt, (int_arm_get_fpscr))]>; 2081*9880d681SAndroid Build Coastguard Worker 2082*9880d681SAndroid Build Coastguard Worker// System level FPEXC, FPSID -> GPR 2083*9880d681SAndroid Build Coastguard Workerlet Uses = [FPSCR] in { 2084*9880d681SAndroid Build Coastguard Worker def VMRS_FPEXC : MovFromVFP<0b1000 /* fpexc */, (outs GPR:$Rt), (ins), 2085*9880d681SAndroid Build Coastguard Worker "vmrs", "\t$Rt, fpexc", []>; 2086*9880d681SAndroid Build Coastguard Worker def VMRS_FPSID : MovFromVFP<0b0000 /* fpsid */, (outs GPR:$Rt), (ins), 2087*9880d681SAndroid Build Coastguard Worker "vmrs", "\t$Rt, fpsid", []>; 2088*9880d681SAndroid Build Coastguard Worker def VMRS_MVFR0 : MovFromVFP<0b0111 /* mvfr0 */, (outs GPR:$Rt), (ins), 2089*9880d681SAndroid Build Coastguard Worker "vmrs", "\t$Rt, mvfr0", []>; 2090*9880d681SAndroid Build Coastguard Worker def VMRS_MVFR1 : MovFromVFP<0b0110 /* mvfr1 */, (outs GPR:$Rt), (ins), 2091*9880d681SAndroid Build Coastguard Worker "vmrs", "\t$Rt, mvfr1", []>; 2092*9880d681SAndroid Build Coastguard Worker def VMRS_MVFR2 : MovFromVFP<0b0101 /* mvfr2 */, (outs GPR:$Rt), (ins), 2093*9880d681SAndroid Build Coastguard Worker "vmrs", "\t$Rt, mvfr2", []>, Requires<[HasFPARMv8]>; 2094*9880d681SAndroid Build Coastguard Worker def VMRS_FPINST : MovFromVFP<0b1001 /* fpinst */, (outs GPR:$Rt), (ins), 2095*9880d681SAndroid Build Coastguard Worker "vmrs", "\t$Rt, fpinst", []>; 2096*9880d681SAndroid Build Coastguard Worker def VMRS_FPINST2 : MovFromVFP<0b1010 /* fpinst2 */, (outs GPR:$Rt), (ins), 2097*9880d681SAndroid Build Coastguard Worker "vmrs", "\t$Rt, fpinst2", []>; 2098*9880d681SAndroid Build Coastguard Worker} 2099*9880d681SAndroid Build Coastguard Worker 2100*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2101*9880d681SAndroid Build Coastguard Worker// Move from ARM core register to VFP System Register. 2102*9880d681SAndroid Build Coastguard Worker// 2103*9880d681SAndroid Build Coastguard Worker 2104*9880d681SAndroid Build Coastguard Workerclass MovToVFP<bits<4> opc19_16, dag oops, dag iops, string opc, string asm, 2105*9880d681SAndroid Build Coastguard Worker list<dag> pattern>: 2106*9880d681SAndroid Build Coastguard Worker VFPAI<oops, iops, VFPMiscFrm, IIC_fpSTAT, opc, asm, pattern> { 2107*9880d681SAndroid Build Coastguard Worker 2108*9880d681SAndroid Build Coastguard Worker // Instruction operand. 2109*9880d681SAndroid Build Coastguard Worker bits<4> src; 2110*9880d681SAndroid Build Coastguard Worker 2111*9880d681SAndroid Build Coastguard Worker // Encode instruction operand. 2112*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = src; 2113*9880d681SAndroid Build Coastguard Worker 2114*9880d681SAndroid Build Coastguard Worker let Inst{27-20} = 0b11101110; 2115*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = opc19_16; 2116*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = 0b1010; 2117*9880d681SAndroid Build Coastguard Worker let Inst{7} = 0; 2118*9880d681SAndroid Build Coastguard Worker let Inst{4} = 1; 2119*9880d681SAndroid Build Coastguard Worker} 2120*9880d681SAndroid Build Coastguard Worker 2121*9880d681SAndroid Build Coastguard Workerlet Defs = [FPSCR] in { 2122*9880d681SAndroid Build Coastguard Worker // Application level GPR -> FPSCR 2123*9880d681SAndroid Build Coastguard Worker def VMSR : MovToVFP<0b0001 /* fpscr */, (outs), (ins GPR:$src), 2124*9880d681SAndroid Build Coastguard Worker "vmsr", "\tfpscr, $src", [(int_arm_set_fpscr GPR:$src)]>; 2125*9880d681SAndroid Build Coastguard Worker // System level GPR -> FPEXC 2126*9880d681SAndroid Build Coastguard Worker def VMSR_FPEXC : MovToVFP<0b1000 /* fpexc */, (outs), (ins GPR:$src), 2127*9880d681SAndroid Build Coastguard Worker "vmsr", "\tfpexc, $src", []>; 2128*9880d681SAndroid Build Coastguard Worker // System level GPR -> FPSID 2129*9880d681SAndroid Build Coastguard Worker def VMSR_FPSID : MovToVFP<0b0000 /* fpsid */, (outs), (ins GPR:$src), 2130*9880d681SAndroid Build Coastguard Worker "vmsr", "\tfpsid, $src", []>; 2131*9880d681SAndroid Build Coastguard Worker 2132*9880d681SAndroid Build Coastguard Worker def VMSR_FPINST : MovToVFP<0b1001 /* fpinst */, (outs), (ins GPR:$src), 2133*9880d681SAndroid Build Coastguard Worker "vmsr", "\tfpinst, $src", []>; 2134*9880d681SAndroid Build Coastguard Worker def VMSR_FPINST2 : MovToVFP<0b1010 /* fpinst2 */, (outs), (ins GPR:$src), 2135*9880d681SAndroid Build Coastguard Worker "vmsr", "\tfpinst2, $src", []>; 2136*9880d681SAndroid Build Coastguard Worker} 2137*9880d681SAndroid Build Coastguard Worker 2138*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2139*9880d681SAndroid Build Coastguard Worker// Misc. 2140*9880d681SAndroid Build Coastguard Worker// 2141*9880d681SAndroid Build Coastguard Worker 2142*9880d681SAndroid Build Coastguard Worker// Materialize FP immediates. VFP3 only. 2143*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1 in { 2144*9880d681SAndroid Build Coastguard Workerdef FCONSTD : VFPAI<(outs DPR:$Dd), (ins vfp_f64imm:$imm), 2145*9880d681SAndroid Build Coastguard Worker VFPMiscFrm, IIC_fpUNA64, 2146*9880d681SAndroid Build Coastguard Worker "vmov", ".f64\t$Dd, $imm", 2147*9880d681SAndroid Build Coastguard Worker [(set DPR:$Dd, vfp_f64imm:$imm)]>, 2148*9880d681SAndroid Build Coastguard Worker Requires<[HasVFP3,HasDPVFP]> { 2149*9880d681SAndroid Build Coastguard Worker bits<5> Dd; 2150*9880d681SAndroid Build Coastguard Worker bits<8> imm; 2151*9880d681SAndroid Build Coastguard Worker 2152*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b11101; 2153*9880d681SAndroid Build Coastguard Worker let Inst{22} = Dd{4}; 2154*9880d681SAndroid Build Coastguard Worker let Inst{21-20} = 0b11; 2155*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm{7-4}; 2156*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Dd{3-0}; 2157*9880d681SAndroid Build Coastguard Worker let Inst{11-9} = 0b101; 2158*9880d681SAndroid Build Coastguard Worker let Inst{8} = 1; // Double precision. 2159*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = 0b0000; 2160*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = imm{3-0}; 2161*9880d681SAndroid Build Coastguard Worker} 2162*9880d681SAndroid Build Coastguard Worker 2163*9880d681SAndroid Build Coastguard Workerdef FCONSTS : VFPAI<(outs SPR:$Sd), (ins vfp_f32imm:$imm), 2164*9880d681SAndroid Build Coastguard Worker VFPMiscFrm, IIC_fpUNA32, 2165*9880d681SAndroid Build Coastguard Worker "vmov", ".f32\t$Sd, $imm", 2166*9880d681SAndroid Build Coastguard Worker [(set SPR:$Sd, vfp_f32imm:$imm)]>, Requires<[HasVFP3]> { 2167*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 2168*9880d681SAndroid Build Coastguard Worker bits<8> imm; 2169*9880d681SAndroid Build Coastguard Worker 2170*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b11101; 2171*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 2172*9880d681SAndroid Build Coastguard Worker let Inst{21-20} = 0b11; 2173*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm{7-4}; 2174*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 2175*9880d681SAndroid Build Coastguard Worker let Inst{11-9} = 0b101; 2176*9880d681SAndroid Build Coastguard Worker let Inst{8} = 0; // Single precision. 2177*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = 0b0000; 2178*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = imm{3-0}; 2179*9880d681SAndroid Build Coastguard Worker} 2180*9880d681SAndroid Build Coastguard Worker 2181*9880d681SAndroid Build Coastguard Workerdef FCONSTH : VFPAI<(outs SPR:$Sd), (ins vfp_f16imm:$imm), 2182*9880d681SAndroid Build Coastguard Worker VFPMiscFrm, IIC_fpUNA16, 2183*9880d681SAndroid Build Coastguard Worker "vmov", ".f16\t$Sd, $imm", 2184*9880d681SAndroid Build Coastguard Worker []>, Requires<[HasFullFP16]> { 2185*9880d681SAndroid Build Coastguard Worker bits<5> Sd; 2186*9880d681SAndroid Build Coastguard Worker bits<8> imm; 2187*9880d681SAndroid Build Coastguard Worker 2188*9880d681SAndroid Build Coastguard Worker let Inst{27-23} = 0b11101; 2189*9880d681SAndroid Build Coastguard Worker let Inst{22} = Sd{0}; 2190*9880d681SAndroid Build Coastguard Worker let Inst{21-20} = 0b11; 2191*9880d681SAndroid Build Coastguard Worker let Inst{19-16} = imm{7-4}; 2192*9880d681SAndroid Build Coastguard Worker let Inst{15-12} = Sd{4-1}; 2193*9880d681SAndroid Build Coastguard Worker let Inst{11-8} = 0b1001; // Half precision 2194*9880d681SAndroid Build Coastguard Worker let Inst{7-4} = 0b0000; 2195*9880d681SAndroid Build Coastguard Worker let Inst{3-0} = imm{3-0}; 2196*9880d681SAndroid Build Coastguard Worker} 2197*9880d681SAndroid Build Coastguard Worker} 2198*9880d681SAndroid Build Coastguard Worker 2199*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 2200*9880d681SAndroid Build Coastguard Worker// Assembler aliases. 2201*9880d681SAndroid Build Coastguard Worker// 2202*9880d681SAndroid Build Coastguard Worker// A few mnemonic aliases for pre-unifixed syntax. We don't guarantee to 2203*9880d681SAndroid Build Coastguard Worker// support them all, but supporting at least some of the basics is 2204*9880d681SAndroid Build Coastguard Worker// good to be friendly. 2205*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"flds", "vldr">; 2206*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fldd", "vldr">; 2207*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmrs", "vmov">; 2208*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmsr", "vmov">; 2209*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fsqrts", "vsqrt">; 2210*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fsqrtd", "vsqrt">; 2211*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fadds", "vadd.f32">; 2212*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"faddd", "vadd.f64">; 2213*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmrdd", "vmov">; 2214*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmrds", "vmov">; 2215*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmrrd", "vmov">; 2216*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmdrr", "vmov">; 2217*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmuls", "vmul.f32">; 2218*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmuld", "vmul.f64">; 2219*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fnegs", "vneg.f32">; 2220*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fnegd", "vneg.f64">; 2221*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"ftosizd", "vcvt.s32.f64">; 2222*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"ftosid", "vcvtr.s32.f64">; 2223*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"ftosizs", "vcvt.s32.f32">; 2224*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"ftosis", "vcvtr.s32.f32">; 2225*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"ftouizd", "vcvt.u32.f64">; 2226*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"ftouid", "vcvtr.u32.f64">; 2227*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"ftouizs", "vcvt.u32.f32">; 2228*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"ftouis", "vcvtr.u32.f32">; 2229*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fsitod", "vcvt.f64.s32">; 2230*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fsitos", "vcvt.f32.s32">; 2231*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fuitod", "vcvt.f64.u32">; 2232*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fuitos", "vcvt.f32.u32">; 2233*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fsts", "vstr">; 2234*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fstd", "vstr">; 2235*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmacd", "vmla.f64">; 2236*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmacs", "vmla.f32">; 2237*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fcpys", "vmov.f32">; 2238*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fcpyd", "vmov.f64">; 2239*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fcmps", "vcmp.f32">; 2240*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fcmpd", "vcmp.f64">; 2241*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fdivs", "vdiv.f32">; 2242*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fdivd", "vdiv.f64">; 2243*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmrx", "vmrs">; 2244*9880d681SAndroid Build Coastguard Workerdef : VFP2MnemonicAlias<"fmxr", "vmsr">; 2245*9880d681SAndroid Build Coastguard Worker 2246*9880d681SAndroid Build Coastguard Worker// Be friendly and accept the old form of zero-compare 2247*9880d681SAndroid Build Coastguard Workerdef : VFP2DPInstAlias<"fcmpzd${p} $val", (VCMPZD DPR:$val, pred:$p)>; 2248*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"fcmpzs${p} $val", (VCMPZS SPR:$val, pred:$p)>; 2249*9880d681SAndroid Build Coastguard Worker 2250*9880d681SAndroid Build Coastguard Worker 2251*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"fmstat${p}", (FMSTAT pred:$p)>; 2252*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"fadds${p} $Sd, $Sn, $Sm", 2253*9880d681SAndroid Build Coastguard Worker (VADDS SPR:$Sd, SPR:$Sn, SPR:$Sm, pred:$p)>; 2254*9880d681SAndroid Build Coastguard Workerdef : VFP2DPInstAlias<"faddd${p} $Dd, $Dn, $Dm", 2255*9880d681SAndroid Build Coastguard Worker (VADDD DPR:$Dd, DPR:$Dn, DPR:$Dm, pred:$p)>; 2256*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"fsubs${p} $Sd, $Sn, $Sm", 2257*9880d681SAndroid Build Coastguard Worker (VSUBS SPR:$Sd, SPR:$Sn, SPR:$Sm, pred:$p)>; 2258*9880d681SAndroid Build Coastguard Workerdef : VFP2DPInstAlias<"fsubd${p} $Dd, $Dn, $Dm", 2259*9880d681SAndroid Build Coastguard Worker (VSUBD DPR:$Dd, DPR:$Dn, DPR:$Dm, pred:$p)>; 2260*9880d681SAndroid Build Coastguard Worker 2261*9880d681SAndroid Build Coastguard Worker// No need for the size suffix on VSQRT. It's implied by the register classes. 2262*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vsqrt${p} $Sd, $Sm", (VSQRTS SPR:$Sd, SPR:$Sm, pred:$p)>; 2263*9880d681SAndroid Build Coastguard Workerdef : VFP2DPInstAlias<"vsqrt${p} $Dd, $Dm", (VSQRTD DPR:$Dd, DPR:$Dm, pred:$p)>; 2264*9880d681SAndroid Build Coastguard Worker 2265*9880d681SAndroid Build Coastguard Worker// VLDR/VSTR accept an optional type suffix. 2266*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vldr${p}.32 $Sd, $addr", 2267*9880d681SAndroid Build Coastguard Worker (VLDRS SPR:$Sd, addrmode5:$addr, pred:$p)>; 2268*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vstr${p}.32 $Sd, $addr", 2269*9880d681SAndroid Build Coastguard Worker (VSTRS SPR:$Sd, addrmode5:$addr, pred:$p)>; 2270*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vldr${p}.64 $Dd, $addr", 2271*9880d681SAndroid Build Coastguard Worker (VLDRD DPR:$Dd, addrmode5:$addr, pred:$p)>; 2272*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vstr${p}.64 $Dd, $addr", 2273*9880d681SAndroid Build Coastguard Worker (VSTRD DPR:$Dd, addrmode5:$addr, pred:$p)>; 2274*9880d681SAndroid Build Coastguard Worker 2275*9880d681SAndroid Build Coastguard Worker// VMOV can accept optional 32-bit or less data type suffix suffix. 2276*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p}.8 $Rt, $Sn", 2277*9880d681SAndroid Build Coastguard Worker (VMOVRS GPR:$Rt, SPR:$Sn, pred:$p)>; 2278*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p}.16 $Rt, $Sn", 2279*9880d681SAndroid Build Coastguard Worker (VMOVRS GPR:$Rt, SPR:$Sn, pred:$p)>; 2280*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p}.32 $Rt, $Sn", 2281*9880d681SAndroid Build Coastguard Worker (VMOVRS GPR:$Rt, SPR:$Sn, pred:$p)>; 2282*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p}.8 $Sn, $Rt", 2283*9880d681SAndroid Build Coastguard Worker (VMOVSR SPR:$Sn, GPR:$Rt, pred:$p)>; 2284*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p}.16 $Sn, $Rt", 2285*9880d681SAndroid Build Coastguard Worker (VMOVSR SPR:$Sn, GPR:$Rt, pred:$p)>; 2286*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p}.32 $Sn, $Rt", 2287*9880d681SAndroid Build Coastguard Worker (VMOVSR SPR:$Sn, GPR:$Rt, pred:$p)>; 2288*9880d681SAndroid Build Coastguard Worker 2289*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p}.f64 $Rt, $Rt2, $Dn", 2290*9880d681SAndroid Build Coastguard Worker (VMOVRRD GPR:$Rt, GPR:$Rt2, DPR:$Dn, pred:$p)>; 2291*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p}.f64 $Dn, $Rt, $Rt2", 2292*9880d681SAndroid Build Coastguard Worker (VMOVDRR DPR:$Dn, GPR:$Rt, GPR:$Rt2, pred:$p)>; 2293*9880d681SAndroid Build Coastguard Worker 2294*9880d681SAndroid Build Coastguard Worker// VMOVS doesn't need the .f32 to disambiguate from the NEON encoding the way 2295*9880d681SAndroid Build Coastguard Worker// VMOVD does. 2296*9880d681SAndroid Build Coastguard Workerdef : VFP2InstAlias<"vmov${p} $Sd, $Sm", 2297*9880d681SAndroid Build Coastguard Worker (VMOVS SPR:$Sd, SPR:$Sm, pred:$p)>; 2298*9880d681SAndroid Build Coastguard Worker 2299*9880d681SAndroid Build Coastguard Worker// FCONSTD/FCONSTS alias for vmov.f64/vmov.f32 2300*9880d681SAndroid Build Coastguard Worker// These aliases provide added functionality over vmov.f instructions by 2301*9880d681SAndroid Build Coastguard Worker// allowing users to write assembly containing encoded floating point constants 2302*9880d681SAndroid Build Coastguard Worker// (e.g. #0x70 vs #1.0). Without these alises there is no way for the 2303*9880d681SAndroid Build Coastguard Worker// assembler to accept encoded fp constants (but the equivalent fp-literal is 2304*9880d681SAndroid Build Coastguard Worker// accepted directly by vmovf). 2305*9880d681SAndroid Build Coastguard Workerdef : VFP3InstAlias<"fconstd${p} $Dd, $val", 2306*9880d681SAndroid Build Coastguard Worker (FCONSTD DPR:$Dd, vfp_f64imm:$val, pred:$p)>; 2307*9880d681SAndroid Build Coastguard Workerdef : VFP3InstAlias<"fconsts${p} $Sd, $val", 2308*9880d681SAndroid Build Coastguard Worker (FCONSTS SPR:$Sd, vfp_f32imm:$val, pred:$p)>; 2309