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