mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-23 05:29:23 +00:00
[mips] Clean up class MipsCCInfo.
No functionality change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175310 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0deff9fbeb
commit
ffd28a44f0
@ -3007,9 +3007,9 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
|||||||
SmallVector<CCValAssign, 16> ArgLocs;
|
SmallVector<CCValAssign, 16> ArgLocs;
|
||||||
CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
|
CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
|
||||||
getTargetMachine(), ArgLocs, *DAG.getContext());
|
getTargetMachine(), ArgLocs, *DAG.getContext());
|
||||||
MipsCC MipsCCInfo(CallConv, isVarArg, IsO32, CCInfo);
|
MipsCC MipsCCInfo(CallConv, IsO32, CCInfo);
|
||||||
|
|
||||||
MipsCCInfo.analyzeCallOperands(Outs);
|
MipsCCInfo.analyzeCallOperands(Outs, isVarArg);
|
||||||
|
|
||||||
// Get a count of how many bytes are to be pushed on the stack.
|
// Get a count of how many bytes are to be pushed on the stack.
|
||||||
unsigned NextStackOffset = CCInfo.getNextStackOffset();
|
unsigned NextStackOffset = CCInfo.getNextStackOffset();
|
||||||
@ -3294,7 +3294,7 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||||||
SmallVector<CCValAssign, 16> ArgLocs;
|
SmallVector<CCValAssign, 16> ArgLocs;
|
||||||
CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
|
CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
|
||||||
getTargetMachine(), ArgLocs, *DAG.getContext());
|
getTargetMachine(), ArgLocs, *DAG.getContext());
|
||||||
MipsCC MipsCCInfo(CallConv, isVarArg, IsO32, CCInfo);
|
MipsCC MipsCCInfo(CallConv, IsO32, CCInfo);
|
||||||
|
|
||||||
MipsCCInfo.analyzeFormalArguments(Ins);
|
MipsCCInfo.analyzeFormalArguments(Ins);
|
||||||
MipsFI->setFormalArgInfo(CCInfo.getNextStackOffset(),
|
MipsFI->setFormalArgInfo(CCInfo.getNextStackOffset(),
|
||||||
@ -3776,40 +3776,21 @@ unsigned MipsTargetLowering::getJumpTableEncoding() const {
|
|||||||
return TargetLowering::getJumpTableEncoding();
|
return TargetLowering::getJumpTableEncoding();
|
||||||
}
|
}
|
||||||
|
|
||||||
MipsTargetLowering::MipsCC::MipsCC(CallingConv::ID CallConv, bool IsVarArg,
|
MipsTargetLowering::MipsCC::MipsCC(CallingConv::ID CC, bool IsO32_,
|
||||||
bool IsO32, CCState &Info) : CCInfo(Info) {
|
CCState &Info)
|
||||||
UseRegsForByval = true;
|
: CCInfo(Info), CallConv(CC), IsO32(IsO32_) {
|
||||||
|
|
||||||
if (IsO32) {
|
|
||||||
RegSize = 4;
|
|
||||||
NumIntArgRegs = array_lengthof(O32IntRegs);
|
|
||||||
ReservedArgArea = 16;
|
|
||||||
IntArgRegs = ShadowRegs = O32IntRegs;
|
|
||||||
FixedFn = VarFn = CC_MipsO32;
|
|
||||||
} else {
|
|
||||||
RegSize = 8;
|
|
||||||
NumIntArgRegs = array_lengthof(Mips64IntRegs);
|
|
||||||
ReservedArgArea = 0;
|
|
||||||
IntArgRegs = Mips64IntRegs;
|
|
||||||
ShadowRegs = Mips64DPRegs;
|
|
||||||
FixedFn = CC_MipsN;
|
|
||||||
VarFn = IsVarArg ? CC_MipsN_VarArg : CC_MipsN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CallConv == CallingConv::Fast) {
|
|
||||||
assert(!IsVarArg);
|
|
||||||
UseRegsForByval = false;
|
|
||||||
ReservedArgArea = 0;
|
|
||||||
FixedFn = VarFn = CC_Mips_FastCC;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pre-allocate reserved argument area.
|
// Pre-allocate reserved argument area.
|
||||||
CCInfo.AllocateStack(ReservedArgArea, 1);
|
CCInfo.AllocateStack(reservedArgArea(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MipsTargetLowering::MipsCC::
|
void MipsTargetLowering::MipsCC::
|
||||||
analyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Args) {
|
analyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Args,
|
||||||
|
bool IsVarArg) {
|
||||||
|
assert((CallConv != CallingConv::Fast || !IsVarArg) &&
|
||||||
|
"CallingConv::Fast shouldn't be used for vararg functions.");
|
||||||
|
|
||||||
unsigned NumOpnds = Args.size();
|
unsigned NumOpnds = Args.size();
|
||||||
|
llvm::CCAssignFn *FixedFn = fixedArgFn(), *VarFn = varArgFn();
|
||||||
|
|
||||||
for (unsigned I = 0; I != NumOpnds; ++I) {
|
for (unsigned I = 0; I != NumOpnds; ++I) {
|
||||||
MVT ArgVT = Args[I].VT;
|
MVT ArgVT = Args[I].VT;
|
||||||
@ -3821,10 +3802,10 @@ analyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Args) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Args[I].IsFixed)
|
if (IsVarArg && !Args[I].IsFixed)
|
||||||
R = FixedFn(I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, CCInfo);
|
|
||||||
else
|
|
||||||
R = VarFn(I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, CCInfo);
|
R = VarFn(I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, CCInfo);
|
||||||
|
else
|
||||||
|
R = FixedFn(I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, CCInfo);
|
||||||
|
|
||||||
if (R) {
|
if (R) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@ -3839,6 +3820,7 @@ analyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Args) {
|
|||||||
void MipsTargetLowering::MipsCC::
|
void MipsTargetLowering::MipsCC::
|
||||||
analyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Args) {
|
analyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Args) {
|
||||||
unsigned NumArgs = Args.size();
|
unsigned NumArgs = Args.size();
|
||||||
|
llvm::CCAssignFn *FixedFn = fixedArgFn();
|
||||||
|
|
||||||
for (unsigned I = 0; I != NumArgs; ++I) {
|
for (unsigned I = 0; I != NumArgs; ++I) {
|
||||||
MVT ArgVT = Args[I].VT;
|
MVT ArgVT = Args[I].VT;
|
||||||
@ -3868,11 +3850,12 @@ MipsTargetLowering::MipsCC::handleByValArg(unsigned ValNo, MVT ValVT,
|
|||||||
assert(ArgFlags.getByValSize() && "Byval argument's size shouldn't be 0.");
|
assert(ArgFlags.getByValSize() && "Byval argument's size shouldn't be 0.");
|
||||||
|
|
||||||
struct ByValArgInfo ByVal;
|
struct ByValArgInfo ByVal;
|
||||||
|
unsigned RegSize = regSize();
|
||||||
unsigned ByValSize = RoundUpToAlignment(ArgFlags.getByValSize(), RegSize);
|
unsigned ByValSize = RoundUpToAlignment(ArgFlags.getByValSize(), RegSize);
|
||||||
unsigned Align = std::min(std::max(ArgFlags.getByValAlign(), RegSize),
|
unsigned Align = std::min(std::max(ArgFlags.getByValAlign(), RegSize),
|
||||||
RegSize * 2);
|
RegSize * 2);
|
||||||
|
|
||||||
if (UseRegsForByval)
|
if (useRegsForByval())
|
||||||
allocateRegs(ByVal, ByValSize, Align);
|
allocateRegs(ByVal, ByValSize, Align);
|
||||||
|
|
||||||
// Allocate space on caller's stack.
|
// Allocate space on caller's stack.
|
||||||
@ -3883,9 +3866,38 @@ MipsTargetLowering::MipsCC::handleByValArg(unsigned ValNo, MVT ValVT,
|
|||||||
ByValArgs.push_back(ByVal);
|
ByValArgs.push_back(ByVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned MipsTargetLowering::MipsCC::numIntArgRegs() const {
|
||||||
|
return IsO32 ? array_lengthof(O32IntRegs) : array_lengthof(Mips64IntRegs);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned MipsTargetLowering::MipsCC::reservedArgArea() const {
|
||||||
|
return (IsO32 && (CallConv != CallingConv::Fast)) ? 16 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint16_t *MipsTargetLowering::MipsCC::intArgRegs() const {
|
||||||
|
return IsO32 ? O32IntRegs : Mips64IntRegs;
|
||||||
|
}
|
||||||
|
|
||||||
|
llvm::CCAssignFn *MipsTargetLowering::MipsCC::fixedArgFn() const {
|
||||||
|
if (CallConv == CallingConv::Fast)
|
||||||
|
return CC_Mips_FastCC;
|
||||||
|
|
||||||
|
return IsO32 ? CC_MipsO32 : CC_MipsN;
|
||||||
|
}
|
||||||
|
|
||||||
|
llvm::CCAssignFn *MipsTargetLowering::MipsCC::varArgFn() const {
|
||||||
|
return IsO32 ? CC_MipsO32 : CC_MipsN_VarArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint16_t *MipsTargetLowering::MipsCC::shadowRegs() const {
|
||||||
|
return IsO32 ? O32IntRegs : Mips64DPRegs;
|
||||||
|
}
|
||||||
|
|
||||||
void MipsTargetLowering::MipsCC::allocateRegs(ByValArgInfo &ByVal,
|
void MipsTargetLowering::MipsCC::allocateRegs(ByValArgInfo &ByVal,
|
||||||
unsigned ByValSize,
|
unsigned ByValSize,
|
||||||
unsigned Align) {
|
unsigned Align) {
|
||||||
|
unsigned RegSize = regSize(), NumIntArgRegs = numIntArgRegs();
|
||||||
|
const uint16_t *IntArgRegs = intArgRegs(), *ShadowRegs = shadowRegs();
|
||||||
assert(!(ByValSize % RegSize) && !(Align % RegSize) &&
|
assert(!(ByValSize % RegSize) && !(Align % RegSize) &&
|
||||||
"Byval argument's size and alignment should be a multiple of"
|
"Byval argument's size and alignment should be a multiple of"
|
||||||
"RegSize.");
|
"RegSize.");
|
||||||
|
@ -201,53 +201,57 @@ namespace llvm {
|
|||||||
/// arguments and inquire about calling convention information.
|
/// arguments and inquire about calling convention information.
|
||||||
class MipsCC {
|
class MipsCC {
|
||||||
public:
|
public:
|
||||||
MipsCC(CallingConv::ID CallConv, bool IsVarArg, bool IsO32,
|
MipsCC(CallingConv::ID CallConv, bool IsO32, CCState &Info);
|
||||||
CCState &Info);
|
|
||||||
|
|
||||||
void analyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs);
|
void analyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||||
|
bool IsVarArg);
|
||||||
void analyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins);
|
void analyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins);
|
||||||
void handleByValArg(unsigned ValNo, MVT ValVT, MVT LocVT,
|
|
||||||
CCValAssign::LocInfo LocInfo,
|
|
||||||
ISD::ArgFlagsTy ArgFlags);
|
|
||||||
|
|
||||||
const CCState &getCCInfo() const { return CCInfo; }
|
const CCState &getCCInfo() const { return CCInfo; }
|
||||||
|
|
||||||
/// hasByValArg - Returns true if function has byval arguments.
|
/// hasByValArg - Returns true if function has byval arguments.
|
||||||
bool hasByValArg() const { return !ByValArgs.empty(); }
|
bool hasByValArg() const { return !ByValArgs.empty(); }
|
||||||
|
|
||||||
/// useRegsForByval - Returns true if the calling convention allows the
|
|
||||||
/// use of registers to pass byval arguments.
|
|
||||||
bool useRegsForByval() const { return UseRegsForByval; }
|
|
||||||
|
|
||||||
/// regSize - Size (in number of bits) of integer registers.
|
/// regSize - Size (in number of bits) of integer registers.
|
||||||
unsigned regSize() const { return RegSize; }
|
unsigned regSize() const { return IsO32 ? 4 : 8; }
|
||||||
|
|
||||||
/// numIntArgRegs - Number of integer registers available for calls.
|
/// numIntArgRegs - Number of integer registers available for calls.
|
||||||
unsigned numIntArgRegs() const { return NumIntArgRegs; }
|
unsigned numIntArgRegs() const;
|
||||||
|
|
||||||
/// reservedArgArea - The size of the area the caller reserves for
|
/// reservedArgArea - The size of the area the caller reserves for
|
||||||
/// register arguments. This is 16-byte if ABI is O32.
|
/// register arguments. This is 16-byte if ABI is O32.
|
||||||
unsigned reservedArgArea() const { return ReservedArgArea; }
|
unsigned reservedArgArea() const;
|
||||||
|
|
||||||
/// intArgRegs - Pointer to array of integer registers.
|
/// Return pointer to array of integer argument registers.
|
||||||
const uint16_t *intArgRegs() const { return IntArgRegs; }
|
const uint16_t *intArgRegs() const;
|
||||||
|
|
||||||
typedef SmallVector<ByValArgInfo, 2>::const_iterator byval_iterator;
|
typedef SmallVector<ByValArgInfo, 2>::const_iterator byval_iterator;
|
||||||
byval_iterator byval_begin() const { return ByValArgs.begin(); }
|
byval_iterator byval_begin() const { return ByValArgs.begin(); }
|
||||||
byval_iterator byval_end() const { return ByValArgs.end(); }
|
byval_iterator byval_end() const { return ByValArgs.end(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void handleByValArg(unsigned ValNo, MVT ValVT, MVT LocVT,
|
||||||
|
CCValAssign::LocInfo LocInfo,
|
||||||
|
ISD::ArgFlagsTy ArgFlags);
|
||||||
|
|
||||||
|
/// useRegsForByval - Returns true if the calling convention allows the
|
||||||
|
/// use of registers to pass byval arguments.
|
||||||
|
bool useRegsForByval() const { return CallConv != CallingConv::Fast; }
|
||||||
|
|
||||||
|
/// Return the function that analyzes fixed argument list functions.
|
||||||
|
llvm::CCAssignFn *fixedArgFn() const;
|
||||||
|
|
||||||
|
/// Return the function that analyzes variable argument list functions.
|
||||||
|
llvm::CCAssignFn *varArgFn() const;
|
||||||
|
|
||||||
|
const uint16_t *shadowRegs() const;
|
||||||
|
|
||||||
void allocateRegs(ByValArgInfo &ByVal, unsigned ByValSize,
|
void allocateRegs(ByValArgInfo &ByVal, unsigned ByValSize,
|
||||||
unsigned Align);
|
unsigned Align);
|
||||||
|
|
||||||
CCState &CCInfo;
|
CCState &CCInfo;
|
||||||
bool UseRegsForByval;
|
CallingConv::ID CallConv;
|
||||||
unsigned RegSize;
|
bool IsO32;
|
||||||
unsigned NumIntArgRegs;
|
|
||||||
unsigned ReservedArgArea;
|
|
||||||
const uint16_t *IntArgRegs, *ShadowRegs;
|
|
||||||
SmallVector<ByValArgInfo, 2> ByValArgs;
|
SmallVector<ByValArgInfo, 2> ByValArgs;
|
||||||
llvm::CCAssignFn *FixedFn, *VarFn;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Subtarget Info
|
// Subtarget Info
|
||||||
|
Loading…
x
Reference in New Issue
Block a user