LLVM 24.0.0git
ARMFastISel.cpp
Go to the documentation of this file.
1//===- ARMFastISel.cpp - ARM FastISel implementation ----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ARM-specific support for the FastISel class. Some
10// of the target-specific code is generated by tablegen in the file
11// ARMGenFastISel.inc, which is #included here.
12//
13//===----------------------------------------------------------------------===//
14
15#include "ARM.h"
16#include "ARMBaseInstrInfo.h"
17#include "ARMBaseRegisterInfo.h"
18#include "ARMCallingConv.h"
20#include "ARMISelLowering.h"
22#include "ARMSubtarget.h"
23#include "ARMTargetMachine.h"
26#include "Utils/ARMBaseInfo.h"
27#include "llvm/ADT/APFloat.h"
28#include "llvm/ADT/APInt.h"
29#include "llvm/ADT/DenseMap.h"
50#include "llvm/IR/Argument.h"
51#include "llvm/IR/Attributes.h"
52#include "llvm/IR/CallingConv.h"
53#include "llvm/IR/Constant.h"
54#include "llvm/IR/Constants.h"
55#include "llvm/IR/DataLayout.h"
57#include "llvm/IR/Function.h"
59#include "llvm/IR/GlobalValue.h"
61#include "llvm/IR/InstrTypes.h"
62#include "llvm/IR/Instruction.h"
65#include "llvm/IR/Intrinsics.h"
66#include "llvm/IR/Module.h"
67#include "llvm/IR/Operator.h"
68#include "llvm/IR/Type.h"
69#include "llvm/IR/User.h"
70#include "llvm/IR/Value.h"
71#include "llvm/MC/MCInstrDesc.h"
78#include <cassert>
79#include <cstdint>
80#include <utility>
81
82using namespace llvm;
83
84namespace {
85
86 // All possible address modes, plus some.
87class Address {
88public:
89 enum BaseKind { RegBase, FrameIndexBase };
90
91private:
92 BaseKind Kind = RegBase;
93 union {
94 unsigned Reg;
95 int FI;
96 } Base;
97
98 int Offset = 0;
99
100public:
101 // Innocuous defaults for our address.
102 Address() { Base.Reg = 0; }
103
104 void setKind(BaseKind K) { Kind = K; }
105 BaseKind getKind() const { return Kind; }
106 bool isRegBase() const { return Kind == RegBase; }
107 bool isFIBase() const { return Kind == FrameIndexBase; }
108
109 void setReg(Register Reg) {
110 assert(isRegBase() && "Invalid base register access!");
111 Base.Reg = Reg.id();
112 }
113
114 Register getReg() const {
115 assert(isRegBase() && "Invalid base register access!");
116 return Base.Reg;
117 }
118
119 void setFI(int FI) {
120 assert(isFIBase() && "Invalid base frame index access!");
121 Base.FI = FI;
122 }
123
124 int getFI() const {
125 assert(isFIBase() && "Invalid base frame index access!");
126 return Base.FI;
127 }
128
129 void setOffset(int O) { Offset = O; }
130 int getOffset() { return Offset; }
131};
132
133class ARMFastISel final : public FastISel {
134 /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
135 /// make the right decision when generating code for different targets.
136 const ARMSubtarget *Subtarget;
137 Module &M;
138 const ARMBaseInstrInfo &TII;
139 const ARMTargetLowering &TLI;
140 const ARMBaseTargetMachine &TM;
141 ARMFunctionInfo *AFI;
142
143 // Convenience variables to avoid some queries.
144 bool isThumb2;
145 LLVMContext *Context;
146
147 public:
148 explicit ARMFastISel(FunctionLoweringInfo &funcInfo,
149 const TargetLibraryInfo *libInfo,
150 const LibcallLoweringInfo *libcallLowering)
151 : FastISel(funcInfo, libInfo, libcallLowering),
152 Subtarget(&funcInfo.MF->getSubtarget<ARMSubtarget>()),
153 M(const_cast<Module &>(*funcInfo.Fn->getParent())),
154 TII(*Subtarget->getInstrInfo()), TLI(*Subtarget->getTargetLowering()),
155 TM(TLI.getTM()) {
156 AFI = funcInfo.MF->getInfo<ARMFunctionInfo>();
157 isThumb2 = AFI->isThumbFunction();
158 Context = &funcInfo.Fn->getContext();
159 }
160
161 private:
162 // Code from FastISel.cpp.
163
164 Register fastEmitInst_r(unsigned MachineInstOpcode,
165 const TargetRegisterClass *RC, Register Op0);
166 Register fastEmitInst_rr(unsigned MachineInstOpcode,
167 const TargetRegisterClass *RC, Register Op0,
168 Register Op1);
169 Register fastEmitInst_ri(unsigned MachineInstOpcode,
170 const TargetRegisterClass *RC, Register Op0,
171 uint64_t Imm);
172 Register fastEmitInst_i(unsigned MachineInstOpcode,
173 const TargetRegisterClass *RC, uint64_t Imm);
174
175 // Backend specific FastISel code.
176
177 bool fastSelectInstruction(const Instruction *I) override;
178 Register fastMaterializeConstant(const Constant *C) override;
179 Register fastMaterializeAlloca(const AllocaInst *AI) override;
180 bool tryToFoldLoadIntoMI(MachineInstr *MI, unsigned OpNo,
181 const LoadInst *LI) override;
182 bool fastLowerArguments() override;
183
184#include "ARMGenFastISel.inc"
185
186 // Instruction selection routines.
187
188 bool SelectLoad(const Instruction *I);
189 bool SelectStore(const Instruction *I);
190 bool SelectBranch(const Instruction *I);
191 bool SelectIndirectBr(const Instruction *I);
192 bool SelectCmp(const Instruction *I);
193 bool SelectFPExt(const Instruction *I);
194 bool SelectFPTrunc(const Instruction *I);
195 bool SelectBinaryIntOp(const Instruction *I, unsigned ISDOpcode);
196 bool SelectBinaryFPOp(const Instruction *I, unsigned ISDOpcode);
197 bool SelectIToFP(const Instruction *I, bool isSigned);
198 bool SelectFPToI(const Instruction *I, bool isSigned);
199 bool SelectDiv(const Instruction *I, bool isSigned);
200 bool SelectRem(const Instruction *I, bool isSigned);
201 bool SelectCall(const Instruction *I, const char *IntrMemName);
202 bool SelectIntrinsicCall(const IntrinsicInst &I);
203 bool SelectSelect(const Instruction *I);
204 bool SelectRet(const Instruction *I);
205 bool SelectTrunc(const Instruction *I);
206 bool SelectIntExt(const Instruction *I);
207 bool SelectShift(const Instruction *I, ARM_AM::ShiftOpc ShiftTy);
208
209 // Utility routines.
210
211 bool isPositionIndependent() const;
212 bool isTypeLegal(Type *Ty, MVT &VT);
213 bool isLoadTypeLegal(Type *Ty, MVT &VT);
214 bool ARMEmitCmp(const Value *Src1Value, const Value *Src2Value,
215 bool isZExt);
216 bool ARMEmitLoad(MVT VT, Register &ResultReg, Address &Addr,
217 MaybeAlign Alignment = std::nullopt, bool isZExt = true,
218 bool allocReg = true);
219 bool ARMEmitStore(MVT VT, Register SrcReg, Address &Addr,
220 MaybeAlign Alignment = std::nullopt);
221 bool ARMComputeAddress(const Value *Obj, Address &Addr);
222 void ARMSimplifyAddress(Address &Addr, MVT VT, bool useAM3);
223 bool ARMIsMemCpySmall(uint64_t Len);
224 bool ARMTryEmitSmallMemCpy(Address Dest, Address Src, uint64_t Len,
225 MaybeAlign Alignment);
226 Register ARMEmitIntExt(MVT SrcVT, Register SrcReg, MVT DestVT, bool isZExt);
227 Register ARMMaterializeFP(const ConstantFP *CFP, MVT VT);
228 Register ARMMaterializeInt(const Constant *C, MVT VT);
229 Register ARMMaterializeGV(const GlobalValue *GV, MVT VT);
230 Register ARMMoveToFPReg(MVT VT, Register SrcReg);
231 Register ARMMoveToIntReg(MVT VT, Register SrcReg);
232 unsigned ARMSelectCallOp(bool UseReg);
233 Register ARMLowerPICELF(const GlobalValue *GV, MVT VT);
234
235 const TargetLowering *getTargetLowering() { return &TLI; }
236
237 // Call handling routines.
238
239 CCAssignFn *CCAssignFnForCall(CallingConv::ID CC,
240 bool Return,
241 bool isVarArg);
242 bool ProcessCallArgs(SmallVectorImpl<Value*> &Args,
243 SmallVectorImpl<Register> &ArgRegs,
244 SmallVectorImpl<MVT> &ArgVTs,
245 SmallVectorImpl<ISD::ArgFlagsTy> &ArgFlags,
246 SmallVectorImpl<Register> &RegArgs,
247 CallingConv::ID CC,
248 unsigned &NumBytes,
249 bool isVarArg);
250 Register getLibcallReg(const Twine &Name);
251 bool FinishCall(MVT RetVT, SmallVectorImpl<Register> &UsedRegs,
252 const Instruction *I, CallingConv::ID CC,
253 unsigned &NumBytes, bool isVarArg);
254 bool ARMEmitLibcall(const Instruction *I, RTLIB::Libcall Call);
255
256 // OptionalDef handling routines.
257
258 bool isARMNEONPred(const MachineInstr *MI);
259 bool DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR);
260 const MachineInstrBuilder &AddOptionalDefs(const MachineInstrBuilder &MIB);
261 void AddLoadStoreOperands(MVT VT, Address &Addr,
262 const MachineInstrBuilder &MIB,
263 MachineMemOperand::Flags Flags, bool useAM3);
264};
265
266} // end anonymous namespace
267
268// DefinesOptionalPredicate - This is different from DefinesPredicate in that
269// we don't care about implicit defs here, just places we'll need to add a
270// default CCReg argument. Sets CPSR if we're setting CPSR instead of CCR.
271bool ARMFastISel::DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR) {
272 if (!MI->hasOptionalDef())
273 return false;
274
275 // Look to see if our OptionalDef is defining CPSR or CCR.
276 for (const MachineOperand &MO : MI->operands()) {
277 if (!MO.isReg() || !MO.isDef()) continue;
278 if (MO.getReg() == ARM::CPSR)
279 *CPSR = true;
280 }
281 return true;
282}
283
284bool ARMFastISel::isARMNEONPred(const MachineInstr *MI) {
285 const MCInstrDesc &MCID = MI->getDesc();
286
287 // If we're a thumb2 or not NEON function we'll be handled via isPredicable.
289 AFI->isThumb2Function())
290 return MI->isPredicable();
291
292 for (const MCOperandInfo &opInfo : MCID.operands())
293 if (opInfo.isPredicate())
294 return true;
295
296 return false;
297}
298
299// If the machine is predicable go ahead and add the predicate operands, if
300// it needs default CC operands add those.
301// TODO: If we want to support thumb1 then we'll need to deal with optional
302// CPSR defs that need to be added before the remaining operands. See s_cc_out
303// for descriptions why.
304const MachineInstrBuilder &
305ARMFastISel::AddOptionalDefs(const MachineInstrBuilder &MIB) {
306 MachineInstr *MI = &*MIB;
307
308 // Do we use a predicate? or...
309 // Are we NEON in ARM mode and have a predicate operand? If so, I know
310 // we're not predicable but add it anyways.
311 if (isARMNEONPred(MI))
312 MIB.add(predOps(ARMCC::AL));
313
314 // Do we optionally set a predicate? Preds is size > 0 iff the predicate
315 // defines CPSR. All other OptionalDefines in ARM are the CCR register.
316 bool CPSR = false;
317 if (DefinesOptionalPredicate(MI, &CPSR))
318 MIB.add(CPSR ? t1CondCodeOp() : condCodeOp());
319 return MIB;
320}
321
322Register ARMFastISel::fastEmitInst_r(unsigned MachineInstOpcode,
323 const TargetRegisterClass *RC,
324 Register Op0) {
325 Register ResultReg = createResultReg(RC);
326 const MCInstrDesc &II = TII.get(MachineInstOpcode);
327
328 // Make sure the input operand is sufficiently constrained to be legal
329 // for this instruction.
330 Op0 = constrainOperandRegClass(II, Op0, 1);
331 if (II.getNumDefs() >= 1) {
332 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II,
333 ResultReg).addReg(Op0));
334 } else {
335 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II)
336 .addReg(Op0));
337 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
338 TII.get(TargetOpcode::COPY), ResultReg)
339 .addReg(II.implicit_defs()[0]));
340 }
341 return ResultReg;
342}
343
344Register ARMFastISel::fastEmitInst_rr(unsigned MachineInstOpcode,
345 const TargetRegisterClass *RC,
346 Register Op0, Register Op1) {
347 Register ResultReg = createResultReg(RC);
348 const MCInstrDesc &II = TII.get(MachineInstOpcode);
349
350 // Make sure the input operands are sufficiently constrained to be legal
351 // for this instruction.
352 Op0 = constrainOperandRegClass(II, Op0, 1);
353 Op1 = constrainOperandRegClass(II, Op1, 2);
354
355 if (II.getNumDefs() >= 1) {
356 AddOptionalDefs(
357 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II, ResultReg)
358 .addReg(Op0)
359 .addReg(Op1));
360 } else {
361 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II)
362 .addReg(Op0)
363 .addReg(Op1));
364 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
365 TII.get(TargetOpcode::COPY), ResultReg)
366 .addReg(II.implicit_defs()[0]));
367 }
368 return ResultReg;
369}
370
371Register ARMFastISel::fastEmitInst_ri(unsigned MachineInstOpcode,
372 const TargetRegisterClass *RC,
373 Register Op0, uint64_t Imm) {
374 Register ResultReg = createResultReg(RC);
375 const MCInstrDesc &II = TII.get(MachineInstOpcode);
376
377 // Make sure the input operand is sufficiently constrained to be legal
378 // for this instruction.
379 Op0 = constrainOperandRegClass(II, Op0, 1);
380 if (II.getNumDefs() >= 1) {
381 AddOptionalDefs(
382 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II, ResultReg)
383 .addReg(Op0)
384 .addImm(Imm));
385 } else {
386 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II)
387 .addReg(Op0)
388 .addImm(Imm));
389 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
390 TII.get(TargetOpcode::COPY), ResultReg)
391 .addReg(II.implicit_defs()[0]));
392 }
393 return ResultReg;
394}
395
396Register ARMFastISel::fastEmitInst_i(unsigned MachineInstOpcode,
397 const TargetRegisterClass *RC,
398 uint64_t Imm) {
399 Register ResultReg = createResultReg(RC);
400 const MCInstrDesc &II = TII.get(MachineInstOpcode);
401
402 if (II.getNumDefs() >= 1) {
403 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II,
404 ResultReg).addImm(Imm));
405 } else {
406 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II)
407 .addImm(Imm));
408 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
409 TII.get(TargetOpcode::COPY), ResultReg)
410 .addReg(II.implicit_defs()[0]));
411 }
412 return ResultReg;
413}
414
415// TODO: Don't worry about 64-bit now, but when this is fixed remove the
416// checks from the various callers.
417Register ARMFastISel::ARMMoveToFPReg(MVT VT, Register SrcReg) {
418 if (VT == MVT::f64)
419 return Register();
420
421 Register MoveReg = createResultReg(TLI.getRegClassFor(VT));
422 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
423 TII.get(ARM::VMOVSR), MoveReg)
424 .addReg(SrcReg));
425 return MoveReg;
426}
427
428Register ARMFastISel::ARMMoveToIntReg(MVT VT, Register SrcReg) {
429 if (VT == MVT::i64)
430 return Register();
431
432 Register MoveReg = createResultReg(TLI.getRegClassFor(VT));
433 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
434 TII.get(ARM::VMOVRS), MoveReg)
435 .addReg(SrcReg));
436 return MoveReg;
437}
438
439// For double width floating point we need to materialize two constants
440// (the high and the low) into integer registers then use a move to get
441// the combined constant into an FP reg.
442Register ARMFastISel::ARMMaterializeFP(const ConstantFP *CFP, MVT VT) {
443 if (VT != MVT::f32 && VT != MVT::f64)
444 return Register();
445
446 const APFloat Val = CFP->getValueAPF();
447 bool is64bit = VT == MVT::f64;
448
449 // This checks to see if we can use VFP3 instructions to materialize
450 // a constant, otherwise we have to go through the constant pool.
451 if (TLI.isFPImmLegal(Val, VT)) {
452 int Imm;
453 unsigned Opc;
454 if (is64bit) {
455 Imm = ARM_AM::getFP64Imm(Val);
456 Opc = ARM::FCONSTD;
457 } else {
458 Imm = ARM_AM::getFP32Imm(Val);
459 Opc = ARM::FCONSTS;
460 }
461 Register DestReg = createResultReg(TLI.getRegClassFor(VT));
462 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
463 TII.get(Opc), DestReg).addImm(Imm));
464 return DestReg;
465 }
466
467 // Require VFP2 for loading fp constants.
468 if (!Subtarget->hasVFP2Base()) return false;
469
470 // MachineConstantPool wants an explicit alignment.
471 Align Alignment = DL.getPrefTypeAlign(CFP->getType());
472 unsigned Idx = MCP.getConstantPoolIndex(cast<Constant>(CFP), Alignment);
473 Register DestReg = createResultReg(TLI.getRegClassFor(VT));
474 unsigned Opc = is64bit ? ARM::VLDRD : ARM::VLDRS;
475
476 // The extra reg is for addrmode5.
477 AddOptionalDefs(
478 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opc), DestReg)
480 .addReg(0));
481 return DestReg;
482}
483
484Register ARMFastISel::ARMMaterializeInt(const Constant *C, MVT VT) {
485 if (VT != MVT::i32 && VT != MVT::i16 && VT != MVT::i8 && VT != MVT::i1)
486 return Register();
487
488 // If we can do this in a single instruction without a constant pool entry
489 // do so now.
490 const ConstantInt *CI = cast<ConstantInt>(C);
491 if (Subtarget->hasV6T2Ops() && isUInt<16>(CI->getZExtValue())) {
492 unsigned Opc = isThumb2 ? ARM::t2MOVi16 : ARM::MOVi16;
493 const TargetRegisterClass *RC = isThumb2 ? &ARM::rGPRRegClass :
494 &ARM::GPRRegClass;
495 Register ImmReg = createResultReg(RC);
496 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
497 TII.get(Opc), ImmReg)
498 .addImm(CI->getZExtValue()));
499 return ImmReg;
500 }
501
502 // Use MVN to emit negative constants.
503 if (VT == MVT::i32 && Subtarget->hasV6T2Ops() && CI->isNegative()) {
504 unsigned Imm = (unsigned)~(CI->getSExtValue());
505 bool UseImm = isThumb2 ? (ARM_AM::getT2SOImmVal(Imm) != -1) :
506 (ARM_AM::getSOImmVal(Imm) != -1);
507 if (UseImm) {
508 unsigned Opc = isThumb2 ? ARM::t2MVNi : ARM::MVNi;
509 const TargetRegisterClass *RC = isThumb2 ? &ARM::rGPRRegClass :
510 &ARM::GPRRegClass;
511 Register ImmReg = createResultReg(RC);
512 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
513 TII.get(Opc), ImmReg)
514 .addImm(Imm));
515 return ImmReg;
516 }
517 }
518
519 Register ResultReg;
520 if (Subtarget->useMovt())
521 ResultReg = fastEmit_i(VT, VT, ISD::Constant, CI->getZExtValue());
522
523 if (ResultReg)
524 return ResultReg;
525
526 // Load from constant pool. For now 32-bit only.
527 if (VT != MVT::i32)
528 return Register();
529
530 // MachineConstantPool wants an explicit alignment.
531 Align Alignment = DL.getPrefTypeAlign(C->getType());
532 unsigned Idx = MCP.getConstantPoolIndex(C, Alignment);
533 ResultReg = createResultReg(TLI.getRegClassFor(VT));
534 if (isThumb2)
535 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
536 TII.get(ARM::t2LDRpci), ResultReg)
538 else {
539 // The extra immediate is for addrmode2.
540 ResultReg = constrainOperandRegClass(TII.get(ARM::LDRcp), ResultReg, 0);
541 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
542 TII.get(ARM::LDRcp), ResultReg)
544 .addImm(0));
545 }
546 return ResultReg;
547}
548
549bool ARMFastISel::isPositionIndependent() const {
550 return TLI.isPositionIndependent();
551}
552
553Register ARMFastISel::ARMMaterializeGV(const GlobalValue *GV, MVT VT) {
554 // For now 32-bit only.
555 if (VT != MVT::i32 || GV->isThreadLocal())
556 return Register();
557
558 // ROPI/RWPI not currently supported.
559 if (Subtarget->isROPI() || Subtarget->isRWPI())
560 return Register();
561
562 bool IsIndirect = Subtarget->isGVIndirectSymbol(GV);
563 const TargetRegisterClass *RC = isThumb2 ? &ARM::rGPRRegClass
564 : &ARM::GPRRegClass;
565 Register DestReg = createResultReg(RC);
566
567 // FastISel TLS support on non-MachO is broken, punt to SelectionDAG.
568 const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
569 bool IsThreadLocal = GVar && GVar->isThreadLocal();
570 if (!Subtarget->isTargetMachO() && IsThreadLocal)
571 return Register();
572
573 bool IsPositionIndependent = isPositionIndependent();
574 // Use movw+movt when possible, it avoids constant pool entries.
575 // Non-darwin targets only support static movt relocations in FastISel.
576 if (Subtarget->useMovt() &&
577 (Subtarget->isTargetMachO() || !IsPositionIndependent)) {
578 unsigned Opc;
579 unsigned char TF = 0;
580 if (Subtarget->isTargetMachO())
582
583 if (IsPositionIndependent)
584 Opc = isThumb2 ? ARM::t2MOV_ga_pcrel : ARM::MOV_ga_pcrel;
585 else
586 Opc = isThumb2 ? ARM::t2MOVi32imm : ARM::MOVi32imm;
587 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
588 TII.get(Opc), DestReg).addGlobalAddress(GV, 0, TF));
589 } else {
590 // MachineConstantPool wants an explicit alignment.
591 Align Alignment = DL.getPrefTypeAlign(GV->getType());
592
593 if (Subtarget->isTargetELF() && IsPositionIndependent)
594 return ARMLowerPICELF(GV, VT);
595
596 // Grab index.
597 unsigned PCAdj = IsPositionIndependent ? (Subtarget->isThumb() ? 4 : 8) : 0;
598 unsigned Id = AFI->createPICLabelUId();
599 ARMConstantPoolValue *CPV = ARMConstantPoolConstant::Create(GV, Id,
601 PCAdj);
602 unsigned Idx = MCP.getConstantPoolIndex(CPV, Alignment);
603
604 // Load value.
605 MachineInstrBuilder MIB;
606 if (isThumb2) {
607 unsigned Opc = IsPositionIndependent ? ARM::t2LDRpci_pic : ARM::t2LDRpci;
608 MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opc),
609 DestReg).addConstantPoolIndex(Idx);
610 if (IsPositionIndependent)
611 MIB.addImm(Id);
612 AddOptionalDefs(MIB);
613 } else {
614 // The extra immediate is for addrmode2.
615 DestReg = constrainOperandRegClass(TII.get(ARM::LDRcp), DestReg, 0);
616 MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
617 TII.get(ARM::LDRcp), DestReg)
619 .addImm(0);
620 AddOptionalDefs(MIB);
621
622 if (IsPositionIndependent) {
623 unsigned Opc = IsIndirect ? ARM::PICLDR : ARM::PICADD;
624 Register NewDestReg = createResultReg(TLI.getRegClassFor(VT));
625
626 MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
627 MIMD, TII.get(Opc), NewDestReg)
628 .addReg(DestReg)
629 .addImm(Id);
630 AddOptionalDefs(MIB);
631 return NewDestReg;
632 }
633 }
634 }
635
636 if ((Subtarget->isTargetELF() && Subtarget->isGVInGOT(GV)) ||
637 (Subtarget->isTargetMachO() && IsIndirect)) {
638 MachineInstrBuilder MIB;
639 Register NewDestReg = createResultReg(TLI.getRegClassFor(VT));
640 if (isThumb2)
641 MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
642 TII.get(ARM::t2LDRi12), NewDestReg)
643 .addReg(DestReg)
644 .addImm(0);
645 else
646 MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
647 TII.get(ARM::LDRi12), NewDestReg)
648 .addReg(DestReg)
649 .addImm(0);
650 DestReg = NewDestReg;
651 AddOptionalDefs(MIB);
652 }
653
654 return DestReg;
655}
656
657Register ARMFastISel::fastMaterializeConstant(const Constant *C) {
658 EVT CEVT = TLI.getValueType(DL, C->getType(), true);
659
660 // Only handle simple types.
661 if (!CEVT.isSimple())
662 return Register();
663 MVT VT = CEVT.getSimpleVT();
664
665 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C))
666 return ARMMaterializeFP(CFP, VT);
667 else if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
668 return ARMMaterializeGV(GV, VT);
669 else if (isa<ConstantInt>(C))
670 return ARMMaterializeInt(C, VT);
671
672 return Register();
673}
674
675// TODO: Register ARMFastISel::TargetMaterializeFloatZero(const ConstantFP *CF);
676
677Register ARMFastISel::fastMaterializeAlloca(const AllocaInst *AI) {
678 // Don't handle dynamic allocas.
679 if (!FuncInfo.StaticAllocaMap.count(AI))
680 return Register();
681
682 MVT VT;
683 if (!isLoadTypeLegal(AI->getType(), VT))
684 return Register();
685
686 auto SI = FuncInfo.StaticAllocaMap.find(AI);
687
688 // This will get lowered later into the correct offsets and registers
689 // via rewriteXFrameIndex.
690 if (SI != FuncInfo.StaticAllocaMap.end()) {
691 unsigned Opc = isThumb2 ? ARM::t2ADDri : ARM::ADDri;
692 const TargetRegisterClass* RC = TLI.getRegClassFor(VT);
693 Register ResultReg = createResultReg(RC);
694 ResultReg = constrainOperandRegClass(TII.get(Opc), ResultReg, 0);
695
696 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
697 TII.get(Opc), ResultReg)
698 .addFrameIndex(SI->second)
699 .addImm(0));
700 return ResultReg;
701 }
702
703 return Register();
704}
705
706bool ARMFastISel::isTypeLegal(Type *Ty, MVT &VT) {
707 EVT evt = TLI.getValueType(DL, Ty, true);
708
709 // Only handle simple types.
710 if (evt == MVT::Other || !evt.isSimple()) return false;
711 VT = evt.getSimpleVT();
712
713 // Handle all legal types, i.e. a register that will directly hold this
714 // value.
715 return TLI.isTypeLegal(VT);
716}
717
718bool ARMFastISel::isLoadTypeLegal(Type *Ty, MVT &VT) {
719 if (isTypeLegal(Ty, VT)) return true;
720
721 // If this is a type than can be sign or zero-extended to a basic operation
722 // go ahead and accept it now.
723 if (VT == MVT::i1 || VT == MVT::i8 || VT == MVT::i16)
724 return true;
725
726 return false;
727}
728
729// Computes the address to get to an object.
730bool ARMFastISel::ARMComputeAddress(const Value *Obj, Address &Addr) {
731 // Some boilerplate from the X86 FastISel.
732 const User *U = nullptr;
733 unsigned Opcode = Instruction::UserOp1;
734 if (const Instruction *I = dyn_cast<Instruction>(Obj)) {
735 // Don't walk into other basic blocks unless the object is an alloca from
736 // another block, otherwise it may not have a virtual register assigned.
737 if (FuncInfo.StaticAllocaMap.count(static_cast<const AllocaInst *>(Obj)) ||
738 FuncInfo.getMBB(I->getParent()) == FuncInfo.MBB) {
739 Opcode = I->getOpcode();
740 U = I;
741 }
742 } else if (const ConstantExpr *C = dyn_cast<ConstantExpr>(Obj)) {
743 Opcode = C->getOpcode();
744 U = C;
745 }
746
747 if (PointerType *Ty = dyn_cast<PointerType>(Obj->getType()))
748 if (Ty->getAddressSpace() > 255)
749 // Fast instruction selection doesn't support the special
750 // address spaces.
751 return false;
752
753 switch (Opcode) {
754 default:
755 break;
756 case Instruction::BitCast:
757 // Look through bitcasts.
758 return ARMComputeAddress(U->getOperand(0), Addr);
759 case Instruction::IntToPtr:
760 // Look past no-op inttoptrs.
761 if (TLI.getValueType(DL, U->getOperand(0)->getType()) ==
762 TLI.getPointerTy(DL))
763 return ARMComputeAddress(U->getOperand(0), Addr);
764 break;
765 case Instruction::PtrToInt:
766 // Look past no-op ptrtoints.
767 if (TLI.getValueType(DL, U->getType()) == TLI.getPointerTy(DL))
768 return ARMComputeAddress(U->getOperand(0), Addr);
769 break;
770 case Instruction::GetElementPtr: {
771 Address SavedAddr = Addr;
772 int TmpOffset = Addr.getOffset();
773
774 // Iterate through the GEP folding the constants into offsets where
775 // we can.
777 for (User::const_op_iterator i = U->op_begin() + 1, e = U->op_end();
778 i != e; ++i, ++GTI) {
779 const Value *Op = *i;
780 if (StructType *STy = GTI.getStructTypeOrNull()) {
781 const StructLayout *SL = DL.getStructLayout(STy);
782 unsigned Idx = cast<ConstantInt>(Op)->getZExtValue();
783 TmpOffset += SL->getElementOffset(Idx);
784 } else {
785 uint64_t S = GTI.getSequentialElementStride(DL);
786 while (true) {
787 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Op)) {
788 // Constant-offset addressing.
789 TmpOffset += CI->getSExtValue() * S;
790 break;
791 }
792 if (canFoldAddIntoGEP(U, Op)) {
793 // A compatible add with a constant operand. Fold the constant.
794 ConstantInt *CI =
795 cast<ConstantInt>(cast<AddOperator>(Op)->getOperand(1));
796 TmpOffset += CI->getSExtValue() * S;
797 // Iterate on the other operand.
798 Op = cast<AddOperator>(Op)->getOperand(0);
799 continue;
800 }
801 // Unsupported
802 goto unsupported_gep;
803 }
804 }
805 }
806
807 // Try to grab the base operand now.
808 Addr.setOffset(TmpOffset);
809 if (ARMComputeAddress(U->getOperand(0), Addr)) return true;
810
811 // We failed, restore everything and try the other options.
812 Addr = SavedAddr;
813
814 unsupported_gep:
815 break;
816 }
817 case Instruction::Alloca: {
818 const AllocaInst *AI = cast<AllocaInst>(Obj);
819 auto SI = FuncInfo.StaticAllocaMap.find(AI);
820 if (SI != FuncInfo.StaticAllocaMap.end()) {
821 Addr.setKind(Address::FrameIndexBase);
822 Addr.setFI(SI->second);
823 return true;
824 }
825 break;
826 }
827 }
828
829 // Try to get this in a register if nothing else has worked.
830 if (!Addr.getReg())
831 Addr.setReg(getRegForValue(Obj));
832 return Addr.getReg();
833}
834
835void ARMFastISel::ARMSimplifyAddress(Address &Addr, MVT VT, bool useAM3) {
836 bool needsLowering = false;
837 switch (VT.SimpleTy) {
838 default: llvm_unreachable("Unhandled load/store type!");
839 case MVT::i1:
840 case MVT::i8:
841 case MVT::i16:
842 case MVT::i32:
843 if (!useAM3) {
844 // Integer loads/stores handle 12-bit offsets.
845 needsLowering = ((Addr.getOffset() & 0xfff) != Addr.getOffset());
846 // Handle negative offsets.
847 if (needsLowering && isThumb2)
848 needsLowering = !(Subtarget->hasV6T2Ops() && Addr.getOffset() < 0 &&
849 Addr.getOffset() > -256);
850 } else {
851 // ARM halfword load/stores and signed byte loads use +/-imm8 offsets.
852 needsLowering = (Addr.getOffset() > 255 || Addr.getOffset() < -255);
853 }
854 break;
855 case MVT::f32:
856 case MVT::f64:
857 // Floating point operands handle 8-bit offsets.
858 needsLowering = ((Addr.getOffset() & 0xff) != Addr.getOffset());
859 break;
860 }
861
862 // If this is a stack pointer and the offset needs to be simplified then
863 // put the alloca address into a register, set the base type back to
864 // register and continue. This should almost never happen.
865 if (needsLowering && Addr.isFIBase()) {
866 const TargetRegisterClass *RC = isThumb2 ? &ARM::tGPRRegClass
867 : &ARM::GPRRegClass;
868 Register ResultReg = createResultReg(RC);
869 unsigned Opc = isThumb2 ? ARM::t2ADDri : ARM::ADDri;
870 AddOptionalDefs(
871 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opc), ResultReg)
872 .addFrameIndex(Addr.getFI())
873 .addImm(0));
874 Addr.setKind(Address::RegBase);
875 Addr.setReg(ResultReg);
876 }
877
878 // Since the offset is too large for the load/store instruction
879 // get the reg+offset into a register.
880 if (needsLowering) {
881 Addr.setReg(fastEmit_ri_(MVT::i32, ISD::ADD, Addr.getReg(),
882 Addr.getOffset(), MVT::i32));
883 Addr.setOffset(0);
884 }
885}
886
887void ARMFastISel::AddLoadStoreOperands(MVT VT, Address &Addr,
888 const MachineInstrBuilder &MIB,
890 bool useAM3) {
891 // addrmode5 output depends on the selection dag addressing dividing the
892 // offset by 4 that it then later multiplies. Do this here as well.
893 if (VT.SimpleTy == MVT::f32 || VT.SimpleTy == MVT::f64)
894 Addr.setOffset(Addr.getOffset() / 4);
895
896 // Frame base works a bit differently. Handle it separately.
897 if (Addr.isFIBase()) {
898 int FI = Addr.getFI();
899 int Offset = Addr.getOffset();
900 MachineMemOperand *MMO = FuncInfo.MF->getMachineMemOperand(
901 MachinePointerInfo::getFixedStack(*FuncInfo.MF, FI, Offset), Flags,
902 MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
903 // Now add the rest of the operands.
904 MIB.addFrameIndex(FI);
905
906 // ARM halfword load/stores and signed byte loads need an additional
907 // operand.
908 if (useAM3) {
909 int Imm = (Addr.getOffset() < 0) ? (0x100 | -Addr.getOffset())
910 : Addr.getOffset();
911 MIB.addReg(0);
912 MIB.addImm(Imm);
913 } else {
914 MIB.addImm(Addr.getOffset());
915 }
916 MIB.addMemOperand(MMO);
917 } else {
918 // Now add the rest of the operands.
919 MIB.addReg(Addr.getReg());
920
921 // ARM halfword load/stores and signed byte loads need an additional
922 // operand.
923 if (useAM3) {
924 int Imm = (Addr.getOffset() < 0) ? (0x100 | -Addr.getOffset())
925 : Addr.getOffset();
926 MIB.addReg(0);
927 MIB.addImm(Imm);
928 } else {
929 MIB.addImm(Addr.getOffset());
930 }
931 }
932 AddOptionalDefs(MIB);
933}
934
935bool ARMFastISel::ARMEmitLoad(MVT VT, Register &ResultReg, Address &Addr,
936 MaybeAlign Alignment, bool isZExt,
937 bool allocReg) {
938 unsigned Opc;
939 bool useAM3 = false;
940 bool needVMOV = false;
941 const TargetRegisterClass *RC;
942 switch (VT.SimpleTy) {
943 // This is mostly going to be Neon/vector support.
944 default: return false;
945 case MVT::i1:
946 case MVT::i8:
947 if (isThumb2) {
948 if (Addr.getOffset() < 0 && Addr.getOffset() > -256 &&
949 Subtarget->hasV6T2Ops())
950 Opc = isZExt ? ARM::t2LDRBi8 : ARM::t2LDRSBi8;
951 else
952 Opc = isZExt ? ARM::t2LDRBi12 : ARM::t2LDRSBi12;
953 } else {
954 if (isZExt) {
955 Opc = ARM::LDRBi12;
956 } else {
957 Opc = ARM::LDRSB;
958 useAM3 = true;
959 }
960 }
961 RC = isThumb2 ? &ARM::rGPRRegClass : &ARM::GPRnopcRegClass;
962 break;
963 case MVT::i16:
964 if (Alignment && *Alignment < Align(2) &&
965 !Subtarget->allowsUnalignedMem())
966 return false;
967
968 if (isThumb2) {
969 if (Addr.getOffset() < 0 && Addr.getOffset() > -256 &&
970 Subtarget->hasV6T2Ops())
971 Opc = isZExt ? ARM::t2LDRHi8 : ARM::t2LDRSHi8;
972 else
973 Opc = isZExt ? ARM::t2LDRHi12 : ARM::t2LDRSHi12;
974 } else {
975 Opc = isZExt ? ARM::LDRH : ARM::LDRSH;
976 useAM3 = true;
977 }
978 RC = isThumb2 ? &ARM::rGPRRegClass : &ARM::GPRnopcRegClass;
979 break;
980 case MVT::i32:
981 if (Alignment && *Alignment < Align(4) &&
982 !Subtarget->allowsUnalignedMem())
983 return false;
984
985 if (isThumb2) {
986 if (Addr.getOffset() < 0 && Addr.getOffset() > -256 &&
987 Subtarget->hasV6T2Ops())
988 Opc = ARM::t2LDRi8;
989 else
990 Opc = ARM::t2LDRi12;
991 } else {
992 Opc = ARM::LDRi12;
993 }
994 RC = isThumb2 ? &ARM::rGPRRegClass : &ARM::GPRnopcRegClass;
995 break;
996 case MVT::f32:
997 if (!Subtarget->hasVFP2Base()) return false;
998 // Unaligned loads need special handling. Floats require word-alignment.
999 if (Alignment && *Alignment < Align(4)) {
1000 needVMOV = true;
1001 VT = MVT::i32;
1002 Opc = isThumb2 ? ARM::t2LDRi12 : ARM::LDRi12;
1003 RC = isThumb2 ? &ARM::rGPRRegClass : &ARM::GPRnopcRegClass;
1004 } else {
1005 Opc = ARM::VLDRS;
1006 RC = TLI.getRegClassFor(VT);
1007 }
1008 break;
1009 case MVT::f64:
1010 // Can load and store double precision even without FeatureFP64
1011 if (!Subtarget->hasVFP2Base()) return false;
1012 // FIXME: Unaligned loads need special handling. Doublewords require
1013 // word-alignment.
1014 if (Alignment && *Alignment < Align(4))
1015 return false;
1016
1017 Opc = ARM::VLDRD;
1018 RC = TLI.getRegClassFor(VT);
1019 break;
1020 }
1021 // Simplify this down to something we can handle.
1022 ARMSimplifyAddress(Addr, VT, useAM3);
1023
1024 // Create the base instruction, then add the operands.
1025 if (allocReg)
1026 ResultReg = createResultReg(RC);
1027 assert(ResultReg.isVirtual() && "Expected an allocated virtual register.");
1028 MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1029 TII.get(Opc), ResultReg);
1030 AddLoadStoreOperands(VT, Addr, MIB, MachineMemOperand::MOLoad, useAM3);
1031
1032 // If we had an unaligned load of a float we've converted it to an regular
1033 // load. Now we must move from the GRP to the FP register.
1034 if (needVMOV) {
1035 Register MoveReg = createResultReg(TLI.getRegClassFor(MVT::f32));
1036 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1037 TII.get(ARM::VMOVSR), MoveReg)
1038 .addReg(ResultReg));
1039 ResultReg = MoveReg;
1040 }
1041 return true;
1042}
1043
1044bool ARMFastISel::SelectLoad(const Instruction *I) {
1045 // Atomic loads need special handling.
1046 if (cast<LoadInst>(I)->isAtomic())
1047 return false;
1048
1049 const Value *SV = I->getOperand(0);
1050 if (TLI.supportSwiftError()) {
1051 // Swifterror values can come from either a function parameter with
1052 // swifterror attribute or an alloca with swifterror attribute.
1053 if (const Argument *Arg = dyn_cast<Argument>(SV)) {
1054 if (Arg->hasSwiftErrorAttr())
1055 return false;
1056 }
1057
1058 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(SV)) {
1059 if (Alloca->isSwiftError())
1060 return false;
1061 }
1062 }
1063
1064 // Verify we have a legal type before going any further.
1065 MVT VT;
1066 if (!isLoadTypeLegal(I->getType(), VT))
1067 return false;
1068
1069 // See if we can handle this address.
1070 Address Addr;
1071 if (!ARMComputeAddress(I->getOperand(0), Addr)) return false;
1072
1073 Register ResultReg;
1074 if (!ARMEmitLoad(VT, ResultReg, Addr, cast<LoadInst>(I)->getAlign()))
1075 return false;
1076 updateValueMap(I, ResultReg);
1077 return true;
1078}
1079
1080bool ARMFastISel::ARMEmitStore(MVT VT, Register SrcReg, Address &Addr,
1081 MaybeAlign Alignment) {
1082 unsigned StrOpc;
1083 bool useAM3 = false;
1084 switch (VT.SimpleTy) {
1085 // This is mostly going to be Neon/vector support.
1086 default: return false;
1087 case MVT::i1: {
1088 Register Res = createResultReg(isThumb2 ? &ARM::tGPRRegClass
1089 : &ARM::GPRRegClass);
1090 unsigned Opc = isThumb2 ? ARM::t2ANDri : ARM::ANDri;
1091 SrcReg = constrainOperandRegClass(TII.get(Opc), SrcReg, 1);
1092 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1093 TII.get(Opc), Res)
1094 .addReg(SrcReg).addImm(1));
1095 SrcReg = Res;
1096 [[fallthrough]];
1097 }
1098 case MVT::i8:
1099 if (isThumb2) {
1100 if (Addr.getOffset() < 0 && Addr.getOffset() > -256 &&
1101 Subtarget->hasV6T2Ops())
1102 StrOpc = ARM::t2STRBi8;
1103 else
1104 StrOpc = ARM::t2STRBi12;
1105 } else {
1106 StrOpc = ARM::STRBi12;
1107 }
1108 break;
1109 case MVT::i16:
1110 if (Alignment && *Alignment < Align(2) &&
1111 !Subtarget->allowsUnalignedMem())
1112 return false;
1113
1114 if (isThumb2) {
1115 if (Addr.getOffset() < 0 && Addr.getOffset() > -256 &&
1116 Subtarget->hasV6T2Ops())
1117 StrOpc = ARM::t2STRHi8;
1118 else
1119 StrOpc = ARM::t2STRHi12;
1120 } else {
1121 StrOpc = ARM::STRH;
1122 useAM3 = true;
1123 }
1124 break;
1125 case MVT::i32:
1126 if (Alignment && *Alignment < Align(4) &&
1127 !Subtarget->allowsUnalignedMem())
1128 return false;
1129
1130 if (isThumb2) {
1131 if (Addr.getOffset() < 0 && Addr.getOffset() > -256 &&
1132 Subtarget->hasV6T2Ops())
1133 StrOpc = ARM::t2STRi8;
1134 else
1135 StrOpc = ARM::t2STRi12;
1136 } else {
1137 StrOpc = ARM::STRi12;
1138 }
1139 break;
1140 case MVT::f32:
1141 if (!Subtarget->hasVFP2Base()) return false;
1142 // Unaligned stores need special handling. Floats require word-alignment.
1143 if (Alignment && *Alignment < Align(4)) {
1144 Register MoveReg = createResultReg(TLI.getRegClassFor(MVT::i32));
1145 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1146 TII.get(ARM::VMOVRS), MoveReg)
1147 .addReg(SrcReg));
1148 SrcReg = MoveReg;
1149 VT = MVT::i32;
1150 StrOpc = isThumb2 ? ARM::t2STRi12 : ARM::STRi12;
1151 } else {
1152 StrOpc = ARM::VSTRS;
1153 }
1154 break;
1155 case MVT::f64:
1156 // Can load and store double precision even without FeatureFP64
1157 if (!Subtarget->hasVFP2Base()) return false;
1158 // FIXME: Unaligned stores need special handling. Doublewords require
1159 // word-alignment.
1160 if (Alignment && *Alignment < Align(4))
1161 return false;
1162
1163 StrOpc = ARM::VSTRD;
1164 break;
1165 }
1166 // Simplify this down to something we can handle.
1167 ARMSimplifyAddress(Addr, VT, useAM3);
1168
1169 // Create the base instruction, then add the operands.
1170 SrcReg = constrainOperandRegClass(TII.get(StrOpc), SrcReg, 0);
1171 MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1172 TII.get(StrOpc))
1173 .addReg(SrcReg);
1174 AddLoadStoreOperands(VT, Addr, MIB, MachineMemOperand::MOStore, useAM3);
1175 return true;
1176}
1177
1178bool ARMFastISel::SelectStore(const Instruction *I) {
1179 Value *Op0 = I->getOperand(0);
1180 Register SrcReg;
1181
1182 // Atomic stores need special handling.
1183 if (cast<StoreInst>(I)->isAtomic())
1184 return false;
1185
1186 const Value *PtrV = I->getOperand(1);
1187 if (TLI.supportSwiftError()) {
1188 // Swifterror values can come from either a function parameter with
1189 // swifterror attribute or an alloca with swifterror attribute.
1190 if (const Argument *Arg = dyn_cast<Argument>(PtrV)) {
1191 if (Arg->hasSwiftErrorAttr())
1192 return false;
1193 }
1194
1195 if (const AllocaInst *Alloca = dyn_cast<AllocaInst>(PtrV)) {
1196 if (Alloca->isSwiftError())
1197 return false;
1198 }
1199 }
1200
1201 // Verify we have a legal type before going any further.
1202 MVT VT;
1203 if (!isLoadTypeLegal(I->getOperand(0)->getType(), VT))
1204 return false;
1205
1206 // Get the value to be stored into a register.
1207 SrcReg = getRegForValue(Op0);
1208 if (!SrcReg)
1209 return false;
1210
1211 // See if we can handle this address.
1212 Address Addr;
1213 if (!ARMComputeAddress(I->getOperand(1), Addr))
1214 return false;
1215
1216 if (!ARMEmitStore(VT, SrcReg, Addr, cast<StoreInst>(I)->getAlign()))
1217 return false;
1218 return true;
1219}
1220
1222 switch (Pred) {
1223 // Needs two compares...
1224 case CmpInst::FCMP_ONE:
1225 case CmpInst::FCMP_UEQ:
1226 default:
1227 // AL is our "false" for now. The other two need more compares.
1228 return ARMCC::AL;
1229 case CmpInst::ICMP_EQ:
1230 case CmpInst::FCMP_OEQ:
1231 return ARMCC::EQ;
1232 case CmpInst::ICMP_SGT:
1233 case CmpInst::FCMP_OGT:
1234 return ARMCC::GT;
1235 case CmpInst::ICMP_SGE:
1236 case CmpInst::FCMP_OGE:
1237 return ARMCC::GE;
1238 case CmpInst::ICMP_UGT:
1239 case CmpInst::FCMP_UGT:
1240 return ARMCC::HI;
1241 case CmpInst::FCMP_OLT:
1242 return ARMCC::MI;
1243 case CmpInst::ICMP_ULE:
1244 case CmpInst::FCMP_OLE:
1245 return ARMCC::LS;
1246 case CmpInst::FCMP_ORD:
1247 return ARMCC::VC;
1248 case CmpInst::FCMP_UNO:
1249 return ARMCC::VS;
1250 case CmpInst::FCMP_UGE:
1251 return ARMCC::PL;
1252 case CmpInst::ICMP_SLT:
1253 case CmpInst::FCMP_ULT:
1254 return ARMCC::LT;
1255 case CmpInst::ICMP_SLE:
1256 case CmpInst::FCMP_ULE:
1257 return ARMCC::LE;
1258 case CmpInst::FCMP_UNE:
1259 case CmpInst::ICMP_NE:
1260 return ARMCC::NE;
1261 case CmpInst::ICMP_UGE:
1262 return ARMCC::HS;
1263 case CmpInst::ICMP_ULT:
1264 return ARMCC::LO;
1265 }
1266}
1267
1268bool ARMFastISel::SelectBranch(const Instruction *I) {
1269 const CondBrInst *BI = cast<CondBrInst>(I);
1270 MachineBasicBlock *TBB = FuncInfo.getMBB(BI->getSuccessor(0));
1271 MachineBasicBlock *FBB = FuncInfo.getMBB(BI->getSuccessor(1));
1272
1273 // Simple branch support.
1274
1275 // If we can, avoid recomputing the compare - redoing it could lead to wonky
1276 // behavior.
1277 if (const CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition())) {
1278 if (CI->hasOneUse() && (CI->getParent() == I->getParent())) {
1279 // Get the compare predicate.
1280 // Try to take advantage of fallthrough opportunities.
1281 CmpInst::Predicate Predicate = CI->getPredicate();
1282 if (FuncInfo.MBB->isLayoutSuccessor(TBB)) {
1283 std::swap(TBB, FBB);
1285 }
1286
1287 ARMCC::CondCodes ARMPred = getComparePred(Predicate);
1288
1289 // We may not handle every CC for now.
1290 if (ARMPred == ARMCC::AL) return false;
1291
1292 // Emit the compare.
1293 if (!ARMEmitCmp(CI->getOperand(0), CI->getOperand(1), CI->isUnsigned()))
1294 return false;
1295
1296 unsigned BrOpc = isThumb2 ? ARM::t2Bcc : ARM::Bcc;
1297 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(BrOpc))
1298 .addMBB(TBB).addImm(ARMPred).addReg(ARM::CPSR);
1299 finishCondBranch(BI->getParent(), TBB, FBB);
1300 return true;
1301 }
1302 } else if (TruncInst *TI = dyn_cast<TruncInst>(BI->getCondition())) {
1303 MVT SourceVT;
1304 if (TI->hasOneUse() && TI->getParent() == I->getParent() &&
1305 (isLoadTypeLegal(TI->getOperand(0)->getType(), SourceVT))) {
1306 unsigned TstOpc = isThumb2 ? ARM::t2TSTri : ARM::TSTri;
1307 Register OpReg = getRegForValue(TI->getOperand(0));
1308 OpReg = constrainOperandRegClass(TII.get(TstOpc), OpReg, 0);
1309 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1310 TII.get(TstOpc))
1311 .addReg(OpReg).addImm(1));
1312
1313 unsigned CCMode = ARMCC::NE;
1314 if (FuncInfo.MBB->isLayoutSuccessor(TBB)) {
1315 std::swap(TBB, FBB);
1316 CCMode = ARMCC::EQ;
1317 }
1318
1319 unsigned BrOpc = isThumb2 ? ARM::t2Bcc : ARM::Bcc;
1320 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(BrOpc))
1321 .addMBB(TBB).addImm(CCMode).addReg(ARM::CPSR);
1322
1323 finishCondBranch(BI->getParent(), TBB, FBB);
1324 return true;
1325 }
1326 } else if (const ConstantInt *CI =
1328 uint64_t Imm = CI->getZExtValue();
1329 MachineBasicBlock *Target = (Imm == 0) ? FBB : TBB;
1330 fastEmitBranch(Target, MIMD.getDL());
1331 return true;
1332 }
1333
1334 Register CmpReg = getRegForValue(BI->getCondition());
1335 if (!CmpReg)
1336 return false;
1337
1338 // We've been divorced from our compare! Our block was split, and
1339 // now our compare lives in a predecessor block. We musn't
1340 // re-compare here, as the children of the compare aren't guaranteed
1341 // live across the block boundary (we *could* check for this).
1342 // Regardless, the compare has been done in the predecessor block,
1343 // and it left a value for us in a virtual register. Ergo, we test
1344 // the one-bit value left in the virtual register.
1345 unsigned TstOpc = isThumb2 ? ARM::t2TSTri : ARM::TSTri;
1346 CmpReg = constrainOperandRegClass(TII.get(TstOpc), CmpReg, 0);
1347 AddOptionalDefs(
1348 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(TstOpc))
1349 .addReg(CmpReg)
1350 .addImm(1));
1351
1352 unsigned CCMode = ARMCC::NE;
1353 if (FuncInfo.MBB->isLayoutSuccessor(TBB)) {
1354 std::swap(TBB, FBB);
1355 CCMode = ARMCC::EQ;
1356 }
1357
1358 unsigned BrOpc = isThumb2 ? ARM::t2Bcc : ARM::Bcc;
1359 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(BrOpc))
1360 .addMBB(TBB).addImm(CCMode).addReg(ARM::CPSR);
1361 finishCondBranch(BI->getParent(), TBB, FBB);
1362 return true;
1363}
1364
1365bool ARMFastISel::SelectIndirectBr(const Instruction *I) {
1366 Register AddrReg = getRegForValue(I->getOperand(0));
1367 if (!AddrReg)
1368 return false;
1369
1370 unsigned Opc = isThumb2 ? ARM::tBRIND : ARM::BX;
1371 assert(isThumb2 || Subtarget->hasV4TOps());
1372
1373 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1374 TII.get(Opc)).addReg(AddrReg));
1375
1376 const IndirectBrInst *IB = cast<IndirectBrInst>(I);
1377 for (const BasicBlock *SuccBB : IB->successors())
1378 FuncInfo.MBB->addSuccessor(FuncInfo.getMBB(SuccBB));
1379
1380 return true;
1381}
1382
1383bool ARMFastISel::ARMEmitCmp(const Value *Src1Value, const Value *Src2Value,
1384 bool isZExt) {
1385 Type *Ty = Src1Value->getType();
1386 EVT SrcEVT = TLI.getValueType(DL, Ty, true);
1387 if (!SrcEVT.isSimple()) return false;
1388 MVT SrcVT = SrcEVT.getSimpleVT();
1389
1390 if (Ty->isFloatTy() && !Subtarget->hasVFP2Base())
1391 return false;
1392
1393 if (Ty->isDoubleTy() && (!Subtarget->hasVFP2Base() || !Subtarget->hasFP64()))
1394 return false;
1395
1396 // Check to see if the 2nd operand is a constant that we can encode directly
1397 // in the compare.
1398 int Imm = 0;
1399 bool UseImm = false;
1400 bool isNegativeImm = false;
1401 // FIXME: At -O0 we don't have anything that canonicalizes operand order.
1402 // Thus, Src1Value may be a ConstantInt, but we're missing it.
1403 if (const ConstantInt *ConstInt = dyn_cast<ConstantInt>(Src2Value)) {
1404 if (SrcVT == MVT::i32 || SrcVT == MVT::i16 || SrcVT == MVT::i8 ||
1405 SrcVT == MVT::i1) {
1406 const APInt &CIVal = ConstInt->getValue();
1407 Imm = (isZExt) ? (int)CIVal.getZExtValue() : (int)CIVal.getSExtValue();
1408 // For INT_MIN/LONG_MIN (i.e., 0x80000000) we need to use a cmp, rather
1409 // then a cmn, because there is no way to represent 2147483648 as a
1410 // signed 32-bit int.
1411 if (Imm < 0 && Imm != (int)0x80000000) {
1412 isNegativeImm = true;
1413 Imm = -Imm;
1414 }
1415 UseImm = isThumb2 ? (ARM_AM::getT2SOImmVal(Imm) != -1) :
1416 (ARM_AM::getSOImmVal(Imm) != -1);
1417 }
1418 } else if (const ConstantFP *ConstFP = dyn_cast<ConstantFP>(Src2Value)) {
1419 if (SrcVT == MVT::f32 || SrcVT == MVT::f64)
1420 if (ConstFP->isZero() && !ConstFP->isNegative())
1421 UseImm = true;
1422 }
1423
1424 unsigned CmpOpc;
1425 bool isICmp = true;
1426 bool needsExt = false;
1427 switch (SrcVT.SimpleTy) {
1428 default: return false;
1429 // TODO: Verify compares.
1430 case MVT::f32:
1431 isICmp = false;
1432 CmpOpc = UseImm ? ARM::VCMPZS : ARM::VCMPS;
1433 break;
1434 case MVT::f64:
1435 isICmp = false;
1436 CmpOpc = UseImm ? ARM::VCMPZD : ARM::VCMPD;
1437 break;
1438 case MVT::i1:
1439 case MVT::i8:
1440 case MVT::i16:
1441 needsExt = true;
1442 [[fallthrough]];
1443 case MVT::i32:
1444 if (isThumb2) {
1445 if (!UseImm)
1446 CmpOpc = ARM::t2CMPrr;
1447 else
1448 CmpOpc = isNegativeImm ? ARM::t2CMNri : ARM::t2CMPri;
1449 } else {
1450 if (!UseImm)
1451 CmpOpc = ARM::CMPrr;
1452 else
1453 CmpOpc = isNegativeImm ? ARM::CMNri : ARM::CMPri;
1454 }
1455 break;
1456 }
1457
1458 Register SrcReg1 = getRegForValue(Src1Value);
1459 if (!SrcReg1)
1460 return false;
1461
1462 Register SrcReg2;
1463 if (!UseImm) {
1464 SrcReg2 = getRegForValue(Src2Value);
1465 if (!SrcReg2)
1466 return false;
1467 }
1468
1469 // We have i1, i8, or i16, we need to either zero extend or sign extend.
1470 if (needsExt) {
1471 SrcReg1 = ARMEmitIntExt(SrcVT, SrcReg1, MVT::i32, isZExt);
1472 if (!SrcReg1)
1473 return false;
1474 if (!UseImm) {
1475 SrcReg2 = ARMEmitIntExt(SrcVT, SrcReg2, MVT::i32, isZExt);
1476 if (!SrcReg2)
1477 return false;
1478 }
1479 }
1480
1481 const MCInstrDesc &II = TII.get(CmpOpc);
1482 SrcReg1 = constrainOperandRegClass(II, SrcReg1, 0);
1483 if (!UseImm) {
1484 SrcReg2 = constrainOperandRegClass(II, SrcReg2, 1);
1485 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II)
1486 .addReg(SrcReg1).addReg(SrcReg2));
1487 } else {
1488 MachineInstrBuilder MIB;
1489 MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, II)
1490 .addReg(SrcReg1);
1491
1492 // Only add immediate for icmp as the immediate for fcmp is an implicit 0.0.
1493 if (isICmp)
1494 MIB.addImm(Imm);
1495 AddOptionalDefs(MIB);
1496 }
1497
1498 // For floating point we need to move the result to a comparison register
1499 // that we can then use for branches.
1500 if (Ty->isFloatTy() || Ty->isDoubleTy())
1501 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1502 TII.get(ARM::FMSTAT)));
1503 return true;
1504}
1505
1506bool ARMFastISel::SelectCmp(const Instruction *I) {
1507 const CmpInst *CI = cast<CmpInst>(I);
1508
1509 // Get the compare predicate.
1511
1512 // We may not handle every CC for now.
1513 if (ARMPred == ARMCC::AL) return false;
1514
1515 // Emit the compare.
1516 if (!ARMEmitCmp(CI->getOperand(0), CI->getOperand(1), CI->isUnsigned()))
1517 return false;
1518
1519 // Now set a register based on the comparison. Explicitly set the predicates
1520 // here.
1521 unsigned MovCCOpc = isThumb2 ? ARM::t2MOVCCi : ARM::MOVCCi;
1522 const TargetRegisterClass *RC = isThumb2 ? &ARM::rGPRRegClass
1523 : &ARM::GPRRegClass;
1524 Register DestReg = createResultReg(RC);
1525 Constant *Zero = ConstantInt::get(Type::getInt32Ty(*Context), 0);
1526 Register ZeroReg = fastMaterializeConstant(Zero);
1527 // ARMEmitCmp emits a FMSTAT when necessary, so it's always safe to use CPSR.
1528 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(MovCCOpc), DestReg)
1529 .addReg(ZeroReg).addImm(1)
1530 .addImm(ARMPred).addReg(ARM::CPSR);
1531
1532 updateValueMap(I, DestReg);
1533 return true;
1534}
1535
1536bool ARMFastISel::SelectFPExt(const Instruction *I) {
1537 // Make sure we have VFP and that we're extending float to double.
1538 if (!Subtarget->hasVFP2Base() || !Subtarget->hasFP64()) return false;
1539
1540 Value *V = I->getOperand(0);
1541 if (!I->getType()->isDoubleTy() ||
1542 !V->getType()->isFloatTy()) return false;
1543
1544 Register Op = getRegForValue(V);
1545 if (!Op)
1546 return false;
1547
1548 Register Result = createResultReg(&ARM::DPRRegClass);
1549 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1550 TII.get(ARM::VCVTDS), Result)
1551 .addReg(Op));
1552 updateValueMap(I, Result);
1553 return true;
1554}
1555
1556bool ARMFastISel::SelectFPTrunc(const Instruction *I) {
1557 // Make sure we have VFP and that we're truncating double to float.
1558 if (!Subtarget->hasVFP2Base() || !Subtarget->hasFP64()) return false;
1559
1560 Value *V = I->getOperand(0);
1561 if (!(I->getType()->isFloatTy() &&
1562 V->getType()->isDoubleTy())) return false;
1563
1564 Register Op = getRegForValue(V);
1565 if (!Op)
1566 return false;
1567
1568 Register Result = createResultReg(&ARM::SPRRegClass);
1569 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1570 TII.get(ARM::VCVTSD), Result)
1571 .addReg(Op));
1572 updateValueMap(I, Result);
1573 return true;
1574}
1575
1576bool ARMFastISel::SelectIToFP(const Instruction *I, bool isSigned) {
1577 // Make sure we have VFP.
1578 if (!Subtarget->hasVFP2Base()) return false;
1579
1580 MVT DstVT;
1581 Type *Ty = I->getType();
1582 if (!isTypeLegal(Ty, DstVT))
1583 return false;
1584
1585 Value *Src = I->getOperand(0);
1586 EVT SrcEVT = TLI.getValueType(DL, Src->getType(), true);
1587 if (!SrcEVT.isSimple())
1588 return false;
1589 MVT SrcVT = SrcEVT.getSimpleVT();
1590 if (SrcVT != MVT::i32 && SrcVT != MVT::i16 && SrcVT != MVT::i8)
1591 return false;
1592
1593 Register SrcReg = getRegForValue(Src);
1594 if (!SrcReg)
1595 return false;
1596
1597 // Handle sign-extension.
1598 if (SrcVT == MVT::i16 || SrcVT == MVT::i8) {
1599 SrcReg = ARMEmitIntExt(SrcVT, SrcReg, MVT::i32,
1600 /*isZExt*/!isSigned);
1601 if (!SrcReg)
1602 return false;
1603 }
1604
1605 // The conversion routine works on fp-reg to fp-reg and the operand above
1606 // was an integer, move it to the fp registers if possible.
1607 Register FP = ARMMoveToFPReg(MVT::f32, SrcReg);
1608 if (!FP)
1609 return false;
1610
1611 unsigned Opc;
1612 if (Ty->isFloatTy()) Opc = isSigned ? ARM::VSITOS : ARM::VUITOS;
1613 else if (Ty->isDoubleTy() && Subtarget->hasFP64())
1614 Opc = isSigned ? ARM::VSITOD : ARM::VUITOD;
1615 else return false;
1616
1617 Register ResultReg = createResultReg(TLI.getRegClassFor(DstVT));
1618 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1619 TII.get(Opc), ResultReg).addReg(FP));
1620 updateValueMap(I, ResultReg);
1621 return true;
1622}
1623
1624bool ARMFastISel::SelectFPToI(const Instruction *I, bool isSigned) {
1625 // Make sure we have VFP.
1626 if (!Subtarget->hasVFP2Base()) return false;
1627
1628 MVT DstVT;
1629 Type *RetTy = I->getType();
1630 if (!isTypeLegal(RetTy, DstVT))
1631 return false;
1632
1633 Register Op = getRegForValue(I->getOperand(0));
1634 if (!Op)
1635 return false;
1636
1637 unsigned Opc;
1638 Type *OpTy = I->getOperand(0)->getType();
1639 if (OpTy->isFloatTy()) Opc = isSigned ? ARM::VTOSIZS : ARM::VTOUIZS;
1640 else if (OpTy->isDoubleTy() && Subtarget->hasFP64())
1641 Opc = isSigned ? ARM::VTOSIZD : ARM::VTOUIZD;
1642 else return false;
1643
1644 // f64->s32/u32 or f32->s32/u32 both need an intermediate f32 reg.
1645 Register ResultReg = createResultReg(TLI.getRegClassFor(MVT::f32));
1646 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1647 TII.get(Opc), ResultReg).addReg(Op));
1648
1649 // This result needs to be in an integer register, but the conversion only
1650 // takes place in fp-regs.
1651 Register IntReg = ARMMoveToIntReg(DstVT, ResultReg);
1652 if (!IntReg)
1653 return false;
1654
1655 updateValueMap(I, IntReg);
1656 return true;
1657}
1658
1659bool ARMFastISel::SelectSelect(const Instruction *I) {
1660 MVT VT;
1661 if (!isTypeLegal(I->getType(), VT))
1662 return false;
1663
1664 // Things need to be register sized for register moves.
1665 if (VT != MVT::i32) return false;
1666
1667 Register CondReg = getRegForValue(I->getOperand(0));
1668 if (!CondReg)
1669 return false;
1670 Register Op1Reg = getRegForValue(I->getOperand(1));
1671 if (!Op1Reg)
1672 return false;
1673
1674 // Check to see if we can use an immediate in the conditional move.
1675 int Imm = 0;
1676 bool UseImm = false;
1677 bool isNegativeImm = false;
1678 if (const ConstantInt *ConstInt = dyn_cast<ConstantInt>(I->getOperand(2))) {
1679 assert(VT == MVT::i32 && "Expecting an i32.");
1680 Imm = (int)ConstInt->getValue().getZExtValue();
1681 if (Imm < 0) {
1682 isNegativeImm = true;
1683 Imm = ~Imm;
1684 }
1685 UseImm = isThumb2 ? (ARM_AM::getT2SOImmVal(Imm) != -1) :
1686 (ARM_AM::getSOImmVal(Imm) != -1);
1687 }
1688
1689 Register Op2Reg;
1690 if (!UseImm) {
1691 Op2Reg = getRegForValue(I->getOperand(2));
1692 if (!Op2Reg)
1693 return false;
1694 }
1695
1696 unsigned TstOpc = isThumb2 ? ARM::t2TSTri : ARM::TSTri;
1697 CondReg = constrainOperandRegClass(TII.get(TstOpc), CondReg, 0);
1698 AddOptionalDefs(
1699 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(TstOpc))
1700 .addReg(CondReg)
1701 .addImm(1));
1702
1703 unsigned MovCCOpc;
1704 const TargetRegisterClass *RC;
1705 if (!UseImm) {
1706 RC = isThumb2 ? &ARM::tGPRRegClass : &ARM::GPRRegClass;
1707 MovCCOpc = isThumb2 ? ARM::t2MOVCCr : ARM::MOVCCr;
1708 } else {
1709 RC = isThumb2 ? &ARM::rGPRRegClass : &ARM::GPRRegClass;
1710 if (!isNegativeImm)
1711 MovCCOpc = isThumb2 ? ARM::t2MOVCCi : ARM::MOVCCi;
1712 else
1713 MovCCOpc = isThumb2 ? ARM::t2MVNCCi : ARM::MVNCCi;
1714 }
1715 Register ResultReg = createResultReg(RC);
1716 if (!UseImm) {
1717 Op2Reg = constrainOperandRegClass(TII.get(MovCCOpc), Op2Reg, 1);
1718 Op1Reg = constrainOperandRegClass(TII.get(MovCCOpc), Op1Reg, 2);
1719 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(MovCCOpc),
1720 ResultReg)
1721 .addReg(Op2Reg)
1722 .addReg(Op1Reg)
1724 .addReg(ARM::CPSR);
1725 } else {
1726 Op1Reg = constrainOperandRegClass(TII.get(MovCCOpc), Op1Reg, 1);
1727 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(MovCCOpc),
1728 ResultReg)
1729 .addReg(Op1Reg)
1730 .addImm(Imm)
1732 .addReg(ARM::CPSR);
1733 }
1734 updateValueMap(I, ResultReg);
1735 return true;
1736}
1737
1738bool ARMFastISel::SelectDiv(const Instruction *I, bool isSigned) {
1739 MVT VT;
1740 Type *Ty = I->getType();
1741 if (!isTypeLegal(Ty, VT))
1742 return false;
1743
1744 // If we have integer div support we should have selected this automagically.
1745 // In case we have a real miss go ahead and return false and we'll pick
1746 // it up later.
1747 if (Subtarget->hasDivideInThumbMode())
1748 return false;
1749
1750 // Otherwise emit a libcall.
1751 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1752 if (VT == MVT::i8)
1753 LC = isSigned ? RTLIB::SDIV_I8 : RTLIB::UDIV_I8;
1754 else if (VT == MVT::i16)
1755 LC = isSigned ? RTLIB::SDIV_I16 : RTLIB::UDIV_I16;
1756 else if (VT == MVT::i32)
1757 LC = isSigned ? RTLIB::SDIV_I32 : RTLIB::UDIV_I32;
1758 else if (VT == MVT::i64)
1759 LC = isSigned ? RTLIB::SDIV_I64 : RTLIB::UDIV_I64;
1760 else if (VT == MVT::i128)
1761 LC = isSigned ? RTLIB::SDIV_I128 : RTLIB::UDIV_I128;
1762 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SDIV!");
1763
1764 return ARMEmitLibcall(I, LC);
1765}
1766
1767bool ARMFastISel::SelectRem(const Instruction *I, bool isSigned) {
1768 MVT VT;
1769 Type *Ty = I->getType();
1770 if (!isTypeLegal(Ty, VT))
1771 return false;
1772
1773 // Many ABIs do not provide a libcall for standalone remainder, so we need to
1774 // use divrem (see the RTABI 4.3.1). Since FastISel can't handle non-double
1775 // multi-reg returns, we'll have to bail out.
1776 if (!TLI.hasStandaloneRem(VT)) {
1777 return false;
1778 }
1779
1780 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1781 if (VT == MVT::i8)
1782 LC = isSigned ? RTLIB::SREM_I8 : RTLIB::UREM_I8;
1783 else if (VT == MVT::i16)
1784 LC = isSigned ? RTLIB::SREM_I16 : RTLIB::UREM_I16;
1785 else if (VT == MVT::i32)
1786 LC = isSigned ? RTLIB::SREM_I32 : RTLIB::UREM_I32;
1787 else if (VT == MVT::i64)
1788 LC = isSigned ? RTLIB::SREM_I64 : RTLIB::UREM_I64;
1789 else if (VT == MVT::i128)
1790 LC = isSigned ? RTLIB::SREM_I128 : RTLIB::UREM_I128;
1791 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SREM!");
1792
1793 return ARMEmitLibcall(I, LC);
1794}
1795
1796bool ARMFastISel::SelectBinaryIntOp(const Instruction *I, unsigned ISDOpcode) {
1797 EVT DestVT = TLI.getValueType(DL, I->getType(), true);
1798
1799 // We can get here in the case when we have a binary operation on a non-legal
1800 // type and the target independent selector doesn't know how to handle it.
1801 if (DestVT != MVT::i16 && DestVT != MVT::i8 && DestVT != MVT::i1)
1802 return false;
1803
1804 unsigned Opc;
1805 switch (ISDOpcode) {
1806 default: return false;
1807 case ISD::ADD:
1808 Opc = isThumb2 ? ARM::t2ADDrr : ARM::ADDrr;
1809 break;
1810 case ISD::OR:
1811 Opc = isThumb2 ? ARM::t2ORRrr : ARM::ORRrr;
1812 break;
1813 case ISD::SUB:
1814 Opc = isThumb2 ? ARM::t2SUBrr : ARM::SUBrr;
1815 break;
1816 }
1817
1818 Register SrcReg1 = getRegForValue(I->getOperand(0));
1819 if (!SrcReg1)
1820 return false;
1821
1822 // TODO: Often the 2nd operand is an immediate, which can be encoded directly
1823 // in the instruction, rather then materializing the value in a register.
1824 Register SrcReg2 = getRegForValue(I->getOperand(1));
1825 if (!SrcReg2)
1826 return false;
1827
1828 Register ResultReg = createResultReg(&ARM::GPRnopcRegClass);
1829 SrcReg1 = constrainOperandRegClass(TII.get(Opc), SrcReg1, 1);
1830 SrcReg2 = constrainOperandRegClass(TII.get(Opc), SrcReg2, 2);
1831 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1832 TII.get(Opc), ResultReg)
1833 .addReg(SrcReg1).addReg(SrcReg2));
1834 updateValueMap(I, ResultReg);
1835 return true;
1836}
1837
1838bool ARMFastISel::SelectBinaryFPOp(const Instruction *I, unsigned ISDOpcode) {
1839 EVT FPVT = TLI.getValueType(DL, I->getType(), true);
1840 if (!FPVT.isSimple()) return false;
1841 MVT VT = FPVT.getSimpleVT();
1842
1843 // FIXME: Support vector types where possible.
1844 if (VT.isVector())
1845 return false;
1846
1847 // We can get here in the case when we want to use NEON for our fp
1848 // operations, but can't figure out how to. Just use the vfp instructions
1849 // if we have them.
1850 // FIXME: It'd be nice to use NEON instructions.
1851 Type *Ty = I->getType();
1852 if (Ty->isFloatTy() && !Subtarget->hasVFP2Base())
1853 return false;
1854 if (Ty->isDoubleTy() && (!Subtarget->hasVFP2Base() || !Subtarget->hasFP64()))
1855 return false;
1856
1857 unsigned Opc;
1858 bool is64bit = VT == MVT::f64 || VT == MVT::i64;
1859 switch (ISDOpcode) {
1860 default: return false;
1861 case ISD::FADD:
1862 Opc = is64bit ? ARM::VADDD : ARM::VADDS;
1863 break;
1864 case ISD::FSUB:
1865 Opc = is64bit ? ARM::VSUBD : ARM::VSUBS;
1866 break;
1867 case ISD::FMUL:
1868 Opc = is64bit ? ARM::VMULD : ARM::VMULS;
1869 break;
1870 }
1871 Register Op1 = getRegForValue(I->getOperand(0));
1872 if (!Op1)
1873 return false;
1874
1875 Register Op2 = getRegForValue(I->getOperand(1));
1876 if (!Op2)
1877 return false;
1878
1879 Register ResultReg = createResultReg(TLI.getRegClassFor(VT.SimpleTy));
1880 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
1881 TII.get(Opc), ResultReg)
1882 .addReg(Op1).addReg(Op2));
1883 updateValueMap(I, ResultReg);
1884 return true;
1885}
1886
1887// Call Handling Code
1888
1889// This is largely taken directly from CCAssignFnForNode
1890// TODO: We may not support all of this.
1891CCAssignFn *ARMFastISel::CCAssignFnForCall(CallingConv::ID CC,
1892 bool Return,
1893 bool isVarArg) {
1894 switch (CC) {
1895 default:
1896 report_fatal_error("Unsupported calling convention");
1897 case CallingConv::Fast:
1898 if (Subtarget->hasFPRegs() && !isVarArg) {
1899 if (!TM.isAAPCS_ABI())
1900 return (Return ? RetFastCC_ARM_APCS : FastCC_ARM_APCS);
1901 // For AAPCS ABI targets, just use VFP variant of the calling convention.
1902 return (Return ? RetCC_ARM_AAPCS_VFP : CC_ARM_AAPCS_VFP);
1903 }
1904 [[fallthrough]];
1905 case CallingConv::C:
1906 case CallingConv::CXX_FAST_TLS:
1907 // Use target triple & subtarget features to do actual dispatch.
1908 if (TM.isAAPCS_ABI()) {
1909 if (Subtarget->hasFPRegs() && Subtarget->isTargetHardFloat() && !isVarArg)
1910 return (Return ? RetCC_ARM_AAPCS_VFP: CC_ARM_AAPCS_VFP);
1911 else
1912 return (Return ? RetCC_ARM_AAPCS: CC_ARM_AAPCS);
1913 } else {
1914 return (Return ? RetCC_ARM_APCS: CC_ARM_APCS);
1915 }
1916 case CallingConv::ARM_AAPCS_VFP:
1917 case CallingConv::Swift:
1918 case CallingConv::SwiftTail:
1919 if (!isVarArg)
1920 return (Return ? RetCC_ARM_AAPCS_VFP: CC_ARM_AAPCS_VFP);
1921 // Fall through to soft float variant, variadic functions don't
1922 // use hard floating point ABI.
1923 [[fallthrough]];
1924 case CallingConv::ARM_AAPCS:
1925 return (Return ? RetCC_ARM_AAPCS: CC_ARM_AAPCS);
1926 case CallingConv::ARM_APCS:
1927 return (Return ? RetCC_ARM_APCS: CC_ARM_APCS);
1928 case CallingConv::GHC:
1929 if (Return)
1930 report_fatal_error("Can't return in GHC call convention");
1931 else
1932 return CC_ARM_APCS_GHC;
1933 case CallingConv::CFGuard_Check:
1934 return (Return ? RetCC_ARM_AAPCS : CC_ARM_Win32_CFGuard_Check);
1935 }
1936}
1937
1938bool ARMFastISel::ProcessCallArgs(SmallVectorImpl<Value*> &Args,
1939 SmallVectorImpl<Register> &ArgRegs,
1940 SmallVectorImpl<MVT> &ArgVTs,
1941 SmallVectorImpl<ISD::ArgFlagsTy> &ArgFlags,
1942 SmallVectorImpl<Register> &RegArgs,
1943 CallingConv::ID CC,
1944 unsigned &NumBytes,
1945 bool isVarArg) {
1948 for (Value *Arg : Args)
1949 OrigTys.push_back(Arg->getType());
1950 CCState CCInfo(CC, isVarArg, *FuncInfo.MF, ArgLocs, *Context);
1951 CCInfo.AnalyzeCallOperands(ArgVTs, ArgFlags, OrigTys,
1952 CCAssignFnForCall(CC, false, isVarArg));
1953
1954 // Check that we can handle all of the arguments. If we can't, then bail out
1955 // now before we add code to the MBB.
1956 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
1957 CCValAssign &VA = ArgLocs[i];
1958 MVT ArgVT = ArgVTs[VA.getValNo()];
1959
1960 // We don't handle NEON/vector parameters yet.
1961 if (ArgVT.isVector() || ArgVT.getSizeInBits() > 64)
1962 return false;
1963
1964 // Now copy/store arg to correct locations.
1965 if (VA.isRegLoc() && !VA.needsCustom()) {
1966 continue;
1967 } else if (VA.needsCustom()) {
1968 // TODO: We need custom lowering for vector (v2f64) args.
1969 if (VA.getLocVT() != MVT::f64 ||
1970 // TODO: Only handle register args for now.
1971 !VA.isRegLoc() || !ArgLocs[++i].isRegLoc())
1972 return false;
1973 } else {
1974 switch (ArgVT.SimpleTy) {
1975 default:
1976 return false;
1977 case MVT::i1:
1978 case MVT::i8:
1979 case MVT::i16:
1980 case MVT::i32:
1981 break;
1982 case MVT::f32:
1983 if (!Subtarget->hasVFP2Base())
1984 return false;
1985 break;
1986 case MVT::f64:
1987 if (!Subtarget->hasVFP2Base())
1988 return false;
1989 break;
1990 }
1991 }
1992 }
1993
1994 // At the point, we are able to handle the call's arguments in fast isel.
1995
1996 // Get a count of how many bytes are to be pushed on the stack.
1997 NumBytes = CCInfo.getStackSize();
1998
1999 // Issue CALLSEQ_START
2000 unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
2001 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2002 TII.get(AdjStackDown))
2003 .addImm(NumBytes).addImm(0));
2004
2005 // Process the args.
2006 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
2007 CCValAssign &VA = ArgLocs[i];
2008 const Value *ArgVal = Args[VA.getValNo()];
2009 Register Arg = ArgRegs[VA.getValNo()];
2010 MVT ArgVT = ArgVTs[VA.getValNo()];
2011
2012 assert((!ArgVT.isVector() && ArgVT.getSizeInBits() <= 64) &&
2013 "We don't handle NEON/vector parameters yet.");
2014
2015 // Handle arg promotion, etc.
2016 switch (VA.getLocInfo()) {
2017 case CCValAssign::Full: break;
2018 case CCValAssign::SExt: {
2019 MVT DestVT = VA.getLocVT();
2020 Arg = ARMEmitIntExt(ArgVT, Arg, DestVT, /*isZExt*/false);
2021 assert(Arg && "Failed to emit a sext");
2022 ArgVT = DestVT;
2023 break;
2024 }
2025 case CCValAssign::AExt:
2026 // Intentional fall-through. Handle AExt and ZExt.
2027 case CCValAssign::ZExt: {
2028 MVT DestVT = VA.getLocVT();
2029 Arg = ARMEmitIntExt(ArgVT, Arg, DestVT, /*isZExt*/true);
2030 assert(Arg && "Failed to emit a zext");
2031 ArgVT = DestVT;
2032 break;
2033 }
2034 case CCValAssign::BCvt: {
2035 Register BC = fastEmit_r(ArgVT, VA.getLocVT(), ISD::BITCAST, Arg);
2036 assert(BC && "Failed to emit a bitcast!");
2037 Arg = BC;
2038 ArgVT = VA.getLocVT();
2039 break;
2040 }
2041 default: llvm_unreachable("Unknown arg promotion!");
2042 }
2043
2044 // Now copy/store arg to correct locations.
2045 if (VA.isRegLoc() && !VA.needsCustom()) {
2046 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2047 TII.get(TargetOpcode::COPY), VA.getLocReg()).addReg(Arg);
2048 RegArgs.push_back(VA.getLocReg());
2049 } else if (VA.needsCustom()) {
2050 // TODO: We need custom lowering for vector (v2f64) args.
2051 assert(VA.getLocVT() == MVT::f64 &&
2052 "Custom lowering for v2f64 args not available");
2053
2054 // FIXME: ArgLocs[++i] may extend beyond ArgLocs.size()
2055 CCValAssign &NextVA = ArgLocs[++i];
2056
2057 assert(VA.isRegLoc() && NextVA.isRegLoc() &&
2058 "We only handle register args!");
2059
2060 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2061 TII.get(ARM::VMOVRRD), VA.getLocReg())
2062 .addReg(NextVA.getLocReg(), RegState::Define)
2063 .addReg(Arg));
2064 RegArgs.push_back(VA.getLocReg());
2065 RegArgs.push_back(NextVA.getLocReg());
2066 } else {
2067 assert(VA.isMemLoc());
2068 // Need to store on the stack.
2069
2070 // Don't emit stores for undef values.
2071 if (isa<UndefValue>(ArgVal))
2072 continue;
2073
2074 Address Addr;
2075 Addr.setKind(Address::RegBase);
2076 Addr.setReg(ARM::SP);
2077 Addr.setOffset(VA.getLocMemOffset());
2078
2079 bool EmitRet = ARMEmitStore(ArgVT, Arg, Addr); (void)EmitRet;
2080 assert(EmitRet && "Could not emit a store for argument!");
2081 }
2082 }
2083
2084 return true;
2085}
2086
2087bool ARMFastISel::FinishCall(MVT RetVT, SmallVectorImpl<Register> &UsedRegs,
2088 const Instruction *I, CallingConv::ID CC,
2089 unsigned &NumBytes, bool isVarArg) {
2090 // Issue CALLSEQ_END
2091 unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
2092 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2093 TII.get(AdjStackUp))
2094 .addImm(NumBytes).addImm(-1ULL));
2095
2096 // Now the return value.
2097 if (RetVT != MVT::isVoid) {
2099 CCState CCInfo(CC, isVarArg, *FuncInfo.MF, RVLocs, *Context);
2100 CCInfo.AnalyzeCallResult(RetVT, I->getType(),
2101 CCAssignFnForCall(CC, true, isVarArg));
2102
2103 // Copy all of the result registers out of their specified physreg.
2104 if (RVLocs.size() == 2 && RetVT == MVT::f64) {
2105 // For this move we copy into two registers and then move into the
2106 // double fp reg we want.
2107 MVT DestVT = RVLocs[0].getValVT();
2108 const TargetRegisterClass* DstRC = TLI.getRegClassFor(DestVT);
2109 Register ResultReg = createResultReg(DstRC);
2110 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2111 TII.get(ARM::VMOVDRR), ResultReg)
2112 .addReg(RVLocs[0].getLocReg())
2113 .addReg(RVLocs[1].getLocReg()));
2114
2115 UsedRegs.push_back(RVLocs[0].getLocReg());
2116 UsedRegs.push_back(RVLocs[1].getLocReg());
2117
2118 // Finally update the result.
2119 updateValueMap(I, ResultReg);
2120 } else {
2121 assert(RVLocs.size() == 1 &&"Can't handle non-double multi-reg retvals!");
2122 MVT CopyVT = RVLocs[0].getValVT();
2123
2124 // Special handling for extended integers.
2125 if (RetVT == MVT::i1 || RetVT == MVT::i8 || RetVT == MVT::i16)
2126 CopyVT = MVT::i32;
2127
2128 const TargetRegisterClass* DstRC = TLI.getRegClassFor(CopyVT);
2129
2130 Register ResultReg = createResultReg(DstRC);
2131 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2132 TII.get(TargetOpcode::COPY),
2133 ResultReg).addReg(RVLocs[0].getLocReg());
2134 UsedRegs.push_back(RVLocs[0].getLocReg());
2135
2136 // Finally update the result.
2137 updateValueMap(I, ResultReg);
2138 }
2139 }
2140
2141 return true;
2142}
2143
2144bool ARMFastISel::SelectRet(const Instruction *I) {
2145 const ReturnInst *Ret = cast<ReturnInst>(I);
2146 const Function &F = *I->getParent()->getParent();
2147 const bool IsCmseNSEntry = F.hasFnAttribute("cmse_nonsecure_entry");
2148
2149 if (!FuncInfo.CanLowerReturn)
2150 return false;
2151
2152 if (TLI.supportSwiftError() &&
2153 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError))
2154 return false;
2155
2156 if (TLI.supportSplitCSR(FuncInfo.MF))
2157 return false;
2158
2159 // Build a list of return value registers.
2161
2162 CallingConv::ID CC = F.getCallingConv();
2163 if (Ret->getNumOperands() > 0) {
2165 GetReturnInfo(CC, F.getReturnType(), F.getAttributes(), Outs, TLI, DL);
2166
2167 // Analyze operands of the call, assigning locations to each operand.
2169 CCState CCInfo(CC, F.isVarArg(), *FuncInfo.MF, ValLocs, I->getContext());
2170 CCInfo.AnalyzeReturn(Outs, CCAssignFnForCall(CC, true /* is Ret */,
2171 F.isVarArg()));
2172
2173 const Value *RV = Ret->getOperand(0);
2174 Register Reg = getRegForValue(RV);
2175 if (!Reg)
2176 return false;
2177
2178 // Only handle a single return value for now.
2179 if (ValLocs.size() != 1)
2180 return false;
2181
2182 CCValAssign &VA = ValLocs[0];
2183
2184 // Don't bother handling odd stuff for now.
2185 if (VA.getLocInfo() != CCValAssign::Full)
2186 return false;
2187 // Only handle register returns for now.
2188 if (!VA.isRegLoc())
2189 return false;
2190
2191 Register SrcReg = Reg + VA.getValNo();
2192 EVT RVEVT = TLI.getValueType(DL, RV->getType());
2193 if (!RVEVT.isSimple()) return false;
2194 MVT RVVT = RVEVT.getSimpleVT();
2195 MVT DestVT = VA.getValVT();
2196 // Special handling for extended integers.
2197 if (RVVT != DestVT) {
2198 if (RVVT != MVT::i1 && RVVT != MVT::i8 && RVVT != MVT::i16)
2199 return false;
2200
2201 assert(DestVT == MVT::i32 && "ARM should always ext to i32");
2202
2203 // Perform extension if flagged as either zext or sext. Otherwise, do
2204 // nothing.
2205 if (Outs[0].Flags.isZExt() || Outs[0].Flags.isSExt()) {
2206 SrcReg = ARMEmitIntExt(RVVT, SrcReg, DestVT, Outs[0].Flags.isZExt());
2207 if (!SrcReg)
2208 return false;
2209 }
2210 }
2211
2212 // Make the copy.
2213 Register DstReg = VA.getLocReg();
2214 const TargetRegisterClass* SrcRC = MRI.getRegClass(SrcReg);
2215 // Avoid a cross-class copy. This is very unlikely.
2216 if (!SrcRC->contains(DstReg))
2217 return false;
2218 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2219 TII.get(TargetOpcode::COPY), DstReg).addReg(SrcReg);
2220
2221 // Add register to return instruction.
2222 RetRegs.push_back(VA.getLocReg());
2223 }
2224
2225 unsigned RetOpc;
2226 if (IsCmseNSEntry)
2227 if (isThumb2)
2228 RetOpc = ARM::tBXNS_RET;
2229 else
2230 llvm_unreachable("CMSE not valid for non-Thumb targets");
2231 else
2232 RetOpc = Subtarget->getReturnOpcode();
2233
2234 MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2235 TII.get(RetOpc));
2236 AddOptionalDefs(MIB);
2237 for (Register R : RetRegs)
2238 MIB.addReg(R, RegState::Implicit);
2239 return true;
2240}
2241
2242unsigned ARMFastISel::ARMSelectCallOp(bool UseReg) {
2243 if (UseReg)
2244 return isThumb2 ? gettBLXrOpcode(*MF) : getBLXOpcode(*MF);
2245 else
2246 return isThumb2 ? ARM::tBL : ARM::BL;
2247}
2248
2249Register ARMFastISel::getLibcallReg(const Twine &Name) {
2250 // Manually compute the global's type to avoid building it when unnecessary.
2251 Type *GVTy = PointerType::get(*Context, /*AS=*/0);
2252 EVT LCREVT = TLI.getValueType(DL, GVTy);
2253 if (!LCREVT.isSimple())
2254 return Register();
2255
2256 GlobalValue *GV = M.getNamedGlobal(Name.str());
2257 if (!GV)
2258 GV = new GlobalVariable(M, Type::getInt32Ty(*Context), false,
2259 GlobalValue::ExternalLinkage, nullptr, Name);
2260
2261 return ARMMaterializeGV(GV, LCREVT.getSimpleVT());
2262}
2263
2264// A quick function that will emit a call for a named libcall in F with the
2265// vector of passed arguments for the Instruction in I. We can assume that we
2266// can emit a call for any libcall we can produce. This is an abridged version
2267// of the full call infrastructure since we won't need to worry about things
2268// like computed function pointers or strange arguments at call sites.
2269// TODO: Try to unify this and the normal call bits for ARM, then try to unify
2270// with X86.
2271bool ARMFastISel::ARMEmitLibcall(const Instruction *I, RTLIB::Libcall Call) {
2272 RTLIB::LibcallImpl LCImpl = LibcallLowering->getLibcallImpl(Call);
2273 if (LCImpl == RTLIB::Unsupported)
2274 return false;
2275
2276 // Handle *simple* calls for now.
2277 Type *RetTy = I->getType();
2278 MVT RetVT;
2279 if (RetTy->isVoidTy())
2280 RetVT = MVT::isVoid;
2281 else if (!isTypeLegal(RetTy, RetVT))
2282 return false;
2283
2284 CallingConv::ID CC = LibcallLowering->getLibcallImplCallingConv(LCImpl);
2285
2286 // Can't handle non-double multi-reg retvals.
2287 if (RetVT != MVT::isVoid && RetVT != MVT::i32) {
2289 CCState CCInfo(CC, false, *FuncInfo.MF, RVLocs, *Context);
2290 CCInfo.AnalyzeCallResult(RetVT, RetTy, CCAssignFnForCall(CC, true, false));
2291 if (RVLocs.size() >= 2 && RetVT != MVT::f64)
2292 return false;
2293 }
2294
2295 // Set up the argument vectors.
2296 SmallVector<Value*, 8> Args;
2298 SmallVector<MVT, 8> ArgVTs;
2300 Args.reserve(I->getNumOperands());
2301 ArgRegs.reserve(I->getNumOperands());
2302 ArgVTs.reserve(I->getNumOperands());
2303 ArgFlags.reserve(I->getNumOperands());
2304 for (Value *Op : I->operands()) {
2305 Register Arg = getRegForValue(Op);
2306 if (!Arg)
2307 return false;
2308
2309 Type *ArgTy = Op->getType();
2310 MVT ArgVT;
2311 if (!isTypeLegal(ArgTy, ArgVT)) return false;
2312
2313 ISD::ArgFlagsTy Flags;
2314 Flags.setOrigAlign(DL.getABITypeAlign(ArgTy));
2315
2316 Args.push_back(Op);
2317 ArgRegs.push_back(Arg);
2318 ArgVTs.push_back(ArgVT);
2319 ArgFlags.push_back(Flags);
2320 }
2321
2322 // Handle the arguments now that we've gotten them.
2324 unsigned NumBytes;
2325 if (!ProcessCallArgs(Args, ArgRegs, ArgVTs, ArgFlags,
2326 RegArgs, CC, NumBytes, false))
2327 return false;
2328
2329 StringRef FuncName = RTLIB::RuntimeLibcallsInfo::getLibcallImplName(LCImpl);
2330
2331 Register CalleeReg;
2332 if (Subtarget->genLongCalls()) {
2333 CalleeReg = getLibcallReg(FuncName);
2334 if (!CalleeReg)
2335 return false;
2336 }
2337
2338 // Issue the call.
2339 unsigned CallOpc = ARMSelectCallOp(Subtarget->genLongCalls());
2340 MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
2341 MIMD, TII.get(CallOpc));
2342 // BL / BLX don't take a predicate, but tBL / tBLX do.
2343 if (isThumb2)
2344 MIB.add(predOps(ARMCC::AL));
2345 if (Subtarget->genLongCalls()) {
2346 CalleeReg =
2347 constrainOperandRegClass(TII.get(CallOpc), CalleeReg, isThumb2 ? 2 : 0);
2348 MIB.addReg(CalleeReg);
2349 } else
2350 MIB.addExternalSymbol(FuncName.data());
2351
2352 // Add implicit physical register uses to the call.
2353 for (Register R : RegArgs)
2354 MIB.addReg(R, RegState::Implicit);
2355
2356 // Add a register mask with the call-preserved registers.
2357 // Proper defs for return values will be added by setPhysRegsDeadExcept().
2358 MIB.addRegMask(TRI.getCallPreservedMask(*FuncInfo.MF, CC));
2359
2360 // Finish off the call including any return values.
2361 SmallVector<Register, 4> UsedRegs;
2362 if (!FinishCall(RetVT, UsedRegs, I, CC, NumBytes, false)) return false;
2363
2364 // Set all unused physreg defs as dead.
2365 static_cast<MachineInstr *>(MIB)->setPhysRegsDeadExcept(UsedRegs, TRI);
2366
2367 return true;
2368}
2369
2370bool ARMFastISel::SelectCall(const Instruction *I,
2371 const char *IntrMemName = nullptr) {
2372 const CallInst *CI = cast<CallInst>(I);
2373 const Value *Callee = CI->getCalledOperand();
2374
2375 // Can't handle inline asm.
2376 if (isa<InlineAsm>(Callee)) return false;
2377
2378 // Allow SelectionDAG isel to handle tail calls.
2379 if (CI->isTailCall()) return false;
2380
2381 // Check the calling convention.
2382 CallingConv::ID CC = CI->getCallingConv();
2383
2384 // TODO: Avoid some calling conventions?
2385
2386 FunctionType *FTy = CI->getFunctionType();
2387 bool isVarArg = FTy->isVarArg();
2388
2389 // Handle *simple* calls for now.
2390 Type *RetTy = I->getType();
2391 MVT RetVT;
2392 if (RetTy->isVoidTy())
2393 RetVT = MVT::isVoid;
2394 else if (!isTypeLegal(RetTy, RetVT) && RetVT != MVT::i16 &&
2395 RetVT != MVT::i8 && RetVT != MVT::i1)
2396 return false;
2397
2398 // Can't handle non-double multi-reg retvals.
2399 if (RetVT != MVT::isVoid && RetVT != MVT::i1 && RetVT != MVT::i8 &&
2400 RetVT != MVT::i16 && RetVT != MVT::i32) {
2402 CCState CCInfo(CC, isVarArg, *FuncInfo.MF, RVLocs, *Context);
2403 CCInfo.AnalyzeCallResult(RetVT, RetTy,
2404 CCAssignFnForCall(CC, true, isVarArg));
2405 if (RVLocs.size() >= 2 && RetVT != MVT::f64)
2406 return false;
2407 }
2408
2409 // Set up the argument vectors.
2410 SmallVector<Value*, 8> Args;
2412 SmallVector<MVT, 8> ArgVTs;
2414 unsigned arg_size = CI->arg_size();
2415 Args.reserve(arg_size);
2416 ArgRegs.reserve(arg_size);
2417 ArgVTs.reserve(arg_size);
2418 ArgFlags.reserve(arg_size);
2419 for (auto ArgI = CI->arg_begin(), ArgE = CI->arg_end(); ArgI != ArgE; ++ArgI) {
2420 // If we're lowering a memory intrinsic instead of a regular call, skip the
2421 // last argument, which shouldn't be passed to the underlying function.
2422 if (IntrMemName && ArgE - ArgI <= 1)
2423 break;
2424
2425 ISD::ArgFlagsTy Flags;
2426 unsigned ArgIdx = ArgI - CI->arg_begin();
2427 if (CI->paramHasAttr(ArgIdx, Attribute::SExt))
2428 Flags.setSExt();
2429 if (CI->paramHasAttr(ArgIdx, Attribute::ZExt))
2430 Flags.setZExt();
2431
2432 // FIXME: Only handle *easy* calls for now.
2433 if (CI->paramHasAttr(ArgIdx, Attribute::InReg) ||
2434 CI->paramHasAttr(ArgIdx, Attribute::StructRet) ||
2435 CI->paramHasAttr(ArgIdx, Attribute::SwiftSelf) ||
2436 CI->paramHasAttr(ArgIdx, Attribute::SwiftError) ||
2437 CI->paramHasAttr(ArgIdx, Attribute::Nest) ||
2438 CI->paramHasAttr(ArgIdx, Attribute::ByVal))
2439 return false;
2440
2441 Type *ArgTy = (*ArgI)->getType();
2442 MVT ArgVT;
2443 if (!isTypeLegal(ArgTy, ArgVT) && ArgVT != MVT::i16 && ArgVT != MVT::i8 &&
2444 ArgVT != MVT::i1)
2445 return false;
2446
2447 Register Arg = getRegForValue(*ArgI);
2448 if (!Arg.isValid())
2449 return false;
2450
2451 Flags.setOrigAlign(DL.getABITypeAlign(ArgTy));
2452
2453 Args.push_back(*ArgI);
2454 ArgRegs.push_back(Arg);
2455 ArgVTs.push_back(ArgVT);
2456 ArgFlags.push_back(Flags);
2457 }
2458
2459 // Handle the arguments now that we've gotten them.
2461 unsigned NumBytes;
2462 if (!ProcessCallArgs(Args, ArgRegs, ArgVTs, ArgFlags,
2463 RegArgs, CC, NumBytes, isVarArg))
2464 return false;
2465
2466 bool UseReg = false;
2467 const GlobalValue *GV = dyn_cast<GlobalValue>(Callee);
2468 if (!GV || Subtarget->genLongCalls()) UseReg = true;
2469
2470 Register CalleeReg;
2471 if (UseReg) {
2472 if (IntrMemName)
2473 CalleeReg = getLibcallReg(IntrMemName);
2474 else
2475 CalleeReg = getRegForValue(Callee);
2476
2477 if (!CalleeReg)
2478 return false;
2479 }
2480
2481 // Issue the call.
2482 unsigned CallOpc = ARMSelectCallOp(UseReg);
2483 MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
2484 MIMD, TII.get(CallOpc));
2485
2486 // ARM calls don't take a predicate, but tBL / tBLX do.
2487 if(isThumb2)
2488 MIB.add(predOps(ARMCC::AL));
2489 if (UseReg) {
2490 CalleeReg =
2491 constrainOperandRegClass(TII.get(CallOpc), CalleeReg, isThumb2 ? 2 : 0);
2492 MIB.addReg(CalleeReg);
2493 } else if (!IntrMemName)
2494 MIB.addGlobalAddress(GV, 0, 0);
2495 else
2496 MIB.addExternalSymbol(IntrMemName, 0);
2497
2498 // Add implicit physical register uses to the call.
2499 for (Register R : RegArgs)
2500 MIB.addReg(R, RegState::Implicit);
2501
2502 // Add a register mask with the call-preserved registers.
2503 // Proper defs for return values will be added by setPhysRegsDeadExcept().
2504 MIB.addRegMask(TRI.getCallPreservedMask(*FuncInfo.MF, CC));
2505
2506 // Finish off the call including any return values.
2507 SmallVector<Register, 4> UsedRegs;
2508 if (!FinishCall(RetVT, UsedRegs, I, CC, NumBytes, isVarArg))
2509 return false;
2510
2511 // Set all unused physreg defs as dead.
2512 static_cast<MachineInstr *>(MIB)->setPhysRegsDeadExcept(UsedRegs, TRI);
2513
2514 diagnoseDontCall(*CI);
2515 return true;
2516}
2517
2518bool ARMFastISel::ARMIsMemCpySmall(uint64_t Len) {
2519 return Len <= 16;
2520}
2521
2522bool ARMFastISel::ARMTryEmitSmallMemCpy(Address Dest, Address Src, uint64_t Len,
2523 MaybeAlign Alignment) {
2524 // Make sure we don't bloat code by inlining very large memcpy's.
2525 if (!ARMIsMemCpySmall(Len))
2526 return false;
2527
2528 while (Len) {
2529 MVT VT;
2530 if (!Alignment || *Alignment >= 4) {
2531 if (Len >= 4)
2532 VT = MVT::i32;
2533 else if (Len >= 2)
2534 VT = MVT::i16;
2535 else {
2536 assert(Len == 1 && "Expected a length of 1!");
2537 VT = MVT::i8;
2538 }
2539 } else {
2540 assert(Alignment && "Alignment is set in this branch");
2541 // Bound based on alignment.
2542 if (Len >= 2 && *Alignment == 2)
2543 VT = MVT::i16;
2544 else {
2545 VT = MVT::i8;
2546 }
2547 }
2548
2549 bool RV;
2550 Register ResultReg;
2551 RV = ARMEmitLoad(VT, ResultReg, Src);
2552 assert(RV && "Should be able to handle this load.");
2553 RV = ARMEmitStore(VT, ResultReg, Dest);
2554 assert(RV && "Should be able to handle this store.");
2555 (void)RV;
2556
2557 unsigned Size = VT.getSizeInBits()/8;
2558 Len -= Size;
2559 Dest.setOffset(Dest.getOffset() + Size);
2560 Src.setOffset(Src.getOffset() + Size);
2561 }
2562
2563 return true;
2564}
2565
2566bool ARMFastISel::SelectIntrinsicCall(const IntrinsicInst &I) {
2567 // FIXME: Handle more intrinsics.
2568 switch (I.getIntrinsicID()) {
2569 default: return false;
2570 case Intrinsic::frameaddress: {
2571 MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
2572 MFI.setFrameAddressIsTaken(true);
2573
2574 unsigned LdrOpc = isThumb2 ? ARM::t2LDRi12 : ARM::LDRi12;
2575 const TargetRegisterClass *RC = isThumb2 ? &ARM::tGPRRegClass
2576 : &ARM::GPRRegClass;
2577
2578 const ARMBaseRegisterInfo *RegInfo = Subtarget->getRegisterInfo();
2579 Register FramePtr = RegInfo->getFrameRegister(*(FuncInfo.MF));
2580 Register SrcReg = FramePtr;
2581
2582 // Recursively load frame address
2583 // ldr r0 [fp]
2584 // ldr r0 [r0]
2585 // ldr r0 [r0]
2586 // ...
2587 Register DestReg;
2588 unsigned Depth = cast<ConstantInt>(I.getOperand(0))->getZExtValue();
2589 while (Depth--) {
2590 DestReg = createResultReg(RC);
2591 AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2592 TII.get(LdrOpc), DestReg)
2593 .addReg(SrcReg).addImm(0));
2594 SrcReg = DestReg;
2595 }
2596 updateValueMap(&I, SrcReg);
2597 return true;
2598 }
2599 case Intrinsic::memcpy:
2600 case Intrinsic::memmove: {
2601 const MemTransferInst &MTI = cast<MemTransferInst>(I);
2602 // Don't handle volatile.
2603 if (MTI.isVolatile())
2604 return false;
2605
2606 // Disable inlining for memmove before calls to ComputeAddress. Otherwise,
2607 // we would emit dead code because we don't currently handle memmoves.
2608 bool isMemCpy = (I.getIntrinsicID() == Intrinsic::memcpy);
2609 if (isa<ConstantInt>(MTI.getLength()) && isMemCpy) {
2610 // Small memcpy's are common enough that we want to do them without a call
2611 // if possible.
2612 uint64_t Len = cast<ConstantInt>(MTI.getLength())->getZExtValue();
2613 if (ARMIsMemCpySmall(Len)) {
2614 Address Dest, Src;
2615 if (!ARMComputeAddress(MTI.getRawDest(), Dest) ||
2616 !ARMComputeAddress(MTI.getRawSource(), Src))
2617 return false;
2618 MaybeAlign Alignment;
2619 if (MTI.getDestAlign() || MTI.getSourceAlign())
2620 Alignment = std::min(MTI.getDestAlign().valueOrOne(),
2621 MTI.getSourceAlign().valueOrOne());
2622 if (ARMTryEmitSmallMemCpy(Dest, Src, Len, Alignment))
2623 return true;
2624 }
2625 }
2626
2627 if (!MTI.getLength()->getType()->isIntegerTy(32))
2628 return false;
2629
2630 if (MTI.getSourceAddressSpace() > 255 || MTI.getDestAddressSpace() > 255)
2631 return false;
2632
2633 const char *IntrMemName = isa<MemCpyInst>(I) ? "memcpy" : "memmove";
2634 return SelectCall(&I, IntrMemName);
2635 }
2636 case Intrinsic::memset: {
2637 const MemSetInst &MSI = cast<MemSetInst>(I);
2638 // Don't handle volatile.
2639 if (MSI.isVolatile())
2640 return false;
2641
2642 if (!MSI.getLength()->getType()->isIntegerTy(32))
2643 return false;
2644
2645 if (MSI.getDestAddressSpace() > 255)
2646 return false;
2647
2648 return SelectCall(&I, "memset");
2649 }
2650 case Intrinsic::trap: {
2651 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2652 TII.get(Subtarget->isThumb() ? ARM::tTRAP : ARM::TRAP));
2653 return true;
2654 }
2655 }
2656}
2657
2658bool ARMFastISel::SelectTrunc(const Instruction *I) {
2659 // The high bits for a type smaller than the register size are assumed to be
2660 // undefined.
2661 Value *Op = I->getOperand(0);
2662
2663 EVT SrcVT, DestVT;
2664 SrcVT = TLI.getValueType(DL, Op->getType(), true);
2665 DestVT = TLI.getValueType(DL, I->getType(), true);
2666
2667 if (SrcVT != MVT::i32 && SrcVT != MVT::i16 && SrcVT != MVT::i8)
2668 return false;
2669 if (DestVT != MVT::i16 && DestVT != MVT::i8 && DestVT != MVT::i1)
2670 return false;
2671
2672 Register SrcReg = getRegForValue(Op);
2673 if (!SrcReg) return false;
2674
2675 // Because the high bits are undefined, a truncate doesn't generate
2676 // any code.
2677 updateValueMap(I, SrcReg);
2678 return true;
2679}
2680
2681Register ARMFastISel::ARMEmitIntExt(MVT SrcVT, Register SrcReg, MVT DestVT,
2682 bool isZExt) {
2683 if (DestVT != MVT::i32 && DestVT != MVT::i16 && DestVT != MVT::i8)
2684 return Register();
2685 if (SrcVT != MVT::i16 && SrcVT != MVT::i8 && SrcVT != MVT::i1)
2686 return Register();
2687
2688 // Table of which combinations can be emitted as a single instruction,
2689 // and which will require two.
2690 static const uint8_t isSingleInstrTbl[3][2][2][2] = {
2691 // ARM Thumb
2692 // !hasV6Ops hasV6Ops !hasV6Ops hasV6Ops
2693 // ext: s z s z s z s z
2694 /* 1 */ { { { 0, 1 }, { 0, 1 } }, { { 0, 0 }, { 0, 1 } } },
2695 /* 8 */ { { { 0, 1 }, { 1, 1 } }, { { 0, 0 }, { 1, 1 } } },
2696 /* 16 */ { { { 0, 0 }, { 1, 1 } }, { { 0, 0 }, { 1, 1 } } }
2697 };
2698
2699 // Target registers for:
2700 // - For ARM can never be PC.
2701 // - For 16-bit Thumb are restricted to lower 8 registers.
2702 // - For 32-bit Thumb are restricted to non-SP and non-PC.
2703 static const TargetRegisterClass *RCTbl[2][2] = {
2704 // Instructions: Two Single
2705 /* ARM */ { &ARM::GPRnopcRegClass, &ARM::GPRnopcRegClass },
2706 /* Thumb */ { &ARM::tGPRRegClass, &ARM::rGPRRegClass }
2707 };
2708
2709 // Table governing the instruction(s) to be emitted.
2710 static const struct InstructionTable {
2711 uint32_t Opc : 16;
2712 uint32_t hasS : 1; // Some instructions have an S bit, always set it to 0.
2713 uint32_t Shift : 7; // For shift operand addressing mode, used by MOVsi.
2714 uint32_t Imm : 8; // All instructions have either a shift or a mask.
2715 } IT[2][2][3][2] = {
2716 { // Two instructions (first is left shift, second is in this table).
2717 { // ARM Opc S Shift Imm
2718 /* 1 bit sext */ { { ARM::MOVsi , 1, ARM_AM::asr , 31 },
2719 /* 1 bit zext */ { ARM::MOVsi , 1, ARM_AM::lsr , 31 } },
2720 /* 8 bit sext */ { { ARM::MOVsi , 1, ARM_AM::asr , 24 },
2721 /* 8 bit zext */ { ARM::MOVsi , 1, ARM_AM::lsr , 24 } },
2722 /* 16 bit sext */ { { ARM::MOVsi , 1, ARM_AM::asr , 16 },
2723 /* 16 bit zext */ { ARM::MOVsi , 1, ARM_AM::lsr , 16 } }
2724 },
2725 { // Thumb Opc S Shift Imm
2726 /* 1 bit sext */ { { ARM::tASRri , 0, ARM_AM::no_shift, 31 },
2727 /* 1 bit zext */ { ARM::tLSRri , 0, ARM_AM::no_shift, 31 } },
2728 /* 8 bit sext */ { { ARM::tASRri , 0, ARM_AM::no_shift, 24 },
2729 /* 8 bit zext */ { ARM::tLSRri , 0, ARM_AM::no_shift, 24 } },
2730 /* 16 bit sext */ { { ARM::tASRri , 0, ARM_AM::no_shift, 16 },
2731 /* 16 bit zext */ { ARM::tLSRri , 0, ARM_AM::no_shift, 16 } }
2732 }
2733 },
2734 { // Single instruction.
2735 { // ARM Opc S Shift Imm
2736 /* 1 bit sext */ { { ARM::KILL , 0, ARM_AM::no_shift, 0 },
2737 /* 1 bit zext */ { ARM::ANDri , 1, ARM_AM::no_shift, 1 } },
2738 /* 8 bit sext */ { { ARM::SXTB , 0, ARM_AM::no_shift, 0 },
2739 /* 8 bit zext */ { ARM::ANDri , 1, ARM_AM::no_shift, 255 } },
2740 /* 16 bit sext */ { { ARM::SXTH , 0, ARM_AM::no_shift, 0 },
2741 /* 16 bit zext */ { ARM::UXTH , 0, ARM_AM::no_shift, 0 } }
2742 },
2743 { // Thumb Opc S Shift Imm
2744 /* 1 bit sext */ { { ARM::KILL , 0, ARM_AM::no_shift, 0 },
2745 /* 1 bit zext */ { ARM::t2ANDri, 1, ARM_AM::no_shift, 1 } },
2746 /* 8 bit sext */ { { ARM::t2SXTB , 0, ARM_AM::no_shift, 0 },
2747 /* 8 bit zext */ { ARM::t2ANDri, 1, ARM_AM::no_shift, 255 } },
2748 /* 16 bit sext */ { { ARM::t2SXTH , 0, ARM_AM::no_shift, 0 },
2749 /* 16 bit zext */ { ARM::t2UXTH , 0, ARM_AM::no_shift, 0 } }
2750 }
2751 }
2752 };
2753
2754 unsigned SrcBits = SrcVT.getSizeInBits();
2755 unsigned DestBits = DestVT.getSizeInBits();
2756 (void) DestBits;
2757 assert((SrcBits < DestBits) && "can only extend to larger types");
2758 assert((DestBits == 32 || DestBits == 16 || DestBits == 8) &&
2759 "other sizes unimplemented");
2760 assert((SrcBits == 16 || SrcBits == 8 || SrcBits == 1) &&
2761 "other sizes unimplemented");
2762
2763 bool hasV6Ops = Subtarget->hasV6Ops();
2764 unsigned Bitness = SrcBits / 8; // {1,8,16}=>{0,1,2}
2765 assert((Bitness < 3) && "sanity-check table bounds");
2766
2767 bool isSingleInstr = isSingleInstrTbl[Bitness][isThumb2][hasV6Ops][isZExt];
2768 const TargetRegisterClass *RC = RCTbl[isThumb2][isSingleInstr];
2769 const InstructionTable *ITP = &IT[isSingleInstr][isThumb2][Bitness][isZExt];
2770 unsigned Opc = ITP->Opc;
2771 assert(ARM::KILL != Opc && "Invalid table entry");
2772 unsigned hasS = ITP->hasS;
2773 ARM_AM::ShiftOpc Shift = (ARM_AM::ShiftOpc) ITP->Shift;
2774 assert(((Shift == ARM_AM::no_shift) == (Opc != ARM::MOVsi)) &&
2775 "only MOVsi has shift operand addressing mode");
2776 unsigned Imm = ITP->Imm;
2777
2778 // 16-bit Thumb instructions always set CPSR (unless they're in an IT block).
2779 bool setsCPSR = &ARM::tGPRRegClass == RC;
2780 unsigned LSLOpc = isThumb2 ? ARM::tLSLri : ARM::MOVsi;
2781 Register ResultReg;
2782 // MOVsi encodes shift and immediate in shift operand addressing mode.
2783 // The following condition has the same value when emitting two
2784 // instruction sequences: both are shifts.
2785 bool ImmIsSO = (Shift != ARM_AM::no_shift);
2786
2787 // Either one or two instructions are emitted.
2788 // They're always of the form:
2789 // dst = in OP imm
2790 // CPSR is set only by 16-bit Thumb instructions.
2791 // Predicate, if any, is AL.
2792 // S bit, if available, is always 0.
2793 // When two are emitted the first's result will feed as the second's input,
2794 // that value is then dead.
2795 unsigned NumInstrsEmitted = isSingleInstr ? 1 : 2;
2796 for (unsigned Instr = 0; Instr != NumInstrsEmitted; ++Instr) {
2797 ResultReg = createResultReg(RC);
2798 bool isLsl = (0 == Instr) && !isSingleInstr;
2799 unsigned Opcode = isLsl ? LSLOpc : Opc;
2800 ARM_AM::ShiftOpc ShiftAM = isLsl ? ARM_AM::lsl : Shift;
2801 unsigned ImmEnc = ImmIsSO ? ARM_AM::getSORegOpc(ShiftAM, Imm) : Imm;
2802 bool isKill = 1 == Instr;
2803 MachineInstrBuilder MIB = BuildMI(
2804 *FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opcode), ResultReg);
2805 if (setsCPSR)
2806 MIB.addReg(ARM::CPSR, RegState::Define);
2807 SrcReg = constrainOperandRegClass(TII.get(Opcode), SrcReg, 1 + setsCPSR);
2808 MIB.addReg(SrcReg, getKillRegState(isKill))
2809 .addImm(ImmEnc)
2811 if (hasS)
2812 MIB.add(condCodeOp());
2813 // Second instruction consumes the first's result.
2814 SrcReg = ResultReg;
2815 }
2816
2817 return ResultReg;
2818}
2819
2820bool ARMFastISel::SelectIntExt(const Instruction *I) {
2821 // On ARM, in general, integer casts don't involve legal types; this code
2822 // handles promotable integers.
2823 Type *DestTy = I->getType();
2824 Value *Src = I->getOperand(0);
2825 Type *SrcTy = Src->getType();
2826
2827 bool isZExt = isa<ZExtInst>(I);
2828 Register SrcReg = getRegForValue(Src);
2829 if (!SrcReg) return false;
2830
2831 EVT SrcEVT, DestEVT;
2832 SrcEVT = TLI.getValueType(DL, SrcTy, true);
2833 DestEVT = TLI.getValueType(DL, DestTy, true);
2834 if (!SrcEVT.isSimple()) return false;
2835 if (!DestEVT.isSimple()) return false;
2836
2837 MVT SrcVT = SrcEVT.getSimpleVT();
2838 MVT DestVT = DestEVT.getSimpleVT();
2839 Register ResultReg = ARMEmitIntExt(SrcVT, SrcReg, DestVT, isZExt);
2840 if (!ResultReg)
2841 return false;
2842 updateValueMap(I, ResultReg);
2843 return true;
2844}
2845
2846bool ARMFastISel::SelectShift(const Instruction *I,
2847 ARM_AM::ShiftOpc ShiftTy) {
2848 // We handle thumb2 mode by target independent selector
2849 // or SelectionDAG ISel.
2850 if (isThumb2)
2851 return false;
2852
2853 // Only handle i32 now.
2854 EVT DestVT = TLI.getValueType(DL, I->getType(), true);
2855 if (DestVT != MVT::i32)
2856 return false;
2857
2858 unsigned Opc = ARM::MOVsr;
2859 unsigned ShiftImm;
2860 Value *Src2Value = I->getOperand(1);
2861 if (const ConstantInt *CI = dyn_cast<ConstantInt>(Src2Value)) {
2862 ShiftImm = CI->getZExtValue();
2863
2864 // Fall back to selection DAG isel if the shift amount
2865 // is zero or greater than the width of the value type.
2866 if (ShiftImm == 0 || ShiftImm >=32)
2867 return false;
2868
2869 Opc = ARM::MOVsi;
2870 }
2871
2872 Value *Src1Value = I->getOperand(0);
2873 Register Reg1 = getRegForValue(Src1Value);
2874 if (!Reg1)
2875 return false;
2876
2877 Register Reg2;
2878 if (Opc == ARM::MOVsr) {
2879 Reg2 = getRegForValue(Src2Value);
2880 if (!Reg2)
2881 return false;
2882 }
2883
2884 Register ResultReg = createResultReg(&ARM::GPRnopcRegClass);
2885 if (!ResultReg)
2886 return false;
2887
2888 MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
2889 TII.get(Opc), ResultReg)
2890 .addReg(Reg1);
2891
2892 if (Opc == ARM::MOVsi)
2893 MIB.addImm(ARM_AM::getSORegOpc(ShiftTy, ShiftImm));
2894 else if (Opc == ARM::MOVsr) {
2895 MIB.addReg(Reg2);
2896 MIB.addImm(ARM_AM::getSORegOpc(ShiftTy, 0));
2897 }
2898
2899 AddOptionalDefs(MIB);
2900 updateValueMap(I, ResultReg);
2901 return true;
2902}
2903
2904// TODO: SoftFP support.
2905bool ARMFastISel::fastSelectInstruction(const Instruction *I) {
2906 switch (I->getOpcode()) {
2907 case Instruction::Load:
2908 return SelectLoad(I);
2909 case Instruction::Store:
2910 return SelectStore(I);
2911 case Instruction::CondBr:
2912 return SelectBranch(I);
2913 case Instruction::IndirectBr:
2914 return SelectIndirectBr(I);
2915 case Instruction::ICmp:
2916 case Instruction::FCmp:
2917 return SelectCmp(I);
2918 case Instruction::FPExt:
2919 return SelectFPExt(I);
2920 case Instruction::FPTrunc:
2921 return SelectFPTrunc(I);
2922 case Instruction::SIToFP:
2923 return SelectIToFP(I, /*isSigned*/ true);
2924 case Instruction::UIToFP:
2925 return SelectIToFP(I, /*isSigned*/ false);
2926 case Instruction::FPToSI:
2927 return SelectFPToI(I, /*isSigned*/ true);
2928 case Instruction::FPToUI:
2929 return SelectFPToI(I, /*isSigned*/ false);
2930 case Instruction::Add:
2931 return SelectBinaryIntOp(I, ISD::ADD);
2932 case Instruction::Or:
2933 return SelectBinaryIntOp(I, ISD::OR);
2934 case Instruction::Sub:
2935 return SelectBinaryIntOp(I, ISD::SUB);
2936 case Instruction::FAdd:
2937 return SelectBinaryFPOp(I, ISD::FADD);
2938 case Instruction::FSub:
2939 return SelectBinaryFPOp(I, ISD::FSUB);
2940 case Instruction::FMul:
2941 return SelectBinaryFPOp(I, ISD::FMUL);
2942 case Instruction::SDiv:
2943 return SelectDiv(I, /*isSigned*/ true);
2944 case Instruction::UDiv:
2945 return SelectDiv(I, /*isSigned*/ false);
2946 case Instruction::SRem:
2947 return SelectRem(I, /*isSigned*/ true);
2948 case Instruction::URem:
2949 return SelectRem(I, /*isSigned*/ false);
2950 case Instruction::Call:
2951 if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
2952 return SelectIntrinsicCall(*II);
2953 return SelectCall(I);
2954 case Instruction::Select:
2955 return SelectSelect(I);
2956 case Instruction::Ret:
2957 return SelectRet(I);
2958 case Instruction::Trunc:
2959 return SelectTrunc(I);
2960 case Instruction::ZExt:
2961 case Instruction::SExt:
2962 return SelectIntExt(I);
2963 case Instruction::Shl:
2964 return SelectShift(I, ARM_AM::lsl);
2965 case Instruction::LShr:
2966 return SelectShift(I, ARM_AM::lsr);
2967 case Instruction::AShr:
2968 return SelectShift(I, ARM_AM::asr);
2969 default: break;
2970 }
2971 return false;
2972}
2973
2974// This table describes sign- and zero-extend instructions which can be
2975// folded into a preceding load. All of these extends have an immediate
2976// (sometimes a mask and sometimes a shift) that's applied after
2977// extension.
2984 { { ARM::SXTH, ARM::t2SXTH }, 0, 0, MVT::i16 },
2985 { { ARM::UXTH, ARM::t2UXTH }, 0, 1, MVT::i16 },
2986 { { ARM::ANDri, ARM::t2ANDri }, 255, 1, MVT::i8 },
2987 { { ARM::SXTB, ARM::t2SXTB }, 0, 0, MVT::i8 },
2988 { { ARM::UXTB, ARM::t2UXTB }, 0, 1, MVT::i8 }
2990
2991/// The specified machine instr operand is a vreg, and that
2992/// vreg is being provided by the specified load instruction. If possible,
2993/// try to fold the load as an operand to the instruction, returning true if
2994/// successful.
2995bool ARMFastISel::tryToFoldLoadIntoMI(MachineInstr *MI, unsigned OpNo,
2996 const LoadInst *LI) {
2997 // Verify we have a legal type before going any further.
2998 MVT VT;
2999 if (!isLoadTypeLegal(LI->getType(), VT))
3000 return false;
3001
3002 // Combine load followed by zero- or sign-extend.
3003 // ldrb r1, [r0] ldrb r1, [r0]
3004 // uxtb r2, r1 =>
3005 // mov r3, r2 mov r3, r1
3006 if (MI->getNumOperands() < 3 || !MI->getOperand(2).isImm())
3007 return false;
3008 const uint64_t Imm = MI->getOperand(2).getImm();
3009
3010 bool Found = false;
3011 bool isZExt;
3012 for (const FoldableLoadExtendsStruct &FLE : FoldableLoadExtends) {
3013 if (FLE.Opc[isThumb2] == MI->getOpcode() &&
3014 (uint64_t)FLE.ExpectedImm == Imm &&
3015 MVT((MVT::SimpleValueType)FLE.ExpectedVT) == VT) {
3016 Found = true;
3017 isZExt = FLE.isZExt;
3018 }
3019 }
3020 if (!Found) return false;
3021
3022 // See if we can handle this address.
3023 Address Addr;
3024 if (!ARMComputeAddress(LI->getOperand(0), Addr)) return false;
3025
3026 Register ResultReg = MI->getOperand(0).getReg();
3027 if (!ARMEmitLoad(VT, ResultReg, Addr, LI->getAlign(), isZExt, false))
3028 return false;
3030 removeDeadCode(I, std::next(I));
3031 return true;
3032}
3033
3034Register ARMFastISel::ARMLowerPICELF(const GlobalValue *GV, MVT VT) {
3035 bool UseGOT_PREL = !GV->isDSOLocal();
3036 LLVMContext *Context = &MF->getFunction().getContext();
3037 unsigned ARMPCLabelIndex = AFI->createPICLabelUId();
3038 unsigned PCAdj = Subtarget->isThumb() ? 4 : 8;
3039 ARMConstantPoolValue *CPV = ARMConstantPoolConstant::Create(
3040 GV, ARMPCLabelIndex, ARMCP::CPValue, PCAdj,
3041 UseGOT_PREL ? ARMCP::GOT_PREL : ARMCP::no_modifier,
3042 /*AddCurrentAddress=*/UseGOT_PREL);
3043
3044 Align ConstAlign =
3045 MF->getDataLayout().getPrefTypeAlign(PointerType::get(*Context, 0));
3046 unsigned Idx = MF->getConstantPool()->getConstantPoolIndex(CPV, ConstAlign);
3047 MachineMemOperand *CPMMO =
3048 MF->getMachineMemOperand(MachinePointerInfo::getConstantPool(*MF),
3050
3051 Register TempReg = MF->getRegInfo().createVirtualRegister(&ARM::rGPRRegClass);
3052 unsigned Opc = isThumb2 ? ARM::t2LDRpci : ARM::LDRcp;
3053 MachineInstrBuilder MIB =
3054 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opc), TempReg)
3056 .addMemOperand(CPMMO);
3057 if (Opc == ARM::LDRcp)
3058 MIB.addImm(0);
3059 MIB.add(predOps(ARMCC::AL));
3060
3061 // Fix the address by adding pc.
3062 Register DestReg = createResultReg(TLI.getRegClassFor(VT));
3063 Opc = Subtarget->isThumb() ? ARM::tPICADD : UseGOT_PREL ? ARM::PICLDR
3064 : ARM::PICADD;
3065 DestReg = constrainOperandRegClass(TII.get(Opc), DestReg, 0);
3066 MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opc), DestReg)
3067 .addReg(TempReg)
3068 .addImm(ARMPCLabelIndex);
3069
3070 if (!Subtarget->isThumb())
3071 MIB.add(predOps(ARMCC::AL));
3072
3073 if (UseGOT_PREL && Subtarget->isThumb()) {
3074 Register NewDestReg = createResultReg(TLI.getRegClassFor(VT));
3075 MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
3076 TII.get(ARM::t2LDRi12), NewDestReg)
3077 .addReg(DestReg)
3078 .addImm(0);
3079 DestReg = NewDestReg;
3080 AddOptionalDefs(MIB);
3081 }
3082 return DestReg;
3083}
3084
3085bool ARMFastISel::fastLowerArguments() {
3086 if (!FuncInfo.CanLowerReturn)
3087 return false;
3088
3089 const Function *F = FuncInfo.Fn;
3090 if (F->isVarArg())
3091 return false;
3092
3093 CallingConv::ID CC = F->getCallingConv();
3094 switch (CC) {
3095 default:
3096 return false;
3097 case CallingConv::Fast:
3098 case CallingConv::C:
3099 case CallingConv::ARM_AAPCS_VFP:
3100 case CallingConv::ARM_AAPCS:
3101 case CallingConv::ARM_APCS:
3102 case CallingConv::Swift:
3103 case CallingConv::SwiftTail:
3104 break;
3105 }
3106
3107 // Only handle simple cases. i.e. Up to 4 i8/i16/i32 scalar arguments
3108 // which are passed in r0 - r3.
3109 for (const Argument &Arg : F->args()) {
3110 if (Arg.getArgNo() >= 4)
3111 return false;
3112
3113 if (Arg.hasAttribute(Attribute::InReg) ||
3114 Arg.hasAttribute(Attribute::StructRet) ||
3115 Arg.hasAttribute(Attribute::SwiftSelf) ||
3116 Arg.hasAttribute(Attribute::SwiftError) ||
3117 Arg.hasAttribute(Attribute::ByVal))
3118 return false;
3119
3120 Type *ArgTy = Arg.getType();
3121 if (ArgTy->isStructTy() || ArgTy->isArrayTy() || ArgTy->isVectorTy())
3122 return false;
3123
3124 EVT ArgVT = TLI.getValueType(DL, ArgTy);
3125 if (!ArgVT.isSimple()) return false;
3126 switch (ArgVT.getSimpleVT().SimpleTy) {
3127 case MVT::i8:
3128 case MVT::i16:
3129 case MVT::i32:
3130 break;
3131 default:
3132 return false;
3133 }
3134 }
3135
3136 static const MCPhysReg GPRArgRegs[] = {
3137 ARM::R0, ARM::R1, ARM::R2, ARM::R3
3138 };
3139
3140 const TargetRegisterClass *RC = &ARM::rGPRRegClass;
3141 for (const Argument &Arg : F->args()) {
3142 unsigned ArgNo = Arg.getArgNo();
3143 MCRegister SrcReg = GPRArgRegs[ArgNo];
3144 Register DstReg = FuncInfo.MF->addLiveIn(SrcReg, RC);
3145 // FIXME: Unfortunately it's necessary to emit a copy from the livein copy.
3146 // Without this, EmitLiveInCopies may eliminate the livein if its only
3147 // use is a bitcast (which isn't turned into an instruction).
3148 Register ResultReg = createResultReg(RC);
3149 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
3150 TII.get(TargetOpcode::COPY),
3151 ResultReg).addReg(DstReg, getKillRegState(true));
3152 updateValueMap(&Arg, ResultReg);
3153 }
3154
3155 return true;
3156}
3157
3158namespace llvm {
3159
3161 const TargetLibraryInfo *libInfo,
3162 const LibcallLoweringInfo *libcallLowering) {
3163 if (funcInfo.MF->getSubtarget<ARMSubtarget>().useFastISel())
3164 return new ARMFastISel(funcInfo, libInfo, libcallLowering);
3165
3166 return nullptr;
3167}
3168
3169} // end namespace llvm
static const MCPhysReg GPRArgRegs[]
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
static ARMCC::CondCodes getComparePred(CmpInst::Predicate Pred)
static const struct FoldableLoadExtendsStruct FoldableLoadExtends[]
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
static bool isSigned(unsigned Opcode)
This file defines the FastISel class.
static Register UseReg(const MachineOperand &MO)
const HexagonInstrInfo * TII
static MaybeAlign getAlign(Value *Ptr)
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
static const unsigned FramePtr
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1565
int64_t getSExtValue() const
Get sign extended value.
Definition APInt.h:1587
Register getFrameRegister(const MachineFunction &MF) const override
static ARMConstantPoolConstant * Create(const Constant *C, unsigned ID)
bool useFastISel() const
True if fast-isel is used.
bool supportSwiftError() const override
Return true if the target supports swifterror attribute.
bool isFPImmLegal(const APFloat &Imm, EVT VT, bool ForCodeSize=false) const override
isFPImmLegal - Returns true if the target can instruction select the specified FP immediate natively.
bool supportSplitCSR(MachineFunction *MF) const override
Return true if the target supports that a subset of CSRs for the given machine function is handled ex...
const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const override
getRegClassFor - Return the register class that should be used for the specified value type.
bool hasStandaloneRem(EVT VT) const override
Return true if the target can handle a standalone remainder operation.
PointerType * getType() const
Overload to return most specific pointer type.
Register getLocReg() const
LocInfo getLocInfo() const
bool needsCustom() const
int64_t getLocMemOffset() const
unsigned getValNo() const
CallingConv::ID getCallingConv() const
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
Value * getCalledOperand() const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
FunctionType * getFunctionType() const
unsigned arg_size() const
bool isTailCall() const
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
bool isUnsigned() const
Definition InstrTypes.h:999
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
const APFloat & getValueAPF() const
Definition Constants.h:463
bool isNegative() const
Definition Constants.h:214
int64_t getSExtValue() const
Return the constant as a 64-bit integer value after it has been sign extended as appropriate for the ...
Definition Constants.h:174
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:67
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:353
bool isDSOLocal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
PointerType * getType() const
Global values are always pointers.
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
Tracks which library functions to use for a particular subtarget.
Align getAlign() const
Return the alignment of the access that is being performed.
ArrayRef< MCOperandInfo > operands() const
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
SimpleValueType SimpleTy
bool isVector() const
Return true if this is a vector value type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
MachineInstrBundleIterator< MachineInstr > iterator
void setFrameAddressIsTaken(bool T)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned TargetFlags=0) const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addConstantPoolIndex(unsigned Idx, int Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & addRegMask(const uint32_t *Mask) const
const MachineInstrBuilder & addGlobalAddress(const GlobalValue *GV, int64_t Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
Representation of each machine instruction.
Flags
Flags values. These may be or'd together.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
Value * getLength() const
Value * getRawDest() const
MaybeAlign getDestAlign() const
unsigned getDestAddressSpace() const
bool isVolatile() const
Value * getRawSource() const
Return the arguments to the instruction.
unsigned getSourceAddressSpace() const
MaybeAlign getSourceAlign() const
constexpr bool isValid() const
Definition Register.h:112
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr unsigned id() const
Definition Register.h:100
void reserve(size_type N)
void push_back(const T &Elt)
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:774
Provides information about what library functions are available for the current target.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isPositionIndependent() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
bool isArrayTy() const
True if this is an instance of ArrayType.
Definition Type.h:279
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition Type.h:155
bool isStructTy() const
True if this is an instance of StructType.
Definition Type.h:276
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition Type.h:158
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
const Use * const_op_iterator
Definition User.h:255
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
TypeSize getSequentialElementStride(const DataLayout &DL) const
const ParentTy * getParent() const
Definition ilist_node.h:34
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
@ GOT_PREL
Thread Local Storage (General Dynamic Mode)
@ MO_NONLAZY
MO_NONLAZY - This is an independent flag, on a symbol operand "FOO" it represents a symbol which,...
int getSOImmVal(unsigned Arg)
getSOImmVal - Given a 32-bit immediate, if it is something that can fit into an shifter_operand immed...
int getFP32Imm(const APInt &Imm)
getFP32Imm - Return an 8-bit floating-point version of the 32-bit floating-point value.
int getT2SOImmVal(unsigned Arg)
getT2SOImmVal - Given a 32-bit immediate, if it is something that can fit into a Thumb-2 shifter_oper...
int getFP64Imm(const APInt &Imm)
getFP64Imm - Return an 8-bit floating-point version of the 64-bit floating-point value.
unsigned getSORegOpc(ShiftOpc ShOp, unsigned Imm)
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering)
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
constexpr bool isAtomic(const T &...O)
Definition SIDefines.h:389
@ User
could "use" a pointer
NodeAddr< InstrNode * > Instr
Definition RDFGraph.h:389
This is an optimization pass for GlobalISel generic memory operations.
bool RetFastCC_ARM_APCS(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
@ Offset
Definition DWP.cpp:578
LLVM_ABI Register constrainOperandRegClass(const MachineFunction &MF, const TargetRegisterInfo &TRI, MachineRegisterInfo &MRI, const TargetInstrInfo &TII, const RegisterBankInfo &RBI, MachineInstr &InsertPt, const TargetRegisterClass &RegClass, MachineOperand &RegMO)
Constrain the Register operand OpIdx, so that it is now constrained to the TargetRegisterClass passed...
Definition Utils.cpp:60
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr RegState getKillRegState(bool B)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool CCAssignFn(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
CCAssignFn - This function assigns a location for Val, updating State to reflect the change.
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
bool CC_ARM_AAPCS(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
bool RetCC_ARM_AAPCS_VFP(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
bool RetCC_ARM_APCS(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
bool RetCC_ARM_AAPCS(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
bool CC_ARM_APCS_GHC(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
static std::array< MachineOperand, 2 > predOps(ARMCC::CondCodes Pred, unsigned PredReg=0)
Get the operands corresponding to the given Pred value.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
bool FastCC_ARM_APCS(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
bool CC_ARM_Win32_CFGuard_Check(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
generic_gep_type_iterator<> gep_type_iterator
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:190
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
DWARFExpression::Operation Op
static MachineOperand t1CondCodeOp(bool isDead=false)
Get the operand corresponding to the conditional code result for Thumb1.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
gep_type_iterator gep_type_begin(const User *GEP)
static MachineOperand condCodeOp(unsigned CCReg=0)
Get the operand corresponding to the conditional code result.
unsigned gettBLXrOpcode(const MachineFunction &MF)
bool CC_ARM_APCS(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
unsigned getBLXOpcode(const MachineFunction &MF)
bool CC_ARM_AAPCS_VFP(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static LLVM_ABI MachinePointerInfo getConstantPool(MachineFunction &MF)
Return a MachinePointerInfo record that refers to the constant pool.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.