Go to the documentation of this file.
16 const char *
const LibCalls[] = {
17 "__addtf3",
"__divtf3",
"__eqtf2",
"__extenddftf2",
18 "__extendsftf2",
"__fixtfdi",
"__fixtfsi",
"__fixtfti",
19 "__fixunstfdi",
"__fixunstfsi",
"__fixunstfti",
"__floatditf",
20 "__floatsitf",
"__floattitf",
"__floatunditf",
"__floatunsitf",
21 "__floatuntitf",
"__getf2",
"__gttf2",
"__letf2",
22 "__lttf2",
"__multf3",
"__netf2",
"__powitf2",
23 "__subtf3",
"__trunctfdf2",
"__trunctfsf2",
"__unordtf2",
24 "ceill",
"copysignl",
"cosl",
"exp2l",
25 "expl",
"floorl",
"fmal",
"fmaxl",
26 "fmodl",
"log10l",
"log2l",
"logl",
27 "nearbyintl",
"powl",
"rintl",
"roundl",
28 "sinl",
"sqrtl",
"truncl"};
31 auto Comp = [](
const char *S1,
const char *S2) {
return strcmp(S1, S2) < 0; };
75 dyn_cast<const GlobalAddressSDNode>(
Callee)) {
77 Function *
F =
G->getGlobal()->getParent()->getFunction(Sym);
78 if (
F &&
F->hasFnAttribute(
"__Mips16RetHelper")) {
83 return SpecialCallingConv;
86 void MipsCCState::PreAnalyzeCallResultForF128(
88 const Type *RetTy,
const char *Call) {
89 for (
unsigned i = 0;
i <
Ins.size(); ++
i) {
90 OriginalArgWasF128.push_back(
98 void MipsCCState::PreAnalyzeReturnForF128(
101 for (
unsigned i = 0;
i < Outs.size(); ++
i) {
102 OriginalArgWasF128.push_back(
104 OriginalArgWasFloat.push_back(
111 void MipsCCState::PreAnalyzeCallResultForVectorFloat(
113 for (
unsigned i = 0;
i <
Ins.size(); ++
i) {
120 void MipsCCState::PreAnalyzeReturnForVectorFloat(
122 for (
unsigned i = 0;
i < Outs.size(); ++
i) {
124 OriginalRetWasFloatVector.push_back(
137 OriginalArgWasFloatVector.push_back(ArgTy->
isVectorTy());
138 CallOperandIsFixed.push_back(IsFixed);
143 void MipsCCState::PreAnalyzeCallOperands(
145 std::vector<TargetLowering::ArgListEntry> &FuncArgs,
147 for (
unsigned i = 0;
i < Outs.size(); ++
i) {
152 OriginalArgWasFloatVector.push_back(FuncArg.
Ty->
isVectorTy());
153 CallOperandIsFixed.push_back(Outs[
i].IsFixed);
163 OriginalArgWasF128.push_back(
false);
164 OriginalArgWasFloat.push_back(
false);
165 OriginalArgWasFloatVector.push_back(
false);
175 OriginalArgWasFloatVector.push_back(ArgTy->
isVectorTy());
180 void MipsCCState::PreAnalyzeFormalArgumentsForF128(
183 for (
unsigned i = 0;
i <
Ins.size(); ++
i) {
189 if (
Ins[
i].Flags.isSRet()) {
190 OriginalArgWasF128.push_back(
false);
191 OriginalArgWasFloat.push_back(
false);
192 OriginalArgWasFloatVector.push_back(
false);
197 std::advance(FuncArg,
Ins[
i].getOrigArgIndex());
199 OriginalArgWasF128.push_back(
This class represents an incoming formal argument to a Function.
static bool originalEVTTypeIsVectorFloat(EVT Ty)
Return true if the original type was vXfXX.
void PreAnalyzeReturnValue(EVT ArgVT)
This is an optimization pass for GlobalISel generic memory operations.
void PreAnalyzeFormalArgument(const Type *ArgTy, ISD::ArgFlagsTy Flags)
Represents one node in the SelectionDAG.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
The instances of the Type class are immutable: once they are created, they are never changed.
const_iterator end(StringRef path)
Get end iterator over path.
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
MachineFunction & getMachineFunction() const
bool isFloatingPointTy() const
Return true if this is one of the six floating-point types.
static bool originalTypeIsVectorFloat(const Type *Ty)
Return true if the original type was vXfXX / vXfXX.
static SpecialCallingConvType getSpecialCallingConvForCallee(const SDNode *Callee, const MipsSubtarget &Subtarget)
Determine the SpecialCallingConvType for the given callee.
static bool originalTypeIsF128(const Type *Ty, const char *Func)
This function returns true if Ty is fp128, {f128} or i128 which was originally a fp128.
bool isVectorTy() const
True if this is an instance of VectorType.
unsigned getStructNumElements() const
bool isIntegerTy() const
True if this is an instance of IntegerType.
Type * getReturnType() const
Returns the type of the ret val.
OutputArg - This struct carries flags and a value for a single outgoing (actual) argument or outgoing...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool isVector() const
Return true if this is a vector value type.
StringRef - Represent a constant reference to a string, i.e.
Type * getStructElementType(unsigned N) const
Type * getType() const
All values are typed, get the type of this value.
amdgpu Simplify well known AMD library false FunctionCallee Callee
Function & getFunction()
Return the LLVM function that this machine code represents.
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
EVT getVectorElementType() const
Given a vector type, return the type of each element.
bool isStructTy() const
True if this is an instance of StructType.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
static bool isF128SoftLibCall(const char *CallSym)
This function returns true if CallSym is a long double emulation routine.
void PreAnalyzeCallOperand(const Type *ArgTy, bool IsFixed, const char *Func)
bool isFP128Ty() const
Return true if this is 'fp128'.
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
bool inMips16HardFloat() const