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 AndricABIArgInfo 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 AndricABIArgInfo 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 Andricvoid 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 AndricCodeGen::createVETargetCodeGenInfo(CodeGenModule &CGM) { 70*06c3fb27SDimitry Andric return std::make_unique<VETargetCodeGenInfo>(CGM.getTypes()); 71*06c3fb27SDimitry Andric } 72