blob: fd2fd97c8f13302e8fa7a28d0525988f75a15711 [file] [log] [blame]
Daniel Sanders0456c152014-11-07 14:24:31 +00001//===---- MipsCCState.h - CCState with Mips specific extensions -----------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Daniel Sanders0456c152014-11-07 14:24:31 +00006//
7//===----------------------------------------------------------------------===//
8
9#ifndef MIPSCCSTATE_H
10#define MIPSCCSTATE_H
11
Chandler Carruthd9903882015-01-14 11:23:27 +000012#include "MipsISelLowering.h"
Daniel Sanders0456c152014-11-07 14:24:31 +000013#include "llvm/ADT/SmallVector.h"
14#include "llvm/CodeGen/CallingConvLower.h"
Daniel Sanders0456c152014-11-07 14:24:31 +000015
16namespace llvm {
17class SDNode;
18class MipsSubtarget;
19
20class MipsCCState : public CCState {
21public:
22 enum SpecialCallingConvType { Mips16RetHelperConv, NoSpecialCallingConv };
23
24 /// Determine the SpecialCallingConvType for the given callee
25 static SpecialCallingConvType
26 getSpecialCallingConvForCallee(const SDNode *Callee,
27 const MipsSubtarget &Subtarget);
28
29private:
30 /// Identify lowered values that originated from f128 arguments and record
31 /// this for use by RetCC_MipsN.
32 void PreAnalyzeCallResultForF128(const SmallVectorImpl<ISD::InputArg> &Ins,
Simon Dardis70f79252017-04-26 11:10:38 +000033 const Type *RetTy, const char * Func);
Daniel Sanders0456c152014-11-07 14:24:31 +000034
35 /// Identify lowered values that originated from f128 arguments and record
36 /// this for use by RetCC_MipsN.
37 void PreAnalyzeReturnForF128(const SmallVectorImpl<ISD::OutputArg> &Outs);
38
39 /// Identify lowered values that originated from f128 arguments and record
40 /// this.
41 void
42 PreAnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
43 std::vector<TargetLowering::ArgListEntry> &FuncArgs,
Simon Dardis70f79252017-04-26 11:10:38 +000044 const char *Func);
Daniel Sanders0456c152014-11-07 14:24:31 +000045
46 /// Identify lowered values that originated from f128 arguments and record
Simon Dardis212cccb2017-06-09 14:37:08 +000047 /// this for use by RetCC_MipsN.
Daniel Sanders0456c152014-11-07 14:24:31 +000048 void
49 PreAnalyzeFormalArgumentsForF128(const SmallVectorImpl<ISD::InputArg> &Ins);
50
Simon Dardis212cccb2017-06-09 14:37:08 +000051 void
52 PreAnalyzeCallResultForVectorFloat(const SmallVectorImpl<ISD::InputArg> &Ins,
53 const Type *RetTy);
54
55 void PreAnalyzeFormalArgumentsForVectorFloat(
56 const SmallVectorImpl<ISD::InputArg> &Ins);
57
58 void
59 PreAnalyzeReturnForVectorFloat(const SmallVectorImpl<ISD::OutputArg> &Outs);
60
Daniel Sanders0456c152014-11-07 14:24:31 +000061 /// Records whether the value has been lowered from an f128.
62 SmallVector<bool, 4> OriginalArgWasF128;
63
Daniel Sandersc43cda82014-11-07 16:54:21 +000064 /// Records whether the value has been lowered from float.
65 SmallVector<bool, 4> OriginalArgWasFloat;
66
Simon Dardis212cccb2017-06-09 14:37:08 +000067 /// Records whether the value has been lowered from a floating point vector.
68 SmallVector<bool, 4> OriginalArgWasFloatVector;
69
70 /// Records whether the return value has been lowered from a floating point
71 /// vector.
72 SmallVector<bool, 4> OriginalRetWasFloatVector;
73
Daniel Sanders0456c152014-11-07 14:24:31 +000074 /// Records whether the value was a fixed argument.
75 /// See ISD::OutputArg::IsFixed,
76 SmallVector<bool, 4> CallOperandIsFixed;
77
78 // Used to handle MIPS16-specific calling convention tweaks.
79 // FIXME: This should probably be a fully fledged calling convention.
80 SpecialCallingConvType SpecialCallingConv;
81
82public:
83 MipsCCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF,
84 SmallVectorImpl<CCValAssign> &locs, LLVMContext &C,
85 SpecialCallingConvType SpecialCC = NoSpecialCallingConv)
86 : CCState(CC, isVarArg, MF, locs, C), SpecialCallingConv(SpecialCC) {}
87
88 void
89 AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
90 CCAssignFn Fn,
91 std::vector<TargetLowering::ArgListEntry> &FuncArgs,
Simon Dardis70f79252017-04-26 11:10:38 +000092 const char *Func) {
93 PreAnalyzeCallOperands(Outs, FuncArgs, Func);
Daniel Sanders0456c152014-11-07 14:24:31 +000094 CCState::AnalyzeCallOperands(Outs, Fn);
95 OriginalArgWasF128.clear();
Daniel Sandersc43cda82014-11-07 16:54:21 +000096 OriginalArgWasFloat.clear();
Simon Dardis212cccb2017-06-09 14:37:08 +000097 OriginalArgWasFloatVector.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +000098 CallOperandIsFixed.clear();
99 }
100
101 // The AnalyzeCallOperands in the base class is not usable since we must
102 // provide a means of accessing ArgListEntry::IsFixed. Delete them from this
103 // class. This doesn't stop them being used via the base class though.
104 void AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
Aaron Ballmanf9a18972015-02-15 22:54:22 +0000105 CCAssignFn Fn) = delete;
Daniel Sanders0456c152014-11-07 14:24:31 +0000106 void AnalyzeCallOperands(const SmallVectorImpl<MVT> &Outs,
107 SmallVectorImpl<ISD::ArgFlagsTy> &Flags,
Aaron Ballmanf9a18972015-02-15 22:54:22 +0000108 CCAssignFn Fn) = delete;
Daniel Sanders0456c152014-11-07 14:24:31 +0000109
110 void AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins,
111 CCAssignFn Fn) {
112 PreAnalyzeFormalArgumentsForF128(Ins);
113 CCState::AnalyzeFormalArguments(Ins, Fn);
Daniel Sandersc43cda82014-11-07 16:54:21 +0000114 OriginalArgWasFloat.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +0000115 OriginalArgWasF128.clear();
Simon Dardis212cccb2017-06-09 14:37:08 +0000116 OriginalArgWasFloatVector.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +0000117 }
118
119 void AnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins,
Simon Dardis70f79252017-04-26 11:10:38 +0000120 CCAssignFn Fn, const Type *RetTy,
121 const char *Func) {
122 PreAnalyzeCallResultForF128(Ins, RetTy, Func);
Simon Dardis212cccb2017-06-09 14:37:08 +0000123 PreAnalyzeCallResultForVectorFloat(Ins, RetTy);
Daniel Sanders0456c152014-11-07 14:24:31 +0000124 CCState::AnalyzeCallResult(Ins, Fn);
Daniel Sandersc43cda82014-11-07 16:54:21 +0000125 OriginalArgWasFloat.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +0000126 OriginalArgWasF128.clear();
Simon Dardis212cccb2017-06-09 14:37:08 +0000127 OriginalArgWasFloatVector.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +0000128 }
129
130 void AnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs,
131 CCAssignFn Fn) {
132 PreAnalyzeReturnForF128(Outs);
Simon Dardis212cccb2017-06-09 14:37:08 +0000133 PreAnalyzeReturnForVectorFloat(Outs);
Daniel Sanders0456c152014-11-07 14:24:31 +0000134 CCState::AnalyzeReturn(Outs, Fn);
Daniel Sandersc43cda82014-11-07 16:54:21 +0000135 OriginalArgWasFloat.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +0000136 OriginalArgWasF128.clear();
Simon Dardis212cccb2017-06-09 14:37:08 +0000137 OriginalArgWasFloatVector.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +0000138 }
139
140 bool CheckReturn(const SmallVectorImpl<ISD::OutputArg> &ArgsFlags,
141 CCAssignFn Fn) {
142 PreAnalyzeReturnForF128(ArgsFlags);
Simon Dardis212cccb2017-06-09 14:37:08 +0000143 PreAnalyzeReturnForVectorFloat(ArgsFlags);
Daniel Sanders0456c152014-11-07 14:24:31 +0000144 bool Return = CCState::CheckReturn(ArgsFlags, Fn);
Daniel Sandersc43cda82014-11-07 16:54:21 +0000145 OriginalArgWasFloat.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +0000146 OriginalArgWasF128.clear();
Simon Dardis212cccb2017-06-09 14:37:08 +0000147 OriginalArgWasFloatVector.clear();
Daniel Sanders0456c152014-11-07 14:24:31 +0000148 return Return;
149 }
150
151 bool WasOriginalArgF128(unsigned ValNo) { return OriginalArgWasF128[ValNo]; }
Daniel Sandersc43cda82014-11-07 16:54:21 +0000152 bool WasOriginalArgFloat(unsigned ValNo) {
153 return OriginalArgWasFloat[ValNo];
154 }
Simon Dardis212cccb2017-06-09 14:37:08 +0000155 bool WasOriginalArgVectorFloat(unsigned ValNo) const {
156 return OriginalArgWasFloatVector[ValNo];
157 }
158 bool WasOriginalRetVectorFloat(unsigned ValNo) const {
159 return OriginalRetWasFloatVector[ValNo];
160 }
Daniel Sanders0456c152014-11-07 14:24:31 +0000161 bool IsCallOperandFixed(unsigned ValNo) { return CallOperandIsFixed[ValNo]; }
162 SpecialCallingConvType getSpecialCallingConv() { return SpecialCallingConv; }
163};
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000164}
Daniel Sanders0456c152014-11-07 14:24:31 +0000165
166#endif