Skip to content

Commit

Permalink
[mips] Move SpecialCallingConv to MipsCCState and use it from tablege…
Browse files Browse the repository at this point in the history
…n-erated code. NFC

Summary:
In the long run, it should probably become a calling convention in its own
right but for now just move it out of
MipsISelLowering::analyzeCallOperands() so that we can drop this function
in favour of CCState::AnalyzeCallOperands().

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D6085

llvm-svn: 221517
  • Loading branch information
dsandersllvm committed Nov 7, 2014
1 parent f3096a1 commit 41a64c4
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 46 deletions.
22 changes: 13 additions & 9 deletions llvm/lib/Target/Mips/MipsCallingConv.td
Expand Up @@ -295,7 +295,20 @@ def CC_Mips_ByVal : CallingConv<[
CCIfByVal<CCPassByVal<8, 8>>
]>;

def CC_Mips16RetHelper : CallingConv<[
CCIfByVal<CCDelegateTo<CC_Mips_ByVal>>,

// Integer arguments are passed in integer registers.
CCIfType<[i32], CCAssignToReg<[V0, V1, A0, A1]>>
]>;

def CC_Mips_FixedArg : CallingConv<[
// Mips16 needs special handling on some functions.
CCIf<"State.getCallingConv() != CallingConv::Fast",
CCIf<"static_cast<MipsCCState *>(&State)->getSpecialCallingConv() == "
"MipsCCState::Mips16RetHelperConv",
CCDelegateTo<CC_Mips16RetHelper>>>,

CCIfByVal<CCDelegateTo<CC_Mips_ByVal>>,

// f128 needs to be handled similarly to f32 and f64 on hard-float. However,
Expand Down Expand Up @@ -330,15 +343,6 @@ def CC_Mips_VarArg : CallingConv<[
CCDelegateTo<CC_MipsN_VarArg>
]>;

//==

def CC_Mips16RetHelper : CallingConv<[
CCIfByVal<CCDelegateTo<CC_Mips_ByVal>>,

// Integer arguments are passed in integer registers.
CCIfType<[i32], CCAssignToReg<[V0, V1, A0, A1]>>
]>;

//===----------------------------------------------------------------------===//
// Callee-saved register lists.
//===----------------------------------------------------------------------===//
Expand Down
65 changes: 35 additions & 30 deletions llvm/lib/Target/Mips/MipsISelLowering.cpp
Expand Up @@ -75,6 +75,27 @@ static bool originalTypeIsF128(const Type *Ty, const SDNode *CallNode);

namespace {
class MipsCCState : public CCState {
public:
enum SpecialCallingConvType { Mips16RetHelperConv, NoSpecialCallingConv };

/// Determine the SpecialCallingConvType for the given callee
static SpecialCallingConvType
getSpecialCallingConvForCallee(const SDNode *Callee,
const MipsSubtarget &Subtarget) {
SpecialCallingConvType SpecialCallingConv = NoSpecialCallingConv;
if (Subtarget.inMips16HardFloat()) {
if (const GlobalAddressSDNode *G =
dyn_cast<const GlobalAddressSDNode>(Callee)) {
llvm::StringRef Sym = G->getGlobal()->getName();
Function *F = G->getGlobal()->getParent()->getFunction(Sym);
if (F && F->hasFnAttribute("__Mips16RetHelper")) {
SpecialCallingConv = Mips16RetHelperConv;
}
}
}
return SpecialCallingConv;
}

private:
/// Identify lowered values that originated from f128 arguments and record
/// this for use by RetCC_MipsN.
Expand Down Expand Up @@ -131,6 +152,10 @@ class MipsCCState : public CCState {
/// Records whether the value has been lowered from an f128.
SmallVector<bool, 4> OriginalArgWasF128;

// Used to handle MIPS16-specific calling convention tweaks.
// FIXME: This should probably be a fully fledged calling convention.
SpecialCallingConvType SpecialCallingConv;

public:
// FIXME: Remove this from a public inteface ASAP. It's a temporary trap door
// to allow analyzeCallOperands to be removed incrementally.
Expand All @@ -144,8 +169,9 @@ class MipsCCState : public CCState {
void ClearOriginalArgWasF128() { OriginalArgWasF128.clear(); }

MipsCCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF,
SmallVectorImpl<CCValAssign> &locs, LLVMContext &C)
: CCState(CC, isVarArg, MF, locs, C) {}
SmallVectorImpl<CCValAssign> &locs, LLVMContext &C,
SpecialCallingConvType SpecialCC = NoSpecialCallingConv)
: CCState(CC, isVarArg, MF, locs, C), SpecialCallingConv(SpecialCC) {}

void AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins,
CCAssignFn Fn) {
Expand Down Expand Up @@ -178,6 +204,7 @@ class MipsCCState : public CCState {
}

bool WasOriginalArgF128(unsigned ValNo) { return OriginalArgWasF128[ValNo]; }
SpecialCallingConvType getSpecialCallingConv() { return SpecialCallingConv; }
};
}

Expand Down Expand Up @@ -2588,12 +2615,13 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,

// Analyze operands of the call, assigning locations to each operand.
SmallVector<CCValAssign, 16> ArgLocs;
MipsCCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), ArgLocs,
*DAG.getContext());
MipsCCState CCInfo(
CallConv, IsVarArg, DAG.getMachineFunction(), ArgLocs, *DAG.getContext(),
MipsCCState::getSpecialCallingConvForCallee(Callee.getNode(), Subtarget));
MipsCC MipsCCInfo(CallConv, Subtarget, CCInfo);

