xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MipsCCState.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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