23 static const MCPhysReg RegList[] = { ARM::R0, ARM::R1, ARM::R2, ARM::R3 };
35 ValNo, ValVT, State.AllocateStack(8,
Align(4)), LocVT, LocInfo));
44 ValNo, ValVT, State.AllocateStack(4,
Align(4)), LocVT, LocInfo));
52 if (!
f64AssignAPCS(ValNo, ValVT, LocVT, LocInfo, State,
true))
54 if (LocVT == MVT::v2f64 &&
64 static const MCPhysReg HiRegList[] = { ARM::R0, ARM::R2 };
65 static const MCPhysReg LoRegList[] = { ARM::R1, ARM::R3 };
66 static const MCPhysReg ShadowRegList[] = { ARM::R0, ARM::R1 };
74 assert((!
Reg ||
Reg == ARM::R3) &&
"Wrong GPRs usage for f64");
82 ValNo, ValVT, State.AllocateStack(8,
Align(8)), LocVT, LocInfo));
87 for (i = 0; i < 2; ++i)
88 if (HiRegList[i] ==
Reg)
93 assert(
T == LoRegList[i] &&
"Could not allocate register");
107 if (LocVT == MVT::v2f64 &&
115 static const MCPhysReg HiRegList[] = { ARM::R0, ARM::R2 };
116 static const MCPhysReg LoRegList[] = { ARM::R1, ARM::R3 };
123 for (i = 0; i < 2; ++i)
124 if (HiRegList[i] ==
Reg)
139 if (LocVT == MVT::v2f64 && !
f64RetAssign(ValNo, ValVT, LocVT, LocInfo, State))
155 ARM::S4, ARM::S5, ARM::S6, ARM::S7,
156 ARM::S8, ARM::S9, ARM::S10, ARM::S11,
157 ARM::S12, ARM::S13, ARM::S14, ARM::S15 };
159 ARM::D4, ARM::D5, ARM::D6, ARM::D7 };
176 if (PendingMembers.
size() > 0)
177 assert(PendingMembers[0].getLocVT() == LocVT);
194 assert(StackAlign &&
"data layout string is missing stack alignment");
195 const Align FirstMemberAlign(PendingMembers[0].getExtraInfo());
196 Align Alignment = std::min(FirstMemberAlign, *StackAlign);
202 unsigned RegIdx = State.getFirstUnallocated(RegList);
207 while (RegIdx % RegAlign != 0 && RegIdx < RegList.
size())
208 State.AllocateReg(RegList[RegIdx++]);
233 State.AllocateRegBlock(RegList, PendingMembers.
size());
234 if (!RegResult.
empty()) {
235 for (
const auto &[PendingMember,
Reg] :
zip(PendingMembers, RegResult)) {
236 PendingMember.convertToReg(
Reg);
237 State.addLoc(PendingMember);
239 PendingMembers.
clear();
245 if (LocVT == MVT::i32 && State.getStackSize() == 0) {
248 unsigned RegIdx = State.getFirstUnallocated(RegList);
249 for (
auto &It : PendingMembers) {
250 if (RegIdx >= RegList.
size())
253 It.convertToReg(State.AllocateReg(RegList[RegIdx++]));
257 PendingMembers.clear();
261 if (LocVT != MVT::i32)
265 for (
auto Reg : RegList)
266 State.AllocateReg(
Reg);
275 for (
auto &It : PendingMembers) {
276 It.convertToMem(State.AllocateStack(
Size, Alignment));
278 Alignment =
Align(1);
282 PendingMembers.
clear();
328 ValNo, ValVT, State.AllocateStack(4,
Align(4)), MVT::i32, LocInfo));
333#include "ARMGenCallingConv.inc"
static const MCPhysReg SRegList[]
static const MCPhysReg DRegList[]
static const MCPhysReg QRegList[]
static const MCPhysReg GPRArgRegs[]
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool CC_ARM_AAPCS_VFP_Custom_f16(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
static bool f64RetAssign(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, CCState &State)
static const MCPhysReg RRegList[]
static bool RetCC_ARM_AAPCS_Custom_f64(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
static bool CC_ARM_AAPCS_Custom_Aggregate(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
static bool f64AssignAAPCS(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, CCState &State, bool CanFail)
static bool RetCC_ARM_APCS_Custom_f64(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
static bool CC_ARM_AAPCS_Custom_f64(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
static bool f64AssignAPCS(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, CCState &State, bool CanFail)
static bool CC_ARM_AAPCS_Common_Custom_f16_Stack(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
static bool CC_ARM_AAPCS_Custom_f16(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
static bool CC_ARM_APCS_Custom_f64(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, CCState &State)
static bool CustomAssignInRegList(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, CCState &State, ArrayRef< MCPhysReg > RegList)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
CCState - This class holds information needed while lowering arguments and return values.
static CCValAssign getPending(unsigned ValNo, MVT ValVT, MVT LocVT, LocInfo HTP, unsigned ExtraInfo=0)
static CCValAssign getCustomReg(unsigned ValNo, MVT ValVT, MCRegister Reg, MVT LocVT, LocInfo HTP)
static CCValAssign getCustomMem(unsigned ValNo, MVT ValVT, int64_t Offset, MVT LocVT, LocInfo HTP)
Wrapper class representing physical registers. Should be passed by value.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
const Triple & getTargetTriple() const
bool isTargetAEABI() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Align getNonZeroOrigAlign() const
bool isInConsecutiveRegsLast() const
Align getNonZeroMemAlign() const
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.