mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 22:00:10 +00:00
Switch SPU calling convention (function arguments)
to a Tablegen implementation. llvm-svn: 107913
This commit is contained in:
parent
9870460c84
commit
d799ea52cd
@ -34,76 +34,19 @@ def RetCC_SPU : CallingConv<[
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// CellSPU Argument Calling Conventions
|
||||
// (note: this isn't used, but presumably should be at some point when other
|
||||
// targets do.)
|
||||
//===----------------------------------------------------------------------===//
|
||||
/*
|
||||
def CC_SPU : CallingConv<[
|
||||
CCIfType<[i8], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10, R11,
|
||||
R12, R13, R14, R15, R16, R17, R18, R19, R20,
|
||||
R21, R22, R23, R24, R25, R26, R27, R28, R29,
|
||||
R30, R31, R32, R33, R34, R35, R36, R37, R38,
|
||||
R39, R40, R41, R42, R43, R44, R45, R46, R47,
|
||||
R48, R49, R50, R51, R52, R53, R54, R55, R56,
|
||||
R57, R58, R59, R60, R61, R62, R63, R64, R65,
|
||||
R66, R67, R68, R69, R70, R71, R72, R73, R74,
|
||||
R75, R76, R77, R78, R79]>>,
|
||||
CCIfType<[i16], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10, R11,
|
||||
R12, R13, R14, R15, R16, R17, R18, R19, R20,
|
||||
R21, R22, R23, R24, R25, R26, R27, R28, R29,
|
||||
R30, R31, R32, R33, R34, R35, R36, R37, R38,
|
||||
R39, R40, R41, R42, R43, R44, R45, R46, R47,
|
||||
R48, R49, R50, R51, R52, R53, R54, R55, R56,
|
||||
R57, R58, R59, R60, R61, R62, R63, R64, R65,
|
||||
R66, R67, R68, R69, R70, R71, R72, R73, R74,
|
||||
R75, R76, R77, R78, R79]>>,
|
||||
CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10, R11,
|
||||
R12, R13, R14, R15, R16, R17, R18, R19, R20,
|
||||
R21, R22, R23, R24, R25, R26, R27, R28, R29,
|
||||
R30, R31, R32, R33, R34, R35, R36, R37, R38,
|
||||
R39, R40, R41, R42, R43, R44, R45, R46, R47,
|
||||
R48, R49, R50, R51, R52, R53, R54, R55, R56,
|
||||
R57, R58, R59, R60, R61, R62, R63, R64, R65,
|
||||
R66, R67, R68, R69, R70, R71, R72, R73, R74,
|
||||
R75, R76, R77, R78, R79]>>,
|
||||
CCIfType<[f32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10, R11,
|
||||
R12, R13, R14, R15, R16, R17, R18, R19, R20,
|
||||
R21, R22, R23, R24, R25, R26, R27, R28, R29,
|
||||
R30, R31, R32, R33, R34, R35, R36, R37, R38,
|
||||
R39, R40, R41, R42, R43, R44, R45, R46, R47,
|
||||
R48, R49, R50, R51, R52, R53, R54, R55, R56,
|
||||
R57, R58, R59, R60, R61, R62, R63, R64, R65,
|
||||
R66, R67, R68, R69, R70, R71, R72, R73, R74,
|
||||
R75, R76, R77, R78, R79]>>,
|
||||
CCIfType<[i64], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10, R11,
|
||||
R12, R13, R14, R15, R16, R17, R18, R19, R20,
|
||||
R21, R22, R23, R24, R25, R26, R27, R28, R29,
|
||||
R30, R31, R32, R33, R34, R35, R36, R37, R38,
|
||||
R39, R40, R41, R42, R43, R44, R45, R46, R47,
|
||||
R48, R49, R50, R51, R52, R53, R54, R55, R56,
|
||||
R57, R58, R59, R60, R61, R62, R63, R64, R65,
|
||||
R66, R67, R68, R69, R70, R71, R72, R73, R74,
|
||||
R75, R76, R77, R78, R79]>>,
|
||||
CCIfType<[f64], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10, R11,
|
||||
R12, R13, R14, R15, R16, R17, R18, R19, R20,
|
||||
R21, R22, R23, R24, R25, R26, R27, R28, R29,
|
||||
R30, R31, R32, R33, R34, R35, R36, R37, R38,
|
||||
R39, R40, R41, R42, R43, R44, R45, R46, R47,
|
||||
R48, R49, R50, R51, R52, R53, R54, R55, R56,
|
||||
R57, R58, R59, R60, R61, R62, R63, R64, R65,
|
||||
R66, R67, R68, R69, R70, R71, R72, R73, R74,
|
||||
R75, R76, R77, R78, R79]>>,
|
||||
CCIfType<[v16i8, v8i16, v4i32, v4f32, v2i64, v2f64],
|
||||
CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10, R11,
|
||||
R12, R13, R14, R15, R16, R17, R18, R19, R20,
|
||||
R21, R22, R23, R24, R25, R26, R27, R28, R29,
|
||||
R30, R31, R32, R33, R34, R35, R36, R37, R38,
|
||||
R39, R40, R41, R42, R43, R44, R45, R46, R47,
|
||||
R48, R49, R50, R51, R52, R53, R54, R55, R56,
|
||||
R57, R58, R59, R60, R61, R62, R63, R64, R65,
|
||||
R66, R67, R68, R69, R70, R71, R72, R73, R74,
|
||||
R75, R76, R77, R78, R79]>>,
|
||||
|
||||
def CCC_SPU : CallingConv<[
|
||||
CCIfType<[i8, i16, i32, i64, i128, f32, f64,
|
||||
v16i8, v8i16, v4i32, v4f32, v2i64, v2f64],
|
||||
CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10, R11,
|
||||
R12, R13, R14, R15, R16, R17, R18, R19, R20,
|
||||
R21, R22, R23, R24, R25, R26, R27, R28, R29,
|
||||
R30, R31, R32, R33, R34, R35, R36, R37, R38,
|
||||
R39, R40, R41, R42, R43, R44, R45, R46, R47,
|
||||
R48, R49, R50, R51, R52, R53, R54, R55, R56,
|
||||
R57, R58, R59, R60, R61, R62, R63, R64, R65,
|
||||
R66, R67, R68, R69, R70, R71, R72, R73, R74,
|
||||
R75, R76, R77, R78, R79]>>,
|
||||
// Integer/FP values get stored in stack slots that are 8 bytes in size and
|
||||
// 8-byte aligned if there are no more registers to hold them.
|
||||
CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>,
|
||||
@ -112,4 +55,3 @@ def CC_SPU : CallingConv<[
|
||||
CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
|
||||
CCAssignToStack<16, 16>>
|
||||
]>;
|
||||
*/
|
||||
|
@ -1014,22 +1014,26 @@ SPUTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
MachineRegisterInfo &RegInfo = MF.getRegInfo();
|
||||
SPUFunctionInfo *FuncInfo = MF.getInfo<SPUFunctionInfo>();
|
||||
|
||||
const unsigned *ArgRegs = SPURegisterInfo::getArgRegs();
|
||||
const unsigned NumArgRegs = SPURegisterInfo::getNumArgRegs();
|
||||
|
||||
unsigned ArgOffset = SPUFrameInfo::minStackSize();
|
||||
unsigned ArgRegIdx = 0;
|
||||
unsigned StackSlotSize = SPUFrameInfo::stackSlotSize();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
|
||||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
CCState CCInfo(CallConv, isVarArg, getTargetMachine(), ArgLocs,
|
||||
*DAG.getContext());
|
||||
// FIXME: allow for other calling conventions
|
||||
CCInfo.AnalyzeFormalArguments(Ins, CCC_SPU);
|
||||
|
||||
// Add DAG nodes to load the arguments or copy them out of registers.
|
||||
for (unsigned ArgNo = 0, e = Ins.size(); ArgNo != e; ++ArgNo) {
|
||||
EVT ObjectVT = Ins[ArgNo].VT;
|
||||
unsigned ObjSize = ObjectVT.getSizeInBits()/8;
|
||||
SDValue ArgVal;
|
||||
CCValAssign &VA = ArgLocs[ArgNo];
|
||||
|
||||
if (ArgRegIdx < NumArgRegs) {
|
||||
if (VA.isRegLoc()) {
|
||||
const TargetRegisterClass *ArgRegClass;
|
||||
|
||||
switch (ObjectVT.getSimpleVT().SimpleTy) {
|
||||
@ -1068,7 +1072,7 @@ SPUTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
}
|
||||
|
||||
unsigned VReg = RegInfo.createVirtualRegister(ArgRegClass);
|
||||
RegInfo.addLiveIn(ArgRegs[ArgRegIdx], VReg);
|
||||
RegInfo.addLiveIn(VA.getLocReg(), VReg);
|
||||
ArgVal = DAG.getCopyFromReg(Chain, dl, VReg, ObjectVT);
|
||||
++ArgRegIdx;
|
||||
} else {
|
||||
@ -1088,12 +1092,28 @@ SPUTargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
|
||||
// vararg handling:
|
||||
if (isVarArg) {
|
||||
// unsigned int ptr_size = PtrVT.getSizeInBits() / 8;
|
||||
// FIXME: we should be able to query the argument registers from
|
||||
// tablegen generated code.
|
||||
static const unsigned ArgRegs[] = {
|
||||
SPU::R3, SPU::R4, SPU::R5, SPU::R6, SPU::R7, SPU::R8, SPU::R9,
|
||||
SPU::R10, SPU::R11, SPU::R12, SPU::R13, SPU::R14, SPU::R15, SPU::R16,
|
||||
SPU::R17, SPU::R18, SPU::R19, SPU::R20, SPU::R21, SPU::R22, SPU::R23,
|
||||
SPU::R24, SPU::R25, SPU::R26, SPU::R27, SPU::R28, SPU::R29, SPU::R30,
|
||||
SPU::R31, SPU::R32, SPU::R33, SPU::R34, SPU::R35, SPU::R36, SPU::R37,
|
||||
SPU::R38, SPU::R39, SPU::R40, SPU::R41, SPU::R42, SPU::R43, SPU::R44,
|
||||
SPU::R45, SPU::R46, SPU::R47, SPU::R48, SPU::R49, SPU::R50, SPU::R51,
|
||||
SPU::R52, SPU::R53, SPU::R54, SPU::R55, SPU::R56, SPU::R57, SPU::R58,
|
||||
SPU::R59, SPU::R60, SPU::R61, SPU::R62, SPU::R63, SPU::R64, SPU::R65,
|
||||
SPU::R66, SPU::R67, SPU::R68, SPU::R69, SPU::R70, SPU::R71, SPU::R72,
|
||||
SPU::R73, SPU::R74, SPU::R75, SPU::R76, SPU::R77, SPU::R78, SPU::R79
|
||||
};
|
||||
// size of ArgRegs array
|
||||
unsigned NumArgRegs = 77;
|
||||
|
||||
// We will spill (79-3)+1 registers to the stack
|
||||
SmallVector<SDValue, 79-3+1> MemOps;
|
||||
|
||||
// Create the frame slot
|
||||
|
||||
for (; ArgRegIdx != NumArgRegs; ++ArgRegIdx) {
|
||||
FuncInfo->setVarArgsFrameIndex(
|
||||
MFI->CreateFixedObject(StackSlotSize, ArgOffset, true));
|
||||
@ -1145,8 +1165,15 @@ SPUTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
const SPUSubtarget *ST = SPUTM.getSubtargetImpl();
|
||||
unsigned NumOps = Outs.size();
|
||||
unsigned StackSlotSize = SPUFrameInfo::stackSlotSize();
|
||||
const unsigned *ArgRegs = SPURegisterInfo::getArgRegs();
|
||||
const unsigned NumArgRegs = SPURegisterInfo::getNumArgRegs();
|
||||
|
||||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
CCState CCInfo(CallConv, isVarArg, getTargetMachine(), ArgLocs,
|
||||
*DAG.getContext());
|
||||
// FIXME: allow for other calling conventions
|
||||
CCInfo.AnalyzeCallOperands(Outs, CCC_SPU);
|
||||
|
||||
const unsigned NumArgRegs = ArgLocs.size();
|
||||
|
||||
|
||||
// Handy pointer type
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
@ -1166,8 +1193,9 @@ SPUTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
// And the arguments passed on the stack
|
||||
SmallVector<SDValue, 8> MemOpChains;
|
||||
|
||||
for (unsigned i = 0; i != NumOps; ++i) {
|
||||
SDValue Arg = OutVals[i];
|
||||
for (; ArgRegIdx != NumOps; ++ArgRegIdx) {
|
||||
SDValue Arg = OutVals[ArgRegIdx];
|
||||
CCValAssign &VA = ArgLocs[ArgRegIdx];
|
||||
|
||||
// PtrOff will be used to store the current argument to the stack if a
|
||||
// register cannot be found for it.
|
||||
@ -1190,7 +1218,7 @@ SPUTargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
case MVT::v8i16:
|
||||
case MVT::v16i8:
|
||||
if (ArgRegIdx != NumArgRegs) {
|
||||
RegsToPass.push_back(std::make_pair(ArgRegs[ArgRegIdx++], Arg));
|
||||
RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
|
||||
} else {
|
||||
MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff, NULL, 0,
|
||||
false, false, 0));
|
||||
|
@ -191,33 +191,6 @@ SPURegisterInfo::SPURegisterInfo(const SPUSubtarget &subtarget,
|
||||
{
|
||||
}
|
||||
|
||||
// SPU's 128-bit registers used for argument passing:
|
||||
static const unsigned SPU_ArgRegs[] = {
|
||||
SPU::R3, SPU::R4, SPU::R5, SPU::R6, SPU::R7, SPU::R8, SPU::R9,
|
||||
SPU::R10, SPU::R11, SPU::R12, SPU::R13, SPU::R14, SPU::R15, SPU::R16,
|
||||
SPU::R17, SPU::R18, SPU::R19, SPU::R20, SPU::R21, SPU::R22, SPU::R23,
|
||||
SPU::R24, SPU::R25, SPU::R26, SPU::R27, SPU::R28, SPU::R29, SPU::R30,
|
||||
SPU::R31, SPU::R32, SPU::R33, SPU::R34, SPU::R35, SPU::R36, SPU::R37,
|
||||
SPU::R38, SPU::R39, SPU::R40, SPU::R41, SPU::R42, SPU::R43, SPU::R44,
|
||||
SPU::R45, SPU::R46, SPU::R47, SPU::R48, SPU::R49, SPU::R50, SPU::R51,
|
||||
SPU::R52, SPU::R53, SPU::R54, SPU::R55, SPU::R56, SPU::R57, SPU::R58,
|
||||
SPU::R59, SPU::R60, SPU::R61, SPU::R62, SPU::R63, SPU::R64, SPU::R65,
|
||||
SPU::R66, SPU::R67, SPU::R68, SPU::R69, SPU::R70, SPU::R71, SPU::R72,
|
||||
SPU::R73, SPU::R74, SPU::R75, SPU::R76, SPU::R77, SPU::R78, SPU::R79
|
||||
};
|
||||
|
||||
const unsigned *
|
||||
SPURegisterInfo::getArgRegs()
|
||||
{
|
||||
return SPU_ArgRegs;
|
||||
}
|
||||
|
||||
unsigned
|
||||
SPURegisterInfo::getNumArgRegs()
|
||||
{
|
||||
return sizeof(SPU_ArgRegs) / sizeof(SPU_ArgRegs[0]);
|
||||
}
|
||||
|
||||
/// getPointerRegClass - Return the register class to use to hold pointers.
|
||||
/// This is used for addressing modes.
|
||||
const TargetRegisterClass *
|
||||
|
@ -86,15 +86,6 @@ namespace llvm {
|
||||
// New methods added:
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
//! Return the array of argument passing registers
|
||||
/*!
|
||||
\note The size of this array is returned by getArgRegsSize().
|
||||
*/
|
||||
static const unsigned *getArgRegs();
|
||||
|
||||
//! Return the size of the argument passing register array
|
||||
static unsigned getNumArgRegs();
|
||||
|
||||
//! Get DWARF debugging register number
|
||||
int getDwarfRegNum(unsigned RegNum, bool isEH) const;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user