xref: /llvm-project/clang/lib/Sema/SemaRISCV.cpp (revision e375c0f7d0c8f4c49ff2a430da0c3a7d058e9cf3)
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