1*9880d681SAndroid Build Coastguard Worker //===---- MipsCCState.h - CCState with Mips specific extensions -----------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #ifndef MIPSCCSTATE_H 11*9880d681SAndroid Build Coastguard Worker #define MIPSCCSTATE_H 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #include "MipsISelLowering.h" 14*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallVector.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/CallingConvLower.h" 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker namespace llvm { 18*9880d681SAndroid Build Coastguard Worker class SDNode; 19*9880d681SAndroid Build Coastguard Worker class MipsSubtarget; 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker class MipsCCState : public CCState { 22*9880d681SAndroid Build Coastguard Worker public: 23*9880d681SAndroid Build Coastguard Worker enum SpecialCallingConvType { Mips16RetHelperConv, NoSpecialCallingConv }; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker /// Determine the SpecialCallingConvType for the given callee 26*9880d681SAndroid Build Coastguard Worker static SpecialCallingConvType 27*9880d681SAndroid Build Coastguard Worker getSpecialCallingConvForCallee(const SDNode *Callee, 28*9880d681SAndroid Build Coastguard Worker const MipsSubtarget &Subtarget); 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker private: 31*9880d681SAndroid Build Coastguard Worker /// Identify lowered values that originated from f128 arguments and record 32*9880d681SAndroid Build Coastguard Worker /// this for use by RetCC_MipsN. 33*9880d681SAndroid Build Coastguard Worker void PreAnalyzeCallResultForF128(const SmallVectorImpl<ISD::InputArg> &Ins, 34*9880d681SAndroid Build Coastguard Worker const TargetLowering::CallLoweringInfo &CLI); 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker /// Identify lowered values that originated from f128 arguments and record 37*9880d681SAndroid Build Coastguard Worker /// this for use by RetCC_MipsN. 38*9880d681SAndroid Build Coastguard Worker void PreAnalyzeReturnForF128(const SmallVectorImpl<ISD::OutputArg> &Outs); 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker /// Identify lowered values that originated from f128 arguments and record 41*9880d681SAndroid Build Coastguard Worker /// this. 42*9880d681SAndroid Build Coastguard Worker void 43*9880d681SAndroid Build Coastguard Worker PreAnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs, 44*9880d681SAndroid Build Coastguard Worker std::vector<TargetLowering::ArgListEntry> &FuncArgs, 45*9880d681SAndroid Build Coastguard Worker const SDNode *CallNode); 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker /// Identify lowered values that originated from f128 arguments and record 48*9880d681SAndroid Build Coastguard Worker /// this. 49*9880d681SAndroid Build Coastguard Worker void 50*9880d681SAndroid Build Coastguard Worker PreAnalyzeFormalArgumentsForF128(const SmallVectorImpl<ISD::InputArg> &Ins); 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker /// Records whether the value has been lowered from an f128. 53*9880d681SAndroid Build Coastguard Worker SmallVector<bool, 4> OriginalArgWasF128; 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker /// Records whether the value has been lowered from float. 56*9880d681SAndroid Build Coastguard Worker SmallVector<bool, 4> OriginalArgWasFloat; 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker /// Records whether the value was a fixed argument. 59*9880d681SAndroid Build Coastguard Worker /// See ISD::OutputArg::IsFixed, 60*9880d681SAndroid Build Coastguard Worker SmallVector<bool, 4> CallOperandIsFixed; 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker // Used to handle MIPS16-specific calling convention tweaks. 63*9880d681SAndroid Build Coastguard Worker // FIXME: This should probably be a fully fledged calling convention. 64*9880d681SAndroid Build Coastguard Worker SpecialCallingConvType SpecialCallingConv; 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker public: 67*9880d681SAndroid Build Coastguard Worker MipsCCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF, 68*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<CCValAssign> &locs, LLVMContext &C, 69*9880d681SAndroid Build Coastguard Worker SpecialCallingConvType SpecialCC = NoSpecialCallingConv) CCState(CC,isVarArg,MF,locs,C)70*9880d681SAndroid Build Coastguard Worker : CCState(CC, isVarArg, MF, locs, C), SpecialCallingConv(SpecialCC) {} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker void AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> & Outs,CCAssignFn Fn,std::vector<TargetLowering::ArgListEntry> & FuncArgs,const SDNode * CallNode)73*9880d681SAndroid Build Coastguard Worker AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs, 74*9880d681SAndroid Build Coastguard Worker CCAssignFn Fn, 75*9880d681SAndroid Build Coastguard Worker std::vector<TargetLowering::ArgListEntry> &FuncArgs, 76*9880d681SAndroid Build Coastguard Worker const SDNode *CallNode) { 77*9880d681SAndroid Build Coastguard Worker PreAnalyzeCallOperands(Outs, FuncArgs, CallNode); 78*9880d681SAndroid Build Coastguard Worker CCState::AnalyzeCallOperands(Outs, Fn); 79*9880d681SAndroid Build Coastguard Worker OriginalArgWasF128.clear(); 80*9880d681SAndroid Build Coastguard Worker OriginalArgWasFloat.clear(); 81*9880d681SAndroid Build Coastguard Worker CallOperandIsFixed.clear(); 82*9880d681SAndroid Build Coastguard Worker } 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker // The AnalyzeCallOperands in the base class is not usable since we must 85*9880d681SAndroid Build Coastguard Worker // provide a means of accessing ArgListEntry::IsFixed. Delete them from this 86*9880d681SAndroid Build Coastguard Worker // class. This doesn't stop them being used via the base class though. 87*9880d681SAndroid Build Coastguard Worker void AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs, 88*9880d681SAndroid Build Coastguard Worker CCAssignFn Fn) = delete; 89*9880d681SAndroid Build Coastguard Worker void AnalyzeCallOperands(const SmallVectorImpl<MVT> &Outs, 90*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<ISD::ArgFlagsTy> &Flags, 91*9880d681SAndroid Build Coastguard Worker CCAssignFn Fn) = delete; 92*9880d681SAndroid Build Coastguard Worker AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> & Ins,CCAssignFn Fn)93*9880d681SAndroid Build Coastguard Worker void AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins, 94*9880d681SAndroid Build Coastguard Worker CCAssignFn Fn) { 95*9880d681SAndroid Build Coastguard Worker PreAnalyzeFormalArgumentsForF128(Ins); 96*9880d681SAndroid Build Coastguard Worker CCState::AnalyzeFormalArguments(Ins, Fn); 97*9880d681SAndroid Build Coastguard Worker OriginalArgWasFloat.clear(); 98*9880d681SAndroid Build Coastguard Worker OriginalArgWasF128.clear(); 99*9880d681SAndroid Build Coastguard Worker } 100*9880d681SAndroid Build Coastguard Worker AnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> & Ins,CCAssignFn Fn,const TargetLowering::CallLoweringInfo & CLI)101*9880d681SAndroid Build Coastguard Worker void AnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins, 102*9880d681SAndroid Build Coastguard Worker CCAssignFn Fn, 103*9880d681SAndroid Build Coastguard Worker const TargetLowering::CallLoweringInfo &CLI) { 104*9880d681SAndroid Build Coastguard Worker PreAnalyzeCallResultForF128(Ins, CLI); 105*9880d681SAndroid Build Coastguard Worker CCState::AnalyzeCallResult(Ins, Fn); 106*9880d681SAndroid Build Coastguard Worker OriginalArgWasFloat.clear(); 107*9880d681SAndroid Build Coastguard Worker OriginalArgWasF128.clear(); 108*9880d681SAndroid Build Coastguard Worker } 109*9880d681SAndroid Build Coastguard Worker AnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> & Outs,CCAssignFn Fn)110*9880d681SAndroid Build Coastguard Worker void AnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs, 111*9880d681SAndroid Build Coastguard Worker CCAssignFn Fn) { 112*9880d681SAndroid Build Coastguard Worker PreAnalyzeReturnForF128(Outs); 113*9880d681SAndroid Build Coastguard Worker CCState::AnalyzeReturn(Outs, Fn); 114*9880d681SAndroid Build Coastguard Worker OriginalArgWasFloat.clear(); 115*9880d681SAndroid Build Coastguard Worker OriginalArgWasF128.clear(); 116*9880d681SAndroid Build Coastguard Worker } 117*9880d681SAndroid Build Coastguard Worker CheckReturn(const SmallVectorImpl<ISD::OutputArg> & ArgsFlags,CCAssignFn Fn)118*9880d681SAndroid Build Coastguard Worker bool CheckReturn(const SmallVectorImpl<ISD::OutputArg> &ArgsFlags, 119*9880d681SAndroid Build Coastguard Worker CCAssignFn Fn) { 120*9880d681SAndroid Build Coastguard Worker PreAnalyzeReturnForF128(ArgsFlags); 121*9880d681SAndroid Build Coastguard Worker bool Return = CCState::CheckReturn(ArgsFlags, Fn); 122*9880d681SAndroid Build Coastguard Worker OriginalArgWasFloat.clear(); 123*9880d681SAndroid Build Coastguard Worker OriginalArgWasF128.clear(); 124*9880d681SAndroid Build Coastguard Worker return Return; 125*9880d681SAndroid Build Coastguard Worker } 126*9880d681SAndroid Build Coastguard Worker WasOriginalArgF128(unsigned ValNo)127*9880d681SAndroid Build Coastguard Worker bool WasOriginalArgF128(unsigned ValNo) { return OriginalArgWasF128[ValNo]; } WasOriginalArgFloat(unsigned ValNo)128*9880d681SAndroid Build Coastguard Worker bool WasOriginalArgFloat(unsigned ValNo) { 129*9880d681SAndroid Build Coastguard Worker return OriginalArgWasFloat[ValNo]; 130*9880d681SAndroid Build Coastguard Worker } IsCallOperandFixed(unsigned ValNo)131*9880d681SAndroid Build Coastguard Worker bool IsCallOperandFixed(unsigned ValNo) { return CallOperandIsFixed[ValNo]; } getSpecialCallingConv()132*9880d681SAndroid Build Coastguard Worker SpecialCallingConvType getSpecialCallingConv() { return SpecialCallingConv; } 133*9880d681SAndroid Build Coastguard Worker }; 134*9880d681SAndroid Build Coastguard Worker } 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker #endif 137