1*0fca6ea1SDimitry Andric //===------ SemaRISCV.cpp ------- RISC-V target-specific routines ---------===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric // 9*0fca6ea1SDimitry Andric // This file implements semantic analysis functions specific to RISC-V. 10*0fca6ea1SDimitry Andric // 11*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 12*0fca6ea1SDimitry Andric 13*0fca6ea1SDimitry Andric #include "clang/Sema/SemaRISCV.h" 14*0fca6ea1SDimitry Andric #include "clang/AST/ASTContext.h" 15*0fca6ea1SDimitry Andric #include "clang/AST/Decl.h" 16*0fca6ea1SDimitry Andric #include "clang/Basic/Builtins.h" 17*0fca6ea1SDimitry Andric #include "clang/Basic/TargetBuiltins.h" 18*0fca6ea1SDimitry Andric #include "clang/Basic/TargetInfo.h" 19*0fca6ea1SDimitry Andric #include "clang/Lex/Preprocessor.h" 20*0fca6ea1SDimitry Andric #include "clang/Sema/Attr.h" 21*0fca6ea1SDimitry Andric #include "clang/Sema/Initialization.h" 22*0fca6ea1SDimitry Andric #include "clang/Sema/Lookup.h" 23*0fca6ea1SDimitry Andric #include "clang/Sema/ParsedAttr.h" 24*0fca6ea1SDimitry Andric #include "clang/Sema/RISCVIntrinsicManager.h" 25*0fca6ea1SDimitry Andric #include "clang/Sema/Sema.h" 26*0fca6ea1SDimitry Andric #include "clang/Support/RISCVVIntrinsicUtils.h" 27*0fca6ea1SDimitry Andric #include "llvm/ADT/SmallVector.h" 28*0fca6ea1SDimitry Andric #include "llvm/TargetParser/RISCVTargetParser.h" 29*0fca6ea1SDimitry Andric #include <optional> 30*0fca6ea1SDimitry Andric #include <string> 31*0fca6ea1SDimitry Andric #include <vector> 32*0fca6ea1SDimitry Andric 33*0fca6ea1SDimitry Andric using namespace llvm; 34*0fca6ea1SDimitry Andric using namespace clang; 35*0fca6ea1SDimitry Andric using namespace clang::RISCV; 36*0fca6ea1SDimitry Andric 37*0fca6ea1SDimitry Andric using IntrinsicKind = sema::RISCVIntrinsicManager::IntrinsicKind; 38*0fca6ea1SDimitry Andric 39*0fca6ea1SDimitry Andric namespace { 40*0fca6ea1SDimitry Andric 41*0fca6ea1SDimitry Andric // Function definition of a RVV intrinsic. 42*0fca6ea1SDimitry Andric struct RVVIntrinsicDef { 43*0fca6ea1SDimitry Andric /// Mapping to which clang built-in function, e.g. __builtin_rvv_vadd. 44*0fca6ea1SDimitry Andric std::string BuiltinName; 45*0fca6ea1SDimitry Andric 46*0fca6ea1SDimitry Andric /// Function signature, first element is return type. 47*0fca6ea1SDimitry Andric RVVTypes Signature; 48*0fca6ea1SDimitry Andric }; 49*0fca6ea1SDimitry Andric 50*0fca6ea1SDimitry Andric struct RVVOverloadIntrinsicDef { 51*0fca6ea1SDimitry Andric // Indexes of RISCVIntrinsicManagerImpl::IntrinsicList. 52*0fca6ea1SDimitry Andric SmallVector<uint16_t, 8> Indexes; 53*0fca6ea1SDimitry Andric }; 54*0fca6ea1SDimitry Andric 55*0fca6ea1SDimitry Andric } // namespace 56*0fca6ea1SDimitry Andric 57*0fca6ea1SDimitry Andric static const PrototypeDescriptor RVVSignatureTable[] = { 58*0fca6ea1SDimitry Andric #define DECL_SIGNATURE_TABLE 59*0fca6ea1SDimitry Andric #include "clang/Basic/riscv_vector_builtin_sema.inc" 60*0fca6ea1SDimitry Andric #undef DECL_SIGNATURE_TABLE 61*0fca6ea1SDimitry Andric }; 62*0fca6ea1SDimitry Andric 63*0fca6ea1SDimitry Andric static const PrototypeDescriptor RVSiFiveVectorSignatureTable[] = { 64*0fca6ea1SDimitry Andric #define DECL_SIGNATURE_TABLE 65*0fca6ea1SDimitry Andric #include "clang/Basic/riscv_sifive_vector_builtin_sema.inc" 66*0fca6ea1SDimitry Andric #undef DECL_SIGNATURE_TABLE 67*0fca6ea1SDimitry Andric }; 68*0fca6ea1SDimitry Andric 69*0fca6ea1SDimitry Andric static const RVVIntrinsicRecord RVVIntrinsicRecords[] = { 70*0fca6ea1SDimitry Andric #define DECL_INTRINSIC_RECORDS 71*0fca6ea1SDimitry Andric #include "clang/Basic/riscv_vector_builtin_sema.inc" 72*0fca6ea1SDimitry Andric #undef DECL_INTRINSIC_RECORDS 73*0fca6ea1SDimitry Andric }; 74*0fca6ea1SDimitry Andric 75*0fca6ea1SDimitry Andric static const RVVIntrinsicRecord RVSiFiveVectorIntrinsicRecords[] = { 76*0fca6ea1SDimitry Andric #define DECL_INTRINSIC_RECORDS 77*0fca6ea1SDimitry Andric #include "clang/Basic/riscv_sifive_vector_builtin_sema.inc" 78*0fca6ea1SDimitry Andric #undef DECL_INTRINSIC_RECORDS 79*0fca6ea1SDimitry Andric }; 80*0fca6ea1SDimitry Andric 81*0fca6ea1SDimitry Andric // Get subsequence of signature table. 82*0fca6ea1SDimitry Andric static ArrayRef<PrototypeDescriptor> 83*0fca6ea1SDimitry Andric ProtoSeq2ArrayRef(IntrinsicKind K, uint16_t Index, uint8_t Length) { 84*0fca6ea1SDimitry Andric switch (K) { 85*0fca6ea1SDimitry Andric case IntrinsicKind::RVV: 86*0fca6ea1SDimitry Andric return ArrayRef(&RVVSignatureTable[Index], Length); 87*0fca6ea1SDimitry Andric case IntrinsicKind::SIFIVE_VECTOR: 88*0fca6ea1SDimitry Andric return ArrayRef(&RVSiFiveVectorSignatureTable[Index], Length); 89*0fca6ea1SDimitry Andric } 90*0fca6ea1SDimitry Andric llvm_unreachable("Unhandled IntrinsicKind"); 91*0fca6ea1SDimitry Andric } 92*0fca6ea1SDimitry Andric 93*0fca6ea1SDimitry Andric static QualType RVVType2Qual(ASTContext &Context, const RVVType *Type) { 94*0fca6ea1SDimitry Andric QualType QT; 95*0fca6ea1SDimitry Andric switch (Type->getScalarType()) { 96*0fca6ea1SDimitry Andric case ScalarTypeKind::Void: 97*0fca6ea1SDimitry Andric QT = Context.VoidTy; 98*0fca6ea1SDimitry Andric break; 99*0fca6ea1SDimitry Andric case ScalarTypeKind::Size_t: 100*0fca6ea1SDimitry Andric QT = Context.getSizeType(); 101*0fca6ea1SDimitry Andric break; 102*0fca6ea1SDimitry Andric case ScalarTypeKind::Ptrdiff_t: 103*0fca6ea1SDimitry Andric QT = Context.getPointerDiffType(); 104*0fca6ea1SDimitry Andric break; 105*0fca6ea1SDimitry Andric case ScalarTypeKind::UnsignedLong: 106*0fca6ea1SDimitry Andric QT = Context.UnsignedLongTy; 107*0fca6ea1SDimitry Andric break; 108*0fca6ea1SDimitry Andric case ScalarTypeKind::SignedLong: 109*0fca6ea1SDimitry Andric QT = Context.LongTy; 110*0fca6ea1SDimitry Andric break; 111*0fca6ea1SDimitry Andric case ScalarTypeKind::Boolean: 112*0fca6ea1SDimitry Andric QT = Context.BoolTy; 113*0fca6ea1SDimitry Andric break; 114*0fca6ea1SDimitry Andric case ScalarTypeKind::SignedInteger: 115*0fca6ea1SDimitry Andric QT = Context.getIntTypeForBitwidth(Type->getElementBitwidth(), true); 116*0fca6ea1SDimitry Andric break; 117*0fca6ea1SDimitry Andric case ScalarTypeKind::UnsignedInteger: 118*0fca6ea1SDimitry Andric QT = Context.getIntTypeForBitwidth(Type->getElementBitwidth(), false); 119*0fca6ea1SDimitry Andric break; 120*0fca6ea1SDimitry Andric case ScalarTypeKind::BFloat: 121*0fca6ea1SDimitry Andric QT = Context.BFloat16Ty; 122*0fca6ea1SDimitry Andric break; 123*0fca6ea1SDimitry Andric case ScalarTypeKind::Float: 124*0fca6ea1SDimitry Andric switch (Type->getElementBitwidth()) { 125*0fca6ea1SDimitry Andric case 64: 126*0fca6ea1SDimitry Andric QT = Context.DoubleTy; 127*0fca6ea1SDimitry Andric break; 128*0fca6ea1SDimitry Andric case 32: 129*0fca6ea1SDimitry Andric QT = Context.FloatTy; 130*0fca6ea1SDimitry Andric break; 131*0fca6ea1SDimitry Andric case 16: 132*0fca6ea1SDimitry Andric QT = Context.Float16Ty; 133*0fca6ea1SDimitry Andric break; 134*0fca6ea1SDimitry Andric default: 135*0fca6ea1SDimitry Andric llvm_unreachable("Unsupported floating point width."); 136*0fca6ea1SDimitry Andric } 137*0fca6ea1SDimitry Andric break; 138*0fca6ea1SDimitry Andric case Invalid: 139*0fca6ea1SDimitry Andric case Undefined: 140*0fca6ea1SDimitry Andric llvm_unreachable("Unhandled type."); 141*0fca6ea1SDimitry Andric } 142*0fca6ea1SDimitry Andric if (Type->isVector()) { 143*0fca6ea1SDimitry Andric if (Type->isTuple()) 144*0fca6ea1SDimitry Andric QT = Context.getScalableVectorType(QT, *Type->getScale(), Type->getNF()); 145*0fca6ea1SDimitry Andric else 146*0fca6ea1SDimitry Andric QT = Context.getScalableVectorType(QT, *Type->getScale()); 147*0fca6ea1SDimitry Andric } 148*0fca6ea1SDimitry Andric 149*0fca6ea1SDimitry Andric if (Type->isConstant()) 150*0fca6ea1SDimitry Andric QT = Context.getConstType(QT); 151*0fca6ea1SDimitry Andric 152*0fca6ea1SDimitry Andric // Transform the type to a pointer as the last step, if necessary. 153*0fca6ea1SDimitry Andric if (Type->isPointer()) 154*0fca6ea1SDimitry Andric QT = Context.getPointerType(QT); 155*0fca6ea1SDimitry Andric 156*0fca6ea1SDimitry Andric return QT; 157*0fca6ea1SDimitry Andric } 158*0fca6ea1SDimitry Andric 159*0fca6ea1SDimitry Andric namespace { 160*0fca6ea1SDimitry Andric class RISCVIntrinsicManagerImpl : public sema::RISCVIntrinsicManager { 161*0fca6ea1SDimitry Andric private: 162*0fca6ea1SDimitry Andric Sema &S; 163*0fca6ea1SDimitry Andric ASTContext &Context; 164*0fca6ea1SDimitry Andric RVVTypeCache TypeCache; 165*0fca6ea1SDimitry Andric bool ConstructedRISCVVBuiltins; 166*0fca6ea1SDimitry Andric bool ConstructedRISCVSiFiveVectorBuiltins; 167*0fca6ea1SDimitry Andric 168*0fca6ea1SDimitry Andric // List of all RVV intrinsic. 169*0fca6ea1SDimitry Andric std::vector<RVVIntrinsicDef> IntrinsicList; 170*0fca6ea1SDimitry Andric // Mapping function name to index of IntrinsicList. 171*0fca6ea1SDimitry Andric StringMap<uint16_t> Intrinsics; 172*0fca6ea1SDimitry Andric // Mapping function name to RVVOverloadIntrinsicDef. 173*0fca6ea1SDimitry Andric StringMap<RVVOverloadIntrinsicDef> OverloadIntrinsics; 174*0fca6ea1SDimitry Andric 175*0fca6ea1SDimitry Andric // Create RVVIntrinsicDef. 176*0fca6ea1SDimitry Andric void InitRVVIntrinsic(const RVVIntrinsicRecord &Record, StringRef SuffixStr, 177*0fca6ea1SDimitry Andric StringRef OverloadedSuffixStr, bool IsMask, 178*0fca6ea1SDimitry Andric RVVTypes &Types, bool HasPolicy, Policy PolicyAttrs); 179*0fca6ea1SDimitry Andric 180*0fca6ea1SDimitry Andric // Create FunctionDecl for a vector intrinsic. 181*0fca6ea1SDimitry Andric void CreateRVVIntrinsicDecl(LookupResult &LR, IdentifierInfo *II, 182*0fca6ea1SDimitry Andric Preprocessor &PP, uint32_t Index, 183*0fca6ea1SDimitry Andric bool IsOverload); 184*0fca6ea1SDimitry Andric 185*0fca6ea1SDimitry Andric void ConstructRVVIntrinsics(ArrayRef<RVVIntrinsicRecord> Recs, 186*0fca6ea1SDimitry Andric IntrinsicKind K); 187*0fca6ea1SDimitry Andric 188*0fca6ea1SDimitry Andric public: 189*0fca6ea1SDimitry Andric RISCVIntrinsicManagerImpl(clang::Sema &S) : S(S), Context(S.Context) { 190*0fca6ea1SDimitry Andric ConstructedRISCVVBuiltins = false; 191*0fca6ea1SDimitry Andric ConstructedRISCVSiFiveVectorBuiltins = false; 192*0fca6ea1SDimitry Andric } 193*0fca6ea1SDimitry Andric 194*0fca6ea1SDimitry Andric // Initialize IntrinsicList 195*0fca6ea1SDimitry Andric void InitIntrinsicList() override; 196*0fca6ea1SDimitry Andric 197*0fca6ea1SDimitry Andric // Create RISC-V vector intrinsic and insert into symbol table if found, and 198*0fca6ea1SDimitry Andric // return true, otherwise return false. 199*0fca6ea1SDimitry Andric bool CreateIntrinsicIfFound(LookupResult &LR, IdentifierInfo *II, 200*0fca6ea1SDimitry Andric Preprocessor &PP) override; 201*0fca6ea1SDimitry Andric }; 202*0fca6ea1SDimitry Andric } // namespace 203*0fca6ea1SDimitry Andric 204*0fca6ea1SDimitry Andric void RISCVIntrinsicManagerImpl::ConstructRVVIntrinsics( 205*0fca6ea1SDimitry Andric ArrayRef<RVVIntrinsicRecord> Recs, IntrinsicKind K) { 206*0fca6ea1SDimitry Andric const TargetInfo &TI = Context.getTargetInfo(); 207*0fca6ea1SDimitry Andric static const std::pair<const char *, RVVRequire> FeatureCheckList[] = { 208*0fca6ea1SDimitry Andric {"64bit", RVV_REQ_RV64}, 209*0fca6ea1SDimitry Andric {"xsfvcp", RVV_REQ_Xsfvcp}, 210*0fca6ea1SDimitry Andric {"xsfvfnrclipxfqf", RVV_REQ_Xsfvfnrclipxfqf}, 211*0fca6ea1SDimitry Andric {"xsfvfwmaccqqq", RVV_REQ_Xsfvfwmaccqqq}, 212*0fca6ea1SDimitry Andric {"xsfvqmaccdod", RVV_REQ_Xsfvqmaccdod}, 213*0fca6ea1SDimitry Andric {"xsfvqmaccqoq", RVV_REQ_Xsfvqmaccqoq}, 214*0fca6ea1SDimitry Andric {"zvbb", RVV_REQ_Zvbb}, 215*0fca6ea1SDimitry Andric {"zvbc", RVV_REQ_Zvbc}, 216*0fca6ea1SDimitry Andric {"zvkb", RVV_REQ_Zvkb}, 217*0fca6ea1SDimitry Andric {"zvkg", RVV_REQ_Zvkg}, 218*0fca6ea1SDimitry Andric {"zvkned", RVV_REQ_Zvkned}, 219*0fca6ea1SDimitry Andric {"zvknha", RVV_REQ_Zvknha}, 220*0fca6ea1SDimitry Andric {"zvknhb", RVV_REQ_Zvknhb}, 221*0fca6ea1SDimitry Andric {"zvksed", RVV_REQ_Zvksed}, 222*0fca6ea1SDimitry Andric {"zvksh", RVV_REQ_Zvksh}, 223*0fca6ea1SDimitry Andric {"zvfbfwma", RVV_REQ_Zvfbfwma}, 224*0fca6ea1SDimitry Andric {"zvfbfmin", RVV_REQ_Zvfbfmin}, 225*0fca6ea1SDimitry Andric {"experimental", RVV_REQ_Experimental}}; 226*0fca6ea1SDimitry Andric 227*0fca6ea1SDimitry Andric // Construction of RVVIntrinsicRecords need to sync with createRVVIntrinsics 228*0fca6ea1SDimitry Andric // in RISCVVEmitter.cpp. 229*0fca6ea1SDimitry Andric for (auto &Record : Recs) { 230*0fca6ea1SDimitry Andric // Check requirements. 231*0fca6ea1SDimitry Andric if (llvm::any_of(FeatureCheckList, [&](const auto &Item) { 232*0fca6ea1SDimitry Andric return (Record.RequiredExtensions & Item.second) == Item.second && 233*0fca6ea1SDimitry Andric !TI.hasFeature(Item.first); 234*0fca6ea1SDimitry Andric })) 235*0fca6ea1SDimitry Andric continue; 236*0fca6ea1SDimitry Andric 237*0fca6ea1SDimitry Andric // Create Intrinsics for each type and LMUL. 238*0fca6ea1SDimitry Andric BasicType BaseType = BasicType::Unknown; 239*0fca6ea1SDimitry Andric ArrayRef<PrototypeDescriptor> BasicProtoSeq = 240*0fca6ea1SDimitry Andric ProtoSeq2ArrayRef(K, Record.PrototypeIndex, Record.PrototypeLength); 241*0fca6ea1SDimitry Andric ArrayRef<PrototypeDescriptor> SuffixProto = 242*0fca6ea1SDimitry Andric ProtoSeq2ArrayRef(K, Record.SuffixIndex, Record.SuffixLength); 243*0fca6ea1SDimitry Andric ArrayRef<PrototypeDescriptor> OverloadedSuffixProto = ProtoSeq2ArrayRef( 244*0fca6ea1SDimitry Andric K, Record.OverloadedSuffixIndex, Record.OverloadedSuffixSize); 245*0fca6ea1SDimitry Andric 246*0fca6ea1SDimitry Andric PolicyScheme UnMaskedPolicyScheme = 247*0fca6ea1SDimitry Andric static_cast<PolicyScheme>(Record.UnMaskedPolicyScheme); 248*0fca6ea1SDimitry Andric PolicyScheme MaskedPolicyScheme = 249*0fca6ea1SDimitry Andric static_cast<PolicyScheme>(Record.MaskedPolicyScheme); 250*0fca6ea1SDimitry Andric 251*0fca6ea1SDimitry Andric const Policy DefaultPolicy; 252*0fca6ea1SDimitry Andric 253*0fca6ea1SDimitry Andric llvm::SmallVector<PrototypeDescriptor> ProtoSeq = 254*0fca6ea1SDimitry Andric RVVIntrinsic::computeBuiltinTypes( 255*0fca6ea1SDimitry Andric BasicProtoSeq, /*IsMasked=*/false, 256*0fca6ea1SDimitry Andric /*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF, 257*0fca6ea1SDimitry Andric UnMaskedPolicyScheme, DefaultPolicy, Record.IsTuple); 258*0fca6ea1SDimitry Andric 259*0fca6ea1SDimitry Andric llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq; 260*0fca6ea1SDimitry Andric if (Record.HasMasked) 261*0fca6ea1SDimitry Andric ProtoMaskSeq = RVVIntrinsic::computeBuiltinTypes( 262*0fca6ea1SDimitry Andric BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand, 263*0fca6ea1SDimitry Andric Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy, 264*0fca6ea1SDimitry Andric Record.IsTuple); 265*0fca6ea1SDimitry Andric 266*0fca6ea1SDimitry Andric bool UnMaskedHasPolicy = UnMaskedPolicyScheme != PolicyScheme::SchemeNone; 267*0fca6ea1SDimitry Andric bool MaskedHasPolicy = MaskedPolicyScheme != PolicyScheme::SchemeNone; 268*0fca6ea1SDimitry Andric SmallVector<Policy> SupportedUnMaskedPolicies = 269*0fca6ea1SDimitry Andric RVVIntrinsic::getSupportedUnMaskedPolicies(); 270*0fca6ea1SDimitry Andric SmallVector<Policy> SupportedMaskedPolicies = 271*0fca6ea1SDimitry Andric RVVIntrinsic::getSupportedMaskedPolicies(Record.HasTailPolicy, 272*0fca6ea1SDimitry Andric Record.HasMaskPolicy); 273*0fca6ea1SDimitry Andric 274*0fca6ea1SDimitry Andric for (unsigned int TypeRangeMaskShift = 0; 275*0fca6ea1SDimitry Andric TypeRangeMaskShift <= static_cast<unsigned int>(BasicType::MaxOffset); 276*0fca6ea1SDimitry Andric ++TypeRangeMaskShift) { 277*0fca6ea1SDimitry Andric unsigned int BaseTypeI = 1 << TypeRangeMaskShift; 278*0fca6ea1SDimitry Andric BaseType = static_cast<BasicType>(BaseTypeI); 279*0fca6ea1SDimitry Andric 280*0fca6ea1SDimitry Andric if ((BaseTypeI & Record.TypeRangeMask) != BaseTypeI) 281*0fca6ea1SDimitry Andric continue; 282*0fca6ea1SDimitry Andric 283*0fca6ea1SDimitry Andric if (BaseType == BasicType::Float16) { 284*0fca6ea1SDimitry Andric if ((Record.RequiredExtensions & RVV_REQ_Zvfhmin) == RVV_REQ_Zvfhmin) { 285*0fca6ea1SDimitry Andric if (!TI.hasFeature("zvfhmin")) 286*0fca6ea1SDimitry Andric continue; 287*0fca6ea1SDimitry Andric } else if (!TI.hasFeature("zvfh")) { 288*0fca6ea1SDimitry Andric continue; 289*0fca6ea1SDimitry Andric } 290*0fca6ea1SDimitry Andric } 291*0fca6ea1SDimitry Andric 292*0fca6ea1SDimitry Andric // Expanded with different LMUL. 293*0fca6ea1SDimitry Andric for (int Log2LMUL = -3; Log2LMUL <= 3; Log2LMUL++) { 294*0fca6ea1SDimitry Andric if (!(Record.Log2LMULMask & (1 << (Log2LMUL + 3)))) 295*0fca6ea1SDimitry Andric continue; 296*0fca6ea1SDimitry Andric 297*0fca6ea1SDimitry Andric std::optional<RVVTypes> Types = 298*0fca6ea1SDimitry Andric TypeCache.computeTypes(BaseType, Log2LMUL, Record.NF, ProtoSeq); 299*0fca6ea1SDimitry Andric 300*0fca6ea1SDimitry Andric // Ignored to create new intrinsic if there are any illegal types. 301*0fca6ea1SDimitry Andric if (!Types.has_value()) 302*0fca6ea1SDimitry Andric continue; 303*0fca6ea1SDimitry Andric 304*0fca6ea1SDimitry Andric std::string SuffixStr = RVVIntrinsic::getSuffixStr( 305*0fca6ea1SDimitry Andric TypeCache, BaseType, Log2LMUL, SuffixProto); 306*0fca6ea1SDimitry Andric std::string OverloadedSuffixStr = RVVIntrinsic::getSuffixStr( 307*0fca6ea1SDimitry Andric TypeCache, BaseType, Log2LMUL, OverloadedSuffixProto); 308*0fca6ea1SDimitry Andric 309*0fca6ea1SDimitry Andric // Create non-masked intrinsic. 310*0fca6ea1SDimitry Andric InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, false, *Types, 311*0fca6ea1SDimitry Andric UnMaskedHasPolicy, DefaultPolicy); 312*0fca6ea1SDimitry Andric 313*0fca6ea1SDimitry Andric // Create non-masked policy intrinsic. 314*0fca6ea1SDimitry Andric if (Record.UnMaskedPolicyScheme != PolicyScheme::SchemeNone) { 315*0fca6ea1SDimitry Andric for (auto P : SupportedUnMaskedPolicies) { 316*0fca6ea1SDimitry Andric llvm::SmallVector<PrototypeDescriptor> PolicyPrototype = 317*0fca6ea1SDimitry Andric RVVIntrinsic::computeBuiltinTypes( 318*0fca6ea1SDimitry Andric BasicProtoSeq, /*IsMasked=*/false, 319*0fca6ea1SDimitry Andric /*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF, 320*0fca6ea1SDimitry Andric UnMaskedPolicyScheme, P, Record.IsTuple); 321*0fca6ea1SDimitry Andric std::optional<RVVTypes> PolicyTypes = TypeCache.computeTypes( 322*0fca6ea1SDimitry Andric BaseType, Log2LMUL, Record.NF, PolicyPrototype); 323*0fca6ea1SDimitry Andric InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, 324*0fca6ea1SDimitry Andric /*IsMask=*/false, *PolicyTypes, UnMaskedHasPolicy, 325*0fca6ea1SDimitry Andric P); 326*0fca6ea1SDimitry Andric } 327*0fca6ea1SDimitry Andric } 328*0fca6ea1SDimitry Andric if (!Record.HasMasked) 329*0fca6ea1SDimitry Andric continue; 330*0fca6ea1SDimitry Andric // Create masked intrinsic. 331*0fca6ea1SDimitry Andric std::optional<RVVTypes> MaskTypes = 332*0fca6ea1SDimitry Andric TypeCache.computeTypes(BaseType, Log2LMUL, Record.NF, ProtoMaskSeq); 333*0fca6ea1SDimitry Andric InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, true, 334*0fca6ea1SDimitry Andric *MaskTypes, MaskedHasPolicy, DefaultPolicy); 335*0fca6ea1SDimitry Andric if (Record.MaskedPolicyScheme == PolicyScheme::SchemeNone) 336*0fca6ea1SDimitry Andric continue; 337*0fca6ea1SDimitry Andric // Create masked policy intrinsic. 338*0fca6ea1SDimitry Andric for (auto P : SupportedMaskedPolicies) { 339*0fca6ea1SDimitry Andric llvm::SmallVector<PrototypeDescriptor> PolicyPrototype = 340*0fca6ea1SDimitry Andric RVVIntrinsic::computeBuiltinTypes( 341*0fca6ea1SDimitry Andric BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand, 342*0fca6ea1SDimitry Andric Record.HasVL, Record.NF, MaskedPolicyScheme, P, 343*0fca6ea1SDimitry Andric Record.IsTuple); 344*0fca6ea1SDimitry Andric std::optional<RVVTypes> PolicyTypes = TypeCache.computeTypes( 345*0fca6ea1SDimitry Andric BaseType, Log2LMUL, Record.NF, PolicyPrototype); 346*0fca6ea1SDimitry Andric InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, 347*0fca6ea1SDimitry Andric /*IsMask=*/true, *PolicyTypes, MaskedHasPolicy, P); 348*0fca6ea1SDimitry Andric } 349*0fca6ea1SDimitry Andric } // End for different LMUL 350*0fca6ea1SDimitry Andric } // End for different TypeRange 351*0fca6ea1SDimitry Andric } 352*0fca6ea1SDimitry Andric } 353*0fca6ea1SDimitry Andric 354*0fca6ea1SDimitry Andric void RISCVIntrinsicManagerImpl::InitIntrinsicList() { 355*0fca6ea1SDimitry Andric 356*0fca6ea1SDimitry Andric if (S.RISCV().DeclareRVVBuiltins && !ConstructedRISCVVBuiltins) { 357*0fca6ea1SDimitry Andric ConstructedRISCVVBuiltins = true; 358*0fca6ea1SDimitry Andric ConstructRVVIntrinsics(RVVIntrinsicRecords, IntrinsicKind::RVV); 359*0fca6ea1SDimitry Andric } 360*0fca6ea1SDimitry Andric if (S.RISCV().DeclareSiFiveVectorBuiltins && 361*0fca6ea1SDimitry Andric !ConstructedRISCVSiFiveVectorBuiltins) { 362*0fca6ea1SDimitry Andric ConstructedRISCVSiFiveVectorBuiltins = true; 363*0fca6ea1SDimitry Andric ConstructRVVIntrinsics(RVSiFiveVectorIntrinsicRecords, 364*0fca6ea1SDimitry Andric IntrinsicKind::SIFIVE_VECTOR); 365*0fca6ea1SDimitry Andric } 366*0fca6ea1SDimitry Andric } 367*0fca6ea1SDimitry Andric 368*0fca6ea1SDimitry Andric // Compute name and signatures for intrinsic with practical types. 369*0fca6ea1SDimitry Andric void RISCVIntrinsicManagerImpl::InitRVVIntrinsic( 370*0fca6ea1SDimitry Andric const RVVIntrinsicRecord &Record, StringRef SuffixStr, 371*0fca6ea1SDimitry Andric StringRef OverloadedSuffixStr, bool IsMasked, RVVTypes &Signature, 372*0fca6ea1SDimitry Andric bool HasPolicy, Policy PolicyAttrs) { 373*0fca6ea1SDimitry Andric // Function name, e.g. vadd_vv_i32m1. 374*0fca6ea1SDimitry Andric std::string Name = Record.Name; 375*0fca6ea1SDimitry Andric if (!SuffixStr.empty()) 376*0fca6ea1SDimitry Andric Name += "_" + SuffixStr.str(); 377*0fca6ea1SDimitry Andric 378*0fca6ea1SDimitry Andric // Overloaded function name, e.g. vadd. 379*0fca6ea1SDimitry Andric std::string OverloadedName; 380*0fca6ea1SDimitry Andric if (!Record.OverloadedName) 381*0fca6ea1SDimitry Andric OverloadedName = StringRef(Record.Name).split("_").first.str(); 382*0fca6ea1SDimitry Andric else 383*0fca6ea1SDimitry Andric OverloadedName = Record.OverloadedName; 384*0fca6ea1SDimitry Andric if (!OverloadedSuffixStr.empty()) 385*0fca6ea1SDimitry Andric OverloadedName += "_" + OverloadedSuffixStr.str(); 386*0fca6ea1SDimitry Andric 387*0fca6ea1SDimitry Andric // clang built-in function name, e.g. __builtin_rvv_vadd. 388*0fca6ea1SDimitry Andric std::string BuiltinName = std::string(Record.Name); 389*0fca6ea1SDimitry Andric 390*0fca6ea1SDimitry Andric RVVIntrinsic::updateNamesAndPolicy(IsMasked, HasPolicy, Name, BuiltinName, 391*0fca6ea1SDimitry Andric OverloadedName, PolicyAttrs, 392*0fca6ea1SDimitry Andric Record.HasFRMRoundModeOp); 393*0fca6ea1SDimitry Andric 394*0fca6ea1SDimitry Andric // Put into IntrinsicList. 395*0fca6ea1SDimitry Andric uint16_t Index = IntrinsicList.size(); 396*0fca6ea1SDimitry Andric assert(IntrinsicList.size() == (size_t)Index && 397*0fca6ea1SDimitry Andric "Intrinsics indices overflow."); 398*0fca6ea1SDimitry Andric IntrinsicList.push_back({BuiltinName, Signature}); 399*0fca6ea1SDimitry Andric 400*0fca6ea1SDimitry Andric // Creating mapping to Intrinsics. 401*0fca6ea1SDimitry Andric Intrinsics.insert({Name, Index}); 402*0fca6ea1SDimitry Andric 403*0fca6ea1SDimitry Andric // Get the RVVOverloadIntrinsicDef. 404*0fca6ea1SDimitry Andric RVVOverloadIntrinsicDef &OverloadIntrinsicDef = 405*0fca6ea1SDimitry Andric OverloadIntrinsics[OverloadedName]; 406*0fca6ea1SDimitry Andric 407*0fca6ea1SDimitry Andric // And added the index. 408*0fca6ea1SDimitry Andric OverloadIntrinsicDef.Indexes.push_back(Index); 409*0fca6ea1SDimitry Andric } 410*0fca6ea1SDimitry Andric 411*0fca6ea1SDimitry Andric void RISCVIntrinsicManagerImpl::CreateRVVIntrinsicDecl(LookupResult &LR, 412*0fca6ea1SDimitry Andric IdentifierInfo *II, 413*0fca6ea1SDimitry Andric Preprocessor &PP, 414*0fca6ea1SDimitry Andric uint32_t Index, 415*0fca6ea1SDimitry Andric bool IsOverload) { 416*0fca6ea1SDimitry Andric ASTContext &Context = S.Context; 417*0fca6ea1SDimitry Andric RVVIntrinsicDef &IDef = IntrinsicList[Index]; 418*0fca6ea1SDimitry Andric RVVTypes Sigs = IDef.Signature; 419*0fca6ea1SDimitry Andric size_t SigLength = Sigs.size(); 420*0fca6ea1SDimitry Andric RVVType *ReturnType = Sigs[0]; 421*0fca6ea1SDimitry Andric QualType RetType = RVVType2Qual(Context, ReturnType); 422*0fca6ea1SDimitry Andric SmallVector<QualType, 8> ArgTypes; 423*0fca6ea1SDimitry Andric QualType BuiltinFuncType; 424*0fca6ea1SDimitry Andric 425*0fca6ea1SDimitry Andric // Skip return type, and convert RVVType to QualType for arguments. 426*0fca6ea1SDimitry Andric for (size_t i = 1; i < SigLength; ++i) 427*0fca6ea1SDimitry Andric ArgTypes.push_back(RVVType2Qual(Context, Sigs[i])); 428*0fca6ea1SDimitry Andric 429*0fca6ea1SDimitry Andric FunctionProtoType::ExtProtoInfo PI( 430*0fca6ea1SDimitry Andric Context.getDefaultCallingConvention(false, false, true)); 431*0fca6ea1SDimitry Andric 432*0fca6ea1SDimitry Andric PI.Variadic = false; 433*0fca6ea1SDimitry Andric 434*0fca6ea1SDimitry Andric SourceLocation Loc = LR.getNameLoc(); 435*0fca6ea1SDimitry Andric BuiltinFuncType = Context.getFunctionType(RetType, ArgTypes, PI); 436*0fca6ea1SDimitry Andric DeclContext *Parent = Context.getTranslationUnitDecl(); 437*0fca6ea1SDimitry Andric 438*0fca6ea1SDimitry Andric FunctionDecl *RVVIntrinsicDecl = FunctionDecl::Create( 439*0fca6ea1SDimitry Andric Context, Parent, Loc, Loc, II, BuiltinFuncType, /*TInfo=*/nullptr, 440*0fca6ea1SDimitry Andric SC_Extern, S.getCurFPFeatures().isFPConstrained(), 441*0fca6ea1SDimitry Andric /*isInlineSpecified*/ false, 442*0fca6ea1SDimitry Andric /*hasWrittenPrototype*/ true); 443*0fca6ea1SDimitry Andric 444*0fca6ea1SDimitry Andric // Create Decl objects for each parameter, adding them to the 445*0fca6ea1SDimitry Andric // FunctionDecl. 446*0fca6ea1SDimitry Andric const auto *FP = cast<FunctionProtoType>(BuiltinFuncType); 447*0fca6ea1SDimitry Andric SmallVector<ParmVarDecl *, 8> ParmList; 448*0fca6ea1SDimitry Andric for (unsigned IParm = 0, E = FP->getNumParams(); IParm != E; ++IParm) { 449*0fca6ea1SDimitry Andric ParmVarDecl *Parm = 450*0fca6ea1SDimitry Andric ParmVarDecl::Create(Context, RVVIntrinsicDecl, Loc, Loc, nullptr, 451*0fca6ea1SDimitry Andric FP->getParamType(IParm), nullptr, SC_None, nullptr); 452*0fca6ea1SDimitry Andric Parm->setScopeInfo(0, IParm); 453*0fca6ea1SDimitry Andric ParmList.push_back(Parm); 454*0fca6ea1SDimitry Andric } 455*0fca6ea1SDimitry Andric RVVIntrinsicDecl->setParams(ParmList); 456*0fca6ea1SDimitry Andric 457*0fca6ea1SDimitry Andric // Add function attributes. 458*0fca6ea1SDimitry Andric if (IsOverload) 459*0fca6ea1SDimitry Andric RVVIntrinsicDecl->addAttr(OverloadableAttr::CreateImplicit(Context)); 460*0fca6ea1SDimitry Andric 461*0fca6ea1SDimitry Andric // Setup alias to __builtin_rvv_* 462*0fca6ea1SDimitry Andric IdentifierInfo &IntrinsicII = 463*0fca6ea1SDimitry Andric PP.getIdentifierTable().get("__builtin_rvv_" + IDef.BuiltinName); 464*0fca6ea1SDimitry Andric RVVIntrinsicDecl->addAttr( 465*0fca6ea1SDimitry Andric BuiltinAliasAttr::CreateImplicit(S.Context, &IntrinsicII)); 466*0fca6ea1SDimitry Andric 467*0fca6ea1SDimitry Andric // Add to symbol table. 468*0fca6ea1SDimitry Andric LR.addDecl(RVVIntrinsicDecl); 469*0fca6ea1SDimitry Andric } 470*0fca6ea1SDimitry Andric 471*0fca6ea1SDimitry Andric bool RISCVIntrinsicManagerImpl::CreateIntrinsicIfFound(LookupResult &LR, 472*0fca6ea1SDimitry Andric IdentifierInfo *II, 473*0fca6ea1SDimitry Andric Preprocessor &PP) { 474*0fca6ea1SDimitry Andric StringRef Name = II->getName(); 475*0fca6ea1SDimitry Andric if (!Name.consume_front("__riscv_")) 476*0fca6ea1SDimitry Andric return false; 477*0fca6ea1SDimitry Andric 478*0fca6ea1SDimitry Andric // Lookup the function name from the overload intrinsics first. 479*0fca6ea1SDimitry Andric auto OvIItr = OverloadIntrinsics.find(Name); 480*0fca6ea1SDimitry Andric if (OvIItr != OverloadIntrinsics.end()) { 481*0fca6ea1SDimitry Andric const RVVOverloadIntrinsicDef &OvIntrinsicDef = OvIItr->second; 482*0fca6ea1SDimitry Andric for (auto Index : OvIntrinsicDef.Indexes) 483*0fca6ea1SDimitry Andric CreateRVVIntrinsicDecl(LR, II, PP, Index, 484*0fca6ea1SDimitry Andric /*IsOverload*/ true); 485*0fca6ea1SDimitry Andric 486*0fca6ea1SDimitry Andric // If we added overloads, need to resolve the lookup result. 487*0fca6ea1SDimitry Andric LR.resolveKind(); 488*0fca6ea1SDimitry Andric return true; 489*0fca6ea1SDimitry Andric } 490*0fca6ea1SDimitry Andric 491*0fca6ea1SDimitry Andric // Lookup the function name from the intrinsics. 492*0fca6ea1SDimitry Andric auto Itr = Intrinsics.find(Name); 493*0fca6ea1SDimitry Andric if (Itr != Intrinsics.end()) { 494*0fca6ea1SDimitry Andric CreateRVVIntrinsicDecl(LR, II, PP, Itr->second, 495*0fca6ea1SDimitry Andric /*IsOverload*/ false); 496*0fca6ea1SDimitry Andric return true; 497*0fca6ea1SDimitry Andric } 498*0fca6ea1SDimitry Andric 499*0fca6ea1SDimitry Andric // It's not an RVV intrinsics. 500*0fca6ea1SDimitry Andric return false; 501*0fca6ea1SDimitry Andric } 502*0fca6ea1SDimitry Andric 503*0fca6ea1SDimitry Andric namespace clang { 504*0fca6ea1SDimitry Andric std::unique_ptr<clang::sema::RISCVIntrinsicManager> 505*0fca6ea1SDimitry Andric CreateRISCVIntrinsicManager(Sema &S) { 506*0fca6ea1SDimitry Andric return std::make_unique<RISCVIntrinsicManagerImpl>(S); 507*0fca6ea1SDimitry Andric } 508*0fca6ea1SDimitry Andric 509*0fca6ea1SDimitry Andric bool SemaRISCV::CheckLMUL(CallExpr *TheCall, unsigned ArgNum) { 510*0fca6ea1SDimitry Andric llvm::APSInt Result; 511*0fca6ea1SDimitry Andric 512*0fca6ea1SDimitry Andric // We can't check the value of a dependent argument. 513*0fca6ea1SDimitry Andric Expr *Arg = TheCall->getArg(ArgNum); 514*0fca6ea1SDimitry Andric if (Arg->isTypeDependent() || Arg->isValueDependent()) 515*0fca6ea1SDimitry Andric return false; 516*0fca6ea1SDimitry Andric 517*0fca6ea1SDimitry Andric // Check constant-ness first. 518*0fca6ea1SDimitry Andric if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result)) 519*0fca6ea1SDimitry Andric return true; 520*0fca6ea1SDimitry Andric 521*0fca6ea1SDimitry Andric int64_t Val = Result.getSExtValue(); 522*0fca6ea1SDimitry Andric if ((Val >= 0 && Val <= 3) || (Val >= 5 && Val <= 7)) 523*0fca6ea1SDimitry Andric return false; 524*0fca6ea1SDimitry Andric 525*0fca6ea1SDimitry Andric return Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_invalid_lmul) 526*0fca6ea1SDimitry Andric << Arg->getSourceRange(); 527*0fca6ea1SDimitry Andric } 528*0fca6ea1SDimitry Andric 529*0fca6ea1SDimitry Andric static bool CheckInvalidVLENandLMUL(const TargetInfo &TI, CallExpr *TheCall, 530*0fca6ea1SDimitry Andric Sema &S, QualType Type, int EGW) { 531*0fca6ea1SDimitry Andric assert((EGW == 128 || EGW == 256) && "EGW can only be 128 or 256 bits"); 532*0fca6ea1SDimitry Andric 533*0fca6ea1SDimitry Andric // LMUL * VLEN >= EGW 534*0fca6ea1SDimitry Andric ASTContext::BuiltinVectorTypeInfo Info = 535*0fca6ea1SDimitry Andric S.Context.getBuiltinVectorTypeInfo(Type->castAs<BuiltinType>()); 536*0fca6ea1SDimitry Andric unsigned ElemSize = S.Context.getTypeSize(Info.ElementType); 537*0fca6ea1SDimitry Andric unsigned MinElemCount = Info.EC.getKnownMinValue(); 538*0fca6ea1SDimitry Andric 539*0fca6ea1SDimitry Andric unsigned EGS = EGW / ElemSize; 540*0fca6ea1SDimitry Andric // If EGS is less than or equal to the minimum number of elements, then the 541*0fca6ea1SDimitry Andric // type is valid. 542*0fca6ea1SDimitry Andric if (EGS <= MinElemCount) 543*0fca6ea1SDimitry Andric return false; 544*0fca6ea1SDimitry Andric 545*0fca6ea1SDimitry Andric // Otherwise, we need vscale to be at least EGS / MinElemCont. 546*0fca6ea1SDimitry Andric assert(EGS % MinElemCount == 0); 547*0fca6ea1SDimitry Andric unsigned VScaleFactor = EGS / MinElemCount; 548*0fca6ea1SDimitry Andric // Vscale is VLEN/RVVBitsPerBlock. 549*0fca6ea1SDimitry Andric unsigned MinRequiredVLEN = VScaleFactor * llvm::RISCV::RVVBitsPerBlock; 550*0fca6ea1SDimitry Andric std::string RequiredExt = "zvl" + std::to_string(MinRequiredVLEN) + "b"; 551*0fca6ea1SDimitry Andric if (!TI.hasFeature(RequiredExt)) 552*0fca6ea1SDimitry Andric return S.Diag(TheCall->getBeginLoc(), 553*0fca6ea1SDimitry Andric diag::err_riscv_type_requires_extension) 554*0fca6ea1SDimitry Andric << Type << RequiredExt; 555*0fca6ea1SDimitry Andric 556*0fca6ea1SDimitry Andric return false; 557*0fca6ea1SDimitry Andric } 558*0fca6ea1SDimitry Andric 559*0fca6ea1SDimitry Andric bool SemaRISCV::CheckBuiltinFunctionCall(const TargetInfo &TI, 560*0fca6ea1SDimitry Andric unsigned BuiltinID, 561*0fca6ea1SDimitry Andric CallExpr *TheCall) { 562*0fca6ea1SDimitry Andric ASTContext &Context = getASTContext(); 563*0fca6ea1SDimitry Andric // vmulh.vv, vmulh.vx, vmulhu.vv, vmulhu.vx, vmulhsu.vv, vmulhsu.vx, 564*0fca6ea1SDimitry Andric // vsmul.vv, vsmul.vx are not included for EEW=64 in Zve64*. 565*0fca6ea1SDimitry Andric switch (BuiltinID) { 566*0fca6ea1SDimitry Andric default: 567*0fca6ea1SDimitry Andric break; 568*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vv: 569*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vx: 570*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tu: 571*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tu: 572*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vv_m: 573*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vx_m: 574*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vv_mu: 575*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vx_mu: 576*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tum: 577*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tum: 578*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tumu: 579*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tumu: 580*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vv: 581*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vx: 582*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vv_tu: 583*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vx_tu: 584*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vv_m: 585*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vx_m: 586*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vv_mu: 587*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vx_mu: 588*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vv_tum: 589*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vx_tum: 590*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vv_tumu: 591*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulhu_vx_tumu: 592*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vv: 593*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vx: 594*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vv_tu: 595*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vx_tu: 596*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vv_m: 597*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vx_m: 598*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vv_mu: 599*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vx_mu: 600*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vv_tum: 601*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vx_tum: 602*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vv_tumu: 603*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vmulh_vx_tumu: 604*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv: 605*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx: 606*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_tu: 607*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_tu: 608*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_m: 609*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_m: 610*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_mu: 611*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_mu: 612*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_tum: 613*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_tum: 614*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu: 615*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu: { 616*0fca6ea1SDimitry Andric ASTContext::BuiltinVectorTypeInfo Info = Context.getBuiltinVectorTypeInfo( 617*0fca6ea1SDimitry Andric TheCall->getType()->castAs<BuiltinType>()); 618*0fca6ea1SDimitry Andric 619*0fca6ea1SDimitry Andric if (Context.getTypeSize(Info.ElementType) == 64 && !TI.hasFeature("v")) 620*0fca6ea1SDimitry Andric return Diag(TheCall->getBeginLoc(), 621*0fca6ea1SDimitry Andric diag::err_riscv_builtin_requires_extension) 622*0fca6ea1SDimitry Andric << /* IsExtension */ true << TheCall->getSourceRange() << "v"; 623*0fca6ea1SDimitry Andric 624*0fca6ea1SDimitry Andric break; 625*0fca6ea1SDimitry Andric } 626*0fca6ea1SDimitry Andric } 627*0fca6ea1SDimitry Andric 628*0fca6ea1SDimitry Andric switch (BuiltinID) { 629*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsetvli: 630*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3) || 631*0fca6ea1SDimitry Andric CheckLMUL(TheCall, 2); 632*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsetvlimax: 633*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 634*0fca6ea1SDimitry Andric CheckLMUL(TheCall, 1); 635*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vget_v: { 636*0fca6ea1SDimitry Andric ASTContext::BuiltinVectorTypeInfo ResVecInfo = 637*0fca6ea1SDimitry Andric Context.getBuiltinVectorTypeInfo(cast<BuiltinType>( 638*0fca6ea1SDimitry Andric TheCall->getType().getCanonicalType().getTypePtr())); 639*0fca6ea1SDimitry Andric ASTContext::BuiltinVectorTypeInfo VecInfo = 640*0fca6ea1SDimitry Andric Context.getBuiltinVectorTypeInfo(cast<BuiltinType>( 641*0fca6ea1SDimitry Andric TheCall->getArg(0)->getType().getCanonicalType().getTypePtr())); 642*0fca6ea1SDimitry Andric unsigned MaxIndex; 643*0fca6ea1SDimitry Andric if (VecInfo.NumVectors != 1) // vget for tuple type 644*0fca6ea1SDimitry Andric MaxIndex = VecInfo.NumVectors; 645*0fca6ea1SDimitry Andric else // vget for non-tuple type 646*0fca6ea1SDimitry Andric MaxIndex = (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors) / 647*0fca6ea1SDimitry Andric (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors); 648*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1); 649*0fca6ea1SDimitry Andric } 650*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vset_v: { 651*0fca6ea1SDimitry Andric ASTContext::BuiltinVectorTypeInfo ResVecInfo = 652*0fca6ea1SDimitry Andric Context.getBuiltinVectorTypeInfo(cast<BuiltinType>( 653*0fca6ea1SDimitry Andric TheCall->getType().getCanonicalType().getTypePtr())); 654*0fca6ea1SDimitry Andric ASTContext::BuiltinVectorTypeInfo VecInfo = 655*0fca6ea1SDimitry Andric Context.getBuiltinVectorTypeInfo(cast<BuiltinType>( 656*0fca6ea1SDimitry Andric TheCall->getArg(2)->getType().getCanonicalType().getTypePtr())); 657*0fca6ea1SDimitry Andric unsigned MaxIndex; 658*0fca6ea1SDimitry Andric if (ResVecInfo.NumVectors != 1) // vset for tuple type 659*0fca6ea1SDimitry Andric MaxIndex = ResVecInfo.NumVectors; 660*0fca6ea1SDimitry Andric else // vset fo non-tuple type 661*0fca6ea1SDimitry Andric MaxIndex = (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors) / 662*0fca6ea1SDimitry Andric (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors); 663*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1); 664*0fca6ea1SDimitry Andric } 665*0fca6ea1SDimitry Andric // Vector Crypto 666*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaeskf1_vi_tu: 667*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaeskf2_vi_tu: 668*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaeskf2_vi: 669*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsm4k_vi_tu: { 670*0fca6ea1SDimitry Andric QualType Op1Type = TheCall->getArg(0)->getType(); 671*0fca6ea1SDimitry Andric QualType Op2Type = TheCall->getArg(1)->getType(); 672*0fca6ea1SDimitry Andric return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) || 673*0fca6ea1SDimitry Andric CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type, 128) || 674*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31); 675*0fca6ea1SDimitry Andric } 676*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsm3c_vi_tu: 677*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsm3c_vi: { 678*0fca6ea1SDimitry Andric QualType Op1Type = TheCall->getArg(0)->getType(); 679*0fca6ea1SDimitry Andric return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 256) || 680*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31); 681*0fca6ea1SDimitry Andric } 682*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaeskf1_vi: 683*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsm4k_vi: { 684*0fca6ea1SDimitry Andric QualType Op1Type = TheCall->getArg(0)->getType(); 685*0fca6ea1SDimitry Andric return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) || 686*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31); 687*0fca6ea1SDimitry Andric } 688*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesdf_vv: 689*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesdf_vs: 690*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesdm_vv: 691*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesdm_vs: 692*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesef_vv: 693*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesef_vs: 694*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesem_vv: 695*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesem_vs: 696*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesz_vs: 697*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsm4r_vv: 698*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsm4r_vs: 699*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesdf_vv_tu: 700*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesdf_vs_tu: 701*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesdm_vv_tu: 702*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesdm_vs_tu: 703*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesef_vv_tu: 704*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesef_vs_tu: 705*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesem_vv_tu: 706*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesem_vs_tu: 707*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaesz_vs_tu: 708*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsm4r_vv_tu: 709*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsm4r_vs_tu: { 710*0fca6ea1SDimitry Andric QualType Op1Type = TheCall->getArg(0)->getType(); 711*0fca6ea1SDimitry Andric QualType Op2Type = TheCall->getArg(1)->getType(); 712*0fca6ea1SDimitry Andric return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) || 713*0fca6ea1SDimitry Andric CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type, 128); 714*0fca6ea1SDimitry Andric } 715*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsha2ch_vv: 716*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsha2cl_vv: 717*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsha2ms_vv: 718*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsha2ch_vv_tu: 719*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsha2cl_vv_tu: 720*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsha2ms_vv_tu: { 721*0fca6ea1SDimitry Andric QualType Op1Type = TheCall->getArg(0)->getType(); 722*0fca6ea1SDimitry Andric QualType Op2Type = TheCall->getArg(1)->getType(); 723*0fca6ea1SDimitry Andric QualType Op3Type = TheCall->getArg(2)->getType(); 724*0fca6ea1SDimitry Andric ASTContext::BuiltinVectorTypeInfo Info = 725*0fca6ea1SDimitry Andric Context.getBuiltinVectorTypeInfo(Op1Type->castAs<BuiltinType>()); 726*0fca6ea1SDimitry Andric uint64_t ElemSize = Context.getTypeSize(Info.ElementType); 727*0fca6ea1SDimitry Andric if (ElemSize == 64 && !TI.hasFeature("zvknhb")) 728*0fca6ea1SDimitry Andric return Diag(TheCall->getBeginLoc(), 729*0fca6ea1SDimitry Andric diag::err_riscv_builtin_requires_extension) 730*0fca6ea1SDimitry Andric << /* IsExtension */ true << TheCall->getSourceRange() << "zvknb"; 731*0fca6ea1SDimitry Andric 732*0fca6ea1SDimitry Andric return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 733*0fca6ea1SDimitry Andric ElemSize * 4) || 734*0fca6ea1SDimitry Andric CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type, 735*0fca6ea1SDimitry Andric ElemSize * 4) || 736*0fca6ea1SDimitry Andric CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op3Type, ElemSize * 4); 737*0fca6ea1SDimitry Andric } 738*0fca6ea1SDimitry Andric 739*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_i_se: 740*0fca6ea1SDimitry Andric // bit_27_26, bit_24_20, bit_11_7, simm5, sew, log2lmul 741*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 742*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) || 743*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) || 744*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15) || 745*0fca6ea1SDimitry Andric CheckLMUL(TheCall, 5); 746*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_iv_se: 747*0fca6ea1SDimitry Andric // bit_27_26, bit_11_7, vs2, simm5 748*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 749*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) || 750*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15); 751*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_i: 752*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_i_se: 753*0fca6ea1SDimitry Andric // bit_27_26, bit_24_20, simm5 754*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 755*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) || 756*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15); 757*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_iv: 758*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_iv_se: 759*0fca6ea1SDimitry Andric // bit_27_26, vs2, simm5 760*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 761*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15); 762*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_ivv_se: 763*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_ivw_se: 764*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv: 765*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw: 766*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv_se: 767*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw_se: 768*0fca6ea1SDimitry Andric // bit_27_26, vd, vs2, simm5 769*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 770*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15); 771*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_x_se: 772*0fca6ea1SDimitry Andric // bit_27_26, bit_24_20, bit_11_7, xs1, sew, log2lmul 773*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 774*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) || 775*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) || 776*0fca6ea1SDimitry Andric CheckLMUL(TheCall, 5); 777*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_xv_se: 778*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_vv_se: 779*0fca6ea1SDimitry Andric // bit_27_26, bit_11_7, vs2, xs1/vs1 780*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_x: 781*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_x_se: 782*0fca6ea1SDimitry Andric // bit_27_26, bit_24-20, xs1 783*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) || 784*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31); 785*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_vvv_se: 786*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_xvv_se: 787*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_vvw_se: 788*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_xvw_se: 789*0fca6ea1SDimitry Andric // bit_27_26, vd, vs2, xs1 790*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_xv: 791*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_vv: 792*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_xv_se: 793*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_vv_se: 794*0fca6ea1SDimitry Andric // bit_27_26, vs2, xs1/vs1 795*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv: 796*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv: 797*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw: 798*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw: 799*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv_se: 800*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv_se: 801*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw_se: 802*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw_se: 803*0fca6ea1SDimitry Andric // bit_27_26, vd, vs2, xs1/vs1 804*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3); 805*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_fv_se: 806*0fca6ea1SDimitry Andric // bit_26, bit_11_7, vs2, fs1 807*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1) || 808*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31); 809*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_fvv_se: 810*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_fvw_se: 811*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv: 812*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw: 813*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv_se: 814*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw_se: 815*0fca6ea1SDimitry Andric // bit_26, vd, vs2, fs1 816*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_fv: 817*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_sf_vc_v_fv_se: 818*0fca6ea1SDimitry Andric // bit_26, vs2, fs1 819*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1); 820*0fca6ea1SDimitry Andric // Check if byteselect is in [0, 3] 821*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_aes32dsi: 822*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_aes32dsmi: 823*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_aes32esi: 824*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_aes32esmi: 825*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_sm4ks: 826*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_sm4ed: 827*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3); 828*0fca6ea1SDimitry Andric // Check if rnum is in [0, 10] 829*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_aes64ks1i: 830*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 10); 831*0fca6ea1SDimitry Andric // Check if value range for vxrm is in [0, 3] 832*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vv: 833*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vx: 834*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vv: 835*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vx: 836*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vv: 837*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vx: 838*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vv: 839*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vx: 840*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv: 841*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx: 842*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vv: 843*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vx: 844*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vv: 845*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vx: 846*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wv: 847*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wx: 848*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wv: 849*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wx: 850*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3); 851*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vv_tu: 852*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vx_tu: 853*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vv_tu: 854*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vx_tu: 855*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vv_tu: 856*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vx_tu: 857*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vv_tu: 858*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vx_tu: 859*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_tu: 860*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_tu: 861*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vv_tu: 862*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vx_tu: 863*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vv_tu: 864*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vx_tu: 865*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wv_tu: 866*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wx_tu: 867*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wv_tu: 868*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wx_tu: 869*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vv_m: 870*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vx_m: 871*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vv_m: 872*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vx_m: 873*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vv_m: 874*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vx_m: 875*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vv_m: 876*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vx_m: 877*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_m: 878*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_m: 879*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vv_m: 880*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vx_m: 881*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vv_m: 882*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vx_m: 883*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wv_m: 884*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wx_m: 885*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wv_m: 886*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wx_m: 887*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 3); 888*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vv_tum: 889*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vv_tumu: 890*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vv_mu: 891*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vx_tum: 892*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vx_tumu: 893*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaaddu_vx_mu: 894*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vv_tum: 895*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vv_tumu: 896*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vv_mu: 897*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vx_tum: 898*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vx_tumu: 899*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vaadd_vx_mu: 900*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vv_tum: 901*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vv_tumu: 902*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vv_mu: 903*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vx_tum: 904*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vx_tumu: 905*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasubu_vx_mu: 906*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vv_tum: 907*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vv_tumu: 908*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vv_mu: 909*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vx_tum: 910*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vx_tumu: 911*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vasub_vx_mu: 912*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_mu: 913*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_mu: 914*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vv_mu: 915*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vx_mu: 916*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vv_mu: 917*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vx_mu: 918*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wv_mu: 919*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wx_mu: 920*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wv_mu: 921*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wx_mu: 922*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_tum: 923*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_tum: 924*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vv_tum: 925*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vx_tum: 926*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vv_tum: 927*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vx_tum: 928*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wv_tum: 929*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wx_tum: 930*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wv_tum: 931*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wx_tum: 932*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu: 933*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu: 934*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vv_tumu: 935*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssra_vx_tumu: 936*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vv_tumu: 937*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vssrl_vx_tumu: 938*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wv_tumu: 939*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclip_wx_tumu: 940*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wv_tumu: 941*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vnclipu_wx_tumu: 942*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 3); 943*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm: 944*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrec7_v_rm: 945*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm: 946*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm: 947*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm: 948*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm: 949*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm: 950*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm: 951*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm: 952*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm: 953*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm: 954*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm: 955*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm: 956*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 4); 957*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vv_rm: 958*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vf_rm: 959*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vv_rm: 960*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vf_rm: 961*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm: 962*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm: 963*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm: 964*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm: 965*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm: 966*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm: 967*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm: 968*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm: 969*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm: 970*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vv_rm: 971*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vf_rm: 972*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm: 973*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm: 974*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm: 975*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm: 976*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm: 977*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm: 978*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm: 979*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm: 980*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm: 981*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tu: 982*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tu: 983*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tu: 984*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tu: 985*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tu: 986*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tu: 987*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tu: 988*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tu: 989*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tu: 990*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tu: 991*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tu: 992*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tu: 993*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tu: 994*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_m: 995*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_m: 996*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_m: 997*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_m: 998*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_m: 999*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_m: 1000*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_m: 1001*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_m: 1002*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_m: 1003*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_m: 1004*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_m: 1005*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_m: 1006*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_m: 1007*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 4); 1008*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tu: 1009*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tu: 1010*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tu: 1011*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tu: 1012*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tu: 1013*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tu: 1014*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tu: 1015*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tu: 1016*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tu: 1017*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tu: 1018*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tu: 1019*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tu: 1020*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tu: 1021*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tu: 1022*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tu: 1023*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tu: 1024*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tu: 1025*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tu: 1026*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tu: 1027*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tu: 1028*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tu: 1029*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tu: 1030*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tu: 1031*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tu: 1032*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm: 1033*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm: 1034*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm: 1035*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm: 1036*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm: 1037*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm: 1038*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm: 1039*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm: 1040*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm: 1041*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm: 1042*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm: 1043*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm: 1044*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm: 1045*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm: 1046*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm: 1047*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm: 1048*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm: 1049*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm: 1050*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm: 1051*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm: 1052*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm: 1053*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm: 1054*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm: 1055*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm: 1056*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tu: 1057*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tu: 1058*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tu: 1059*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tu: 1060*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tu: 1061*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tu: 1062*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tu: 1063*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tu: 1064*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tu: 1065*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tu: 1066*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tu: 1067*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tu: 1068*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tu: 1069*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tu: 1070*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tu: 1071*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tu: 1072*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tu: 1073*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tu: 1074*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tu: 1075*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tu: 1076*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tu: 1077*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tu: 1078*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tu: 1079*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tu: 1080*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_m: 1081*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_m: 1082*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_m: 1083*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_m: 1084*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_m: 1085*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_m: 1086*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_m: 1087*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_m: 1088*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_m: 1089*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_m: 1090*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_m: 1091*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_m: 1092*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_m: 1093*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_m: 1094*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_m: 1095*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_m: 1096*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_m: 1097*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_m: 1098*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_m: 1099*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_m: 1100*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_m: 1101*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_m: 1102*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_m: 1103*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_m: 1104*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tum: 1105*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tum: 1106*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tum: 1107*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tum: 1108*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tum: 1109*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tum: 1110*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tum: 1111*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tum: 1112*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tum: 1113*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tum: 1114*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tum: 1115*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tum: 1116*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tum: 1117*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tumu: 1118*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tumu: 1119*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tumu: 1120*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tumu: 1121*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tumu: 1122*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tumu: 1123*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tumu: 1124*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tumu: 1125*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tumu: 1126*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tumu: 1127*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tumu: 1128*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tumu: 1129*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tumu: 1130*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_mu: 1131*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_mu: 1132*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_mu: 1133*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_mu: 1134*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_mu: 1135*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_mu: 1136*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_mu: 1137*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_mu: 1138*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_mu: 1139*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_mu: 1140*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_mu: 1141*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_mu: 1142*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_mu: 1143*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 4); 1144*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_m: 1145*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_m: 1146*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_m: 1147*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_m: 1148*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_m: 1149*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_m: 1150*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_m: 1151*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_m: 1152*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_m: 1153*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_m: 1154*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_m: 1155*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_m: 1156*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_m: 1157*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_m: 1158*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_m: 1159*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_m: 1160*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_m: 1161*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_m: 1162*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_m: 1163*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_m: 1164*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_m: 1165*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_m: 1166*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_m: 1167*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_m: 1168*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tum: 1169*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tum: 1170*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tum: 1171*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tum: 1172*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tum: 1173*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tum: 1174*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tum: 1175*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tum: 1176*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tum: 1177*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tum: 1178*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tum: 1179*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tum: 1180*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tum: 1181*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tum: 1182*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tum: 1183*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tum: 1184*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tum: 1185*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tum: 1186*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tum: 1187*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tum: 1188*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tum: 1189*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tum: 1190*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tum: 1191*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tum: 1192*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tum: 1193*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tum: 1194*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tum: 1195*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tum: 1196*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tum: 1197*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tum: 1198*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tum: 1199*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tum: 1200*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tum: 1201*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tum: 1202*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tum: 1203*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tum: 1204*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tum: 1205*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tum: 1206*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tum: 1207*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tum: 1208*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tum: 1209*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tum: 1210*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tum: 1211*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tum: 1212*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tum: 1213*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tum: 1214*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tum: 1215*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tum: 1216*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tumu: 1217*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tumu: 1218*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tumu: 1219*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tumu: 1220*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tumu: 1221*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tumu: 1222*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tumu: 1223*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tumu: 1224*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tumu: 1225*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tumu: 1226*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tumu: 1227*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tumu: 1228*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tumu: 1229*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tumu: 1230*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tumu: 1231*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tumu: 1232*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tumu: 1233*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tumu: 1234*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tumu: 1235*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tumu: 1236*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tumu: 1237*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tumu: 1238*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tumu: 1239*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tumu: 1240*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tumu: 1241*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tumu: 1242*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tumu: 1243*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tumu: 1244*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tumu: 1245*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tumu: 1246*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tumu: 1247*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tumu: 1248*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tumu: 1249*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tumu: 1250*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tumu: 1251*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tumu: 1252*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tumu: 1253*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tumu: 1254*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tumu: 1255*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tumu: 1256*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tumu: 1257*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tumu: 1258*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tumu: 1259*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tumu: 1260*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_mu: 1261*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_mu: 1262*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_mu: 1263*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_mu: 1264*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_mu: 1265*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_mu: 1266*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_mu: 1267*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_mu: 1268*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_mu: 1269*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_mu: 1270*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_mu: 1271*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_mu: 1272*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_mu: 1273*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_mu: 1274*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_mu: 1275*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_mu: 1276*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_mu: 1277*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_mu: 1278*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_mu: 1279*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_mu: 1280*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_mu: 1281*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_mu: 1282*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_mu: 1283*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_mu: 1284*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_mu: 1285*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_mu: 1286*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_mu: 1287*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_mu: 1288*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_mu: 1289*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_mu: 1290*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_mu: 1291*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_mu: 1292*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_mu: 1293*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_mu: 1294*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_mu: 1295*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_mu: 1296*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_mu: 1297*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_mu: 1298*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_mu: 1299*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_mu: 1300*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_mu: 1301*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_mu: 1302*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_mu: 1303*0fca6ea1SDimitry Andric case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_mu: 1304*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 4); 1305*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_ntl_load: 1306*0fca6ea1SDimitry Andric case RISCV::BI__builtin_riscv_ntl_store: 1307*0fca6ea1SDimitry Andric DeclRefExpr *DRE = 1308*0fca6ea1SDimitry Andric cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts()); 1309*0fca6ea1SDimitry Andric assert((BuiltinID == RISCV::BI__builtin_riscv_ntl_store || 1310*0fca6ea1SDimitry Andric BuiltinID == RISCV::BI__builtin_riscv_ntl_load) && 1311*0fca6ea1SDimitry Andric "Unexpected RISC-V nontemporal load/store builtin!"); 1312*0fca6ea1SDimitry Andric bool IsStore = BuiltinID == RISCV::BI__builtin_riscv_ntl_store; 1313*0fca6ea1SDimitry Andric unsigned NumArgs = IsStore ? 3 : 2; 1314*0fca6ea1SDimitry Andric 1315*0fca6ea1SDimitry Andric if (SemaRef.checkArgCountAtLeast(TheCall, NumArgs - 1)) 1316*0fca6ea1SDimitry Andric return true; 1317*0fca6ea1SDimitry Andric 1318*0fca6ea1SDimitry Andric if (SemaRef.checkArgCountAtMost(TheCall, NumArgs)) 1319*0fca6ea1SDimitry Andric return true; 1320*0fca6ea1SDimitry Andric 1321*0fca6ea1SDimitry Andric // Domain value should be compile-time constant. 1322*0fca6ea1SDimitry Andric // 2 <= domain <= 5 1323*0fca6ea1SDimitry Andric if (TheCall->getNumArgs() == NumArgs && 1324*0fca6ea1SDimitry Andric SemaRef.BuiltinConstantArgRange(TheCall, NumArgs - 1, 2, 5)) 1325*0fca6ea1SDimitry Andric return true; 1326*0fca6ea1SDimitry Andric 1327*0fca6ea1SDimitry Andric Expr *PointerArg = TheCall->getArg(0); 1328*0fca6ea1SDimitry Andric ExprResult PointerArgResult = 1329*0fca6ea1SDimitry Andric SemaRef.DefaultFunctionArrayLvalueConversion(PointerArg); 1330*0fca6ea1SDimitry Andric 1331*0fca6ea1SDimitry Andric if (PointerArgResult.isInvalid()) 1332*0fca6ea1SDimitry Andric return true; 1333*0fca6ea1SDimitry Andric PointerArg = PointerArgResult.get(); 1334*0fca6ea1SDimitry Andric 1335*0fca6ea1SDimitry Andric const PointerType *PtrType = PointerArg->getType()->getAs<PointerType>(); 1336*0fca6ea1SDimitry Andric if (!PtrType) { 1337*0fca6ea1SDimitry Andric Diag(DRE->getBeginLoc(), diag::err_nontemporal_builtin_must_be_pointer) 1338*0fca6ea1SDimitry Andric << PointerArg->getType() << PointerArg->getSourceRange(); 1339*0fca6ea1SDimitry Andric return true; 1340*0fca6ea1SDimitry Andric } 1341*0fca6ea1SDimitry Andric 1342*0fca6ea1SDimitry Andric QualType ValType = PtrType->getPointeeType(); 1343*0fca6ea1SDimitry Andric ValType = ValType.getUnqualifiedType(); 1344*0fca6ea1SDimitry Andric if (!ValType->isIntegerType() && !ValType->isAnyPointerType() && 1345*0fca6ea1SDimitry Andric !ValType->isBlockPointerType() && !ValType->isFloatingType() && 1346*0fca6ea1SDimitry Andric !ValType->isVectorType() && !ValType->isRVVSizelessBuiltinType()) { 1347*0fca6ea1SDimitry Andric Diag(DRE->getBeginLoc(), 1348*0fca6ea1SDimitry Andric diag::err_nontemporal_builtin_must_be_pointer_intfltptr_or_vector) 1349*0fca6ea1SDimitry Andric << PointerArg->getType() << PointerArg->getSourceRange(); 1350*0fca6ea1SDimitry Andric return true; 1351*0fca6ea1SDimitry Andric } 1352*0fca6ea1SDimitry Andric 1353*0fca6ea1SDimitry Andric if (!IsStore) { 1354*0fca6ea1SDimitry Andric TheCall->setType(ValType); 1355*0fca6ea1SDimitry Andric return false; 1356*0fca6ea1SDimitry Andric } 1357*0fca6ea1SDimitry Andric 1358*0fca6ea1SDimitry Andric ExprResult ValArg = TheCall->getArg(1); 1359*0fca6ea1SDimitry Andric InitializedEntity Entity = InitializedEntity::InitializeParameter( 1360*0fca6ea1SDimitry Andric Context, ValType, /*consume*/ false); 1361*0fca6ea1SDimitry Andric ValArg = 1362*0fca6ea1SDimitry Andric SemaRef.PerformCopyInitialization(Entity, SourceLocation(), ValArg); 1363*0fca6ea1SDimitry Andric if (ValArg.isInvalid()) 1364*0fca6ea1SDimitry Andric return true; 1365*0fca6ea1SDimitry Andric 1366*0fca6ea1SDimitry Andric TheCall->setArg(1, ValArg.get()); 1367*0fca6ea1SDimitry Andric TheCall->setType(Context.VoidTy); 1368*0fca6ea1SDimitry Andric return false; 1369*0fca6ea1SDimitry Andric } 1370*0fca6ea1SDimitry Andric 1371*0fca6ea1SDimitry Andric return false; 1372*0fca6ea1SDimitry Andric } 1373*0fca6ea1SDimitry Andric 1374*0fca6ea1SDimitry Andric void SemaRISCV::checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D, 1375*0fca6ea1SDimitry Andric const llvm::StringMap<bool> &FeatureMap) { 1376*0fca6ea1SDimitry Andric ASTContext::BuiltinVectorTypeInfo Info = 1377*0fca6ea1SDimitry Andric SemaRef.Context.getBuiltinVectorTypeInfo(Ty->castAs<BuiltinType>()); 1378*0fca6ea1SDimitry Andric unsigned EltSize = SemaRef.Context.getTypeSize(Info.ElementType); 1379*0fca6ea1SDimitry Andric unsigned MinElts = Info.EC.getKnownMinValue(); 1380*0fca6ea1SDimitry Andric 1381*0fca6ea1SDimitry Andric if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Double) && 1382*0fca6ea1SDimitry Andric !FeatureMap.lookup("zve64d")) 1383*0fca6ea1SDimitry Andric Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve64d"; 1384*0fca6ea1SDimitry Andric // (ELEN, LMUL) pairs of (8, mf8), (16, mf4), (32, mf2), (64, m1) requires at 1385*0fca6ea1SDimitry Andric // least zve64x 1386*0fca6ea1SDimitry Andric else if (((EltSize == 64 && Info.ElementType->isIntegerType()) || 1387*0fca6ea1SDimitry Andric MinElts == 1) && 1388*0fca6ea1SDimitry Andric !FeatureMap.lookup("zve64x")) 1389*0fca6ea1SDimitry Andric Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve64x"; 1390*0fca6ea1SDimitry Andric else if (Info.ElementType->isFloat16Type() && !FeatureMap.lookup("zvfh") && 1391*0fca6ea1SDimitry Andric !FeatureMap.lookup("zvfhmin")) 1392*0fca6ea1SDimitry Andric Diag(Loc, diag::err_riscv_type_requires_extension, D) 1393*0fca6ea1SDimitry Andric << Ty << "zvfh or zvfhmin"; 1394*0fca6ea1SDimitry Andric else if (Info.ElementType->isBFloat16Type() && !FeatureMap.lookup("zvfbfmin")) 1395*0fca6ea1SDimitry Andric Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zvfbfmin"; 1396*0fca6ea1SDimitry Andric else if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Float) && 1397*0fca6ea1SDimitry Andric !FeatureMap.lookup("zve32f")) 1398*0fca6ea1SDimitry Andric Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve32f"; 1399*0fca6ea1SDimitry Andric // Given that caller already checked isRVVType() before calling this function, 1400*0fca6ea1SDimitry Andric // if we don't have at least zve32x supported, then we need to emit error. 1401*0fca6ea1SDimitry Andric else if (!FeatureMap.lookup("zve32x")) 1402*0fca6ea1SDimitry Andric Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve32x"; 1403*0fca6ea1SDimitry Andric } 1404*0fca6ea1SDimitry Andric 1405*0fca6ea1SDimitry Andric /// Are the two types RVV-bitcast-compatible types? I.e. is bitcasting from the 1406*0fca6ea1SDimitry Andric /// first RVV type (e.g. an RVV scalable type) to the second type (e.g. an RVV 1407*0fca6ea1SDimitry Andric /// VLS type) allowed? 1408*0fca6ea1SDimitry Andric /// 1409*0fca6ea1SDimitry Andric /// This will also return false if the two given types do not make sense from 1410*0fca6ea1SDimitry Andric /// the perspective of RVV bitcasts. 1411*0fca6ea1SDimitry Andric bool SemaRISCV::isValidRVVBitcast(QualType srcTy, QualType destTy) { 1412*0fca6ea1SDimitry Andric assert(srcTy->isVectorType() || destTy->isVectorType()); 1413*0fca6ea1SDimitry Andric 1414*0fca6ea1SDimitry Andric auto ValidScalableConversion = [](QualType FirstType, QualType SecondType) { 1415*0fca6ea1SDimitry Andric if (!FirstType->isRVVSizelessBuiltinType()) 1416*0fca6ea1SDimitry Andric return false; 1417*0fca6ea1SDimitry Andric 1418*0fca6ea1SDimitry Andric const auto *VecTy = SecondType->getAs<VectorType>(); 1419*0fca6ea1SDimitry Andric return VecTy && VecTy->getVectorKind() == VectorKind::RVVFixedLengthData; 1420*0fca6ea1SDimitry Andric }; 1421*0fca6ea1SDimitry Andric 1422*0fca6ea1SDimitry Andric return ValidScalableConversion(srcTy, destTy) || 1423*0fca6ea1SDimitry Andric ValidScalableConversion(destTy, srcTy); 1424*0fca6ea1SDimitry Andric } 1425*0fca6ea1SDimitry Andric 1426*0fca6ea1SDimitry Andric void SemaRISCV::handleInterruptAttr(Decl *D, const ParsedAttr &AL) { 1427*0fca6ea1SDimitry Andric // Warn about repeated attributes. 1428*0fca6ea1SDimitry Andric if (const auto *A = D->getAttr<RISCVInterruptAttr>()) { 1429*0fca6ea1SDimitry Andric Diag(AL.getRange().getBegin(), 1430*0fca6ea1SDimitry Andric diag::warn_riscv_repeated_interrupt_attribute); 1431*0fca6ea1SDimitry Andric Diag(A->getLocation(), diag::note_riscv_repeated_interrupt_attribute); 1432*0fca6ea1SDimitry Andric return; 1433*0fca6ea1SDimitry Andric } 1434*0fca6ea1SDimitry Andric 1435*0fca6ea1SDimitry Andric // Check the attribute argument. Argument is optional. 1436*0fca6ea1SDimitry Andric if (!AL.checkAtMostNumArgs(SemaRef, 1)) 1437*0fca6ea1SDimitry Andric return; 1438*0fca6ea1SDimitry Andric 1439*0fca6ea1SDimitry Andric StringRef Str; 1440*0fca6ea1SDimitry Andric SourceLocation ArgLoc; 1441*0fca6ea1SDimitry Andric 1442*0fca6ea1SDimitry Andric // 'machine'is the default interrupt mode. 1443*0fca6ea1SDimitry Andric if (AL.getNumArgs() == 0) 1444*0fca6ea1SDimitry Andric Str = "machine"; 1445*0fca6ea1SDimitry Andric else if (!SemaRef.checkStringLiteralArgumentAttr(AL, 0, Str, &ArgLoc)) 1446*0fca6ea1SDimitry Andric return; 1447*0fca6ea1SDimitry Andric 1448*0fca6ea1SDimitry Andric // Semantic checks for a function with the 'interrupt' attribute: 1449*0fca6ea1SDimitry Andric // - Must be a function. 1450*0fca6ea1SDimitry Andric // - Must have no parameters. 1451*0fca6ea1SDimitry Andric // - Must have the 'void' return type. 1452*0fca6ea1SDimitry Andric // - The attribute itself must either have no argument or one of the 1453*0fca6ea1SDimitry Andric // valid interrupt types, see [RISCVInterruptDocs]. 1454*0fca6ea1SDimitry Andric 1455*0fca6ea1SDimitry Andric if (D->getFunctionType() == nullptr) { 1456*0fca6ea1SDimitry Andric Diag(D->getLocation(), diag::warn_attribute_wrong_decl_type) 1457*0fca6ea1SDimitry Andric << AL << AL.isRegularKeywordAttribute() << ExpectedFunction; 1458*0fca6ea1SDimitry Andric return; 1459*0fca6ea1SDimitry Andric } 1460*0fca6ea1SDimitry Andric 1461*0fca6ea1SDimitry Andric if (hasFunctionProto(D) && getFunctionOrMethodNumParams(D) != 0) { 1462*0fca6ea1SDimitry Andric Diag(D->getLocation(), diag::warn_interrupt_attribute_invalid) 1463*0fca6ea1SDimitry Andric << /*RISC-V*/ 2 << 0; 1464*0fca6ea1SDimitry Andric return; 1465*0fca6ea1SDimitry Andric } 1466*0fca6ea1SDimitry Andric 1467*0fca6ea1SDimitry Andric if (!getFunctionOrMethodResultType(D)->isVoidType()) { 1468*0fca6ea1SDimitry Andric Diag(D->getLocation(), diag::warn_interrupt_attribute_invalid) 1469*0fca6ea1SDimitry Andric << /*RISC-V*/ 2 << 1; 1470*0fca6ea1SDimitry Andric return; 1471*0fca6ea1SDimitry Andric } 1472*0fca6ea1SDimitry Andric 1473*0fca6ea1SDimitry Andric RISCVInterruptAttr::InterruptType Kind; 1474*0fca6ea1SDimitry Andric if (!RISCVInterruptAttr::ConvertStrToInterruptType(Str, Kind)) { 1475*0fca6ea1SDimitry Andric Diag(AL.getLoc(), diag::warn_attribute_type_not_supported) 1476*0fca6ea1SDimitry Andric << AL << Str << ArgLoc; 1477*0fca6ea1SDimitry Andric return; 1478*0fca6ea1SDimitry Andric } 1479*0fca6ea1SDimitry Andric 1480*0fca6ea1SDimitry Andric D->addAttr(::new (getASTContext()) 1481*0fca6ea1SDimitry Andric RISCVInterruptAttr(getASTContext(), AL, Kind)); 1482*0fca6ea1SDimitry Andric } 1483*0fca6ea1SDimitry Andric 1484*0fca6ea1SDimitry Andric bool SemaRISCV::isAliasValid(unsigned BuiltinID, StringRef AliasName) { 1485*0fca6ea1SDimitry Andric return BuiltinID >= RISCV::FirstRVVBuiltin && 1486*0fca6ea1SDimitry Andric BuiltinID <= RISCV::LastRVVBuiltin; 1487*0fca6ea1SDimitry Andric } 1488*0fca6ea1SDimitry Andric 1489*0fca6ea1SDimitry Andric SemaRISCV::SemaRISCV(Sema &S) : SemaBase(S) {} 1490*0fca6ea1SDimitry Andric 1491*0fca6ea1SDimitry Andric } // namespace clang 1492