mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
5ffeb9384e
Patch adds support for passing vector arguments to variadic functions. Arguments which are fixed shadow GPRs and stack space even when they are passed in vector registers, while arguments passed through ellipses are passed in(properly aligned GPRs if available and on the stack once all GPR arguments registers are consumed. Differential Revision: https://reviews.llvm.org/D97485
74 lines
2.2 KiB
C++
74 lines
2.2 KiB
C++
//===---- PPCCCState.h - CCState with PowerPC specific extensions -----------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef PPCCCSTATE_H
|
|
#define PPCCCSTATE_H
|
|
|
|
#include "PPCISelLowering.h"
|
|
#include "llvm/ADT/BitVector.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/CodeGen/CallingConvLower.h"
|
|
|
|
namespace llvm {
|
|
|
|
class PPCCCState : public CCState {
|
|
public:
|
|
|
|
void
|
|
PreAnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs);
|
|
void
|
|
PreAnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins);
|
|
|
|
private:
|
|
|
|
// Records whether the value has been lowered from an ppcf128.
|
|
SmallVector<bool, 4> OriginalArgWasPPCF128;
|
|
|
|
public:
|
|
PPCCCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF,
|
|
SmallVectorImpl<CCValAssign> &locs, LLVMContext &C)
|
|
: CCState(CC, isVarArg, MF, locs, C) {}
|
|
|
|
bool WasOriginalArgPPCF128(unsigned ValNo) { return OriginalArgWasPPCF128[ValNo]; }
|
|
void clearWasPPCF128() { OriginalArgWasPPCF128.clear(); }
|
|
};
|
|
|
|
class AIXCCState : public CCState {
|
|
private:
|
|
BitVector IsFixed;
|
|
|
|
public:
|
|
AIXCCState(CallingConv::ID CC, bool IsVarArg, MachineFunction &MF,
|
|
SmallVectorImpl<CCValAssign> &Locs, LLVMContext &C)
|
|
: CCState(CC, IsVarArg, MF, Locs, C) {}
|
|
|
|
void AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins,
|
|
CCAssignFn Fn) {
|
|
// All formal arguments are fixed.
|
|
IsFixed.resize(Ins.size(), true);
|
|
CCState::AnalyzeFormalArguments(Ins, Fn);
|
|
}
|
|
|
|
void AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
|
|
CCAssignFn Fn) {
|
|
// Record whether the call operand was a fixed argument.
|
|
IsFixed.resize(Outs.size(), false);
|
|
for (unsigned ValNo = 0, E = Outs.size(); ValNo != E; ++ValNo)
|
|
if (Outs[ValNo].IsFixed)
|
|
IsFixed.set(ValNo);
|
|
|
|
CCState::AnalyzeCallOperands(Outs, Fn);
|
|
}
|
|
|
|
bool isFixed(unsigned ValNo) const { return IsFixed.test(ValNo); }
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|