xref: /llvm-project/clang/lib/CodeGen/Targets/VE.cpp (revision 992cb98462abb7630e87003516b75b241628f64c)
1*992cb984SSergei Barannikov //===- VE.cpp -------------------------------------------------------------===//
2*992cb984SSergei Barannikov //
3*992cb984SSergei Barannikov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*992cb984SSergei Barannikov // See https://llvm.org/LICENSE.txt for license information.
5*992cb984SSergei Barannikov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*992cb984SSergei Barannikov //
7*992cb984SSergei Barannikov //===----------------------------------------------------------------------===//
8*992cb984SSergei Barannikov 
9*992cb984SSergei Barannikov #include "ABIInfoImpl.h"
10*992cb984SSergei Barannikov #include "TargetInfo.h"
11*992cb984SSergei Barannikov 
12*992cb984SSergei Barannikov using namespace clang;
13*992cb984SSergei Barannikov using namespace clang::CodeGen;
14*992cb984SSergei Barannikov 
15*992cb984SSergei Barannikov //===----------------------------------------------------------------------===//
16*992cb984SSergei Barannikov // VE ABI Implementation.
17*992cb984SSergei Barannikov //
18*992cb984SSergei Barannikov namespace {
19*992cb984SSergei Barannikov class VEABIInfo : public DefaultABIInfo {
20*992cb984SSergei Barannikov public:
VEABIInfo(CodeGenTypes & CGT)21*992cb984SSergei Barannikov   VEABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
22*992cb984SSergei Barannikov 
23*992cb984SSergei Barannikov private:
24*992cb984SSergei Barannikov   ABIArgInfo classifyReturnType(QualType RetTy) const;
25*992cb984SSergei Barannikov   ABIArgInfo classifyArgumentType(QualType RetTy) const;
26*992cb984SSergei Barannikov   void computeInfo(CGFunctionInfo &FI) const override;
27*992cb984SSergei Barannikov };
28*992cb984SSergei Barannikov } // end anonymous namespace
29*992cb984SSergei Barannikov 
classifyReturnType(QualType Ty) const30*992cb984SSergei Barannikov ABIArgInfo VEABIInfo::classifyReturnType(QualType Ty) const {
31*992cb984SSergei Barannikov   if (Ty->isAnyComplexType())
32*992cb984SSergei Barannikov     return ABIArgInfo::getDirect();
33*992cb984SSergei Barannikov   uint64_t Size = getContext().getTypeSize(Ty);
34*992cb984SSergei Barannikov   if (Size < 64 && Ty->isIntegerType())
35*992cb984SSergei Barannikov     return ABIArgInfo::getExtend(Ty);
36*992cb984SSergei Barannikov   return DefaultABIInfo::classifyReturnType(Ty);
37*992cb984SSergei Barannikov }
38*992cb984SSergei Barannikov 
classifyArgumentType(QualType Ty) const39*992cb984SSergei Barannikov ABIArgInfo VEABIInfo::classifyArgumentType(QualType Ty) const {
40*992cb984SSergei Barannikov   if (Ty->isAnyComplexType())
41*992cb984SSergei Barannikov     return ABIArgInfo::getDirect();
42*992cb984SSergei Barannikov   uint64_t Size = getContext().getTypeSize(Ty);
43*992cb984SSergei Barannikov   if (Size < 64 && Ty->isIntegerType())
44*992cb984SSergei Barannikov     return ABIArgInfo::getExtend(Ty);
45*992cb984SSergei Barannikov   return DefaultABIInfo::classifyArgumentType(Ty);
46*992cb984SSergei Barannikov }
47*992cb984SSergei Barannikov 
computeInfo(CGFunctionInfo & FI) const48*992cb984SSergei Barannikov void VEABIInfo::computeInfo(CGFunctionInfo &FI) const {
49*992cb984SSergei Barannikov   FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
50*992cb984SSergei Barannikov   for (auto &Arg : FI.arguments())
51*992cb984SSergei Barannikov     Arg.info = classifyArgumentType(Arg.type);
52*992cb984SSergei Barannikov }
53*992cb984SSergei Barannikov 
54*992cb984SSergei Barannikov namespace {
55*992cb984SSergei Barannikov class VETargetCodeGenInfo : public TargetCodeGenInfo {
56*992cb984SSergei Barannikov public:
VETargetCodeGenInfo(CodeGenTypes & CGT)57*992cb984SSergei Barannikov   VETargetCodeGenInfo(CodeGenTypes &CGT)
58*992cb984SSergei Barannikov       : TargetCodeGenInfo(std::make_unique<VEABIInfo>(CGT)) {}
59*992cb984SSergei Barannikov   // VE ABI requires the arguments of variadic and prototype-less functions
60*992cb984SSergei Barannikov   // are passed in both registers and memory.
isNoProtoCallVariadic(const CallArgList & args,const FunctionNoProtoType * fnType) const61*992cb984SSergei Barannikov   bool isNoProtoCallVariadic(const CallArgList &args,
62*992cb984SSergei Barannikov                              const FunctionNoProtoType *fnType) const override {
63*992cb984SSergei Barannikov     return true;
64*992cb984SSergei Barannikov   }
65*992cb984SSergei Barannikov };
66*992cb984SSergei Barannikov } // end anonymous namespace
67*992cb984SSergei Barannikov 
68*992cb984SSergei Barannikov std::unique_ptr<TargetCodeGenInfo>
createVETargetCodeGenInfo(CodeGenModule & CGM)69*992cb984SSergei Barannikov CodeGen::createVETargetCodeGenInfo(CodeGenModule &CGM) {
70*992cb984SSergei Barannikov   return std::make_unique<VETargetCodeGenInfo>(CGM.getTypes());
71*992cb984SSergei Barannikov }
72