diff options
Diffstat (limited to 'clang/lib/Sema/SemaRISCVVectorLookup.cpp')
-rw-r--r-- | clang/lib/Sema/SemaRISCVVectorLookup.cpp | 106 |
1 files changed, 76 insertions, 30 deletions
diff --git a/clang/lib/Sema/SemaRISCVVectorLookup.cpp b/clang/lib/Sema/SemaRISCVVectorLookup.cpp index 50fd841c231b..7716dfb15458 100644 --- a/clang/lib/Sema/SemaRISCVVectorLookup.cpp +++ b/clang/lib/Sema/SemaRISCVVectorLookup.cpp @@ -20,6 +20,7 @@ #include "clang/Sema/Sema.h" #include "clang/Support/RISCVVIntrinsicUtils.h" #include "llvm/ADT/SmallVector.h" +#include <optional> #include <string> #include <vector> @@ -66,7 +67,7 @@ static const RVVIntrinsicRecord RVVIntrinsicRecords[] = { // Get subsequence of signature table. static ArrayRef<PrototypeDescriptor> ProtoSeq2ArrayRef(uint16_t Index, uint8_t Length) { - return makeArrayRef(&RVVSignatureTable[Index], Length); + return ArrayRef(&RVVSignatureTable[Index], Length); } static QualType RVVType2Qual(ASTContext &Context, const RVVType *Type) { @@ -115,7 +116,7 @@ static QualType RVVType2Qual(ASTContext &Context, const RVVType *Type) { llvm_unreachable("Unhandled type."); } if (Type->isVector()) - QT = Context.getScalableVectorType(QT, Type->getScale().getValue()); + QT = Context.getScalableVectorType(QT, *Type->getScale()); if (Type->isConstant()) QT = Context.getConstType(QT); @@ -132,6 +133,7 @@ class RISCVIntrinsicManagerImpl : public sema::RISCVIntrinsicManager { private: Sema &S; ASTContext &Context; + RVVTypeCache TypeCache; // List of all RVV intrinsic. std::vector<RVVIntrinsicDef> IntrinsicList; @@ -146,7 +148,7 @@ private: // Create RVVIntrinsicDef. void InitRVVIntrinsic(const RVVIntrinsicRecord &Record, StringRef SuffixStr, StringRef OverloadedSuffixStr, bool IsMask, - RVVTypes &Types); + RVVTypes &Types, bool HasPolicy, Policy PolicyAttrs); // Create FunctionDecl for a vector intrinsic. void CreateRVVIntrinsicDecl(LookupResult &LR, IdentifierInfo *II, @@ -185,15 +187,32 @@ void RISCVIntrinsicManagerImpl::InitIntrinsicList() { ArrayRef<PrototypeDescriptor> OverloadedSuffixProto = ProtoSeq2ArrayRef( Record.OverloadedSuffixIndex, Record.OverloadedSuffixSize); + PolicyScheme UnMaskedPolicyScheme = + static_cast<PolicyScheme>(Record.UnMaskedPolicyScheme); + PolicyScheme MaskedPolicyScheme = + static_cast<PolicyScheme>(Record.MaskedPolicyScheme); + + const Policy DefaultPolicy(Record.HasTailPolicy, Record.HasMaskPolicy); + llvm::SmallVector<PrototypeDescriptor> ProtoSeq = RVVIntrinsic::computeBuiltinTypes(BasicProtoSeq, /*IsMasked=*/false, /*HasMaskedOffOperand=*/false, - Record.HasVL, Record.NF); + Record.HasVL, Record.NF, + UnMaskedPolicyScheme, DefaultPolicy); llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq = - RVVIntrinsic::computeBuiltinTypes(BasicProtoSeq, /*IsMasked=*/true, - Record.HasMaskedOffOperand, - Record.HasVL, Record.NF); + RVVIntrinsic::computeBuiltinTypes( + BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand, + Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy); + + bool UnMaskedHasPolicy = UnMaskedPolicyScheme != PolicyScheme::SchemeNone; + bool MaskedHasPolicy = MaskedPolicyScheme != PolicyScheme::SchemeNone; + SmallVector<Policy> SupportedUnMaskedPolicies = + RVVIntrinsic::getSupportedUnMaskedPolicies(Record.HasTailPolicy, + Record.HasMaskPolicy); + SmallVector<Policy> SupportedMaskedPolicies = + RVVIntrinsic::getSupportedMaskedPolicies(Record.HasTailPolicy, + Record.HasMaskPolicy); for (unsigned int TypeRangeMaskShift = 0; TypeRangeMaskShift <= static_cast<unsigned int>(BasicType::MaxOffset); @@ -229,46 +248,72 @@ void RISCVIntrinsicManagerImpl::InitIntrinsicList() { if (!(Record.Log2LMULMask & (1 << (Log2LMUL + 3)))) continue; - Optional<RVVTypes> Types = - RVVType::computeTypes(BaseType, Log2LMUL, Record.NF, ProtoSeq); + std::optional<RVVTypes> Types = + TypeCache.computeTypes(BaseType, Log2LMUL, Record.NF, ProtoSeq); // Ignored to create new intrinsic if there are any illegal types. - if (!Types.hasValue()) + if (!Types.has_value()) continue; - std::string SuffixStr = - RVVIntrinsic::getSuffixStr(BaseType, Log2LMUL, SuffixProto); + std::string SuffixStr = RVVIntrinsic::getSuffixStr( + TypeCache, BaseType, Log2LMUL, SuffixProto); std::string OverloadedSuffixStr = RVVIntrinsic::getSuffixStr( - BaseType, Log2LMUL, OverloadedSuffixProto); + TypeCache, BaseType, Log2LMUL, OverloadedSuffixProto); // Create non-masked intrinsic. - InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, false, *Types); - - if (Record.HasMasked) { - // Create masked intrinsic. - Optional<RVVTypes> MaskTypes = RVVType::computeTypes( - BaseType, Log2LMUL, Record.NF, ProtoMaskSeq); - - InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, true, - *MaskTypes); + InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, false, *Types, + UnMaskedHasPolicy, DefaultPolicy); + + // Create non-masked policy intrinsic. + if (Record.UnMaskedPolicyScheme != PolicyScheme::SchemeNone) { + for (auto P : SupportedUnMaskedPolicies) { + llvm::SmallVector<PrototypeDescriptor> PolicyPrototype = + RVVIntrinsic::computeBuiltinTypes( + BasicProtoSeq, /*IsMasked=*/false, + /*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF, + UnMaskedPolicyScheme, P); + std::optional<RVVTypes> PolicyTypes = TypeCache.computeTypes( + BaseType, Log2LMUL, Record.NF, PolicyPrototype); + InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, + /*IsMask=*/false, *PolicyTypes, UnMaskedHasPolicy, + P); + } } - } - } + if (!Record.HasMasked) + continue; + // Create masked intrinsic. + std::optional<RVVTypes> MaskTypes = + TypeCache.computeTypes(BaseType, Log2LMUL, Record.NF, ProtoMaskSeq); + InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, true, + *MaskTypes, MaskedHasPolicy, DefaultPolicy); + if (Record.MaskedPolicyScheme == PolicyScheme::SchemeNone) + continue; + // Create masked policy intrinsic. + for (auto P : SupportedMaskedPolicies) { + llvm::SmallVector<PrototypeDescriptor> PolicyPrototype = + RVVIntrinsic::computeBuiltinTypes( + BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand, + Record.HasVL, Record.NF, MaskedPolicyScheme, P); + std::optional<RVVTypes> PolicyTypes = TypeCache.computeTypes( + BaseType, Log2LMUL, Record.NF, PolicyPrototype); + InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, + /*IsMask=*/true, *PolicyTypes, MaskedHasPolicy, P); + } + } // End for different LMUL + } // End for different TypeRange } } // Compute name and signatures for intrinsic with practical types. void RISCVIntrinsicManagerImpl::InitRVVIntrinsic( const RVVIntrinsicRecord &Record, StringRef SuffixStr, - StringRef OverloadedSuffixStr, bool IsMask, RVVTypes &Signature) { + StringRef OverloadedSuffixStr, bool IsMasked, RVVTypes &Signature, + bool HasPolicy, Policy PolicyAttrs) { // Function name, e.g. vadd_vv_i32m1. std::string Name = Record.Name; if (!SuffixStr.empty()) Name += "_" + SuffixStr.str(); - if (IsMask) - Name += "_m"; - // Overloaded function name, e.g. vadd. std::string OverloadedName; if (!Record.OverloadedName) @@ -280,8 +325,9 @@ void RISCVIntrinsicManagerImpl::InitRVVIntrinsic( // clang built-in function name, e.g. __builtin_rvv_vadd. std::string BuiltinName = "__builtin_rvv_" + std::string(Record.Name); - if (IsMask) - BuiltinName += "_m"; + + RVVIntrinsic::updateNamesAndPolicy(IsMasked, HasPolicy, Name, BuiltinName, + OverloadedName, PolicyAttrs); // Put into IntrinsicList. size_t Index = IntrinsicList.size(); |