CCInfo.PreAnalyzeCallOperandsForF128_(Outs, CLI.getArgs(), Callee.getNode());
MipsCCInfo.analyzeCallOperands(Outs, Callee.getNode(), CLI.getArgs(), CCInfo);
MipsCCInfo.analyzeCallOperands(Outs, CLI.getArgs(), CCInfo);
CCInfo.ClearOriginalArgWasF128();

// Get a count of how many bytes are to be pushed on the stack.
Expand Down Expand Up @@ -3572,23 +3600,6 @@ static bool originalTypeIsF128(const Type *Ty, const SDNode *CallNode) {
return (ES && Ty->isIntegerTy(128) && isF128SoftLibCall(ES->getSymbol()));
}

MipsTargetLowering::MipsCC::SpecialCallingConvType
MipsTargetLowering::MipsCC::getSpecialCallingConv(const SDNode *Callee) const {
MipsCC::SpecialCallingConvType SpecialCallingConv =
MipsCC::NoSpecialCallingConv;
if (Subtarget.inMips16HardFloat()) {
if (const GlobalAddressSDNode *G =
dyn_cast<const GlobalAddressSDNode>(Callee)) {
llvm::StringRef Sym = G->getGlobal()->getName();
Function *F = G->getGlobal()->getParent()->getFunction(Sym);
if (F && F->hasFnAttribute("__Mips16RetHelper")) {
SpecialCallingConv = MipsCC::Mips16RetHelperConv;
}
}
}
return SpecialCallingConv;
}

MipsTargetLowering::MipsCC::MipsCC(CallingConv::ID CC,
const MipsSubtarget &Subtarget_,
CCState &Info)
Expand All @@ -3598,18 +3609,12 @@ MipsTargetLowering::MipsCC::MipsCC(CallingConv::ID CC,
}

void MipsTargetLowering::MipsCC::analyzeCallOperands(
const SmallVectorImpl<ISD::OutputArg> &Args, const SDNode *CallNode,
const SmallVectorImpl<ISD::OutputArg> &Args,
std::vector<ArgListEntry> &FuncArgs, CCState &State) {
MipsCC::SpecialCallingConvType SpecialCallingConv =
getSpecialCallingConv(CallNode);
assert((CallConv != CallingConv::Fast || !State.isVarArg()) &&
"CallingConv::Fast shouldn't be used for vararg functions.");

unsigned NumOpnds = Args.size();
llvm::CCAssignFn *FixedFn = CC_Mips_FixedArg;
if (CallConv != CallingConv::Fast &&
SpecialCallingConv == Mips16RetHelperConv)
FixedFn = CC_Mips16RetHelper;

for (unsigned I = 0; I != NumOpnds; ++I) {
MVT ArgVT = Args[I].VT;
Expand All @@ -3619,7 +3624,7 @@ void MipsTargetLowering::MipsCC::analyzeCallOperands(
if (State.isVarArg() && !Args[I].IsFixed)
R = CC_Mips_VarArg(I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, State);
else
R = FixedFn(I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, State);
R = CC_Mips_FixedArg(I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, State);

if (R) {
#ifndef NDEBUG
Expand Down
7 changes: 0 additions & 7 deletions llvm/lib/Target/Mips/MipsISelLowering.h
Expand Up @@ -360,15 +360,10 @@ namespace llvm {
/// arguments and inquire about calling convention information.
class MipsCC {
public:
enum SpecialCallingConvType {
Mips16RetHelperConv, NoSpecialCallingConv
};

MipsCC(CallingConv::ID CallConv, const MipsSubtarget &Subtarget,
CCState &Info);

void analyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
const SDNode *CallNode,
std::vector<ArgListEntry> &FuncArgs,
CCState &State);

Expand All @@ -387,8 +382,6 @@ namespace llvm {
MVT getRegVT(MVT VT, const Type *OrigTy, const SDNode *CallNode,
bool IsSoftFloat) const;

SpecialCallingConvType getSpecialCallingConv(const SDNode *Callee) const;

CallingConv::ID CallConv;
const MipsSubtarget &Subtarget;
};
Expand Down

0 comments on commit 41a64c4

Please sign in to comment.