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 BarannikovABIArgInfo 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 BarannikovABIArgInfo 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 Barannikovvoid 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 BarannikovCodeGen::createVETargetCodeGenInfo(CodeGenModule &CGM) { 70*992cb984SSergei Barannikov return std::make_unique<VETargetCodeGenInfo>(CGM.getTypes()); 71*992cb984SSergei Barannikov } 72