mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
AnalyzeCallOperands function for N32/64.
N32/64 places all variable arguments in integer registers (or on stack), regardless of their types, but follows calling convention of non-vaarg function when it handles fixed arguments. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144553 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bad53f41c2
commit
4961709688
@ -64,6 +64,25 @@ def CC_MipsN : CallingConv<[
|
||||
CCIfType<[f32], CCAssignToStack<4, 8>>
|
||||
]>;
|
||||
|
||||
// N32/64 variable arguments.
|
||||
// All arguments are passed in integer registers.
|
||||
def CC_MipsN_VarArg : CallingConv<[
|
||||
// Handles byval parameters.
|
||||
CCIfByVal<CCCustom<"CC_Mips64Byval">>,
|
||||
|
||||
// Promote i8/i16/i32 arguments to i64.
|
||||
CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
|
||||
|
||||
CCIfType<[i64, f64], CCAssignToReg<[A0_64, A1_64, A2_64, A3_64,
|
||||
T0_64, T1_64, T2_64, T3_64]>>,
|
||||
|
||||
CCIfType<[f32], CCAssignToReg<[A0, A1, A2, A3, T0, T1, T2, T3]>>,
|
||||
|
||||
// All stack parameter slots become 64-bit doublewords and are 8-byte aligned.
|
||||
CCIfType<[i64, f64], CCAssignToStack<8, 8>>,
|
||||
CCIfType<[f32], CCAssignToStack<4, 8>>
|
||||
]>;
|
||||
|
||||
def RetCC_MipsN : CallingConv<[
|
||||
// FIXME: Handle complex and float double return values.
|
||||
|
||||
|
@ -1918,6 +1918,30 @@ static bool CC_Mips64Byval(unsigned ValNo, MVT ValVT, MVT LocVT,
|
||||
|
||||
#include "MipsGenCallingConv.inc"
|
||||
|
||||
static void
|
||||
AnalyzeMips64CallOperands(CCState CCInfo,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs) {
|
||||
unsigned NumOps = Outs.size();
|
||||
for (unsigned i = 0; i != NumOps; ++i) {
|
||||
MVT ArgVT = Outs[i].VT;
|
||||
ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;
|
||||
bool R;
|
||||
|
||||
if (Outs[i].IsFixed)
|
||||
R = CC_MipsN(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, CCInfo);
|
||||
else
|
||||
R = CC_MipsN_VarArg(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, CCInfo);
|
||||
|
||||
#ifndef NDEBUG
|
||||
if (R) {
|
||||
dbgs() << "Call operand #" << i << " has unhandled type "
|
||||
<< EVT(ArgVT).getEVTString();
|
||||
#endif
|
||||
llvm_unreachable(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Call Calling Convention Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -2138,6 +2162,8 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
|
||||
|
||||
if (IsO32)
|
||||
CCInfo.AnalyzeCallOperands(Outs, CC_MipsO32);
|
||||
else if (HasMips64)
|
||||
AnalyzeMips64CallOperands(CCInfo, Outs);
|
||||
else
|
||||
CCInfo.AnalyzeCallOperands(Outs, CC_Mips);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user