xref: /freebsd-src/contrib/llvm-project/clang/lib/CodeGen/Targets/VE.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1*06c3fb27SDimitry Andric //===- VE.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 
12*06c3fb27SDimitry Andric using namespace clang;
13*06c3fb27SDimitry Andric using namespace clang::CodeGen;
14*06c3fb27SDimitry Andric 
15*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
16*06c3fb27SDimitry Andric // VE ABI Implementation.
17*06c3fb27SDimitry Andric //
18*06c3fb27SDimitry Andric namespace {
19*06c3fb27SDimitry Andric class VEABIInfo : public DefaultABIInfo {
20*06c3fb27SDimitry Andric public:
VEABIInfo(CodeGenTypes & CGT)21*06c3fb27SDimitry Andric   VEABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
22*06c3fb27SDimitry Andric 
23*06c3fb27SDimitry Andric private:
24*06c3fb27SDimitry Andric   ABIArgInfo classifyReturnType(QualType RetTy) const;
25*06c3fb27SDimitry Andric   ABIArgInfo classifyArgumentType(QualType RetTy) const;
26*06c3fb27SDimitry Andric   void computeInfo(CGFunctionInfo &FI) const override;
27*06c3fb27SDimitry Andric };
28*06c3fb27SDimitry Andric } // end anonymous namespace
29*06c3fb27SDimitry Andric 
classifyReturnType(QualType Ty) const30*06c3fb27SDimitry Andric ABIArgInfo VEABIInfo::classifyReturnType(QualType Ty) const {
31*06c3fb27SDimitry Andric   if (Ty->isAnyComplexType())
32*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
33*06c3fb27SDimitry Andric   uint64_t Size = getContext().getTypeSize(Ty);
34*06c3fb27SDimitry Andric   if (Size < 64 && Ty->isIntegerType())
35*06c3fb27SDimitry Andric     return ABIArgInfo::getExtend(Ty);
36*06c3fb27SDimitry Andric   return DefaultABIInfo::classifyReturnType(Ty);
37*06c3fb27SDimitry Andric }
38*06c3fb27SDimitry Andric 
classifyArgumentType(QualType Ty) const39*06c3fb27SDimitry Andric ABIArgInfo VEABIInfo::classifyArgumentType(QualType Ty) const {
40*06c3fb27SDimitry Andric   if (Ty->isAnyComplexType())
41*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
42*06c3fb27SDimitry Andric   uint64_t Size = getContext().getTypeSize(Ty);
43*06c3fb27SDimitry Andric   if (Size < 64 && Ty->isIntegerType())
44*06c3fb27SDimitry Andric     return ABIArgInfo::getExtend(Ty);
45*06c3fb27SDimitry Andric   return DefaultABIInfo::classifyArgumentType(Ty);
46*06c3fb27SDimitry Andric }
47*06c3fb27SDimitry Andric 
computeInfo(CGFunctionInfo & FI) const48*06c3fb27SDimitry Andric void VEABIInfo::computeInfo(CGFunctionInfo &FI) const {
49*06c3fb27SDimitry Andric   FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
50*06c3fb27SDimitry Andric   for (auto &Arg : FI.arguments())
51*06c3fb27SDimitry Andric     Arg.info = classifyArgumentType(Arg.type);
52*06c3fb27SDimitry Andric }
53*06c3fb27SDimitry Andric 
54*06c3fb27SDimitry Andric namespace {
55*06c3fb27SDimitry Andric class VETargetCodeGenInfo : public TargetCodeGenInfo {
56*06c3fb27SDimitry Andric public:
VETargetCodeGenInfo(CodeGenTypes & CGT)57*06c3fb27SDimitry Andric   VETargetCodeGenInfo(CodeGenTypes &CGT)
58*06c3fb27SDimitry Andric       : TargetCodeGenInfo(std::make_unique<VEABIInfo>(CGT)) {}
59*06c3fb27SDimitry Andric   // VE ABI requires the arguments of variadic and prototype-less functions
60*06c3fb27SDimitry Andric   // are passed in both registers and memory.
isNoProtoCallVariadic(const CallArgList & args,const FunctionNoProtoType * fnType) const61*06c3fb27SDimitry Andric   bool isNoProtoCallVariadic(const CallArgList &args,
62*06c3fb27SDimitry Andric                              const FunctionNoProtoType *fnType) const override {
63*06c3fb27SDimitry Andric     return true;
64*06c3fb27SDimitry Andric   }
65*06c3fb27SDimitry Andric };
66*06c3fb27SDimitry Andric } // end anonymous namespace
67*06c3fb27SDimitry Andric 
68*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo>
createVETargetCodeGenInfo(CodeGenModule & CGM)69*06c3fb27SDimitry Andric CodeGen::createVETargetCodeGenInfo(CodeGenModule &CGM) {
70*06c3fb27SDimitry Andric   return std::make_unique<VETargetCodeGenInfo>(CGM.getTypes());
71*06c3fb27SDimitry Andric }
72