10#include "TargetInfo.h"
12#include "llvm/IR/IntrinsicsS390.h"
23class SystemZABIInfo :
public ABIInfo {
29 :
ABIInfo(CGT), HasVector(HV), IsSoftFloatABI(SF) {}
32 bool isCompoundType(
QualType Ty)
const;
33 bool isVectorArgumentType(
QualType Ty)
const;
34 bool isFPArgumentType(
QualType Ty)
const;
49 mutable bool HasVisibleVecABIFlag =
false;
50 mutable std::set<const Type *> SeenTypes;
57 bool isVectorTypeBased(
const Type *Ty,
bool IsParam)
const;
60 SystemZTargetCodeGenInfo(
CodeGenTypes &CGT,
bool HasVector,
bool SoftFloatABI)
62 std::make_unique<SystemZABIInfo>(CGT, HasVector, SoftFloatABI)),
63 Ctx(CGT.getContext()) {
65 std::make_unique<SwiftABIInfo>(CGT,
false);
75 if (!HasVisibleVecABIFlag && isVectorTypeBased(Ty, IsParam)) {
76 M.
getModule().addModuleFlag(llvm::Module::Warning,
77 "s390x-visible-vector-ABI", 1);
78 HasVisibleVecABIFlag =
true;
89 if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
90 if (VD->isExternallyVisible())
91 handleExternallyVisibleObjABI(VD->getType().getTypePtr(), M,
94 else if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(
D)) {
95 if (FD->isExternallyVisible())
96 handleExternallyVisibleObjABI(FD->getType().getTypePtr(), M,
101 llvm::Value *
testFPKind(llvm::Value *
V,
unsigned BuiltinID,
104 assert(
V->getType()->isFloatingPointTy() &&
"V should have an FP type.");
106 if (!Builder.getIsFPConstrained())
109 llvm::Type *Ty =
V->getType();
110 if (Ty->isFloatTy() || Ty->isDoubleTy() || Ty->isFP128Ty()) {
112 auto &Ctx = M.getContext();
113 llvm::Function *TDCFunc = llvm::Intrinsic::getOrInsertDeclaration(
114 &M, llvm::Intrinsic::s390_tdc, Ty);
115 unsigned TDCBits = 0;
117 case Builtin::BI__builtin_isnan:
120 case Builtin::BIfinite:
121 case Builtin::BI__finite:
122 case Builtin::BIfinitef:
123 case Builtin::BI__finitef:
124 case Builtin::BIfinitel:
125 case Builtin::BI__finitel:
126 case Builtin::BI__builtin_isfinite:
129 case Builtin::BI__builtin_isinf:
136 return Builder.CreateCall(
138 {
V, llvm::ConstantInt::get(llvm::Type::getInt64Ty(Ctx), TDCBits)});
145bool SystemZABIInfo::isPromotableIntegerTypeForABI(
QualType Ty)
const {
148 Ty = EnumTy->getDecl()->getIntegerType();
155 if (EIT->getNumBits() < 64)