xref: /aosp_15_r20/external/llvm/lib/Target/ARM/ARMInstrVFP.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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