clang 23.0.0git
SemaRISCV.cpp
Go to the documentation of this file.
1//===------ SemaRISCV.cpp ------- RISC-V target-specific routines ---------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements semantic analysis functions specific to RISC-V.
10//
11//===----------------------------------------------------------------------===//
12
15#include "clang/AST/Attr.h"
16#include "clang/AST/Decl.h"
21#include "clang/Sema/Attr.h"
23#include "clang/Sema/Lookup.h"
26#include "clang/Sema/Sema.h"
28#include "llvm/ADT/SmallVector.h"
29#include "llvm/TargetParser/RISCVISAInfo.h"
30#include "llvm/TargetParser/RISCVTargetParser.h"
31#include <optional>
32#include <string>
33#include <vector>
34
35using namespace llvm;
36using namespace clang;
37using namespace clang::RISCV;
38
40
41namespace {
42
43// Function definition of a RVV intrinsic.
44struct RVVIntrinsicDef {
45 /// Mapping to which clang built-in function, e.g. __builtin_rvv_vadd.
46 std::string BuiltinName;
47
48 /// Mapping to RequiredFeatures in riscv_vector.td
49 StringRef RequiredExtensions;
50
51 /// Function signature, first element is return type.
52 RVVTypes Signature;
53};
54
55struct RVVOverloadIntrinsicDef {
56 // Indexes of RISCVIntrinsicManagerImpl::IntrinsicList.
58};
59
60} // namespace
61
63#define DECL_SIGNATURE_TABLE
64#include "clang/Basic/riscv_vector_builtin_sema.inc"
65#undef DECL_SIGNATURE_TABLE
66};
67
69#define DECL_SIGNATURE_TABLE
70#include "clang/Basic/riscv_sifive_vector_builtin_sema.inc"
71#undef DECL_SIGNATURE_TABLE
72};
73
75#define DECL_SIGNATURE_TABLE
76#include "clang/Basic/riscv_andes_vector_builtin_sema.inc"
77#undef DECL_SIGNATURE_TABLE
78};
79
81#define DECL_INTRINSIC_RECORDS
82#include "clang/Basic/riscv_vector_builtin_sema.inc"
83#undef DECL_INTRINSIC_RECORDS
84};
85
87#define DECL_INTRINSIC_RECORDS
88#include "clang/Basic/riscv_sifive_vector_builtin_sema.inc"
89#undef DECL_INTRINSIC_RECORDS
90};
91
93#define DECL_INTRINSIC_RECORDS
94#include "clang/Basic/riscv_andes_vector_builtin_sema.inc"
95#undef DECL_INTRINSIC_RECORDS
96};
97
98// Get subsequence of signature table.
100ProtoSeq2ArrayRef(IntrinsicKind K, uint16_t Index, uint8_t Length) {
101 switch (K) {
102 case IntrinsicKind::RVV:
103 return ArrayRef(&RVVSignatureTable[Index], Length);
104 case IntrinsicKind::SIFIVE_VECTOR:
105 return ArrayRef(&RVSiFiveVectorSignatureTable[Index], Length);
106 case IntrinsicKind::ANDES_VECTOR:
107 return ArrayRef(&RVAndesVectorSignatureTable[Index], Length);
108 }
109 llvm_unreachable("Unhandled IntrinsicKind");
110}
111
112static QualType RVVType2Qual(ASTContext &Context, const RVVType *Type) {
113 QualType QT;
114 switch (Type->getScalarType()) {
116 QT = Context.VoidTy;
117 break;
119 QT = Context.getSizeType();
120 break;
122 QT = Context.getPointerDiffType();
123 break;
125 QT = Context.UnsignedLongTy;
126 break;
128 QT = Context.LongTy;
129 break;
131 QT = Context.BoolTy;
132 break;
134 QT = Context.getIntTypeForBitwidth(Type->getElementBitwidth(), true);
135 break;
137 QT = Context.getIntTypeForBitwidth(Type->getElementBitwidth(), false);
138 break;
141 // TODO: This is a workaround code to only support OP8 RVV types without
142 // supporting scalar OFP8 types. We need to refactor after scalar types are
143 // supported.
144 assert(Type->isVector() && "Only support vector of OFP8 types.");
145 bool IsE5M2 = Type->getScalarType() == ScalarTypeKind::FloatE5M2;
146 unsigned Scale = *Type->getScale();
147#define RVV_VECTOR_TYPE_OFP8(Name, Id, SingletonId, NumEls, E5m2) \
148 if (IsE5M2 == E5m2 && Scale == NumEls) \
149 QT = Context.SingletonId;
150#include "clang/Basic/RISCVVTypes.def"
151 assert(!QT.isNull() && "Unsupported OFP8 vector type");
152 if (Type->isConstant())
153 QT = Context.getConstType(QT);
154 if (Type->isPointer())
155 QT = Context.getPointerType(QT);
156 return QT;
157 }
159 QT = Context.BFloat16Ty;
160 break;
162 switch (Type->getElementBitwidth()) {
163 case 64:
164 QT = Context.DoubleTy;
165 break;
166 case 32:
167 QT = Context.FloatTy;
168 break;
169 case 16:
170 QT = Context.Float16Ty;
171 break;
172 default:
173 llvm_unreachable("Unsupported floating point width.");
174 }
175 break;
176 case Invalid:
177 case Undefined:
178 llvm_unreachable("Unhandled type.");
179 }
180 if (Type->isVector()) {
181 if (Type->isTuple())
182 QT = Context.getScalableVectorType(QT, *Type->getScale(), Type->getNF());
183 else
184 QT = Context.getScalableVectorType(QT, *Type->getScale());
185 }
186
187 if (Type->isConstant())
188 QT = Context.getConstType(QT);
189
190 // Transform the type to a pointer as the last step, if necessary.
191 if (Type->isPointer())
192 QT = Context.getPointerType(QT);
193
194 return QT;
195}
196
197namespace {
198class RISCVIntrinsicManagerImpl : public sema::RISCVIntrinsicManager {
199private:
200 Sema &S;
201 RVVTypeCache TypeCache;
202 bool ConstructedRISCVVBuiltins;
203 bool ConstructedRISCVSiFiveVectorBuiltins;
204 bool ConstructedRISCVAndesVectorBuiltins;
205
206 // List of all RVV intrinsic.
207 std::vector<RVVIntrinsicDef> IntrinsicList;
208 // Mapping function name to index of IntrinsicList.
209 StringMap<uint32_t> Intrinsics;
210 // Mapping function name to RVVOverloadIntrinsicDef.
211 StringMap<RVVOverloadIntrinsicDef> OverloadIntrinsics;
212
213 // Create RVVIntrinsicDef.
214 void InitRVVIntrinsic(const RVVIntrinsicRecord &Record, StringRef SuffixStr,
215 StringRef OverloadedSuffixStr, bool IsMask,
216 RVVTypes &Types, bool HasPolicy, Policy PolicyAttrs);
217
218 // Create FunctionDecl for a vector intrinsic.
219 void CreateRVVIntrinsicDecl(LookupResult &LR, IdentifierInfo *II,
220 Preprocessor &PP, uint32_t Index,
221 bool IsOverload);
222
223 void ConstructRVVIntrinsics(ArrayRef<RVVIntrinsicRecord> Recs,
224 IntrinsicKind K);
225
226public:
227 RISCVIntrinsicManagerImpl(clang::Sema &S) : S(S) {
228 ConstructedRISCVVBuiltins = false;
229 ConstructedRISCVSiFiveVectorBuiltins = false;
230 ConstructedRISCVAndesVectorBuiltins = false;
231 }
232
233 // Initialize IntrinsicList
234 void InitIntrinsicList() override;
235
236 // Create RISC-V vector intrinsic and insert into symbol table if found, and
237 // return true, otherwise return false.
238 bool CreateIntrinsicIfFound(LookupResult &LR, IdentifierInfo *II,
239 Preprocessor &PP) override;
240};
241} // namespace
242
243void RISCVIntrinsicManagerImpl::ConstructRVVIntrinsics(
245 // Construction of RVVIntrinsicRecords need to sync with createRVVIntrinsics
246 // in RISCVVEmitter.cpp.
247 for (auto &Record : Recs) {
248 // Create Intrinsics for each type and LMUL.
249 BasicType BaseType = BasicType::Unknown;
250 ArrayRef<PrototypeDescriptor> BasicProtoSeq =
251 ProtoSeq2ArrayRef(K, Record.PrototypeIndex, Record.PrototypeLength);
252 ArrayRef<PrototypeDescriptor> SuffixProto =
253 ProtoSeq2ArrayRef(K, Record.SuffixIndex, Record.SuffixLength);
254 ArrayRef<PrototypeDescriptor> OverloadedSuffixProto = ProtoSeq2ArrayRef(
255 K, Record.OverloadedSuffixIndex, Record.OverloadedSuffixSize);
256
257 PolicyScheme UnMaskedPolicyScheme =
258 static_cast<PolicyScheme>(Record.UnMaskedPolicyScheme);
259 PolicyScheme MaskedPolicyScheme =
260 static_cast<PolicyScheme>(Record.MaskedPolicyScheme);
261
262 const Policy DefaultPolicy;
263
264 llvm::SmallVector<PrototypeDescriptor> ProtoSeq =
266 BasicProtoSeq, /*IsMasked=*/false,
267 /*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF,
268 UnMaskedPolicyScheme, DefaultPolicy, Record.IsTuple);
269
270 llvm::SmallVector<PrototypeDescriptor> ProtoMaskSeq;
271 if (Record.HasMasked)
273 BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand,
274 Record.HasVL, Record.NF, MaskedPolicyScheme, DefaultPolicy,
275 Record.IsTuple);
276
277 bool UnMaskedHasPolicy = UnMaskedPolicyScheme != PolicyScheme::SchemeNone;
278 bool MaskedHasPolicy = MaskedPolicyScheme != PolicyScheme::SchemeNone;
279 SmallVector<Policy> SupportedUnMaskedPolicies =
281 SmallVector<Policy> SupportedMaskedPolicies =
283 Record.HasMaskPolicy);
284
285 for (unsigned int TypeRangeMaskShift = 0;
286 TypeRangeMaskShift <= static_cast<unsigned int>(BasicType::MaxOffset);
287 ++TypeRangeMaskShift) {
288 unsigned int BaseTypeI = 1 << TypeRangeMaskShift;
289 BaseType = static_cast<BasicType>(BaseTypeI);
290
291 if ((BaseTypeI & Record.TypeRangeMask) != BaseTypeI)
292 continue;
293
294 // Expanded with different LMUL.
295 for (int Log2LMUL = -3; Log2LMUL <= 3; Log2LMUL++) {
296 if (!(Record.Log2LMULMask & (1 << (Log2LMUL + 3))))
297 continue;
298
299 std::optional<RVVTypes> Types =
300 TypeCache.computeTypes(BaseType, Log2LMUL, Record.NF, ProtoSeq);
301
302 // Ignored to create new intrinsic if there are any illegal types.
303 if (!Types.has_value())
304 continue;
305
306 std::string SuffixStr = RVVIntrinsic::getSuffixStr(
307 TypeCache, BaseType, Log2LMUL, SuffixProto);
308 std::string OverloadedSuffixStr = RVVIntrinsic::getSuffixStr(
309 TypeCache, BaseType, Log2LMUL, OverloadedSuffixProto);
310
311 // Create non-masked intrinsic.
312 InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, false, *Types,
313 UnMaskedHasPolicy, DefaultPolicy);
314
315 // Create non-masked policy intrinsic.
316 if (Record.UnMaskedPolicyScheme != PolicyScheme::SchemeNone) {
317 for (auto P : SupportedUnMaskedPolicies) {
318 llvm::SmallVector<PrototypeDescriptor> PolicyPrototype =
320 BasicProtoSeq, /*IsMasked=*/false,
321 /*HasMaskedOffOperand=*/false, Record.HasVL, Record.NF,
322 UnMaskedPolicyScheme, P, Record.IsTuple);
323 std::optional<RVVTypes> PolicyTypes = TypeCache.computeTypes(
324 BaseType, Log2LMUL, Record.NF, PolicyPrototype);
325 InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr,
326 /*IsMask=*/false, *PolicyTypes, UnMaskedHasPolicy,
327 P);
328 }
329 }
330 if (!Record.HasMasked)
331 continue;
332 // Create masked intrinsic.
333 std::optional<RVVTypes> MaskTypes =
334 TypeCache.computeTypes(BaseType, Log2LMUL, Record.NF, ProtoMaskSeq);
335 InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr, true,
336 *MaskTypes, MaskedHasPolicy, DefaultPolicy);
337 if (Record.MaskedPolicyScheme == PolicyScheme::SchemeNone)
338 continue;
339 // Create masked policy intrinsic.
340 for (auto P : SupportedMaskedPolicies) {
341 llvm::SmallVector<PrototypeDescriptor> PolicyPrototype =
343 BasicProtoSeq, /*IsMasked=*/true, Record.HasMaskedOffOperand,
344 Record.HasVL, Record.NF, MaskedPolicyScheme, P,
345 Record.IsTuple);
346 std::optional<RVVTypes> PolicyTypes = TypeCache.computeTypes(
347 BaseType, Log2LMUL, Record.NF, PolicyPrototype);
348 InitRVVIntrinsic(Record, SuffixStr, OverloadedSuffixStr,
349 /*IsMask=*/true, *PolicyTypes, MaskedHasPolicy, P);
350 }
351 } // End for different LMUL
352 } // End for different TypeRange
353 }
354}
355
356void RISCVIntrinsicManagerImpl::InitIntrinsicList() {
357
358 if (S.RISCV().DeclareRVVBuiltins && !ConstructedRISCVVBuiltins) {
359 ConstructedRISCVVBuiltins = true;
360 ConstructRVVIntrinsics(RVVIntrinsicRecords, IntrinsicKind::RVV);
361 }
363 !ConstructedRISCVSiFiveVectorBuiltins) {
364 ConstructedRISCVSiFiveVectorBuiltins = true;
365 ConstructRVVIntrinsics(RVSiFiveVectorIntrinsicRecords,
366 IntrinsicKind::SIFIVE_VECTOR);
367 }
369 !ConstructedRISCVAndesVectorBuiltins) {
370 ConstructedRISCVAndesVectorBuiltins = true;
371 ConstructRVVIntrinsics(RVAndesVectorIntrinsicRecords,
372 IntrinsicKind::ANDES_VECTOR);
373 }
374}
375
376// Compute name and signatures for intrinsic with practical types.
377void RISCVIntrinsicManagerImpl::InitRVVIntrinsic(
378 const RVVIntrinsicRecord &Record, StringRef SuffixStr,
379 StringRef OverloadedSuffixStr, bool IsMasked, RVVTypes &Signature,
380 bool HasPolicy, Policy PolicyAttrs) {
381 // Function name, e.g. vadd_vv_i32m1.
382 std::string Name = Record.Name;
383 if (!SuffixStr.empty())
384 Name += "_" + SuffixStr.str();
385
386 // Overloaded function name, e.g. vadd.
387 std::string OverloadedName;
388 if (!Record.OverloadedName)
389 OverloadedName = StringRef(Record.Name).split("_").first.str();
390 else
391 OverloadedName = Record.OverloadedName;
392 if (!OverloadedSuffixStr.empty())
393 OverloadedName += "_" + OverloadedSuffixStr.str();
394
395 // clang built-in function name, e.g. __builtin_rvv_vadd.
396 std::string BuiltinName = std::string(Record.Name);
397
398 RVVIntrinsic::updateNamesAndPolicy(IsMasked, HasPolicy, Name, BuiltinName,
399 OverloadedName, PolicyAttrs,
400 Record.HasFRMRoundModeOp, Record.AltFmt);
401
402 // Put into IntrinsicList.
403 uint32_t Index = IntrinsicList.size();
404 assert(IntrinsicList.size() == (size_t)Index &&
405 "Intrinsics indices overflow.");
406 IntrinsicList.push_back({BuiltinName, Record.RequiredExtensions, Signature});
407
408 // Creating mapping to Intrinsics.
409 Intrinsics.insert({Name, Index});
410
411 // Get the RVVOverloadIntrinsicDef.
412 RVVOverloadIntrinsicDef &OverloadIntrinsicDef =
413 OverloadIntrinsics[OverloadedName];
414
415 // And added the index.
416 OverloadIntrinsicDef.Indexes.push_back(Index);
417}
418
419void RISCVIntrinsicManagerImpl::CreateRVVIntrinsicDecl(LookupResult &LR,
420 IdentifierInfo *II,
421 Preprocessor &PP,
422 uint32_t Index,
423 bool IsOverload) {
424 ASTContext &Context = S.Context;
425 RVVIntrinsicDef &IDef = IntrinsicList[Index];
426 RVVTypes Sigs = IDef.Signature;
427 size_t SigLength = Sigs.size();
428 RVVType *ReturnType = Sigs[0];
429 QualType RetType = RVVType2Qual(Context, ReturnType);
430 SmallVector<QualType, 8> ArgTypes;
431 QualType BuiltinFuncType;
432
433 // Skip return type, and convert RVVType to QualType for arguments.
434 for (size_t i = 1; i < SigLength; ++i)
435 ArgTypes.push_back(RVVType2Qual(Context, Sigs[i]));
436
437 FunctionProtoType::ExtProtoInfo PI(
439
440 PI.Variadic = false;
441
442 SourceLocation Loc = LR.getNameLoc();
443 BuiltinFuncType = Context.getFunctionType(RetType, ArgTypes, PI);
444 DeclContext *Parent = Context.getTranslationUnitDecl();
445
446 FunctionDecl *RVVIntrinsicDecl = FunctionDecl::Create(
447 Context, Parent, Loc, Loc, II, BuiltinFuncType, /*TInfo=*/nullptr,
449 /*isInlineSpecified*/ false,
450 /*hasWrittenPrototype*/ true);
451
452 // Create Decl objects for each parameter, adding them to the
453 // FunctionDecl.
454 const auto *FP = cast<FunctionProtoType>(BuiltinFuncType);
455 SmallVector<ParmVarDecl *, 8> ParmList;
456 for (unsigned IParm = 0, E = FP->getNumParams(); IParm != E; ++IParm) {
457 ParmVarDecl *Parm =
458 ParmVarDecl::Create(Context, RVVIntrinsicDecl, Loc, Loc, nullptr,
459 FP->getParamType(IParm), nullptr, SC_None, nullptr);
460 Parm->setScopeInfo(0, IParm);
461 ParmList.push_back(Parm);
462 }
463 RVVIntrinsicDecl->setParams(ParmList);
464
465 // Add function attributes.
466 if (IsOverload)
467 RVVIntrinsicDecl->addAttr(OverloadableAttr::CreateImplicit(Context));
468
469 if (IDef.RequiredExtensions != "")
470 RVVIntrinsicDecl->addAttr(
471 TargetAttr::CreateImplicit(Context, IDef.RequiredExtensions));
472 // Setup alias to __builtin_rvv_*
473 IdentifierInfo &IntrinsicII =
474 PP.getIdentifierTable().get("__builtin_rvv_" + IDef.BuiltinName);
475 RVVIntrinsicDecl->addAttr(
476 BuiltinAliasAttr::CreateImplicit(S.Context, &IntrinsicII));
477
478 // Add to symbol table.
479 LR.addDecl(RVVIntrinsicDecl);
480}
481
482bool RISCVIntrinsicManagerImpl::CreateIntrinsicIfFound(LookupResult &LR,
483 IdentifierInfo *II,
484 Preprocessor &PP) {
485 StringRef Name = II->getName();
486 if (!Name.consume_front("__riscv_"))
487 return false;
488
489 // Lookup the function name from the overload intrinsics first.
490 auto OvIItr = OverloadIntrinsics.find(Name);
491 if (OvIItr != OverloadIntrinsics.end()) {
492 const RVVOverloadIntrinsicDef &OvIntrinsicDef = OvIItr->second;
493 for (auto Index : OvIntrinsicDef.Indexes)
494 CreateRVVIntrinsicDecl(LR, II, PP, Index,
495 /*IsOverload*/ true);
496
497 // If we added overloads, need to resolve the lookup result.
498 LR.resolveKind();
499 return true;
500 }
501
502 // Lookup the function name from the intrinsics.
503 auto Itr = Intrinsics.find(Name);
504 if (Itr != Intrinsics.end()) {
505 CreateRVVIntrinsicDecl(LR, II, PP, Itr->second,
506 /*IsOverload*/ false);
507 return true;
508 }
509
510 // It's not an RVV intrinsics.
511 return false;
512}
513
514namespace clang {
515std::unique_ptr<clang::sema::RISCVIntrinsicManager>
517 return std::make_unique<RISCVIntrinsicManagerImpl>(S);
518}
519
520bool SemaRISCV::CheckLMUL(CallExpr *TheCall, unsigned ArgNum) {
521 llvm::APSInt Result;
522
523 // We can't check the value of a dependent argument.
524 Expr *Arg = TheCall->getArg(ArgNum);
525 if (Arg->isTypeDependent() || Arg->isValueDependent())
526 return false;
527
528 // Check constant-ness first.
529 if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result))
530 return true;
531
532 int64_t Val = Result.getSExtValue();
533 if ((Val >= 0 && Val <= 3) || (Val >= 5 && Val <= 7))
534 return false;
535
536 return Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_invalid_lmul)
537 << Arg->getSourceRange();
538}
539
541 llvm::StringMap<bool> &FunctionFeatureMap,
542 CallExpr *TheCall, Sema &S, QualType Type,
543 int EGW) {
544 assert((EGW == 128 || EGW == 256) && "EGW can only be 128 or 256 bits");
545
546 // LMUL * VLEN >= EGW
549 unsigned ElemSize = S.Context.getTypeSize(Info.ElementType);
550 unsigned MinElemCount = Info.EC.getKnownMinValue();
551
552 unsigned EGS = EGW / ElemSize;
553 // If EGS is less than or equal to the minimum number of elements, then the
554 // type is valid.
555 if (EGS <= MinElemCount)
556 return false;
557
558 // Otherwise, we need vscale to be at least EGS / MinElemCont.
559 assert(EGS % MinElemCount == 0);
560 unsigned VScaleFactor = EGS / MinElemCount;
561 // Vscale is VLEN/RVVBitsPerBlock.
562 unsigned MinRequiredVLEN = VScaleFactor * llvm::RISCV::RVVBitsPerBlock;
563 std::string RequiredExt = "zvl" + std::to_string(MinRequiredVLEN) + "b";
564 if (!TI.hasFeature(RequiredExt) && !FunctionFeatureMap.lookup(RequiredExt))
565 return S.Diag(TheCall->getBeginLoc(),
566 diag::err_riscv_type_requires_extension)
567 << Type << RequiredExt;
568
569 return false;
570}
571
573 unsigned BuiltinID,
574 CallExpr *TheCall) {
575 ASTContext &Context = getASTContext();
576 const FunctionDecl *FD = SemaRef.getCurFunctionDecl();
577 llvm::StringMap<bool> FunctionFeatureMap;
578 Context.getFunctionFeatureMap(FunctionFeatureMap, FD);
579
580 if (const auto *A = TheCall->getCalleeDecl()->getAttr<TargetAttr>()) {
581 StringRef FeaturesStr = A->getFeaturesStr();
582 llvm::SmallVector<StringRef> RequiredFeatures;
583 FeaturesStr.split(RequiredFeatures, ',');
584 for (auto RF : RequiredFeatures)
585 if (!TI.hasFeature(RF) && !FunctionFeatureMap.lookup(RF))
586 return Diag(TheCall->getBeginLoc(),
587 diag::err_riscv_builtin_requires_extension)
588 << /* IsExtension */ true << TheCall->getSourceRange() << RF;
589 }
590
591 // vmulh.vv, vmulh.vx, vmulhu.vv, vmulhu.vx, vmulhsu.vv, vmulhsu.vx,
592 // vsmul.vv, vsmul.vx are not included for EEW=64 in Zve64*.
593 switch (BuiltinID) {
594 default:
595 break;
596 case RISCVVector::BI__builtin_rvv_vmulhsu_vv:
597 case RISCVVector::BI__builtin_rvv_vmulhsu_vx:
598 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tu:
599 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tu:
600 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_m:
601 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_m:
602 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_mu:
603 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_mu:
604 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tum:
605 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tum:
606 case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tumu:
607 case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tumu:
608 case RISCVVector::BI__builtin_rvv_vmulhu_vv:
609 case RISCVVector::BI__builtin_rvv_vmulhu_vx:
610 case RISCVVector::BI__builtin_rvv_vmulhu_vv_tu:
611 case RISCVVector::BI__builtin_rvv_vmulhu_vx_tu:
612 case RISCVVector::BI__builtin_rvv_vmulhu_vv_m:
613 case RISCVVector::BI__builtin_rvv_vmulhu_vx_m:
614 case RISCVVector::BI__builtin_rvv_vmulhu_vv_mu:
615 case RISCVVector::BI__builtin_rvv_vmulhu_vx_mu:
616 case RISCVVector::BI__builtin_rvv_vmulhu_vv_tum:
617 case RISCVVector::BI__builtin_rvv_vmulhu_vx_tum:
618 case RISCVVector::BI__builtin_rvv_vmulhu_vv_tumu:
619 case RISCVVector::BI__builtin_rvv_vmulhu_vx_tumu:
620 case RISCVVector::BI__builtin_rvv_vmulh_vv:
621 case RISCVVector::BI__builtin_rvv_vmulh_vx:
622 case RISCVVector::BI__builtin_rvv_vmulh_vv_tu:
623 case RISCVVector::BI__builtin_rvv_vmulh_vx_tu:
624 case RISCVVector::BI__builtin_rvv_vmulh_vv_m:
625 case RISCVVector::BI__builtin_rvv_vmulh_vx_m:
626 case RISCVVector::BI__builtin_rvv_vmulh_vv_mu:
627 case RISCVVector::BI__builtin_rvv_vmulh_vx_mu:
628 case RISCVVector::BI__builtin_rvv_vmulh_vv_tum:
629 case RISCVVector::BI__builtin_rvv_vmulh_vx_tum:
630 case RISCVVector::BI__builtin_rvv_vmulh_vv_tumu:
631 case RISCVVector::BI__builtin_rvv_vmulh_vx_tumu:
632 case RISCVVector::BI__builtin_rvv_vsmul_vv:
633 case RISCVVector::BI__builtin_rvv_vsmul_vx:
634 case RISCVVector::BI__builtin_rvv_vsmul_vv_tu:
635 case RISCVVector::BI__builtin_rvv_vsmul_vx_tu:
636 case RISCVVector::BI__builtin_rvv_vsmul_vv_m:
637 case RISCVVector::BI__builtin_rvv_vsmul_vx_m:
638 case RISCVVector::BI__builtin_rvv_vsmul_vv_mu:
639 case RISCVVector::BI__builtin_rvv_vsmul_vx_mu:
640 case RISCVVector::BI__builtin_rvv_vsmul_vv_tum:
641 case RISCVVector::BI__builtin_rvv_vsmul_vx_tum:
642 case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu:
643 case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu: {
644 ASTContext::BuiltinVectorTypeInfo Info = Context.getBuiltinVectorTypeInfo(
645 TheCall->getType()->castAs<BuiltinType>());
646
647 if (Context.getTypeSize(Info.ElementType) == 64 && !TI.hasFeature("v") &&
648 !FunctionFeatureMap.lookup("v"))
649 return Diag(TheCall->getBeginLoc(),
650 diag::err_riscv_builtin_requires_extension)
651 << /* IsExtension */ true << TheCall->getSourceRange() << "v";
652
653 break;
654 }
655 }
656
657 auto CheckVSetVL = [&](unsigned SEWOffset, unsigned LMULOffset) -> bool {
658 const FunctionDecl *FD = SemaRef.getCurFunctionDecl();
659 llvm::StringMap<bool> FunctionFeatureMap;
660 Context.getFunctionFeatureMap(FunctionFeatureMap, FD);
661 llvm::APSInt SEWResult;
662 llvm::APSInt LMULResult;
663 if (SemaRef.BuiltinConstantArg(TheCall, SEWOffset, SEWResult) ||
664 SemaRef.BuiltinConstantArg(TheCall, LMULOffset, LMULResult))
665 return true;
666 int SEWValue = SEWResult.getSExtValue();
667 int LMULValue = LMULResult.getSExtValue();
668 if (((SEWValue == 0 && LMULValue == 5) || // e8mf8
669 (SEWValue == 1 && LMULValue == 6) || // e16mf4
670 (SEWValue == 2 && LMULValue == 7) || // e32mf2
671 SEWValue == 3) && // e64
672 !TI.hasFeature("zve64x") &&
673 !FunctionFeatureMap.lookup("zve64x"))
674 return Diag(TheCall->getBeginLoc(),
675 diag::err_riscv_builtin_requires_extension)
676 << /* IsExtension */ true << TheCall->getSourceRange() << "zve64x";
677 return SemaRef.BuiltinConstantArgRange(TheCall, SEWOffset, 0, 3) ||
678 CheckLMUL(TheCall, LMULOffset);
679 };
680 switch (BuiltinID) {
681 case RISCVVector::BI__builtin_rvv_vsetvli:
682 return CheckVSetVL(1, 2);
683 case RISCVVector::BI__builtin_rvv_vsetvlimax:
684 return CheckVSetVL(0, 1);
685 case RISCVVector::BI__builtin_rvv_sf_vsettnt:
686 case RISCVVector::BI__builtin_rvv_sf_vsettm:
687 case RISCVVector::BI__builtin_rvv_sf_vsettn:
688 case RISCVVector::BI__builtin_rvv_sf_vsettk:
689 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3) ||
690 SemaRef.BuiltinConstantArgRange(TheCall, 2, 1, 3);
691 case RISCVVector::BI__builtin_rvv_sf_mm_f_f_w1:
692 case RISCVVector::BI__builtin_rvv_sf_mm_f_f_w2:
693 case RISCVVector::BI__builtin_rvv_sf_mm_e5m2_e4m3_w4:
694 case RISCVVector::BI__builtin_rvv_sf_mm_e5m2_e5m2_w4:
695 case RISCVVector::BI__builtin_rvv_sf_mm_e4m3_e4m3_w4:
696 case RISCVVector::BI__builtin_rvv_sf_mm_e4m3_e5m2_w4:
697 case RISCVVector::BI__builtin_rvv_sf_mm_u_u_w4:
698 case RISCVVector::BI__builtin_rvv_sf_mm_u_s_w4:
699 case RISCVVector::BI__builtin_rvv_sf_mm_s_u_w4:
700 case RISCVVector::BI__builtin_rvv_sf_mm_s_s_w4: {
701 QualType Arg1Type = TheCall->getArg(1)->getType();
703 SemaRef.Context.getBuiltinVectorTypeInfo(
704 Arg1Type->castAs<BuiltinType>());
705 unsigned EltSize = SemaRef.Context.getTypeSize(Info.ElementType);
706 llvm::APSInt Result;
707
708 // We can't check the value of a dependent argument.
709 Expr *Arg = TheCall->getArg(0);
710 if (Arg->isTypeDependent() || Arg->isValueDependent())
711 return false;
712
713 // Check constant-ness first.
714 if (SemaRef.BuiltinConstantArg(TheCall, 0, Result))
715 return true;
716
717 // For TEW = 32, mtd can only be 0, 4, 8, 12.
718 // For TEW = 64, mtd can only be 0, 2, 4, 6, 8, 10, 12, 14.
719 // Only `sf_mm_f_f_w1` and `sf_mm_f_f_w2` might have TEW = 64.
720 if ((BuiltinID == RISCVVector::BI__builtin_rvv_sf_mm_f_f_w1 &&
721 EltSize == 64) ||
722 (BuiltinID == RISCVVector::BI__builtin_rvv_sf_mm_f_f_w2 &&
723 EltSize == 32))
724 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 15) ||
725 SemaRef.BuiltinConstantArgMultiple(TheCall, 0, 2);
726 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 15) ||
727 SemaRef.BuiltinConstantArgMultiple(TheCall, 0, 4);
728 }
729 case RISCVVector::BI__builtin_rvv_sf_vtzero_t: {
730 llvm::APSInt Log2SEWResult;
731 llvm::APSInt TWidenResult;
732 if (SemaRef.BuiltinConstantArg(TheCall, 3, Log2SEWResult) ||
733 SemaRef.BuiltinConstantArg(TheCall, 4, TWidenResult))
734 return true;
735
736 int Log2SEW = Log2SEWResult.getSExtValue();
737 int TWiden = TWidenResult.getSExtValue();
738
739 // 3 <= LogSEW <= 6
740 if (SemaRef.BuiltinConstantArgRange(TheCall, 3, 3, 6))
741 return true;
742
743 // TWiden
744 if (TWiden != 1 && TWiden != 2 && TWiden != 4)
745 return Diag(TheCall->getBeginLoc(),
746 diag::err_riscv_builtin_invalid_twiden);
747
748 int TEW = (1 << Log2SEW) * TWiden;
749
750 // For TEW = 8, mtd can be 0~15.
751 // For TEW = 16 or 64, mtd can only be 0, 2, 4, 6, 8, 10, 12, 14.
752 // For TEW = 32, mtd can only be 0, 4, 8, 12.
753 if (SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 15))
754 return true;
755 if (TEW == 16 || TEW == 64)
756 return SemaRef.BuiltinConstantArgMultiple(TheCall, 0, 2);
757 return SemaRef.BuiltinConstantArgMultiple(TheCall, 0, 4);
758 }
759 case RISCVVector::BI__builtin_rvv_vget_v: {
761 Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(
762 TheCall->getType().getCanonicalType().getTypePtr()));
764 Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(
765 TheCall->getArg(0)->getType().getCanonicalType().getTypePtr()));
766 unsigned MaxIndex;
767 if (VecInfo.NumVectors != 1) // vget for tuple type
768 MaxIndex = VecInfo.NumVectors;
769 else // vget for non-tuple type
770 MaxIndex = (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors) /
771 (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors);
772 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1);
773 }
774 case RISCVVector::BI__builtin_rvv_vset_v: {
776 Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(
777 TheCall->getType().getCanonicalType().getTypePtr()));
779 Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(
780 TheCall->getArg(2)->getType().getCanonicalType().getTypePtr()));
781 unsigned MaxIndex;
782 if (ResVecInfo.NumVectors != 1) // vset for tuple type
783 MaxIndex = ResVecInfo.NumVectors;
784 else // vset fo non-tuple type
785 MaxIndex = (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors) /
786 (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors);
787 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1);
788 }
789 // Vector Crypto
790 case RISCVVector::BI__builtin_rvv_vaeskf1_vi_tu:
791 case RISCVVector::BI__builtin_rvv_vaeskf2_vi_tu:
792 case RISCVVector::BI__builtin_rvv_vaeskf2_vi:
793 case RISCVVector::BI__builtin_rvv_vsm4k_vi_tu: {
794 QualType Arg0Type = TheCall->getArg(0)->getType();
795 QualType Arg1Type = TheCall->getArg(1)->getType();
796 return CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
797 Arg0Type, 128) ||
798 CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
799 Arg1Type, 128) ||
800 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
801 }
802 case RISCVVector::BI__builtin_rvv_vsm3c_vi_tu:
803 case RISCVVector::BI__builtin_rvv_vsm3c_vi: {
804 QualType Arg0Type = TheCall->getArg(0)->getType();
805 return CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
806 Arg0Type, 256) ||
807 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
808 }
809 case RISCVVector::BI__builtin_rvv_vaeskf1_vi:
810 case RISCVVector::BI__builtin_rvv_vsm4k_vi: {
811 QualType Arg0Type = TheCall->getArg(0)->getType();
812 return CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
813 Arg0Type, 128) ||
814 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);
815 }
816 case RISCVVector::BI__builtin_rvv_vaesdf_vv:
817 case RISCVVector::BI__builtin_rvv_vaesdf_vs:
818 case RISCVVector::BI__builtin_rvv_vaesdm_vv:
819 case RISCVVector::BI__builtin_rvv_vaesdm_vs:
820 case RISCVVector::BI__builtin_rvv_vaesef_vv:
821 case RISCVVector::BI__builtin_rvv_vaesef_vs:
822 case RISCVVector::BI__builtin_rvv_vaesem_vv:
823 case RISCVVector::BI__builtin_rvv_vaesem_vs:
824 case RISCVVector::BI__builtin_rvv_vaesz_vs:
825 case RISCVVector::BI__builtin_rvv_vsm4r_vv:
826 case RISCVVector::BI__builtin_rvv_vsm4r_vs:
827 case RISCVVector::BI__builtin_rvv_vaesdf_vv_tu:
828 case RISCVVector::BI__builtin_rvv_vaesdf_vs_tu:
829 case RISCVVector::BI__builtin_rvv_vaesdm_vv_tu:
830 case RISCVVector::BI__builtin_rvv_vaesdm_vs_tu:
831 case RISCVVector::BI__builtin_rvv_vaesef_vv_tu:
832 case RISCVVector::BI__builtin_rvv_vaesef_vs_tu:
833 case RISCVVector::BI__builtin_rvv_vaesem_vv_tu:
834 case RISCVVector::BI__builtin_rvv_vaesem_vs_tu:
835 case RISCVVector::BI__builtin_rvv_vaesz_vs_tu:
836 case RISCVVector::BI__builtin_rvv_vsm4r_vv_tu:
837 case RISCVVector::BI__builtin_rvv_vsm4r_vs_tu: {
838 QualType Arg0Type = TheCall->getArg(0)->getType();
839 QualType Arg1Type = TheCall->getArg(1)->getType();
840 return CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
841 Arg0Type, 128) ||
842 CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
843 Arg1Type, 128);
844 }
845 case RISCVVector::BI__builtin_rvv_vsha2ch_vv:
846 case RISCVVector::BI__builtin_rvv_vsha2cl_vv:
847 case RISCVVector::BI__builtin_rvv_vsha2ms_vv:
848 case RISCVVector::BI__builtin_rvv_vsha2ch_vv_tu:
849 case RISCVVector::BI__builtin_rvv_vsha2cl_vv_tu:
850 case RISCVVector::BI__builtin_rvv_vsha2ms_vv_tu: {
851 QualType Arg0Type = TheCall->getArg(0)->getType();
852 QualType Arg1Type = TheCall->getArg(1)->getType();
853 QualType Arg2Type = TheCall->getArg(2)->getType();
855 Context.getBuiltinVectorTypeInfo(Arg0Type->castAs<BuiltinType>());
856 uint64_t ElemSize = Context.getTypeSize(Info.ElementType);
857
858 return CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
859 Arg0Type, ElemSize * 4) ||
860 CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
861 Arg1Type, ElemSize * 4) ||
862 CheckInvalidVLENandLMUL(TI, FunctionFeatureMap, TheCall, SemaRef,
863 Arg2Type, ElemSize * 4);
864 }
865
866 case RISCVVector::BI__builtin_rvv_sf_vc_i_se:
867 // bit_27_26, bit_24_20, bit_11_7, simm5, sew, log2lmul
868 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
869 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||
870 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
871 SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15) ||
872 CheckLMUL(TheCall, 5);
873 case RISCVVector::BI__builtin_rvv_sf_vc_iv_se:
874 // bit_27_26, bit_11_7, vs2, simm5
875 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
876 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||
877 SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15);
878 case RISCVVector::BI__builtin_rvv_sf_vc_v_i:
879 case RISCVVector::BI__builtin_rvv_sf_vc_v_i_se:
880 // bit_27_26, bit_24_20, simm5
881 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
882 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||
883 SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15);
884 case RISCVVector::BI__builtin_rvv_sf_vc_v_iv:
885 case RISCVVector::BI__builtin_rvv_sf_vc_v_iv_se:
886 // bit_27_26, vs2, simm5
887 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
888 SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15);
889 case RISCVVector::BI__builtin_rvv_sf_vc_ivv_se:
890 case RISCVVector::BI__builtin_rvv_sf_vc_ivw_se:
891 case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv:
892 case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw:
893 case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv_se:
894 case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw_se:
895 // bit_27_26, vd, vs2, simm5
896 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
897 SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15);
898 case RISCVVector::BI__builtin_rvv_sf_vc_x_se:
899 // bit_27_26, bit_24_20, bit_11_7, xs1, sew, log2lmul
900 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
901 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||
902 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
903 CheckLMUL(TheCall, 5);
904 case RISCVVector::BI__builtin_rvv_sf_vc_xv_se:
905 case RISCVVector::BI__builtin_rvv_sf_vc_vv_se:
906 // bit_27_26, bit_11_7, vs2, xs1/vs1
907 case RISCVVector::BI__builtin_rvv_sf_vc_v_x:
908 case RISCVVector::BI__builtin_rvv_sf_vc_v_x_se:
909 // bit_27_26, bit_24-20, xs1
910 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
911 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);
912 case RISCVVector::BI__builtin_rvv_sf_vc_vvv_se:
913 case RISCVVector::BI__builtin_rvv_sf_vc_xvv_se:
914 case RISCVVector::BI__builtin_rvv_sf_vc_vvw_se:
915 case RISCVVector::BI__builtin_rvv_sf_vc_xvw_se:
916 // bit_27_26, vd, vs2, xs1
917 case RISCVVector::BI__builtin_rvv_sf_vc_v_xv:
918 case RISCVVector::BI__builtin_rvv_sf_vc_v_vv:
919 case RISCVVector::BI__builtin_rvv_sf_vc_v_xv_se:
920 case RISCVVector::BI__builtin_rvv_sf_vc_v_vv_se:
921 // bit_27_26, vs2, xs1/vs1
922 case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv:
923 case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv:
924 case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw:
925 case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw:
926 case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv_se:
927 case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv_se:
928 case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw_se:
929 case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw_se:
930 // bit_27_26, vd, vs2, xs1/vs1
931 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3);
932 case RISCVVector::BI__builtin_rvv_sf_vc_fv_se:
933 // bit_26, bit_11_7, vs2, fs1
934 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1) ||
935 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);
936 case RISCVVector::BI__builtin_rvv_sf_vc_fvv_se:
937 case RISCVVector::BI__builtin_rvv_sf_vc_fvw_se:
938 case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv:
939 case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw:
940 case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv_se:
941 case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw_se:
942 // bit_26, vd, vs2, fs1
943 case RISCVVector::BI__builtin_rvv_sf_vc_v_fv:
944 case RISCVVector::BI__builtin_rvv_sf_vc_v_fv_se:
945 // bit_26, vs2, fs1
946 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
947 // Check if byteselect is in [0, 3]
948 case RISCV::BI__builtin_riscv_aes32dsi:
949 case RISCV::BI__builtin_riscv_aes32dsmi:
950 case RISCV::BI__builtin_riscv_aes32esi:
951 case RISCV::BI__builtin_riscv_aes32esmi:
952 case RISCV::BI__builtin_riscv_sm4ks:
953 case RISCV::BI__builtin_riscv_sm4ed:
954 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
955 // Check if rnum is in [0, 10]
956 case RISCV::BI__builtin_riscv_aes64ks1i:
957 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 10);
958 // Check if value range for vxrm is in [0, 3]
959 case RISCVVector::BI__builtin_rvv_vaaddu_vv:
960 case RISCVVector::BI__builtin_rvv_vaaddu_vx:
961 case RISCVVector::BI__builtin_rvv_vaadd_vv:
962 case RISCVVector::BI__builtin_rvv_vaadd_vx:
963 case RISCVVector::BI__builtin_rvv_vasubu_vv:
964 case RISCVVector::BI__builtin_rvv_vasubu_vx:
965 case RISCVVector::BI__builtin_rvv_vasub_vv:
966 case RISCVVector::BI__builtin_rvv_vasub_vx:
967 case RISCVVector::BI__builtin_rvv_vsmul_vv:
968 case RISCVVector::BI__builtin_rvv_vsmul_vx:
969 case RISCVVector::BI__builtin_rvv_vssra_vv:
970 case RISCVVector::BI__builtin_rvv_vssra_vx:
971 case RISCVVector::BI__builtin_rvv_vssrl_vv:
972 case RISCVVector::BI__builtin_rvv_vssrl_vx:
973 case RISCVVector::BI__builtin_rvv_vnclip_wv:
974 case RISCVVector::BI__builtin_rvv_vnclip_wx:
975 case RISCVVector::BI__builtin_rvv_vnclipu_wv:
976 case RISCVVector::BI__builtin_rvv_vnclipu_wx:
977 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
978 case RISCVVector::BI__builtin_rvv_vaaddu_vv_tu:
979 case RISCVVector::BI__builtin_rvv_vaaddu_vx_tu:
980 case RISCVVector::BI__builtin_rvv_vaadd_vv_tu:
981 case RISCVVector::BI__builtin_rvv_vaadd_vx_tu:
982 case RISCVVector::BI__builtin_rvv_vasubu_vv_tu:
983 case RISCVVector::BI__builtin_rvv_vasubu_vx_tu:
984 case RISCVVector::BI__builtin_rvv_vasub_vv_tu:
985 case RISCVVector::BI__builtin_rvv_vasub_vx_tu:
986 case RISCVVector::BI__builtin_rvv_vsmul_vv_tu:
987 case RISCVVector::BI__builtin_rvv_vsmul_vx_tu:
988 case RISCVVector::BI__builtin_rvv_vssra_vv_tu:
989 case RISCVVector::BI__builtin_rvv_vssra_vx_tu:
990 case RISCVVector::BI__builtin_rvv_vssrl_vv_tu:
991 case RISCVVector::BI__builtin_rvv_vssrl_vx_tu:
992 case RISCVVector::BI__builtin_rvv_vnclip_wv_tu:
993 case RISCVVector::BI__builtin_rvv_vnclip_wx_tu:
994 case RISCVVector::BI__builtin_rvv_vnclipu_wv_tu:
995 case RISCVVector::BI__builtin_rvv_vnclipu_wx_tu:
996 case RISCVVector::BI__builtin_rvv_vaaddu_vv_m:
997 case RISCVVector::BI__builtin_rvv_vaaddu_vx_m:
998 case RISCVVector::BI__builtin_rvv_vaadd_vv_m:
999 case RISCVVector::BI__builtin_rvv_vaadd_vx_m:
1000 case RISCVVector::BI__builtin_rvv_vasubu_vv_m:
1001 case RISCVVector::BI__builtin_rvv_vasubu_vx_m:
1002 case RISCVVector::BI__builtin_rvv_vasub_vv_m:
1003 case RISCVVector::BI__builtin_rvv_vasub_vx_m:
1004 case RISCVVector::BI__builtin_rvv_vsmul_vv_m:
1005 case RISCVVector::BI__builtin_rvv_vsmul_vx_m:
1006 case RISCVVector::BI__builtin_rvv_vssra_vv_m:
1007 case RISCVVector::BI__builtin_rvv_vssra_vx_m:
1008 case RISCVVector::BI__builtin_rvv_vssrl_vv_m:
1009 case RISCVVector::BI__builtin_rvv_vssrl_vx_m:
1010 case RISCVVector::BI__builtin_rvv_vnclip_wv_m:
1011 case RISCVVector::BI__builtin_rvv_vnclip_wx_m:
1012 case RISCVVector::BI__builtin_rvv_vnclipu_wv_m:
1013 case RISCVVector::BI__builtin_rvv_vnclipu_wx_m:
1014 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 3);
1015 case RISCVVector::BI__builtin_rvv_vaaddu_vv_tum:
1016 case RISCVVector::BI__builtin_rvv_vaaddu_vv_tumu:
1017 case RISCVVector::BI__builtin_rvv_vaaddu_vv_mu:
1018 case RISCVVector::BI__builtin_rvv_vaaddu_vx_tum:
1019 case RISCVVector::BI__builtin_rvv_vaaddu_vx_tumu:
1020 case RISCVVector::BI__builtin_rvv_vaaddu_vx_mu:
1021 case RISCVVector::BI__builtin_rvv_vaadd_vv_tum:
1022 case RISCVVector::BI__builtin_rvv_vaadd_vv_tumu:
1023 case RISCVVector::BI__builtin_rvv_vaadd_vv_mu:
1024 case RISCVVector::BI__builtin_rvv_vaadd_vx_tum:
1025 case RISCVVector::BI__builtin_rvv_vaadd_vx_tumu:
1026 case RISCVVector::BI__builtin_rvv_vaadd_vx_mu:
1027 case RISCVVector::BI__builtin_rvv_vasubu_vv_tum:
1028 case RISCVVector::BI__builtin_rvv_vasubu_vv_tumu:
1029 case RISCVVector::BI__builtin_rvv_vasubu_vv_mu:
1030 case RISCVVector::BI__builtin_rvv_vasubu_vx_tum:
1031 case RISCVVector::BI__builtin_rvv_vasubu_vx_tumu:
1032 case RISCVVector::BI__builtin_rvv_vasubu_vx_mu:
1033 case RISCVVector::BI__builtin_rvv_vasub_vv_tum:
1034 case RISCVVector::BI__builtin_rvv_vasub_vv_tumu:
1035 case RISCVVector::BI__builtin_rvv_vasub_vv_mu:
1036 case RISCVVector::BI__builtin_rvv_vasub_vx_tum:
1037 case RISCVVector::BI__builtin_rvv_vasub_vx_tumu:
1038 case RISCVVector::BI__builtin_rvv_vasub_vx_mu:
1039 case RISCVVector::BI__builtin_rvv_vsmul_vv_mu:
1040 case RISCVVector::BI__builtin_rvv_vsmul_vx_mu:
1041 case RISCVVector::BI__builtin_rvv_vssra_vv_mu:
1042 case RISCVVector::BI__builtin_rvv_vssra_vx_mu:
1043 case RISCVVector::BI__builtin_rvv_vssrl_vv_mu:
1044 case RISCVVector::BI__builtin_rvv_vssrl_vx_mu:
1045 case RISCVVector::BI__builtin_rvv_vnclip_wv_mu:
1046 case RISCVVector::BI__builtin_rvv_vnclip_wx_mu:
1047 case RISCVVector::BI__builtin_rvv_vnclipu_wv_mu:
1048 case RISCVVector::BI__builtin_rvv_vnclipu_wx_mu:
1049 case RISCVVector::BI__builtin_rvv_vsmul_vv_tum:
1050 case RISCVVector::BI__builtin_rvv_vsmul_vx_tum:
1051 case RISCVVector::BI__builtin_rvv_vssra_vv_tum:
1052 case RISCVVector::BI__builtin_rvv_vssra_vx_tum:
1053 case RISCVVector::BI__builtin_rvv_vssrl_vv_tum:
1054 case RISCVVector::BI__builtin_rvv_vssrl_vx_tum:
1055 case RISCVVector::BI__builtin_rvv_vnclip_wv_tum:
1056 case RISCVVector::BI__builtin_rvv_vnclip_wx_tum:
1057 case RISCVVector::BI__builtin_rvv_vnclipu_wv_tum:
1058 case RISCVVector::BI__builtin_rvv_vnclipu_wx_tum:
1059 case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu:
1060 case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu:
1061 case RISCVVector::BI__builtin_rvv_vssra_vv_tumu:
1062 case RISCVVector::BI__builtin_rvv_vssra_vx_tumu:
1063 case RISCVVector::BI__builtin_rvv_vssrl_vv_tumu:
1064 case RISCVVector::BI__builtin_rvv_vssrl_vx_tumu:
1065 case RISCVVector::BI__builtin_rvv_vnclip_wv_tumu:
1066 case RISCVVector::BI__builtin_rvv_vnclip_wx_tumu:
1067 case RISCVVector::BI__builtin_rvv_vnclipu_wv_tumu:
1068 case RISCVVector::BI__builtin_rvv_vnclipu_wx_tumu:
1069 return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 3);
1070 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm:
1071 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm:
1072 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm:
1073 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm:
1074 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm:
1075 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm:
1076 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm:
1077 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm:
1078 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm:
1079 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm:
1080 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm:
1081 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm:
1082 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm:
1083 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm:
1084 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 4);
1085 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm:
1086 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm:
1087 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm:
1088 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm:
1089 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm:
1090 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm:
1091 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm:
1092 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm:
1093 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm:
1094 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm:
1095 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm:
1096 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm:
1097 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm:
1098 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm:
1099 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm:
1100 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm:
1101 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm:
1102 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm:
1103 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm:
1104 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm:
1105 case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm:
1106 case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm:
1107 case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm:
1108 case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm:
1109 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_x_f_qf_rm:
1110 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_xu_f_qf_rm:
1111 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tu:
1112 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tu:
1113 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tu:
1114 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tu:
1115 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tu:
1116 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tu:
1117 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tu:
1118 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tu:
1119 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tu:
1120 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tu:
1121 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tu:
1122 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tu:
1123 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tu:
1124 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_tu:
1125 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_m:
1126 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_m:
1127 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_m:
1128 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_m:
1129 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_m:
1130 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_m:
1131 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_m:
1132 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_m:
1133 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_m:
1134 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_m:
1135 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_m:
1136 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_m:
1137 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_m:
1138 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_m:
1139 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 4);
1140 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tu:
1141 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tu:
1142 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tu:
1143 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tu:
1144 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tu:
1145 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tu:
1146 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tu:
1147 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tu:
1148 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tu:
1149 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tu:
1150 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tu:
1151 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tu:
1152 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tu:
1153 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tu:
1154 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tu:
1155 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tu:
1156 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tu:
1157 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tu:
1158 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tu:
1159 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tu:
1160 case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tu:
1161 case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tu:
1162 case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tu:
1163 case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tu:
1164 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm:
1165 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm:
1166 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm:
1167 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm:
1168 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm:
1169 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm:
1170 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm:
1171 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm:
1172 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm:
1173 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm:
1174 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm:
1175 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm:
1176 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm:
1177 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm:
1178 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm:
1179 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm:
1180 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm:
1181 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm:
1182 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm:
1183 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm:
1184 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm:
1185 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm:
1186 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm:
1187 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm:
1188 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm:
1189 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm:
1190 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tu:
1191 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tu:
1192 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tu:
1193 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tu:
1194 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tu:
1195 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tu:
1196 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tu:
1197 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tu:
1198 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tu:
1199 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tu:
1200 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tu:
1201 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tu:
1202 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tu:
1203 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tu:
1204 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tu:
1205 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tu:
1206 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tu:
1207 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tu:
1208 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tu:
1209 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tu:
1210 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tu:
1211 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tu:
1212 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tu:
1213 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tu:
1214 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_tu:
1215 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_tu:
1216 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_x_f_qf_rm_tu:
1217 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_xu_f_qf_rm_tu:
1218 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_m:
1219 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_m:
1220 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_m:
1221 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_m:
1222 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_m:
1223 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_m:
1224 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_m:
1225 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_m:
1226 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_m:
1227 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_m:
1228 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_m:
1229 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_m:
1230 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_m:
1231 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_m:
1232 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_m:
1233 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_m:
1234 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_m:
1235 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_m:
1236 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_m:
1237 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_m:
1238 case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_m:
1239 case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_m:
1240 case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_m:
1241 case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_m:
1242 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tum:
1243 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tum:
1244 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tum:
1245 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tum:
1246 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tum:
1247 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tum:
1248 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tum:
1249 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tum:
1250 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tum:
1251 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tum:
1252 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tum:
1253 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tum:
1254 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tum:
1255 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_tum:
1256 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tumu:
1257 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tumu:
1258 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tumu:
1259 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tumu:
1260 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tumu:
1261 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tumu:
1262 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tumu:
1263 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tumu:
1264 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tumu:
1265 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tumu:
1266 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tumu:
1267 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tumu:
1268 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tumu:
1269 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_tumu:
1270 case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_mu:
1271 case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_mu:
1272 case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_mu:
1273 case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_mu:
1274 case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_mu:
1275 case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_mu:
1276 case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_mu:
1277 case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_mu:
1278 case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_mu:
1279 case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_mu:
1280 case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_mu:
1281 case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_mu:
1282 case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_mu:
1283 case RISCVVector::BI__builtin_rvv_vfncvtbf16_f_f_w_rm_mu:
1284 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 4);
1285 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_m:
1286 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_m:
1287 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_m:
1288 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_m:
1289 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_m:
1290 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_m:
1291 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_m:
1292 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_m:
1293 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_m:
1294 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_m:
1295 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_m:
1296 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_m:
1297 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_m:
1298 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_m:
1299 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_m:
1300 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_m:
1301 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_m:
1302 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_m:
1303 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_m:
1304 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_m:
1305 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_m:
1306 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_m:
1307 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_m:
1308 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_m:
1309 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_m:
1310 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_m:
1311 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tum:
1312 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tum:
1313 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tum:
1314 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tum:
1315 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tum:
1316 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tum:
1317 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tum:
1318 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tum:
1319 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tum:
1320 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tum:
1321 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tum:
1322 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tum:
1323 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tum:
1324 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tum:
1325 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tum:
1326 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tum:
1327 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tum:
1328 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tum:
1329 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tum:
1330 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tum:
1331 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tum:
1332 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tum:
1333 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tum:
1334 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tum:
1335 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tum:
1336 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tum:
1337 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tum:
1338 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tum:
1339 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tum:
1340 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tum:
1341 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tum:
1342 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tum:
1343 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tum:
1344 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tum:
1345 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tum:
1346 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tum:
1347 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tum:
1348 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tum:
1349 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tum:
1350 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tum:
1351 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tum:
1352 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tum:
1353 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tum:
1354 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tum:
1355 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_tum:
1356 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_tum:
1357 case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tum:
1358 case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tum:
1359 case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tum:
1360 case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tum:
1361 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_x_f_qf_rm_tum:
1362 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_xu_f_qf_rm_tum:
1363 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tumu:
1364 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tumu:
1365 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tumu:
1366 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tumu:
1367 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tumu:
1368 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tumu:
1369 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tumu:
1370 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tumu:
1371 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tumu:
1372 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tumu:
1373 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tumu:
1374 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tumu:
1375 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tumu:
1376 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tumu:
1377 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tumu:
1378 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tumu:
1379 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tumu:
1380 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tumu:
1381 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tumu:
1382 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tumu:
1383 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tumu:
1384 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tumu:
1385 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tumu:
1386 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tumu:
1387 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tumu:
1388 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tumu:
1389 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tumu:
1390 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tumu:
1391 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tumu:
1392 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tumu:
1393 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tumu:
1394 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tumu:
1395 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tumu:
1396 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tumu:
1397 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tumu:
1398 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tumu:
1399 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tumu:
1400 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tumu:
1401 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tumu:
1402 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tumu:
1403 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tumu:
1404 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tumu:
1405 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tumu:
1406 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tumu:
1407 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_tumu:
1408 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_tumu:
1409 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_x_f_qf_rm_tumu:
1410 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_xu_f_qf_rm_tumu:
1411 case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_mu:
1412 case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_mu:
1413 case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_mu:
1414 case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_mu:
1415 case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_mu:
1416 case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_mu:
1417 case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_mu:
1418 case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_mu:
1419 case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_mu:
1420 case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_mu:
1421 case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_mu:
1422 case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_mu:
1423 case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_mu:
1424 case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_mu:
1425 case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_mu:
1426 case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_mu:
1427 case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_mu:
1428 case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_mu:
1429 case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_mu:
1430 case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_mu:
1431 case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_mu:
1432 case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_mu:
1433 case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_mu:
1434 case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_mu:
1435 case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_mu:
1436 case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_mu:
1437 case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_mu:
1438 case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_mu:
1439 case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_mu:
1440 case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_mu:
1441 case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_mu:
1442 case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_mu:
1443 case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_mu:
1444 case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_mu:
1445 case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_mu:
1446 case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_mu:
1447 case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_mu:
1448 case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_mu:
1449 case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_mu:
1450 case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_mu:
1451 case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_mu:
1452 case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_mu:
1453 case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_mu:
1454 case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_mu:
1455 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vv_rm_mu:
1456 case RISCVVector::BI__builtin_rvv_vfwmaccbf16_vf_rm_mu:
1457 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_x_f_qf_rm_mu:
1458 case RISCVVector::BI__builtin_rvv_sf_vfnrclip_xu_f_qf_rm_mu:
1459 return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 4);
1460 case RISCV::BI__builtin_riscv_ntl_load:
1461 case RISCV::BI__builtin_riscv_ntl_store:
1462 DeclRefExpr *DRE =
1464 assert((BuiltinID == RISCV::BI__builtin_riscv_ntl_store ||
1465 BuiltinID == RISCV::BI__builtin_riscv_ntl_load) &&
1466 "Unexpected RISC-V nontemporal load/store builtin!");
1467 bool IsStore = BuiltinID == RISCV::BI__builtin_riscv_ntl_store;
1468 unsigned NumArgs = IsStore ? 3 : 2;
1469
1470 if (SemaRef.checkArgCountAtLeast(TheCall, NumArgs - 1))
1471 return true;
1472
1473 if (SemaRef.checkArgCountAtMost(TheCall, NumArgs))
1474 return true;
1475
1476 // Domain value should be compile-time constant.
1477 // 2 <= domain <= 5
1478 if (TheCall->getNumArgs() == NumArgs &&
1479 SemaRef.BuiltinConstantArgRange(TheCall, NumArgs - 1, 2, 5))
1480 return true;
1481
1482 Expr *PointerArg = TheCall->getArg(0);
1483 ExprResult PointerArgResult =
1484 SemaRef.DefaultFunctionArrayLvalueConversion(PointerArg);
1485
1486 if (PointerArgResult.isInvalid())
1487 return true;
1488 PointerArg = PointerArgResult.get();
1489
1490 const PointerType *PtrType = PointerArg->getType()->getAs<PointerType>();
1491 if (!PtrType) {
1492 Diag(DRE->getBeginLoc(), diag::err_nontemporal_builtin_must_be_pointer)
1493 << PointerArg->getType() << PointerArg->getSourceRange();
1494 return true;
1495 }
1496
1497 QualType ValType = PtrType->getPointeeType();
1498 ValType = ValType.getUnqualifiedType();
1499 if (!ValType->isIntegerType() && !ValType->isAnyPointerType() &&
1500 !ValType->isBlockPointerType() && !ValType->isFloatingType() &&
1501 !ValType->isVectorType() && !ValType->isRVVSizelessBuiltinType()) {
1502 Diag(DRE->getBeginLoc(),
1503 diag::err_nontemporal_builtin_must_be_pointer_intfltptr_or_vector)
1504 << PointerArg->getType() << PointerArg->getSourceRange();
1505 return true;
1506 }
1507
1508 if (!IsStore) {
1509 TheCall->setType(ValType);
1510 return false;
1511 }
1512
1513 ExprResult ValArg = TheCall->getArg(1);
1515 Context, ValType, /*consume*/ false);
1516 ValArg =
1517 SemaRef.PerformCopyInitialization(Entity, SourceLocation(), ValArg);
1518 if (ValArg.isInvalid())
1519 return true;
1520
1521 TheCall->setArg(1, ValArg.get());
1522 TheCall->setType(Context.VoidTy);
1523 return false;
1524 }
1525
1526 return false;
1527}
1528
1530 const llvm::StringMap<bool> &FeatureMap) {
1531 const BuiltinType *BT = Ty->castAs<BuiltinType>();
1533 SemaRef.Context.getBuiltinVectorTypeInfo(BT);
1534 unsigned EltSize = SemaRef.Context.getTypeSize(Info.ElementType);
1535 unsigned MinElts = Info.EC.getKnownMinValue();
1536
1537 auto IsOFP8Type = [](const BuiltinType *BT) {
1538 switch (BT->getKind()) {
1539#define RVV_VECTOR_TYPE_OFP8(Name, Id, SingletonId, NumEls, E5m2) \
1540 case BuiltinType::Id:
1541#include "clang/Basic/RISCVVTypes.def"
1542 return true;
1543 default:
1544 return false;
1545 }
1546 };
1547
1548 if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Double) &&
1549 !FeatureMap.lookup("zve64d"))
1550 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zve64d";
1551 // (ELEN, LMUL) pairs of (8, mf8), (16, mf4), (32, mf2), (64, m1) requires at
1552 // least zve64x
1553 else if (((EltSize == 64 && Info.ElementType->isIntegerType()) ||
1554 MinElts == 1) &&
1555 !FeatureMap.lookup("zve64x"))
1556 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zve64x";
1557 else if (Info.ElementType->isFloat16Type() && !FeatureMap.lookup("zvfh") &&
1558 !FeatureMap.lookup("zvfhmin") &&
1559 !FeatureMap.lookup("xandesvpackfph"))
1561 Diag(Loc, diag::err_riscv_type_requires_extension)
1562 << Ty << "zvfh, zvfhmin or xandesvpackfph";
1563 } else {
1564 Diag(Loc, diag::err_riscv_type_requires_extension)
1565 << Ty << "zvfh or zvfhmin";
1566 }
1567 else if (Info.ElementType->isBFloat16Type() &&
1568 !FeatureMap.lookup("zvfbfmin") &&
1569 !FeatureMap.lookup("xandesvbfhcvt") &&
1570 !FeatureMap.lookup("experimental-zvfbfa"))
1572 Diag(Loc, diag::err_riscv_type_requires_extension)
1573 << Ty << "zvfbfmin or xandesvbfhcvt";
1574 } else {
1575 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zvfbfmin";
1576 }
1577 else if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Float) &&
1578 !FeatureMap.lookup("zve32f"))
1579 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zve32f";
1580 // Given that caller already checked isRVVType() before calling this function,
1581 // if we don't have at least zve32x supported, then we need to emit error.
1582 else if (!FeatureMap.lookup("zve32x"))
1583 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zve32x";
1584 else if (IsOFP8Type(BT) && !FeatureMap.lookup("experimental-zvfofp8min"))
1585 Diag(Loc, diag::err_riscv_type_requires_extension) << Ty << "zvfofp8min";
1586}
1587
1588/// Are the two types RVV-bitcast-compatible types? I.e. is bitcasting from the
1589/// first RVV type (e.g. an RVV scalable type) to the second type (e.g. an RVV
1590/// VLS type) allowed?
1591///
1592/// This will also return false if the two given types do not make sense from
1593/// the perspective of RVV bitcasts.
1595 assert(srcTy->isVectorType() || destTy->isVectorType());
1596
1597 auto ValidScalableConversion = [](QualType FirstType, QualType SecondType) {
1598 if (!FirstType->isRVVSizelessBuiltinType())
1599 return false;
1600
1601 const auto *VecTy = SecondType->getAs<VectorType>();
1602 return VecTy && VecTy->getVectorKind() == VectorKind::RVVFixedLengthData;
1603 };
1604
1605 return ValidScalableConversion(srcTy, destTy) ||
1606 ValidScalableConversion(destTy, srcTy);
1607}
1608
1610 // Warn about repeated attributes.
1611 if (const auto *A = D->getAttr<RISCVInterruptAttr>()) {
1612 Diag(AL.getRange().getBegin(),
1613 diag::warn_riscv_repeated_interrupt_attribute);
1614 Diag(A->getLocation(), diag::note_riscv_repeated_interrupt_attribute);
1615 return;
1616 }
1617
1618 // Semantic checks for a function with the 'interrupt' attribute:
1619 // - Must be a function.
1620 // - Must have no parameters.
1621 // - Must have the 'void' return type.
1622 // - The attribute itself must have at most 2 arguments
1623 // - The attribute arguments must be string literals, and valid choices.
1624 // - The attribute arguments must be a valid combination
1625 // - The current target must support the right extensions for the combination.
1626
1627 if (D->getFunctionType() == nullptr) {
1628 Diag(D->getLocation(), diag::warn_attribute_wrong_decl_type)
1630 return;
1631 }
1632
1634 Diag(D->getLocation(), diag::warn_interrupt_signal_attribute_invalid)
1635 << /*RISC-V*/ 2 << /*interrupt*/ 0 << 0;
1636 return;
1637 }
1638
1639 if (!getFunctionOrMethodResultType(D)->isVoidType()) {
1640 Diag(D->getLocation(), diag::warn_interrupt_signal_attribute_invalid)
1641 << /*RISC-V*/ 2 << /*interrupt*/ 0 << 1;
1642 return;
1643 }
1644
1645 if (!AL.checkAtMostNumArgs(SemaRef, 2))
1646 return;
1647
1648 bool HasSiFiveCLICType = false;
1649 bool HasUnaryType = false;
1650
1651 SmallSet<RISCVInterruptAttr::InterruptType, 2> Types;
1652 for (unsigned ArgIndex = 0; ArgIndex < AL.getNumArgs(); ++ArgIndex) {
1653 RISCVInterruptAttr::InterruptType Type;
1654 StringRef TypeString;
1655 SourceLocation Loc;
1656
1657 if (!SemaRef.checkStringLiteralArgumentAttr(AL, ArgIndex, TypeString, &Loc))
1658 return;
1659
1660 if (!RISCVInterruptAttr::ConvertStrToInterruptType(TypeString, Type)) {
1661 std::string TypeLiteral = ("\"" + TypeString + "\"").str();
1662 Diag(AL.getLoc(), diag::warn_attribute_type_not_supported)
1663 << AL << TypeLiteral << Loc;
1664 return;
1665 }
1666
1667 switch (Type) {
1668 case RISCVInterruptAttr::machine:
1669 // "machine" could be combined with the SiFive CLIC types, or could be
1670 // just "machine".
1671 break;
1672 case RISCVInterruptAttr::SiFiveCLICPreemptible:
1673 case RISCVInterruptAttr::SiFiveCLICStackSwap:
1674 // SiFive-CLIC types can be combined with each other and "machine"
1675 HasSiFiveCLICType = true;
1676 break;
1677 case RISCVInterruptAttr::supervisor:
1678 case RISCVInterruptAttr::rnmi:
1679 case RISCVInterruptAttr::qcinest:
1680 case RISCVInterruptAttr::qcinonest:
1681 // "supervisor", "rnmi" and "qci-(no)nest" cannot be combined with any
1682 // other types
1683 HasUnaryType = true;
1684 break;
1685 }
1686
1687 Types.insert(Type);
1688 }
1689
1690 if (HasUnaryType && Types.size() > 1) {
1691 Diag(AL.getLoc(), diag::err_riscv_attribute_interrupt_invalid_combination);
1692 return;
1693 }
1694
1695 if (HasUnaryType && HasSiFiveCLICType) {
1696 Diag(AL.getLoc(), diag::err_riscv_attribute_interrupt_invalid_combination);
1697 return;
1698 }
1699
1700 // "machine" is the default, if nothing is specified.
1701 if (AL.getNumArgs() == 0)
1702 Types.insert(RISCVInterruptAttr::machine);
1703
1704 const TargetInfo &TI = getASTContext().getTargetInfo();
1705 llvm::StringMap<bool> FunctionFeatureMap;
1706 getASTContext().getFunctionFeatureMap(FunctionFeatureMap,
1707 dyn_cast<FunctionDecl>(D));
1708
1709 auto HasFeature = [&](StringRef FeatureName) -> bool {
1710 return TI.hasFeature(FeatureName) || FunctionFeatureMap.lookup(FeatureName);
1711 };
1712
1713 for (RISCVInterruptAttr::InterruptType Type : Types) {
1714 switch (Type) {
1715 // The QCI interrupt types require Xqciint
1716 case RISCVInterruptAttr::qcinest:
1717 case RISCVInterruptAttr::qcinonest: {
1718 if (!HasFeature("xqciint")) {
1719 Diag(AL.getLoc(),
1720 diag::err_riscv_attribute_interrupt_requires_extension)
1721 << RISCVInterruptAttr::ConvertInterruptTypeToStr(Type) << "Xqciint";
1722 return;
1723 }
1724 } break;
1725 // The SiFive CLIC interrupt types require Xsfmclic
1726 case RISCVInterruptAttr::SiFiveCLICPreemptible:
1727 case RISCVInterruptAttr::SiFiveCLICStackSwap: {
1728 if (!HasFeature("experimental-xsfmclic")) {
1729 Diag(AL.getLoc(),
1730 diag::err_riscv_attribute_interrupt_requires_extension)
1731 << RISCVInterruptAttr::ConvertInterruptTypeToStr(Type)
1732 << "XSfmclic";
1733 return;
1734 }
1735 } break;
1736 case RISCVInterruptAttr::rnmi: {
1737 if (!HasFeature("smrnmi")) {
1738 Diag(AL.getLoc(),
1739 diag::err_riscv_attribute_interrupt_requires_extension)
1740 << RISCVInterruptAttr::ConvertInterruptTypeToStr(Type) << "Smrnmi";
1741 return;
1742 }
1743 } break;
1744 default:
1745 break;
1746 }
1747 }
1748
1750 Types.end());
1751
1752 D->addAttr(::new (getASTContext()) RISCVInterruptAttr(
1753 getASTContext(), AL, TypesVec.data(), TypesVec.size()));
1754}
1755
1756bool SemaRISCV::isAliasValid(unsigned BuiltinID, StringRef AliasName) {
1757 return BuiltinID >= RISCV::FirstRVVBuiltin &&
1758 BuiltinID <= RISCV::LastRVVBuiltin;
1759}
1760
1762 if (Ext.empty())
1763 return false;
1764
1765 if (!Ext.consume_front("+"))
1766 return false;
1767
1768 return -1 != RISCVISAInfo::getRISCVFeaturesBitsInfo(Ext).second;
1769}
1770
1771bool SemaRISCV::checkTargetVersionAttr(const StringRef Param,
1772 const SourceLocation Loc,
1773 SmallString<64> &NewParam) {
1774 using namespace DiagAttrParams;
1775
1777 Param.split(AttrStrs, ';');
1778
1779 bool HasArch = false;
1780 bool HasPriority = false;
1781 bool HasDefault = false;
1782 bool DuplicateAttr = false;
1783 for (StringRef AttrStr : AttrStrs) {
1784 AttrStr = AttrStr.trim();
1785 // Only support arch=+ext,... syntax.
1786 if (AttrStr.starts_with("arch=+")) {
1787 DuplicateAttr = HasArch;
1788 HasArch = true;
1789 ParsedTargetAttr TargetAttr =
1790 getASTContext().getTargetInfo().parseTargetAttr(AttrStr);
1791
1792 if (TargetAttr.Features.empty() ||
1793 llvm::any_of(TargetAttr.Features, [&](const StringRef Ext) {
1794 return !isValidFMVExtension(Ext);
1795 }))
1796 return Diag(Loc, diag::warn_unsupported_target_attribute)
1797 << Unsupported << None << AttrStr << TargetVersion;
1798 } else if (AttrStr == "default") {
1799 DuplicateAttr = HasDefault;
1800 HasDefault = true;
1801 } else if (AttrStr.consume_front("priority=")) {
1802 DuplicateAttr = HasPriority;
1803 HasPriority = true;
1804 unsigned Digit;
1805 if (AttrStr.getAsInteger(0, Digit))
1806 return Diag(Loc, diag::warn_unsupported_target_attribute)
1807 << Unsupported << None << AttrStr << TargetVersion;
1808 } else {
1809 return Diag(Loc, diag::warn_unsupported_target_attribute)
1810 << Unsupported << None << AttrStr << TargetVersion;
1811 }
1812 }
1813
1814 if (((HasPriority || HasArch) && HasDefault) || DuplicateAttr ||
1815 (HasPriority && !HasArch))
1816 return Diag(Loc, diag::warn_unsupported_target_attribute)
1817 << Unsupported << None << Param << TargetVersion;
1818
1819 NewParam = Param;
1820 return false;
1821}
1822
1824 const SmallVectorImpl<StringRef> &Params,
1826 SmallVectorImpl<SmallString<64>> &NewParams, SourceLocation AttrLoc) {
1827 using namespace DiagAttrParams;
1828
1829 assert(Params.size() == Locs.size() &&
1830 "Mismatch between number of string parameters and locations");
1831
1832 bool HasDefault = false;
1833 for (unsigned I = 0, E = Params.size(); I < E; ++I) {
1834 const StringRef Param = Params[I].trim();
1835 const SourceLocation &Loc = Locs[I];
1836
1838 Param.split(AttrStrs, ';');
1839
1840 bool IsPriority = false;
1841 bool IsDefault = false;
1842 for (StringRef AttrStr : AttrStrs) {
1843 AttrStr = AttrStr.trim();
1844 // Only support arch=+ext,... syntax.
1845 if (AttrStr.starts_with("arch=+")) {
1846 ParsedTargetAttr TargetAttr =
1847 getASTContext().getTargetInfo().parseTargetAttr(AttrStr);
1848
1849 if (TargetAttr.Features.empty() ||
1850 llvm::any_of(TargetAttr.Features, [&](const StringRef Ext) {
1851 return !isValidFMVExtension(Ext);
1852 }))
1853 return Diag(Loc, diag::warn_unsupported_target_attribute)
1854 << Unsupported << None << Param << TargetClones;
1855 } else if (AttrStr == "default") {
1856 IsDefault = true;
1857 HasDefault = true;
1858 } else if (AttrStr.consume_front("priority=")) {
1859 IsPriority = true;
1860 unsigned Digit;
1861 if (AttrStr.getAsInteger(0, Digit))
1862 return Diag(Loc, diag::warn_unsupported_target_attribute)
1863 << Unsupported << None << Param << TargetClones;
1864 } else {
1865 return Diag(Loc, diag::warn_unsupported_target_attribute)
1866 << Unsupported << None << Param << TargetClones;
1867 }
1868 }
1869
1870 if (IsPriority && IsDefault)
1871 return Diag(Loc, diag::warn_unsupported_target_attribute)
1872 << Unsupported << None << Param << TargetClones;
1873
1874 if (llvm::is_contained(NewParams, Param))
1875 Diag(Loc, diag::warn_target_clone_duplicate_options);
1876 NewParams.push_back(Param);
1877 }
1878 if (!HasDefault)
1879 return Diag(AttrLoc, diag::err_target_clone_must_have_default);
1880
1881 return false;
1882}
1883
1885
1886} // namespace clang
Defines the clang::ASTContext interface.
Defines enum values for all the target-independent builtin functions.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Definition MachO.h:31
static bool HasFeature(const Preprocessor &PP, StringRef Feature)
HasFeature - Return true if we recognize and implement the feature specified by the identifier as a s...
Defines the clang::Preprocessor interface.
static const RVVIntrinsicRecord RVSiFiveVectorIntrinsicRecords[]
Definition SemaRISCV.cpp:86
static const RVVIntrinsicRecord RVAndesVectorIntrinsicRecords[]
Definition SemaRISCV.cpp:92
static const PrototypeDescriptor RVAndesVectorSignatureTable[]
Definition SemaRISCV.cpp:74
static const RVVIntrinsicRecord RVVIntrinsicRecords[]
Definition SemaRISCV.cpp:80
static const PrototypeDescriptor RVSiFiveVectorSignatureTable[]
Definition SemaRISCV.cpp:68
sema::RISCVIntrinsicManager::IntrinsicKind IntrinsicKind
Definition SemaRISCV.cpp:39
static QualType RVVType2Qual(ASTContext &Context, const RVVType *Type)
static ArrayRef< PrototypeDescriptor > ProtoSeq2ArrayRef(IntrinsicKind K, uint16_t Index, uint8_t Length)
static const PrototypeDescriptor RVVSignatureTable[]
Definition SemaRISCV.cpp:62
This file declares semantic analysis functions specific to RISC-V.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:227
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
TranslationUnitDecl * getTranslationUnitDecl() const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:924
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
SourceLocation getLoc() const
This class is used for builtin types like 'int'.
Definition TypeBase.h:3219
Kind getKind() const
Definition TypeBase.h:3267
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2946
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition Expr.h:3150
SourceLocation getBeginLoc() const
Definition Expr.h:3280
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
Definition Expr.h:3163
Expr * getCallee()
Definition Expr.h:3093
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Definition Expr.h:3137
Decl * getCalleeDecl()
Definition Expr.h:3123
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1273
SourceLocation getBeginLoc() const
Definition Expr.h:1352
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
T * getAttr() const
Definition DeclBase.h:581
void addAttr(Attr *A)
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
SourceLocation getLocation() const
Definition DeclBase.h:447
This represents one expression.
Definition Expr.h:112
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition Expr.cpp:3095
void setType(QualType t)
Definition Expr.h:145
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition Expr.h:177
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:194
QualType getType() const
Definition Expr.h:144
bool isFPConstrained() const
Represents a function declaration or definition.
Definition Decl.h:2015
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
Definition Decl.h:2204
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
Definition Lookup.h:475
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Definition Lookup.h:666
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
Definition Decl.h:1838
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Definition Decl.cpp:2923
ParsedAttr - Represents a syntactic attribute.
Definition ParsedAttr.h:119
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
Definition ParsedAttr.h:371
bool checkAtMostNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at most as many args as Num.
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3383
QualType getPointeeType() const
Definition TypeBase.h:3393
IdentifierTable & getIdentifierTable()
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8436
QualType getCanonicalType() const
Definition TypeBase.h:8488
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8530
static llvm::SmallVector< Policy > getSupportedMaskedPolicies(bool HasTailPolicy, bool HasMaskPolicy)
static llvm::SmallVector< PrototypeDescriptor > computeBuiltinTypes(llvm::ArrayRef< PrototypeDescriptor > Prototype, bool IsMasked, bool HasMaskedOffOperand, bool HasVL, unsigned NF, PolicyScheme DefaultScheme, Policy PolicyAttrs, bool IsTuple)
static std::string getSuffixStr(RVVTypeCache &TypeCache, BasicType Type, int Log2LMUL, llvm::ArrayRef< PrototypeDescriptor > PrototypeDescriptors)
static void updateNamesAndPolicy(bool IsMasked, bool HasPolicy, std::string &Name, std::string &BuiltinName, std::string &OverloadedName, Policy &PolicyAttrs, bool HasFRMRoundModeOp, bool AltFmt)
static llvm::SmallVector< Policy > getSupportedUnMaskedPolicies()
std::optional< RVVTypes > computeTypes(BasicType BT, int Log2LMUL, unsigned NF, llvm::ArrayRef< PrototypeDescriptor > Prototype)
Compute output and input types by applying different config (basic type and LMUL with type transforme...
SemaBase(Sema &S)
Definition SemaBase.cpp:7
ASTContext & getASTContext() const
Definition SemaBase.cpp:9
Sema & SemaRef
Definition SemaBase.h:40
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
bool CheckBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall)
bool CheckLMUL(CallExpr *TheCall, unsigned ArgNum)
bool isAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool isValidFMVExtension(StringRef Ext)
bool DeclareAndesVectorBuiltins
Indicate RISC-V Andes vector builtin functions enabled or not.
Definition SemaRISCV.h:55
bool DeclareSiFiveVectorBuiltins
Indicate RISC-V SiFive vector builtin functions enabled or not.
Definition SemaRISCV.h:52
bool checkTargetClonesAttr(const SmallVectorImpl< StringRef > &Params, const SmallVectorImpl< SourceLocation > &Locs, SmallVectorImpl< SmallString< 64 > > &NewParams, SourceLocation AttrLoc)
void checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D, const llvm::StringMap< bool > &FeatureMap)
bool isValidRVVBitcast(QualType srcType, QualType destType)
Are the two types RVV-bitcast-compatible types?
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
bool checkTargetVersionAttr(const StringRef Param, const SourceLocation Loc, SmallString< 64 > &NewParam)
bool DeclareRVVBuiltins
Indicate RISC-V vector builtin functions enabled or not.
Definition SemaRISCV.h:49
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:868
ASTContext & Context
Definition Sema.h:1308
FPOptions & getCurFPFeatures()
Definition Sema.h:934
SemaRISCV & RISCV()
Definition Sema.h:1548
Encodes a location in the source.
SourceLocation getBegin() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:343
Exposes information about the current target.
Definition TargetInfo.h:227
virtual CallingConv getDefaultCallingConv() const
Gets the default calling convention for the given target.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
The base class of the type hierarchy.
Definition TypeBase.h:1871
bool isBlockPointerType() const
Definition TypeBase.h:8693
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:9083
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9333
bool isVectorType() const
Definition TypeBase.h:8812
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
Definition Type.cpp:2676
bool isFloatingType() const
Definition Type.cpp:2377
bool isAnyPointerType() const
Definition TypeBase.h:8681
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9266
Represents a GCC generic vector type.
Definition TypeBase.h:4230
VectorKind getVectorKind() const
Definition TypeBase.h:4250
Defines the clang::TargetInfo interface.
Enums for the diagnostics of target, target_version and target_clones.
Definition Sema.h:854
RISCV builtins.
std::vector< RVVTypePtr > RVVTypes
The JSON file list parser is used to communicate input to InstallAPI.
@ ExpectedFunction
QualType getFunctionOrMethodResultType(const Decl *D)
Definition Attr.h:98
std::unique_ptr< sema::RISCVIntrinsicManager > CreateRISCVIntrinsicManager(Sema &S)
@ SC_Extern
Definition Specifiers.h:252
@ SC_None
Definition Specifiers.h:251
@ Result
The result type of a method or function.
Definition TypeBase.h:905
static bool CheckInvalidVLENandLMUL(const TargetInfo &TI, llvm::StringMap< bool > &FunctionFeatureMap, CallExpr *TheCall, Sema &S, QualType Type, int EGW)
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
Definition Attr.h:55
unsigned getFunctionOrMethodNumParams(const Decl *D)
getFunctionOrMethodNumParams - Return number of function or method parameters.
Definition Attr.h:64
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
Definition TypeBase.h:4215
U cast(CodeGen::Address addr)
Definition Address.h:327
@ None
The alignment was not explicit in code.
Definition ASTContext.h:180
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
unsigned int uint32_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
Contains information gathered from parsing the contents of TargetAttr.
Definition TargetInfo.h:60
std::vector< std::string > Features
Definition TargetInfo.h:61