17 const char *
const LibCalls[] = {
18 "__addtf3",
"__divtf3",
"__eqtf2",
"__extenddftf2",
19 "__extendsftf2",
"__fixtfdi",
"__fixtfsi",
"__fixtfti",
20 "__fixunstfdi",
"__fixunstfsi",
"__fixunstfti",
"__floatditf",
21 "__floatsitf",
"__floattitf",
"__floatunditf",
"__floatunsitf",
22 "__floatuntitf",
"__getf2",
"__gttf2",
"__letf2",
23 "__lttf2",
"__multf3",
"__netf2",
"__powitf2",
24 "__subtf3",
"__trunctfdf2",
"__trunctfsf2",
"__unordtf2",
25 "ceill",
"copysignl",
"cosl",
"exp2l",
26 "expl",
"floorl",
"fmal",
"fmaxl",
27 "fmodl",
"log10l",
"log2l",
"logl",
28 "nearbyintl",
"powl",
"rintl",
"roundl",
29 "sinl",
"sqrtl",
"truncl"};
32 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) {
98 void MipsCCState::PreAnalyzeReturnForF128(
101 for (
unsigned i = 0; i < Outs.
size(); ++i) {
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) {
131 void MipsCCState::PreAnalyzeCallOperands(
133 std::vector<TargetLowering::ArgListEntry> &FuncArgs,
135 for (
unsigned i = 0; i < Outs.
size(); ++i) {
136 TargetLowering::ArgListEntry FuncArg = FuncArgs[Outs[i].OrigArgIndex];
139 OriginalArgWasFloat.
push_back(FuncArg.Ty->isFloatingPointTy());
140 OriginalArgWasFloatVector.
push_back(FuncArg.Ty->isVectorTy());
141 CallOperandIsFixed.
push_back(Outs[i].IsFixed);
147 void MipsCCState::PreAnalyzeFormalArgumentsForF128(
150 for (
unsigned i = 0; i <
Ins.size(); ++i) {
156 if (
Ins[i].Flags.isSRet()) {
159 OriginalArgWasFloatVector.
push_back(
false);
164 std::advance(FuncArg,
Ins[i].getOrigArgIndex());
bool inMips16HardFloat() const
const_iterator end(StringRef path)
Get end iterator over path.
This class represents an incoming formal argument to a Function.
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
This class represents lattice values for constants.
void push_back(const T &Elt)
bool isFP128Ty() const
Return true if this is 'fp128'.
Type * getStructElementType(unsigned N) const
MachineFunction & getMachineFunction() const
bool isVectorTy() const
True if this is an instance of VectorType.
Function & getFunction()
Return the LLVM function that this machine code represents.
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
bool isFloatingPointTy() const
Return true if this is one of the six floating-point types.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
bool isIntegerTy() const
True if this is an instance of IntegerType.
OutputArg - This struct carries flags and a value for a single outgoing (actual) argument or outgoing...
static bool originalEVTTypeIsVectorFloat(EVT Ty)
Return true if the original type was vXfXX.
Type * getType() const
All values are typed, get the type of this value.
static SpecialCallingConvType getSpecialCallingConvForCallee(const SDNode *Callee, const MipsSubtarget &Subtarget)
Determine the SpecialCallingConvType for the given callee.
static bool isF128SoftLibCall(const char *CallSym)
This function returns true if CallSym is a long double emulation routine.
Type * getReturnType() const
Returns the type of the ret val.
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...
The instances of the Type class are immutable: once they are created, they are never changed.
unsigned getStructNumElements() const
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Module.h This file contains the declarations for the Module class.
Represents one node in the SelectionDAG.
amdgpu Simplify well known AMD library false FunctionCallee Callee
bool isVector() const
Return true if this is a vector value type.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool originalTypeIsVectorFloat(const Type *Ty)
Return true if the original type was vXfXX / vXfXX.
StringRef - Represent a constant reference to a string, i.e.
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 isStructTy() const
True if this is an instance of StructType.