xref: /freebsd-src/contrib/llvm-project/clang/lib/CodeGen/Targets/X86.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1*06c3fb27SDimitry Andric //===- X86.cpp ------------------------------------------------------------===//
2*06c3fb27SDimitry Andric //
3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*06c3fb27SDimitry Andric //
7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
8*06c3fb27SDimitry Andric 
9*06c3fb27SDimitry Andric #include "ABIInfoImpl.h"
10*06c3fb27SDimitry Andric #include "TargetInfo.h"
11*06c3fb27SDimitry Andric #include "clang/Basic/DiagnosticFrontend.h"
12*06c3fb27SDimitry Andric #include "llvm/ADT/SmallBitVector.h"
13*06c3fb27SDimitry Andric 
14*06c3fb27SDimitry Andric using namespace clang;
15*06c3fb27SDimitry Andric using namespace clang::CodeGen;
16*06c3fb27SDimitry Andric 
17*06c3fb27SDimitry Andric namespace {
18*06c3fb27SDimitry Andric 
19*06c3fb27SDimitry Andric /// IsX86_MMXType - Return true if this is an MMX type.
20*06c3fb27SDimitry Andric bool IsX86_MMXType(llvm::Type *IRType) {
21*06c3fb27SDimitry Andric   // Return true if the type is an MMX type <2 x i32>, <4 x i16>, or <8 x i8>.
22*06c3fb27SDimitry Andric   return IRType->isVectorTy() && IRType->getPrimitiveSizeInBits() == 64 &&
23*06c3fb27SDimitry Andric     cast<llvm::VectorType>(IRType)->getElementType()->isIntegerTy() &&
24*06c3fb27SDimitry Andric     IRType->getScalarSizeInBits() != 64;
25*06c3fb27SDimitry Andric }
26*06c3fb27SDimitry Andric 
27*06c3fb27SDimitry Andric static llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
28*06c3fb27SDimitry Andric                                           StringRef Constraint,
29*06c3fb27SDimitry Andric                                           llvm::Type* Ty) {
30*06c3fb27SDimitry Andric   bool IsMMXCons = llvm::StringSwitch<bool>(Constraint)
31*06c3fb27SDimitry Andric                      .Cases("y", "&y", "^Ym", true)
32*06c3fb27SDimitry Andric                      .Default(false);
33*06c3fb27SDimitry Andric   if (IsMMXCons && Ty->isVectorTy()) {
34*06c3fb27SDimitry Andric     if (cast<llvm::VectorType>(Ty)->getPrimitiveSizeInBits().getFixedValue() !=
35*06c3fb27SDimitry Andric         64) {
36*06c3fb27SDimitry Andric       // Invalid MMX constraint
37*06c3fb27SDimitry Andric       return nullptr;
38*06c3fb27SDimitry Andric     }
39*06c3fb27SDimitry Andric 
40*06c3fb27SDimitry Andric     return llvm::Type::getX86_MMXTy(CGF.getLLVMContext());
41*06c3fb27SDimitry Andric   }
42*06c3fb27SDimitry Andric 
43*06c3fb27SDimitry Andric   // No operation needed
44*06c3fb27SDimitry Andric   return Ty;
45*06c3fb27SDimitry Andric }
46*06c3fb27SDimitry Andric 
47*06c3fb27SDimitry Andric /// Returns true if this type can be passed in SSE registers with the
48*06c3fb27SDimitry Andric /// X86_VectorCall calling convention. Shared between x86_32 and x86_64.
49*06c3fb27SDimitry Andric static bool isX86VectorTypeForVectorCall(ASTContext &Context, QualType Ty) {
50*06c3fb27SDimitry Andric   if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
51*06c3fb27SDimitry Andric     if (BT->isFloatingPoint() && BT->getKind() != BuiltinType::Half) {
52*06c3fb27SDimitry Andric       if (BT->getKind() == BuiltinType::LongDouble) {
53*06c3fb27SDimitry Andric         if (&Context.getTargetInfo().getLongDoubleFormat() ==
54*06c3fb27SDimitry Andric             &llvm::APFloat::x87DoubleExtended())
55*06c3fb27SDimitry Andric           return false;
56*06c3fb27SDimitry Andric       }
57*06c3fb27SDimitry Andric       return true;
58*06c3fb27SDimitry Andric     }
59*06c3fb27SDimitry Andric   } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
60*06c3fb27SDimitry Andric     // vectorcall can pass XMM, YMM, and ZMM vectors. We don't pass SSE1 MMX
61*06c3fb27SDimitry Andric     // registers specially.
62*06c3fb27SDimitry Andric     unsigned VecSize = Context.getTypeSize(VT);
63*06c3fb27SDimitry Andric     if (VecSize == 128 || VecSize == 256 || VecSize == 512)
64*06c3fb27SDimitry Andric       return true;
65*06c3fb27SDimitry Andric   }
66*06c3fb27SDimitry Andric   return false;
67*06c3fb27SDimitry Andric }
68*06c3fb27SDimitry Andric 
69*06c3fb27SDimitry Andric /// Returns true if this aggregate is small enough to be passed in SSE registers
70*06c3fb27SDimitry Andric /// in the X86_VectorCall calling convention. Shared between x86_32 and x86_64.
71*06c3fb27SDimitry Andric static bool isX86VectorCallAggregateSmallEnough(uint64_t NumMembers) {
72*06c3fb27SDimitry Andric   return NumMembers <= 4;
73*06c3fb27SDimitry Andric }
74*06c3fb27SDimitry Andric 
75*06c3fb27SDimitry Andric /// Returns a Homogeneous Vector Aggregate ABIArgInfo, used in X86.
76*06c3fb27SDimitry Andric static ABIArgInfo getDirectX86Hva(llvm::Type* T = nullptr) {
77*06c3fb27SDimitry Andric   auto AI = ABIArgInfo::getDirect(T);
78*06c3fb27SDimitry Andric   AI.setInReg(true);
79*06c3fb27SDimitry Andric   AI.setCanBeFlattened(false);
80*06c3fb27SDimitry Andric   return AI;
81*06c3fb27SDimitry Andric }
82*06c3fb27SDimitry Andric 
83*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
84*06c3fb27SDimitry Andric // X86-32 ABI Implementation
85*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
86*06c3fb27SDimitry Andric 
87*06c3fb27SDimitry Andric /// Similar to llvm::CCState, but for Clang.
88*06c3fb27SDimitry Andric struct CCState {
89*06c3fb27SDimitry Andric   CCState(CGFunctionInfo &FI)
90*06c3fb27SDimitry Andric       : IsPreassigned(FI.arg_size()), CC(FI.getCallingConvention()) {}
91*06c3fb27SDimitry Andric 
92*06c3fb27SDimitry Andric   llvm::SmallBitVector IsPreassigned;
93*06c3fb27SDimitry Andric   unsigned CC = CallingConv::CC_C;
94*06c3fb27SDimitry Andric   unsigned FreeRegs = 0;
95*06c3fb27SDimitry Andric   unsigned FreeSSERegs = 0;
96*06c3fb27SDimitry Andric };
97*06c3fb27SDimitry Andric 
98*06c3fb27SDimitry Andric /// X86_32ABIInfo - The X86-32 ABI information.
99*06c3fb27SDimitry Andric class X86_32ABIInfo : public ABIInfo {
100*06c3fb27SDimitry Andric   enum Class {
101*06c3fb27SDimitry Andric     Integer,
102*06c3fb27SDimitry Andric     Float
103*06c3fb27SDimitry Andric   };
104*06c3fb27SDimitry Andric 
105*06c3fb27SDimitry Andric   static const unsigned MinABIStackAlignInBytes = 4;
106*06c3fb27SDimitry Andric 
107*06c3fb27SDimitry Andric   bool IsDarwinVectorABI;
108*06c3fb27SDimitry Andric   bool IsRetSmallStructInRegABI;
109*06c3fb27SDimitry Andric   bool IsWin32StructABI;
110*06c3fb27SDimitry Andric   bool IsSoftFloatABI;
111*06c3fb27SDimitry Andric   bool IsMCUABI;
112*06c3fb27SDimitry Andric   bool IsLinuxABI;
113*06c3fb27SDimitry Andric   unsigned DefaultNumRegisterParameters;
114*06c3fb27SDimitry Andric 
115*06c3fb27SDimitry Andric   static bool isRegisterSize(unsigned Size) {
116*06c3fb27SDimitry Andric     return (Size == 8 || Size == 16 || Size == 32 || Size == 64);
117*06c3fb27SDimitry Andric   }
118*06c3fb27SDimitry Andric 
119*06c3fb27SDimitry Andric   bool isHomogeneousAggregateBaseType(QualType Ty) const override {
120*06c3fb27SDimitry Andric     // FIXME: Assumes vectorcall is in use.
121*06c3fb27SDimitry Andric     return isX86VectorTypeForVectorCall(getContext(), Ty);
122*06c3fb27SDimitry Andric   }
123*06c3fb27SDimitry Andric 
124*06c3fb27SDimitry Andric   bool isHomogeneousAggregateSmallEnough(const Type *Ty,
125*06c3fb27SDimitry Andric                                          uint64_t NumMembers) const override {
126*06c3fb27SDimitry Andric     // FIXME: Assumes vectorcall is in use.
127*06c3fb27SDimitry Andric     return isX86VectorCallAggregateSmallEnough(NumMembers);
128*06c3fb27SDimitry Andric   }
129*06c3fb27SDimitry Andric 
130*06c3fb27SDimitry Andric   bool shouldReturnTypeInRegister(QualType Ty, ASTContext &Context) const;
131*06c3fb27SDimitry Andric 
132*06c3fb27SDimitry Andric   /// getIndirectResult - Give a source type \arg Ty, return a suitable result
133*06c3fb27SDimitry Andric   /// such that the argument will be passed in memory.
134*06c3fb27SDimitry Andric   ABIArgInfo getIndirectResult(QualType Ty, bool ByVal, CCState &State) const;
135*06c3fb27SDimitry Andric 
136*06c3fb27SDimitry Andric   ABIArgInfo getIndirectReturnResult(QualType Ty, CCState &State) const;
137*06c3fb27SDimitry Andric 
138*06c3fb27SDimitry Andric   /// Return the alignment to use for the given type on the stack.
139*06c3fb27SDimitry Andric   unsigned getTypeStackAlignInBytes(QualType Ty, unsigned Align) const;
140*06c3fb27SDimitry Andric 
141*06c3fb27SDimitry Andric   Class classify(QualType Ty) const;
142*06c3fb27SDimitry Andric   ABIArgInfo classifyReturnType(QualType RetTy, CCState &State) const;
143*06c3fb27SDimitry Andric   ABIArgInfo classifyArgumentType(QualType RetTy, CCState &State) const;
144*06c3fb27SDimitry Andric 
145*06c3fb27SDimitry Andric   /// Updates the number of available free registers, returns
146*06c3fb27SDimitry Andric   /// true if any registers were allocated.
147*06c3fb27SDimitry Andric   bool updateFreeRegs(QualType Ty, CCState &State) const;
148*06c3fb27SDimitry Andric 
149*06c3fb27SDimitry Andric   bool shouldAggregateUseDirect(QualType Ty, CCState &State, bool &InReg,
150*06c3fb27SDimitry Andric                                 bool &NeedsPadding) const;
151*06c3fb27SDimitry Andric   bool shouldPrimitiveUseInReg(QualType Ty, CCState &State) const;
152*06c3fb27SDimitry Andric 
153*06c3fb27SDimitry Andric   bool canExpandIndirectArgument(QualType Ty) const;
154*06c3fb27SDimitry Andric 
155*06c3fb27SDimitry Andric   /// Rewrite the function info so that all memory arguments use
156*06c3fb27SDimitry Andric   /// inalloca.
157*06c3fb27SDimitry Andric   void rewriteWithInAlloca(CGFunctionInfo &FI) const;
158*06c3fb27SDimitry Andric 
159*06c3fb27SDimitry Andric   void addFieldToArgStruct(SmallVector<llvm::Type *, 6> &FrameFields,
160*06c3fb27SDimitry Andric                            CharUnits &StackOffset, ABIArgInfo &Info,
161*06c3fb27SDimitry Andric                            QualType Type) const;
162*06c3fb27SDimitry Andric   void runVectorCallFirstPass(CGFunctionInfo &FI, CCState &State) const;
163*06c3fb27SDimitry Andric 
164*06c3fb27SDimitry Andric public:
165*06c3fb27SDimitry Andric 
166*06c3fb27SDimitry Andric   void computeInfo(CGFunctionInfo &FI) const override;
167*06c3fb27SDimitry Andric   Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
168*06c3fb27SDimitry Andric                     QualType Ty) const override;
169*06c3fb27SDimitry Andric 
170*06c3fb27SDimitry Andric   X86_32ABIInfo(CodeGen::CodeGenTypes &CGT, bool DarwinVectorABI,
171*06c3fb27SDimitry Andric                 bool RetSmallStructInRegABI, bool Win32StructABI,
172*06c3fb27SDimitry Andric                 unsigned NumRegisterParameters, bool SoftFloatABI)
173*06c3fb27SDimitry Andric       : ABIInfo(CGT), IsDarwinVectorABI(DarwinVectorABI),
174*06c3fb27SDimitry Andric         IsRetSmallStructInRegABI(RetSmallStructInRegABI),
175*06c3fb27SDimitry Andric         IsWin32StructABI(Win32StructABI), IsSoftFloatABI(SoftFloatABI),
176*06c3fb27SDimitry Andric         IsMCUABI(CGT.getTarget().getTriple().isOSIAMCU()),
177*06c3fb27SDimitry Andric         IsLinuxABI(CGT.getTarget().getTriple().isOSLinux() ||
178*06c3fb27SDimitry Andric                    CGT.getTarget().getTriple().isOSCygMing()),
179*06c3fb27SDimitry Andric         DefaultNumRegisterParameters(NumRegisterParameters) {}
180*06c3fb27SDimitry Andric };
181*06c3fb27SDimitry Andric 
182*06c3fb27SDimitry Andric class X86_32SwiftABIInfo : public SwiftABIInfo {
183*06c3fb27SDimitry Andric public:
184*06c3fb27SDimitry Andric   explicit X86_32SwiftABIInfo(CodeGenTypes &CGT)
185*06c3fb27SDimitry Andric       : SwiftABIInfo(CGT, /*SwiftErrorInRegister=*/false) {}
186*06c3fb27SDimitry Andric 
187*06c3fb27SDimitry Andric   bool shouldPassIndirectly(ArrayRef<llvm::Type *> ComponentTys,
188*06c3fb27SDimitry Andric                             bool AsReturnValue) const override {
189*06c3fb27SDimitry Andric     // LLVM's x86-32 lowering currently only assigns up to three
190*06c3fb27SDimitry Andric     // integer registers and three fp registers.  Oddly, it'll use up to
191*06c3fb27SDimitry Andric     // four vector registers for vectors, but those can overlap with the
192*06c3fb27SDimitry Andric     // scalar registers.
193*06c3fb27SDimitry Andric     return occupiesMoreThan(ComponentTys, /*total=*/3);
194*06c3fb27SDimitry Andric   }
195*06c3fb27SDimitry Andric };
196*06c3fb27SDimitry Andric 
197*06c3fb27SDimitry Andric class X86_32TargetCodeGenInfo : public TargetCodeGenInfo {
198*06c3fb27SDimitry Andric public:
199*06c3fb27SDimitry Andric   X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool DarwinVectorABI,
200*06c3fb27SDimitry Andric                           bool RetSmallStructInRegABI, bool Win32StructABI,
201*06c3fb27SDimitry Andric                           unsigned NumRegisterParameters, bool SoftFloatABI)
202*06c3fb27SDimitry Andric       : TargetCodeGenInfo(std::make_unique<X86_32ABIInfo>(
203*06c3fb27SDimitry Andric             CGT, DarwinVectorABI, RetSmallStructInRegABI, Win32StructABI,
204*06c3fb27SDimitry Andric             NumRegisterParameters, SoftFloatABI)) {
205*06c3fb27SDimitry Andric     SwiftInfo = std::make_unique<X86_32SwiftABIInfo>(CGT);
206*06c3fb27SDimitry Andric   }
207*06c3fb27SDimitry Andric 
208*06c3fb27SDimitry Andric   static bool isStructReturnInRegABI(
209*06c3fb27SDimitry Andric       const llvm::Triple &Triple, const CodeGenOptions &Opts);
210*06c3fb27SDimitry Andric 
211*06c3fb27SDimitry Andric   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
212*06c3fb27SDimitry Andric                            CodeGen::CodeGenModule &CGM) const override;
213*06c3fb27SDimitry Andric 
214*06c3fb27SDimitry Andric   int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
215*06c3fb27SDimitry Andric     // Darwin uses different dwarf register numbers for EH.
216*06c3fb27SDimitry Andric     if (CGM.getTarget().getTriple().isOSDarwin()) return 5;
217*06c3fb27SDimitry Andric     return 4;
218*06c3fb27SDimitry Andric   }
219*06c3fb27SDimitry Andric 
220*06c3fb27SDimitry Andric   bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
221*06c3fb27SDimitry Andric                                llvm::Value *Address) const override;
222*06c3fb27SDimitry Andric 
223*06c3fb27SDimitry Andric   llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
224*06c3fb27SDimitry Andric                                   StringRef Constraint,
225*06c3fb27SDimitry Andric                                   llvm::Type* Ty) const override {
226*06c3fb27SDimitry Andric     return X86AdjustInlineAsmType(CGF, Constraint, Ty);
227*06c3fb27SDimitry Andric   }
228*06c3fb27SDimitry Andric 
229*06c3fb27SDimitry Andric   void addReturnRegisterOutputs(CodeGenFunction &CGF, LValue ReturnValue,
230*06c3fb27SDimitry Andric                                 std::string &Constraints,
231*06c3fb27SDimitry Andric                                 std::vector<llvm::Type *> &ResultRegTypes,
232*06c3fb27SDimitry Andric                                 std::vector<llvm::Type *> &ResultTruncRegTypes,
233*06c3fb27SDimitry Andric                                 std::vector<LValue> &ResultRegDests,
234*06c3fb27SDimitry Andric                                 std::string &AsmString,
235*06c3fb27SDimitry Andric                                 unsigned NumOutputs) const override;
236*06c3fb27SDimitry Andric 
237*06c3fb27SDimitry Andric   StringRef getARCRetainAutoreleasedReturnValueMarker() const override {
238*06c3fb27SDimitry Andric     return "movl\t%ebp, %ebp"
239*06c3fb27SDimitry Andric            "\t\t// marker for objc_retainAutoreleaseReturnValue";
240*06c3fb27SDimitry Andric   }
241*06c3fb27SDimitry Andric };
242*06c3fb27SDimitry Andric 
243*06c3fb27SDimitry Andric }
244*06c3fb27SDimitry Andric 
245*06c3fb27SDimitry Andric /// Rewrite input constraint references after adding some output constraints.
246*06c3fb27SDimitry Andric /// In the case where there is one output and one input and we add one output,
247*06c3fb27SDimitry Andric /// we need to replace all operand references greater than or equal to 1:
248*06c3fb27SDimitry Andric ///     mov $0, $1
249*06c3fb27SDimitry Andric ///     mov eax, $1
250*06c3fb27SDimitry Andric /// The result will be:
251*06c3fb27SDimitry Andric ///     mov $0, $2
252*06c3fb27SDimitry Andric ///     mov eax, $2
253*06c3fb27SDimitry Andric static void rewriteInputConstraintReferences(unsigned FirstIn,
254*06c3fb27SDimitry Andric                                              unsigned NumNewOuts,
255*06c3fb27SDimitry Andric                                              std::string &AsmString) {
256*06c3fb27SDimitry Andric   std::string Buf;
257*06c3fb27SDimitry Andric   llvm::raw_string_ostream OS(Buf);
258*06c3fb27SDimitry Andric   size_t Pos = 0;
259*06c3fb27SDimitry Andric   while (Pos < AsmString.size()) {
260*06c3fb27SDimitry Andric     size_t DollarStart = AsmString.find('$', Pos);
261*06c3fb27SDimitry Andric     if (DollarStart == std::string::npos)
262*06c3fb27SDimitry Andric       DollarStart = AsmString.size();
263*06c3fb27SDimitry Andric     size_t DollarEnd = AsmString.find_first_not_of('$', DollarStart);
264*06c3fb27SDimitry Andric     if (DollarEnd == std::string::npos)
265*06c3fb27SDimitry Andric       DollarEnd = AsmString.size();
266*06c3fb27SDimitry Andric     OS << StringRef(&AsmString[Pos], DollarEnd - Pos);
267*06c3fb27SDimitry Andric     Pos = DollarEnd;
268*06c3fb27SDimitry Andric     size_t NumDollars = DollarEnd - DollarStart;
269*06c3fb27SDimitry Andric     if (NumDollars % 2 != 0 && Pos < AsmString.size()) {
270*06c3fb27SDimitry Andric       // We have an operand reference.
271*06c3fb27SDimitry Andric       size_t DigitStart = Pos;
272*06c3fb27SDimitry Andric       if (AsmString[DigitStart] == '{') {
273*06c3fb27SDimitry Andric         OS << '{';
274*06c3fb27SDimitry Andric         ++DigitStart;
275*06c3fb27SDimitry Andric       }
276*06c3fb27SDimitry Andric       size_t DigitEnd = AsmString.find_first_not_of("0123456789", DigitStart);
277*06c3fb27SDimitry Andric       if (DigitEnd == std::string::npos)
278*06c3fb27SDimitry Andric         DigitEnd = AsmString.size();
279*06c3fb27SDimitry Andric       StringRef OperandStr(&AsmString[DigitStart], DigitEnd - DigitStart);
280*06c3fb27SDimitry Andric       unsigned OperandIndex;
281*06c3fb27SDimitry Andric       if (!OperandStr.getAsInteger(10, OperandIndex)) {
282*06c3fb27SDimitry Andric         if (OperandIndex >= FirstIn)
283*06c3fb27SDimitry Andric           OperandIndex += NumNewOuts;
284*06c3fb27SDimitry Andric         OS << OperandIndex;
285*06c3fb27SDimitry Andric       } else {
286*06c3fb27SDimitry Andric         OS << OperandStr;
287*06c3fb27SDimitry Andric       }
288*06c3fb27SDimitry Andric       Pos = DigitEnd;
289*06c3fb27SDimitry Andric     }
290*06c3fb27SDimitry Andric   }
291*06c3fb27SDimitry Andric   AsmString = std::move(OS.str());
292*06c3fb27SDimitry Andric }
293*06c3fb27SDimitry Andric 
294*06c3fb27SDimitry Andric /// Add output constraints for EAX:EDX because they are return registers.
295*06c3fb27SDimitry Andric void X86_32TargetCodeGenInfo::addReturnRegisterOutputs(
296*06c3fb27SDimitry Andric     CodeGenFunction &CGF, LValue ReturnSlot, std::string &Constraints,
297*06c3fb27SDimitry Andric     std::vector<llvm::Type *> &ResultRegTypes,
298*06c3fb27SDimitry Andric     std::vector<llvm::Type *> &ResultTruncRegTypes,
299*06c3fb27SDimitry Andric     std::vector<LValue> &ResultRegDests, std::string &AsmString,
300*06c3fb27SDimitry Andric     unsigned NumOutputs) const {
301*06c3fb27SDimitry Andric   uint64_t RetWidth = CGF.getContext().getTypeSize(ReturnSlot.getType());
302*06c3fb27SDimitry Andric 
303*06c3fb27SDimitry Andric   // Use the EAX constraint if the width is 32 or smaller and EAX:EDX if it is
304*06c3fb27SDimitry Andric   // larger.
305*06c3fb27SDimitry Andric   if (!Constraints.empty())
306*06c3fb27SDimitry Andric     Constraints += ',';
307*06c3fb27SDimitry Andric   if (RetWidth <= 32) {
308*06c3fb27SDimitry Andric     Constraints += "={eax}";
309*06c3fb27SDimitry Andric     ResultRegTypes.push_back(CGF.Int32Ty);
310*06c3fb27SDimitry Andric   } else {
311*06c3fb27SDimitry Andric     // Use the 'A' constraint for EAX:EDX.
312*06c3fb27SDimitry Andric     Constraints += "=A";
313*06c3fb27SDimitry Andric     ResultRegTypes.push_back(CGF.Int64Ty);
314*06c3fb27SDimitry Andric   }
315*06c3fb27SDimitry Andric 
316*06c3fb27SDimitry Andric   // Truncate EAX or EAX:EDX to an integer of the appropriate size.
317*06c3fb27SDimitry Andric   llvm::Type *CoerceTy = llvm::IntegerType::get(CGF.getLLVMContext(), RetWidth);
318*06c3fb27SDimitry Andric   ResultTruncRegTypes.push_back(CoerceTy);
319*06c3fb27SDimitry Andric 
320*06c3fb27SDimitry Andric   // Coerce the integer by bitcasting the return slot pointer.
321*06c3fb27SDimitry Andric   ReturnSlot.setAddress(ReturnSlot.getAddress(CGF).withElementType(CoerceTy));
322*06c3fb27SDimitry Andric   ResultRegDests.push_back(ReturnSlot);
323*06c3fb27SDimitry Andric 
324*06c3fb27SDimitry Andric   rewriteInputConstraintReferences(NumOutputs, 1, AsmString);
325*06c3fb27SDimitry Andric }
326*06c3fb27SDimitry Andric 
327*06c3fb27SDimitry Andric /// shouldReturnTypeInRegister - Determine if the given type should be
328*06c3fb27SDimitry Andric /// returned in a register (for the Darwin and MCU ABI).
329*06c3fb27SDimitry Andric bool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty,
330*06c3fb27SDimitry Andric                                                ASTContext &Context) const {
331*06c3fb27SDimitry Andric   uint64_t Size = Context.getTypeSize(Ty);
332*06c3fb27SDimitry Andric 
333*06c3fb27SDimitry Andric   // For i386, type must be register sized.
334*06c3fb27SDimitry Andric   // For the MCU ABI, it only needs to be <= 8-byte
335*06c3fb27SDimitry Andric   if ((IsMCUABI && Size > 64) || (!IsMCUABI && !isRegisterSize(Size)))
336*06c3fb27SDimitry Andric    return false;
337*06c3fb27SDimitry Andric 
338*06c3fb27SDimitry Andric   if (Ty->isVectorType()) {
339*06c3fb27SDimitry Andric     // 64- and 128- bit vectors inside structures are not returned in
340*06c3fb27SDimitry Andric     // registers.
341*06c3fb27SDimitry Andric     if (Size == 64 || Size == 128)
342*06c3fb27SDimitry Andric       return false;
343*06c3fb27SDimitry Andric 
344*06c3fb27SDimitry Andric     return true;
345*06c3fb27SDimitry Andric   }
346*06c3fb27SDimitry Andric 
347*06c3fb27SDimitry Andric   // If this is a builtin, pointer, enum, complex type, member pointer, or
348*06c3fb27SDimitry Andric   // member function pointer it is ok.
349*06c3fb27SDimitry Andric   if (Ty->getAs<BuiltinType>() || Ty->hasPointerRepresentation() ||
350*06c3fb27SDimitry Andric       Ty->isAnyComplexType() || Ty->isEnumeralType() ||
351*06c3fb27SDimitry Andric       Ty->isBlockPointerType() || Ty->isMemberPointerType())
352*06c3fb27SDimitry Andric     return true;
353*06c3fb27SDimitry Andric 
354*06c3fb27SDimitry Andric   // Arrays are treated like records.
355*06c3fb27SDimitry Andric   if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty))
356*06c3fb27SDimitry Andric     return shouldReturnTypeInRegister(AT->getElementType(), Context);
357*06c3fb27SDimitry Andric 
358*06c3fb27SDimitry Andric   // Otherwise, it must be a record type.
359*06c3fb27SDimitry Andric   const RecordType *RT = Ty->getAs<RecordType>();
360*06c3fb27SDimitry Andric   if (!RT) return false;
361*06c3fb27SDimitry Andric 
362*06c3fb27SDimitry Andric   // FIXME: Traverse bases here too.
363*06c3fb27SDimitry Andric 
364*06c3fb27SDimitry Andric   // Structure types are passed in register if all fields would be
365*06c3fb27SDimitry Andric   // passed in a register.
366*06c3fb27SDimitry Andric   for (const auto *FD : RT->getDecl()->fields()) {
367*06c3fb27SDimitry Andric     // Empty fields are ignored.
368*06c3fb27SDimitry Andric     if (isEmptyField(Context, FD, true))
369*06c3fb27SDimitry Andric       continue;
370*06c3fb27SDimitry Andric 
371*06c3fb27SDimitry Andric     // Check fields recursively.
372*06c3fb27SDimitry Andric     if (!shouldReturnTypeInRegister(FD->getType(), Context))
373*06c3fb27SDimitry Andric       return false;
374*06c3fb27SDimitry Andric   }
375*06c3fb27SDimitry Andric   return true;
376*06c3fb27SDimitry Andric }
377*06c3fb27SDimitry Andric 
378*06c3fb27SDimitry Andric static bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
379*06c3fb27SDimitry Andric   // Treat complex types as the element type.
380*06c3fb27SDimitry Andric   if (const ComplexType *CTy = Ty->getAs<ComplexType>())
381*06c3fb27SDimitry Andric     Ty = CTy->getElementType();
382*06c3fb27SDimitry Andric 
383*06c3fb27SDimitry Andric   // Check for a type which we know has a simple scalar argument-passing
384*06c3fb27SDimitry Andric   // convention without any padding.  (We're specifically looking for 32
385*06c3fb27SDimitry Andric   // and 64-bit integer and integer-equivalents, float, and double.)
386*06c3fb27SDimitry Andric   if (!Ty->getAs<BuiltinType>() && !Ty->hasPointerRepresentation() &&
387*06c3fb27SDimitry Andric       !Ty->isEnumeralType() && !Ty->isBlockPointerType())
388*06c3fb27SDimitry Andric     return false;
389*06c3fb27SDimitry Andric 
390*06c3fb27SDimitry Andric   uint64_t Size = Context.getTypeSize(Ty);
391*06c3fb27SDimitry Andric   return Size == 32 || Size == 64;
392*06c3fb27SDimitry Andric }
393*06c3fb27SDimitry Andric 
394*06c3fb27SDimitry Andric static bool addFieldSizes(ASTContext &Context, const RecordDecl *RD,
395*06c3fb27SDimitry Andric                           uint64_t &Size) {
396*06c3fb27SDimitry Andric   for (const auto *FD : RD->fields()) {
397*06c3fb27SDimitry Andric     // Scalar arguments on the stack get 4 byte alignment on x86. If the
398*06c3fb27SDimitry Andric     // argument is smaller than 32-bits, expanding the struct will create
399*06c3fb27SDimitry Andric     // alignment padding.
400*06c3fb27SDimitry Andric     if (!is32Or64BitBasicType(FD->getType(), Context))
401*06c3fb27SDimitry Andric       return false;
402*06c3fb27SDimitry Andric 
403*06c3fb27SDimitry Andric     // FIXME: Reject bit-fields wholesale; there are two problems, we don't know
404*06c3fb27SDimitry Andric     // how to expand them yet, and the predicate for telling if a bitfield still
405*06c3fb27SDimitry Andric     // counts as "basic" is more complicated than what we were doing previously.
406*06c3fb27SDimitry Andric     if (FD->isBitField())
407*06c3fb27SDimitry Andric       return false;
408*06c3fb27SDimitry Andric 
409*06c3fb27SDimitry Andric     Size += Context.getTypeSize(FD->getType());
410*06c3fb27SDimitry Andric   }
411*06c3fb27SDimitry Andric   return true;
412*06c3fb27SDimitry Andric }
413*06c3fb27SDimitry Andric 
414*06c3fb27SDimitry Andric static bool addBaseAndFieldSizes(ASTContext &Context, const CXXRecordDecl *RD,
415*06c3fb27SDimitry Andric                                  uint64_t &Size) {
416*06c3fb27SDimitry Andric   // Don't do this if there are any non-empty bases.
417*06c3fb27SDimitry Andric   for (const CXXBaseSpecifier &Base : RD->bases()) {
418*06c3fb27SDimitry Andric     if (!addBaseAndFieldSizes(Context, Base.getType()->getAsCXXRecordDecl(),
419*06c3fb27SDimitry Andric                               Size))
420*06c3fb27SDimitry Andric       return false;
421*06c3fb27SDimitry Andric   }
422*06c3fb27SDimitry Andric   if (!addFieldSizes(Context, RD, Size))
423*06c3fb27SDimitry Andric     return false;
424*06c3fb27SDimitry Andric   return true;
425*06c3fb27SDimitry Andric }
426*06c3fb27SDimitry Andric 
427*06c3fb27SDimitry Andric /// Test whether an argument type which is to be passed indirectly (on the
428*06c3fb27SDimitry Andric /// stack) would have the equivalent layout if it was expanded into separate
429*06c3fb27SDimitry Andric /// arguments. If so, we prefer to do the latter to avoid inhibiting
430*06c3fb27SDimitry Andric /// optimizations.
431*06c3fb27SDimitry Andric bool X86_32ABIInfo::canExpandIndirectArgument(QualType Ty) const {
432*06c3fb27SDimitry Andric   // We can only expand structure types.
433*06c3fb27SDimitry Andric   const RecordType *RT = Ty->getAs<RecordType>();
434*06c3fb27SDimitry Andric   if (!RT)
435*06c3fb27SDimitry Andric     return false;
436*06c3fb27SDimitry Andric   const RecordDecl *RD = RT->getDecl();
437*06c3fb27SDimitry Andric   uint64_t Size = 0;
438*06c3fb27SDimitry Andric   if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
439*06c3fb27SDimitry Andric     if (!IsWin32StructABI) {
440*06c3fb27SDimitry Andric       // On non-Windows, we have to conservatively match our old bitcode
441*06c3fb27SDimitry Andric       // prototypes in order to be ABI-compatible at the bitcode level.
442*06c3fb27SDimitry Andric       if (!CXXRD->isCLike())
443*06c3fb27SDimitry Andric         return false;
444*06c3fb27SDimitry Andric     } else {
445*06c3fb27SDimitry Andric       // Don't do this for dynamic classes.
446*06c3fb27SDimitry Andric       if (CXXRD->isDynamicClass())
447*06c3fb27SDimitry Andric         return false;
448*06c3fb27SDimitry Andric     }
449*06c3fb27SDimitry Andric     if (!addBaseAndFieldSizes(getContext(), CXXRD, Size))
450*06c3fb27SDimitry Andric       return false;
451*06c3fb27SDimitry Andric   } else {
452*06c3fb27SDimitry Andric     if (!addFieldSizes(getContext(), RD, Size))
453*06c3fb27SDimitry Andric       return false;
454*06c3fb27SDimitry Andric   }
455*06c3fb27SDimitry Andric 
456*06c3fb27SDimitry Andric   // We can do this if there was no alignment padding.
457*06c3fb27SDimitry Andric   return Size == getContext().getTypeSize(Ty);
458*06c3fb27SDimitry Andric }
459*06c3fb27SDimitry Andric 
460*06c3fb27SDimitry Andric ABIArgInfo X86_32ABIInfo::getIndirectReturnResult(QualType RetTy, CCState &State) const {
461*06c3fb27SDimitry Andric   // If the return value is indirect, then the hidden argument is consuming one
462*06c3fb27SDimitry Andric   // integer register.
463*06c3fb27SDimitry Andric   if (State.FreeRegs) {
464*06c3fb27SDimitry Andric     --State.FreeRegs;
465*06c3fb27SDimitry Andric     if (!IsMCUABI)
466*06c3fb27SDimitry Andric       return getNaturalAlignIndirectInReg(RetTy);
467*06c3fb27SDimitry Andric   }
468*06c3fb27SDimitry Andric   return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
469*06c3fb27SDimitry Andric }
470*06c3fb27SDimitry Andric 
471*06c3fb27SDimitry Andric ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
472*06c3fb27SDimitry Andric                                              CCState &State) const {
473*06c3fb27SDimitry Andric   if (RetTy->isVoidType())
474*06c3fb27SDimitry Andric     return ABIArgInfo::getIgnore();
475*06c3fb27SDimitry Andric 
476*06c3fb27SDimitry Andric   const Type *Base = nullptr;
477*06c3fb27SDimitry Andric   uint64_t NumElts = 0;
478*06c3fb27SDimitry Andric   if ((State.CC == llvm::CallingConv::X86_VectorCall ||
479*06c3fb27SDimitry Andric        State.CC == llvm::CallingConv::X86_RegCall) &&
480*06c3fb27SDimitry Andric       isHomogeneousAggregate(RetTy, Base, NumElts)) {
481*06c3fb27SDimitry Andric     // The LLVM struct type for such an aggregate should lower properly.
482*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
483*06c3fb27SDimitry Andric   }
484*06c3fb27SDimitry Andric 
485*06c3fb27SDimitry Andric   if (const VectorType *VT = RetTy->getAs<VectorType>()) {
486*06c3fb27SDimitry Andric     // On Darwin, some vectors are returned in registers.
487*06c3fb27SDimitry Andric     if (IsDarwinVectorABI) {
488*06c3fb27SDimitry Andric       uint64_t Size = getContext().getTypeSize(RetTy);
489*06c3fb27SDimitry Andric 
490*06c3fb27SDimitry Andric       // 128-bit vectors are a special case; they are returned in
491*06c3fb27SDimitry Andric       // registers and we need to make sure to pick a type the LLVM
492*06c3fb27SDimitry Andric       // backend will like.
493*06c3fb27SDimitry Andric       if (Size == 128)
494*06c3fb27SDimitry Andric         return ABIArgInfo::getDirect(llvm::FixedVectorType::get(
495*06c3fb27SDimitry Andric             llvm::Type::getInt64Ty(getVMContext()), 2));
496*06c3fb27SDimitry Andric 
497*06c3fb27SDimitry Andric       // Always return in register if it fits in a general purpose
498*06c3fb27SDimitry Andric       // register, or if it is 64 bits and has a single element.
499*06c3fb27SDimitry Andric       if ((Size == 8 || Size == 16 || Size == 32) ||
500*06c3fb27SDimitry Andric           (Size == 64 && VT->getNumElements() == 1))
501*06c3fb27SDimitry Andric         return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
502*06c3fb27SDimitry Andric                                                             Size));
503*06c3fb27SDimitry Andric 
504*06c3fb27SDimitry Andric       return getIndirectReturnResult(RetTy, State);
505*06c3fb27SDimitry Andric     }
506*06c3fb27SDimitry Andric 
507*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
508*06c3fb27SDimitry Andric   }
509*06c3fb27SDimitry Andric 
510*06c3fb27SDimitry Andric   if (isAggregateTypeForABI(RetTy)) {
511*06c3fb27SDimitry Andric     if (const RecordType *RT = RetTy->getAs<RecordType>()) {
512*06c3fb27SDimitry Andric       // Structures with flexible arrays are always indirect.
513*06c3fb27SDimitry Andric       if (RT->getDecl()->hasFlexibleArrayMember())
514*06c3fb27SDimitry Andric         return getIndirectReturnResult(RetTy, State);
515*06c3fb27SDimitry Andric     }
516*06c3fb27SDimitry Andric 
517*06c3fb27SDimitry Andric     // If specified, structs and unions are always indirect.
518*06c3fb27SDimitry Andric     if (!IsRetSmallStructInRegABI && !RetTy->isAnyComplexType())
519*06c3fb27SDimitry Andric       return getIndirectReturnResult(RetTy, State);
520*06c3fb27SDimitry Andric 
521*06c3fb27SDimitry Andric     // Ignore empty structs/unions.
522*06c3fb27SDimitry Andric     if (isEmptyRecord(getContext(), RetTy, true))
523*06c3fb27SDimitry Andric       return ABIArgInfo::getIgnore();
524*06c3fb27SDimitry Andric 
525*06c3fb27SDimitry Andric     // Return complex of _Float16 as <2 x half> so the backend will use xmm0.
526*06c3fb27SDimitry Andric     if (const ComplexType *CT = RetTy->getAs<ComplexType>()) {
527*06c3fb27SDimitry Andric       QualType ET = getContext().getCanonicalType(CT->getElementType());
528*06c3fb27SDimitry Andric       if (ET->isFloat16Type())
529*06c3fb27SDimitry Andric         return ABIArgInfo::getDirect(llvm::FixedVectorType::get(
530*06c3fb27SDimitry Andric             llvm::Type::getHalfTy(getVMContext()), 2));
531*06c3fb27SDimitry Andric     }
532*06c3fb27SDimitry Andric 
533*06c3fb27SDimitry Andric     // Small structures which are register sized are generally returned
534*06c3fb27SDimitry Andric     // in a register.
535*06c3fb27SDimitry Andric     if (shouldReturnTypeInRegister(RetTy, getContext())) {
536*06c3fb27SDimitry Andric       uint64_t Size = getContext().getTypeSize(RetTy);
537*06c3fb27SDimitry Andric 
538*06c3fb27SDimitry Andric       // As a special-case, if the struct is a "single-element" struct, and
539*06c3fb27SDimitry Andric       // the field is of type "float" or "double", return it in a
540*06c3fb27SDimitry Andric       // floating-point register. (MSVC does not apply this special case.)
541*06c3fb27SDimitry Andric       // We apply a similar transformation for pointer types to improve the
542*06c3fb27SDimitry Andric       // quality of the generated IR.
543*06c3fb27SDimitry Andric       if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext()))
544*06c3fb27SDimitry Andric         if ((!IsWin32StructABI && SeltTy->isRealFloatingType())
545*06c3fb27SDimitry Andric             || SeltTy->hasPointerRepresentation())
546*06c3fb27SDimitry Andric           return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
547*06c3fb27SDimitry Andric 
548*06c3fb27SDimitry Andric       // FIXME: We should be able to narrow this integer in cases with dead
549*06c3fb27SDimitry Andric       // padding.
550*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),Size));
551*06c3fb27SDimitry Andric     }
552*06c3fb27SDimitry Andric 
553*06c3fb27SDimitry Andric     return getIndirectReturnResult(RetTy, State);
554*06c3fb27SDimitry Andric   }
555*06c3fb27SDimitry Andric 
556*06c3fb27SDimitry Andric   // Treat an enum type as its underlying type.
557*06c3fb27SDimitry Andric   if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
558*06c3fb27SDimitry Andric     RetTy = EnumTy->getDecl()->getIntegerType();
559*06c3fb27SDimitry Andric 
560*06c3fb27SDimitry Andric   if (const auto *EIT = RetTy->getAs<BitIntType>())
561*06c3fb27SDimitry Andric     if (EIT->getNumBits() > 64)
562*06c3fb27SDimitry Andric       return getIndirectReturnResult(RetTy, State);
563*06c3fb27SDimitry Andric 
564*06c3fb27SDimitry Andric   return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
565*06c3fb27SDimitry Andric                                                : ABIArgInfo::getDirect());
566*06c3fb27SDimitry Andric }
567*06c3fb27SDimitry Andric 
568*06c3fb27SDimitry Andric unsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty,
569*06c3fb27SDimitry Andric                                                  unsigned Align) const {
570*06c3fb27SDimitry Andric   // Otherwise, if the alignment is less than or equal to the minimum ABI
571*06c3fb27SDimitry Andric   // alignment, just use the default; the backend will handle this.
572*06c3fb27SDimitry Andric   if (Align <= MinABIStackAlignInBytes)
573*06c3fb27SDimitry Andric     return 0; // Use default alignment.
574*06c3fb27SDimitry Andric 
575*06c3fb27SDimitry Andric   if (IsLinuxABI) {
576*06c3fb27SDimitry Andric     // Exclude other System V OS (e.g Darwin, PS4 and FreeBSD) since we don't
577*06c3fb27SDimitry Andric     // want to spend any effort dealing with the ramifications of ABI breaks.
578*06c3fb27SDimitry Andric     //
579*06c3fb27SDimitry Andric     // If the vector type is __m128/__m256/__m512, return the default alignment.
580*06c3fb27SDimitry Andric     if (Ty->isVectorType() && (Align == 16 || Align == 32 || Align == 64))
581*06c3fb27SDimitry Andric       return Align;
582*06c3fb27SDimitry Andric   }
583*06c3fb27SDimitry Andric   // On non-Darwin, the stack type alignment is always 4.
584*06c3fb27SDimitry Andric   if (!IsDarwinVectorABI) {
585*06c3fb27SDimitry Andric     // Set explicit alignment, since we may need to realign the top.
586*06c3fb27SDimitry Andric     return MinABIStackAlignInBytes;
587*06c3fb27SDimitry Andric   }
588*06c3fb27SDimitry Andric 
589*06c3fb27SDimitry Andric   // Otherwise, if the type contains an SSE vector type, the alignment is 16.
590*06c3fb27SDimitry Andric   if (Align >= 16 && (isSIMDVectorType(getContext(), Ty) ||
591*06c3fb27SDimitry Andric                       isRecordWithSIMDVectorType(getContext(), Ty)))
592*06c3fb27SDimitry Andric     return 16;
593*06c3fb27SDimitry Andric 
594*06c3fb27SDimitry Andric   return MinABIStackAlignInBytes;
595*06c3fb27SDimitry Andric }
596*06c3fb27SDimitry Andric 
597*06c3fb27SDimitry Andric ABIArgInfo X86_32ABIInfo::getIndirectResult(QualType Ty, bool ByVal,
598*06c3fb27SDimitry Andric                                             CCState &State) const {
599*06c3fb27SDimitry Andric   if (!ByVal) {
600*06c3fb27SDimitry Andric     if (State.FreeRegs) {
601*06c3fb27SDimitry Andric       --State.FreeRegs; // Non-byval indirects just use one pointer.
602*06c3fb27SDimitry Andric       if (!IsMCUABI)
603*06c3fb27SDimitry Andric         return getNaturalAlignIndirectInReg(Ty);
604*06c3fb27SDimitry Andric     }
605*06c3fb27SDimitry Andric     return getNaturalAlignIndirect(Ty, false);
606*06c3fb27SDimitry Andric   }
607*06c3fb27SDimitry Andric 
608*06c3fb27SDimitry Andric   // Compute the byval alignment.
609*06c3fb27SDimitry Andric   unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
610*06c3fb27SDimitry Andric   unsigned StackAlign = getTypeStackAlignInBytes(Ty, TypeAlign);
611*06c3fb27SDimitry Andric   if (StackAlign == 0)
612*06c3fb27SDimitry Andric     return ABIArgInfo::getIndirect(CharUnits::fromQuantity(4), /*ByVal=*/true);
613*06c3fb27SDimitry Andric 
614*06c3fb27SDimitry Andric   // If the stack alignment is less than the type alignment, realign the
615*06c3fb27SDimitry Andric   // argument.
616*06c3fb27SDimitry Andric   bool Realign = TypeAlign > StackAlign;
617*06c3fb27SDimitry Andric   return ABIArgInfo::getIndirect(CharUnits::fromQuantity(StackAlign),
618*06c3fb27SDimitry Andric                                  /*ByVal=*/true, Realign);
619*06c3fb27SDimitry Andric }
620*06c3fb27SDimitry Andric 
621*06c3fb27SDimitry Andric X86_32ABIInfo::Class X86_32ABIInfo::classify(QualType Ty) const {
622*06c3fb27SDimitry Andric   const Type *T = isSingleElementStruct(Ty, getContext());
623*06c3fb27SDimitry Andric   if (!T)
624*06c3fb27SDimitry Andric     T = Ty.getTypePtr();
625*06c3fb27SDimitry Andric 
626*06c3fb27SDimitry Andric   if (const BuiltinType *BT = T->getAs<BuiltinType>()) {
627*06c3fb27SDimitry Andric     BuiltinType::Kind K = BT->getKind();
628*06c3fb27SDimitry Andric     if (K == BuiltinType::Float || K == BuiltinType::Double)
629*06c3fb27SDimitry Andric       return Float;
630*06c3fb27SDimitry Andric   }
631*06c3fb27SDimitry Andric   return Integer;
632*06c3fb27SDimitry Andric }
633*06c3fb27SDimitry Andric 
634*06c3fb27SDimitry Andric bool X86_32ABIInfo::updateFreeRegs(QualType Ty, CCState &State) const {
635*06c3fb27SDimitry Andric   if (!IsSoftFloatABI) {
636*06c3fb27SDimitry Andric     Class C = classify(Ty);
637*06c3fb27SDimitry Andric     if (C == Float)
638*06c3fb27SDimitry Andric       return false;
639*06c3fb27SDimitry Andric   }
640*06c3fb27SDimitry Andric 
641*06c3fb27SDimitry Andric   unsigned Size = getContext().getTypeSize(Ty);
642*06c3fb27SDimitry Andric   unsigned SizeInRegs = (Size + 31) / 32;
643*06c3fb27SDimitry Andric 
644*06c3fb27SDimitry Andric   if (SizeInRegs == 0)
645*06c3fb27SDimitry Andric     return false;
646*06c3fb27SDimitry Andric 
647*06c3fb27SDimitry Andric   if (!IsMCUABI) {
648*06c3fb27SDimitry Andric     if (SizeInRegs > State.FreeRegs) {
649*06c3fb27SDimitry Andric       State.FreeRegs = 0;
650*06c3fb27SDimitry Andric       return false;
651*06c3fb27SDimitry Andric     }
652*06c3fb27SDimitry Andric   } else {
653*06c3fb27SDimitry Andric     // The MCU psABI allows passing parameters in-reg even if there are
654*06c3fb27SDimitry Andric     // earlier parameters that are passed on the stack. Also,
655*06c3fb27SDimitry Andric     // it does not allow passing >8-byte structs in-register,
656*06c3fb27SDimitry Andric     // even if there are 3 free registers available.
657*06c3fb27SDimitry Andric     if (SizeInRegs > State.FreeRegs || SizeInRegs > 2)
658*06c3fb27SDimitry Andric       return false;
659*06c3fb27SDimitry Andric   }
660*06c3fb27SDimitry Andric 
661*06c3fb27SDimitry Andric   State.FreeRegs -= SizeInRegs;
662*06c3fb27SDimitry Andric   return true;
663*06c3fb27SDimitry Andric }
664*06c3fb27SDimitry Andric 
665*06c3fb27SDimitry Andric bool X86_32ABIInfo::shouldAggregateUseDirect(QualType Ty, CCState &State,
666*06c3fb27SDimitry Andric                                              bool &InReg,
667*06c3fb27SDimitry Andric                                              bool &NeedsPadding) const {
668*06c3fb27SDimitry Andric   // On Windows, aggregates other than HFAs are never passed in registers, and
669*06c3fb27SDimitry Andric   // they do not consume register slots. Homogenous floating-point aggregates
670*06c3fb27SDimitry Andric   // (HFAs) have already been dealt with at this point.
671*06c3fb27SDimitry Andric   if (IsWin32StructABI && isAggregateTypeForABI(Ty))
672*06c3fb27SDimitry Andric     return false;
673*06c3fb27SDimitry Andric 
674*06c3fb27SDimitry Andric   NeedsPadding = false;
675*06c3fb27SDimitry Andric   InReg = !IsMCUABI;
676*06c3fb27SDimitry Andric 
677*06c3fb27SDimitry Andric   if (!updateFreeRegs(Ty, State))
678*06c3fb27SDimitry Andric     return false;
679*06c3fb27SDimitry Andric 
680*06c3fb27SDimitry Andric   if (IsMCUABI)
681*06c3fb27SDimitry Andric     return true;
682*06c3fb27SDimitry Andric 
683*06c3fb27SDimitry Andric   if (State.CC == llvm::CallingConv::X86_FastCall ||
684*06c3fb27SDimitry Andric       State.CC == llvm::CallingConv::X86_VectorCall ||
685*06c3fb27SDimitry Andric       State.CC == llvm::CallingConv::X86_RegCall) {
686*06c3fb27SDimitry Andric     if (getContext().getTypeSize(Ty) <= 32 && State.FreeRegs)
687*06c3fb27SDimitry Andric       NeedsPadding = true;
688*06c3fb27SDimitry Andric 
689*06c3fb27SDimitry Andric     return false;
690*06c3fb27SDimitry Andric   }
691*06c3fb27SDimitry Andric 
692*06c3fb27SDimitry Andric   return true;
693*06c3fb27SDimitry Andric }
694*06c3fb27SDimitry Andric 
695*06c3fb27SDimitry Andric bool X86_32ABIInfo::shouldPrimitiveUseInReg(QualType Ty, CCState &State) const {
696*06c3fb27SDimitry Andric   bool IsPtrOrInt = (getContext().getTypeSize(Ty) <= 32) &&
697*06c3fb27SDimitry Andric                     (Ty->isIntegralOrEnumerationType() || Ty->isPointerType() ||
698*06c3fb27SDimitry Andric                      Ty->isReferenceType());
699*06c3fb27SDimitry Andric 
700*06c3fb27SDimitry Andric   if (!IsPtrOrInt && (State.CC == llvm::CallingConv::X86_FastCall ||
701*06c3fb27SDimitry Andric                       State.CC == llvm::CallingConv::X86_VectorCall))
702*06c3fb27SDimitry Andric     return false;
703*06c3fb27SDimitry Andric 
704*06c3fb27SDimitry Andric   if (!updateFreeRegs(Ty, State))
705*06c3fb27SDimitry Andric     return false;
706*06c3fb27SDimitry Andric 
707*06c3fb27SDimitry Andric   if (!IsPtrOrInt && State.CC == llvm::CallingConv::X86_RegCall)
708*06c3fb27SDimitry Andric     return false;
709*06c3fb27SDimitry Andric 
710*06c3fb27SDimitry Andric   // Return true to apply inreg to all legal parameters except for MCU targets.
711*06c3fb27SDimitry Andric   return !IsMCUABI;
712*06c3fb27SDimitry Andric }
713*06c3fb27SDimitry Andric 
714*06c3fb27SDimitry Andric void X86_32ABIInfo::runVectorCallFirstPass(CGFunctionInfo &FI, CCState &State) const {
715*06c3fb27SDimitry Andric   // Vectorcall x86 works subtly different than in x64, so the format is
716*06c3fb27SDimitry Andric   // a bit different than the x64 version.  First, all vector types (not HVAs)
717*06c3fb27SDimitry Andric   // are assigned, with the first 6 ending up in the [XYZ]MM0-5 registers.
718*06c3fb27SDimitry Andric   // This differs from the x64 implementation, where the first 6 by INDEX get
719*06c3fb27SDimitry Andric   // registers.
720*06c3fb27SDimitry Andric   // In the second pass over the arguments, HVAs are passed in the remaining
721*06c3fb27SDimitry Andric   // vector registers if possible, or indirectly by address. The address will be
722*06c3fb27SDimitry Andric   // passed in ECX/EDX if available. Any other arguments are passed according to
723*06c3fb27SDimitry Andric   // the usual fastcall rules.
724*06c3fb27SDimitry Andric   MutableArrayRef<CGFunctionInfoArgInfo> Args = FI.arguments();
725*06c3fb27SDimitry Andric   for (int I = 0, E = Args.size(); I < E; ++I) {
726*06c3fb27SDimitry Andric     const Type *Base = nullptr;
727*06c3fb27SDimitry Andric     uint64_t NumElts = 0;
728*06c3fb27SDimitry Andric     const QualType &Ty = Args[I].type;
729*06c3fb27SDimitry Andric     if ((Ty->isVectorType() || Ty->isBuiltinType()) &&
730*06c3fb27SDimitry Andric         isHomogeneousAggregate(Ty, Base, NumElts)) {
731*06c3fb27SDimitry Andric       if (State.FreeSSERegs >= NumElts) {
732*06c3fb27SDimitry Andric         State.FreeSSERegs -= NumElts;
733*06c3fb27SDimitry Andric         Args[I].info = ABIArgInfo::getDirectInReg();
734*06c3fb27SDimitry Andric         State.IsPreassigned.set(I);
735*06c3fb27SDimitry Andric       }
736*06c3fb27SDimitry Andric     }
737*06c3fb27SDimitry Andric   }
738*06c3fb27SDimitry Andric }
739*06c3fb27SDimitry Andric 
740*06c3fb27SDimitry Andric ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
741*06c3fb27SDimitry Andric                                                CCState &State) const {
742*06c3fb27SDimitry Andric   // FIXME: Set alignment on indirect arguments.
743*06c3fb27SDimitry Andric   bool IsFastCall = State.CC == llvm::CallingConv::X86_FastCall;
744*06c3fb27SDimitry Andric   bool IsRegCall = State.CC == llvm::CallingConv::X86_RegCall;
745*06c3fb27SDimitry Andric   bool IsVectorCall = State.CC == llvm::CallingConv::X86_VectorCall;
746*06c3fb27SDimitry Andric 
747*06c3fb27SDimitry Andric   Ty = useFirstFieldIfTransparentUnion(Ty);
748*06c3fb27SDimitry Andric   TypeInfo TI = getContext().getTypeInfo(Ty);
749*06c3fb27SDimitry Andric 
750*06c3fb27SDimitry Andric   // Check with the C++ ABI first.
751*06c3fb27SDimitry Andric   const RecordType *RT = Ty->getAs<RecordType>();
752*06c3fb27SDimitry Andric   if (RT) {
753*06c3fb27SDimitry Andric     CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI());
754*06c3fb27SDimitry Andric     if (RAA == CGCXXABI::RAA_Indirect) {
755*06c3fb27SDimitry Andric       return getIndirectResult(Ty, false, State);
756*06c3fb27SDimitry Andric     } else if (RAA == CGCXXABI::RAA_DirectInMemory) {
757*06c3fb27SDimitry Andric       // The field index doesn't matter, we'll fix it up later.
758*06c3fb27SDimitry Andric       return ABIArgInfo::getInAlloca(/*FieldIndex=*/0);
759*06c3fb27SDimitry Andric     }
760*06c3fb27SDimitry Andric   }
761*06c3fb27SDimitry Andric 
762*06c3fb27SDimitry Andric   // Regcall uses the concept of a homogenous vector aggregate, similar
763*06c3fb27SDimitry Andric   // to other targets.
764*06c3fb27SDimitry Andric   const Type *Base = nullptr;
765*06c3fb27SDimitry Andric   uint64_t NumElts = 0;
766*06c3fb27SDimitry Andric   if ((IsRegCall || IsVectorCall) &&
767*06c3fb27SDimitry Andric       isHomogeneousAggregate(Ty, Base, NumElts)) {
768*06c3fb27SDimitry Andric     if (State.FreeSSERegs >= NumElts) {
769*06c3fb27SDimitry Andric       State.FreeSSERegs -= NumElts;
770*06c3fb27SDimitry Andric 
771*06c3fb27SDimitry Andric       // Vectorcall passes HVAs directly and does not flatten them, but regcall
772*06c3fb27SDimitry Andric       // does.
773*06c3fb27SDimitry Andric       if (IsVectorCall)
774*06c3fb27SDimitry Andric         return getDirectX86Hva();
775*06c3fb27SDimitry Andric 
776*06c3fb27SDimitry Andric       if (Ty->isBuiltinType() || Ty->isVectorType())
777*06c3fb27SDimitry Andric         return ABIArgInfo::getDirect();
778*06c3fb27SDimitry Andric       return ABIArgInfo::getExpand();
779*06c3fb27SDimitry Andric     }
780*06c3fb27SDimitry Andric     return getIndirectResult(Ty, /*ByVal=*/false, State);
781*06c3fb27SDimitry Andric   }
782*06c3fb27SDimitry Andric 
783*06c3fb27SDimitry Andric   if (isAggregateTypeForABI(Ty)) {
784*06c3fb27SDimitry Andric     // Structures with flexible arrays are always indirect.
785*06c3fb27SDimitry Andric     // FIXME: This should not be byval!
786*06c3fb27SDimitry Andric     if (RT && RT->getDecl()->hasFlexibleArrayMember())
787*06c3fb27SDimitry Andric       return getIndirectResult(Ty, true, State);
788*06c3fb27SDimitry Andric 
789*06c3fb27SDimitry Andric     // Ignore empty structs/unions on non-Windows.
790*06c3fb27SDimitry Andric     if (!IsWin32StructABI && isEmptyRecord(getContext(), Ty, true))
791*06c3fb27SDimitry Andric       return ABIArgInfo::getIgnore();
792*06c3fb27SDimitry Andric 
793*06c3fb27SDimitry Andric     llvm::LLVMContext &LLVMContext = getVMContext();
794*06c3fb27SDimitry Andric     llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
795*06c3fb27SDimitry Andric     bool NeedsPadding = false;
796*06c3fb27SDimitry Andric     bool InReg;
797*06c3fb27SDimitry Andric     if (shouldAggregateUseDirect(Ty, State, InReg, NeedsPadding)) {
798*06c3fb27SDimitry Andric       unsigned SizeInRegs = (TI.Width + 31) / 32;
799*06c3fb27SDimitry Andric       SmallVector<llvm::Type*, 3> Elements(SizeInRegs, Int32);
800*06c3fb27SDimitry Andric       llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
801*06c3fb27SDimitry Andric       if (InReg)
802*06c3fb27SDimitry Andric         return ABIArgInfo::getDirectInReg(Result);
803*06c3fb27SDimitry Andric       else
804*06c3fb27SDimitry Andric         return ABIArgInfo::getDirect(Result);
805*06c3fb27SDimitry Andric     }
806*06c3fb27SDimitry Andric     llvm::IntegerType *PaddingType = NeedsPadding ? Int32 : nullptr;
807*06c3fb27SDimitry Andric 
808*06c3fb27SDimitry Andric     // Pass over-aligned aggregates on Windows indirectly. This behavior was
809*06c3fb27SDimitry Andric     // added in MSVC 2015. Use the required alignment from the record layout,
810*06c3fb27SDimitry Andric     // since that may be less than the regular type alignment, and types with
811*06c3fb27SDimitry Andric     // required alignment of less than 4 bytes are not passed indirectly.
812*06c3fb27SDimitry Andric     if (IsWin32StructABI) {
813*06c3fb27SDimitry Andric       unsigned AlignInBits = 0;
814*06c3fb27SDimitry Andric       if (RT) {
815*06c3fb27SDimitry Andric         const ASTRecordLayout &Layout =
816*06c3fb27SDimitry Andric           getContext().getASTRecordLayout(RT->getDecl());
817*06c3fb27SDimitry Andric         AlignInBits = getContext().toBits(Layout.getRequiredAlignment());
818*06c3fb27SDimitry Andric       } else if (TI.isAlignRequired()) {
819*06c3fb27SDimitry Andric         AlignInBits = TI.Align;
820*06c3fb27SDimitry Andric       }
821*06c3fb27SDimitry Andric       if (AlignInBits > 32)
822*06c3fb27SDimitry Andric         return getIndirectResult(Ty, /*ByVal=*/false, State);
823*06c3fb27SDimitry Andric     }
824*06c3fb27SDimitry Andric 
825*06c3fb27SDimitry Andric     // Expand small (<= 128-bit) record types when we know that the stack layout
826*06c3fb27SDimitry Andric     // of those arguments will match the struct. This is important because the
827*06c3fb27SDimitry Andric     // LLVM backend isn't smart enough to remove byval, which inhibits many
828*06c3fb27SDimitry Andric     // optimizations.
829*06c3fb27SDimitry Andric     // Don't do this for the MCU if there are still free integer registers
830*06c3fb27SDimitry Andric     // (see X86_64 ABI for full explanation).
831*06c3fb27SDimitry Andric     if (TI.Width <= 4 * 32 && (!IsMCUABI || State.FreeRegs == 0) &&
832*06c3fb27SDimitry Andric         canExpandIndirectArgument(Ty))
833*06c3fb27SDimitry Andric       return ABIArgInfo::getExpandWithPadding(
834*06c3fb27SDimitry Andric           IsFastCall || IsVectorCall || IsRegCall, PaddingType);
835*06c3fb27SDimitry Andric 
836*06c3fb27SDimitry Andric     return getIndirectResult(Ty, true, State);
837*06c3fb27SDimitry Andric   }
838*06c3fb27SDimitry Andric 
839*06c3fb27SDimitry Andric   if (const VectorType *VT = Ty->getAs<VectorType>()) {
840*06c3fb27SDimitry Andric     // On Windows, vectors are passed directly if registers are available, or
841*06c3fb27SDimitry Andric     // indirectly if not. This avoids the need to align argument memory. Pass
842*06c3fb27SDimitry Andric     // user-defined vector types larger than 512 bits indirectly for simplicity.
843*06c3fb27SDimitry Andric     if (IsWin32StructABI) {
844*06c3fb27SDimitry Andric       if (TI.Width <= 512 && State.FreeSSERegs > 0) {
845*06c3fb27SDimitry Andric         --State.FreeSSERegs;
846*06c3fb27SDimitry Andric         return ABIArgInfo::getDirectInReg();
847*06c3fb27SDimitry Andric       }
848*06c3fb27SDimitry Andric       return getIndirectResult(Ty, /*ByVal=*/false, State);
849*06c3fb27SDimitry Andric     }
850*06c3fb27SDimitry Andric 
851*06c3fb27SDimitry Andric     // On Darwin, some vectors are passed in memory, we handle this by passing
852*06c3fb27SDimitry Andric     // it as an i8/i16/i32/i64.
853*06c3fb27SDimitry Andric     if (IsDarwinVectorABI) {
854*06c3fb27SDimitry Andric       if ((TI.Width == 8 || TI.Width == 16 || TI.Width == 32) ||
855*06c3fb27SDimitry Andric           (TI.Width == 64 && VT->getNumElements() == 1))
856*06c3fb27SDimitry Andric         return ABIArgInfo::getDirect(
857*06c3fb27SDimitry Andric             llvm::IntegerType::get(getVMContext(), TI.Width));
858*06c3fb27SDimitry Andric     }
859*06c3fb27SDimitry Andric 
860*06c3fb27SDimitry Andric     if (IsX86_MMXType(CGT.ConvertType(Ty)))
861*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 64));
862*06c3fb27SDimitry Andric 
863*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
864*06c3fb27SDimitry Andric   }
865*06c3fb27SDimitry Andric 
866*06c3fb27SDimitry Andric 
867*06c3fb27SDimitry Andric   if (const EnumType *EnumTy = Ty->getAs<EnumType>())
868*06c3fb27SDimitry Andric     Ty = EnumTy->getDecl()->getIntegerType();
869*06c3fb27SDimitry Andric 
870*06c3fb27SDimitry Andric   bool InReg = shouldPrimitiveUseInReg(Ty, State);
871*06c3fb27SDimitry Andric 
872*06c3fb27SDimitry Andric   if (isPromotableIntegerTypeForABI(Ty)) {
873*06c3fb27SDimitry Andric     if (InReg)
874*06c3fb27SDimitry Andric       return ABIArgInfo::getExtendInReg(Ty);
875*06c3fb27SDimitry Andric     return ABIArgInfo::getExtend(Ty);
876*06c3fb27SDimitry Andric   }
877*06c3fb27SDimitry Andric 
878*06c3fb27SDimitry Andric   if (const auto *EIT = Ty->getAs<BitIntType>()) {
879*06c3fb27SDimitry Andric     if (EIT->getNumBits() <= 64) {
880*06c3fb27SDimitry Andric       if (InReg)
881*06c3fb27SDimitry Andric         return ABIArgInfo::getDirectInReg();
882*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect();
883*06c3fb27SDimitry Andric     }
884*06c3fb27SDimitry Andric     return getIndirectResult(Ty, /*ByVal=*/false, State);
885*06c3fb27SDimitry Andric   }
886*06c3fb27SDimitry Andric 
887*06c3fb27SDimitry Andric   if (InReg)
888*06c3fb27SDimitry Andric     return ABIArgInfo::getDirectInReg();
889*06c3fb27SDimitry Andric   return ABIArgInfo::getDirect();
890*06c3fb27SDimitry Andric }
891*06c3fb27SDimitry Andric 
892*06c3fb27SDimitry Andric void X86_32ABIInfo::computeInfo(CGFunctionInfo &FI) const {
893*06c3fb27SDimitry Andric   CCState State(FI);
894*06c3fb27SDimitry Andric   if (IsMCUABI)
895*06c3fb27SDimitry Andric     State.FreeRegs = 3;
896*06c3fb27SDimitry Andric   else if (State.CC == llvm::CallingConv::X86_FastCall) {
897*06c3fb27SDimitry Andric     State.FreeRegs = 2;
898*06c3fb27SDimitry Andric     State.FreeSSERegs = 3;
899*06c3fb27SDimitry Andric   } else if (State.CC == llvm::CallingConv::X86_VectorCall) {
900*06c3fb27SDimitry Andric     State.FreeRegs = 2;
901*06c3fb27SDimitry Andric     State.FreeSSERegs = 6;
902*06c3fb27SDimitry Andric   } else if (FI.getHasRegParm())
903*06c3fb27SDimitry Andric     State.FreeRegs = FI.getRegParm();
904*06c3fb27SDimitry Andric   else if (State.CC == llvm::CallingConv::X86_RegCall) {
905*06c3fb27SDimitry Andric     State.FreeRegs = 5;
906*06c3fb27SDimitry Andric     State.FreeSSERegs = 8;
907*06c3fb27SDimitry Andric   } else if (IsWin32StructABI) {
908*06c3fb27SDimitry Andric     // Since MSVC 2015, the first three SSE vectors have been passed in
909*06c3fb27SDimitry Andric     // registers. The rest are passed indirectly.
910*06c3fb27SDimitry Andric     State.FreeRegs = DefaultNumRegisterParameters;
911*06c3fb27SDimitry Andric     State.FreeSSERegs = 3;
912*06c3fb27SDimitry Andric   } else
913*06c3fb27SDimitry Andric     State.FreeRegs = DefaultNumRegisterParameters;
914*06c3fb27SDimitry Andric 
915*06c3fb27SDimitry Andric   if (!::classifyReturnType(getCXXABI(), FI, *this)) {
916*06c3fb27SDimitry Andric     FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), State);
917*06c3fb27SDimitry Andric   } else if (FI.getReturnInfo().isIndirect()) {
918*06c3fb27SDimitry Andric     // The C++ ABI is not aware of register usage, so we have to check if the
919*06c3fb27SDimitry Andric     // return value was sret and put it in a register ourselves if appropriate.
920*06c3fb27SDimitry Andric     if (State.FreeRegs) {
921*06c3fb27SDimitry Andric       --State.FreeRegs;  // The sret parameter consumes a register.
922*06c3fb27SDimitry Andric       if (!IsMCUABI)
923*06c3fb27SDimitry Andric         FI.getReturnInfo().setInReg(true);
924*06c3fb27SDimitry Andric     }
925*06c3fb27SDimitry Andric   }
926*06c3fb27SDimitry Andric 
927*06c3fb27SDimitry Andric   // The chain argument effectively gives us another free register.
928*06c3fb27SDimitry Andric   if (FI.isChainCall())
929*06c3fb27SDimitry Andric     ++State.FreeRegs;
930*06c3fb27SDimitry Andric 
931*06c3fb27SDimitry Andric   // For vectorcall, do a first pass over the arguments, assigning FP and vector
932*06c3fb27SDimitry Andric   // arguments to XMM registers as available.
933*06c3fb27SDimitry Andric   if (State.CC == llvm::CallingConv::X86_VectorCall)
934*06c3fb27SDimitry Andric     runVectorCallFirstPass(FI, State);
935*06c3fb27SDimitry Andric 
936*06c3fb27SDimitry Andric   bool UsedInAlloca = false;
937*06c3fb27SDimitry Andric   MutableArrayRef<CGFunctionInfoArgInfo> Args = FI.arguments();
938*06c3fb27SDimitry Andric   for (int I = 0, E = Args.size(); I < E; ++I) {
939*06c3fb27SDimitry Andric     // Skip arguments that have already been assigned.
940*06c3fb27SDimitry Andric     if (State.IsPreassigned.test(I))
941*06c3fb27SDimitry Andric       continue;
942*06c3fb27SDimitry Andric 
943*06c3fb27SDimitry Andric     Args[I].info = classifyArgumentType(Args[I].type, State);
944*06c3fb27SDimitry Andric     UsedInAlloca |= (Args[I].info.getKind() == ABIArgInfo::InAlloca);
945*06c3fb27SDimitry Andric   }
946*06c3fb27SDimitry Andric 
947*06c3fb27SDimitry Andric   // If we needed to use inalloca for any argument, do a second pass and rewrite
948*06c3fb27SDimitry Andric   // all the memory arguments to use inalloca.
949*06c3fb27SDimitry Andric   if (UsedInAlloca)
950*06c3fb27SDimitry Andric     rewriteWithInAlloca(FI);
951*06c3fb27SDimitry Andric }
952*06c3fb27SDimitry Andric 
953*06c3fb27SDimitry Andric void
954*06c3fb27SDimitry Andric X86_32ABIInfo::addFieldToArgStruct(SmallVector<llvm::Type *, 6> &FrameFields,
955*06c3fb27SDimitry Andric                                    CharUnits &StackOffset, ABIArgInfo &Info,
956*06c3fb27SDimitry Andric                                    QualType Type) const {
957*06c3fb27SDimitry Andric   // Arguments are always 4-byte-aligned.
958*06c3fb27SDimitry Andric   CharUnits WordSize = CharUnits::fromQuantity(4);
959*06c3fb27SDimitry Andric   assert(StackOffset.isMultipleOf(WordSize) && "unaligned inalloca struct");
960*06c3fb27SDimitry Andric 
961*06c3fb27SDimitry Andric   // sret pointers and indirect things will require an extra pointer
962*06c3fb27SDimitry Andric   // indirection, unless they are byval. Most things are byval, and will not
963*06c3fb27SDimitry Andric   // require this indirection.
964*06c3fb27SDimitry Andric   bool IsIndirect = false;
965*06c3fb27SDimitry Andric   if (Info.isIndirect() && !Info.getIndirectByVal())
966*06c3fb27SDimitry Andric     IsIndirect = true;
967*06c3fb27SDimitry Andric   Info = ABIArgInfo::getInAlloca(FrameFields.size(), IsIndirect);
968*06c3fb27SDimitry Andric   llvm::Type *LLTy = CGT.ConvertTypeForMem(Type);
969*06c3fb27SDimitry Andric   if (IsIndirect)
970*06c3fb27SDimitry Andric     LLTy = llvm::PointerType::getUnqual(getVMContext());
971*06c3fb27SDimitry Andric   FrameFields.push_back(LLTy);
972*06c3fb27SDimitry Andric   StackOffset += IsIndirect ? WordSize : getContext().getTypeSizeInChars(Type);
973*06c3fb27SDimitry Andric 
974*06c3fb27SDimitry Andric   // Insert padding bytes to respect alignment.
975*06c3fb27SDimitry Andric   CharUnits FieldEnd = StackOffset;
976*06c3fb27SDimitry Andric   StackOffset = FieldEnd.alignTo(WordSize);
977*06c3fb27SDimitry Andric   if (StackOffset != FieldEnd) {
978*06c3fb27SDimitry Andric     CharUnits NumBytes = StackOffset - FieldEnd;
979*06c3fb27SDimitry Andric     llvm::Type *Ty = llvm::Type::getInt8Ty(getVMContext());
980*06c3fb27SDimitry Andric     Ty = llvm::ArrayType::get(Ty, NumBytes.getQuantity());
981*06c3fb27SDimitry Andric     FrameFields.push_back(Ty);
982*06c3fb27SDimitry Andric   }
983*06c3fb27SDimitry Andric }
984*06c3fb27SDimitry Andric 
985*06c3fb27SDimitry Andric static bool isArgInAlloca(const ABIArgInfo &Info) {
986*06c3fb27SDimitry Andric   // Leave ignored and inreg arguments alone.
987*06c3fb27SDimitry Andric   switch (Info.getKind()) {
988*06c3fb27SDimitry Andric   case ABIArgInfo::InAlloca:
989*06c3fb27SDimitry Andric     return true;
990*06c3fb27SDimitry Andric   case ABIArgInfo::Ignore:
991*06c3fb27SDimitry Andric   case ABIArgInfo::IndirectAliased:
992*06c3fb27SDimitry Andric     return false;
993*06c3fb27SDimitry Andric   case ABIArgInfo::Indirect:
994*06c3fb27SDimitry Andric   case ABIArgInfo::Direct:
995*06c3fb27SDimitry Andric   case ABIArgInfo::Extend:
996*06c3fb27SDimitry Andric     return !Info.getInReg();
997*06c3fb27SDimitry Andric   case ABIArgInfo::Expand:
998*06c3fb27SDimitry Andric   case ABIArgInfo::CoerceAndExpand:
999*06c3fb27SDimitry Andric     // These are aggregate types which are never passed in registers when
1000*06c3fb27SDimitry Andric     // inalloca is involved.
1001*06c3fb27SDimitry Andric     return true;
1002*06c3fb27SDimitry Andric   }
1003*06c3fb27SDimitry Andric   llvm_unreachable("invalid enum");
1004*06c3fb27SDimitry Andric }
1005*06c3fb27SDimitry Andric 
1006*06c3fb27SDimitry Andric void X86_32ABIInfo::rewriteWithInAlloca(CGFunctionInfo &FI) const {
1007*06c3fb27SDimitry Andric   assert(IsWin32StructABI && "inalloca only supported on win32");
1008*06c3fb27SDimitry Andric 
1009*06c3fb27SDimitry Andric   // Build a packed struct type for all of the arguments in memory.
1010*06c3fb27SDimitry Andric   SmallVector<llvm::Type *, 6> FrameFields;
1011*06c3fb27SDimitry Andric 
1012*06c3fb27SDimitry Andric   // The stack alignment is always 4.
1013*06c3fb27SDimitry Andric   CharUnits StackAlign = CharUnits::fromQuantity(4);
1014*06c3fb27SDimitry Andric 
1015*06c3fb27SDimitry Andric   CharUnits StackOffset;
1016*06c3fb27SDimitry Andric   CGFunctionInfo::arg_iterator I = FI.arg_begin(), E = FI.arg_end();
1017*06c3fb27SDimitry Andric 
1018*06c3fb27SDimitry Andric   // Put 'this' into the struct before 'sret', if necessary.
1019*06c3fb27SDimitry Andric   bool IsThisCall =
1020*06c3fb27SDimitry Andric       FI.getCallingConvention() == llvm::CallingConv::X86_ThisCall;
1021*06c3fb27SDimitry Andric   ABIArgInfo &Ret = FI.getReturnInfo();
1022*06c3fb27SDimitry Andric   if (Ret.isIndirect() && Ret.isSRetAfterThis() && !IsThisCall &&
1023*06c3fb27SDimitry Andric       isArgInAlloca(I->info)) {
1024*06c3fb27SDimitry Andric     addFieldToArgStruct(FrameFields, StackOffset, I->info, I->type);
1025*06c3fb27SDimitry Andric     ++I;
1026*06c3fb27SDimitry Andric   }
1027*06c3fb27SDimitry Andric 
1028*06c3fb27SDimitry Andric   // Put the sret parameter into the inalloca struct if it's in memory.
1029*06c3fb27SDimitry Andric   if (Ret.isIndirect() && !Ret.getInReg()) {
1030*06c3fb27SDimitry Andric     addFieldToArgStruct(FrameFields, StackOffset, Ret, FI.getReturnType());
1031*06c3fb27SDimitry Andric     // On Windows, the hidden sret parameter is always returned in eax.
1032*06c3fb27SDimitry Andric     Ret.setInAllocaSRet(IsWin32StructABI);
1033*06c3fb27SDimitry Andric   }
1034*06c3fb27SDimitry Andric 
1035*06c3fb27SDimitry Andric   // Skip the 'this' parameter in ecx.
1036*06c3fb27SDimitry Andric   if (IsThisCall)
1037*06c3fb27SDimitry Andric     ++I;
1038*06c3fb27SDimitry Andric 
1039*06c3fb27SDimitry Andric   // Put arguments passed in memory into the struct.
1040*06c3fb27SDimitry Andric   for (; I != E; ++I) {
1041*06c3fb27SDimitry Andric     if (isArgInAlloca(I->info))
1042*06c3fb27SDimitry Andric       addFieldToArgStruct(FrameFields, StackOffset, I->info, I->type);
1043*06c3fb27SDimitry Andric   }
1044*06c3fb27SDimitry Andric 
1045*06c3fb27SDimitry Andric   FI.setArgStruct(llvm::StructType::get(getVMContext(), FrameFields,
1046*06c3fb27SDimitry Andric                                         /*isPacked=*/true),
1047*06c3fb27SDimitry Andric                   StackAlign);
1048*06c3fb27SDimitry Andric }
1049*06c3fb27SDimitry Andric 
1050*06c3fb27SDimitry Andric Address X86_32ABIInfo::EmitVAArg(CodeGenFunction &CGF,
1051*06c3fb27SDimitry Andric                                  Address VAListAddr, QualType Ty) const {
1052*06c3fb27SDimitry Andric 
1053*06c3fb27SDimitry Andric   auto TypeInfo = getContext().getTypeInfoInChars(Ty);
1054*06c3fb27SDimitry Andric 
1055*06c3fb27SDimitry Andric   // x86-32 changes the alignment of certain arguments on the stack.
1056*06c3fb27SDimitry Andric   //
1057*06c3fb27SDimitry Andric   // Just messing with TypeInfo like this works because we never pass
1058*06c3fb27SDimitry Andric   // anything indirectly.
1059*06c3fb27SDimitry Andric   TypeInfo.Align = CharUnits::fromQuantity(
1060*06c3fb27SDimitry Andric                 getTypeStackAlignInBytes(Ty, TypeInfo.Align.getQuantity()));
1061*06c3fb27SDimitry Andric 
1062*06c3fb27SDimitry Andric   return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false,
1063*06c3fb27SDimitry Andric                           TypeInfo, CharUnits::fromQuantity(4),
1064*06c3fb27SDimitry Andric                           /*AllowHigherAlign*/ true);
1065*06c3fb27SDimitry Andric }
1066*06c3fb27SDimitry Andric 
1067*06c3fb27SDimitry Andric bool X86_32TargetCodeGenInfo::isStructReturnInRegABI(
1068*06c3fb27SDimitry Andric     const llvm::Triple &Triple, const CodeGenOptions &Opts) {
1069*06c3fb27SDimitry Andric   assert(Triple.getArch() == llvm::Triple::x86);
1070*06c3fb27SDimitry Andric 
1071*06c3fb27SDimitry Andric   switch (Opts.getStructReturnConvention()) {
1072*06c3fb27SDimitry Andric   case CodeGenOptions::SRCK_Default:
1073*06c3fb27SDimitry Andric     break;
1074*06c3fb27SDimitry Andric   case CodeGenOptions::SRCK_OnStack:  // -fpcc-struct-return
1075*06c3fb27SDimitry Andric     return false;
1076*06c3fb27SDimitry Andric   case CodeGenOptions::SRCK_InRegs:  // -freg-struct-return
1077*06c3fb27SDimitry Andric     return true;
1078*06c3fb27SDimitry Andric   }
1079*06c3fb27SDimitry Andric 
1080*06c3fb27SDimitry Andric   if (Triple.isOSDarwin() || Triple.isOSIAMCU())
1081*06c3fb27SDimitry Andric     return true;
1082*06c3fb27SDimitry Andric 
1083*06c3fb27SDimitry Andric   switch (Triple.getOS()) {
1084*06c3fb27SDimitry Andric   case llvm::Triple::DragonFly:
1085*06c3fb27SDimitry Andric   case llvm::Triple::FreeBSD:
1086*06c3fb27SDimitry Andric   case llvm::Triple::OpenBSD:
1087*06c3fb27SDimitry Andric   case llvm::Triple::Win32:
1088*06c3fb27SDimitry Andric     return true;
1089*06c3fb27SDimitry Andric   default:
1090*06c3fb27SDimitry Andric     return false;
1091*06c3fb27SDimitry Andric   }
1092*06c3fb27SDimitry Andric }
1093*06c3fb27SDimitry Andric 
1094*06c3fb27SDimitry Andric static void addX86InterruptAttrs(const FunctionDecl *FD, llvm::GlobalValue *GV,
1095*06c3fb27SDimitry Andric                                  CodeGen::CodeGenModule &CGM) {
1096*06c3fb27SDimitry Andric   if (!FD->hasAttr<AnyX86InterruptAttr>())
1097*06c3fb27SDimitry Andric     return;
1098*06c3fb27SDimitry Andric 
1099*06c3fb27SDimitry Andric   llvm::Function *Fn = cast<llvm::Function>(GV);
1100*06c3fb27SDimitry Andric   Fn->setCallingConv(llvm::CallingConv::X86_INTR);
1101*06c3fb27SDimitry Andric   if (FD->getNumParams() == 0)
1102*06c3fb27SDimitry Andric     return;
1103*06c3fb27SDimitry Andric 
1104*06c3fb27SDimitry Andric   auto PtrTy = cast<PointerType>(FD->getParamDecl(0)->getType());
1105*06c3fb27SDimitry Andric   llvm::Type *ByValTy = CGM.getTypes().ConvertType(PtrTy->getPointeeType());
1106*06c3fb27SDimitry Andric   llvm::Attribute NewAttr = llvm::Attribute::getWithByValType(
1107*06c3fb27SDimitry Andric     Fn->getContext(), ByValTy);
1108*06c3fb27SDimitry Andric   Fn->addParamAttr(0, NewAttr);
1109*06c3fb27SDimitry Andric }
1110*06c3fb27SDimitry Andric 
1111*06c3fb27SDimitry Andric void X86_32TargetCodeGenInfo::setTargetAttributes(
1112*06c3fb27SDimitry Andric     const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
1113*06c3fb27SDimitry Andric   if (GV->isDeclaration())
1114*06c3fb27SDimitry Andric     return;
1115*06c3fb27SDimitry Andric   if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
1116*06c3fb27SDimitry Andric     if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
1117*06c3fb27SDimitry Andric       llvm::Function *Fn = cast<llvm::Function>(GV);
1118*06c3fb27SDimitry Andric       Fn->addFnAttr("stackrealign");
1119*06c3fb27SDimitry Andric     }
1120*06c3fb27SDimitry Andric 
1121*06c3fb27SDimitry Andric     addX86InterruptAttrs(FD, GV, CGM);
1122*06c3fb27SDimitry Andric   }
1123*06c3fb27SDimitry Andric }
1124*06c3fb27SDimitry Andric 
1125*06c3fb27SDimitry Andric bool X86_32TargetCodeGenInfo::initDwarfEHRegSizeTable(
1126*06c3fb27SDimitry Andric                                                CodeGen::CodeGenFunction &CGF,
1127*06c3fb27SDimitry Andric                                                llvm::Value *Address) const {
1128*06c3fb27SDimitry Andric   CodeGen::CGBuilderTy &Builder = CGF.Builder;
1129*06c3fb27SDimitry Andric 
1130*06c3fb27SDimitry Andric   llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
1131*06c3fb27SDimitry Andric 
1132*06c3fb27SDimitry Andric   // 0-7 are the eight integer registers;  the order is different
1133*06c3fb27SDimitry Andric   //   on Darwin (for EH), but the range is the same.
1134*06c3fb27SDimitry Andric   // 8 is %eip.
1135*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Four8, 0, 8);
1136*06c3fb27SDimitry Andric 
1137*06c3fb27SDimitry Andric   if (CGF.CGM.getTarget().getTriple().isOSDarwin()) {
1138*06c3fb27SDimitry Andric     // 12-16 are st(0..4).  Not sure why we stop at 4.
1139*06c3fb27SDimitry Andric     // These have size 16, which is sizeof(long double) on
1140*06c3fb27SDimitry Andric     // platforms with 8-byte alignment for that type.
1141*06c3fb27SDimitry Andric     llvm::Value *Sixteen8 = llvm::ConstantInt::get(CGF.Int8Ty, 16);
1142*06c3fb27SDimitry Andric     AssignToArrayRange(Builder, Address, Sixteen8, 12, 16);
1143*06c3fb27SDimitry Andric 
1144*06c3fb27SDimitry Andric   } else {
1145*06c3fb27SDimitry Andric     // 9 is %eflags, which doesn't get a size on Darwin for some
1146*06c3fb27SDimitry Andric     // reason.
1147*06c3fb27SDimitry Andric     Builder.CreateAlignedStore(
1148*06c3fb27SDimitry Andric         Four8, Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, Address, 9),
1149*06c3fb27SDimitry Andric                                CharUnits::One());
1150*06c3fb27SDimitry Andric 
1151*06c3fb27SDimitry Andric     // 11-16 are st(0..5).  Not sure why we stop at 5.
1152*06c3fb27SDimitry Andric     // These have size 12, which is sizeof(long double) on
1153*06c3fb27SDimitry Andric     // platforms with 4-byte alignment for that type.
1154*06c3fb27SDimitry Andric     llvm::Value *Twelve8 = llvm::ConstantInt::get(CGF.Int8Ty, 12);
1155*06c3fb27SDimitry Andric     AssignToArrayRange(Builder, Address, Twelve8, 11, 16);
1156*06c3fb27SDimitry Andric   }
1157*06c3fb27SDimitry Andric 
1158*06c3fb27SDimitry Andric   return false;
1159*06c3fb27SDimitry Andric }
1160*06c3fb27SDimitry Andric 
1161*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
1162*06c3fb27SDimitry Andric // X86-64 ABI Implementation
1163*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
1164*06c3fb27SDimitry Andric 
1165*06c3fb27SDimitry Andric 
1166*06c3fb27SDimitry Andric namespace {
1167*06c3fb27SDimitry Andric 
1168*06c3fb27SDimitry Andric /// \p returns the size in bits of the largest (native) vector for \p AVXLevel.
1169*06c3fb27SDimitry Andric static unsigned getNativeVectorSizeForAVXABI(X86AVXABILevel AVXLevel) {
1170*06c3fb27SDimitry Andric   switch (AVXLevel) {
1171*06c3fb27SDimitry Andric   case X86AVXABILevel::AVX512:
1172*06c3fb27SDimitry Andric     return 512;
1173*06c3fb27SDimitry Andric   case X86AVXABILevel::AVX:
1174*06c3fb27SDimitry Andric     return 256;
1175*06c3fb27SDimitry Andric   case X86AVXABILevel::None:
1176*06c3fb27SDimitry Andric     return 128;
1177*06c3fb27SDimitry Andric   }
1178*06c3fb27SDimitry Andric   llvm_unreachable("Unknown AVXLevel");
1179*06c3fb27SDimitry Andric }
1180*06c3fb27SDimitry Andric 
1181*06c3fb27SDimitry Andric /// X86_64ABIInfo - The X86_64 ABI information.
1182*06c3fb27SDimitry Andric class X86_64ABIInfo : public ABIInfo {
1183*06c3fb27SDimitry Andric   enum Class {
1184*06c3fb27SDimitry Andric     Integer = 0,
1185*06c3fb27SDimitry Andric     SSE,
1186*06c3fb27SDimitry Andric     SSEUp,
1187*06c3fb27SDimitry Andric     X87,
1188*06c3fb27SDimitry Andric     X87Up,
1189*06c3fb27SDimitry Andric     ComplexX87,
1190*06c3fb27SDimitry Andric     NoClass,
1191*06c3fb27SDimitry Andric     Memory
1192*06c3fb27SDimitry Andric   };
1193*06c3fb27SDimitry Andric 
1194*06c3fb27SDimitry Andric   /// merge - Implement the X86_64 ABI merging algorithm.
1195*06c3fb27SDimitry Andric   ///
1196*06c3fb27SDimitry Andric   /// Merge an accumulating classification \arg Accum with a field
1197*06c3fb27SDimitry Andric   /// classification \arg Field.
1198*06c3fb27SDimitry Andric   ///
1199*06c3fb27SDimitry Andric   /// \param Accum - The accumulating classification. This should
1200*06c3fb27SDimitry Andric   /// always be either NoClass or the result of a previous merge
1201*06c3fb27SDimitry Andric   /// call. In addition, this should never be Memory (the caller
1202*06c3fb27SDimitry Andric   /// should just return Memory for the aggregate).
1203*06c3fb27SDimitry Andric   static Class merge(Class Accum, Class Field);
1204*06c3fb27SDimitry Andric 
1205*06c3fb27SDimitry Andric   /// postMerge - Implement the X86_64 ABI post merging algorithm.
1206*06c3fb27SDimitry Andric   ///
1207*06c3fb27SDimitry Andric   /// Post merger cleanup, reduces a malformed Hi and Lo pair to
1208*06c3fb27SDimitry Andric   /// final MEMORY or SSE classes when necessary.
1209*06c3fb27SDimitry Andric   ///
1210*06c3fb27SDimitry Andric   /// \param AggregateSize - The size of the current aggregate in
1211*06c3fb27SDimitry Andric   /// the classification process.
1212*06c3fb27SDimitry Andric   ///
1213*06c3fb27SDimitry Andric   /// \param Lo - The classification for the parts of the type
1214*06c3fb27SDimitry Andric   /// residing in the low word of the containing object.
1215*06c3fb27SDimitry Andric   ///
1216*06c3fb27SDimitry Andric   /// \param Hi - The classification for the parts of the type
1217*06c3fb27SDimitry Andric   /// residing in the higher words of the containing object.
1218*06c3fb27SDimitry Andric   ///
1219*06c3fb27SDimitry Andric   void postMerge(unsigned AggregateSize, Class &Lo, Class &Hi) const;
1220*06c3fb27SDimitry Andric 
1221*06c3fb27SDimitry Andric   /// classify - Determine the x86_64 register classes in which the
1222*06c3fb27SDimitry Andric   /// given type T should be passed.
1223*06c3fb27SDimitry Andric   ///
1224*06c3fb27SDimitry Andric   /// \param Lo - The classification for the parts of the type
1225*06c3fb27SDimitry Andric   /// residing in the low word of the containing object.
1226*06c3fb27SDimitry Andric   ///
1227*06c3fb27SDimitry Andric   /// \param Hi - The classification for the parts of the type
1228*06c3fb27SDimitry Andric   /// residing in the high word of the containing object.
1229*06c3fb27SDimitry Andric   ///
1230*06c3fb27SDimitry Andric   /// \param OffsetBase - The bit offset of this type in the
1231*06c3fb27SDimitry Andric   /// containing object.  Some parameters are classified different
1232*06c3fb27SDimitry Andric   /// depending on whether they straddle an eightbyte boundary.
1233*06c3fb27SDimitry Andric   ///
1234*06c3fb27SDimitry Andric   /// \param isNamedArg - Whether the argument in question is a "named"
1235*06c3fb27SDimitry Andric   /// argument, as used in AMD64-ABI 3.5.7.
1236*06c3fb27SDimitry Andric   ///
1237*06c3fb27SDimitry Andric   /// \param IsRegCall - Whether the calling conversion is regcall.
1238*06c3fb27SDimitry Andric   ///
1239*06c3fb27SDimitry Andric   /// If a word is unused its result will be NoClass; if a type should
1240*06c3fb27SDimitry Andric   /// be passed in Memory then at least the classification of \arg Lo
1241*06c3fb27SDimitry Andric   /// will be Memory.
1242*06c3fb27SDimitry Andric   ///
1243*06c3fb27SDimitry Andric   /// The \arg Lo class will be NoClass iff the argument is ignored.
1244*06c3fb27SDimitry Andric   ///
1245*06c3fb27SDimitry Andric   /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
1246*06c3fb27SDimitry Andric   /// also be ComplexX87.
1247*06c3fb27SDimitry Andric   void classify(QualType T, uint64_t OffsetBase, Class &Lo, Class &Hi,
1248*06c3fb27SDimitry Andric                 bool isNamedArg, bool IsRegCall = false) const;
1249*06c3fb27SDimitry Andric 
1250*06c3fb27SDimitry Andric   llvm::Type *GetByteVectorType(QualType Ty) const;
1251*06c3fb27SDimitry Andric   llvm::Type *GetSSETypeAtOffset(llvm::Type *IRType,
1252*06c3fb27SDimitry Andric                                  unsigned IROffset, QualType SourceTy,
1253*06c3fb27SDimitry Andric                                  unsigned SourceOffset) const;
1254*06c3fb27SDimitry Andric   llvm::Type *GetINTEGERTypeAtOffset(llvm::Type *IRType,
1255*06c3fb27SDimitry Andric                                      unsigned IROffset, QualType SourceTy,
1256*06c3fb27SDimitry Andric                                      unsigned SourceOffset) const;
1257*06c3fb27SDimitry Andric 
1258*06c3fb27SDimitry Andric   /// getIndirectResult - Give a source type \arg Ty, return a suitable result
1259*06c3fb27SDimitry Andric   /// such that the argument will be returned in memory.
1260*06c3fb27SDimitry Andric   ABIArgInfo getIndirectReturnResult(QualType Ty) const;
1261*06c3fb27SDimitry Andric 
1262*06c3fb27SDimitry Andric   /// getIndirectResult - Give a source type \arg Ty, return a suitable result
1263*06c3fb27SDimitry Andric   /// such that the argument will be passed in memory.
1264*06c3fb27SDimitry Andric   ///
1265*06c3fb27SDimitry Andric   /// \param freeIntRegs - The number of free integer registers remaining
1266*06c3fb27SDimitry Andric   /// available.
1267*06c3fb27SDimitry Andric   ABIArgInfo getIndirectResult(QualType Ty, unsigned freeIntRegs) const;
1268*06c3fb27SDimitry Andric 
1269*06c3fb27SDimitry Andric   ABIArgInfo classifyReturnType(QualType RetTy) const;
1270*06c3fb27SDimitry Andric 
1271*06c3fb27SDimitry Andric   ABIArgInfo classifyArgumentType(QualType Ty, unsigned freeIntRegs,
1272*06c3fb27SDimitry Andric                                   unsigned &neededInt, unsigned &neededSSE,
1273*06c3fb27SDimitry Andric                                   bool isNamedArg,
1274*06c3fb27SDimitry Andric                                   bool IsRegCall = false) const;
1275*06c3fb27SDimitry Andric 
1276*06c3fb27SDimitry Andric   ABIArgInfo classifyRegCallStructType(QualType Ty, unsigned &NeededInt,
1277*06c3fb27SDimitry Andric                                        unsigned &NeededSSE,
1278*06c3fb27SDimitry Andric                                        unsigned &MaxVectorWidth) const;
1279*06c3fb27SDimitry Andric 
1280*06c3fb27SDimitry Andric   ABIArgInfo classifyRegCallStructTypeImpl(QualType Ty, unsigned &NeededInt,
1281*06c3fb27SDimitry Andric                                            unsigned &NeededSSE,
1282*06c3fb27SDimitry Andric                                            unsigned &MaxVectorWidth) const;
1283*06c3fb27SDimitry Andric 
1284*06c3fb27SDimitry Andric   bool IsIllegalVectorType(QualType Ty) const;
1285*06c3fb27SDimitry Andric 
1286*06c3fb27SDimitry Andric   /// The 0.98 ABI revision clarified a lot of ambiguities,
1287*06c3fb27SDimitry Andric   /// unfortunately in ways that were not always consistent with
1288*06c3fb27SDimitry Andric   /// certain previous compilers.  In particular, platforms which
1289*06c3fb27SDimitry Andric   /// required strict binary compatibility with older versions of GCC
1290*06c3fb27SDimitry Andric   /// may need to exempt themselves.
1291*06c3fb27SDimitry Andric   bool honorsRevision0_98() const {
1292*06c3fb27SDimitry Andric     return !getTarget().getTriple().isOSDarwin();
1293*06c3fb27SDimitry Andric   }
1294*06c3fb27SDimitry Andric 
1295*06c3fb27SDimitry Andric   /// GCC classifies <1 x long long> as SSE but some platform ABIs choose to
1296*06c3fb27SDimitry Andric   /// classify it as INTEGER (for compatibility with older clang compilers).
1297*06c3fb27SDimitry Andric   bool classifyIntegerMMXAsSSE() const {
1298*06c3fb27SDimitry Andric     // Clang <= 3.8 did not do this.
1299*06c3fb27SDimitry Andric     if (getContext().getLangOpts().getClangABICompat() <=
1300*06c3fb27SDimitry Andric         LangOptions::ClangABI::Ver3_8)
1301*06c3fb27SDimitry Andric       return false;
1302*06c3fb27SDimitry Andric 
1303*06c3fb27SDimitry Andric     const llvm::Triple &Triple = getTarget().getTriple();
1304*06c3fb27SDimitry Andric     if (Triple.isOSDarwin() || Triple.isPS() || Triple.isOSFreeBSD())
1305*06c3fb27SDimitry Andric       return false;
1306*06c3fb27SDimitry Andric     return true;
1307*06c3fb27SDimitry Andric   }
1308*06c3fb27SDimitry Andric 
1309*06c3fb27SDimitry Andric   // GCC classifies vectors of __int128 as memory.
1310*06c3fb27SDimitry Andric   bool passInt128VectorsInMem() const {
1311*06c3fb27SDimitry Andric     // Clang <= 9.0 did not do this.
1312*06c3fb27SDimitry Andric     if (getContext().getLangOpts().getClangABICompat() <=
1313*06c3fb27SDimitry Andric         LangOptions::ClangABI::Ver9)
1314*06c3fb27SDimitry Andric       return false;
1315*06c3fb27SDimitry Andric 
1316*06c3fb27SDimitry Andric     const llvm::Triple &T = getTarget().getTriple();
1317*06c3fb27SDimitry Andric     return T.isOSLinux() || T.isOSNetBSD();
1318*06c3fb27SDimitry Andric   }
1319*06c3fb27SDimitry Andric 
1320*06c3fb27SDimitry Andric   X86AVXABILevel AVXLevel;
1321*06c3fb27SDimitry Andric   // Some ABIs (e.g. X32 ABI and Native Client OS) use 32 bit pointers on
1322*06c3fb27SDimitry Andric   // 64-bit hardware.
1323*06c3fb27SDimitry Andric   bool Has64BitPointers;
1324*06c3fb27SDimitry Andric 
1325*06c3fb27SDimitry Andric public:
1326*06c3fb27SDimitry Andric   X86_64ABIInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel)
1327*06c3fb27SDimitry Andric       : ABIInfo(CGT), AVXLevel(AVXLevel),
1328*06c3fb27SDimitry Andric         Has64BitPointers(CGT.getDataLayout().getPointerSize(0) == 8) {}
1329*06c3fb27SDimitry Andric 
1330*06c3fb27SDimitry Andric   bool isPassedUsingAVXType(QualType type) const {
1331*06c3fb27SDimitry Andric     unsigned neededInt, neededSSE;
1332*06c3fb27SDimitry Andric     // The freeIntRegs argument doesn't matter here.
1333*06c3fb27SDimitry Andric     ABIArgInfo info = classifyArgumentType(type, 0, neededInt, neededSSE,
1334*06c3fb27SDimitry Andric                                            /*isNamedArg*/true);
1335*06c3fb27SDimitry Andric     if (info.isDirect()) {
1336*06c3fb27SDimitry Andric       llvm::Type *ty = info.getCoerceToType();
1337*06c3fb27SDimitry Andric       if (llvm::VectorType *vectorTy = dyn_cast_or_null<llvm::VectorType>(ty))
1338*06c3fb27SDimitry Andric         return vectorTy->getPrimitiveSizeInBits().getFixedValue() > 128;
1339*06c3fb27SDimitry Andric     }
1340*06c3fb27SDimitry Andric     return false;
1341*06c3fb27SDimitry Andric   }
1342*06c3fb27SDimitry Andric 
1343*06c3fb27SDimitry Andric   void computeInfo(CGFunctionInfo &FI) const override;
1344*06c3fb27SDimitry Andric 
1345*06c3fb27SDimitry Andric   Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
1346*06c3fb27SDimitry Andric                     QualType Ty) const override;
1347*06c3fb27SDimitry Andric   Address EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
1348*06c3fb27SDimitry Andric                       QualType Ty) const override;
1349*06c3fb27SDimitry Andric 
1350*06c3fb27SDimitry Andric   bool has64BitPointers() const {
1351*06c3fb27SDimitry Andric     return Has64BitPointers;
1352*06c3fb27SDimitry Andric   }
1353*06c3fb27SDimitry Andric };
1354*06c3fb27SDimitry Andric 
1355*06c3fb27SDimitry Andric /// WinX86_64ABIInfo - The Windows X86_64 ABI information.
1356*06c3fb27SDimitry Andric class WinX86_64ABIInfo : public ABIInfo {
1357*06c3fb27SDimitry Andric public:
1358*06c3fb27SDimitry Andric   WinX86_64ABIInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel)
1359*06c3fb27SDimitry Andric       : ABIInfo(CGT), AVXLevel(AVXLevel),
1360*06c3fb27SDimitry Andric         IsMingw64(getTarget().getTriple().isWindowsGNUEnvironment()) {}
1361*06c3fb27SDimitry Andric 
1362*06c3fb27SDimitry Andric   void computeInfo(CGFunctionInfo &FI) const override;
1363*06c3fb27SDimitry Andric 
1364*06c3fb27SDimitry Andric   Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
1365*06c3fb27SDimitry Andric                     QualType Ty) const override;
1366*06c3fb27SDimitry Andric 
1367*06c3fb27SDimitry Andric   bool isHomogeneousAggregateBaseType(QualType Ty) const override {
1368*06c3fb27SDimitry Andric     // FIXME: Assumes vectorcall is in use.
1369*06c3fb27SDimitry Andric     return isX86VectorTypeForVectorCall(getContext(), Ty);
1370*06c3fb27SDimitry Andric   }
1371*06c3fb27SDimitry Andric 
1372*06c3fb27SDimitry Andric   bool isHomogeneousAggregateSmallEnough(const Type *Ty,
1373*06c3fb27SDimitry Andric                                          uint64_t NumMembers) const override {
1374*06c3fb27SDimitry Andric     // FIXME: Assumes vectorcall is in use.
1375*06c3fb27SDimitry Andric     return isX86VectorCallAggregateSmallEnough(NumMembers);
1376*06c3fb27SDimitry Andric   }
1377*06c3fb27SDimitry Andric 
1378*06c3fb27SDimitry Andric private:
1379*06c3fb27SDimitry Andric   ABIArgInfo classify(QualType Ty, unsigned &FreeSSERegs, bool IsReturnType,
1380*06c3fb27SDimitry Andric                       bool IsVectorCall, bool IsRegCall) const;
1381*06c3fb27SDimitry Andric   ABIArgInfo reclassifyHvaArgForVectorCall(QualType Ty, unsigned &FreeSSERegs,
1382*06c3fb27SDimitry Andric                                            const ABIArgInfo &current) const;
1383*06c3fb27SDimitry Andric 
1384*06c3fb27SDimitry Andric   X86AVXABILevel AVXLevel;
1385*06c3fb27SDimitry Andric 
1386*06c3fb27SDimitry Andric   bool IsMingw64;
1387*06c3fb27SDimitry Andric };
1388*06c3fb27SDimitry Andric 
1389*06c3fb27SDimitry Andric class X86_64TargetCodeGenInfo : public TargetCodeGenInfo {
1390*06c3fb27SDimitry Andric public:
1391*06c3fb27SDimitry Andric   X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel)
1392*06c3fb27SDimitry Andric       : TargetCodeGenInfo(std::make_unique<X86_64ABIInfo>(CGT, AVXLevel)) {
1393*06c3fb27SDimitry Andric     SwiftInfo =
1394*06c3fb27SDimitry Andric         std::make_unique<SwiftABIInfo>(CGT, /*SwiftErrorInRegister=*/true);
1395*06c3fb27SDimitry Andric   }
1396*06c3fb27SDimitry Andric 
1397*06c3fb27SDimitry Andric   /// Disable tail call on x86-64. The epilogue code before the tail jump blocks
1398*06c3fb27SDimitry Andric   /// autoreleaseRV/retainRV and autoreleaseRV/unsafeClaimRV optimizations.
1399*06c3fb27SDimitry Andric   bool markARCOptimizedReturnCallsAsNoTail() const override { return true; }
1400*06c3fb27SDimitry Andric 
1401*06c3fb27SDimitry Andric   int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
1402*06c3fb27SDimitry Andric     return 7;
1403*06c3fb27SDimitry Andric   }
1404*06c3fb27SDimitry Andric 
1405*06c3fb27SDimitry Andric   bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
1406*06c3fb27SDimitry Andric                                llvm::Value *Address) const override {
1407*06c3fb27SDimitry Andric     llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
1408*06c3fb27SDimitry Andric 
1409*06c3fb27SDimitry Andric     // 0-15 are the 16 integer registers.
1410*06c3fb27SDimitry Andric     // 16 is %rip.
1411*06c3fb27SDimitry Andric     AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16);
1412*06c3fb27SDimitry Andric     return false;
1413*06c3fb27SDimitry Andric   }
1414*06c3fb27SDimitry Andric 
1415*06c3fb27SDimitry Andric   llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
1416*06c3fb27SDimitry Andric                                   StringRef Constraint,
1417*06c3fb27SDimitry Andric                                   llvm::Type* Ty) const override {
1418*06c3fb27SDimitry Andric     return X86AdjustInlineAsmType(CGF, Constraint, Ty);
1419*06c3fb27SDimitry Andric   }
1420*06c3fb27SDimitry Andric 
1421*06c3fb27SDimitry Andric   bool isNoProtoCallVariadic(const CallArgList &args,
1422*06c3fb27SDimitry Andric                              const FunctionNoProtoType *fnType) const override {
1423*06c3fb27SDimitry Andric     // The default CC on x86-64 sets %al to the number of SSA
1424*06c3fb27SDimitry Andric     // registers used, and GCC sets this when calling an unprototyped
1425*06c3fb27SDimitry Andric     // function, so we override the default behavior.  However, don't do
1426*06c3fb27SDimitry Andric     // that when AVX types are involved: the ABI explicitly states it is
1427*06c3fb27SDimitry Andric     // undefined, and it doesn't work in practice because of how the ABI
1428*06c3fb27SDimitry Andric     // defines varargs anyway.
1429*06c3fb27SDimitry Andric     if (fnType->getCallConv() == CC_C) {
1430*06c3fb27SDimitry Andric       bool HasAVXType = false;
1431*06c3fb27SDimitry Andric       for (CallArgList::const_iterator
1432*06c3fb27SDimitry Andric              it = args.begin(), ie = args.end(); it != ie; ++it) {
1433*06c3fb27SDimitry Andric         if (getABIInfo<X86_64ABIInfo>().isPassedUsingAVXType(it->Ty)) {
1434*06c3fb27SDimitry Andric           HasAVXType = true;
1435*06c3fb27SDimitry Andric           break;
1436*06c3fb27SDimitry Andric         }
1437*06c3fb27SDimitry Andric       }
1438*06c3fb27SDimitry Andric 
1439*06c3fb27SDimitry Andric       if (!HasAVXType)
1440*06c3fb27SDimitry Andric         return true;
1441*06c3fb27SDimitry Andric     }
1442*06c3fb27SDimitry Andric 
1443*06c3fb27SDimitry Andric     return TargetCodeGenInfo::isNoProtoCallVariadic(args, fnType);
1444*06c3fb27SDimitry Andric   }
1445*06c3fb27SDimitry Andric 
1446*06c3fb27SDimitry Andric   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
1447*06c3fb27SDimitry Andric                            CodeGen::CodeGenModule &CGM) const override {
1448*06c3fb27SDimitry Andric     if (GV->isDeclaration())
1449*06c3fb27SDimitry Andric       return;
1450*06c3fb27SDimitry Andric     if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
1451*06c3fb27SDimitry Andric       if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
1452*06c3fb27SDimitry Andric         llvm::Function *Fn = cast<llvm::Function>(GV);
1453*06c3fb27SDimitry Andric         Fn->addFnAttr("stackrealign");
1454*06c3fb27SDimitry Andric       }
1455*06c3fb27SDimitry Andric 
1456*06c3fb27SDimitry Andric       addX86InterruptAttrs(FD, GV, CGM);
1457*06c3fb27SDimitry Andric     }
1458*06c3fb27SDimitry Andric   }
1459*06c3fb27SDimitry Andric 
1460*06c3fb27SDimitry Andric   void checkFunctionCallABI(CodeGenModule &CGM, SourceLocation CallLoc,
1461*06c3fb27SDimitry Andric                             const FunctionDecl *Caller,
1462*06c3fb27SDimitry Andric                             const FunctionDecl *Callee,
1463*06c3fb27SDimitry Andric                             const CallArgList &Args) const override;
1464*06c3fb27SDimitry Andric };
1465*06c3fb27SDimitry Andric } // namespace
1466*06c3fb27SDimitry Andric 
1467*06c3fb27SDimitry Andric static void initFeatureMaps(const ASTContext &Ctx,
1468*06c3fb27SDimitry Andric                             llvm::StringMap<bool> &CallerMap,
1469*06c3fb27SDimitry Andric                             const FunctionDecl *Caller,
1470*06c3fb27SDimitry Andric                             llvm::StringMap<bool> &CalleeMap,
1471*06c3fb27SDimitry Andric                             const FunctionDecl *Callee) {
1472*06c3fb27SDimitry Andric   if (CalleeMap.empty() && CallerMap.empty()) {
1473*06c3fb27SDimitry Andric     // The caller is potentially nullptr in the case where the call isn't in a
1474*06c3fb27SDimitry Andric     // function.  In this case, the getFunctionFeatureMap ensures we just get
1475*06c3fb27SDimitry Andric     // the TU level setting (since it cannot be modified by 'target'..
1476*06c3fb27SDimitry Andric     Ctx.getFunctionFeatureMap(CallerMap, Caller);
1477*06c3fb27SDimitry Andric     Ctx.getFunctionFeatureMap(CalleeMap, Callee);
1478*06c3fb27SDimitry Andric   }
1479*06c3fb27SDimitry Andric }
1480*06c3fb27SDimitry Andric 
1481*06c3fb27SDimitry Andric static bool checkAVXParamFeature(DiagnosticsEngine &Diag,
1482*06c3fb27SDimitry Andric                                  SourceLocation CallLoc,
1483*06c3fb27SDimitry Andric                                  const llvm::StringMap<bool> &CallerMap,
1484*06c3fb27SDimitry Andric                                  const llvm::StringMap<bool> &CalleeMap,
1485*06c3fb27SDimitry Andric                                  QualType Ty, StringRef Feature,
1486*06c3fb27SDimitry Andric                                  bool IsArgument) {
1487*06c3fb27SDimitry Andric   bool CallerHasFeat = CallerMap.lookup(Feature);
1488*06c3fb27SDimitry Andric   bool CalleeHasFeat = CalleeMap.lookup(Feature);
1489*06c3fb27SDimitry Andric   if (!CallerHasFeat && !CalleeHasFeat)
1490*06c3fb27SDimitry Andric     return Diag.Report(CallLoc, diag::warn_avx_calling_convention)
1491*06c3fb27SDimitry Andric            << IsArgument << Ty << Feature;
1492*06c3fb27SDimitry Andric 
1493*06c3fb27SDimitry Andric   // Mixing calling conventions here is very clearly an error.
1494*06c3fb27SDimitry Andric   if (!CallerHasFeat || !CalleeHasFeat)
1495*06c3fb27SDimitry Andric     return Diag.Report(CallLoc, diag::err_avx_calling_convention)
1496*06c3fb27SDimitry Andric            << IsArgument << Ty << Feature;
1497*06c3fb27SDimitry Andric 
1498*06c3fb27SDimitry Andric   // Else, both caller and callee have the required feature, so there is no need
1499*06c3fb27SDimitry Andric   // to diagnose.
1500*06c3fb27SDimitry Andric   return false;
1501*06c3fb27SDimitry Andric }
1502*06c3fb27SDimitry Andric 
1503*06c3fb27SDimitry Andric static bool checkAVXParam(DiagnosticsEngine &Diag, ASTContext &Ctx,
1504*06c3fb27SDimitry Andric                           SourceLocation CallLoc,
1505*06c3fb27SDimitry Andric                           const llvm::StringMap<bool> &CallerMap,
1506*06c3fb27SDimitry Andric                           const llvm::StringMap<bool> &CalleeMap, QualType Ty,
1507*06c3fb27SDimitry Andric                           bool IsArgument) {
1508*06c3fb27SDimitry Andric   uint64_t Size = Ctx.getTypeSize(Ty);
1509*06c3fb27SDimitry Andric   if (Size > 256)
1510*06c3fb27SDimitry Andric     return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty,
1511*06c3fb27SDimitry Andric                                 "avx512f", IsArgument);
1512*06c3fb27SDimitry Andric 
1513*06c3fb27SDimitry Andric   if (Size > 128)
1514*06c3fb27SDimitry Andric     return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty, "avx",
1515*06c3fb27SDimitry Andric                                 IsArgument);
1516*06c3fb27SDimitry Andric 
1517*06c3fb27SDimitry Andric   return false;
1518*06c3fb27SDimitry Andric }
1519*06c3fb27SDimitry Andric 
1520*06c3fb27SDimitry Andric void X86_64TargetCodeGenInfo::checkFunctionCallABI(
1521*06c3fb27SDimitry Andric     CodeGenModule &CGM, SourceLocation CallLoc, const FunctionDecl *Caller,
1522*06c3fb27SDimitry Andric     const FunctionDecl *Callee, const CallArgList &Args) const {
1523*06c3fb27SDimitry Andric   llvm::StringMap<bool> CallerMap;
1524*06c3fb27SDimitry Andric   llvm::StringMap<bool> CalleeMap;
1525*06c3fb27SDimitry Andric   unsigned ArgIndex = 0;
1526*06c3fb27SDimitry Andric 
1527*06c3fb27SDimitry Andric   // We need to loop through the actual call arguments rather than the
1528*06c3fb27SDimitry Andric   // function's parameters, in case this variadic.
1529*06c3fb27SDimitry Andric   for (const CallArg &Arg : Args) {
1530*06c3fb27SDimitry Andric     // The "avx" feature changes how vectors >128 in size are passed. "avx512f"
1531*06c3fb27SDimitry Andric     // additionally changes how vectors >256 in size are passed. Like GCC, we
1532*06c3fb27SDimitry Andric     // warn when a function is called with an argument where this will change.
1533*06c3fb27SDimitry Andric     // Unlike GCC, we also error when it is an obvious ABI mismatch, that is,
1534*06c3fb27SDimitry Andric     // the caller and callee features are mismatched.
1535*06c3fb27SDimitry Andric     // Unfortunately, we cannot do this diagnostic in SEMA, since the callee can
1536*06c3fb27SDimitry Andric     // change its ABI with attribute-target after this call.
1537*06c3fb27SDimitry Andric     if (Arg.getType()->isVectorType() &&
1538*06c3fb27SDimitry Andric         CGM.getContext().getTypeSize(Arg.getType()) > 128) {
1539*06c3fb27SDimitry Andric       initFeatureMaps(CGM.getContext(), CallerMap, Caller, CalleeMap, Callee);
1540*06c3fb27SDimitry Andric       QualType Ty = Arg.getType();
1541*06c3fb27SDimitry Andric       // The CallArg seems to have desugared the type already, so for clearer
1542*06c3fb27SDimitry Andric       // diagnostics, replace it with the type in the FunctionDecl if possible.
1543*06c3fb27SDimitry Andric       if (ArgIndex < Callee->getNumParams())
1544*06c3fb27SDimitry Andric         Ty = Callee->getParamDecl(ArgIndex)->getType();
1545*06c3fb27SDimitry Andric 
1546*06c3fb27SDimitry Andric       if (checkAVXParam(CGM.getDiags(), CGM.getContext(), CallLoc, CallerMap,
1547*06c3fb27SDimitry Andric                         CalleeMap, Ty, /*IsArgument*/ true))
1548*06c3fb27SDimitry Andric         return;
1549*06c3fb27SDimitry Andric     }
1550*06c3fb27SDimitry Andric     ++ArgIndex;
1551*06c3fb27SDimitry Andric   }
1552*06c3fb27SDimitry Andric 
1553*06c3fb27SDimitry Andric   // Check return always, as we don't have a good way of knowing in codegen
1554*06c3fb27SDimitry Andric   // whether this value is used, tail-called, etc.
1555*06c3fb27SDimitry Andric   if (Callee->getReturnType()->isVectorType() &&
1556*06c3fb27SDimitry Andric       CGM.getContext().getTypeSize(Callee->getReturnType()) > 128) {
1557*06c3fb27SDimitry Andric     initFeatureMaps(CGM.getContext(), CallerMap, Caller, CalleeMap, Callee);
1558*06c3fb27SDimitry Andric     checkAVXParam(CGM.getDiags(), CGM.getContext(), CallLoc, CallerMap,
1559*06c3fb27SDimitry Andric                   CalleeMap, Callee->getReturnType(),
1560*06c3fb27SDimitry Andric                   /*IsArgument*/ false);
1561*06c3fb27SDimitry Andric   }
1562*06c3fb27SDimitry Andric }
1563*06c3fb27SDimitry Andric 
1564*06c3fb27SDimitry Andric std::string TargetCodeGenInfo::qualifyWindowsLibrary(StringRef Lib) {
1565*06c3fb27SDimitry Andric   // If the argument does not end in .lib, automatically add the suffix.
1566*06c3fb27SDimitry Andric   // If the argument contains a space, enclose it in quotes.
1567*06c3fb27SDimitry Andric   // This matches the behavior of MSVC.
1568*06c3fb27SDimitry Andric   bool Quote = Lib.contains(' ');
1569*06c3fb27SDimitry Andric   std::string ArgStr = Quote ? "\"" : "";
1570*06c3fb27SDimitry Andric   ArgStr += Lib;
1571*06c3fb27SDimitry Andric   if (!Lib.ends_with_insensitive(".lib") && !Lib.ends_with_insensitive(".a"))
1572*06c3fb27SDimitry Andric     ArgStr += ".lib";
1573*06c3fb27SDimitry Andric   ArgStr += Quote ? "\"" : "";
1574*06c3fb27SDimitry Andric   return ArgStr;
1575*06c3fb27SDimitry Andric }
1576*06c3fb27SDimitry Andric 
1577*06c3fb27SDimitry Andric namespace {
1578*06c3fb27SDimitry Andric class WinX86_32TargetCodeGenInfo : public X86_32TargetCodeGenInfo {
1579*06c3fb27SDimitry Andric public:
1580*06c3fb27SDimitry Andric   WinX86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
1581*06c3fb27SDimitry Andric         bool DarwinVectorABI, bool RetSmallStructInRegABI, bool Win32StructABI,
1582*06c3fb27SDimitry Andric         unsigned NumRegisterParameters)
1583*06c3fb27SDimitry Andric     : X86_32TargetCodeGenInfo(CGT, DarwinVectorABI, RetSmallStructInRegABI,
1584*06c3fb27SDimitry Andric         Win32StructABI, NumRegisterParameters, false) {}
1585*06c3fb27SDimitry Andric 
1586*06c3fb27SDimitry Andric   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
1587*06c3fb27SDimitry Andric                            CodeGen::CodeGenModule &CGM) const override;
1588*06c3fb27SDimitry Andric 
1589*06c3fb27SDimitry Andric   void getDependentLibraryOption(llvm::StringRef Lib,
1590*06c3fb27SDimitry Andric                                  llvm::SmallString<24> &Opt) const override {
1591*06c3fb27SDimitry Andric     Opt = "/DEFAULTLIB:";
1592*06c3fb27SDimitry Andric     Opt += qualifyWindowsLibrary(Lib);
1593*06c3fb27SDimitry Andric   }
1594*06c3fb27SDimitry Andric 
1595*06c3fb27SDimitry Andric   void getDetectMismatchOption(llvm::StringRef Name,
1596*06c3fb27SDimitry Andric                                llvm::StringRef Value,
1597*06c3fb27SDimitry Andric                                llvm::SmallString<32> &Opt) const override {
1598*06c3fb27SDimitry Andric     Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
1599*06c3fb27SDimitry Andric   }
1600*06c3fb27SDimitry Andric };
1601*06c3fb27SDimitry Andric } // namespace
1602*06c3fb27SDimitry Andric 
1603*06c3fb27SDimitry Andric void WinX86_32TargetCodeGenInfo::setTargetAttributes(
1604*06c3fb27SDimitry Andric     const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
1605*06c3fb27SDimitry Andric   X86_32TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
1606*06c3fb27SDimitry Andric   if (GV->isDeclaration())
1607*06c3fb27SDimitry Andric     return;
1608*06c3fb27SDimitry Andric   addStackProbeTargetAttributes(D, GV, CGM);
1609*06c3fb27SDimitry Andric }
1610*06c3fb27SDimitry Andric 
1611*06c3fb27SDimitry Andric namespace {
1612*06c3fb27SDimitry Andric class WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo {
1613*06c3fb27SDimitry Andric public:
1614*06c3fb27SDimitry Andric   WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
1615*06c3fb27SDimitry Andric                              X86AVXABILevel AVXLevel)
1616*06c3fb27SDimitry Andric       : TargetCodeGenInfo(std::make_unique<WinX86_64ABIInfo>(CGT, AVXLevel)) {
1617*06c3fb27SDimitry Andric     SwiftInfo =
1618*06c3fb27SDimitry Andric         std::make_unique<SwiftABIInfo>(CGT, /*SwiftErrorInRegister=*/true);
1619*06c3fb27SDimitry Andric   }
1620*06c3fb27SDimitry Andric 
1621*06c3fb27SDimitry Andric   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
1622*06c3fb27SDimitry Andric                            CodeGen::CodeGenModule &CGM) const override;
1623*06c3fb27SDimitry Andric 
1624*06c3fb27SDimitry Andric   int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
1625*06c3fb27SDimitry Andric     return 7;
1626*06c3fb27SDimitry Andric   }
1627*06c3fb27SDimitry Andric 
1628*06c3fb27SDimitry Andric   bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
1629*06c3fb27SDimitry Andric                                llvm::Value *Address) const override {
1630*06c3fb27SDimitry Andric     llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
1631*06c3fb27SDimitry Andric 
1632*06c3fb27SDimitry Andric     // 0-15 are the 16 integer registers.
1633*06c3fb27SDimitry Andric     // 16 is %rip.
1634*06c3fb27SDimitry Andric     AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16);
1635*06c3fb27SDimitry Andric     return false;
1636*06c3fb27SDimitry Andric   }
1637*06c3fb27SDimitry Andric 
1638*06c3fb27SDimitry Andric   void getDependentLibraryOption(llvm::StringRef Lib,
1639*06c3fb27SDimitry Andric                                  llvm::SmallString<24> &Opt) const override {
1640*06c3fb27SDimitry Andric     Opt = "/DEFAULTLIB:";
1641*06c3fb27SDimitry Andric     Opt += qualifyWindowsLibrary(Lib);
1642*06c3fb27SDimitry Andric   }
1643*06c3fb27SDimitry Andric 
1644*06c3fb27SDimitry Andric   void getDetectMismatchOption(llvm::StringRef Name,
1645*06c3fb27SDimitry Andric                                llvm::StringRef Value,
1646*06c3fb27SDimitry Andric                                llvm::SmallString<32> &Opt) const override {
1647*06c3fb27SDimitry Andric     Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
1648*06c3fb27SDimitry Andric   }
1649*06c3fb27SDimitry Andric };
1650*06c3fb27SDimitry Andric } // namespace
1651*06c3fb27SDimitry Andric 
1652*06c3fb27SDimitry Andric void WinX86_64TargetCodeGenInfo::setTargetAttributes(
1653*06c3fb27SDimitry Andric     const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
1654*06c3fb27SDimitry Andric   TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
1655*06c3fb27SDimitry Andric   if (GV->isDeclaration())
1656*06c3fb27SDimitry Andric     return;
1657*06c3fb27SDimitry Andric   if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
1658*06c3fb27SDimitry Andric     if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
1659*06c3fb27SDimitry Andric       llvm::Function *Fn = cast<llvm::Function>(GV);
1660*06c3fb27SDimitry Andric       Fn->addFnAttr("stackrealign");
1661*06c3fb27SDimitry Andric     }
1662*06c3fb27SDimitry Andric 
1663*06c3fb27SDimitry Andric     addX86InterruptAttrs(FD, GV, CGM);
1664*06c3fb27SDimitry Andric   }
1665*06c3fb27SDimitry Andric 
1666*06c3fb27SDimitry Andric   addStackProbeTargetAttributes(D, GV, CGM);
1667*06c3fb27SDimitry Andric }
1668*06c3fb27SDimitry Andric 
1669*06c3fb27SDimitry Andric void X86_64ABIInfo::postMerge(unsigned AggregateSize, Class &Lo,
1670*06c3fb27SDimitry Andric                               Class &Hi) const {
1671*06c3fb27SDimitry Andric   // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
1672*06c3fb27SDimitry Andric   //
1673*06c3fb27SDimitry Andric   // (a) If one of the classes is Memory, the whole argument is passed in
1674*06c3fb27SDimitry Andric   //     memory.
1675*06c3fb27SDimitry Andric   //
1676*06c3fb27SDimitry Andric   // (b) If X87UP is not preceded by X87, the whole argument is passed in
1677*06c3fb27SDimitry Andric   //     memory.
1678*06c3fb27SDimitry Andric   //
1679*06c3fb27SDimitry Andric   // (c) If the size of the aggregate exceeds two eightbytes and the first
1680*06c3fb27SDimitry Andric   //     eightbyte isn't SSE or any other eightbyte isn't SSEUP, the whole
1681*06c3fb27SDimitry Andric   //     argument is passed in memory. NOTE: This is necessary to keep the
1682*06c3fb27SDimitry Andric   //     ABI working for processors that don't support the __m256 type.
1683*06c3fb27SDimitry Andric   //
1684*06c3fb27SDimitry Andric   // (d) If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE.
1685*06c3fb27SDimitry Andric   //
1686*06c3fb27SDimitry Andric   // Some of these are enforced by the merging logic.  Others can arise
1687*06c3fb27SDimitry Andric   // only with unions; for example:
1688*06c3fb27SDimitry Andric   //   union { _Complex double; unsigned; }
1689*06c3fb27SDimitry Andric   //
1690*06c3fb27SDimitry Andric   // Note that clauses (b) and (c) were added in 0.98.
1691*06c3fb27SDimitry Andric   //
1692*06c3fb27SDimitry Andric   if (Hi == Memory)
1693*06c3fb27SDimitry Andric     Lo = Memory;
1694*06c3fb27SDimitry Andric   if (Hi == X87Up && Lo != X87 && honorsRevision0_98())
1695*06c3fb27SDimitry Andric     Lo = Memory;
1696*06c3fb27SDimitry Andric   if (AggregateSize > 128 && (Lo != SSE || Hi != SSEUp))
1697*06c3fb27SDimitry Andric     Lo = Memory;
1698*06c3fb27SDimitry Andric   if (Hi == SSEUp && Lo != SSE)
1699*06c3fb27SDimitry Andric     Hi = SSE;
1700*06c3fb27SDimitry Andric }
1701*06c3fb27SDimitry Andric 
1702*06c3fb27SDimitry Andric X86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum, Class Field) {
1703*06c3fb27SDimitry Andric   // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
1704*06c3fb27SDimitry Andric   // classified recursively so that always two fields are
1705*06c3fb27SDimitry Andric   // considered. The resulting class is calculated according to
1706*06c3fb27SDimitry Andric   // the classes of the fields in the eightbyte:
1707*06c3fb27SDimitry Andric   //
1708*06c3fb27SDimitry Andric   // (a) If both classes are equal, this is the resulting class.
1709*06c3fb27SDimitry Andric   //
1710*06c3fb27SDimitry Andric   // (b) If one of the classes is NO_CLASS, the resulting class is
1711*06c3fb27SDimitry Andric   // the other class.
1712*06c3fb27SDimitry Andric   //
1713*06c3fb27SDimitry Andric   // (c) If one of the classes is MEMORY, the result is the MEMORY
1714*06c3fb27SDimitry Andric   // class.
1715*06c3fb27SDimitry Andric   //
1716*06c3fb27SDimitry Andric   // (d) If one of the classes is INTEGER, the result is the
1717*06c3fb27SDimitry Andric   // INTEGER.
1718*06c3fb27SDimitry Andric   //
1719*06c3fb27SDimitry Andric   // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
1720*06c3fb27SDimitry Andric   // MEMORY is used as class.
1721*06c3fb27SDimitry Andric   //
1722*06c3fb27SDimitry Andric   // (f) Otherwise class SSE is used.
1723*06c3fb27SDimitry Andric 
1724*06c3fb27SDimitry Andric   // Accum should never be memory (we should have returned) or
1725*06c3fb27SDimitry Andric   // ComplexX87 (because this cannot be passed in a structure).
1726*06c3fb27SDimitry Andric   assert((Accum != Memory && Accum != ComplexX87) &&
1727*06c3fb27SDimitry Andric          "Invalid accumulated classification during merge.");
1728*06c3fb27SDimitry Andric   if (Accum == Field || Field == NoClass)
1729*06c3fb27SDimitry Andric     return Accum;
1730*06c3fb27SDimitry Andric   if (Field == Memory)
1731*06c3fb27SDimitry Andric     return Memory;
1732*06c3fb27SDimitry Andric   if (Accum == NoClass)
1733*06c3fb27SDimitry Andric     return Field;
1734*06c3fb27SDimitry Andric   if (Accum == Integer || Field == Integer)
1735*06c3fb27SDimitry Andric     return Integer;
1736*06c3fb27SDimitry Andric   if (Field == X87 || Field == X87Up || Field == ComplexX87 ||
1737*06c3fb27SDimitry Andric       Accum == X87 || Accum == X87Up)
1738*06c3fb27SDimitry Andric     return Memory;
1739*06c3fb27SDimitry Andric   return SSE;
1740*06c3fb27SDimitry Andric }
1741*06c3fb27SDimitry Andric 
1742*06c3fb27SDimitry Andric void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, Class &Lo,
1743*06c3fb27SDimitry Andric                              Class &Hi, bool isNamedArg, bool IsRegCall) const {
1744*06c3fb27SDimitry Andric   // FIXME: This code can be simplified by introducing a simple value class for
1745*06c3fb27SDimitry Andric   // Class pairs with appropriate constructor methods for the various
1746*06c3fb27SDimitry Andric   // situations.
1747*06c3fb27SDimitry Andric 
1748*06c3fb27SDimitry Andric   // FIXME: Some of the split computations are wrong; unaligned vectors
1749*06c3fb27SDimitry Andric   // shouldn't be passed in registers for example, so there is no chance they
1750*06c3fb27SDimitry Andric   // can straddle an eightbyte. Verify & simplify.
1751*06c3fb27SDimitry Andric 
1752*06c3fb27SDimitry Andric   Lo = Hi = NoClass;
1753*06c3fb27SDimitry Andric 
1754*06c3fb27SDimitry Andric   Class &Current = OffsetBase < 64 ? Lo : Hi;
1755*06c3fb27SDimitry Andric   Current = Memory;
1756*06c3fb27SDimitry Andric 
1757*06c3fb27SDimitry Andric   if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
1758*06c3fb27SDimitry Andric     BuiltinType::Kind k = BT->getKind();
1759*06c3fb27SDimitry Andric 
1760*06c3fb27SDimitry Andric     if (k == BuiltinType::Void) {
1761*06c3fb27SDimitry Andric       Current = NoClass;
1762*06c3fb27SDimitry Andric     } else if (k == BuiltinType::Int128 || k == BuiltinType::UInt128) {
1763*06c3fb27SDimitry Andric       Lo = Integer;
1764*06c3fb27SDimitry Andric       Hi = Integer;
1765*06c3fb27SDimitry Andric     } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
1766*06c3fb27SDimitry Andric       Current = Integer;
1767*06c3fb27SDimitry Andric     } else if (k == BuiltinType::Float || k == BuiltinType::Double ||
1768*06c3fb27SDimitry Andric                k == BuiltinType::Float16 || k == BuiltinType::BFloat16) {
1769*06c3fb27SDimitry Andric       Current = SSE;
1770*06c3fb27SDimitry Andric     } else if (k == BuiltinType::LongDouble) {
1771*06c3fb27SDimitry Andric       const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
1772*06c3fb27SDimitry Andric       if (LDF == &llvm::APFloat::IEEEquad()) {
1773*06c3fb27SDimitry Andric         Lo = SSE;
1774*06c3fb27SDimitry Andric         Hi = SSEUp;
1775*06c3fb27SDimitry Andric       } else if (LDF == &llvm::APFloat::x87DoubleExtended()) {
1776*06c3fb27SDimitry Andric         Lo = X87;
1777*06c3fb27SDimitry Andric         Hi = X87Up;
1778*06c3fb27SDimitry Andric       } else if (LDF == &llvm::APFloat::IEEEdouble()) {
1779*06c3fb27SDimitry Andric         Current = SSE;
1780*06c3fb27SDimitry Andric       } else
1781*06c3fb27SDimitry Andric         llvm_unreachable("unexpected long double representation!");
1782*06c3fb27SDimitry Andric     }
1783*06c3fb27SDimitry Andric     // FIXME: _Decimal32 and _Decimal64 are SSE.
1784*06c3fb27SDimitry Andric     // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
1785*06c3fb27SDimitry Andric     return;
1786*06c3fb27SDimitry Andric   }
1787*06c3fb27SDimitry Andric 
1788*06c3fb27SDimitry Andric   if (const EnumType *ET = Ty->getAs<EnumType>()) {
1789*06c3fb27SDimitry Andric     // Classify the underlying integer type.
1790*06c3fb27SDimitry Andric     classify(ET->getDecl()->getIntegerType(), OffsetBase, Lo, Hi, isNamedArg);
1791*06c3fb27SDimitry Andric     return;
1792*06c3fb27SDimitry Andric   }
1793*06c3fb27SDimitry Andric 
1794*06c3fb27SDimitry Andric   if (Ty->hasPointerRepresentation()) {
1795*06c3fb27SDimitry Andric     Current = Integer;
1796*06c3fb27SDimitry Andric     return;
1797*06c3fb27SDimitry Andric   }
1798*06c3fb27SDimitry Andric 
1799*06c3fb27SDimitry Andric   if (Ty->isMemberPointerType()) {
1800*06c3fb27SDimitry Andric     if (Ty->isMemberFunctionPointerType()) {
1801*06c3fb27SDimitry Andric       if (Has64BitPointers) {
1802*06c3fb27SDimitry Andric         // If Has64BitPointers, this is an {i64, i64}, so classify both
1803*06c3fb27SDimitry Andric         // Lo and Hi now.
1804*06c3fb27SDimitry Andric         Lo = Hi = Integer;
1805*06c3fb27SDimitry Andric       } else {
1806*06c3fb27SDimitry Andric         // Otherwise, with 32-bit pointers, this is an {i32, i32}. If that
1807*06c3fb27SDimitry Andric         // straddles an eightbyte boundary, Hi should be classified as well.
1808*06c3fb27SDimitry Andric         uint64_t EB_FuncPtr = (OffsetBase) / 64;
1809*06c3fb27SDimitry Andric         uint64_t EB_ThisAdj = (OffsetBase + 64 - 1) / 64;
1810*06c3fb27SDimitry Andric         if (EB_FuncPtr != EB_ThisAdj) {
1811*06c3fb27SDimitry Andric           Lo = Hi = Integer;
1812*06c3fb27SDimitry Andric         } else {
1813*06c3fb27SDimitry Andric           Current = Integer;
1814*06c3fb27SDimitry Andric         }
1815*06c3fb27SDimitry Andric       }
1816*06c3fb27SDimitry Andric     } else {
1817*06c3fb27SDimitry Andric       Current = Integer;
1818*06c3fb27SDimitry Andric     }
1819*06c3fb27SDimitry Andric     return;
1820*06c3fb27SDimitry Andric   }
1821*06c3fb27SDimitry Andric 
1822*06c3fb27SDimitry Andric   if (const VectorType *VT = Ty->getAs<VectorType>()) {
1823*06c3fb27SDimitry Andric     uint64_t Size = getContext().getTypeSize(VT);
1824*06c3fb27SDimitry Andric     if (Size == 1 || Size == 8 || Size == 16 || Size == 32) {
1825*06c3fb27SDimitry Andric       // gcc passes the following as integer:
1826*06c3fb27SDimitry Andric       // 4 bytes - <4 x char>, <2 x short>, <1 x int>, <1 x float>
1827*06c3fb27SDimitry Andric       // 2 bytes - <2 x char>, <1 x short>
1828*06c3fb27SDimitry Andric       // 1 byte  - <1 x char>
1829*06c3fb27SDimitry Andric       Current = Integer;
1830*06c3fb27SDimitry Andric 
1831*06c3fb27SDimitry Andric       // If this type crosses an eightbyte boundary, it should be
1832*06c3fb27SDimitry Andric       // split.
1833*06c3fb27SDimitry Andric       uint64_t EB_Lo = (OffsetBase) / 64;
1834*06c3fb27SDimitry Andric       uint64_t EB_Hi = (OffsetBase + Size - 1) / 64;
1835*06c3fb27SDimitry Andric       if (EB_Lo != EB_Hi)
1836*06c3fb27SDimitry Andric         Hi = Lo;
1837*06c3fb27SDimitry Andric     } else if (Size == 64) {
1838*06c3fb27SDimitry Andric       QualType ElementType = VT->getElementType();
1839*06c3fb27SDimitry Andric 
1840*06c3fb27SDimitry Andric       // gcc passes <1 x double> in memory. :(
1841*06c3fb27SDimitry Andric       if (ElementType->isSpecificBuiltinType(BuiltinType::Double))
1842*06c3fb27SDimitry Andric         return;
1843*06c3fb27SDimitry Andric 
1844*06c3fb27SDimitry Andric       // gcc passes <1 x long long> as SSE but clang used to unconditionally
1845*06c3fb27SDimitry Andric       // pass them as integer.  For platforms where clang is the de facto
1846*06c3fb27SDimitry Andric       // platform compiler, we must continue to use integer.
1847*06c3fb27SDimitry Andric       if (!classifyIntegerMMXAsSSE() &&
1848*06c3fb27SDimitry Andric           (ElementType->isSpecificBuiltinType(BuiltinType::LongLong) ||
1849*06c3fb27SDimitry Andric            ElementType->isSpecificBuiltinType(BuiltinType::ULongLong) ||
1850*06c3fb27SDimitry Andric            ElementType->isSpecificBuiltinType(BuiltinType::Long) ||
1851*06c3fb27SDimitry Andric            ElementType->isSpecificBuiltinType(BuiltinType::ULong)))
1852*06c3fb27SDimitry Andric         Current = Integer;
1853*06c3fb27SDimitry Andric       else
1854*06c3fb27SDimitry Andric         Current = SSE;
1855*06c3fb27SDimitry Andric 
1856*06c3fb27SDimitry Andric       // If this type crosses an eightbyte boundary, it should be
1857*06c3fb27SDimitry Andric       // split.
1858*06c3fb27SDimitry Andric       if (OffsetBase && OffsetBase != 64)
1859*06c3fb27SDimitry Andric         Hi = Lo;
1860*06c3fb27SDimitry Andric     } else if (Size == 128 ||
1861*06c3fb27SDimitry Andric                (isNamedArg && Size <= getNativeVectorSizeForAVXABI(AVXLevel))) {
1862*06c3fb27SDimitry Andric       QualType ElementType = VT->getElementType();
1863*06c3fb27SDimitry Andric 
1864*06c3fb27SDimitry Andric       // gcc passes 256 and 512 bit <X x __int128> vectors in memory. :(
1865*06c3fb27SDimitry Andric       if (passInt128VectorsInMem() && Size != 128 &&
1866*06c3fb27SDimitry Andric           (ElementType->isSpecificBuiltinType(BuiltinType::Int128) ||
1867*06c3fb27SDimitry Andric            ElementType->isSpecificBuiltinType(BuiltinType::UInt128)))
1868*06c3fb27SDimitry Andric         return;
1869*06c3fb27SDimitry Andric 
1870*06c3fb27SDimitry Andric       // Arguments of 256-bits are split into four eightbyte chunks. The
1871*06c3fb27SDimitry Andric       // least significant one belongs to class SSE and all the others to class
1872*06c3fb27SDimitry Andric       // SSEUP. The original Lo and Hi design considers that types can't be
1873*06c3fb27SDimitry Andric       // greater than 128-bits, so a 64-bit split in Hi and Lo makes sense.
1874*06c3fb27SDimitry Andric       // This design isn't correct for 256-bits, but since there're no cases
1875*06c3fb27SDimitry Andric       // where the upper parts would need to be inspected, avoid adding
1876*06c3fb27SDimitry Andric       // complexity and just consider Hi to match the 64-256 part.
1877*06c3fb27SDimitry Andric       //
1878*06c3fb27SDimitry Andric       // Note that per 3.5.7 of AMD64-ABI, 256-bit args are only passed in
1879*06c3fb27SDimitry Andric       // registers if they are "named", i.e. not part of the "..." of a
1880*06c3fb27SDimitry Andric       // variadic function.
1881*06c3fb27SDimitry Andric       //
1882*06c3fb27SDimitry Andric       // Similarly, per 3.2.3. of the AVX512 draft, 512-bits ("named") args are
1883*06c3fb27SDimitry Andric       // split into eight eightbyte chunks, one SSE and seven SSEUP.
1884*06c3fb27SDimitry Andric       Lo = SSE;
1885*06c3fb27SDimitry Andric       Hi = SSEUp;
1886*06c3fb27SDimitry Andric     }
1887*06c3fb27SDimitry Andric     return;
1888*06c3fb27SDimitry Andric   }
1889*06c3fb27SDimitry Andric 
1890*06c3fb27SDimitry Andric   if (const ComplexType *CT = Ty->getAs<ComplexType>()) {
1891*06c3fb27SDimitry Andric     QualType ET = getContext().getCanonicalType(CT->getElementType());
1892*06c3fb27SDimitry Andric 
1893*06c3fb27SDimitry Andric     uint64_t Size = getContext().getTypeSize(Ty);
1894*06c3fb27SDimitry Andric     if (ET->isIntegralOrEnumerationType()) {
1895*06c3fb27SDimitry Andric       if (Size <= 64)
1896*06c3fb27SDimitry Andric         Current = Integer;
1897*06c3fb27SDimitry Andric       else if (Size <= 128)
1898*06c3fb27SDimitry Andric         Lo = Hi = Integer;
1899*06c3fb27SDimitry Andric     } else if (ET->isFloat16Type() || ET == getContext().FloatTy ||
1900*06c3fb27SDimitry Andric                ET->isBFloat16Type()) {
1901*06c3fb27SDimitry Andric       Current = SSE;
1902*06c3fb27SDimitry Andric     } else if (ET == getContext().DoubleTy) {
1903*06c3fb27SDimitry Andric       Lo = Hi = SSE;
1904*06c3fb27SDimitry Andric     } else if (ET == getContext().LongDoubleTy) {
1905*06c3fb27SDimitry Andric       const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
1906*06c3fb27SDimitry Andric       if (LDF == &llvm::APFloat::IEEEquad())
1907*06c3fb27SDimitry Andric         Current = Memory;
1908*06c3fb27SDimitry Andric       else if (LDF == &llvm::APFloat::x87DoubleExtended())
1909*06c3fb27SDimitry Andric         Current = ComplexX87;
1910*06c3fb27SDimitry Andric       else if (LDF == &llvm::APFloat::IEEEdouble())
1911*06c3fb27SDimitry Andric         Lo = Hi = SSE;
1912*06c3fb27SDimitry Andric       else
1913*06c3fb27SDimitry Andric         llvm_unreachable("unexpected long double representation!");
1914*06c3fb27SDimitry Andric     }
1915*06c3fb27SDimitry Andric 
1916*06c3fb27SDimitry Andric     // If this complex type crosses an eightbyte boundary then it
1917*06c3fb27SDimitry Andric     // should be split.
1918*06c3fb27SDimitry Andric     uint64_t EB_Real = (OffsetBase) / 64;
1919*06c3fb27SDimitry Andric     uint64_t EB_Imag = (OffsetBase + getContext().getTypeSize(ET)) / 64;
1920*06c3fb27SDimitry Andric     if (Hi == NoClass && EB_Real != EB_Imag)
1921*06c3fb27SDimitry Andric       Hi = Lo;
1922*06c3fb27SDimitry Andric 
1923*06c3fb27SDimitry Andric     return;
1924*06c3fb27SDimitry Andric   }
1925*06c3fb27SDimitry Andric 
1926*06c3fb27SDimitry Andric   if (const auto *EITy = Ty->getAs<BitIntType>()) {
1927*06c3fb27SDimitry Andric     if (EITy->getNumBits() <= 64)
1928*06c3fb27SDimitry Andric       Current = Integer;
1929*06c3fb27SDimitry Andric     else if (EITy->getNumBits() <= 128)
1930*06c3fb27SDimitry Andric       Lo = Hi = Integer;
1931*06c3fb27SDimitry Andric     // Larger values need to get passed in memory.
1932*06c3fb27SDimitry Andric     return;
1933*06c3fb27SDimitry Andric   }
1934*06c3fb27SDimitry Andric 
1935*06c3fb27SDimitry Andric   if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
1936*06c3fb27SDimitry Andric     // Arrays are treated like structures.
1937*06c3fb27SDimitry Andric 
1938*06c3fb27SDimitry Andric     uint64_t Size = getContext().getTypeSize(Ty);
1939*06c3fb27SDimitry Andric 
1940*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
1941*06c3fb27SDimitry Andric     // than eight eightbytes, ..., it has class MEMORY.
1942*06c3fb27SDimitry Andric     // regcall ABI doesn't have limitation to an object. The only limitation
1943*06c3fb27SDimitry Andric     // is the free registers, which will be checked in computeInfo.
1944*06c3fb27SDimitry Andric     if (!IsRegCall && Size > 512)
1945*06c3fb27SDimitry Andric       return;
1946*06c3fb27SDimitry Andric 
1947*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
1948*06c3fb27SDimitry Andric     // fields, it has class MEMORY.
1949*06c3fb27SDimitry Andric     //
1950*06c3fb27SDimitry Andric     // Only need to check alignment of array base.
1951*06c3fb27SDimitry Andric     if (OffsetBase % getContext().getTypeAlign(AT->getElementType()))
1952*06c3fb27SDimitry Andric       return;
1953*06c3fb27SDimitry Andric 
1954*06c3fb27SDimitry Andric     // Otherwise implement simplified merge. We could be smarter about
1955*06c3fb27SDimitry Andric     // this, but it isn't worth it and would be harder to verify.
1956*06c3fb27SDimitry Andric     Current = NoClass;
1957*06c3fb27SDimitry Andric     uint64_t EltSize = getContext().getTypeSize(AT->getElementType());
1958*06c3fb27SDimitry Andric     uint64_t ArraySize = AT->getSize().getZExtValue();
1959*06c3fb27SDimitry Andric 
1960*06c3fb27SDimitry Andric     // The only case a 256-bit wide vector could be used is when the array
1961*06c3fb27SDimitry Andric     // contains a single 256-bit element. Since Lo and Hi logic isn't extended
1962*06c3fb27SDimitry Andric     // to work for sizes wider than 128, early check and fallback to memory.
1963*06c3fb27SDimitry Andric     //
1964*06c3fb27SDimitry Andric     if (Size > 128 &&
1965*06c3fb27SDimitry Andric         (Size != EltSize || Size > getNativeVectorSizeForAVXABI(AVXLevel)))
1966*06c3fb27SDimitry Andric       return;
1967*06c3fb27SDimitry Andric 
1968*06c3fb27SDimitry Andric     for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
1969*06c3fb27SDimitry Andric       Class FieldLo, FieldHi;
1970*06c3fb27SDimitry Andric       classify(AT->getElementType(), Offset, FieldLo, FieldHi, isNamedArg);
1971*06c3fb27SDimitry Andric       Lo = merge(Lo, FieldLo);
1972*06c3fb27SDimitry Andric       Hi = merge(Hi, FieldHi);
1973*06c3fb27SDimitry Andric       if (Lo == Memory || Hi == Memory)
1974*06c3fb27SDimitry Andric         break;
1975*06c3fb27SDimitry Andric     }
1976*06c3fb27SDimitry Andric 
1977*06c3fb27SDimitry Andric     postMerge(Size, Lo, Hi);
1978*06c3fb27SDimitry Andric     assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
1979*06c3fb27SDimitry Andric     return;
1980*06c3fb27SDimitry Andric   }
1981*06c3fb27SDimitry Andric 
1982*06c3fb27SDimitry Andric   if (const RecordType *RT = Ty->getAs<RecordType>()) {
1983*06c3fb27SDimitry Andric     uint64_t Size = getContext().getTypeSize(Ty);
1984*06c3fb27SDimitry Andric 
1985*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
1986*06c3fb27SDimitry Andric     // than eight eightbytes, ..., it has class MEMORY.
1987*06c3fb27SDimitry Andric     if (Size > 512)
1988*06c3fb27SDimitry Andric       return;
1989*06c3fb27SDimitry Andric 
1990*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p2: Rule 2. If a C++ object has either a non-trivial
1991*06c3fb27SDimitry Andric     // copy constructor or a non-trivial destructor, it is passed by invisible
1992*06c3fb27SDimitry Andric     // reference.
1993*06c3fb27SDimitry Andric     if (getRecordArgABI(RT, getCXXABI()))
1994*06c3fb27SDimitry Andric       return;
1995*06c3fb27SDimitry Andric 
1996*06c3fb27SDimitry Andric     const RecordDecl *RD = RT->getDecl();
1997*06c3fb27SDimitry Andric 
1998*06c3fb27SDimitry Andric     // Assume variable sized types are passed in memory.
1999*06c3fb27SDimitry Andric     if (RD->hasFlexibleArrayMember())
2000*06c3fb27SDimitry Andric       return;
2001*06c3fb27SDimitry Andric 
2002*06c3fb27SDimitry Andric     const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
2003*06c3fb27SDimitry Andric 
2004*06c3fb27SDimitry Andric     // Reset Lo class, this will be recomputed.
2005*06c3fb27SDimitry Andric     Current = NoClass;
2006*06c3fb27SDimitry Andric 
2007*06c3fb27SDimitry Andric     // If this is a C++ record, classify the bases first.
2008*06c3fb27SDimitry Andric     if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
2009*06c3fb27SDimitry Andric       for (const auto &I : CXXRD->bases()) {
2010*06c3fb27SDimitry Andric         assert(!I.isVirtual() && !I.getType()->isDependentType() &&
2011*06c3fb27SDimitry Andric                "Unexpected base class!");
2012*06c3fb27SDimitry Andric         const auto *Base =
2013*06c3fb27SDimitry Andric             cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
2014*06c3fb27SDimitry Andric 
2015*06c3fb27SDimitry Andric         // Classify this field.
2016*06c3fb27SDimitry Andric         //
2017*06c3fb27SDimitry Andric         // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate exceeds a
2018*06c3fb27SDimitry Andric         // single eightbyte, each is classified separately. Each eightbyte gets
2019*06c3fb27SDimitry Andric         // initialized to class NO_CLASS.
2020*06c3fb27SDimitry Andric         Class FieldLo, FieldHi;
2021*06c3fb27SDimitry Andric         uint64_t Offset =
2022*06c3fb27SDimitry Andric           OffsetBase + getContext().toBits(Layout.getBaseClassOffset(Base));
2023*06c3fb27SDimitry Andric         classify(I.getType(), Offset, FieldLo, FieldHi, isNamedArg);
2024*06c3fb27SDimitry Andric         Lo = merge(Lo, FieldLo);
2025*06c3fb27SDimitry Andric         Hi = merge(Hi, FieldHi);
2026*06c3fb27SDimitry Andric         if (Lo == Memory || Hi == Memory) {
2027*06c3fb27SDimitry Andric           postMerge(Size, Lo, Hi);
2028*06c3fb27SDimitry Andric           return;
2029*06c3fb27SDimitry Andric         }
2030*06c3fb27SDimitry Andric       }
2031*06c3fb27SDimitry Andric     }
2032*06c3fb27SDimitry Andric 
2033*06c3fb27SDimitry Andric     // Classify the fields one at a time, merging the results.
2034*06c3fb27SDimitry Andric     unsigned idx = 0;
2035*06c3fb27SDimitry Andric     bool UseClang11Compat = getContext().getLangOpts().getClangABICompat() <=
2036*06c3fb27SDimitry Andric                                 LangOptions::ClangABI::Ver11 ||
2037*06c3fb27SDimitry Andric                             getContext().getTargetInfo().getTriple().isPS();
2038*06c3fb27SDimitry Andric     bool IsUnion = RT->isUnionType() && !UseClang11Compat;
2039*06c3fb27SDimitry Andric 
2040*06c3fb27SDimitry Andric     for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
2041*06c3fb27SDimitry Andric            i != e; ++i, ++idx) {
2042*06c3fb27SDimitry Andric       uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
2043*06c3fb27SDimitry Andric       bool BitField = i->isBitField();
2044*06c3fb27SDimitry Andric 
2045*06c3fb27SDimitry Andric       // Ignore padding bit-fields.
2046*06c3fb27SDimitry Andric       if (BitField && i->isUnnamedBitfield())
2047*06c3fb27SDimitry Andric         continue;
2048*06c3fb27SDimitry Andric 
2049*06c3fb27SDimitry Andric       // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger than
2050*06c3fb27SDimitry Andric       // eight eightbytes, or it contains unaligned fields, it has class MEMORY.
2051*06c3fb27SDimitry Andric       //
2052*06c3fb27SDimitry Andric       // The only case a 256-bit or a 512-bit wide vector could be used is when
2053*06c3fb27SDimitry Andric       // the struct contains a single 256-bit or 512-bit element. Early check
2054*06c3fb27SDimitry Andric       // and fallback to memory.
2055*06c3fb27SDimitry Andric       //
2056*06c3fb27SDimitry Andric       // FIXME: Extended the Lo and Hi logic properly to work for size wider
2057*06c3fb27SDimitry Andric       // than 128.
2058*06c3fb27SDimitry Andric       if (Size > 128 &&
2059*06c3fb27SDimitry Andric           ((!IsUnion && Size != getContext().getTypeSize(i->getType())) ||
2060*06c3fb27SDimitry Andric            Size > getNativeVectorSizeForAVXABI(AVXLevel))) {
2061*06c3fb27SDimitry Andric         Lo = Memory;
2062*06c3fb27SDimitry Andric         postMerge(Size, Lo, Hi);
2063*06c3fb27SDimitry Andric         return;
2064*06c3fb27SDimitry Andric       }
2065*06c3fb27SDimitry Andric       // Note, skip this test for bit-fields, see below.
2066*06c3fb27SDimitry Andric       if (!BitField && Offset % getContext().getTypeAlign(i->getType())) {
2067*06c3fb27SDimitry Andric         Lo = Memory;
2068*06c3fb27SDimitry Andric         postMerge(Size, Lo, Hi);
2069*06c3fb27SDimitry Andric         return;
2070*06c3fb27SDimitry Andric       }
2071*06c3fb27SDimitry Andric 
2072*06c3fb27SDimitry Andric       // Classify this field.
2073*06c3fb27SDimitry Andric       //
2074*06c3fb27SDimitry Andric       // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate
2075*06c3fb27SDimitry Andric       // exceeds a single eightbyte, each is classified
2076*06c3fb27SDimitry Andric       // separately. Each eightbyte gets initialized to class
2077*06c3fb27SDimitry Andric       // NO_CLASS.
2078*06c3fb27SDimitry Andric       Class FieldLo, FieldHi;
2079*06c3fb27SDimitry Andric 
2080*06c3fb27SDimitry Andric       // Bit-fields require special handling, they do not force the
2081*06c3fb27SDimitry Andric       // structure to be passed in memory even if unaligned, and
2082*06c3fb27SDimitry Andric       // therefore they can straddle an eightbyte.
2083*06c3fb27SDimitry Andric       if (BitField) {
2084*06c3fb27SDimitry Andric         assert(!i->isUnnamedBitfield());
2085*06c3fb27SDimitry Andric         uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
2086*06c3fb27SDimitry Andric         uint64_t Size = i->getBitWidthValue(getContext());
2087*06c3fb27SDimitry Andric 
2088*06c3fb27SDimitry Andric         uint64_t EB_Lo = Offset / 64;
2089*06c3fb27SDimitry Andric         uint64_t EB_Hi = (Offset + Size - 1) / 64;
2090*06c3fb27SDimitry Andric 
2091*06c3fb27SDimitry Andric         if (EB_Lo) {
2092*06c3fb27SDimitry Andric           assert(EB_Hi == EB_Lo && "Invalid classification, type > 16 bytes.");
2093*06c3fb27SDimitry Andric           FieldLo = NoClass;
2094*06c3fb27SDimitry Andric           FieldHi = Integer;
2095*06c3fb27SDimitry Andric         } else {
2096*06c3fb27SDimitry Andric           FieldLo = Integer;
2097*06c3fb27SDimitry Andric           FieldHi = EB_Hi ? Integer : NoClass;
2098*06c3fb27SDimitry Andric         }
2099*06c3fb27SDimitry Andric       } else
2100*06c3fb27SDimitry Andric         classify(i->getType(), Offset, FieldLo, FieldHi, isNamedArg);
2101*06c3fb27SDimitry Andric       Lo = merge(Lo, FieldLo);
2102*06c3fb27SDimitry Andric       Hi = merge(Hi, FieldHi);
2103*06c3fb27SDimitry Andric       if (Lo == Memory || Hi == Memory)
2104*06c3fb27SDimitry Andric         break;
2105*06c3fb27SDimitry Andric     }
2106*06c3fb27SDimitry Andric 
2107*06c3fb27SDimitry Andric     postMerge(Size, Lo, Hi);
2108*06c3fb27SDimitry Andric   }
2109*06c3fb27SDimitry Andric }
2110*06c3fb27SDimitry Andric 
2111*06c3fb27SDimitry Andric ABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const {
2112*06c3fb27SDimitry Andric   // If this is a scalar LLVM value then assume LLVM will pass it in the right
2113*06c3fb27SDimitry Andric   // place naturally.
2114*06c3fb27SDimitry Andric   if (!isAggregateTypeForABI(Ty)) {
2115*06c3fb27SDimitry Andric     // Treat an enum type as its underlying type.
2116*06c3fb27SDimitry Andric     if (const EnumType *EnumTy = Ty->getAs<EnumType>())
2117*06c3fb27SDimitry Andric       Ty = EnumTy->getDecl()->getIntegerType();
2118*06c3fb27SDimitry Andric 
2119*06c3fb27SDimitry Andric     if (Ty->isBitIntType())
2120*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(Ty);
2121*06c3fb27SDimitry Andric 
2122*06c3fb27SDimitry Andric     return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
2123*06c3fb27SDimitry Andric                                               : ABIArgInfo::getDirect());
2124*06c3fb27SDimitry Andric   }
2125*06c3fb27SDimitry Andric 
2126*06c3fb27SDimitry Andric   return getNaturalAlignIndirect(Ty);
2127*06c3fb27SDimitry Andric }
2128*06c3fb27SDimitry Andric 
2129*06c3fb27SDimitry Andric bool X86_64ABIInfo::IsIllegalVectorType(QualType Ty) const {
2130*06c3fb27SDimitry Andric   if (const VectorType *VecTy = Ty->getAs<VectorType>()) {
2131*06c3fb27SDimitry Andric     uint64_t Size = getContext().getTypeSize(VecTy);
2132*06c3fb27SDimitry Andric     unsigned LargestVector = getNativeVectorSizeForAVXABI(AVXLevel);
2133*06c3fb27SDimitry Andric     if (Size <= 64 || Size > LargestVector)
2134*06c3fb27SDimitry Andric       return true;
2135*06c3fb27SDimitry Andric     QualType EltTy = VecTy->getElementType();
2136*06c3fb27SDimitry Andric     if (passInt128VectorsInMem() &&
2137*06c3fb27SDimitry Andric         (EltTy->isSpecificBuiltinType(BuiltinType::Int128) ||
2138*06c3fb27SDimitry Andric          EltTy->isSpecificBuiltinType(BuiltinType::UInt128)))
2139*06c3fb27SDimitry Andric       return true;
2140*06c3fb27SDimitry Andric   }
2141*06c3fb27SDimitry Andric 
2142*06c3fb27SDimitry Andric   return false;
2143*06c3fb27SDimitry Andric }
2144*06c3fb27SDimitry Andric 
2145*06c3fb27SDimitry Andric ABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty,
2146*06c3fb27SDimitry Andric                                             unsigned freeIntRegs) const {
2147*06c3fb27SDimitry Andric   // If this is a scalar LLVM value then assume LLVM will pass it in the right
2148*06c3fb27SDimitry Andric   // place naturally.
2149*06c3fb27SDimitry Andric   //
2150*06c3fb27SDimitry Andric   // This assumption is optimistic, as there could be free registers available
2151*06c3fb27SDimitry Andric   // when we need to pass this argument in memory, and LLVM could try to pass
2152*06c3fb27SDimitry Andric   // the argument in the free register. This does not seem to happen currently,
2153*06c3fb27SDimitry Andric   // but this code would be much safer if we could mark the argument with
2154*06c3fb27SDimitry Andric   // 'onstack'. See PR12193.
2155*06c3fb27SDimitry Andric   if (!isAggregateTypeForABI(Ty) && !IsIllegalVectorType(Ty) &&
2156*06c3fb27SDimitry Andric       !Ty->isBitIntType()) {
2157*06c3fb27SDimitry Andric     // Treat an enum type as its underlying type.
2158*06c3fb27SDimitry Andric     if (const EnumType *EnumTy = Ty->getAs<EnumType>())
2159*06c3fb27SDimitry Andric       Ty = EnumTy->getDecl()->getIntegerType();
2160*06c3fb27SDimitry Andric 
2161*06c3fb27SDimitry Andric     return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
2162*06c3fb27SDimitry Andric                                               : ABIArgInfo::getDirect());
2163*06c3fb27SDimitry Andric   }
2164*06c3fb27SDimitry Andric 
2165*06c3fb27SDimitry Andric   if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
2166*06c3fb27SDimitry Andric     return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
2167*06c3fb27SDimitry Andric 
2168*06c3fb27SDimitry Andric   // Compute the byval alignment. We specify the alignment of the byval in all
2169*06c3fb27SDimitry Andric   // cases so that the mid-level optimizer knows the alignment of the byval.
2170*06c3fb27SDimitry Andric   unsigned Align = std::max(getContext().getTypeAlign(Ty) / 8, 8U);
2171*06c3fb27SDimitry Andric 
2172*06c3fb27SDimitry Andric   // Attempt to avoid passing indirect results using byval when possible. This
2173*06c3fb27SDimitry Andric   // is important for good codegen.
2174*06c3fb27SDimitry Andric   //
2175*06c3fb27SDimitry Andric   // We do this by coercing the value into a scalar type which the backend can
2176*06c3fb27SDimitry Andric   // handle naturally (i.e., without using byval).
2177*06c3fb27SDimitry Andric   //
2178*06c3fb27SDimitry Andric   // For simplicity, we currently only do this when we have exhausted all of the
2179*06c3fb27SDimitry Andric   // free integer registers. Doing this when there are free integer registers
2180*06c3fb27SDimitry Andric   // would require more care, as we would have to ensure that the coerced value
2181*06c3fb27SDimitry Andric   // did not claim the unused register. That would require either reording the
2182*06c3fb27SDimitry Andric   // arguments to the function (so that any subsequent inreg values came first),
2183*06c3fb27SDimitry Andric   // or only doing this optimization when there were no following arguments that
2184*06c3fb27SDimitry Andric   // might be inreg.
2185*06c3fb27SDimitry Andric   //
2186*06c3fb27SDimitry Andric   // We currently expect it to be rare (particularly in well written code) for
2187*06c3fb27SDimitry Andric   // arguments to be passed on the stack when there are still free integer
2188*06c3fb27SDimitry Andric   // registers available (this would typically imply large structs being passed
2189*06c3fb27SDimitry Andric   // by value), so this seems like a fair tradeoff for now.
2190*06c3fb27SDimitry Andric   //
2191*06c3fb27SDimitry Andric   // We can revisit this if the backend grows support for 'onstack' parameter
2192*06c3fb27SDimitry Andric   // attributes. See PR12193.
2193*06c3fb27SDimitry Andric   if (freeIntRegs == 0) {
2194*06c3fb27SDimitry Andric     uint64_t Size = getContext().getTypeSize(Ty);
2195*06c3fb27SDimitry Andric 
2196*06c3fb27SDimitry Andric     // If this type fits in an eightbyte, coerce it into the matching integral
2197*06c3fb27SDimitry Andric     // type, which will end up on the stack (with alignment 8).
2198*06c3fb27SDimitry Andric     if (Align == 8 && Size <= 64)
2199*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
2200*06c3fb27SDimitry Andric                                                           Size));
2201*06c3fb27SDimitry Andric   }
2202*06c3fb27SDimitry Andric 
2203*06c3fb27SDimitry Andric   return ABIArgInfo::getIndirect(CharUnits::fromQuantity(Align));
2204*06c3fb27SDimitry Andric }
2205*06c3fb27SDimitry Andric 
2206*06c3fb27SDimitry Andric /// The ABI specifies that a value should be passed in a full vector XMM/YMM
2207*06c3fb27SDimitry Andric /// register. Pick an LLVM IR type that will be passed as a vector register.
2208*06c3fb27SDimitry Andric llvm::Type *X86_64ABIInfo::GetByteVectorType(QualType Ty) const {
2209*06c3fb27SDimitry Andric   // Wrapper structs/arrays that only contain vectors are passed just like
2210*06c3fb27SDimitry Andric   // vectors; strip them off if present.
2211*06c3fb27SDimitry Andric   if (const Type *InnerTy = isSingleElementStruct(Ty, getContext()))
2212*06c3fb27SDimitry Andric     Ty = QualType(InnerTy, 0);
2213*06c3fb27SDimitry Andric 
2214*06c3fb27SDimitry Andric   llvm::Type *IRType = CGT.ConvertType(Ty);
2215*06c3fb27SDimitry Andric   if (isa<llvm::VectorType>(IRType)) {
2216*06c3fb27SDimitry Andric     // Don't pass vXi128 vectors in their native type, the backend can't
2217*06c3fb27SDimitry Andric     // legalize them.
2218*06c3fb27SDimitry Andric     if (passInt128VectorsInMem() &&
2219*06c3fb27SDimitry Andric         cast<llvm::VectorType>(IRType)->getElementType()->isIntegerTy(128)) {
2220*06c3fb27SDimitry Andric       // Use a vXi64 vector.
2221*06c3fb27SDimitry Andric       uint64_t Size = getContext().getTypeSize(Ty);
2222*06c3fb27SDimitry Andric       return llvm::FixedVectorType::get(llvm::Type::getInt64Ty(getVMContext()),
2223*06c3fb27SDimitry Andric                                         Size / 64);
2224*06c3fb27SDimitry Andric     }
2225*06c3fb27SDimitry Andric 
2226*06c3fb27SDimitry Andric     return IRType;
2227*06c3fb27SDimitry Andric   }
2228*06c3fb27SDimitry Andric 
2229*06c3fb27SDimitry Andric   if (IRType->getTypeID() == llvm::Type::FP128TyID)
2230*06c3fb27SDimitry Andric     return IRType;
2231*06c3fb27SDimitry Andric 
2232*06c3fb27SDimitry Andric   // We couldn't find the preferred IR vector type for 'Ty'.
2233*06c3fb27SDimitry Andric   uint64_t Size = getContext().getTypeSize(Ty);
2234*06c3fb27SDimitry Andric   assert((Size == 128 || Size == 256 || Size == 512) && "Invalid type found!");
2235*06c3fb27SDimitry Andric 
2236*06c3fb27SDimitry Andric 
2237*06c3fb27SDimitry Andric   // Return a LLVM IR vector type based on the size of 'Ty'.
2238*06c3fb27SDimitry Andric   return llvm::FixedVectorType::get(llvm::Type::getDoubleTy(getVMContext()),
2239*06c3fb27SDimitry Andric                                     Size / 64);
2240*06c3fb27SDimitry Andric }
2241*06c3fb27SDimitry Andric 
2242*06c3fb27SDimitry Andric /// BitsContainNoUserData - Return true if the specified [start,end) bit range
2243*06c3fb27SDimitry Andric /// is known to either be off the end of the specified type or being in
2244*06c3fb27SDimitry Andric /// alignment padding.  The user type specified is known to be at most 128 bits
2245*06c3fb27SDimitry Andric /// in size, and have passed through X86_64ABIInfo::classify with a successful
2246*06c3fb27SDimitry Andric /// classification that put one of the two halves in the INTEGER class.
2247*06c3fb27SDimitry Andric ///
2248*06c3fb27SDimitry Andric /// It is conservatively correct to return false.
2249*06c3fb27SDimitry Andric static bool BitsContainNoUserData(QualType Ty, unsigned StartBit,
2250*06c3fb27SDimitry Andric                                   unsigned EndBit, ASTContext &Context) {
2251*06c3fb27SDimitry Andric   // If the bytes being queried are off the end of the type, there is no user
2252*06c3fb27SDimitry Andric   // data hiding here.  This handles analysis of builtins, vectors and other
2253*06c3fb27SDimitry Andric   // types that don't contain interesting padding.
2254*06c3fb27SDimitry Andric   unsigned TySize = (unsigned)Context.getTypeSize(Ty);
2255*06c3fb27SDimitry Andric   if (TySize <= StartBit)
2256*06c3fb27SDimitry Andric     return true;
2257*06c3fb27SDimitry Andric 
2258*06c3fb27SDimitry Andric   if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
2259*06c3fb27SDimitry Andric     unsigned EltSize = (unsigned)Context.getTypeSize(AT->getElementType());
2260*06c3fb27SDimitry Andric     unsigned NumElts = (unsigned)AT->getSize().getZExtValue();
2261*06c3fb27SDimitry Andric 
2262*06c3fb27SDimitry Andric     // Check each element to see if the element overlaps with the queried range.
2263*06c3fb27SDimitry Andric     for (unsigned i = 0; i != NumElts; ++i) {
2264*06c3fb27SDimitry Andric       // If the element is after the span we care about, then we're done..
2265*06c3fb27SDimitry Andric       unsigned EltOffset = i*EltSize;
2266*06c3fb27SDimitry Andric       if (EltOffset >= EndBit) break;
2267*06c3fb27SDimitry Andric 
2268*06c3fb27SDimitry Andric       unsigned EltStart = EltOffset < StartBit ? StartBit-EltOffset :0;
2269*06c3fb27SDimitry Andric       if (!BitsContainNoUserData(AT->getElementType(), EltStart,
2270*06c3fb27SDimitry Andric                                  EndBit-EltOffset, Context))
2271*06c3fb27SDimitry Andric         return false;
2272*06c3fb27SDimitry Andric     }
2273*06c3fb27SDimitry Andric     // If it overlaps no elements, then it is safe to process as padding.
2274*06c3fb27SDimitry Andric     return true;
2275*06c3fb27SDimitry Andric   }
2276*06c3fb27SDimitry Andric 
2277*06c3fb27SDimitry Andric   if (const RecordType *RT = Ty->getAs<RecordType>()) {
2278*06c3fb27SDimitry Andric     const RecordDecl *RD = RT->getDecl();
2279*06c3fb27SDimitry Andric     const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
2280*06c3fb27SDimitry Andric 
2281*06c3fb27SDimitry Andric     // If this is a C++ record, check the bases first.
2282*06c3fb27SDimitry Andric     if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
2283*06c3fb27SDimitry Andric       for (const auto &I : CXXRD->bases()) {
2284*06c3fb27SDimitry Andric         assert(!I.isVirtual() && !I.getType()->isDependentType() &&
2285*06c3fb27SDimitry Andric                "Unexpected base class!");
2286*06c3fb27SDimitry Andric         const auto *Base =
2287*06c3fb27SDimitry Andric             cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
2288*06c3fb27SDimitry Andric 
2289*06c3fb27SDimitry Andric         // If the base is after the span we care about, ignore it.
2290*06c3fb27SDimitry Andric         unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base));
2291*06c3fb27SDimitry Andric         if (BaseOffset >= EndBit) continue;
2292*06c3fb27SDimitry Andric 
2293*06c3fb27SDimitry Andric         unsigned BaseStart = BaseOffset < StartBit ? StartBit-BaseOffset :0;
2294*06c3fb27SDimitry Andric         if (!BitsContainNoUserData(I.getType(), BaseStart,
2295*06c3fb27SDimitry Andric                                    EndBit-BaseOffset, Context))
2296*06c3fb27SDimitry Andric           return false;
2297*06c3fb27SDimitry Andric       }
2298*06c3fb27SDimitry Andric     }
2299*06c3fb27SDimitry Andric 
2300*06c3fb27SDimitry Andric     // Verify that no field has data that overlaps the region of interest.  Yes
2301*06c3fb27SDimitry Andric     // this could be sped up a lot by being smarter about queried fields,
2302*06c3fb27SDimitry Andric     // however we're only looking at structs up to 16 bytes, so we don't care
2303*06c3fb27SDimitry Andric     // much.
2304*06c3fb27SDimitry Andric     unsigned idx = 0;
2305*06c3fb27SDimitry Andric     for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
2306*06c3fb27SDimitry Andric          i != e; ++i, ++idx) {
2307*06c3fb27SDimitry Andric       unsigned FieldOffset = (unsigned)Layout.getFieldOffset(idx);
2308*06c3fb27SDimitry Andric 
2309*06c3fb27SDimitry Andric       // If we found a field after the region we care about, then we're done.
2310*06c3fb27SDimitry Andric       if (FieldOffset >= EndBit) break;
2311*06c3fb27SDimitry Andric 
2312*06c3fb27SDimitry Andric       unsigned FieldStart = FieldOffset < StartBit ? StartBit-FieldOffset :0;
2313*06c3fb27SDimitry Andric       if (!BitsContainNoUserData(i->getType(), FieldStart, EndBit-FieldOffset,
2314*06c3fb27SDimitry Andric                                  Context))
2315*06c3fb27SDimitry Andric         return false;
2316*06c3fb27SDimitry Andric     }
2317*06c3fb27SDimitry Andric 
2318*06c3fb27SDimitry Andric     // If nothing in this record overlapped the area of interest, then we're
2319*06c3fb27SDimitry Andric     // clean.
2320*06c3fb27SDimitry Andric     return true;
2321*06c3fb27SDimitry Andric   }
2322*06c3fb27SDimitry Andric 
2323*06c3fb27SDimitry Andric   return false;
2324*06c3fb27SDimitry Andric }
2325*06c3fb27SDimitry Andric 
2326*06c3fb27SDimitry Andric /// getFPTypeAtOffset - Return a floating point type at the specified offset.
2327*06c3fb27SDimitry Andric static llvm::Type *getFPTypeAtOffset(llvm::Type *IRType, unsigned IROffset,
2328*06c3fb27SDimitry Andric                                      const llvm::DataLayout &TD) {
2329*06c3fb27SDimitry Andric   if (IROffset == 0 && IRType->isFloatingPointTy())
2330*06c3fb27SDimitry Andric     return IRType;
2331*06c3fb27SDimitry Andric 
2332*06c3fb27SDimitry Andric   // If this is a struct, recurse into the field at the specified offset.
2333*06c3fb27SDimitry Andric   if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) {
2334*06c3fb27SDimitry Andric     if (!STy->getNumContainedTypes())
2335*06c3fb27SDimitry Andric       return nullptr;
2336*06c3fb27SDimitry Andric 
2337*06c3fb27SDimitry Andric     const llvm::StructLayout *SL = TD.getStructLayout(STy);
2338*06c3fb27SDimitry Andric     unsigned Elt = SL->getElementContainingOffset(IROffset);
2339*06c3fb27SDimitry Andric     IROffset -= SL->getElementOffset(Elt);
2340*06c3fb27SDimitry Andric     return getFPTypeAtOffset(STy->getElementType(Elt), IROffset, TD);
2341*06c3fb27SDimitry Andric   }
2342*06c3fb27SDimitry Andric 
2343*06c3fb27SDimitry Andric   // If this is an array, recurse into the field at the specified offset.
2344*06c3fb27SDimitry Andric   if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
2345*06c3fb27SDimitry Andric     llvm::Type *EltTy = ATy->getElementType();
2346*06c3fb27SDimitry Andric     unsigned EltSize = TD.getTypeAllocSize(EltTy);
2347*06c3fb27SDimitry Andric     IROffset -= IROffset / EltSize * EltSize;
2348*06c3fb27SDimitry Andric     return getFPTypeAtOffset(EltTy, IROffset, TD);
2349*06c3fb27SDimitry Andric   }
2350*06c3fb27SDimitry Andric 
2351*06c3fb27SDimitry Andric   return nullptr;
2352*06c3fb27SDimitry Andric }
2353*06c3fb27SDimitry Andric 
2354*06c3fb27SDimitry Andric /// GetSSETypeAtOffset - Return a type that will be passed by the backend in the
2355*06c3fb27SDimitry Andric /// low 8 bytes of an XMM register, corresponding to the SSE class.
2356*06c3fb27SDimitry Andric llvm::Type *X86_64ABIInfo::
2357*06c3fb27SDimitry Andric GetSSETypeAtOffset(llvm::Type *IRType, unsigned IROffset,
2358*06c3fb27SDimitry Andric                    QualType SourceTy, unsigned SourceOffset) const {
2359*06c3fb27SDimitry Andric   const llvm::DataLayout &TD = getDataLayout();
2360*06c3fb27SDimitry Andric   unsigned SourceSize =
2361*06c3fb27SDimitry Andric       (unsigned)getContext().getTypeSize(SourceTy) / 8 - SourceOffset;
2362*06c3fb27SDimitry Andric   llvm::Type *T0 = getFPTypeAtOffset(IRType, IROffset, TD);
2363*06c3fb27SDimitry Andric   if (!T0 || T0->isDoubleTy())
2364*06c3fb27SDimitry Andric     return llvm::Type::getDoubleTy(getVMContext());
2365*06c3fb27SDimitry Andric 
2366*06c3fb27SDimitry Andric   // Get the adjacent FP type.
2367*06c3fb27SDimitry Andric   llvm::Type *T1 = nullptr;
2368*06c3fb27SDimitry Andric   unsigned T0Size = TD.getTypeAllocSize(T0);
2369*06c3fb27SDimitry Andric   if (SourceSize > T0Size)
2370*06c3fb27SDimitry Andric       T1 = getFPTypeAtOffset(IRType, IROffset + T0Size, TD);
2371*06c3fb27SDimitry Andric   if (T1 == nullptr) {
2372*06c3fb27SDimitry Andric     // Check if IRType is a half/bfloat + float. float type will be in IROffset+4 due
2373*06c3fb27SDimitry Andric     // to its alignment.
2374*06c3fb27SDimitry Andric     if (T0->is16bitFPTy() && SourceSize > 4)
2375*06c3fb27SDimitry Andric       T1 = getFPTypeAtOffset(IRType, IROffset + 4, TD);
2376*06c3fb27SDimitry Andric     // If we can't get a second FP type, return a simple half or float.
2377*06c3fb27SDimitry Andric     // avx512fp16-abi.c:pr51813_2 shows it works to return float for
2378*06c3fb27SDimitry Andric     // {float, i8} too.
2379*06c3fb27SDimitry Andric     if (T1 == nullptr)
2380*06c3fb27SDimitry Andric       return T0;
2381*06c3fb27SDimitry Andric   }
2382*06c3fb27SDimitry Andric 
2383*06c3fb27SDimitry Andric   if (T0->isFloatTy() && T1->isFloatTy())
2384*06c3fb27SDimitry Andric     return llvm::FixedVectorType::get(T0, 2);
2385*06c3fb27SDimitry Andric 
2386*06c3fb27SDimitry Andric   if (T0->is16bitFPTy() && T1->is16bitFPTy()) {
2387*06c3fb27SDimitry Andric     llvm::Type *T2 = nullptr;
2388*06c3fb27SDimitry Andric     if (SourceSize > 4)
2389*06c3fb27SDimitry Andric       T2 = getFPTypeAtOffset(IRType, IROffset + 4, TD);
2390*06c3fb27SDimitry Andric     if (T2 == nullptr)
2391*06c3fb27SDimitry Andric       return llvm::FixedVectorType::get(T0, 2);
2392*06c3fb27SDimitry Andric     return llvm::FixedVectorType::get(T0, 4);
2393*06c3fb27SDimitry Andric   }
2394*06c3fb27SDimitry Andric 
2395*06c3fb27SDimitry Andric   if (T0->is16bitFPTy() || T1->is16bitFPTy())
2396*06c3fb27SDimitry Andric     return llvm::FixedVectorType::get(llvm::Type::getHalfTy(getVMContext()), 4);
2397*06c3fb27SDimitry Andric 
2398*06c3fb27SDimitry Andric   return llvm::Type::getDoubleTy(getVMContext());
2399*06c3fb27SDimitry Andric }
2400*06c3fb27SDimitry Andric 
2401*06c3fb27SDimitry Andric 
2402*06c3fb27SDimitry Andric /// GetINTEGERTypeAtOffset - The ABI specifies that a value should be passed in
2403*06c3fb27SDimitry Andric /// an 8-byte GPR.  This means that we either have a scalar or we are talking
2404*06c3fb27SDimitry Andric /// about the high or low part of an up-to-16-byte struct.  This routine picks
2405*06c3fb27SDimitry Andric /// the best LLVM IR type to represent this, which may be i64 or may be anything
2406*06c3fb27SDimitry Andric /// else that the backend will pass in a GPR that works better (e.g. i8, %foo*,
2407*06c3fb27SDimitry Andric /// etc).
2408*06c3fb27SDimitry Andric ///
2409*06c3fb27SDimitry Andric /// PrefType is an LLVM IR type that corresponds to (part of) the IR type for
2410*06c3fb27SDimitry Andric /// the source type.  IROffset is an offset in bytes into the LLVM IR type that
2411*06c3fb27SDimitry Andric /// the 8-byte value references.  PrefType may be null.
2412*06c3fb27SDimitry Andric ///
2413*06c3fb27SDimitry Andric /// SourceTy is the source-level type for the entire argument.  SourceOffset is
2414*06c3fb27SDimitry Andric /// an offset into this that we're processing (which is always either 0 or 8).
2415*06c3fb27SDimitry Andric ///
2416*06c3fb27SDimitry Andric llvm::Type *X86_64ABIInfo::
2417*06c3fb27SDimitry Andric GetINTEGERTypeAtOffset(llvm::Type *IRType, unsigned IROffset,
2418*06c3fb27SDimitry Andric                        QualType SourceTy, unsigned SourceOffset) const {
2419*06c3fb27SDimitry Andric   // If we're dealing with an un-offset LLVM IR type, then it means that we're
2420*06c3fb27SDimitry Andric   // returning an 8-byte unit starting with it.  See if we can safely use it.
2421*06c3fb27SDimitry Andric   if (IROffset == 0) {
2422*06c3fb27SDimitry Andric     // Pointers and int64's always fill the 8-byte unit.
2423*06c3fb27SDimitry Andric     if ((isa<llvm::PointerType>(IRType) && Has64BitPointers) ||
2424*06c3fb27SDimitry Andric         IRType->isIntegerTy(64))
2425*06c3fb27SDimitry Andric       return IRType;
2426*06c3fb27SDimitry Andric 
2427*06c3fb27SDimitry Andric     // If we have a 1/2/4-byte integer, we can use it only if the rest of the
2428*06c3fb27SDimitry Andric     // goodness in the source type is just tail padding.  This is allowed to
2429*06c3fb27SDimitry Andric     // kick in for struct {double,int} on the int, but not on
2430*06c3fb27SDimitry Andric     // struct{double,int,int} because we wouldn't return the second int.  We
2431*06c3fb27SDimitry Andric     // have to do this analysis on the source type because we can't depend on
2432*06c3fb27SDimitry Andric     // unions being lowered a specific way etc.
2433*06c3fb27SDimitry Andric     if (IRType->isIntegerTy(8) || IRType->isIntegerTy(16) ||
2434*06c3fb27SDimitry Andric         IRType->isIntegerTy(32) ||
2435*06c3fb27SDimitry Andric         (isa<llvm::PointerType>(IRType) && !Has64BitPointers)) {
2436*06c3fb27SDimitry Andric       unsigned BitWidth = isa<llvm::PointerType>(IRType) ? 32 :
2437*06c3fb27SDimitry Andric           cast<llvm::IntegerType>(IRType)->getBitWidth();
2438*06c3fb27SDimitry Andric 
2439*06c3fb27SDimitry Andric       if (BitsContainNoUserData(SourceTy, SourceOffset*8+BitWidth,
2440*06c3fb27SDimitry Andric                                 SourceOffset*8+64, getContext()))
2441*06c3fb27SDimitry Andric         return IRType;
2442*06c3fb27SDimitry Andric     }
2443*06c3fb27SDimitry Andric   }
2444*06c3fb27SDimitry Andric 
2445*06c3fb27SDimitry Andric   if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) {
2446*06c3fb27SDimitry Andric     // If this is a struct, recurse into the field at the specified offset.
2447*06c3fb27SDimitry Andric     const llvm::StructLayout *SL = getDataLayout().getStructLayout(STy);
2448*06c3fb27SDimitry Andric     if (IROffset < SL->getSizeInBytes()) {
2449*06c3fb27SDimitry Andric       unsigned FieldIdx = SL->getElementContainingOffset(IROffset);
2450*06c3fb27SDimitry Andric       IROffset -= SL->getElementOffset(FieldIdx);
2451*06c3fb27SDimitry Andric 
2452*06c3fb27SDimitry Andric       return GetINTEGERTypeAtOffset(STy->getElementType(FieldIdx), IROffset,
2453*06c3fb27SDimitry Andric                                     SourceTy, SourceOffset);
2454*06c3fb27SDimitry Andric     }
2455*06c3fb27SDimitry Andric   }
2456*06c3fb27SDimitry Andric 
2457*06c3fb27SDimitry Andric   if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
2458*06c3fb27SDimitry Andric     llvm::Type *EltTy = ATy->getElementType();
2459*06c3fb27SDimitry Andric     unsigned EltSize = getDataLayout().getTypeAllocSize(EltTy);
2460*06c3fb27SDimitry Andric     unsigned EltOffset = IROffset/EltSize*EltSize;
2461*06c3fb27SDimitry Andric     return GetINTEGERTypeAtOffset(EltTy, IROffset-EltOffset, SourceTy,
2462*06c3fb27SDimitry Andric                                   SourceOffset);
2463*06c3fb27SDimitry Andric   }
2464*06c3fb27SDimitry Andric 
2465*06c3fb27SDimitry Andric   // Okay, we don't have any better idea of what to pass, so we pass this in an
2466*06c3fb27SDimitry Andric   // integer register that isn't too big to fit the rest of the struct.
2467*06c3fb27SDimitry Andric   unsigned TySizeInBytes =
2468*06c3fb27SDimitry Andric     (unsigned)getContext().getTypeSizeInChars(SourceTy).getQuantity();
2469*06c3fb27SDimitry Andric 
2470*06c3fb27SDimitry Andric   assert(TySizeInBytes != SourceOffset && "Empty field?");
2471*06c3fb27SDimitry Andric 
2472*06c3fb27SDimitry Andric   // It is always safe to classify this as an integer type up to i64 that
2473*06c3fb27SDimitry Andric   // isn't larger than the structure.
2474*06c3fb27SDimitry Andric   return llvm::IntegerType::get(getVMContext(),
2475*06c3fb27SDimitry Andric                                 std::min(TySizeInBytes-SourceOffset, 8U)*8);
2476*06c3fb27SDimitry Andric }
2477*06c3fb27SDimitry Andric 
2478*06c3fb27SDimitry Andric 
2479*06c3fb27SDimitry Andric /// GetX86_64ByValArgumentPair - Given a high and low type that can ideally
2480*06c3fb27SDimitry Andric /// be used as elements of a two register pair to pass or return, return a
2481*06c3fb27SDimitry Andric /// first class aggregate to represent them.  For example, if the low part of
2482*06c3fb27SDimitry Andric /// a by-value argument should be passed as i32* and the high part as float,
2483*06c3fb27SDimitry Andric /// return {i32*, float}.
2484*06c3fb27SDimitry Andric static llvm::Type *
2485*06c3fb27SDimitry Andric GetX86_64ByValArgumentPair(llvm::Type *Lo, llvm::Type *Hi,
2486*06c3fb27SDimitry Andric                            const llvm::DataLayout &TD) {
2487*06c3fb27SDimitry Andric   // In order to correctly satisfy the ABI, we need to the high part to start
2488*06c3fb27SDimitry Andric   // at offset 8.  If the high and low parts we inferred are both 4-byte types
2489*06c3fb27SDimitry Andric   // (e.g. i32 and i32) then the resultant struct type ({i32,i32}) won't have
2490*06c3fb27SDimitry Andric   // the second element at offset 8.  Check for this:
2491*06c3fb27SDimitry Andric   unsigned LoSize = (unsigned)TD.getTypeAllocSize(Lo);
2492*06c3fb27SDimitry Andric   llvm::Align HiAlign = TD.getABITypeAlign(Hi);
2493*06c3fb27SDimitry Andric   unsigned HiStart = llvm::alignTo(LoSize, HiAlign);
2494*06c3fb27SDimitry Andric   assert(HiStart != 0 && HiStart <= 8 && "Invalid x86-64 argument pair!");
2495*06c3fb27SDimitry Andric 
2496*06c3fb27SDimitry Andric   // To handle this, we have to increase the size of the low part so that the
2497*06c3fb27SDimitry Andric   // second element will start at an 8 byte offset.  We can't increase the size
2498*06c3fb27SDimitry Andric   // of the second element because it might make us access off the end of the
2499*06c3fb27SDimitry Andric   // struct.
2500*06c3fb27SDimitry Andric   if (HiStart != 8) {
2501*06c3fb27SDimitry Andric     // There are usually two sorts of types the ABI generation code can produce
2502*06c3fb27SDimitry Andric     // for the low part of a pair that aren't 8 bytes in size: half, float or
2503*06c3fb27SDimitry Andric     // i8/i16/i32.  This can also include pointers when they are 32-bit (X32 and
2504*06c3fb27SDimitry Andric     // NaCl).
2505*06c3fb27SDimitry Andric     // Promote these to a larger type.
2506*06c3fb27SDimitry Andric     if (Lo->isHalfTy() || Lo->isFloatTy())
2507*06c3fb27SDimitry Andric       Lo = llvm::Type::getDoubleTy(Lo->getContext());
2508*06c3fb27SDimitry Andric     else {
2509*06c3fb27SDimitry Andric       assert((Lo->isIntegerTy() || Lo->isPointerTy())
2510*06c3fb27SDimitry Andric              && "Invalid/unknown lo type");
2511*06c3fb27SDimitry Andric       Lo = llvm::Type::getInt64Ty(Lo->getContext());
2512*06c3fb27SDimitry Andric     }
2513*06c3fb27SDimitry Andric   }
2514*06c3fb27SDimitry Andric 
2515*06c3fb27SDimitry Andric   llvm::StructType *Result = llvm::StructType::get(Lo, Hi);
2516*06c3fb27SDimitry Andric 
2517*06c3fb27SDimitry Andric   // Verify that the second element is at an 8-byte offset.
2518*06c3fb27SDimitry Andric   assert(TD.getStructLayout(Result)->getElementOffset(1) == 8 &&
2519*06c3fb27SDimitry Andric          "Invalid x86-64 argument pair!");
2520*06c3fb27SDimitry Andric   return Result;
2521*06c3fb27SDimitry Andric }
2522*06c3fb27SDimitry Andric 
2523*06c3fb27SDimitry Andric ABIArgInfo X86_64ABIInfo::
2524*06c3fb27SDimitry Andric classifyReturnType(QualType RetTy) const {
2525*06c3fb27SDimitry Andric   // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
2526*06c3fb27SDimitry Andric   // classification algorithm.
2527*06c3fb27SDimitry Andric   X86_64ABIInfo::Class Lo, Hi;
2528*06c3fb27SDimitry Andric   classify(RetTy, 0, Lo, Hi, /*isNamedArg*/ true);
2529*06c3fb27SDimitry Andric 
2530*06c3fb27SDimitry Andric   // Check some invariants.
2531*06c3fb27SDimitry Andric   assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
2532*06c3fb27SDimitry Andric   assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
2533*06c3fb27SDimitry Andric 
2534*06c3fb27SDimitry Andric   llvm::Type *ResType = nullptr;
2535*06c3fb27SDimitry Andric   switch (Lo) {
2536*06c3fb27SDimitry Andric   case NoClass:
2537*06c3fb27SDimitry Andric     if (Hi == NoClass)
2538*06c3fb27SDimitry Andric       return ABIArgInfo::getIgnore();
2539*06c3fb27SDimitry Andric     // If the low part is just padding, it takes no register, leave ResType
2540*06c3fb27SDimitry Andric     // null.
2541*06c3fb27SDimitry Andric     assert((Hi == SSE || Hi == Integer || Hi == X87Up) &&
2542*06c3fb27SDimitry Andric            "Unknown missing lo part");
2543*06c3fb27SDimitry Andric     break;
2544*06c3fb27SDimitry Andric 
2545*06c3fb27SDimitry Andric   case SSEUp:
2546*06c3fb27SDimitry Andric   case X87Up:
2547*06c3fb27SDimitry Andric     llvm_unreachable("Invalid classification for lo word.");
2548*06c3fb27SDimitry Andric 
2549*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
2550*06c3fb27SDimitry Andric     // hidden argument.
2551*06c3fb27SDimitry Andric   case Memory:
2552*06c3fb27SDimitry Andric     return getIndirectReturnResult(RetTy);
2553*06c3fb27SDimitry Andric 
2554*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
2555*06c3fb27SDimitry Andric     // available register of the sequence %rax, %rdx is used.
2556*06c3fb27SDimitry Andric   case Integer:
2557*06c3fb27SDimitry Andric     ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
2558*06c3fb27SDimitry Andric 
2559*06c3fb27SDimitry Andric     // If we have a sign or zero extended integer, make sure to return Extend
2560*06c3fb27SDimitry Andric     // so that the parameter gets the right LLVM IR attributes.
2561*06c3fb27SDimitry Andric     if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
2562*06c3fb27SDimitry Andric       // Treat an enum type as its underlying type.
2563*06c3fb27SDimitry Andric       if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
2564*06c3fb27SDimitry Andric         RetTy = EnumTy->getDecl()->getIntegerType();
2565*06c3fb27SDimitry Andric 
2566*06c3fb27SDimitry Andric       if (RetTy->isIntegralOrEnumerationType() &&
2567*06c3fb27SDimitry Andric           isPromotableIntegerTypeForABI(RetTy))
2568*06c3fb27SDimitry Andric         return ABIArgInfo::getExtend(RetTy);
2569*06c3fb27SDimitry Andric     }
2570*06c3fb27SDimitry Andric     break;
2571*06c3fb27SDimitry Andric 
2572*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
2573*06c3fb27SDimitry Andric     // available SSE register of the sequence %xmm0, %xmm1 is used.
2574*06c3fb27SDimitry Andric   case SSE:
2575*06c3fb27SDimitry Andric     ResType = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
2576*06c3fb27SDimitry Andric     break;
2577*06c3fb27SDimitry Andric 
2578*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
2579*06c3fb27SDimitry Andric     // returned on the X87 stack in %st0 as 80-bit x87 number.
2580*06c3fb27SDimitry Andric   case X87:
2581*06c3fb27SDimitry Andric     ResType = llvm::Type::getX86_FP80Ty(getVMContext());
2582*06c3fb27SDimitry Andric     break;
2583*06c3fb27SDimitry Andric 
2584*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
2585*06c3fb27SDimitry Andric     // part of the value is returned in %st0 and the imaginary part in
2586*06c3fb27SDimitry Andric     // %st1.
2587*06c3fb27SDimitry Andric   case ComplexX87:
2588*06c3fb27SDimitry Andric     assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification.");
2589*06c3fb27SDimitry Andric     ResType = llvm::StructType::get(llvm::Type::getX86_FP80Ty(getVMContext()),
2590*06c3fb27SDimitry Andric                                     llvm::Type::getX86_FP80Ty(getVMContext()));
2591*06c3fb27SDimitry Andric     break;
2592*06c3fb27SDimitry Andric   }
2593*06c3fb27SDimitry Andric 
2594*06c3fb27SDimitry Andric   llvm::Type *HighPart = nullptr;
2595*06c3fb27SDimitry Andric   switch (Hi) {
2596*06c3fb27SDimitry Andric     // Memory was handled previously and X87 should
2597*06c3fb27SDimitry Andric     // never occur as a hi class.
2598*06c3fb27SDimitry Andric   case Memory:
2599*06c3fb27SDimitry Andric   case X87:
2600*06c3fb27SDimitry Andric     llvm_unreachable("Invalid classification for hi word.");
2601*06c3fb27SDimitry Andric 
2602*06c3fb27SDimitry Andric   case ComplexX87: // Previously handled.
2603*06c3fb27SDimitry Andric   case NoClass:
2604*06c3fb27SDimitry Andric     break;
2605*06c3fb27SDimitry Andric 
2606*06c3fb27SDimitry Andric   case Integer:
2607*06c3fb27SDimitry Andric     HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
2608*06c3fb27SDimitry Andric     if (Lo == NoClass)  // Return HighPart at offset 8 in memory.
2609*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(HighPart, 8);
2610*06c3fb27SDimitry Andric     break;
2611*06c3fb27SDimitry Andric   case SSE:
2612*06c3fb27SDimitry Andric     HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
2613*06c3fb27SDimitry Andric     if (Lo == NoClass)  // Return HighPart at offset 8 in memory.
2614*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(HighPart, 8);
2615*06c3fb27SDimitry Andric     break;
2616*06c3fb27SDimitry Andric 
2617*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
2618*06c3fb27SDimitry Andric     // is passed in the next available eightbyte chunk if the last used
2619*06c3fb27SDimitry Andric     // vector register.
2620*06c3fb27SDimitry Andric     //
2621*06c3fb27SDimitry Andric     // SSEUP should always be preceded by SSE, just widen.
2622*06c3fb27SDimitry Andric   case SSEUp:
2623*06c3fb27SDimitry Andric     assert(Lo == SSE && "Unexpected SSEUp classification.");
2624*06c3fb27SDimitry Andric     ResType = GetByteVectorType(RetTy);
2625*06c3fb27SDimitry Andric     break;
2626*06c3fb27SDimitry Andric 
2627*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
2628*06c3fb27SDimitry Andric     // returned together with the previous X87 value in %st0.
2629*06c3fb27SDimitry Andric   case X87Up:
2630*06c3fb27SDimitry Andric     // If X87Up is preceded by X87, we don't need to do
2631*06c3fb27SDimitry Andric     // anything. However, in some cases with unions it may not be
2632*06c3fb27SDimitry Andric     // preceded by X87. In such situations we follow gcc and pass the
2633*06c3fb27SDimitry Andric     // extra bits in an SSE reg.
2634*06c3fb27SDimitry Andric     if (Lo != X87) {
2635*06c3fb27SDimitry Andric       HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
2636*06c3fb27SDimitry Andric       if (Lo == NoClass)  // Return HighPart at offset 8 in memory.
2637*06c3fb27SDimitry Andric         return ABIArgInfo::getDirect(HighPart, 8);
2638*06c3fb27SDimitry Andric     }
2639*06c3fb27SDimitry Andric     break;
2640*06c3fb27SDimitry Andric   }
2641*06c3fb27SDimitry Andric 
2642*06c3fb27SDimitry Andric   // If a high part was specified, merge it together with the low part.  It is
2643*06c3fb27SDimitry Andric   // known to pass in the high eightbyte of the result.  We do this by forming a
2644*06c3fb27SDimitry Andric   // first class struct aggregate with the high and low part: {low, high}
2645*06c3fb27SDimitry Andric   if (HighPart)
2646*06c3fb27SDimitry Andric     ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getDataLayout());
2647*06c3fb27SDimitry Andric 
2648*06c3fb27SDimitry Andric   return ABIArgInfo::getDirect(ResType);
2649*06c3fb27SDimitry Andric }
2650*06c3fb27SDimitry Andric 
2651*06c3fb27SDimitry Andric ABIArgInfo
2652*06c3fb27SDimitry Andric X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned freeIntRegs,
2653*06c3fb27SDimitry Andric                                     unsigned &neededInt, unsigned &neededSSE,
2654*06c3fb27SDimitry Andric                                     bool isNamedArg, bool IsRegCall) const {
2655*06c3fb27SDimitry Andric   Ty = useFirstFieldIfTransparentUnion(Ty);
2656*06c3fb27SDimitry Andric 
2657*06c3fb27SDimitry Andric   X86_64ABIInfo::Class Lo, Hi;
2658*06c3fb27SDimitry Andric   classify(Ty, 0, Lo, Hi, isNamedArg, IsRegCall);
2659*06c3fb27SDimitry Andric 
2660*06c3fb27SDimitry Andric   // Check some invariants.
2661*06c3fb27SDimitry Andric   // FIXME: Enforce these by construction.
2662*06c3fb27SDimitry Andric   assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
2663*06c3fb27SDimitry Andric   assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
2664*06c3fb27SDimitry Andric 
2665*06c3fb27SDimitry Andric   neededInt = 0;
2666*06c3fb27SDimitry Andric   neededSSE = 0;
2667*06c3fb27SDimitry Andric   llvm::Type *ResType = nullptr;
2668*06c3fb27SDimitry Andric   switch (Lo) {
2669*06c3fb27SDimitry Andric   case NoClass:
2670*06c3fb27SDimitry Andric     if (Hi == NoClass)
2671*06c3fb27SDimitry Andric       return ABIArgInfo::getIgnore();
2672*06c3fb27SDimitry Andric     // If the low part is just padding, it takes no register, leave ResType
2673*06c3fb27SDimitry Andric     // null.
2674*06c3fb27SDimitry Andric     assert((Hi == SSE || Hi == Integer || Hi == X87Up) &&
2675*06c3fb27SDimitry Andric            "Unknown missing lo part");
2676*06c3fb27SDimitry Andric     break;
2677*06c3fb27SDimitry Andric 
2678*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p3: Rule 1. If the class is MEMORY, pass the argument
2679*06c3fb27SDimitry Andric     // on the stack.
2680*06c3fb27SDimitry Andric   case Memory:
2681*06c3fb27SDimitry Andric 
2682*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p3: Rule 5. If the class is X87, X87UP or
2683*06c3fb27SDimitry Andric     // COMPLEX_X87, it is passed in memory.
2684*06c3fb27SDimitry Andric   case X87:
2685*06c3fb27SDimitry Andric   case ComplexX87:
2686*06c3fb27SDimitry Andric     if (getRecordArgABI(Ty, getCXXABI()) == CGCXXABI::RAA_Indirect)
2687*06c3fb27SDimitry Andric       ++neededInt;
2688*06c3fb27SDimitry Andric     return getIndirectResult(Ty, freeIntRegs);
2689*06c3fb27SDimitry Andric 
2690*06c3fb27SDimitry Andric   case SSEUp:
2691*06c3fb27SDimitry Andric   case X87Up:
2692*06c3fb27SDimitry Andric     llvm_unreachable("Invalid classification for lo word.");
2693*06c3fb27SDimitry Andric 
2694*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p3: Rule 2. If the class is INTEGER, the next
2695*06c3fb27SDimitry Andric     // available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8
2696*06c3fb27SDimitry Andric     // and %r9 is used.
2697*06c3fb27SDimitry Andric   case Integer:
2698*06c3fb27SDimitry Andric     ++neededInt;
2699*06c3fb27SDimitry Andric 
2700*06c3fb27SDimitry Andric     // Pick an 8-byte type based on the preferred type.
2701*06c3fb27SDimitry Andric     ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 0, Ty, 0);
2702*06c3fb27SDimitry Andric 
2703*06c3fb27SDimitry Andric     // If we have a sign or zero extended integer, make sure to return Extend
2704*06c3fb27SDimitry Andric     // so that the parameter gets the right LLVM IR attributes.
2705*06c3fb27SDimitry Andric     if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
2706*06c3fb27SDimitry Andric       // Treat an enum type as its underlying type.
2707*06c3fb27SDimitry Andric       if (const EnumType *EnumTy = Ty->getAs<EnumType>())
2708*06c3fb27SDimitry Andric         Ty = EnumTy->getDecl()->getIntegerType();
2709*06c3fb27SDimitry Andric 
2710*06c3fb27SDimitry Andric       if (Ty->isIntegralOrEnumerationType() &&
2711*06c3fb27SDimitry Andric           isPromotableIntegerTypeForABI(Ty))
2712*06c3fb27SDimitry Andric         return ABIArgInfo::getExtend(Ty);
2713*06c3fb27SDimitry Andric     }
2714*06c3fb27SDimitry Andric 
2715*06c3fb27SDimitry Andric     break;
2716*06c3fb27SDimitry Andric 
2717*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next
2718*06c3fb27SDimitry Andric     // available SSE register is used, the registers are taken in the
2719*06c3fb27SDimitry Andric     // order from %xmm0 to %xmm7.
2720*06c3fb27SDimitry Andric   case SSE: {
2721*06c3fb27SDimitry Andric     llvm::Type *IRType = CGT.ConvertType(Ty);
2722*06c3fb27SDimitry Andric     ResType = GetSSETypeAtOffset(IRType, 0, Ty, 0);
2723*06c3fb27SDimitry Andric     ++neededSSE;
2724*06c3fb27SDimitry Andric     break;
2725*06c3fb27SDimitry Andric   }
2726*06c3fb27SDimitry Andric   }
2727*06c3fb27SDimitry Andric 
2728*06c3fb27SDimitry Andric   llvm::Type *HighPart = nullptr;
2729*06c3fb27SDimitry Andric   switch (Hi) {
2730*06c3fb27SDimitry Andric     // Memory was handled previously, ComplexX87 and X87 should
2731*06c3fb27SDimitry Andric     // never occur as hi classes, and X87Up must be preceded by X87,
2732*06c3fb27SDimitry Andric     // which is passed in memory.
2733*06c3fb27SDimitry Andric   case Memory:
2734*06c3fb27SDimitry Andric   case X87:
2735*06c3fb27SDimitry Andric   case ComplexX87:
2736*06c3fb27SDimitry Andric     llvm_unreachable("Invalid classification for hi word.");
2737*06c3fb27SDimitry Andric 
2738*06c3fb27SDimitry Andric   case NoClass: break;
2739*06c3fb27SDimitry Andric 
2740*06c3fb27SDimitry Andric   case Integer:
2741*06c3fb27SDimitry Andric     ++neededInt;
2742*06c3fb27SDimitry Andric     // Pick an 8-byte type based on the preferred type.
2743*06c3fb27SDimitry Andric     HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
2744*06c3fb27SDimitry Andric 
2745*06c3fb27SDimitry Andric     if (Lo == NoClass)  // Pass HighPart at offset 8 in memory.
2746*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(HighPart, 8);
2747*06c3fb27SDimitry Andric     break;
2748*06c3fb27SDimitry Andric 
2749*06c3fb27SDimitry Andric     // X87Up generally doesn't occur here (long double is passed in
2750*06c3fb27SDimitry Andric     // memory), except in situations involving unions.
2751*06c3fb27SDimitry Andric   case X87Up:
2752*06c3fb27SDimitry Andric   case SSE:
2753*06c3fb27SDimitry Andric     HighPart = GetSSETypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
2754*06c3fb27SDimitry Andric 
2755*06c3fb27SDimitry Andric     if (Lo == NoClass)  // Pass HighPart at offset 8 in memory.
2756*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(HighPart, 8);
2757*06c3fb27SDimitry Andric 
2758*06c3fb27SDimitry Andric     ++neededSSE;
2759*06c3fb27SDimitry Andric     break;
2760*06c3fb27SDimitry Andric 
2761*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the
2762*06c3fb27SDimitry Andric     // eightbyte is passed in the upper half of the last used SSE
2763*06c3fb27SDimitry Andric     // register.  This only happens when 128-bit vectors are passed.
2764*06c3fb27SDimitry Andric   case SSEUp:
2765*06c3fb27SDimitry Andric     assert(Lo == SSE && "Unexpected SSEUp classification");
2766*06c3fb27SDimitry Andric     ResType = GetByteVectorType(Ty);
2767*06c3fb27SDimitry Andric     break;
2768*06c3fb27SDimitry Andric   }
2769*06c3fb27SDimitry Andric 
2770*06c3fb27SDimitry Andric   // If a high part was specified, merge it together with the low part.  It is
2771*06c3fb27SDimitry Andric   // known to pass in the high eightbyte of the result.  We do this by forming a
2772*06c3fb27SDimitry Andric   // first class struct aggregate with the high and low part: {low, high}
2773*06c3fb27SDimitry Andric   if (HighPart)
2774*06c3fb27SDimitry Andric     ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getDataLayout());
2775*06c3fb27SDimitry Andric 
2776*06c3fb27SDimitry Andric   return ABIArgInfo::getDirect(ResType);
2777*06c3fb27SDimitry Andric }
2778*06c3fb27SDimitry Andric 
2779*06c3fb27SDimitry Andric ABIArgInfo
2780*06c3fb27SDimitry Andric X86_64ABIInfo::classifyRegCallStructTypeImpl(QualType Ty, unsigned &NeededInt,
2781*06c3fb27SDimitry Andric                                              unsigned &NeededSSE,
2782*06c3fb27SDimitry Andric                                              unsigned &MaxVectorWidth) const {
2783*06c3fb27SDimitry Andric   auto RT = Ty->getAs<RecordType>();
2784*06c3fb27SDimitry Andric   assert(RT && "classifyRegCallStructType only valid with struct types");
2785*06c3fb27SDimitry Andric 
2786*06c3fb27SDimitry Andric   if (RT->getDecl()->hasFlexibleArrayMember())
2787*06c3fb27SDimitry Andric     return getIndirectReturnResult(Ty);
2788*06c3fb27SDimitry Andric 
2789*06c3fb27SDimitry Andric   // Sum up bases
2790*06c3fb27SDimitry Andric   if (auto CXXRD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
2791*06c3fb27SDimitry Andric     if (CXXRD->isDynamicClass()) {
2792*06c3fb27SDimitry Andric       NeededInt = NeededSSE = 0;
2793*06c3fb27SDimitry Andric       return getIndirectReturnResult(Ty);
2794*06c3fb27SDimitry Andric     }
2795*06c3fb27SDimitry Andric 
2796*06c3fb27SDimitry Andric     for (const auto &I : CXXRD->bases())
2797*06c3fb27SDimitry Andric       if (classifyRegCallStructTypeImpl(I.getType(), NeededInt, NeededSSE,
2798*06c3fb27SDimitry Andric                                         MaxVectorWidth)
2799*06c3fb27SDimitry Andric               .isIndirect()) {
2800*06c3fb27SDimitry Andric         NeededInt = NeededSSE = 0;
2801*06c3fb27SDimitry Andric         return getIndirectReturnResult(Ty);
2802*06c3fb27SDimitry Andric       }
2803*06c3fb27SDimitry Andric   }
2804*06c3fb27SDimitry Andric 
2805*06c3fb27SDimitry Andric   // Sum up members
2806*06c3fb27SDimitry Andric   for (const auto *FD : RT->getDecl()->fields()) {
2807*06c3fb27SDimitry Andric     QualType MTy = FD->getType();
2808*06c3fb27SDimitry Andric     if (MTy->isRecordType() && !MTy->isUnionType()) {
2809*06c3fb27SDimitry Andric       if (classifyRegCallStructTypeImpl(MTy, NeededInt, NeededSSE,
2810*06c3fb27SDimitry Andric                                         MaxVectorWidth)
2811*06c3fb27SDimitry Andric               .isIndirect()) {
2812*06c3fb27SDimitry Andric         NeededInt = NeededSSE = 0;
2813*06c3fb27SDimitry Andric         return getIndirectReturnResult(Ty);
2814*06c3fb27SDimitry Andric       }
2815*06c3fb27SDimitry Andric     } else {
2816*06c3fb27SDimitry Andric       unsigned LocalNeededInt, LocalNeededSSE;
2817*06c3fb27SDimitry Andric       if (classifyArgumentType(MTy, UINT_MAX, LocalNeededInt, LocalNeededSSE,
2818*06c3fb27SDimitry Andric                                true, true)
2819*06c3fb27SDimitry Andric               .isIndirect()) {
2820*06c3fb27SDimitry Andric         NeededInt = NeededSSE = 0;
2821*06c3fb27SDimitry Andric         return getIndirectReturnResult(Ty);
2822*06c3fb27SDimitry Andric       }
2823*06c3fb27SDimitry Andric       if (const auto *AT = getContext().getAsConstantArrayType(MTy))
2824*06c3fb27SDimitry Andric         MTy = AT->getElementType();
2825*06c3fb27SDimitry Andric       if (const auto *VT = MTy->getAs<VectorType>())
2826*06c3fb27SDimitry Andric         if (getContext().getTypeSize(VT) > MaxVectorWidth)
2827*06c3fb27SDimitry Andric           MaxVectorWidth = getContext().getTypeSize(VT);
2828*06c3fb27SDimitry Andric       NeededInt += LocalNeededInt;
2829*06c3fb27SDimitry Andric       NeededSSE += LocalNeededSSE;
2830*06c3fb27SDimitry Andric     }
2831*06c3fb27SDimitry Andric   }
2832*06c3fb27SDimitry Andric 
2833*06c3fb27SDimitry Andric   return ABIArgInfo::getDirect();
2834*06c3fb27SDimitry Andric }
2835*06c3fb27SDimitry Andric 
2836*06c3fb27SDimitry Andric ABIArgInfo
2837*06c3fb27SDimitry Andric X86_64ABIInfo::classifyRegCallStructType(QualType Ty, unsigned &NeededInt,
2838*06c3fb27SDimitry Andric                                          unsigned &NeededSSE,
2839*06c3fb27SDimitry Andric                                          unsigned &MaxVectorWidth) const {
2840*06c3fb27SDimitry Andric 
2841*06c3fb27SDimitry Andric   NeededInt = 0;
2842*06c3fb27SDimitry Andric   NeededSSE = 0;
2843*06c3fb27SDimitry Andric   MaxVectorWidth = 0;
2844*06c3fb27SDimitry Andric 
2845*06c3fb27SDimitry Andric   return classifyRegCallStructTypeImpl(Ty, NeededInt, NeededSSE,
2846*06c3fb27SDimitry Andric                                        MaxVectorWidth);
2847*06c3fb27SDimitry Andric }
2848*06c3fb27SDimitry Andric 
2849*06c3fb27SDimitry Andric void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
2850*06c3fb27SDimitry Andric 
2851*06c3fb27SDimitry Andric   const unsigned CallingConv = FI.getCallingConvention();
2852*06c3fb27SDimitry Andric   // It is possible to force Win64 calling convention on any x86_64 target by
2853*06c3fb27SDimitry Andric   // using __attribute__((ms_abi)). In such case to correctly emit Win64
2854*06c3fb27SDimitry Andric   // compatible code delegate this call to WinX86_64ABIInfo::computeInfo.
2855*06c3fb27SDimitry Andric   if (CallingConv == llvm::CallingConv::Win64) {
2856*06c3fb27SDimitry Andric     WinX86_64ABIInfo Win64ABIInfo(CGT, AVXLevel);
2857*06c3fb27SDimitry Andric     Win64ABIInfo.computeInfo(FI);
2858*06c3fb27SDimitry Andric     return;
2859*06c3fb27SDimitry Andric   }
2860*06c3fb27SDimitry Andric 
2861*06c3fb27SDimitry Andric   bool IsRegCall = CallingConv == llvm::CallingConv::X86_RegCall;
2862*06c3fb27SDimitry Andric 
2863*06c3fb27SDimitry Andric   // Keep track of the number of assigned registers.
2864*06c3fb27SDimitry Andric   unsigned FreeIntRegs = IsRegCall ? 11 : 6;
2865*06c3fb27SDimitry Andric   unsigned FreeSSERegs = IsRegCall ? 16 : 8;
2866*06c3fb27SDimitry Andric   unsigned NeededInt = 0, NeededSSE = 0, MaxVectorWidth = 0;
2867*06c3fb27SDimitry Andric 
2868*06c3fb27SDimitry Andric   if (!::classifyReturnType(getCXXABI(), FI, *this)) {
2869*06c3fb27SDimitry Andric     if (IsRegCall && FI.getReturnType()->getTypePtr()->isRecordType() &&
2870*06c3fb27SDimitry Andric         !FI.getReturnType()->getTypePtr()->isUnionType()) {
2871*06c3fb27SDimitry Andric       FI.getReturnInfo() = classifyRegCallStructType(
2872*06c3fb27SDimitry Andric           FI.getReturnType(), NeededInt, NeededSSE, MaxVectorWidth);
2873*06c3fb27SDimitry Andric       if (FreeIntRegs >= NeededInt && FreeSSERegs >= NeededSSE) {
2874*06c3fb27SDimitry Andric         FreeIntRegs -= NeededInt;
2875*06c3fb27SDimitry Andric         FreeSSERegs -= NeededSSE;
2876*06c3fb27SDimitry Andric       } else {
2877*06c3fb27SDimitry Andric         FI.getReturnInfo() = getIndirectReturnResult(FI.getReturnType());
2878*06c3fb27SDimitry Andric       }
2879*06c3fb27SDimitry Andric     } else if (IsRegCall && FI.getReturnType()->getAs<ComplexType>() &&
2880*06c3fb27SDimitry Andric                getContext().getCanonicalType(FI.getReturnType()
2881*06c3fb27SDimitry Andric                                                  ->getAs<ComplexType>()
2882*06c3fb27SDimitry Andric                                                  ->getElementType()) ==
2883*06c3fb27SDimitry Andric                    getContext().LongDoubleTy)
2884*06c3fb27SDimitry Andric       // Complex Long Double Type is passed in Memory when Regcall
2885*06c3fb27SDimitry Andric       // calling convention is used.
2886*06c3fb27SDimitry Andric       FI.getReturnInfo() = getIndirectReturnResult(FI.getReturnType());
2887*06c3fb27SDimitry Andric     else
2888*06c3fb27SDimitry Andric       FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
2889*06c3fb27SDimitry Andric   }
2890*06c3fb27SDimitry Andric 
2891*06c3fb27SDimitry Andric   // If the return value is indirect, then the hidden argument is consuming one
2892*06c3fb27SDimitry Andric   // integer register.
2893*06c3fb27SDimitry Andric   if (FI.getReturnInfo().isIndirect())
2894*06c3fb27SDimitry Andric     --FreeIntRegs;
2895*06c3fb27SDimitry Andric   else if (NeededSSE && MaxVectorWidth > 0)
2896*06c3fb27SDimitry Andric     FI.setMaxVectorWidth(MaxVectorWidth);
2897*06c3fb27SDimitry Andric 
2898*06c3fb27SDimitry Andric   // The chain argument effectively gives us another free register.
2899*06c3fb27SDimitry Andric   if (FI.isChainCall())
2900*06c3fb27SDimitry Andric     ++FreeIntRegs;
2901*06c3fb27SDimitry Andric 
2902*06c3fb27SDimitry Andric   unsigned NumRequiredArgs = FI.getNumRequiredArgs();
2903*06c3fb27SDimitry Andric   // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers
2904*06c3fb27SDimitry Andric   // get assigned (in left-to-right order) for passing as follows...
2905*06c3fb27SDimitry Andric   unsigned ArgNo = 0;
2906*06c3fb27SDimitry Andric   for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
2907*06c3fb27SDimitry Andric        it != ie; ++it, ++ArgNo) {
2908*06c3fb27SDimitry Andric     bool IsNamedArg = ArgNo < NumRequiredArgs;
2909*06c3fb27SDimitry Andric 
2910*06c3fb27SDimitry Andric     if (IsRegCall && it->type->isStructureOrClassType())
2911*06c3fb27SDimitry Andric       it->info = classifyRegCallStructType(it->type, NeededInt, NeededSSE,
2912*06c3fb27SDimitry Andric                                            MaxVectorWidth);
2913*06c3fb27SDimitry Andric     else
2914*06c3fb27SDimitry Andric       it->info = classifyArgumentType(it->type, FreeIntRegs, NeededInt,
2915*06c3fb27SDimitry Andric                                       NeededSSE, IsNamedArg);
2916*06c3fb27SDimitry Andric 
2917*06c3fb27SDimitry Andric     // AMD64-ABI 3.2.3p3: If there are no registers available for any
2918*06c3fb27SDimitry Andric     // eightbyte of an argument, the whole argument is passed on the
2919*06c3fb27SDimitry Andric     // stack. If registers have already been assigned for some
2920*06c3fb27SDimitry Andric     // eightbytes of such an argument, the assignments get reverted.
2921*06c3fb27SDimitry Andric     if (FreeIntRegs >= NeededInt && FreeSSERegs >= NeededSSE) {
2922*06c3fb27SDimitry Andric       FreeIntRegs -= NeededInt;
2923*06c3fb27SDimitry Andric       FreeSSERegs -= NeededSSE;
2924*06c3fb27SDimitry Andric       if (MaxVectorWidth > FI.getMaxVectorWidth())
2925*06c3fb27SDimitry Andric         FI.setMaxVectorWidth(MaxVectorWidth);
2926*06c3fb27SDimitry Andric     } else {
2927*06c3fb27SDimitry Andric       it->info = getIndirectResult(it->type, FreeIntRegs);
2928*06c3fb27SDimitry Andric     }
2929*06c3fb27SDimitry Andric   }
2930*06c3fb27SDimitry Andric }
2931*06c3fb27SDimitry Andric 
2932*06c3fb27SDimitry Andric static Address EmitX86_64VAArgFromMemory(CodeGenFunction &CGF,
2933*06c3fb27SDimitry Andric                                          Address VAListAddr, QualType Ty) {
2934*06c3fb27SDimitry Andric   Address overflow_arg_area_p =
2935*06c3fb27SDimitry Andric       CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_p");
2936*06c3fb27SDimitry Andric   llvm::Value *overflow_arg_area =
2937*06c3fb27SDimitry Andric     CGF.Builder.CreateLoad(overflow_arg_area_p, "overflow_arg_area");
2938*06c3fb27SDimitry Andric 
2939*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a 16
2940*06c3fb27SDimitry Andric   // byte boundary if alignment needed by type exceeds 8 byte boundary.
2941*06c3fb27SDimitry Andric   // It isn't stated explicitly in the standard, but in practice we use
2942*06c3fb27SDimitry Andric   // alignment greater than 16 where necessary.
2943*06c3fb27SDimitry Andric   CharUnits Align = CGF.getContext().getTypeAlignInChars(Ty);
2944*06c3fb27SDimitry Andric   if (Align > CharUnits::fromQuantity(8)) {
2945*06c3fb27SDimitry Andric     overflow_arg_area = emitRoundPointerUpToAlignment(CGF, overflow_arg_area,
2946*06c3fb27SDimitry Andric                                                       Align);
2947*06c3fb27SDimitry Andric   }
2948*06c3fb27SDimitry Andric 
2949*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 8. Fetch type from l->overflow_arg_area.
2950*06c3fb27SDimitry Andric   llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
2951*06c3fb27SDimitry Andric   llvm::Value *Res =
2952*06c3fb27SDimitry Andric     CGF.Builder.CreateBitCast(overflow_arg_area,
2953*06c3fb27SDimitry Andric                               llvm::PointerType::getUnqual(LTy));
2954*06c3fb27SDimitry Andric 
2955*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to:
2956*06c3fb27SDimitry Andric   // l->overflow_arg_area + sizeof(type).
2957*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 10. Align l->overflow_arg_area upwards to
2958*06c3fb27SDimitry Andric   // an 8 byte boundary.
2959*06c3fb27SDimitry Andric 
2960*06c3fb27SDimitry Andric   uint64_t SizeInBytes = (CGF.getContext().getTypeSize(Ty) + 7) / 8;
2961*06c3fb27SDimitry Andric   llvm::Value *Offset =
2962*06c3fb27SDimitry Andric       llvm::ConstantInt::get(CGF.Int32Ty, (SizeInBytes + 7)  & ~7);
2963*06c3fb27SDimitry Andric   overflow_arg_area = CGF.Builder.CreateGEP(CGF.Int8Ty, overflow_arg_area,
2964*06c3fb27SDimitry Andric                                             Offset, "overflow_arg_area.next");
2965*06c3fb27SDimitry Andric   CGF.Builder.CreateStore(overflow_arg_area, overflow_arg_area_p);
2966*06c3fb27SDimitry Andric 
2967*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 11. Return the fetched type.
2968*06c3fb27SDimitry Andric   return Address(Res, LTy, Align);
2969*06c3fb27SDimitry Andric }
2970*06c3fb27SDimitry Andric 
2971*06c3fb27SDimitry Andric Address X86_64ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
2972*06c3fb27SDimitry Andric                                  QualType Ty) const {
2973*06c3fb27SDimitry Andric   // Assume that va_list type is correct; should be pointer to LLVM type:
2974*06c3fb27SDimitry Andric   // struct {
2975*06c3fb27SDimitry Andric   //   i32 gp_offset;
2976*06c3fb27SDimitry Andric   //   i32 fp_offset;
2977*06c3fb27SDimitry Andric   //   i8* overflow_arg_area;
2978*06c3fb27SDimitry Andric   //   i8* reg_save_area;
2979*06c3fb27SDimitry Andric   // };
2980*06c3fb27SDimitry Andric   unsigned neededInt, neededSSE;
2981*06c3fb27SDimitry Andric 
2982*06c3fb27SDimitry Andric   Ty = getContext().getCanonicalType(Ty);
2983*06c3fb27SDimitry Andric   ABIArgInfo AI = classifyArgumentType(Ty, 0, neededInt, neededSSE,
2984*06c3fb27SDimitry Andric                                        /*isNamedArg*/false);
2985*06c3fb27SDimitry Andric 
2986*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed
2987*06c3fb27SDimitry Andric   // in the registers. If not go to step 7.
2988*06c3fb27SDimitry Andric   if (!neededInt && !neededSSE)
2989*06c3fb27SDimitry Andric     return EmitX86_64VAArgFromMemory(CGF, VAListAddr, Ty);
2990*06c3fb27SDimitry Andric 
2991*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 2. Compute num_gp to hold the number of
2992*06c3fb27SDimitry Andric   // general purpose registers needed to pass type and num_fp to hold
2993*06c3fb27SDimitry Andric   // the number of floating point registers needed.
2994*06c3fb27SDimitry Andric 
2995*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 3. Verify whether arguments fit into
2996*06c3fb27SDimitry Andric   // registers. In the case: l->gp_offset > 48 - num_gp * 8 or
2997*06c3fb27SDimitry Andric   // l->fp_offset > 304 - num_fp * 16 go to step 7.
2998*06c3fb27SDimitry Andric   //
2999*06c3fb27SDimitry Andric   // NOTE: 304 is a typo, there are (6 * 8 + 8 * 16) = 176 bytes of
3000*06c3fb27SDimitry Andric   // register save space).
3001*06c3fb27SDimitry Andric 
3002*06c3fb27SDimitry Andric   llvm::Value *InRegs = nullptr;
3003*06c3fb27SDimitry Andric   Address gp_offset_p = Address::invalid(), fp_offset_p = Address::invalid();
3004*06c3fb27SDimitry Andric   llvm::Value *gp_offset = nullptr, *fp_offset = nullptr;
3005*06c3fb27SDimitry Andric   if (neededInt) {
3006*06c3fb27SDimitry Andric     gp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "gp_offset_p");
3007*06c3fb27SDimitry Andric     gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset");
3008*06c3fb27SDimitry Andric     InRegs = llvm::ConstantInt::get(CGF.Int32Ty, 48 - neededInt * 8);
3009*06c3fb27SDimitry Andric     InRegs = CGF.Builder.CreateICmpULE(gp_offset, InRegs, "fits_in_gp");
3010*06c3fb27SDimitry Andric   }
3011*06c3fb27SDimitry Andric 
3012*06c3fb27SDimitry Andric   if (neededSSE) {
3013*06c3fb27SDimitry Andric     fp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 1, "fp_offset_p");
3014*06c3fb27SDimitry Andric     fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset");
3015*06c3fb27SDimitry Andric     llvm::Value *FitsInFP =
3016*06c3fb27SDimitry Andric       llvm::ConstantInt::get(CGF.Int32Ty, 176 - neededSSE * 16);
3017*06c3fb27SDimitry Andric     FitsInFP = CGF.Builder.CreateICmpULE(fp_offset, FitsInFP, "fits_in_fp");
3018*06c3fb27SDimitry Andric     InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP;
3019*06c3fb27SDimitry Andric   }
3020*06c3fb27SDimitry Andric 
3021*06c3fb27SDimitry Andric   llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
3022*06c3fb27SDimitry Andric   llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem");
3023*06c3fb27SDimitry Andric   llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
3024*06c3fb27SDimitry Andric   CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock);
3025*06c3fb27SDimitry Andric 
3026*06c3fb27SDimitry Andric   // Emit code to load the value if it was passed in registers.
3027*06c3fb27SDimitry Andric 
3028*06c3fb27SDimitry Andric   CGF.EmitBlock(InRegBlock);
3029*06c3fb27SDimitry Andric 
3030*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 4. Fetch type from l->reg_save_area with
3031*06c3fb27SDimitry Andric   // an offset of l->gp_offset and/or l->fp_offset. This may require
3032*06c3fb27SDimitry Andric   // copying to a temporary location in case the parameter is passed
3033*06c3fb27SDimitry Andric   // in different register classes or requires an alignment greater
3034*06c3fb27SDimitry Andric   // than 8 for general purpose registers and 16 for XMM registers.
3035*06c3fb27SDimitry Andric   //
3036*06c3fb27SDimitry Andric   // FIXME: This really results in shameful code when we end up needing to
3037*06c3fb27SDimitry Andric   // collect arguments from different places; often what should result in a
3038*06c3fb27SDimitry Andric   // simple assembling of a structure from scattered addresses has many more
3039*06c3fb27SDimitry Andric   // loads than necessary. Can we clean this up?
3040*06c3fb27SDimitry Andric   llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
3041*06c3fb27SDimitry Andric   llvm::Value *RegSaveArea = CGF.Builder.CreateLoad(
3042*06c3fb27SDimitry Andric       CGF.Builder.CreateStructGEP(VAListAddr, 3), "reg_save_area");
3043*06c3fb27SDimitry Andric 
3044*06c3fb27SDimitry Andric   Address RegAddr = Address::invalid();
3045*06c3fb27SDimitry Andric   if (neededInt && neededSSE) {
3046*06c3fb27SDimitry Andric     // FIXME: Cleanup.
3047*06c3fb27SDimitry Andric     assert(AI.isDirect() && "Unexpected ABI info for mixed regs");
3048*06c3fb27SDimitry Andric     llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType());
3049*06c3fb27SDimitry Andric     Address Tmp = CGF.CreateMemTemp(Ty);
3050*06c3fb27SDimitry Andric     Tmp = Tmp.withElementType(ST);
3051*06c3fb27SDimitry Andric     assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs");
3052*06c3fb27SDimitry Andric     llvm::Type *TyLo = ST->getElementType(0);
3053*06c3fb27SDimitry Andric     llvm::Type *TyHi = ST->getElementType(1);
3054*06c3fb27SDimitry Andric     assert((TyLo->isFPOrFPVectorTy() ^ TyHi->isFPOrFPVectorTy()) &&
3055*06c3fb27SDimitry Andric            "Unexpected ABI info for mixed regs");
3056*06c3fb27SDimitry Andric     llvm::Type *PTyLo = llvm::PointerType::getUnqual(TyLo);
3057*06c3fb27SDimitry Andric     llvm::Type *PTyHi = llvm::PointerType::getUnqual(TyHi);
3058*06c3fb27SDimitry Andric     llvm::Value *GPAddr =
3059*06c3fb27SDimitry Andric         CGF.Builder.CreateGEP(CGF.Int8Ty, RegSaveArea, gp_offset);
3060*06c3fb27SDimitry Andric     llvm::Value *FPAddr =
3061*06c3fb27SDimitry Andric         CGF.Builder.CreateGEP(CGF.Int8Ty, RegSaveArea, fp_offset);
3062*06c3fb27SDimitry Andric     llvm::Value *RegLoAddr = TyLo->isFPOrFPVectorTy() ? FPAddr : GPAddr;
3063*06c3fb27SDimitry Andric     llvm::Value *RegHiAddr = TyLo->isFPOrFPVectorTy() ? GPAddr : FPAddr;
3064*06c3fb27SDimitry Andric 
3065*06c3fb27SDimitry Andric     // Copy the first element.
3066*06c3fb27SDimitry Andric     // FIXME: Our choice of alignment here and below is probably pessimistic.
3067*06c3fb27SDimitry Andric     llvm::Value *V = CGF.Builder.CreateAlignedLoad(
3068*06c3fb27SDimitry Andric         TyLo, CGF.Builder.CreateBitCast(RegLoAddr, PTyLo),
3069*06c3fb27SDimitry Andric         CharUnits::fromQuantity(getDataLayout().getABITypeAlign(TyLo)));
3070*06c3fb27SDimitry Andric     CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
3071*06c3fb27SDimitry Andric 
3072*06c3fb27SDimitry Andric     // Copy the second element.
3073*06c3fb27SDimitry Andric     V = CGF.Builder.CreateAlignedLoad(
3074*06c3fb27SDimitry Andric         TyHi, CGF.Builder.CreateBitCast(RegHiAddr, PTyHi),
3075*06c3fb27SDimitry Andric         CharUnits::fromQuantity(getDataLayout().getABITypeAlign(TyHi)));
3076*06c3fb27SDimitry Andric     CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
3077*06c3fb27SDimitry Andric 
3078*06c3fb27SDimitry Andric     RegAddr = Tmp.withElementType(LTy);
3079*06c3fb27SDimitry Andric   } else if (neededInt) {
3080*06c3fb27SDimitry Andric     RegAddr = Address(CGF.Builder.CreateGEP(CGF.Int8Ty, RegSaveArea, gp_offset),
3081*06c3fb27SDimitry Andric                       LTy, CharUnits::fromQuantity(8));
3082*06c3fb27SDimitry Andric 
3083*06c3fb27SDimitry Andric     // Copy to a temporary if necessary to ensure the appropriate alignment.
3084*06c3fb27SDimitry Andric     auto TInfo = getContext().getTypeInfoInChars(Ty);
3085*06c3fb27SDimitry Andric     uint64_t TySize = TInfo.Width.getQuantity();
3086*06c3fb27SDimitry Andric     CharUnits TyAlign = TInfo.Align;
3087*06c3fb27SDimitry Andric 
3088*06c3fb27SDimitry Andric     // Copy into a temporary if the type is more aligned than the
3089*06c3fb27SDimitry Andric     // register save area.
3090*06c3fb27SDimitry Andric     if (TyAlign.getQuantity() > 8) {
3091*06c3fb27SDimitry Andric       Address Tmp = CGF.CreateMemTemp(Ty);
3092*06c3fb27SDimitry Andric       CGF.Builder.CreateMemCpy(Tmp, RegAddr, TySize, false);
3093*06c3fb27SDimitry Andric       RegAddr = Tmp;
3094*06c3fb27SDimitry Andric     }
3095*06c3fb27SDimitry Andric 
3096*06c3fb27SDimitry Andric   } else if (neededSSE == 1) {
3097*06c3fb27SDimitry Andric     RegAddr = Address(CGF.Builder.CreateGEP(CGF.Int8Ty, RegSaveArea, fp_offset),
3098*06c3fb27SDimitry Andric                       LTy, CharUnits::fromQuantity(16));
3099*06c3fb27SDimitry Andric   } else {
3100*06c3fb27SDimitry Andric     assert(neededSSE == 2 && "Invalid number of needed registers!");
3101*06c3fb27SDimitry Andric     // SSE registers are spaced 16 bytes apart in the register save
3102*06c3fb27SDimitry Andric     // area, we need to collect the two eightbytes together.
3103*06c3fb27SDimitry Andric     // The ABI isn't explicit about this, but it seems reasonable
3104*06c3fb27SDimitry Andric     // to assume that the slots are 16-byte aligned, since the stack is
3105*06c3fb27SDimitry Andric     // naturally 16-byte aligned and the prologue is expected to store
3106*06c3fb27SDimitry Andric     // all the SSE registers to the RSA.
3107*06c3fb27SDimitry Andric     Address RegAddrLo = Address(CGF.Builder.CreateGEP(CGF.Int8Ty, RegSaveArea,
3108*06c3fb27SDimitry Andric                                                       fp_offset),
3109*06c3fb27SDimitry Andric                                 CGF.Int8Ty, CharUnits::fromQuantity(16));
3110*06c3fb27SDimitry Andric     Address RegAddrHi =
3111*06c3fb27SDimitry Andric       CGF.Builder.CreateConstInBoundsByteGEP(RegAddrLo,
3112*06c3fb27SDimitry Andric                                              CharUnits::fromQuantity(16));
3113*06c3fb27SDimitry Andric     llvm::Type *ST = AI.canHaveCoerceToType()
3114*06c3fb27SDimitry Andric                          ? AI.getCoerceToType()
3115*06c3fb27SDimitry Andric                          : llvm::StructType::get(CGF.DoubleTy, CGF.DoubleTy);
3116*06c3fb27SDimitry Andric     llvm::Value *V;
3117*06c3fb27SDimitry Andric     Address Tmp = CGF.CreateMemTemp(Ty);
3118*06c3fb27SDimitry Andric     Tmp = Tmp.withElementType(ST);
3119*06c3fb27SDimitry Andric     V = CGF.Builder.CreateLoad(
3120*06c3fb27SDimitry Andric         RegAddrLo.withElementType(ST->getStructElementType(0)));
3121*06c3fb27SDimitry Andric     CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
3122*06c3fb27SDimitry Andric     V = CGF.Builder.CreateLoad(
3123*06c3fb27SDimitry Andric         RegAddrHi.withElementType(ST->getStructElementType(1)));
3124*06c3fb27SDimitry Andric     CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
3125*06c3fb27SDimitry Andric 
3126*06c3fb27SDimitry Andric     RegAddr = Tmp.withElementType(LTy);
3127*06c3fb27SDimitry Andric   }
3128*06c3fb27SDimitry Andric 
3129*06c3fb27SDimitry Andric   // AMD64-ABI 3.5.7p5: Step 5. Set:
3130*06c3fb27SDimitry Andric   // l->gp_offset = l->gp_offset + num_gp * 8
3131*06c3fb27SDimitry Andric   // l->fp_offset = l->fp_offset + num_fp * 16.
3132*06c3fb27SDimitry Andric   if (neededInt) {
3133*06c3fb27SDimitry Andric     llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededInt * 8);
3134*06c3fb27SDimitry Andric     CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset),
3135*06c3fb27SDimitry Andric                             gp_offset_p);
3136*06c3fb27SDimitry Andric   }
3137*06c3fb27SDimitry Andric   if (neededSSE) {
3138*06c3fb27SDimitry Andric     llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededSSE * 16);
3139*06c3fb27SDimitry Andric     CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset),
3140*06c3fb27SDimitry Andric                             fp_offset_p);
3141*06c3fb27SDimitry Andric   }
3142*06c3fb27SDimitry Andric   CGF.EmitBranch(ContBlock);
3143*06c3fb27SDimitry Andric 
3144*06c3fb27SDimitry Andric   // Emit code to load the value if it was passed in memory.
3145*06c3fb27SDimitry Andric 
3146*06c3fb27SDimitry Andric   CGF.EmitBlock(InMemBlock);
3147*06c3fb27SDimitry Andric   Address MemAddr = EmitX86_64VAArgFromMemory(CGF, VAListAddr, Ty);
3148*06c3fb27SDimitry Andric 
3149*06c3fb27SDimitry Andric   // Return the appropriate result.
3150*06c3fb27SDimitry Andric 
3151*06c3fb27SDimitry Andric   CGF.EmitBlock(ContBlock);
3152*06c3fb27SDimitry Andric   Address ResAddr = emitMergePHI(CGF, RegAddr, InRegBlock, MemAddr, InMemBlock,
3153*06c3fb27SDimitry Andric                                  "vaarg.addr");
3154*06c3fb27SDimitry Andric   return ResAddr;
3155*06c3fb27SDimitry Andric }
3156*06c3fb27SDimitry Andric 
3157*06c3fb27SDimitry Andric Address X86_64ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
3158*06c3fb27SDimitry Andric                                    QualType Ty) const {
3159*06c3fb27SDimitry Andric   // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
3160*06c3fb27SDimitry Andric   // not 1, 2, 4, or 8 bytes, must be passed by reference."
3161*06c3fb27SDimitry Andric   uint64_t Width = getContext().getTypeSize(Ty);
3162*06c3fb27SDimitry Andric   bool IsIndirect = Width > 64 || !llvm::isPowerOf2_64(Width);
3163*06c3fb27SDimitry Andric 
3164*06c3fb27SDimitry Andric   return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect,
3165*06c3fb27SDimitry Andric                           CGF.getContext().getTypeInfoInChars(Ty),
3166*06c3fb27SDimitry Andric                           CharUnits::fromQuantity(8),
3167*06c3fb27SDimitry Andric                           /*allowHigherAlign*/ false);
3168*06c3fb27SDimitry Andric }
3169*06c3fb27SDimitry Andric 
3170*06c3fb27SDimitry Andric ABIArgInfo WinX86_64ABIInfo::reclassifyHvaArgForVectorCall(
3171*06c3fb27SDimitry Andric     QualType Ty, unsigned &FreeSSERegs, const ABIArgInfo &current) const {
3172*06c3fb27SDimitry Andric   const Type *Base = nullptr;
3173*06c3fb27SDimitry Andric   uint64_t NumElts = 0;
3174*06c3fb27SDimitry Andric 
3175*06c3fb27SDimitry Andric   if (!Ty->isBuiltinType() && !Ty->isVectorType() &&
3176*06c3fb27SDimitry Andric       isHomogeneousAggregate(Ty, Base, NumElts) && FreeSSERegs >= NumElts) {
3177*06c3fb27SDimitry Andric     FreeSSERegs -= NumElts;
3178*06c3fb27SDimitry Andric     return getDirectX86Hva();
3179*06c3fb27SDimitry Andric   }
3180*06c3fb27SDimitry Andric   return current;
3181*06c3fb27SDimitry Andric }
3182*06c3fb27SDimitry Andric 
3183*06c3fb27SDimitry Andric ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, unsigned &FreeSSERegs,
3184*06c3fb27SDimitry Andric                                       bool IsReturnType, bool IsVectorCall,
3185*06c3fb27SDimitry Andric                                       bool IsRegCall) const {
3186*06c3fb27SDimitry Andric 
3187*06c3fb27SDimitry Andric   if (Ty->isVoidType())
3188*06c3fb27SDimitry Andric     return ABIArgInfo::getIgnore();
3189*06c3fb27SDimitry Andric 
3190*06c3fb27SDimitry Andric   if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3191*06c3fb27SDimitry Andric     Ty = EnumTy->getDecl()->getIntegerType();
3192*06c3fb27SDimitry Andric 
3193*06c3fb27SDimitry Andric   TypeInfo Info = getContext().getTypeInfo(Ty);
3194*06c3fb27SDimitry Andric   uint64_t Width = Info.Width;
3195*06c3fb27SDimitry Andric   CharUnits Align = getContext().toCharUnitsFromBits(Info.Align);
3196*06c3fb27SDimitry Andric 
3197*06c3fb27SDimitry Andric   const RecordType *RT = Ty->getAs<RecordType>();
3198*06c3fb27SDimitry Andric   if (RT) {
3199*06c3fb27SDimitry Andric     if (!IsReturnType) {
3200*06c3fb27SDimitry Andric       if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI()))
3201*06c3fb27SDimitry Andric         return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
3202*06c3fb27SDimitry Andric     }
3203*06c3fb27SDimitry Andric 
3204*06c3fb27SDimitry Andric     if (RT->getDecl()->hasFlexibleArrayMember())
3205*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
3206*06c3fb27SDimitry Andric 
3207*06c3fb27SDimitry Andric   }
3208*06c3fb27SDimitry Andric 
3209*06c3fb27SDimitry Andric   const Type *Base = nullptr;
3210*06c3fb27SDimitry Andric   uint64_t NumElts = 0;
3211*06c3fb27SDimitry Andric   // vectorcall adds the concept of a homogenous vector aggregate, similar to
3212*06c3fb27SDimitry Andric   // other targets.
3213*06c3fb27SDimitry Andric   if ((IsVectorCall || IsRegCall) &&
3214*06c3fb27SDimitry Andric       isHomogeneousAggregate(Ty, Base, NumElts)) {
3215*06c3fb27SDimitry Andric     if (IsRegCall) {
3216*06c3fb27SDimitry Andric       if (FreeSSERegs >= NumElts) {
3217*06c3fb27SDimitry Andric         FreeSSERegs -= NumElts;
3218*06c3fb27SDimitry Andric         if (IsReturnType || Ty->isBuiltinType() || Ty->isVectorType())
3219*06c3fb27SDimitry Andric           return ABIArgInfo::getDirect();
3220*06c3fb27SDimitry Andric         return ABIArgInfo::getExpand();
3221*06c3fb27SDimitry Andric       }
3222*06c3fb27SDimitry Andric       return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
3223*06c3fb27SDimitry Andric     } else if (IsVectorCall) {
3224*06c3fb27SDimitry Andric       if (FreeSSERegs >= NumElts &&
3225*06c3fb27SDimitry Andric           (IsReturnType || Ty->isBuiltinType() || Ty->isVectorType())) {
3226*06c3fb27SDimitry Andric         FreeSSERegs -= NumElts;
3227*06c3fb27SDimitry Andric         return ABIArgInfo::getDirect();
3228*06c3fb27SDimitry Andric       } else if (IsReturnType) {
3229*06c3fb27SDimitry Andric         return ABIArgInfo::getExpand();
3230*06c3fb27SDimitry Andric       } else if (!Ty->isBuiltinType() && !Ty->isVectorType()) {
3231*06c3fb27SDimitry Andric         // HVAs are delayed and reclassified in the 2nd step.
3232*06c3fb27SDimitry Andric         return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
3233*06c3fb27SDimitry Andric       }
3234*06c3fb27SDimitry Andric     }
3235*06c3fb27SDimitry Andric   }
3236*06c3fb27SDimitry Andric 
3237*06c3fb27SDimitry Andric   if (Ty->isMemberPointerType()) {
3238*06c3fb27SDimitry Andric     // If the member pointer is represented by an LLVM int or ptr, pass it
3239*06c3fb27SDimitry Andric     // directly.
3240*06c3fb27SDimitry Andric     llvm::Type *LLTy = CGT.ConvertType(Ty);
3241*06c3fb27SDimitry Andric     if (LLTy->isPointerTy() || LLTy->isIntegerTy())
3242*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect();
3243*06c3fb27SDimitry Andric   }
3244*06c3fb27SDimitry Andric 
3245*06c3fb27SDimitry Andric   if (RT || Ty->isAnyComplexType() || Ty->isMemberPointerType()) {
3246*06c3fb27SDimitry Andric     // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
3247*06c3fb27SDimitry Andric     // not 1, 2, 4, or 8 bytes, must be passed by reference."
3248*06c3fb27SDimitry Andric     if (Width > 64 || !llvm::isPowerOf2_64(Width))
3249*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
3250*06c3fb27SDimitry Andric 
3251*06c3fb27SDimitry Andric     // Otherwise, coerce it to a small integer.
3252*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), Width));
3253*06c3fb27SDimitry Andric   }
3254*06c3fb27SDimitry Andric 
3255*06c3fb27SDimitry Andric   if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
3256*06c3fb27SDimitry Andric     switch (BT->getKind()) {
3257*06c3fb27SDimitry Andric     case BuiltinType::Bool:
3258*06c3fb27SDimitry Andric       // Bool type is always extended to the ABI, other builtin types are not
3259*06c3fb27SDimitry Andric       // extended.
3260*06c3fb27SDimitry Andric       return ABIArgInfo::getExtend(Ty);
3261*06c3fb27SDimitry Andric 
3262*06c3fb27SDimitry Andric     case BuiltinType::LongDouble:
3263*06c3fb27SDimitry Andric       // Mingw64 GCC uses the old 80 bit extended precision floating point
3264*06c3fb27SDimitry Andric       // unit. It passes them indirectly through memory.
3265*06c3fb27SDimitry Andric       if (IsMingw64) {
3266*06c3fb27SDimitry Andric         const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
3267*06c3fb27SDimitry Andric         if (LDF == &llvm::APFloat::x87DoubleExtended())
3268*06c3fb27SDimitry Andric           return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
3269*06c3fb27SDimitry Andric       }
3270*06c3fb27SDimitry Andric       break;
3271*06c3fb27SDimitry Andric 
3272*06c3fb27SDimitry Andric     case BuiltinType::Int128:
3273*06c3fb27SDimitry Andric     case BuiltinType::UInt128:
3274*06c3fb27SDimitry Andric       // If it's a parameter type, the normal ABI rule is that arguments larger
3275*06c3fb27SDimitry Andric       // than 8 bytes are passed indirectly. GCC follows it. We follow it too,
3276*06c3fb27SDimitry Andric       // even though it isn't particularly efficient.
3277*06c3fb27SDimitry Andric       if (!IsReturnType)
3278*06c3fb27SDimitry Andric         return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
3279*06c3fb27SDimitry Andric 
3280*06c3fb27SDimitry Andric       // Mingw64 GCC returns i128 in XMM0. Coerce to v2i64 to handle that.
3281*06c3fb27SDimitry Andric       // Clang matches them for compatibility.
3282*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(llvm::FixedVectorType::get(
3283*06c3fb27SDimitry Andric           llvm::Type::getInt64Ty(getVMContext()), 2));
3284*06c3fb27SDimitry Andric 
3285*06c3fb27SDimitry Andric     default:
3286*06c3fb27SDimitry Andric       break;
3287*06c3fb27SDimitry Andric     }
3288*06c3fb27SDimitry Andric   }
3289*06c3fb27SDimitry Andric 
3290*06c3fb27SDimitry Andric   if (Ty->isBitIntType()) {
3291*06c3fb27SDimitry Andric     // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
3292*06c3fb27SDimitry Andric     // not 1, 2, 4, or 8 bytes, must be passed by reference."
3293*06c3fb27SDimitry Andric     // However, non-power-of-two bit-precise integers will be passed as 1, 2, 4,
3294*06c3fb27SDimitry Andric     // or 8 bytes anyway as long is it fits in them, so we don't have to check
3295*06c3fb27SDimitry Andric     // the power of 2.
3296*06c3fb27SDimitry Andric     if (Width <= 64)
3297*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect();
3298*06c3fb27SDimitry Andric     return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
3299*06c3fb27SDimitry Andric   }
3300*06c3fb27SDimitry Andric 
3301*06c3fb27SDimitry Andric   return ABIArgInfo::getDirect();
3302*06c3fb27SDimitry Andric }
3303*06c3fb27SDimitry Andric 
3304*06c3fb27SDimitry Andric void WinX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
3305*06c3fb27SDimitry Andric   const unsigned CC = FI.getCallingConvention();
3306*06c3fb27SDimitry Andric   bool IsVectorCall = CC == llvm::CallingConv::X86_VectorCall;
3307*06c3fb27SDimitry Andric   bool IsRegCall = CC == llvm::CallingConv::X86_RegCall;
3308*06c3fb27SDimitry Andric 
3309*06c3fb27SDimitry Andric   // If __attribute__((sysv_abi)) is in use, use the SysV argument
3310*06c3fb27SDimitry Andric   // classification rules.
3311*06c3fb27SDimitry Andric   if (CC == llvm::CallingConv::X86_64_SysV) {
3312*06c3fb27SDimitry Andric     X86_64ABIInfo SysVABIInfo(CGT, AVXLevel);
3313*06c3fb27SDimitry Andric     SysVABIInfo.computeInfo(FI);
3314*06c3fb27SDimitry Andric     return;
3315*06c3fb27SDimitry Andric   }
3316*06c3fb27SDimitry Andric 
3317*06c3fb27SDimitry Andric   unsigned FreeSSERegs = 0;
3318*06c3fb27SDimitry Andric   if (IsVectorCall) {
3319*06c3fb27SDimitry Andric     // We can use up to 4 SSE return registers with vectorcall.
3320*06c3fb27SDimitry Andric     FreeSSERegs = 4;
3321*06c3fb27SDimitry Andric   } else if (IsRegCall) {
3322*06c3fb27SDimitry Andric     // RegCall gives us 16 SSE registers.
3323*06c3fb27SDimitry Andric     FreeSSERegs = 16;
3324*06c3fb27SDimitry Andric   }
3325*06c3fb27SDimitry Andric 
3326*06c3fb27SDimitry Andric   if (!getCXXABI().classifyReturnType(FI))
3327*06c3fb27SDimitry Andric     FI.getReturnInfo() = classify(FI.getReturnType(), FreeSSERegs, true,
3328*06c3fb27SDimitry Andric                                   IsVectorCall, IsRegCall);
3329*06c3fb27SDimitry Andric 
3330*06c3fb27SDimitry Andric   if (IsVectorCall) {
3331*06c3fb27SDimitry Andric     // We can use up to 6 SSE register parameters with vectorcall.
3332*06c3fb27SDimitry Andric     FreeSSERegs = 6;
3333*06c3fb27SDimitry Andric   } else if (IsRegCall) {
3334*06c3fb27SDimitry Andric     // RegCall gives us 16 SSE registers, we can reuse the return registers.
3335*06c3fb27SDimitry Andric     FreeSSERegs = 16;
3336*06c3fb27SDimitry Andric   }
3337*06c3fb27SDimitry Andric 
3338*06c3fb27SDimitry Andric   unsigned ArgNum = 0;
3339*06c3fb27SDimitry Andric   unsigned ZeroSSERegs = 0;
3340*06c3fb27SDimitry Andric   for (auto &I : FI.arguments()) {
3341*06c3fb27SDimitry Andric     // Vectorcall in x64 only permits the first 6 arguments to be passed as
3342*06c3fb27SDimitry Andric     // XMM/YMM registers. After the sixth argument, pretend no vector
3343*06c3fb27SDimitry Andric     // registers are left.
3344*06c3fb27SDimitry Andric     unsigned *MaybeFreeSSERegs =
3345*06c3fb27SDimitry Andric         (IsVectorCall && ArgNum >= 6) ? &ZeroSSERegs : &FreeSSERegs;
3346*06c3fb27SDimitry Andric     I.info =
3347*06c3fb27SDimitry Andric         classify(I.type, *MaybeFreeSSERegs, false, IsVectorCall, IsRegCall);
3348*06c3fb27SDimitry Andric     ++ArgNum;
3349*06c3fb27SDimitry Andric   }
3350*06c3fb27SDimitry Andric 
3351*06c3fb27SDimitry Andric   if (IsVectorCall) {
3352*06c3fb27SDimitry Andric     // For vectorcall, assign aggregate HVAs to any free vector registers in a
3353*06c3fb27SDimitry Andric     // second pass.
3354*06c3fb27SDimitry Andric     for (auto &I : FI.arguments())
3355*06c3fb27SDimitry Andric       I.info = reclassifyHvaArgForVectorCall(I.type, FreeSSERegs, I.info);
3356*06c3fb27SDimitry Andric   }
3357*06c3fb27SDimitry Andric }
3358*06c3fb27SDimitry Andric 
3359*06c3fb27SDimitry Andric Address WinX86_64ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
3360*06c3fb27SDimitry Andric                                     QualType Ty) const {
3361*06c3fb27SDimitry Andric   // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
3362*06c3fb27SDimitry Andric   // not 1, 2, 4, or 8 bytes, must be passed by reference."
3363*06c3fb27SDimitry Andric   uint64_t Width = getContext().getTypeSize(Ty);
3364*06c3fb27SDimitry Andric   bool IsIndirect = Width > 64 || !llvm::isPowerOf2_64(Width);
3365*06c3fb27SDimitry Andric 
3366*06c3fb27SDimitry Andric   return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect,
3367*06c3fb27SDimitry Andric                           CGF.getContext().getTypeInfoInChars(Ty),
3368*06c3fb27SDimitry Andric                           CharUnits::fromQuantity(8),
3369*06c3fb27SDimitry Andric                           /*allowHigherAlign*/ false);
3370*06c3fb27SDimitry Andric }
3371*06c3fb27SDimitry Andric 
3372*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo> CodeGen::createX86_32TargetCodeGenInfo(
3373*06c3fb27SDimitry Andric     CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI,
3374*06c3fb27SDimitry Andric     unsigned NumRegisterParameters, bool SoftFloatABI) {
3375*06c3fb27SDimitry Andric   bool RetSmallStructInRegABI = X86_32TargetCodeGenInfo::isStructReturnInRegABI(
3376*06c3fb27SDimitry Andric       CGM.getTriple(), CGM.getCodeGenOpts());
3377*06c3fb27SDimitry Andric   return std::make_unique<X86_32TargetCodeGenInfo>(
3378*06c3fb27SDimitry Andric       CGM.getTypes(), DarwinVectorABI, RetSmallStructInRegABI, Win32StructABI,
3379*06c3fb27SDimitry Andric       NumRegisterParameters, SoftFloatABI);
3380*06c3fb27SDimitry Andric }
3381*06c3fb27SDimitry Andric 
3382*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo> CodeGen::createWinX86_32TargetCodeGenInfo(
3383*06c3fb27SDimitry Andric     CodeGenModule &CGM, bool DarwinVectorABI, bool Win32StructABI,
3384*06c3fb27SDimitry Andric     unsigned NumRegisterParameters) {
3385*06c3fb27SDimitry Andric   bool RetSmallStructInRegABI = X86_32TargetCodeGenInfo::isStructReturnInRegABI(
3386*06c3fb27SDimitry Andric       CGM.getTriple(), CGM.getCodeGenOpts());
3387*06c3fb27SDimitry Andric   return std::make_unique<WinX86_32TargetCodeGenInfo>(
3388*06c3fb27SDimitry Andric       CGM.getTypes(), DarwinVectorABI, RetSmallStructInRegABI, Win32StructABI,
3389*06c3fb27SDimitry Andric       NumRegisterParameters);
3390*06c3fb27SDimitry Andric }
3391*06c3fb27SDimitry Andric 
3392*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo>
3393*06c3fb27SDimitry Andric CodeGen::createX86_64TargetCodeGenInfo(CodeGenModule &CGM,
3394*06c3fb27SDimitry Andric                                        X86AVXABILevel AVXLevel) {
3395*06c3fb27SDimitry Andric   return std::make_unique<X86_64TargetCodeGenInfo>(CGM.getTypes(), AVXLevel);
3396*06c3fb27SDimitry Andric }
3397*06c3fb27SDimitry Andric 
3398*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo>
3399*06c3fb27SDimitry Andric CodeGen::createWinX86_64TargetCodeGenInfo(CodeGenModule &CGM,
3400*06c3fb27SDimitry Andric                                           X86AVXABILevel AVXLevel) {
3401*06c3fb27SDimitry Andric   return std::make_unique<WinX86_64TargetCodeGenInfo>(CGM.getTypes(), AVXLevel);
3402*06c3fb27SDimitry Andric }
3403