mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
Factorize the duplicated logic for choosing the right argument
calling convention out of the fast and normal ISel files, and into the calling convention TD file. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117856 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e26032d5b2
commit
4590766580
@ -379,3 +379,35 @@ def CC_X86_32_GHC : CallingConv<[
|
||||
// Pass in STG registers: Base, Sp, Hp, R1
|
||||
CCIfType<[i32], CCAssignToReg<[EBX, EBP, EDI, ESI]>>
|
||||
]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// X86 Root Argument Calling Conventions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// This is the root argument convention for the X86-32 backend.
|
||||
def CC_X86_32 : CallingConv<[
|
||||
CCIfCC<"CallingConv::X86_FastCall", CCDelegateTo<CC_X86_32_FastCall>>,
|
||||
CCIfCC<"CallingConv::X86_ThisCall", CCDelegateTo<CC_X86_32_ThisCall>>,
|
||||
CCIfCC<"CallingConv::Fast", CCDelegateTo<CC_X86_32_FastCC>>,
|
||||
CCIfCC<"CallingConv::GHC", CCDelegateTo<CC_X86_32_GHC>>,
|
||||
|
||||
// Otherwise, drop to normal X86-32 CC
|
||||
CCDelegateTo<CC_X86_32_C>
|
||||
]>;
|
||||
|
||||
// This is the root argument convention for the X86-64 backend.
|
||||
def CC_X86_64 : CallingConv<[
|
||||
CCIfCC<"CallingConv::GHC", CCDelegateTo<CC_X86_64_GHC>>,
|
||||
|
||||
// Mingw64 and native Win64 use Win64 CC
|
||||
CCIfSubtarget<"isTargetWin64()", CCDelegateTo<CC_X86_Win64_C>>,
|
||||
|
||||
// Otherwise, drop to normal X86-64 CC
|
||||
CCDelegateTo<CC_X86_64_C>
|
||||
]>;
|
||||
|
||||
// This is the argument convention used for the entire X86 backend.
|
||||
def CC_X86 : CallingConv<[
|
||||
CCIfSubtarget<"is64Bit()", CCDelegateTo<CC_X86_64>>,
|
||||
CCDelegateTo<CC_X86_32>
|
||||
]>;
|
||||
|
@ -114,8 +114,6 @@ private:
|
||||
bool X86VisitIntrinsicCall(const IntrinsicInst &I);
|
||||
bool X86SelectCall(const Instruction *I);
|
||||
|
||||
CCAssignFn *CCAssignFnForCall(CallingConv::ID CC, bool isTailCall = false);
|
||||
|
||||
const X86InstrInfo *getInstrInfo() const {
|
||||
return getTargetMachine()->getInstrInfo();
|
||||
}
|
||||
@ -163,31 +161,6 @@ bool X86FastISel::isTypeLegal(const Type *Ty, EVT &VT, bool AllowI1) {
|
||||
|
||||
#include "X86GenCallingConv.inc"
|
||||
|
||||
/// CCAssignFnForCall - Selects the correct CCAssignFn for a given calling
|
||||
/// convention.
|
||||
CCAssignFn *X86FastISel::CCAssignFnForCall(CallingConv::ID CC,
|
||||
bool isTaillCall) {
|
||||
if (Subtarget->is64Bit()) {
|
||||
if (CC == CallingConv::GHC)
|
||||
return CC_X86_64_GHC;
|
||||
else if (Subtarget->isTargetWin64())
|
||||
return CC_X86_Win64_C;
|
||||
else
|
||||
return CC_X86_64_C;
|
||||
}
|
||||
|
||||
if (CC == CallingConv::X86_FastCall)
|
||||
return CC_X86_32_FastCall;
|
||||
else if (CC == CallingConv::X86_ThisCall)
|
||||
return CC_X86_32_ThisCall;
|
||||
else if (CC == CallingConv::Fast)
|
||||
return CC_X86_32_FastCC;
|
||||
else if (CC == CallingConv::GHC)
|
||||
return CC_X86_32_GHC;
|
||||
else
|
||||
return CC_X86_32_C;
|
||||
}
|
||||
|
||||
/// X86FastEmitLoad - Emit a machine instruction to load a value of type VT.
|
||||
/// The address is either pre-computed, i.e. Ptr, or a GlobalAddress, i.e. GV.
|
||||
/// Return true and the result register by reference if it is possible.
|
||||
@ -1548,7 +1521,7 @@ bool X86FastISel::X86SelectCall(const Instruction *I) {
|
||||
CCInfo.AllocateStack(32, 8);
|
||||
}
|
||||
|
||||
CCInfo.AnalyzeCallOperands(ArgVTs, ArgFlags, CCAssignFnForCall(CC));
|
||||
CCInfo.AnalyzeCallOperands(ArgVTs, ArgFlags, CC_X86);
|
||||
|
||||
// Get a count of how many bytes are to be pushed on the stack.
|
||||
unsigned NumBytes = CCInfo.getNextStackOffset();
|
||||
|
@ -1457,30 +1457,6 @@ ArgsAreStructReturn(const SmallVectorImpl<ISD::InputArg> &Ins) {
|
||||
return Ins[0].Flags.isSRet();
|
||||
}
|
||||
|
||||
/// CCAssignFnForNode - Selects the correct CCAssignFn for a the
|
||||
/// given CallingConvention value.
|
||||
CCAssignFn *X86TargetLowering::CCAssignFnForNode(CallingConv::ID CC) const {
|
||||
if (Subtarget->is64Bit()) {
|
||||
if (CC == CallingConv::GHC)
|
||||
return CC_X86_64_GHC;
|
||||
else if (Subtarget->isTargetWin64())
|
||||
return CC_X86_Win64_C;
|
||||
else
|
||||
return CC_X86_64_C;
|
||||
}
|
||||
|
||||
if (CC == CallingConv::X86_FastCall)
|
||||
return CC_X86_32_FastCall;
|
||||
else if (CC == CallingConv::X86_ThisCall)
|
||||
return CC_X86_32_ThisCall;
|
||||
else if (CC == CallingConv::Fast)
|
||||
return CC_X86_32_FastCC;
|
||||
else if (CC == CallingConv::GHC)
|
||||
return CC_X86_32_GHC;
|
||||
else
|
||||
return CC_X86_32_C;
|
||||
}
|
||||
|
||||
/// CreateCopyOfByValArgument - Make a copy of an aggregate at address specified
|
||||
/// by "Src" to address "Dst" with size and alignment information specified by
|
||||
/// the specific parameter attribute. The copy will be passed as a byval
|
||||
@ -1576,7 +1552,7 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
|
||||
ArgLocs, *DAG.getContext());
|
||||
CCInfo.AnalyzeFormalArguments(Ins, CCAssignFnForNode(CallConv));
|
||||
CCInfo.AnalyzeFormalArguments(Ins, CC_X86);
|
||||
|
||||
unsigned LastVal = ~0U;
|
||||
SDValue ArgValue;
|
||||
@ -1895,7 +1871,7 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
|
||||
ArgLocs, *DAG.getContext());
|
||||
CCInfo.AnalyzeCallOperands(Outs, CCAssignFnForNode(CallConv));
|
||||
CCInfo.AnalyzeCallOperands(Outs, CC_X86);
|
||||
|
||||
// Get a count of how many bytes are to be pushed on the stack.
|
||||
unsigned NumBytes = CCInfo.getNextStackOffset();
|
||||
@ -2478,7 +2454,7 @@ X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
||||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
CCState CCInfo(CalleeCC, isVarArg, getTargetMachine(),
|
||||
ArgLocs, *DAG.getContext());
|
||||
CCInfo.AnalyzeCallOperands(Outs, CCAssignFnForNode(CalleeCC));
|
||||
CCInfo.AnalyzeCallOperands(Outs, CC_X86);
|
||||
if (CCInfo.getNextStackOffset()) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
if (MF.getInfo<X86MachineFunctionInfo>()->getBytesToPopOnReturn())
|
||||
|
@ -717,7 +717,6 @@ namespace llvm {
|
||||
SDValue Chain, bool IsTailCall, bool Is64Bit,
|
||||
int FPDiff, DebugLoc dl) const;
|
||||
|
||||
CCAssignFn *CCAssignFnForNode(CallingConv::ID CallConv) const;
|
||||
unsigned GetAlignedArgumentStackSize(unsigned StackSize,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user