xref: /freebsd-src/contrib/llvm-project/clang/lib/Sema/SemaRISCV.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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