16 #ifndef LLVM_Hexagon_CODEGEN_CALLINGCONVLOWER_H
17 #define LLVM_Hexagon_CODEGEN_CALLINGCONVLOWER_H
28 class TargetRegisterInfo;
30 class Hexagon_CCState;
74 return UsedRegs[Reg/32] & (1 << (Reg&31));
91 unsigned SretValueSize);
111 for (
unsigned i = 0; i != NumRegs; ++i)
130 MarkAllocated(ShadowReg);
139 if (FirstUnalloc == NumRegs)
143 unsigned Reg = Regs[FirstUnalloc];
149 unsigned AllocateReg(
const unsigned *Regs,
const unsigned *ShadowRegs,
152 if (FirstUnalloc == NumRegs)
156 unsigned Reg = Regs[FirstUnalloc], ShadowReg = ShadowRegs[FirstUnalloc];
158 MarkAllocated(ShadowReg);
165 assert(Align && ((Align-1) & Align) == 0);
166 StackOffset = ((StackOffset + Align-1) & ~(Align-1));
167 unsigned Result = StackOffset;
181 void MarkAllocated(
unsigned Reg);
void AnalyzeFormalArguments(const SmallVectorImpl< ISD::InputArg > &Ins, Hexagon_CCAssignFn Fn, unsigned SretValueInRegs)
bool Hexagon_CCAssignFn(unsigned ValNo, EVT ValVT, EVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Hexagon_CCState &State, int NonVarArgsParams, int CurrentParam, bool ForceMem)
void addLoc(const CCValAssign &V)
void AnalyzeReturn(const SmallVectorImpl< ISD::OutputArg > &Outs, Hexagon_CCAssignFn Fn, unsigned SretValueInRegs)
void AnalyzeCallResult(const SmallVectorImpl< ISD::InputArg > &Ins, Hexagon_CCAssignFn Fn, unsigned SretValueInRegs)
ID
LLVM Calling Convention Representation.
unsigned AllocateStack(unsigned Size, unsigned Align)
void HandleByVal(unsigned ValNo, EVT ValVT, EVT LocVT, CCValAssign::LocInfo LocInfo, int MinSize, int MinAlign, ISD::ArgFlagsTy ArgFlags)
Hexagon_CCState(CallingConv::ID CC, bool isVarArg, const TargetMachine &TM, SmallVectorImpl< CCValAssign > &locs, LLVMContext &c)
LLVMContext & getContext() const
const TargetMachine & getTarget() const
unsigned AllocateReg(unsigned Reg)
unsigned AllocateReg(const unsigned *Regs, unsigned NumRegs)
unsigned getNextStackOffset() const
CCValAssign - Represent assignment of one arg/retval to a location.
unsigned getFirstUnallocated(const unsigned *Regs, unsigned NumRegs) const
static cl::opt< AlignMode > Align(cl::desc("Load/store alignment support"), cl::Hidden, cl::init(DefaultAlign), cl::values(clEnumValN(DefaultAlign,"arm-default-align","Generate unaligned accesses only on hardware/OS ""combinations that are known to support them"), clEnumValN(StrictAlign,"arm-strict-align","Disallow all unaligned memory accesses"), clEnumValN(NoStrictAlign,"arm-no-strict-align","Allow unaligned memory accesses"), clEnumValEnd))
uint64_t MinAlign(uint64_t A, uint64_t B)
void AnalyzeCallOperands(const SmallVectorImpl< ISD::OutputArg > &Outs, Hexagon_CCAssignFn Fn, int NonVarArgsParams, unsigned SretValueSize)
unsigned AllocateReg(const unsigned *Regs, const unsigned *ShadowRegs, unsigned NumRegs)
Version of AllocateReg with list of registers to be shadowed.
unsigned getCallingConv() const
unsigned AllocateReg(unsigned Reg, unsigned ShadowReg)
Version of AllocateReg with extra register to be shadowed.
bool isAllocated(unsigned Reg) const