Path: blob/main/contrib/llvm-project/llvm/lib/Target/Mips/MipsCCState.h
35268 views
//===---- MipsCCState.h - CCState with Mips specific extensions -----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef MIPSCCSTATE_H9#define MIPSCCSTATE_H1011#include "MipsISelLowering.h"12#include "llvm/ADT/SmallVector.h"13#include "llvm/CodeGen/CallingConvLower.h"1415namespace llvm {16class SDNode;17class MipsSubtarget;1819class MipsCCState : public CCState {20public:21enum SpecialCallingConvType { Mips16RetHelperConv, NoSpecialCallingConv };2223/// Determine the SpecialCallingConvType for the given callee24static SpecialCallingConvType25getSpecialCallingConvForCallee(const SDNode *Callee,26const MipsSubtarget &Subtarget);2728/// This function returns true if CallSym is a long double emulation routine.29///30/// FIXME: Changing the ABI based on the callee name is unsound. The lib func31/// address could be captured.32static bool isF128SoftLibCall(const char *CallSym);3334static bool originalTypeIsF128(const Type *Ty, const char *Func);35static bool originalEVTTypeIsVectorFloat(EVT Ty);36static bool originalTypeIsVectorFloat(const Type *Ty);3738void PreAnalyzeCallOperand(const Type *ArgTy, bool IsFixed, const char *Func);3940void PreAnalyzeFormalArgument(const Type *ArgTy, ISD::ArgFlagsTy Flags);41void PreAnalyzeReturnValue(EVT ArgVT);4243private:44/// Identify lowered values that originated from f128 arguments and record45/// this for use by RetCC_MipsN.46void PreAnalyzeCallResultForF128(const SmallVectorImpl<ISD::InputArg> &Ins,47const Type *RetTy, const char * Func);4849/// Identify lowered values that originated from f128 arguments and record50/// this for use by RetCC_MipsN.51void PreAnalyzeReturnForF128(const SmallVectorImpl<ISD::OutputArg> &Outs);5253/// Identify lowered values that originated from f128 arguments and record54/// this.55void56PreAnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,57std::vector<TargetLowering::ArgListEntry> &FuncArgs,58const char *Func);5960/// Identify lowered values that originated from f128 arguments and record61/// this for use by RetCC_MipsN.62void63PreAnalyzeFormalArgumentsForF128(const SmallVectorImpl<ISD::InputArg> &Ins);6465void66PreAnalyzeCallResultForVectorFloat(const SmallVectorImpl<ISD::InputArg> &Ins,67const Type *RetTy);6869void PreAnalyzeFormalArgumentsForVectorFloat(70const SmallVectorImpl<ISD::InputArg> &Ins);7172void73PreAnalyzeReturnForVectorFloat(const SmallVectorImpl<ISD::OutputArg> &Outs);7475/// Records whether the value has been lowered from an f128.76SmallVector<bool, 4> OriginalArgWasF128;7778/// Records whether the value has been lowered from float.79SmallVector<bool, 4> OriginalArgWasFloat;8081/// Records whether the value has been lowered from a floating point vector.82SmallVector<bool, 4> OriginalArgWasFloatVector;8384/// Records whether the return value has been lowered from a floating point85/// vector.86SmallVector<bool, 4> OriginalRetWasFloatVector;8788/// Records whether the value was a fixed argument.89/// See ISD::OutputArg::IsFixed,90SmallVector<bool, 4> CallOperandIsFixed;9192// Used to handle MIPS16-specific calling convention tweaks.93// FIXME: This should probably be a fully fledged calling convention.94SpecialCallingConvType SpecialCallingConv;9596public:97MipsCCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF,98SmallVectorImpl<CCValAssign> &locs, LLVMContext &C,99SpecialCallingConvType SpecialCC = NoSpecialCallingConv)100: CCState(CC, isVarArg, MF, locs, C), SpecialCallingConv(SpecialCC) {}101102void PreAnalyzeCallOperands(103const SmallVectorImpl<ISD::OutputArg> &Outs, CCAssignFn Fn,104std::vector<TargetLowering::ArgListEntry> &FuncArgs, const char *Func) {105OriginalArgWasF128.clear();106OriginalArgWasFloat.clear();107OriginalArgWasFloatVector.clear();108CallOperandIsFixed.clear();109PreAnalyzeCallOperands(Outs, FuncArgs, Func);110}111112void113AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,114CCAssignFn Fn,115std::vector<TargetLowering::ArgListEntry> &FuncArgs,116const char *Func) {117PreAnalyzeCallOperands(Outs, Fn, FuncArgs, Func);118CCState::AnalyzeCallOperands(Outs, Fn);119}120121// The AnalyzeCallOperands in the base class is not usable since we must122// provide a means of accessing ArgListEntry::IsFixed. Delete them from this123// class. This doesn't stop them being used via the base class though.124void AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,125CCAssignFn Fn) = delete;126void AnalyzeCallOperands(const SmallVectorImpl<MVT> &Outs,127SmallVectorImpl<ISD::ArgFlagsTy> &Flags,128CCAssignFn Fn) = delete;129130void PreAnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins,131CCAssignFn Fn) {132OriginalArgWasFloat.clear();133OriginalArgWasF128.clear();134OriginalArgWasFloatVector.clear();135PreAnalyzeFormalArgumentsForF128(Ins);136}137138void AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins,139CCAssignFn Fn) {140PreAnalyzeFormalArguments(Ins, Fn);141CCState::AnalyzeFormalArguments(Ins, Fn);142}143144void PreAnalyzeCallResult(const Type *RetTy, const char *Func) {145OriginalArgWasF128.push_back(originalTypeIsF128(RetTy, Func));146OriginalArgWasFloat.push_back(RetTy->isFloatingPointTy());147OriginalRetWasFloatVector.push_back(originalTypeIsVectorFloat(RetTy));148}149150void PreAnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins,151CCAssignFn Fn, const Type *RetTy,152const char *Func) {153OriginalArgWasFloat.clear();154OriginalArgWasF128.clear();155OriginalArgWasFloatVector.clear();156PreAnalyzeCallResultForF128(Ins, RetTy, Func);157PreAnalyzeCallResultForVectorFloat(Ins, RetTy);158}159160void AnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins,161CCAssignFn Fn, const Type *RetTy,162const char *Func) {163PreAnalyzeCallResult(Ins, Fn, RetTy, Func);164CCState::AnalyzeCallResult(Ins, Fn);165}166167void PreAnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs,168CCAssignFn Fn) {169OriginalArgWasFloat.clear();170OriginalArgWasF128.clear();171OriginalArgWasFloatVector.clear();172PreAnalyzeReturnForF128(Outs);173PreAnalyzeReturnForVectorFloat(Outs);174}175176void AnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs,177CCAssignFn Fn) {178PreAnalyzeReturn(Outs, Fn);179CCState::AnalyzeReturn(Outs, Fn);180}181182bool CheckReturn(const SmallVectorImpl<ISD::OutputArg> &ArgsFlags,183CCAssignFn Fn) {184PreAnalyzeReturnForF128(ArgsFlags);185PreAnalyzeReturnForVectorFloat(ArgsFlags);186bool Return = CCState::CheckReturn(ArgsFlags, Fn);187OriginalArgWasFloat.clear();188OriginalArgWasF128.clear();189OriginalArgWasFloatVector.clear();190return Return;191}192193bool WasOriginalArgF128(unsigned ValNo) { return OriginalArgWasF128[ValNo]; }194bool WasOriginalArgFloat(unsigned ValNo) {195return OriginalArgWasFloat[ValNo];196}197bool WasOriginalArgVectorFloat(unsigned ValNo) const {198return OriginalArgWasFloatVector[ValNo];199}200bool WasOriginalRetVectorFloat(unsigned ValNo) const {201return OriginalRetWasFloatVector[ValNo];202}203bool IsCallOperandFixed(unsigned ValNo) { return CallOperandIsFixed[ValNo]; }204SpecialCallingConvType getSpecialCallingConv() { return SpecialCallingConv; }205};206}207208#endif209210211