22 static const MCPhysReg RegList[] = { ARM::R0, ARM::R1, ARM::R2, ARM::R3 };
34 ValNo, ValVT, State.AllocateStack(8,
Align(4)), LocVT, LocInfo));
43 ValNo, ValVT, State.AllocateStack(4,
Align(4)), LocVT, LocInfo));
51 if (!
f64AssignAPCS(ValNo, ValVT, LocVT, LocInfo, State,
true))
53 if (LocVT == MVT::v2f64 &&
63 static const MCPhysReg HiRegList[] = { ARM::R0, ARM::R2 };
64 static const MCPhysReg LoRegList[] = { ARM::R1, ARM::R3 };
65 static const MCPhysReg ShadowRegList[] = { ARM::R0, ARM::R1 };
73 assert((!
Reg ||
Reg == ARM::R3) &&
"Wrong GPRs usage for f64");
81 ValNo, ValVT, State.AllocateStack(8,
Align(8)), LocVT, LocInfo));
86 for (i = 0; i < 2; ++i)
87 if (HiRegList[i] ==
Reg)
92 assert(
T == LoRegList[i] &&
"Could not allocate register");
106 if (LocVT == MVT::v2f64 &&
114 static const MCPhysReg HiRegList[] = { ARM::R0, ARM::R2 };
115 static const MCPhysReg LoRegList[] = { ARM::R1, ARM::R3 };
122 for (i = 0; i < 2; ++i)
123 if (HiRegList[i] ==
Reg)
138 if (LocVT == MVT::v2f64 && !
f64RetAssign(ValNo, ValVT, LocVT, LocInfo, State))
154 ARM::S4, ARM::S5, ARM::S6, ARM::S7,
155 ARM::S8, ARM::S9, ARM::S10, ARM::S11,
156 ARM::S12, ARM::S13, ARM::S14, ARM::S15 };
158 ARM::D4, ARM::D5, ARM::D6, ARM::D7 };
175 if (PendingMembers.
size() > 0)
176 assert(PendingMembers[0].getLocVT() == LocVT);
193 assert(StackAlign &&
"data layout string is missing stack alignment");
194 const Align FirstMemberAlign(PendingMembers[0].getExtraInfo());
195 Align Alignment = std::min(FirstMemberAlign, *StackAlign);
201 unsigned RegIdx = State.getFirstUnallocated(RegList);
205 unsigned RegAlign =
alignTo(Alignment.value(), 4) / 4;
206 while (RegIdx % RegAlign != 0 && RegIdx < RegList.
size())
207 State.AllocateReg(RegList[RegIdx++]);
232 State.AllocateRegBlock(RegList, PendingMembers.
size());
233 if (!RegResult.
empty()) {
234 for (
const auto &[PendingMember,
Reg] :
zip(PendingMembers, RegResult)) {
235 PendingMember.convertToReg(
Reg);
236 State.addLoc(PendingMember);
238 PendingMembers.
clear();
244 if (LocVT == MVT::i32 && State.getStackSize() == 0) {
247 unsigned RegIdx = State.getFirstUnallocated(RegList);
248 for (
auto &It : PendingMembers) {
249 if (RegIdx >= RegList.
size())
252 It.convertToReg(State.AllocateReg(RegList[RegIdx++]));
256 PendingMembers.clear();
260 if (LocVT != MVT::i32)
264 for (
auto Reg : RegList)
265 State.AllocateReg(
Reg);
274 for (
auto &It : PendingMembers) {
275 It.convertToMem(State.AllocateStack(
Size, Alignment));
277 Alignment =
Align(1);
281 PendingMembers.
clear();
327 ValNo, ValVT, State.AllocateStack(4,
Align(4)), MVT::i32, LocInfo));
332#define GET_CALLING_CONV_IMPL
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
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
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.
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
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.