1a640a2e0SVlad Serebrennikov //===------ SemaRISCV.cpp ------- RISC-V target-specific routines ---------===// 24f5bc4bbSVlad Serebrennikov // 34f5bc4bbSVlad Serebrennikov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 44f5bc4bbSVlad Serebrennikov // See https://llvm.org/LICENSE.txt for license information. 54f5bc4bbSVlad Serebrennikov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 64f5bc4bbSVlad Serebrennikov // 74f5bc4bbSVlad Serebrennikov //===----------------------------------------------------------------------===// 84f5bc4bbSVlad Serebrennikov // 9a640a2e0SVlad Serebrennikov // This file implements semantic analysis functions specific to RISC-V. 104f5bc4bbSVlad Serebrennikov // 114f5bc4bbSVlad Serebrennikov //===----------------------------------------------------------------------===// 124f5bc4bbSVlad Serebrennikov 13a640a2e0SVlad Serebrennikov #include "clang/Sema/SemaRISCV.h" 144f5bc4bbSVlad Serebrennikov #include "clang/AST/ASTContext.h" 154f5bc4bbSVlad Serebrennikov #include "clang/AST/Decl.h" 164f5bc4bbSVlad Serebrennikov #include "clang/Basic/Builtins.h" 17a640a2e0SVlad Serebrennikov #include "clang/Basic/TargetBuiltins.h" 184f5bc4bbSVlad Serebrennikov #include "clang/Basic/TargetInfo.h" 194f5bc4bbSVlad Serebrennikov #include "clang/Lex/Preprocessor.h" 206b755b0cSVlad Serebrennikov #include "clang/Sema/Attr.h" 21a640a2e0SVlad Serebrennikov #include "clang/Sema/Initialization.h" 224f5bc4bbSVlad Serebrennikov #include "clang/Sema/Lookup.h" 236b755b0cSVlad Serebrennikov #include "clang/Sema/ParsedAttr.h" 244f5bc4bbSVlad Serebrennikov #include "clang/Sema/RISCVIntrinsicManager.h" 254f5bc4bbSVlad Serebrennikov #include "clang/Sema/Sema.h" 264f5bc4bbSVlad Serebrennikov #include "clang/Support/RISCVVIntrinsicUtils.h" 274f5bc4bbSVlad Serebrennikov #include "llvm/ADT/SmallVector.h" 289cd93774SPiyou Chen #include "llvm/TargetParser/RISCVISAInfo.h" 29a640a2e0SVlad Serebrennikov #include "llvm/TargetParser/RISCVTargetParser.h" 304f5bc4bbSVlad Serebrennikov #include <optional> 314f5bc4bbSVlad Serebrennikov #include <string> 324f5bc4bbSVlad Serebrennikov #include <vector> 334f5bc4bbSVlad Serebrennikov 344f5bc4bbSVlad Serebrennikov using namespace llvm; 354f5bc4bbSVlad Serebrennikov using namespace clang; 364f5bc4bbSVlad Serebrennikov using namespace clang::RISCV; 374f5bc4bbSVlad Serebrennikov 384f5bc4bbSVlad Serebrennikov using IntrinsicKind = sema::RISCVIntrinsicManager::IntrinsicKind; 394f5bc4bbSVlad Serebrennikov 404f5bc4bbSVlad Serebrennikov namespace { 414f5bc4bbSVlad Serebrennikov 424f5bc4bbSVlad Serebrennikov // Function definition of a RVV intrinsic. 434f5bc4bbSVlad Serebrennikov struct RVVIntrinsicDef { 444f5bc4bbSVlad Serebrennikov /// Mapping to which clang built-in function, e.g. __builtin_rvv_vadd. 454f5bc4bbSVlad Serebrennikov std::string BuiltinName; 464f5bc4bbSVlad Serebrennikov 474f5bc4bbSVlad Serebrennikov /// Function signature, first element is return type. 484f5bc4bbSVlad Serebrennikov RVVTypes Signature; 494f5bc4bbSVlad Serebrennikov }; 504f5bc4bbSVlad Serebrennikov 514f5bc4bbSVlad Serebrennikov struct RVVOverloadIntrinsicDef { 524f5bc4bbSVlad Serebrennikov // Indexes of RISCVIntrinsicManagerImpl::IntrinsicList. 53*e3b22dceSBrandon Wu SmallVector<uint32_t, 8> Indexes; 544f5bc4bbSVlad Serebrennikov }; 554f5bc4bbSVlad Serebrennikov 564f5bc4bbSVlad Serebrennikov } // namespace 574f5bc4bbSVlad Serebrennikov 584f5bc4bbSVlad Serebrennikov static const PrototypeDescriptor RVVSignatureTable[] = { 594f5bc4bbSVlad Serebrennikov #define DECL_SIGNATURE_TABLE 604f5bc4bbSVlad Serebrennikov #include "clang/Basic/riscv_vector_builtin_sema.inc" 614f5bc4bbSVlad Serebrennikov #undef DECL_SIGNATURE_TABLE 624f5bc4bbSVlad Serebrennikov }; 634f5bc4bbSVlad Serebrennikov 644f5bc4bbSVlad Serebrennikov static const PrototypeDescriptor RVSiFiveVectorSignatureTable[] = { 654f5bc4bbSVlad Serebrennikov #define DECL_SIGNATURE_TABLE 664f5bc4bbSVlad Serebrennikov #include "clang/Basic/riscv_sifive_vector_builtin_sema.inc" 674f5bc4bbSVlad Serebrennikov #undef DECL_SIGNATURE_TABLE 684f5bc4bbSVlad Serebrennikov }; 694f5bc4bbSVlad Serebrennikov 704f5bc4bbSVlad Serebrennikov static const RVVIntrinsicRecord RVVIntrinsicRecords[] = { 714f5bc4bbSVlad Serebrennikov #define DECL_INTRINSIC_RECORDS 724f5bc4bbSVlad Serebrennikov #include "clang/Basic/riscv_vector_builtin_sema.inc" 734f5bc4bbSVlad Serebrennikov #undef DECL_INTRINSIC_RECORDS 744f5bc4bbSVlad Serebrennikov }; 754f5bc4bbSVlad Serebrennikov 764f5bc4bbSVlad Serebrennikov static const RVVIntrinsicRecord RVSiFiveVectorIntrinsicRecords[] = { 774f5bc4bbSVlad Serebrennikov #define DECL_INTRINSIC_RECORDS 784f5bc4bbSVlad Serebrennikov #include "clang/Basic/riscv_sifive_vector_builtin_sema.inc" 794f5bc4bbSVlad Serebrennikov #undef DECL_INTRINSIC_RECORDS 804f5bc4bbSVlad Serebrennikov }; 814f5bc4bbSVlad Serebrennikov 824f5bc4bbSVlad Serebrennikov // Get subsequence of signature table. 834f5bc4bbSVlad Serebrennikov static ArrayRef<PrototypeDescriptor> 844f5bc4bbSVlad Serebrennikov ProtoSeq2ArrayRef(IntrinsicKind K, uint16_t Index, uint8_t Length) { 854f5bc4bbSVlad Serebrennikov switch (K) { 864f5bc4bbSVlad Serebrennikov case IntrinsicKind::RVV: 874f5bc4bbSVlad Serebrennikov return ArrayRef(&RVVSignatureTable[Index], Length); 884f5bc4bbSVlad Serebrennikov case IntrinsicKind::SIFIVE_VECTOR: 894f5bc4bbSVlad Serebrennikov return ArrayRef(&RVSiFiveVectorSignatureTable[Index], Length); 904f5bc4bbSVlad Serebrennikov } 914f5bc4bbSVlad Serebrennikov llvm_unreachable("Unhandled IntrinsicKind"); 924f5bc4bbSVlad Serebrennikov } 934f5bc4bbSVlad Serebrennikov 944f5bc4bbSVlad Serebrennikov static QualType RVVType2Qual(ASTContext &Context, const RVVType *Type) { 954f5bc4bbSVlad Serebrennikov QualType QT; 964f5bc4bbSVlad Serebrennikov switch (Type->getScalarType()) { 974f5bc4bbSVlad Serebrennikov case ScalarTypeKind::Void: 984f5bc4bbSVlad Serebrennikov QT = Context.VoidTy; 994f5bc4bbSVlad Serebrennikov break; 1004f5bc4bbSVlad Serebrennikov case ScalarTypeKind::Size_t: 1014f5bc4bbSVlad Serebrennikov QT = Context.getSizeType(); 1024f5bc4bbSVlad Serebrennikov break; 1034f5bc4bbSVlad Serebrennikov case ScalarTypeKind::Ptrdiff_t: 1044f5bc4bbSVlad Serebrennikov QT = Context.getPointerDiffType(); 1054f5bc4bbSVlad Serebrennikov break; 1064f5bc4bbSVlad Serebrennikov case ScalarTypeKind::UnsignedLong: 1074f5bc4bbSVlad Serebrennikov QT = Context.UnsignedLongTy; 1084f5bc4bbSVlad Serebrennikov break; 1094f5bc4bbSVlad Serebrennikov case ScalarTypeKind::SignedLong: 1104f5bc4bbSVlad Serebrennikov QT = Context.LongTy; 1114f5bc4bbSVlad Serebrennikov break; 1124f5bc4bbSVlad Serebrennikov case ScalarTypeKind::Boolean: 1134f5bc4bbSVlad Serebrennikov QT = Context.BoolTy; 1144f5bc4bbSVlad Serebrennikov break; 1154f5bc4bbSVlad Serebrennikov case ScalarTypeKind::SignedInteger: 1164f5bc4bbSVlad Serebrennikov QT = Context.getIntTypeForBitwidth(Type->getElementBitwidth(), true); 1174f5bc4bbSVlad Serebrennikov break; 1184f5bc4bbSVlad Serebrennikov case ScalarTypeKind::UnsignedInteger: 1194f5bc4bbSVlad Serebrennikov QT = Context.getIntTypeForBitwidth(Type->getElementBitwidth(), false); 1204f5bc4bbSVlad Serebrennikov break; 1214f5bc4bbSVlad Serebrennikov case ScalarTypeKind::BFloat: 1224f5bc4bbSVlad Serebrennikov QT = Context.BFloat16Ty; 1234f5bc4bbSVlad Serebrennikov break; 1244f5bc4bbSVlad Serebrennikov case ScalarTypeKind::Float: 1254f5bc4bbSVlad Serebrennikov switch (Type->getElementBitwidth()) { 1264f5bc4bbSVlad Serebrennikov case 64: 1274f5bc4bbSVlad Serebrennikov QT = Context.DoubleTy; 1284f5bc4bbSVlad Serebrennikov break; 1294f5bc4bbSVlad Serebrennikov case 32: 1304f5bc4bbSVlad Serebrennikov QT = Context.FloatTy; 1314f5bc4bbSVlad Serebrennikov break; 1324f5bc4bbSVlad Serebrennikov case 16: 1334f5bc4bbSVlad Serebrennikov QT = Context.Float16Ty; 1344f5bc4bbSVlad Serebrennikov break; 1354f5bc4bbSVlad Serebrennikov default: 1364f5bc4bbSVlad Serebrennikov llvm_unreachable("Unsupported floating point width."); 1374f5bc4bbSVlad Serebrennikov } 1384f5bc4bbSVlad Serebrennikov break; 1394f5bc4bbSVlad Serebrennikov case Invalid: 1404f5bc4bbSVlad Serebrennikov case Undefined: 1414f5bc4bbSVlad Serebrennikov llvm_unreachable("Unhandled type."); 1424f5bc4bbSVlad Serebrennikov } 1434f5bc4bbSVlad Serebrennikov if (Type->isVector()) { 1444f5bc4bbSVlad Serebrennikov if (Type->isTuple()) 1454f5bc4bbSVlad Serebrennikov QT = Context.getScalableVectorType(QT, *Type->getScale(), Type->getNF()); 1464f5bc4bbSVlad Serebrennikov else 1474f5bc4bbSVlad Serebrennikov QT = Context.getScalableVectorType(QT, *Type->getScale()); 1484f5bc4bbSVlad Serebrennikov } 1494f5bc4bbSVlad Serebrennikov 1504f5bc4bbSVlad Serebrennikov if (Type->isConstant()) 1514f5bc4bbSVlad Serebrennikov QT = Context.getConstType(QT); 1524f5bc4bbSVlad Serebrennikov 1534f5bc4bbSVlad Serebrennikov // Transform the type to a pointer as the last step, if necessary. 1544f5bc4bbSVlad Serebrennikov if (Type->isPointer()) 1554f5bc4bbSVlad Serebrennikov QT = Context.getPointerType(QT); 1564f5bc4bbSVlad Serebrennikov 1574f5bc4bbSVlad Serebrennikov return QT; 1584f5bc4bbSVlad Serebrennikov } 1594f5bc4bbSVlad Serebrennikov 1604f5bc4bbSVlad Serebrennikov namespace { 1614f5bc4bbSVlad Serebrennikov class RISCVIntrinsicManagerImpl : public sema::RISCVIntrinsicManager { 1624f5bc4bbSVlad Serebrennikov private: 1634f5bc4bbSVlad Serebrennikov Sema &S; 1644f5bc4bbSVlad Serebrennikov ASTContext &Context; 1654f5bc4bbSVlad Serebrennikov RVVTypeCache TypeCache; 1664f5bc4bbSVlad Serebrennikov bool ConstructedRISCVVBuiltins; 1674f5bc4bbSVlad Serebrennikov bool ConstructedRISCVSiFiveVectorBuiltins; 1684f5bc4bbSVlad Serebrennikov 1694f5bc4bbSVlad Serebrennikov // List of all RVV intrinsic. 1704f5bc4bbSVlad Serebrennikov std::vector<RVVIntrinsicDef> IntrinsicList; 1714f5bc4bbSVlad Serebrennikov // Mapping function name to index of IntrinsicList. 172*e3b22dceSBrandon Wu StringMap<uint32_t> Intrinsics; 1734f5bc4bbSVlad Serebrennikov // Mapping function name to RVVOverloadIntrinsicDef. 1744f5bc4bbSVlad Serebrennikov StringMap<RVVOverloadIntrinsicDef> OverloadIntrinsics; 1754f5bc4bbSVlad Serebrennikov 1764f5bc4bbSVlad Serebrennikov // Create RVVIntrinsicDef. 1774f5bc4bbSVlad Serebrennikov void InitRVVIntrinsic(const RVVIntrinsicRecord &Record, StringRef SuffixStr, 1784f5bc4bbSVlad Serebrennikov StringRef OverloadedSuffixStr, bool IsMask, 1794f5bc4bbSVlad Serebrennikov RVVTypes &Types, bool HasPolicy, Policy PolicyAttrs); 1804f5bc4bbSVlad Serebrennikov 1814f5bc4bbSVlad Serebrennikov // Create FunctionDecl for a vector intrinsic. 1824f5bc4bbSVlad Serebrennikov void CreateRVVIntrinsicDecl(LookupResult &LR, IdentifierInfo *II, 1834f5bc4bbSVlad Serebrennikov Preprocessor &PP, uint32_t Index, 1844f5bc4bbSVlad Serebrennikov bool IsOverload); 1854f5bc4bbSVlad Serebrennikov 1864f5bc4bbSVlad Serebrennikov void ConstructRVVIntrinsics(ArrayRef<RVVIntrinsicRecord> Recs, 1874f5bc4bbSVlad Serebrennikov IntrinsicKind K); 1884f5bc4bbSVlad Serebrennikov 1894f5bc4bbSVlad Serebrennikov public: 1904f5bc4bbSVlad Serebrennikov RISCVIntrinsicManagerImpl(clang::Sema &S) : S(S), Context(S.Context) { 1914f5bc4bbSVlad Serebrennikov ConstructedRISCVVBuiltins = false; 1924f5bc4bbSVlad Serebrennikov ConstructedRISCVSiFiveVectorBuiltins = false; 1934f5bc4bbSVlad Serebrennikov } 1944f5bc4bbSVlad Serebrennikov 1954f5bc4bbSVlad Serebrennikov // Initialize IntrinsicList 1964f5bc4bbSVlad Serebrennikov void InitIntrinsicList() override; 1974f5bc4bbSVlad Serebrennikov 1984f5bc4bbSVlad Serebrennikov // Create RISC-V vector intrinsic and insert into symbol table if found, and 1994f5bc4bbSVlad Serebrennikov // return true, otherwise return false. 2004f5bc4bbSVlad Serebrennikov bool CreateIntrinsicIfFound(LookupResult &LR, IdentifierInfo *II, 2014f5bc4bbSVlad Serebrennikov Preprocessor &PP) override; 2024f5bc4bbSVlad Serebrennikov }; 2034f5bc4bbSVlad Serebrennikov } // namespace 2044f5bc4bbSVlad Serebrennikov 2054f5bc4bbSVlad Serebrennikov void RISCVIntrinsicManagerImpl::ConstructRVVIntrinsics( 2064f5bc4bbSVlad Serebrennikov ArrayRef<RVVIntrinsicRecord> Recs, IntrinsicKind K) { 2074f5bc4bbSVlad Serebrennikov const TargetInfo &TI = Context.getTargetInfo(); 2084f5bc4bbSVlad Serebrennikov static const std::pair<const char *, RVVRequire> FeatureCheckList[] = { 2094f5bc4bbSVlad Serebrennikov {"64bit", RVV_REQ_RV64}, 2104f5bc4bbSVlad Serebrennikov {"xsfvcp", RVV_REQ_Xsfvcp}, 2114f5bc4bbSVlad Serebrennikov {"xsfvfnrclipxfqf", RVV_REQ_Xsfvfnrclipxfqf}, 2124f5bc4bbSVlad Serebrennikov {"xsfvfwmaccqqq", RVV_REQ_Xsfvfwmaccqqq}, 2134f5bc4bbSVlad Serebrennikov {"xsfvqmaccdod", RVV_REQ_Xsfvqmaccdod}, 2144f5bc4bbSVlad Serebrennikov {"xsfvqmaccqoq", RVV_REQ_Xsfvqmaccqoq}, 2154f5bc4bbSVlad Serebrennikov {"zvbb", RVV_REQ_Zvbb}, 2164f5bc4bbSVlad Serebrennikov {"zvbc", RVV_REQ_Zvbc}, 2174f5bc4bbSVlad Serebrennikov {"zvkb", RVV_REQ_Zvkb}, 2184f5bc4bbSVlad Serebrennikov {"zvkg", RVV_REQ_Zvkg}, 2194f5bc4bbSVlad Serebrennikov {"zvkned", RVV_REQ_Zvkned}, 2204f5bc4bbSVlad Serebrennikov {"zvknha", RVV_REQ_Zvknha}, 2214f5bc4bbSVlad Serebrennikov {"zvknhb", RVV_REQ_Zvknhb}, 2224f5bc4bbSVlad Serebrennikov {"zvksed", RVV_REQ_Zvksed}, 2234f5bc4bbSVlad Serebrennikov {"zvksh", RVV_REQ_Zvksh}, 2244f5bc4bbSVlad Serebrennikov {"zvfbfwma", RVV_REQ_Zvfbfwma}, 2254f5bc4bbSVlad Serebrennikov {"zvfbfmin", RVV_REQ_Zvfbfmin}, 22640c2aaf5SBrandon Wu {"zvfh", RVV_REQ_Zvfh}, 2274f5bc4bbSVlad Serebrennikov {"experimental", RVV_REQ_Experimental}}; 2284f5bc4bbSVlad Serebrennikov 2294f5bc4bbSVlad Serebrennikov // Construction of RVVIntrinsicRecords need to sync with createRVVIntrinsics 2304f5bc4bbSVlad Serebrennikov // in RISCVVEmitter.cpp. 2314f5bc4bbSVlad Serebrennikov for (auto &Record : Recs) { 2324f5bc4bbSVlad Serebrennikov // Check requirements. 2334f5bc4bbSVlad Serebrennikov if (llvm::any_of(FeatureCheckList, [&](const auto &Item) { 2344f5bc4bbSVlad Serebrennikov return (Record.RequiredExtensions & Item.second) == Item.second && 2354f5bc4bbSVlad Serebrennikov !TI.hasFeature(Item.first); 2364f5bc4bbSVlad Serebrennikov })) 2374f5bc4bbSVlad Serebrennikov continue; 2384f5bc4bbSVlad Serebrennikov 2394f5bc4bbSVlad Serebrennikov // Create Intrinsics for each type and LMUL. 2404f5bc4bbSVlad Serebrennikov BasicType BaseType = BasicType::Unknown; 2414f5bc4bbSVlad Serebrennikov ArrayRef<PrototypeDescriptor> BasicProtoSeq = 2424f5bc4bbSVlad Serebrennikov ProtoSeq2ArrayRef(K, Record.PrototypeIndex, Record.PrototypeLength); 2434f5bc4bbSVlad Serebrennikov ArrayRef<PrototypeDescriptor> SuffixProto = 2444f5bc4bbSVlad Serebrennikov ProtoSeq2ArrayRef(K, Record.SuffixIndex, Record.SuffixLength); 2454f5bc4bbSVlad Serebrennikov ArrayRef<PrototypeDescriptor> OverloadedSuffixProto = ProtoSeq2ArrayRef( 2464f5bc4bbSVlad Serebrennikov K, Record.OverloadedSuffixIndex, Record.OverloadedSuffixSize); 2474f5bc4bbSVlad Serebrennikov 2484f5bc4bbSVlad Serebrennikov PolicyScheme UnMaskedPolicyScheme = 2494f5bc4bbSVlad Serebrennikov static_cast<PolicyScheme>(Record.UnMaskedPolicyScheme); 2504f5bc4bbSVlad Serebrennikov PolicyScheme MaskedPolicyScheme = 2514f5bc4bbSVlad Serebrennikov static_cast<PolicyScheme>(Record.MaskedPolicyScheme); 2524f5bc4bbSVlad Serebrennikov 2534f5bc4bbSVlad Serebrennikov const Policy DefaultPolicy; 2544f5bc4bbSVlad Serebrennikov 2554f5bc4bbSVlad Serebrennikov llvm::SmallVector<PrototypeDescriptor> ProtoSeq = 2564f5bc4bbSVlad Serebrennikov RVVIntrinsic::computeBuiltinTypes( 2574f5bc4bbSVlad Serebrennikov BasicProtoSeq, /*IsMasked=*/false, 2584f5bc4bbSVlad Serebrennikov /*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF, 2594f5bc4bbSVlad Serebrennikov UnMaskedPolicyScheme, DefaultPolicy, Record.IsTuple); 2604f5bc4bbSVlad Serebrennikov 2614f5bc4bbSVlad Serebrennikov llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq; 2624f5bc4bbSVlad Serebrennikov if (Record.HasMasked) 2634f5bc4bbSVlad Serebrennikov ProtoMaskSeq = RVVIntrinsic::computeBuiltinTypes( 2644f5bc4bbSVlad Serebrennikov BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand, 2654f5bc4bbSVlad Serebrennikov Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy, 2664f5bc4bbSVlad Serebrennikov Record.IsTuple); 2674f5bc4bbSVlad Serebrennikov 2684f5bc4bbSVlad Serebrennikov bool UnMaskedHasPolicy = UnMaskedPolicyScheme != PolicyScheme::SchemeNone; 2694f5bc4bbSVlad Serebrennikov bool MaskedHasPolicy = MaskedPolicyScheme != PolicyScheme::SchemeNone; 2704f5bc4bbSVlad Serebrennikov SmallVector<Policy> SupportedUnMaskedPolicies = 2714f5bc4bbSVlad Serebrennikov RVVIntrinsic::getSupportedUnMaskedPolicies(); 2724f5bc4bbSVlad Serebrennikov SmallVector<Policy> SupportedMaskedPolicies = 2734f5bc4bbSVlad Serebrennikov RVVIntrinsic::getSupportedMaskedPolicies(Record.HasTailPolicy, 2744f5bc4bbSVlad Serebrennikov Record.HasMaskPolicy); 2754f5bc4bbSVlad Serebrennikov 2764f5bc4bbSVlad Serebrennikov for (unsigned int TypeRangeMaskShift = 0; 2774f5bc4bbSVlad Serebrennikov TypeRangeMaskShift <= static_cast<unsigned int>(BasicType::MaxOffset); 2784f5bc4bbSVlad Serebrennikov ++TypeRangeMaskShift) { 2794f5bc4bbSVlad Serebrennikov unsigned int BaseTypeI = 1 << TypeRangeMaskShift; 2804f5bc4bbSVlad Serebrennikov BaseType = static_cast<BasicType>(BaseTypeI); 2814f5bc4bbSVlad Serebrennikov 2824f5bc4bbSVlad Serebrennikov if ((BaseTypeI & Record.TypeRangeMask) != BaseTypeI) 2834f5bc4bbSVlad Serebrennikov continue; 2844f5bc4bbSVlad Serebrennikov 2854f5bc4bbSVlad Serebrennikov // Expanded with different LMUL. 2864f5bc4bbSVlad Serebrennikov for (int Log2LMUL = -3; Log2LMUL <= 3; Log2LMUL++) { 2874f5bc4bbSVlad Serebrennikov if (!(Record.Log2LMULMask & (1 << (Log2LMUL + 3)))) 2884f5bc4bbSVlad Serebrennikov continue; 2894f5bc4bbSVlad Serebrennikov 2904f5bc4bbSVlad Serebrennikov std::optional<RVVTypes> Types = 2914f5bc4bbSVlad Serebrennikov TypeCache.computeTypes(BaseType, Log2LMUL, Record.NF, ProtoSeq); 2924f5bc4bbSVlad Serebrennikov 2934f5bc4bbSVlad Serebrennikov // Ignored to create new intrinsic if there are any illegal types. 2944f5bc4bbSVlad Serebrennikov if (!Types.has_value()) 2954f5bc4bbSVlad Serebrennikov continue; 2964f5bc4bbSVlad Serebrennikov 2974f5bc4bbSVlad Serebrennikov std::string SuffixStr = RVVIntrinsic::getSuffixStr( 2984f5bc4bbSVlad Serebrennikov TypeCache, BaseType, Log2LMUL, SuffixProto); 2994f5bc4bbSVlad Serebrennikov std::string OverloadedSuffixStr = RVVIntrinsic::getSuffixStr( 3004f5bc4bbSVlad Serebrennikov TypeCache, BaseType, Log2LMUL, OverloadedSuffixProto); 3014f5bc4bbSVlad Serebrennikov 3024f5bc4bbSVlad Serebrennikov // Create non-masked intrinsic. 3034f5bc4bbSVlad Serebrennikov InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, false, *Types, 3044f5bc4bbSVlad Serebrennikov UnMaskedHasPolicy, DefaultPolicy); 3054f5bc4bbSVlad Serebrennikov 3064f5bc4bbSVlad Serebrennikov // Create non-masked policy intrinsic. 3074f5bc4bbSVlad Serebrennikov if (Record.UnMaskedPolicyScheme != PolicyScheme::SchemeNone) { 3084f5bc4bbSVlad Serebrennikov for (auto P : SupportedUnMaskedPolicies) { 3094f5bc4bbSVlad Serebrennikov llvm::SmallVector<PrototypeDescriptor> PolicyPrototype = 3104f5bc4bbSVlad Serebrennikov RVVIntrinsic::computeBuiltinTypes( 3114f5bc4bbSVlad Serebrennikov BasicProtoSeq, /*IsMasked=*/false, 3124f5bc4bbSVlad Serebrennikov /*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF, 3134f5bc4bbSVlad Serebrennikov UnMaskedPolicyScheme, P, Record.IsTuple); 3144f5bc4bbSVlad Serebrennikov std::optional<RVVTypes> PolicyTypes = TypeCache.computeTypes( 3154f5bc4bbSVlad Serebrennikov BaseType, Log2LMUL, Record.NF, PolicyPrototype); 3164f5bc4bbSVlad Serebrennikov InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, 3174f5bc4bbSVlad Serebrennikov /*IsMask=*/false, *PolicyTypes, UnMaskedHasPolicy, 3184f5bc4bbSVlad Serebrennikov P); 3194f5bc4bbSVlad Serebrennikov } 3204f5bc4bbSVlad Serebrennikov } 3214f5bc4bbSVlad Serebrennikov if (!Record.HasMasked) 3224f5bc4bbSVlad Serebrennikov continue; 3234f5bc4bbSVlad Serebrennikov // Create masked intrinsic. 3244f5bc4bbSVlad Serebrennikov std::optional<RVVTypes> MaskTypes = 3254f5bc4bbSVlad Serebrennikov TypeCache.computeTypes(BaseType, Log2LMUL, Record.NF, ProtoMaskSeq); 3264f5bc4bbSVlad Serebrennikov InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, true, 3274f5bc4bbSVlad Serebrennikov *MaskTypes, MaskedHasPolicy, DefaultPolicy); 3284f5bc4bbSVlad Serebrennikov if (Record.MaskedPolicyScheme == PolicyScheme::SchemeNone) 3294f5bc4bbSVlad Serebrennikov continue; 3304f5bc4bbSVlad Serebrennikov // Create masked policy intrinsic. 3314f5bc4bbSVlad Serebrennikov for (auto P : SupportedMaskedPolicies) { 3324f5bc4bbSVlad Serebrennikov llvm::SmallVector<PrototypeDescriptor> PolicyPrototype = 3334f5bc4bbSVlad Serebrennikov RVVIntrinsic::computeBuiltinTypes( 3344f5bc4bbSVlad Serebrennikov BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand, 3354f5bc4bbSVlad Serebrennikov Record.HasVL, Record.NF, MaskedPolicyScheme, P, 3364f5bc4bbSVlad Serebrennikov Record.IsTuple); 3374f5bc4bbSVlad Serebrennikov std::optional<RVVTypes> PolicyTypes = TypeCache.computeTypes( 3384f5bc4bbSVlad Serebrennikov BaseType, Log2LMUL, Record.NF, PolicyPrototype); 3394f5bc4bbSVlad Serebrennikov InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, 3404f5bc4bbSVlad Serebrennikov /*IsMask=*/true, *PolicyTypes, MaskedHasPolicy, P); 3414f5bc4bbSVlad Serebrennikov } 3424f5bc4bbSVlad Serebrennikov } // End for different LMUL 3434f5bc4bbSVlad Serebrennikov } // End for different TypeRange 3444f5bc4bbSVlad Serebrennikov } 3454f5bc4bbSVlad Serebrennikov } 3464f5bc4bbSVlad Serebrennikov 3474f5bc4bbSVlad Serebrennikov void RISCVIntrinsicManagerImpl::InitIntrinsicList() { 3484f5bc4bbSVlad Serebrennikov 349a640a2e0SVlad Serebrennikov if (S.RISCV().DeclareRVVBuiltins && !ConstructedRISCVVBuiltins) { 3504f5bc4bbSVlad Serebrennikov ConstructedRISCVVBuiltins = true; 351a640a2e0SVlad Serebrennikov ConstructRVVIntrinsics(RVVIntrinsicRecords, IntrinsicKind::RVV); 3524f5bc4bbSVlad Serebrennikov } 353a640a2e0SVlad Serebrennikov if (S.RISCV().DeclareSiFiveVectorBuiltins && 3544f5bc4bbSVlad Serebrennikov !ConstructedRISCVSiFiveVectorBuiltins) { 3554f5bc4bbSVlad Serebrennikov ConstructedRISCVSiFiveVectorBuiltins = true; 3564f5bc4bbSVlad Serebrennikov ConstructRVVIntrinsics(RVSiFiveVectorIntrinsicRecords, 3574f5bc4bbSVlad Serebrennikov IntrinsicKind::SIFIVE_VECTOR); 3584f5bc4bbSVlad Serebrennikov } 3594f5bc4bbSVlad Serebrennikov } 3604f5bc4bbSVlad Serebrennikov 3614f5bc4bbSVlad Serebrennikov // Compute name and signatures for intrinsic with practical types. 3624f5bc4bbSVlad Serebrennikov void RISCVIntrinsicManagerImpl::InitRVVIntrinsic( 3634f5bc4bbSVlad Serebrennikov const RVVIntrinsicRecord &Record, StringRef SuffixStr, 3644f5bc4bbSVlad Serebrennikov StringRef OverloadedSuffixStr, bool IsMasked, RVVTypes &Signature, 3654f5bc4bbSVlad Serebrennikov bool HasPolicy, Policy PolicyAttrs) { 3664f5bc4bbSVlad Serebrennikov // Function name, e.g. vadd_vv_i32m1. 3674f5bc4bbSVlad Serebrennikov std::string Name = Record.Name; 3684f5bc4bbSVlad Serebrennikov if (!SuffixStr.empty()) 3694f5bc4bbSVlad Serebrennikov Name += "_" + SuffixStr.str(); 3704f5bc4bbSVlad Serebrennikov 3714f5bc4bbSVlad Serebrennikov // Overloaded function name, e.g. vadd. 3724f5bc4bbSVlad Serebrennikov std::string OverloadedName; 3734f5bc4bbSVlad Serebrennikov if (!Record.OverloadedName) 3744f5bc4bbSVlad Serebrennikov OverloadedName = StringRef(Record.Name).split("_").first.str(); 3754f5bc4bbSVlad Serebrennikov else 3764f5bc4bbSVlad Serebrennikov OverloadedName = Record.OverloadedName; 3774f5bc4bbSVlad Serebrennikov if (!OverloadedSuffixStr.empty()) 3784f5bc4bbSVlad Serebrennikov OverloadedName += "_" + OverloadedSuffixStr.str(); 3794f5bc4bbSVlad Serebrennikov 3804f5bc4bbSVlad Serebrennikov // clang built-in function name, e.g. __builtin_rvv_vadd. 3814f5bc4bbSVlad Serebrennikov std::string BuiltinName = std::string(Record.Name); 3824f5bc4bbSVlad Serebrennikov 3834f5bc4bbSVlad Serebrennikov RVVIntrinsic::updateNamesAndPolicy(IsMasked, HasPolicy, Name, BuiltinName, 3844f5bc4bbSVlad Serebrennikov OverloadedName, PolicyAttrs, 3854f5bc4bbSVlad Serebrennikov Record.HasFRMRoundModeOp); 3864f5bc4bbSVlad Serebrennikov 3874f5bc4bbSVlad Serebrennikov // Put into IntrinsicList. 388*e3b22dceSBrandon Wu uint32_t Index = IntrinsicList.size(); 3894f5bc4bbSVlad Serebrennikov assert(IntrinsicList.size() == (size_t)Index && 3904f5bc4bbSVlad Serebrennikov "Intrinsics indices overflow."); 3914f5bc4bbSVlad Serebrennikov IntrinsicList.push_back({BuiltinName, Signature}); 3924f5bc4bbSVlad Serebrennikov 3934f5bc4bbSVlad Serebrennikov // Creating mapping to Intrinsics. 3944f5bc4bbSVlad Serebrennikov Intrinsics.insert({Name, Index}); 3954f5bc4bbSVlad Serebrennikov 3964f5bc4bbSVlad Serebrennikov // Get the RVVOverloadIntrinsicDef. 3974f5bc4bbSVlad Serebrennikov RVVOverloadIntrinsicDef &OverloadIntrinsicDef = 3984f5bc4bbSVlad Serebrennikov OverloadIntrinsics[OverloadedName]; 3994f5bc4bbSVlad Serebrennikov 4004f5bc4bbSVlad Serebrennikov // And added the index. 4014f5bc4bbSVlad Serebrennikov OverloadIntrinsicDef.Indexes.push_back(Index); 4024f5bc4bbSVlad Serebrennikov } 4034f5bc4bbSVlad Serebrennikov 4044f5bc4bbSVlad Serebrennikov void RISCVIntrinsicManagerImpl::CreateRVVIntrinsicDecl(LookupResult &LR, 4054f5bc4bbSVlad Serebrennikov IdentifierInfo *II, 4064f5bc4bbSVlad Serebrennikov Preprocessor &PP, 4074f5bc4bbSVlad Serebrennikov uint32_t Index, 4084f5bc4bbSVlad Serebrennikov bool IsOverload) { 4094f5bc4bbSVlad Serebrennikov ASTContext &Context = S.Context; 4104f5bc4bbSVlad Serebrennikov RVVIntrinsicDef &IDef = IntrinsicList[Index]; 4114f5bc4bbSVlad Serebrennikov RVVTypes Sigs = IDef.Signature; 4124f5bc4bbSVlad Serebrennikov size_t SigLength = Sigs.size(); 4134f5bc4bbSVlad Serebrennikov RVVType *ReturnType = Sigs[0]; 4144f5bc4bbSVlad Serebrennikov QualType RetType = RVVType2Qual(Context, ReturnType); 4154f5bc4bbSVlad Serebrennikov SmallVector<QualType, 8> ArgTypes; 4164f5bc4bbSVlad Serebrennikov QualType BuiltinFuncType; 4174f5bc4bbSVlad Serebrennikov 4184f5bc4bbSVlad Serebrennikov // Skip return type, and convert RVVType to QualType for arguments. 4194f5bc4bbSVlad Serebrennikov for (size_t i = 1; i < SigLength; ++i) 4204f5bc4bbSVlad Serebrennikov ArgTypes.push_back(RVVType2Qual(Context, Sigs[i])); 4214f5bc4bbSVlad Serebrennikov 4224f5bc4bbSVlad Serebrennikov FunctionProtoType::ExtProtoInfo PI( 4234f5bc4bbSVlad Serebrennikov Context.getDefaultCallingConvention(false, false, true)); 4244f5bc4bbSVlad Serebrennikov 4254f5bc4bbSVlad Serebrennikov PI.Variadic = false; 4264f5bc4bbSVlad Serebrennikov 4274f5bc4bbSVlad Serebrennikov SourceLocation Loc = LR.getNameLoc(); 4284f5bc4bbSVlad Serebrennikov BuiltinFuncType = Context.getFunctionType(RetType, ArgTypes, PI); 4294f5bc4bbSVlad Serebrennikov DeclContext *Parent = Context.getTranslationUnitDecl(); 4304f5bc4bbSVlad Serebrennikov 4314f5bc4bbSVlad Serebrennikov FunctionDecl *RVVIntrinsicDecl = FunctionDecl::Create( 4324f5bc4bbSVlad Serebrennikov Context, Parent, Loc, Loc, II, BuiltinFuncType, /*TInfo=*/nullptr, 4334f5bc4bbSVlad Serebrennikov SC_Extern, S.getCurFPFeatures().isFPConstrained(), 4344f5bc4bbSVlad Serebrennikov /*isInlineSpecified*/ false, 4354f5bc4bbSVlad Serebrennikov /*hasWrittenPrototype*/ true); 4364f5bc4bbSVlad Serebrennikov 4374f5bc4bbSVlad Serebrennikov // Create Decl objects for each parameter, adding them to the 4384f5bc4bbSVlad Serebrennikov // FunctionDecl. 4394f5bc4bbSVlad Serebrennikov const auto *FP = cast<FunctionProtoType>(BuiltinFuncType); 4404f5bc4bbSVlad Serebrennikov SmallVector<ParmVarDecl *, 8> ParmList; 4414f5bc4bbSVlad Serebrennikov for (unsigned IParm = 0, E = FP->getNumParams(); IParm != E; ++IParm) { 4424f5bc4bbSVlad Serebrennikov ParmVarDecl *Parm = 4434f5bc4bbSVlad Serebrennikov ParmVarDecl::Create(Context, RVVIntrinsicDecl, Loc, Loc, nullptr, 4444f5bc4bbSVlad Serebrennikov FP->getParamType(IParm), nullptr, SC_None, nullptr); 4454f5bc4bbSVlad Serebrennikov Parm->setScopeInfo(0, IParm); 4464f5bc4bbSVlad Serebrennikov ParmList.push_back(Parm); 4474f5bc4bbSVlad Serebrennikov } 4484f5bc4bbSVlad Serebrennikov RVVIntrinsicDecl->setParams(ParmList); 4494f5bc4bbSVlad Serebrennikov 4504f5bc4bbSVlad Serebrennikov // Add function attributes. 4514f5bc4bbSVlad Serebrennikov if (IsOverload) 4524f5bc4bbSVlad Serebrennikov RVVIntrinsicDecl->addAttr(OverloadableAttr::CreateImplicit(Context)); 4534f5bc4bbSVlad Serebrennikov 4544f5bc4bbSVlad Serebrennikov // Setup alias to __builtin_rvv_* 4554f5bc4bbSVlad Serebrennikov IdentifierInfo &IntrinsicII = 4564f5bc4bbSVlad Serebrennikov PP.getIdentifierTable().get("__builtin_rvv_" + IDef.BuiltinName); 4574f5bc4bbSVlad Serebrennikov RVVIntrinsicDecl->addAttr( 4584f5bc4bbSVlad Serebrennikov BuiltinAliasAttr::CreateImplicit(S.Context, &IntrinsicII)); 4594f5bc4bbSVlad Serebrennikov 4604f5bc4bbSVlad Serebrennikov // Add to symbol table. 4614f5bc4bbSVlad Serebrennikov LR.addDecl(RVVIntrinsicDecl); 4624f5bc4bbSVlad Serebrennikov } 4634f5bc4bbSVlad Serebrennikov 4644f5bc4bbSVlad Serebrennikov bool RISCVIntrinsicManagerImpl::CreateIntrinsicIfFound(LookupResult &LR, 4654f5bc4bbSVlad Serebrennikov IdentifierInfo *II, 4664f5bc4bbSVlad Serebrennikov Preprocessor &PP) { 4674f5bc4bbSVlad Serebrennikov StringRef Name = II->getName(); 4684f5bc4bbSVlad Serebrennikov if (!Name.consume_front("__riscv_")) 4694f5bc4bbSVlad Serebrennikov return false; 4704f5bc4bbSVlad Serebrennikov 4714f5bc4bbSVlad Serebrennikov // Lookup the function name from the overload intrinsics first. 4724f5bc4bbSVlad Serebrennikov auto OvIItr = OverloadIntrinsics.find(Name); 4734f5bc4bbSVlad Serebrennikov if (OvIItr != OverloadIntrinsics.end()) { 4744f5bc4bbSVlad Serebrennikov const RVVOverloadIntrinsicDef &OvIntrinsicDef = OvIItr->second; 4754f5bc4bbSVlad Serebrennikov for (auto Index : OvIntrinsicDef.Indexes) 4764f5bc4bbSVlad Serebrennikov CreateRVVIntrinsicDecl(LR, II, PP, Index, 4774f5bc4bbSVlad Serebrennikov /*IsOverload*/ true); 4784f5bc4bbSVlad Serebrennikov 4794f5bc4bbSVlad Serebrennikov // If we added overloads, need to resolve the lookup result. 4804f5bc4bbSVlad Serebrennikov LR.resolveKind(); 4814f5bc4bbSVlad Serebrennikov return true; 4824f5bc4bbSVlad Serebrennikov } 4834f5bc4bbSVlad Serebrennikov 4844f5bc4bbSVlad Serebrennikov // Lookup the function name from the intrinsics. 4854f5bc4bbSVlad Serebrennikov auto Itr = Intrinsics.find(Name); 4864f5bc4bbSVlad Serebrennikov if (Itr != Intrinsics.end()) { 4874f5bc4bbSVlad Serebrennikov CreateRVVIntrinsicDecl(LR, II, PP, Itr->second, 4884f5bc4bbSVlad Serebrennikov /*IsOverload*/ false); 4894f5bc4bbSVlad Serebrennikov return true; 4904f5bc4bbSVlad Serebrennikov } 4914f5bc4bbSVlad Serebrennikov 4924f5bc4bbSVlad Serebrennikov // It's not an RVV intrinsics. 4934f5bc4bbSVlad Serebrennikov return false; 4944f5bc4bbSVlad Serebrennikov } 4954f5bc4bbSVlad Serebrennikov 4964f5bc4bbSVlad Serebrennikov namespace clang { 4974f5bc4bbSVlad Serebrennikov std::unique_ptr<clang::sema::RISCVIntrinsicManager> 4984f5bc4bbSVlad Serebrennikov CreateRISCVIntrinsicManager(Sema &S) { 4994f5bc4bbSVlad Serebrennikov return std::make_unique<RISCVIntrinsicManagerImpl>(S); 5004f5bc4bbSVlad Serebrennikov } 501a640a2e0SVlad Serebrennikov 502a640a2e0SVlad Serebrennikov bool SemaRISCV::CheckLMUL(CallExpr *TheCall, unsigned ArgNum) { 503a640a2e0SVlad Serebrennikov llvm::APSInt Result; 504a640a2e0SVlad Serebrennikov 505a640a2e0SVlad Serebrennikov // We can't check the value of a dependent argument. 506a640a2e0SVlad Serebrennikov Expr *Arg = TheCall->getArg(ArgNum); 507a640a2e0SVlad Serebrennikov if (Arg->isTypeDependent() || Arg->isValueDependent()) 508a640a2e0SVlad Serebrennikov return false; 509a640a2e0SVlad Serebrennikov 510a640a2e0SVlad Serebrennikov // Check constant-ness first. 511a640a2e0SVlad Serebrennikov if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result)) 512a640a2e0SVlad Serebrennikov return true; 513a640a2e0SVlad Serebrennikov 514a640a2e0SVlad Serebrennikov int64_t Val = Result.getSExtValue(); 515a640a2e0SVlad Serebrennikov if ((Val >= 0 && Val <= 3) || (Val >= 5 && Val <= 7)) 516a640a2e0SVlad Serebrennikov return false; 517a640a2e0SVlad Serebrennikov 518a640a2e0SVlad Serebrennikov return Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_invalid_lmul) 519a640a2e0SVlad Serebrennikov << Arg->getSourceRange(); 520a640a2e0SVlad Serebrennikov } 521a640a2e0SVlad Serebrennikov 522a640a2e0SVlad Serebrennikov static bool CheckInvalidVLENandLMUL(const TargetInfo &TI, CallExpr *TheCall, 523a640a2e0SVlad Serebrennikov Sema &S, QualType Type, int EGW) { 524a640a2e0SVlad Serebrennikov assert((EGW == 128 || EGW == 256) && "EGW can only be 128 or 256 bits"); 525a640a2e0SVlad Serebrennikov 526a640a2e0SVlad Serebrennikov // LMUL * VLEN >= EGW 527a640a2e0SVlad Serebrennikov ASTContext::BuiltinVectorTypeInfo Info = 528a640a2e0SVlad Serebrennikov S.Context.getBuiltinVectorTypeInfo(Type->castAs<BuiltinType>()); 529a640a2e0SVlad Serebrennikov unsigned ElemSize = S.Context.getTypeSize(Info.ElementType); 530a640a2e0SVlad Serebrennikov unsigned MinElemCount = Info.EC.getKnownMinValue(); 531a640a2e0SVlad Serebrennikov 532a640a2e0SVlad Serebrennikov unsigned EGS = EGW / ElemSize; 533a640a2e0SVlad Serebrennikov // If EGS is less than or equal to the minimum number of elements, then the 534a640a2e0SVlad Serebrennikov // type is valid. 535a640a2e0SVlad Serebrennikov if (EGS <= MinElemCount) 536a640a2e0SVlad Serebrennikov return false; 537a640a2e0SVlad Serebrennikov 538a640a2e0SVlad Serebrennikov // Otherwise, we need vscale to be at least EGS / MinElemCont. 539a640a2e0SVlad Serebrennikov assert(EGS % MinElemCount == 0); 540a640a2e0SVlad Serebrennikov unsigned VScaleFactor = EGS / MinElemCount; 541a640a2e0SVlad Serebrennikov // Vscale is VLEN/RVVBitsPerBlock. 542a640a2e0SVlad Serebrennikov unsigned MinRequiredVLEN = VScaleFactor * llvm::RISCV::RVVBitsPerBlock; 543a640a2e0SVlad Serebrennikov std::string RequiredExt = "zvl" + std::to_string(MinRequiredVLEN) + "b"; 544a640a2e0SVlad Serebrennikov if (!TI.hasFeature(RequiredExt)) 545a640a2e0SVlad Serebrennikov return S.Diag(TheCall->getBeginLoc(), 546a640a2e0SVlad Serebrennikov diag::err_riscv_type_requires_extension) 547a640a2e0SVlad Serebrennikov << Type << RequiredExt; 548a640a2e0SVlad Serebrennikov 549a640a2e0SVlad Serebrennikov return false; 550a640a2e0SVlad Serebrennikov } 551a640a2e0SVlad Serebrennikov 552a640a2e0SVlad Serebrennikov bool SemaRISCV::CheckBuiltinFunctionCall(const TargetInfo &TI, 553a640a2e0SVlad Serebrennikov unsigned BuiltinID, 554a640a2e0SVlad Serebrennikov CallExpr *TheCall) { 555a640a2e0SVlad Serebrennikov ASTContext &Context = getASTContext(); 556a640a2e0SVlad Serebrennikov // vmulh.vv, vmulh.vx, vmulhu.vv, vmulhu.vx, vmulhsu.vv, vmulhsu.vx, 557a640a2e0SVlad Serebrennikov // vsmul.vv, vsmul.vx are not included for EEW=64 in Zve64*. 558a640a2e0SVlad Serebrennikov switch (BuiltinID) { 559a640a2e0SVlad Serebrennikov default: 560a640a2e0SVlad Serebrennikov break; 561a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vv: 562a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vx: 563a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tu: 564a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tu: 565a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vv_m: 566a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vx_m: 567a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vv_mu: 568a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vx_mu: 569a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tum: 570a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tum: 571a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tumu: 572a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tumu: 573a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vv: 574a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vx: 575a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vv_tu: 576a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vx_tu: 577a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vv_m: 578a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vx_m: 579a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vv_mu: 580a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vx_mu: 581a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vv_tum: 582a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vx_tum: 583a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vv_tumu: 584a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulhu_vx_tumu: 585a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vv: 586a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vx: 587a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vv_tu: 588a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vx_tu: 589a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vv_m: 590a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vx_m: 591a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vv_mu: 592a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vx_mu: 593a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vv_tum: 594a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vx_tum: 595a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vv_tumu: 596a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vmulh_vx_tumu: 597a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv: 598a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx: 599a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_tu: 600a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_tu: 601a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_m: 602a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_m: 603a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_mu: 604a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_mu: 605a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_tum: 606a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_tum: 607a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu: 608a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu: { 609a640a2e0SVlad Serebrennikov ASTContext::BuiltinVectorTypeInfo Info = Context.getBuiltinVectorTypeInfo( 610a640a2e0SVlad Serebrennikov TheCall->getType()->castAs<BuiltinType>()); 611a640a2e0SVlad Serebrennikov 612e8509a43SJim Lin const FunctionDecl *FD = SemaRef.getCurFunctionDecl(); 613e8509a43SJim Lin llvm::StringMap<bool> FunctionFeatureMap; 614e8509a43SJim Lin Context.getFunctionFeatureMap(FunctionFeatureMap, FD); 615e8509a43SJim Lin 616e8509a43SJim Lin if (Context.getTypeSize(Info.ElementType) == 64 && !TI.hasFeature("v") && 617e8509a43SJim Lin !FunctionFeatureMap.lookup("v")) 618a640a2e0SVlad Serebrennikov return Diag(TheCall->getBeginLoc(), 619a640a2e0SVlad Serebrennikov diag::err_riscv_builtin_requires_extension) 620a640a2e0SVlad Serebrennikov << /* IsExtension */ true << TheCall->getSourceRange() << "v"; 621a640a2e0SVlad Serebrennikov 622a640a2e0SVlad Serebrennikov break; 623a640a2e0SVlad Serebrennikov } 624a640a2e0SVlad Serebrennikov } 625a640a2e0SVlad Serebrennikov 626a640a2e0SVlad Serebrennikov switch (BuiltinID) { 627a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsetvli: 628a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3) || 629a640a2e0SVlad Serebrennikov CheckLMUL(TheCall, 2); 630a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsetvlimax: 631a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 632a640a2e0SVlad Serebrennikov CheckLMUL(TheCall, 1); 633a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vget_v: { 634a640a2e0SVlad Serebrennikov ASTContext::BuiltinVectorTypeInfo ResVecInfo = 635a640a2e0SVlad Serebrennikov Context.getBuiltinVectorTypeInfo(cast<BuiltinType>( 636a640a2e0SVlad Serebrennikov TheCall->getType().getCanonicalType().getTypePtr())); 637a640a2e0SVlad Serebrennikov ASTContext::BuiltinVectorTypeInfo VecInfo = 638a640a2e0SVlad Serebrennikov Context.getBuiltinVectorTypeInfo(cast<BuiltinType>( 639a640a2e0SVlad Serebrennikov TheCall->getArg(0)->getType().getCanonicalType().getTypePtr())); 640a640a2e0SVlad Serebrennikov unsigned MaxIndex; 641a640a2e0SVlad Serebrennikov if (VecInfo.NumVectors != 1) // vget for tuple type 642a640a2e0SVlad Serebrennikov MaxIndex = VecInfo.NumVectors; 643a640a2e0SVlad Serebrennikov else // vget for non-tuple type 644a640a2e0SVlad Serebrennikov MaxIndex = (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors) / 645a640a2e0SVlad Serebrennikov (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors); 646a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1); 647a640a2e0SVlad Serebrennikov } 648a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vset_v: { 649a640a2e0SVlad Serebrennikov ASTContext::BuiltinVectorTypeInfo ResVecInfo = 650a640a2e0SVlad Serebrennikov Context.getBuiltinVectorTypeInfo(cast<BuiltinType>( 651a640a2e0SVlad Serebrennikov TheCall->getType().getCanonicalType().getTypePtr())); 652a640a2e0SVlad Serebrennikov ASTContext::BuiltinVectorTypeInfo VecInfo = 653a640a2e0SVlad Serebrennikov Context.getBuiltinVectorTypeInfo(cast<BuiltinType>( 654a640a2e0SVlad Serebrennikov TheCall->getArg(2)->getType().getCanonicalType().getTypePtr())); 655a640a2e0SVlad Serebrennikov unsigned MaxIndex; 656a640a2e0SVlad Serebrennikov if (ResVecInfo.NumVectors != 1) // vset for tuple type 657a640a2e0SVlad Serebrennikov MaxIndex = ResVecInfo.NumVectors; 658a640a2e0SVlad Serebrennikov else // vset fo non-tuple type 659a640a2e0SVlad Serebrennikov MaxIndex = (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors) / 660a640a2e0SVlad Serebrennikov (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors); 661a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1); 662a640a2e0SVlad Serebrennikov } 663a640a2e0SVlad Serebrennikov // Vector Crypto 664a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaeskf1_vi_tu: 665a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaeskf2_vi_tu: 666a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaeskf2_vi: 667a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsm4k_vi_tu: { 668a640a2e0SVlad Serebrennikov QualType Op1Type = TheCall->getArg(0)->getType(); 669a640a2e0SVlad Serebrennikov QualType Op2Type = TheCall->getArg(1)->getType(); 670a640a2e0SVlad Serebrennikov return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) || 671a640a2e0SVlad Serebrennikov CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type, 128) || 672a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31); 673a640a2e0SVlad Serebrennikov } 674a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsm3c_vi_tu: 675a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsm3c_vi: { 676a640a2e0SVlad Serebrennikov QualType Op1Type = TheCall->getArg(0)->getType(); 677a640a2e0SVlad Serebrennikov return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 256) || 678a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31); 679a640a2e0SVlad Serebrennikov } 680a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaeskf1_vi: 681a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsm4k_vi: { 682a640a2e0SVlad Serebrennikov QualType Op1Type = TheCall->getArg(0)->getType(); 683a640a2e0SVlad Serebrennikov return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) || 684a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31); 685a640a2e0SVlad Serebrennikov } 686a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesdf_vv: 687a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesdf_vs: 688a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesdm_vv: 689a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesdm_vs: 690a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesef_vv: 691a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesef_vs: 692a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesem_vv: 693a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesem_vs: 694a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesz_vs: 695a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsm4r_vv: 696a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsm4r_vs: 697a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesdf_vv_tu: 698a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesdf_vs_tu: 699a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesdm_vv_tu: 700a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesdm_vs_tu: 701a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesef_vv_tu: 702a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesef_vs_tu: 703a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesem_vv_tu: 704a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesem_vs_tu: 705a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaesz_vs_tu: 706a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsm4r_vv_tu: 707a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsm4r_vs_tu: { 708a640a2e0SVlad Serebrennikov QualType Op1Type = TheCall->getArg(0)->getType(); 709a640a2e0SVlad Serebrennikov QualType Op2Type = TheCall->getArg(1)->getType(); 710a640a2e0SVlad Serebrennikov return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) || 711a640a2e0SVlad Serebrennikov CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type, 128); 712a640a2e0SVlad Serebrennikov } 713a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsha2ch_vv: 714a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsha2cl_vv: 715a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsha2ms_vv: 716a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsha2ch_vv_tu: 717a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsha2cl_vv_tu: 718a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsha2ms_vv_tu: { 719a640a2e0SVlad Serebrennikov QualType Op1Type = TheCall->getArg(0)->getType(); 720a640a2e0SVlad Serebrennikov QualType Op2Type = TheCall->getArg(1)->getType(); 721a640a2e0SVlad Serebrennikov QualType Op3Type = TheCall->getArg(2)->getType(); 722a640a2e0SVlad Serebrennikov ASTContext::BuiltinVectorTypeInfo Info = 723a640a2e0SVlad Serebrennikov Context.getBuiltinVectorTypeInfo(Op1Type->castAs<BuiltinType>()); 724a640a2e0SVlad Serebrennikov uint64_t ElemSize = Context.getTypeSize(Info.ElementType); 725a640a2e0SVlad Serebrennikov if (ElemSize == 64 && !TI.hasFeature("zvknhb")) 726a640a2e0SVlad Serebrennikov return Diag(TheCall->getBeginLoc(), 727a640a2e0SVlad Serebrennikov diag::err_riscv_builtin_requires_extension) 728da8fb7f4SBrandon Wu << /* IsExtension */ true << TheCall->getSourceRange() << "zvknhb"; 729a640a2e0SVlad Serebrennikov 730a640a2e0SVlad Serebrennikov return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 731a640a2e0SVlad Serebrennikov ElemSize * 4) || 732a640a2e0SVlad Serebrennikov CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type, 733a640a2e0SVlad Serebrennikov ElemSize * 4) || 734a640a2e0SVlad Serebrennikov CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op3Type, ElemSize * 4); 735a640a2e0SVlad Serebrennikov } 736a640a2e0SVlad Serebrennikov 737a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_i_se: 738a640a2e0SVlad Serebrennikov // bit_27_26, bit_24_20, bit_11_7, simm5, sew, log2lmul 739a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 740a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) || 741a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) || 742a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15) || 743a640a2e0SVlad Serebrennikov CheckLMUL(TheCall, 5); 744a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_iv_se: 745a640a2e0SVlad Serebrennikov // bit_27_26, bit_11_7, vs2, simm5 746a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 747a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) || 748a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15); 749a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_i: 750a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_i_se: 751a640a2e0SVlad Serebrennikov // bit_27_26, bit_24_20, simm5 752a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 753a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) || 754a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15); 755a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_iv: 756a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_iv_se: 757a640a2e0SVlad Serebrennikov // bit_27_26, vs2, simm5 758a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 759a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15); 760a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_ivv_se: 761a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_ivw_se: 762a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv: 763a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw: 764a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv_se: 765a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw_se: 766a640a2e0SVlad Serebrennikov // bit_27_26, vd, vs2, simm5 767a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 768a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15); 769a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_x_se: 770a640a2e0SVlad Serebrennikov // bit_27_26, bit_24_20, bit_11_7, xs1, sew, log2lmul 771a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 772a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) || 773a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) || 774a640a2e0SVlad Serebrennikov CheckLMUL(TheCall, 5); 775a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_xv_se: 776a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_vv_se: 777a640a2e0SVlad Serebrennikov // bit_27_26, bit_11_7, vs2, xs1/vs1 778a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_x: 779a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_x_se: 780a640a2e0SVlad Serebrennikov // bit_27_26, bit_24-20, xs1 781a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 782a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31); 783a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_vvv_se: 784a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_xvv_se: 785a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_vvw_se: 786a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_xvw_se: 787a640a2e0SVlad Serebrennikov // bit_27_26, vd, vs2, xs1 788a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_xv: 789a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_vv: 790a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_xv_se: 791a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_vv_se: 792a640a2e0SVlad Serebrennikov // bit_27_26, vs2, xs1/vs1 793a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv: 794a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv: 795a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw: 796a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw: 797a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv_se: 798a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv_se: 799a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw_se: 800a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw_se: 801a640a2e0SVlad Serebrennikov // bit_27_26, vd, vs2, xs1/vs1 802a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3); 803a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_fv_se: 804a640a2e0SVlad Serebrennikov // bit_26, bit_11_7, vs2, fs1 805a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1) || 806a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31); 807a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_fvv_se: 808a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_fvw_se: 809a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv: 810a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw: 811a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv_se: 812a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw_se: 813a640a2e0SVlad Serebrennikov // bit_26, vd, vs2, fs1 814a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_fv: 815a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_sf_vc_v_fv_se: 816a640a2e0SVlad Serebrennikov // bit_26, vs2, fs1 817a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1); 818a640a2e0SVlad Serebrennikov // Check if byteselect is in [0, 3] 819a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_aes32dsi: 820a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_aes32dsmi: 821a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_aes32esi: 822a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_aes32esmi: 823a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_sm4ks: 824a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_sm4ed: 825a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3); 826a640a2e0SVlad Serebrennikov // Check if rnum is in [0, 10] 827a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_aes64ks1i: 828a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 10); 829a640a2e0SVlad Serebrennikov // Check if value range for vxrm is in [0, 3] 830a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vv: 831a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vx: 832a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vv: 833a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vx: 834a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vv: 835a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vx: 836a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vv: 837a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vx: 838a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv: 839a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx: 840a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vv: 841a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vx: 842a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vv: 843a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vx: 844a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wv: 845a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wx: 846a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wv: 847a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wx: 848a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3); 849a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vv_tu: 850a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vx_tu: 851a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vv_tu: 852a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vx_tu: 853a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vv_tu: 854a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vx_tu: 855a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vv_tu: 856a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vx_tu: 857a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_tu: 858a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_tu: 859a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vv_tu: 860a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vx_tu: 861a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vv_tu: 862a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vx_tu: 863a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wv_tu: 864a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wx_tu: 865a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wv_tu: 866a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wx_tu: 867a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vv_m: 868a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vx_m: 869a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vv_m: 870a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vx_m: 871a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vv_m: 872a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vx_m: 873a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vv_m: 874a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vx_m: 875a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_m: 876a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_m: 877a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vv_m: 878a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vx_m: 879a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vv_m: 880a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vx_m: 881a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wv_m: 882a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wx_m: 883a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wv_m: 884a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wx_m: 885a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 3); 886a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vv_tum: 887a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vv_tumu: 888a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vv_mu: 889a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vx_tum: 890a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vx_tumu: 891a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaaddu_vx_mu: 892a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vv_tum: 893a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vv_tumu: 894a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vv_mu: 895a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vx_tum: 896a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vx_tumu: 897a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vaadd_vx_mu: 898a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vv_tum: 899a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vv_tumu: 900a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vv_mu: 901a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vx_tum: 902a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vx_tumu: 903a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasubu_vx_mu: 904a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vv_tum: 905a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vv_tumu: 906a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vv_mu: 907a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vx_tum: 908a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vx_tumu: 909a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vasub_vx_mu: 910a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_mu: 911a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_mu: 912a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vv_mu: 913a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vx_mu: 914a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vv_mu: 915a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vx_mu: 916a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wv_mu: 917a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wx_mu: 918a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wv_mu: 919a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wx_mu: 920a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_tum: 921a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_tum: 922a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vv_tum: 923a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vx_tum: 924a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vv_tum: 925a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vx_tum: 926a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wv_tum: 927a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wx_tum: 928a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wv_tum: 929a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wx_tum: 930a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu: 931a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu: 932a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vv_tumu: 933a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssra_vx_tumu: 934a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vv_tumu: 935a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vssrl_vx_tumu: 936a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wv_tumu: 937a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclip_wx_tumu: 938a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wv_tumu: 939a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vnclipu_wx_tumu: 940a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 3); 941a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm: 942a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrec7_v_rm: 943a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm: 944a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm: 945a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm: 946a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm: 947a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm: 948a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm: 949a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm: 950a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm: 951a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm: 952a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm: 953a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm: 954a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 4); 955a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vv_rm: 956a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vf_rm: 957a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vv_rm: 958a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vf_rm: 959a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm: 960a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm: 961a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm: 962a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm: 963a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm: 964a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm: 965a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm: 966a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm: 967a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm: 968a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vv_rm: 969a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vf_rm: 970a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm: 971a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm: 972a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm: 973a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm: 974a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm: 975a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm: 976a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm: 977a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm: 978a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm: 979a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tu: 980a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tu: 981a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tu: 982a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tu: 983a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tu: 984a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tu: 985a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tu: 986a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tu: 987a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tu: 988a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tu: 989a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tu: 990a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tu: 991a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tu: 992a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_m: 993a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_m: 994a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_m: 995a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_m: 996a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_m: 997a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_m: 998a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_m: 999a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_m: 1000a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_m: 1001a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_m: 1002a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_m: 1003a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_m: 1004a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_m: 1005a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 4); 1006a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tu: 1007a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tu: 1008a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tu: 1009a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tu: 1010a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tu: 1011a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tu: 1012a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tu: 1013a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tu: 1014a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tu: 1015a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tu: 1016a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tu: 1017a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tu: 1018a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tu: 1019a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tu: 1020a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tu: 1021a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tu: 1022a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tu: 1023a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tu: 1024a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tu: 1025a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tu: 1026a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tu: 1027a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tu: 1028a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tu: 1029a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tu: 1030a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm: 1031a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm: 1032a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm: 1033a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm: 1034a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm: 1035a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm: 1036a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm: 1037a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm: 1038a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm: 1039a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm: 1040a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm: 1041a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm: 1042a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm: 1043a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm: 1044a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm: 1045a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm: 1046a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm: 1047a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm: 1048a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm: 1049a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm: 1050a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm: 1051a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm: 1052a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm: 1053a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm: 1054a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tu: 1055a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tu: 1056a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tu: 1057a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tu: 1058a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tu: 1059a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tu: 1060a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tu: 1061a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tu: 1062a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tu: 1063a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tu: 1064a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tu: 1065a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tu: 1066a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tu: 1067a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tu: 1068a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tu: 1069a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tu: 1070a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tu: 1071a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tu: 1072a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tu: 1073a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tu: 1074a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tu: 1075a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tu: 1076a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tu: 1077a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tu: 1078a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_m: 1079a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_m: 1080a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_m: 1081a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_m: 1082a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_m: 1083a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_m: 1084a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_m: 1085a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_m: 1086a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_m: 1087a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_m: 1088a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_m: 1089a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_m: 1090a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_m: 1091a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_m: 1092a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_m: 1093a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_m: 1094a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_m: 1095a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_m: 1096a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_m: 1097a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_m: 1098a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_m: 1099a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_m: 1100a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_m: 1101a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_m: 1102a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tum: 1103a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tum: 1104a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tum: 1105a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tum: 1106a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tum: 1107a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tum: 1108a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tum: 1109a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tum: 1110a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tum: 1111a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tum: 1112a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tum: 1113a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tum: 1114a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tum: 1115a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tumu: 1116a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tumu: 1117a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tumu: 1118a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tumu: 1119a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tumu: 1120a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tumu: 1121a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tumu: 1122a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tumu: 1123a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tumu: 1124a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tumu: 1125a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tumu: 1126a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tumu: 1127a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tumu: 1128a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_mu: 1129a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_mu: 1130a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_mu: 1131a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_mu: 1132a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_mu: 1133a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_mu: 1134a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_mu: 1135a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_mu: 1136a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_mu: 1137a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_mu: 1138a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_mu: 1139a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_mu: 1140a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_mu: 1141a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 4); 1142a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_m: 1143a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_m: 1144a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_m: 1145a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_m: 1146a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_m: 1147a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_m: 1148a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_m: 1149a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_m: 1150a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_m: 1151a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_m: 1152a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_m: 1153a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_m: 1154a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_m: 1155a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_m: 1156a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_m: 1157a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_m: 1158a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_m: 1159a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_m: 1160a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_m: 1161a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_m: 1162a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_m: 1163a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_m: 1164a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_m: 1165a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_m: 1166a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tum: 1167a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tum: 1168a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tum: 1169a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tum: 1170a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tum: 1171a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tum: 1172a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tum: 1173a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tum: 1174a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tum: 1175a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tum: 1176a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tum: 1177a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tum: 1178a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tum: 1179a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tum: 1180a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tum: 1181a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tum: 1182a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tum: 1183a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tum: 1184a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tum: 1185a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tum: 1186a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tum: 1187a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tum: 1188a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tum: 1189a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tum: 1190a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tum: 1191a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tum: 1192a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tum: 1193a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tum: 1194a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tum: 1195a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tum: 1196a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tum: 1197a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tum: 1198a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tum: 1199a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tum: 1200a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tum: 1201a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tum: 1202a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tum: 1203a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tum: 1204a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tum: 1205a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tum: 1206a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tum: 1207a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tum: 1208a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tum: 1209a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tum: 1210a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tum: 1211a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tum: 1212a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tum: 1213a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tum: 1214a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tumu: 1215a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tumu: 1216a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tumu: 1217a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tumu: 1218a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tumu: 1219a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tumu: 1220a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tumu: 1221a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tumu: 1222a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tumu: 1223a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tumu: 1224a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tumu: 1225a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tumu: 1226a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tumu: 1227a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tumu: 1228a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tumu: 1229a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tumu: 1230a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tumu: 1231a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tumu: 1232a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tumu: 1233a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tumu: 1234a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tumu: 1235a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tumu: 1236a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tumu: 1237a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tumu: 1238a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tumu: 1239a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tumu: 1240a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tumu: 1241a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tumu: 1242a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tumu: 1243a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tumu: 1244a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tumu: 1245a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tumu: 1246a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tumu: 1247a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tumu: 1248a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tumu: 1249a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tumu: 1250a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tumu: 1251a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tumu: 1252a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tumu: 1253a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tumu: 1254a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tumu: 1255a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tumu: 1256a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tumu: 1257a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tumu: 1258a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_mu: 1259a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_mu: 1260a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_mu: 1261a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_mu: 1262a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_mu: 1263a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_mu: 1264a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_mu: 1265a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_mu: 1266a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_mu: 1267a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_mu: 1268a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_mu: 1269a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_mu: 1270a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_mu: 1271a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_mu: 1272a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_mu: 1273a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_mu: 1274a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_mu: 1275a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_mu: 1276a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_mu: 1277a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_mu: 1278a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_mu: 1279a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_mu: 1280a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_mu: 1281a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_mu: 1282a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_mu: 1283a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_mu: 1284a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_mu: 1285a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_mu: 1286a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_mu: 1287a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_mu: 1288a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_mu: 1289a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_mu: 1290a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_mu: 1291a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_mu: 1292a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_mu: 1293a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_mu: 1294a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_mu: 1295a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_mu: 1296a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_mu: 1297a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_mu: 1298a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_mu: 1299a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_mu: 1300a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_mu: 1301a640a2e0SVlad Serebrennikov case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_mu: 1302a640a2e0SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 4); 1303a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_ntl_load: 1304a640a2e0SVlad Serebrennikov case RISCV::BI__builtin_riscv_ntl_store: 1305a640a2e0SVlad Serebrennikov DeclRefExpr *DRE = 1306a640a2e0SVlad Serebrennikov cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts()); 1307a640a2e0SVlad Serebrennikov assert((BuiltinID == RISCV::BI__builtin_riscv_ntl_store || 1308a640a2e0SVlad Serebrennikov BuiltinID == RISCV::BI__builtin_riscv_ntl_load) && 1309a640a2e0SVlad Serebrennikov "Unexpected RISC-V nontemporal load/store builtin!"); 1310a640a2e0SVlad Serebrennikov bool IsStore = BuiltinID == RISCV::BI__builtin_riscv_ntl_store; 1311a640a2e0SVlad Serebrennikov unsigned NumArgs = IsStore ? 3 : 2; 1312a640a2e0SVlad Serebrennikov 1313a640a2e0SVlad Serebrennikov if (SemaRef.checkArgCountAtLeast(TheCall, NumArgs - 1)) 1314a640a2e0SVlad Serebrennikov return true; 1315a640a2e0SVlad Serebrennikov 1316a640a2e0SVlad Serebrennikov if (SemaRef.checkArgCountAtMost(TheCall, NumArgs)) 1317a640a2e0SVlad Serebrennikov return true; 1318a640a2e0SVlad Serebrennikov 1319a640a2e0SVlad Serebrennikov // Domain value should be compile-time constant. 1320a640a2e0SVlad Serebrennikov // 2 <= domain <= 5 1321a640a2e0SVlad Serebrennikov if (TheCall->getNumArgs() == NumArgs && 1322a640a2e0SVlad Serebrennikov SemaRef.BuiltinConstantArgRange(TheCall, NumArgs - 1, 2, 5)) 1323a640a2e0SVlad Serebrennikov return true; 1324a640a2e0SVlad Serebrennikov 1325a640a2e0SVlad Serebrennikov Expr *PointerArg = TheCall->getArg(0); 1326a640a2e0SVlad Serebrennikov ExprResult PointerArgResult = 1327a640a2e0SVlad Serebrennikov SemaRef.DefaultFunctionArrayLvalueConversion(PointerArg); 1328a640a2e0SVlad Serebrennikov 1329a640a2e0SVlad Serebrennikov if (PointerArgResult.isInvalid()) 1330a640a2e0SVlad Serebrennikov return true; 1331a640a2e0SVlad Serebrennikov PointerArg = PointerArgResult.get(); 1332a640a2e0SVlad Serebrennikov 1333a640a2e0SVlad Serebrennikov const PointerType *PtrType = PointerArg->getType()->getAs<PointerType>(); 1334a640a2e0SVlad Serebrennikov if (!PtrType) { 1335a640a2e0SVlad Serebrennikov Diag(DRE->getBeginLoc(), diag::err_nontemporal_builtin_must_be_pointer) 1336a640a2e0SVlad Serebrennikov << PointerArg->getType() << PointerArg->getSourceRange(); 1337a640a2e0SVlad Serebrennikov return true; 1338a640a2e0SVlad Serebrennikov } 1339a640a2e0SVlad Serebrennikov 1340a640a2e0SVlad Serebrennikov QualType ValType = PtrType->getPointeeType(); 1341a640a2e0SVlad Serebrennikov ValType = ValType.getUnqualifiedType(); 1342a640a2e0SVlad Serebrennikov if (!ValType->isIntegerType() && !ValType->isAnyPointerType() && 1343a640a2e0SVlad Serebrennikov !ValType->isBlockPointerType() && !ValType->isFloatingType() && 1344a640a2e0SVlad Serebrennikov !ValType->isVectorType() && !ValType->isRVVSizelessBuiltinType()) { 1345a640a2e0SVlad Serebrennikov Diag(DRE->getBeginLoc(), 1346a640a2e0SVlad Serebrennikov diag::err_nontemporal_builtin_must_be_pointer_intfltptr_or_vector) 1347a640a2e0SVlad Serebrennikov << PointerArg->getType() << PointerArg->getSourceRange(); 1348a640a2e0SVlad Serebrennikov return true; 1349a640a2e0SVlad Serebrennikov } 1350a640a2e0SVlad Serebrennikov 1351a640a2e0SVlad Serebrennikov if (!IsStore) { 1352a640a2e0SVlad Serebrennikov TheCall->setType(ValType); 1353a640a2e0SVlad Serebrennikov return false; 1354a640a2e0SVlad Serebrennikov } 1355a640a2e0SVlad Serebrennikov 1356a640a2e0SVlad Serebrennikov ExprResult ValArg = TheCall->getArg(1); 1357a640a2e0SVlad Serebrennikov InitializedEntity Entity = InitializedEntity::InitializeParameter( 1358a640a2e0SVlad Serebrennikov Context, ValType, /*consume*/ false); 1359a640a2e0SVlad Serebrennikov ValArg = 1360a640a2e0SVlad Serebrennikov SemaRef.PerformCopyInitialization(Entity, SourceLocation(), ValArg); 1361a640a2e0SVlad Serebrennikov if (ValArg.isInvalid()) 1362a640a2e0SVlad Serebrennikov return true; 1363a640a2e0SVlad Serebrennikov 1364a640a2e0SVlad Serebrennikov TheCall->setArg(1, ValArg.get()); 1365a640a2e0SVlad Serebrennikov TheCall->setType(Context.VoidTy); 1366a640a2e0SVlad Serebrennikov return false; 1367a640a2e0SVlad Serebrennikov } 1368a640a2e0SVlad Serebrennikov 1369a640a2e0SVlad Serebrennikov return false; 1370a640a2e0SVlad Serebrennikov } 1371a640a2e0SVlad Serebrennikov 1372a640a2e0SVlad Serebrennikov void SemaRISCV::checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D, 1373a640a2e0SVlad Serebrennikov const llvm::StringMap<bool> &FeatureMap) { 1374a640a2e0SVlad Serebrennikov ASTContext::BuiltinVectorTypeInfo Info = 1375a640a2e0SVlad Serebrennikov SemaRef.Context.getBuiltinVectorTypeInfo(Ty->castAs<BuiltinType>()); 1376a640a2e0SVlad Serebrennikov unsigned EltSize = SemaRef.Context.getTypeSize(Info.ElementType); 1377a640a2e0SVlad Serebrennikov unsigned MinElts = Info.EC.getKnownMinValue(); 1378a640a2e0SVlad Serebrennikov 1379a640a2e0SVlad Serebrennikov if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Double) && 1380a640a2e0SVlad Serebrennikov !FeatureMap.lookup("zve64d")) 1381a640a2e0SVlad Serebrennikov Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve64d"; 1382a640a2e0SVlad Serebrennikov // (ELEN, LMUL) pairs of (8, mf8), (16, mf4), (32, mf2), (64, m1) requires at 1383a640a2e0SVlad Serebrennikov // least zve64x 1384a640a2e0SVlad Serebrennikov else if (((EltSize == 64 && Info.ElementType->isIntegerType()) || 1385a640a2e0SVlad Serebrennikov MinElts == 1) && 1386a640a2e0SVlad Serebrennikov !FeatureMap.lookup("zve64x")) 1387a640a2e0SVlad Serebrennikov Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve64x"; 1388a640a2e0SVlad Serebrennikov else if (Info.ElementType->isFloat16Type() && !FeatureMap.lookup("zvfh") && 1389a640a2e0SVlad Serebrennikov !FeatureMap.lookup("zvfhmin")) 1390a640a2e0SVlad Serebrennikov Diag(Loc, diag::err_riscv_type_requires_extension, D) 1391a640a2e0SVlad Serebrennikov << Ty << "zvfh or zvfhmin"; 139232597685SJianjian Guan else if (Info.ElementType->isBFloat16Type() && !FeatureMap.lookup("zvfbfmin")) 1393a640a2e0SVlad Serebrennikov Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zvfbfmin"; 1394a640a2e0SVlad Serebrennikov else if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Float) && 1395a640a2e0SVlad Serebrennikov !FeatureMap.lookup("zve32f")) 1396a640a2e0SVlad Serebrennikov Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve32f"; 1397a640a2e0SVlad Serebrennikov // Given that caller already checked isRVVType() before calling this function, 1398a640a2e0SVlad Serebrennikov // if we don't have at least zve32x supported, then we need to emit error. 1399a640a2e0SVlad Serebrennikov else if (!FeatureMap.lookup("zve32x")) 1400a640a2e0SVlad Serebrennikov Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve32x"; 1401a640a2e0SVlad Serebrennikov } 1402a640a2e0SVlad Serebrennikov 1403a640a2e0SVlad Serebrennikov /// Are the two types RVV-bitcast-compatible types? I.e. is bitcasting from the 1404a640a2e0SVlad Serebrennikov /// first RVV type (e.g. an RVV scalable type) to the second type (e.g. an RVV 1405a640a2e0SVlad Serebrennikov /// VLS type) allowed? 1406a640a2e0SVlad Serebrennikov /// 1407a640a2e0SVlad Serebrennikov /// This will also return false if the two given types do not make sense from 1408a640a2e0SVlad Serebrennikov /// the perspective of RVV bitcasts. 1409a640a2e0SVlad Serebrennikov bool SemaRISCV::isValidRVVBitcast(QualType srcTy, QualType destTy) { 1410a640a2e0SVlad Serebrennikov assert(srcTy->isVectorType() || destTy->isVectorType()); 1411a640a2e0SVlad Serebrennikov 1412a640a2e0SVlad Serebrennikov auto ValidScalableConversion = [](QualType FirstType, QualType SecondType) { 1413a640a2e0SVlad Serebrennikov if (!FirstType->isRVVSizelessBuiltinType()) 1414a640a2e0SVlad Serebrennikov return false; 1415a640a2e0SVlad Serebrennikov 1416a640a2e0SVlad Serebrennikov const auto *VecTy = SecondType->getAs<VectorType>(); 1417a640a2e0SVlad Serebrennikov return VecTy && VecTy->getVectorKind() == VectorKind::RVVFixedLengthData; 1418a640a2e0SVlad Serebrennikov }; 1419a640a2e0SVlad Serebrennikov 1420a640a2e0SVlad Serebrennikov return ValidScalableConversion(srcTy, destTy) || 1421a640a2e0SVlad Serebrennikov ValidScalableConversion(destTy, srcTy); 1422a640a2e0SVlad Serebrennikov } 1423a640a2e0SVlad Serebrennikov 14246b755b0cSVlad Serebrennikov void SemaRISCV::handleInterruptAttr(Decl *D, const ParsedAttr &AL) { 14256b755b0cSVlad Serebrennikov // Warn about repeated attributes. 14266b755b0cSVlad Serebrennikov if (const auto *A = D->getAttr<RISCVInterruptAttr>()) { 14276b755b0cSVlad Serebrennikov Diag(AL.getRange().getBegin(), 14286b755b0cSVlad Serebrennikov diag::warn_riscv_repeated_interrupt_attribute); 14296b755b0cSVlad Serebrennikov Diag(A->getLocation(), diag::note_riscv_repeated_interrupt_attribute); 14306b755b0cSVlad Serebrennikov return; 14316b755b0cSVlad Serebrennikov } 14326b755b0cSVlad Serebrennikov 14336b755b0cSVlad Serebrennikov // Check the attribute argument. Argument is optional. 14346b755b0cSVlad Serebrennikov if (!AL.checkAtMostNumArgs(SemaRef, 1)) 14356b755b0cSVlad Serebrennikov return; 14366b755b0cSVlad Serebrennikov 14376b755b0cSVlad Serebrennikov StringRef Str; 14386b755b0cSVlad Serebrennikov SourceLocation ArgLoc; 14396b755b0cSVlad Serebrennikov 14406b755b0cSVlad Serebrennikov // 'machine'is the default interrupt mode. 14416b755b0cSVlad Serebrennikov if (AL.getNumArgs() == 0) 14426b755b0cSVlad Serebrennikov Str = "machine"; 14436b755b0cSVlad Serebrennikov else if (!SemaRef.checkStringLiteralArgumentAttr(AL, 0, Str, &ArgLoc)) 14446b755b0cSVlad Serebrennikov return; 14456b755b0cSVlad Serebrennikov 14466b755b0cSVlad Serebrennikov // Semantic checks for a function with the 'interrupt' attribute: 14476b755b0cSVlad Serebrennikov // - Must be a function. 14486b755b0cSVlad Serebrennikov // - Must have no parameters. 14496b755b0cSVlad Serebrennikov // - Must have the 'void' return type. 14506b755b0cSVlad Serebrennikov // - The attribute itself must either have no argument or one of the 14516b755b0cSVlad Serebrennikov // valid interrupt types, see [RISCVInterruptDocs]. 14526b755b0cSVlad Serebrennikov 14536b755b0cSVlad Serebrennikov if (D->getFunctionType() == nullptr) { 14546b755b0cSVlad Serebrennikov Diag(D->getLocation(), diag::warn_attribute_wrong_decl_type) 14556b755b0cSVlad Serebrennikov << AL << AL.isRegularKeywordAttribute() << ExpectedFunction; 14566b755b0cSVlad Serebrennikov return; 14576b755b0cSVlad Serebrennikov } 14586b755b0cSVlad Serebrennikov 14596b755b0cSVlad Serebrennikov if (hasFunctionProto(D) && getFunctionOrMethodNumParams(D) != 0) { 14606b755b0cSVlad Serebrennikov Diag(D->getLocation(), diag::warn_interrupt_attribute_invalid) 14616b755b0cSVlad Serebrennikov << /*RISC-V*/ 2 << 0; 14626b755b0cSVlad Serebrennikov return; 14636b755b0cSVlad Serebrennikov } 14646b755b0cSVlad Serebrennikov 14656b755b0cSVlad Serebrennikov if (!getFunctionOrMethodResultType(D)->isVoidType()) { 14666b755b0cSVlad Serebrennikov Diag(D->getLocation(), diag::warn_interrupt_attribute_invalid) 14676b755b0cSVlad Serebrennikov << /*RISC-V*/ 2 << 1; 14686b755b0cSVlad Serebrennikov return; 14696b755b0cSVlad Serebrennikov } 14706b755b0cSVlad Serebrennikov 14716b755b0cSVlad Serebrennikov RISCVInterruptAttr::InterruptType Kind; 14726b755b0cSVlad Serebrennikov if (!RISCVInterruptAttr::ConvertStrToInterruptType(Str, Kind)) { 14736b755b0cSVlad Serebrennikov Diag(AL.getLoc(), diag::warn_attribute_type_not_supported) 14746b755b0cSVlad Serebrennikov << AL << Str << ArgLoc; 14756b755b0cSVlad Serebrennikov return; 14766b755b0cSVlad Serebrennikov } 14776b755b0cSVlad Serebrennikov 14786b755b0cSVlad Serebrennikov D->addAttr(::new (getASTContext()) 14796b755b0cSVlad Serebrennikov RISCVInterruptAttr(getASTContext(), AL, Kind)); 14806b755b0cSVlad Serebrennikov } 14816b755b0cSVlad Serebrennikov 14826b755b0cSVlad Serebrennikov bool SemaRISCV::isAliasValid(unsigned BuiltinID, StringRef AliasName) { 14836b755b0cSVlad Serebrennikov return BuiltinID >= RISCV::FirstRVVBuiltin && 14846b755b0cSVlad Serebrennikov BuiltinID <= RISCV::LastRVVBuiltin; 14856b755b0cSVlad Serebrennikov } 14866b755b0cSVlad Serebrennikov 14879cd93774SPiyou Chen bool SemaRISCV::isValidFMVExtension(StringRef Ext) { 14889cd93774SPiyou Chen if (Ext.empty()) 14899cd93774SPiyou Chen return false; 14909cd93774SPiyou Chen 14919cd93774SPiyou Chen if (!Ext.consume_front("+")) 14929cd93774SPiyou Chen return false; 14939cd93774SPiyou Chen 14949cd93774SPiyou Chen return -1 != RISCVISAInfo::getRISCVFeaturesBitsInfo(Ext).second; 14959cd93774SPiyou Chen } 14969cd93774SPiyou Chen 1497a640a2e0SVlad Serebrennikov SemaRISCV::SemaRISCV(Sema &S) : SemaBase(S) {} 1498a640a2e0SVlad Serebrennikov 14994f5bc4bbSVlad Serebrennikov } // namespace clang 1500