mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 14:06:06 +00:00
[clang] Introduce SemaRISCV
(#92682)
This patch moves `Sema` functions that are specific for RISC-V into the new `SemaRISCV` class. This continues previous efforts to split `Sema` up. Additional context can be found in https://github.com/llvm/llvm-project/pull/84184. This PR is somewhat different from previous PRs on this topic: 1. Splitting out target-specific functions wasn't previously discussed. It felt quite natural to do, though. 2. I had to make some static function in `SemaChecking.cpp` member functions of `Sema` in order to use them in `SemaRISCV`. 3. I dropped "RISCV" from identifiers, but decided to leave "RVV" (RISC-V "V" vector extensions) intact. I think it's an idiomatic abbreviation at this point, but I'm open to input from contributors in that area. 4. I repurposed `SemaRISCVVectorLookup.cpp` for `SemaRISCV`. I think this was a successful experiment, which both helps the goal of splitting `Sema` up, and shows a way to approach `SemaChecking.cpp`, which I wasn't sure how to approach before. As we move more target-specific function out of there, we'll gradually make the checking "framework" inside `SemaChecking.cpp` public, which is currently a whole bunch of static functions. This would enable us to move more functions outside of `SemaChecking.cpp`.
This commit is contained in:
parent
058e4454e8
commit
a640a2e020
@ -175,6 +175,7 @@ class SemaObjC;
|
||||
class SemaOpenACC;
|
||||
class SemaOpenMP;
|
||||
class SemaPseudoObject;
|
||||
class SemaRISCV;
|
||||
class SemaSYCL;
|
||||
class StandardConversionSequence;
|
||||
class Stmt;
|
||||
@ -491,7 +492,6 @@ class Sema final : public SemaBase {
|
||||
// 29. Constraints and Concepts (SemaConcept.cpp)
|
||||
// 30. Types (SemaType.cpp)
|
||||
// 31. FixIt Helpers (SemaFixItUtils.cpp)
|
||||
// 32. Name Lookup for RISC-V Vector Intrinsic (SemaRISCVVectorLookup.cpp)
|
||||
|
||||
/// \name Semantic Analysis
|
||||
/// Implementations are in Sema.cpp
|
||||
@ -1027,6 +1027,11 @@ public:
|
||||
return *PseudoObjectPtr;
|
||||
}
|
||||
|
||||
SemaRISCV &RISCV() {
|
||||
assert(RISCVPtr);
|
||||
return *RISCVPtr;
|
||||
}
|
||||
|
||||
SemaSYCL &SYCL() {
|
||||
assert(SYCLPtr);
|
||||
return *SYCLPtr;
|
||||
@ -1069,6 +1074,7 @@ private:
|
||||
std::unique_ptr<SemaOpenACC> OpenACCPtr;
|
||||
std::unique_ptr<SemaOpenMP> OpenMPPtr;
|
||||
std::unique_ptr<SemaPseudoObject> PseudoObjectPtr;
|
||||
std::unique_ptr<SemaRISCV> RISCVPtr;
|
||||
std::unique_ptr<SemaSYCL> SYCLPtr;
|
||||
|
||||
///@}
|
||||
@ -2044,6 +2050,23 @@ public:
|
||||
|
||||
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc);
|
||||
|
||||
bool BuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result);
|
||||
bool BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, int High,
|
||||
bool RangeIsError = true);
|
||||
bool BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum,
|
||||
unsigned Multiple);
|
||||
bool BuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum);
|
||||
bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum,
|
||||
unsigned ArgBits);
|
||||
bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, int ArgNum,
|
||||
unsigned ArgBits);
|
||||
|
||||
bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount);
|
||||
bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount);
|
||||
bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount,
|
||||
unsigned MaxArgCount);
|
||||
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount);
|
||||
|
||||
private:
|
||||
void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
|
||||
const ArraySubscriptExpr *ASE = nullptr,
|
||||
@ -2112,11 +2135,7 @@ private:
|
||||
bool CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
|
||||
CallExpr *TheCall);
|
||||
bool CheckAMDGCNBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
|
||||
bool CheckRISCVLMUL(CallExpr *TheCall, unsigned ArgNum);
|
||||
bool CheckRISCVBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
|
||||
CallExpr *TheCall);
|
||||
void checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D,
|
||||
const llvm::StringMap<bool> &FeatureMap);
|
||||
|
||||
bool CheckLoongArchBuiltinFunctionCall(const TargetInfo &TI,
|
||||
unsigned BuiltinID, CallExpr *TheCall);
|
||||
bool CheckWebAssemblyBuiltinFunctionCall(const TargetInfo &TI,
|
||||
@ -2146,16 +2165,6 @@ private:
|
||||
ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
|
||||
ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
|
||||
AtomicExpr::AtomicOp Op);
|
||||
bool BuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result);
|
||||
bool BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, int High,
|
||||
bool RangeIsError = true);
|
||||
bool BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum,
|
||||
unsigned Multiple);
|
||||
bool BuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum);
|
||||
bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum,
|
||||
unsigned ArgBits);
|
||||
bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, int ArgNum,
|
||||
unsigned ArgBits);
|
||||
bool BuiltinARMSpecialReg(unsigned BuiltinID, CallExpr *TheCall, int ArgNum,
|
||||
unsigned ExpectedFieldNum, bool AllowName);
|
||||
bool BuiltinARMMemoryTaggingCall(unsigned BuiltinID, CallExpr *TheCall);
|
||||
@ -5890,7 +5899,6 @@ public:
|
||||
SourceLocation Loc, bool IsCompAssign);
|
||||
|
||||
bool isValidSveBitcast(QualType srcType, QualType destType);
|
||||
bool isValidRVVBitcast(QualType srcType, QualType destType);
|
||||
|
||||
bool areMatrixTypesOfTheSameDimension(QualType srcTy, QualType destTy);
|
||||
|
||||
@ -11686,27 +11694,6 @@ public:
|
||||
/// Triggered by declaration-attribute processing.
|
||||
void ProcessAPINotes(Decl *D);
|
||||
|
||||
///@}
|
||||
//
|
||||
//
|
||||
// -------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
|
||||
/// \name Name Lookup for RISC-V Vector Intrinsic
|
||||
/// Implementations are in SemaRISCVVectorLookup.cpp
|
||||
///@{
|
||||
|
||||
public:
|
||||
/// Indicate RISC-V vector builtin functions enabled or not.
|
||||
bool DeclareRISCVVBuiltins = false;
|
||||
|
||||
/// Indicate RISC-V SiFive vector builtin functions enabled or not.
|
||||
bool DeclareRISCVSiFiveVectorBuiltins = false;
|
||||
|
||||
private:
|
||||
std::unique_ptr<sema::RISCVIntrinsicManager> RVIntrinsicManager;
|
||||
|
||||
///@}
|
||||
};
|
||||
|
||||
@ -11729,9 +11716,6 @@ void Sema::PragmaStack<Sema::AlignPackInfo>::Act(SourceLocation PragmaLocation,
|
||||
PragmaMsStackAction Action,
|
||||
llvm::StringRef StackSlotLabel,
|
||||
AlignPackInfo Value);
|
||||
|
||||
std::unique_ptr<sema::RISCVIntrinsicManager>
|
||||
CreateRISCVIntrinsicManager(Sema &S);
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
52
clang/include/clang/Sema/SemaRISCV.h
Normal file
52
clang/include/clang/Sema/SemaRISCV.h
Normal file
@ -0,0 +1,52 @@
|
||||
//===----- SemaRISCV.h ---- RISC-V target-specific routines ---*- C++ -*---===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// \file
|
||||
/// This file declares semantic analysis functions specific to RISC-V.
|
||||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_SEMA_SEMARISCV_H
|
||||
#define LLVM_CLANG_SEMA_SEMARISCV_H
|
||||
|
||||
#include "clang/AST/DeclBase.h"
|
||||
#include "clang/AST/Expr.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "clang/Basic/SourceLocation.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "clang/Sema/RISCVIntrinsicManager.h"
|
||||
#include "clang/Sema/SemaBase.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include <memory>
|
||||
|
||||
namespace clang {
|
||||
class SemaRISCV : public SemaBase {
|
||||
public:
|
||||
SemaRISCV(Sema &S);
|
||||
|
||||
bool CheckLMUL(CallExpr *TheCall, unsigned ArgNum);
|
||||
bool CheckBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
|
||||
CallExpr *TheCall);
|
||||
void checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D,
|
||||
const llvm::StringMap<bool> &FeatureMap);
|
||||
|
||||
bool isValidRVVBitcast(QualType srcType, QualType destType);
|
||||
|
||||
/// Indicate RISC-V vector builtin functions enabled or not.
|
||||
bool DeclareRVVBuiltins = false;
|
||||
|
||||
/// Indicate RISC-V SiFive vector builtin functions enabled or not.
|
||||
bool DeclareSiFiveVectorBuiltins = false;
|
||||
|
||||
std::unique_ptr<sema::RISCVIntrinsicManager> IntrinsicManager;
|
||||
};
|
||||
|
||||
std::unique_ptr<sema::RISCVIntrinsicManager>
|
||||
CreateRISCVIntrinsicManager(Sema &S);
|
||||
} // namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_SEMA_SEMARISCV_H
|
@ -23,6 +23,7 @@
|
||||
#include "clang/Sema/Scope.h"
|
||||
#include "clang/Sema/SemaCUDA.h"
|
||||
#include "clang/Sema/SemaCodeCompletion.h"
|
||||
#include "clang/Sema/SemaRISCV.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include <optional>
|
||||
@ -4154,7 +4155,7 @@ void PragmaRISCVHandler::HandlePragma(Preprocessor &PP,
|
||||
}
|
||||
|
||||
if (II->isStr("vector"))
|
||||
Actions.DeclareRISCVVBuiltins = true;
|
||||
Actions.RISCV().DeclareRVVBuiltins = true;
|
||||
else if (II->isStr("sifive_vector"))
|
||||
Actions.DeclareRISCVSiFiveVectorBuiltins = true;
|
||||
Actions.RISCV().DeclareSiFiveVectorBuiltins = true;
|
||||
}
|
||||
|
@ -50,6 +50,7 @@
|
||||
#include "clang/Sema/SemaOpenACC.h"
|
||||
#include "clang/Sema/SemaOpenMP.h"
|
||||
#include "clang/Sema/SemaPseudoObject.h"
|
||||
#include "clang/Sema/SemaRISCV.h"
|
||||
#include "clang/Sema/SemaSYCL.h"
|
||||
#include "clang/Sema/TemplateDeduction.h"
|
||||
#include "clang/Sema/TemplateInstCallback.h"
|
||||
@ -212,6 +213,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
|
||||
OpenACCPtr(std::make_unique<SemaOpenACC>(*this)),
|
||||
OpenMPPtr(std::make_unique<SemaOpenMP>(*this)),
|
||||
PseudoObjectPtr(std::make_unique<SemaPseudoObject>(*this)),
|
||||
RISCVPtr(std::make_unique<SemaRISCV>(*this)),
|
||||
SYCLPtr(std::make_unique<SemaSYCL>(*this)),
|
||||
MSPointerToMemberRepresentationMethod(
|
||||
LangOpts.getMSPointerToMemberRepresentationMethod()),
|
||||
@ -2051,7 +2053,7 @@ void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) {
|
||||
if (TI.hasRISCVVTypes() && Ty->isRVVSizelessBuiltinType() && FD) {
|
||||
llvm::StringMap<bool> CallerFeatureMap;
|
||||
Context.getFunctionFeatureMap(CallerFeatureMap, FD);
|
||||
checkRVVTypeSupport(Ty, Loc, D, CallerFeatureMap);
|
||||
RISCV().checkRVVTypeSupport(Ty, Loc, D, CallerFeatureMap);
|
||||
}
|
||||
|
||||
// Don't allow SVE types in functions without a SVE target.
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "clang/Sema/Initialization.h"
|
||||
#include "clang/Sema/SemaInternal.h"
|
||||
#include "clang/Sema/SemaObjC.h"
|
||||
#include "clang/Sema/SemaRISCV.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include <set>
|
||||
@ -2391,7 +2392,7 @@ static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr,
|
||||
}
|
||||
|
||||
// Allow bitcasting between SVE VLATs and VLSTs, and vice-versa.
|
||||
if (Self.isValidRVVBitcast(SrcType, DestType)) {
|
||||
if (Self.RISCV().isValidRVVBitcast(SrcType, DestType)) {
|
||||
Kind = CK_BitCast;
|
||||
return TC_Success;
|
||||
}
|
||||
@ -3002,7 +3003,7 @@ void CastOperation::CheckCStyleCast() {
|
||||
|
||||
// Allow bitcasting between compatible RVV vector types.
|
||||
if ((SrcType->isVectorType() || DestType->isVectorType()) &&
|
||||
Self.isValidRVVBitcast(SrcType, DestType)) {
|
||||
Self.RISCV().isValidRVVBitcast(SrcType, DestType)) {
|
||||
Kind = CK_BitCast;
|
||||
return;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -50,6 +50,7 @@
|
||||
#include "clang/Sema/SemaInternal.h"
|
||||
#include "clang/Sema/SemaObjC.h"
|
||||
#include "clang/Sema/SemaOpenMP.h"
|
||||
#include "clang/Sema/SemaRISCV.h"
|
||||
#include "clang/Sema/Template.h"
|
||||
#include "llvm/ADT/STLForwardCompat.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
@ -8926,8 +8927,8 @@ void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {
|
||||
const FunctionDecl *FD = cast<FunctionDecl>(CurContext);
|
||||
llvm::StringMap<bool> CallerFeatureMap;
|
||||
Context.getFunctionFeatureMap(CallerFeatureMap, FD);
|
||||
checkRVVTypeSupport(T, NewVD->getLocation(), cast<Decl>(CurContext),
|
||||
CallerFeatureMap);
|
||||
RISCV().checkRVVTypeSupport(T, NewVD->getLocation(), cast<Decl>(CurContext),
|
||||
CallerFeatureMap);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7527,27 +7527,6 @@ bool Sema::isValidSveBitcast(QualType srcTy, QualType destTy) {
|
||||
ValidScalableConversion(destTy, srcTy);
|
||||
}
|
||||
|
||||
/// Are the two types RVV-bitcast-compatible types? I.e. is bitcasting from the
|
||||
/// first RVV type (e.g. an RVV scalable type) to the second type (e.g. an RVV
|
||||
/// VLS type) allowed?
|
||||
///
|
||||
/// This will also return false if the two given types do not make sense from
|
||||
/// the perspective of RVV bitcasts.
|
||||
bool Sema::isValidRVVBitcast(QualType srcTy, QualType destTy) {
|
||||
assert(srcTy->isVectorType() || destTy->isVectorType());
|
||||
|
||||
auto ValidScalableConversion = [](QualType FirstType, QualType SecondType) {
|
||||
if (!FirstType->isRVVSizelessBuiltinType())
|
||||
return false;
|
||||
|
||||
const auto *VecTy = SecondType->getAs<VectorType>();
|
||||
return VecTy && VecTy->getVectorKind() == VectorKind::RVVFixedLengthData;
|
||||
};
|
||||
|
||||
return ValidScalableConversion(srcTy, destTy) ||
|
||||
ValidScalableConversion(destTy, srcTy);
|
||||
}
|
||||
|
||||
/// Are the two types matrix types and do they have the same dimensions i.e.
|
||||
/// do they have the same number of rows and the same number of columns?
|
||||
bool Sema::areMatrixTypesOfTheSameDimension(QualType srcTy, QualType destTy) {
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "clang/Sema/ScopeInfo.h"
|
||||
#include "clang/Sema/Sema.h"
|
||||
#include "clang/Sema/SemaInternal.h"
|
||||
#include "clang/Sema/SemaRISCV.h"
|
||||
#include "clang/Sema/TemplateDeduction.h"
|
||||
#include "clang/Sema/TypoCorrection.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
@ -945,13 +946,13 @@ bool Sema::LookupBuiltin(LookupResult &R) {
|
||||
}
|
||||
}
|
||||
|
||||
if (DeclareRISCVVBuiltins || DeclareRISCVSiFiveVectorBuiltins) {
|
||||
if (!RVIntrinsicManager)
|
||||
RVIntrinsicManager = CreateRISCVIntrinsicManager(*this);
|
||||
if (RISCV().DeclareRVVBuiltins || RISCV().DeclareSiFiveVectorBuiltins) {
|
||||
if (!RISCV().IntrinsicManager)
|
||||
RISCV().IntrinsicManager = CreateRISCVIntrinsicManager(*this);
|
||||
|
||||
RVIntrinsicManager->InitIntrinsicList();
|
||||
RISCV().IntrinsicManager->InitIntrinsicList();
|
||||
|
||||
if (RVIntrinsicManager->CreateIntrinsicIfFound(R, II, PP))
|
||||
if (RISCV().IntrinsicManager->CreateIntrinsicIfFound(R, II, PP))
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
//==- SemaRISCVVectorLookup.cpp - Name Lookup for RISC-V Vector Intrinsic -==//
|
||||
//===------ SemaRISCV.cpp ------- RISC-V target-specific routines ---------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@ -6,20 +6,24 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements name lookup for RISC-V vector intrinsic.
|
||||
// This file implements semantic analysis functions specific to RISC-V.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/Sema/SemaRISCV.h"
|
||||
#include "clang/AST/ASTContext.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/Basic/Builtins.h"
|
||||
#include "clang/Basic/TargetBuiltins.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "clang/Lex/Preprocessor.h"
|
||||
#include "clang/Sema/Initialization.h"
|
||||
#include "clang/Sema/Lookup.h"
|
||||
#include "clang/Sema/RISCVIntrinsicManager.h"
|
||||
#include "clang/Sema/Sema.h"
|
||||
#include "clang/Support/RISCVVIntrinsicUtils.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/TargetParser/RISCVTargetParser.h"
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@ -166,7 +170,6 @@ private:
|
||||
// Mapping function name to RVVOverloadIntrinsicDef.
|
||||
StringMap<RVVOverloadIntrinsicDef> OverloadIntrinsics;
|
||||
|
||||
|
||||
// Create RVVIntrinsicDef.
|
||||
void InitRVVIntrinsic(const RVVIntrinsicRecord &Record, StringRef SuffixStr,
|
||||
StringRef OverloadedSuffixStr, bool IsMask,
|
||||
@ -342,18 +345,17 @@ void RISCVIntrinsicManagerImpl::ConstructRVVIntrinsics(
|
||||
/*IsMask=*/true, *PolicyTypes, MaskedHasPolicy, P);
|
||||
}
|
||||
} // End for different LMUL
|
||||
} // End for different TypeRange
|
||||
} // End for different TypeRange
|
||||
}
|
||||
}
|
||||
|
||||
void RISCVIntrinsicManagerImpl::InitIntrinsicList() {
|
||||
|
||||
if (S.DeclareRISCVVBuiltins && !ConstructedRISCVVBuiltins) {
|
||||
if (S.RISCV().DeclareRVVBuiltins && !ConstructedRISCVVBuiltins) {
|
||||
ConstructedRISCVVBuiltins = true;
|
||||
ConstructRVVIntrinsics(RVVIntrinsicRecords,
|
||||
IntrinsicKind::RVV);
|
||||
ConstructRVVIntrinsics(RVVIntrinsicRecords, IntrinsicKind::RVV);
|
||||
}
|
||||
if (S.DeclareRISCVSiFiveVectorBuiltins &&
|
||||
if (S.RISCV().DeclareSiFiveVectorBuiltins &&
|
||||
!ConstructedRISCVSiFiveVectorBuiltins) {
|
||||
ConstructedRISCVSiFiveVectorBuiltins = true;
|
||||
ConstructRVVIntrinsics(RVSiFiveVectorIntrinsicRecords,
|
||||
@ -501,4 +503,925 @@ std::unique_ptr<clang::sema::RISCVIntrinsicManager>
|
||||
CreateRISCVIntrinsicManager(Sema &S) {
|
||||
return std::make_unique<RISCVIntrinsicManagerImpl>(S);
|
||||
}
|
||||
|
||||
bool SemaRISCV::CheckLMUL(CallExpr *TheCall, unsigned ArgNum) {
|
||||
llvm::APSInt Result;
|
||||
|
||||
// We can't check the value of a dependent argument.
|
||||
Expr *Arg = TheCall->getArg(ArgNum);
|
||||
if (Arg->isTypeDependent() || Arg->isValueDependent())
|
||||
return false;
|
||||
|
||||
// Check constant-ness first.
|
||||
if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result))
|
||||
return true;
|
||||
|
||||
int64_t Val = Result.getSExtValue();
|
||||
if ((Val >= 0 && Val <= 3) || (Val >= 5 && Val <= 7))
|
||||
return false;
|
||||
|
||||
return Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_invalid_lmul)
|
||||
<< Arg->getSourceRange();
|
||||
}
|
||||
|
||||
static bool CheckInvalidVLENandLMUL(const TargetInfo &TI, CallExpr *TheCall,
|
||||
Sema &S, QualType Type, int EGW) {
|
||||
assert((EGW == 128 || EGW == 256) && "EGW can only be 128 or 256 bits");
|
||||
|
||||
// LMUL * VLEN >= EGW
|
||||
ASTContext::BuiltinVectorTypeInfo Info =
|
||||
S.Context.getBuiltinVectorTypeInfo(Type->castAs<BuiltinType>());
|
||||
unsigned ElemSize = S.Context.getTypeSize(Info.ElementType);
|
||||
unsigned MinElemCount = Info.EC.getKnownMinValue();
|
||||
|
||||
unsigned EGS = EGW / ElemSize;
|
||||
// If EGS is less than or equal to the minimum number of elements, then the
|
||||
// type is valid.
|
||||
if (EGS <= MinElemCount)
|
||||
return false;
|
||||
|
||||
// Otherwise, we need vscale to be at least EGS / MinElemCont.
|
||||
assert(EGS % MinElemCount == 0);
|
||||
unsigned VScaleFactor = EGS / MinElemCount;
|
||||
// Vscale is VLEN/RVVBitsPerBlock.
|
||||
unsigned MinRequiredVLEN = VScaleFactor * llvm::RISCV::RVVBitsPerBlock;
|
||||
std::string RequiredExt = "zvl" + std::to_string(MinRequiredVLEN) + "b";
|
||||
if (!TI.hasFeature(RequiredExt))
|
||||
return S.Diag(TheCall->getBeginLoc(),
|
||||
diag::err_riscv_type_requires_extension)
|
||||
<< Type << RequiredExt;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SemaRISCV::CheckBuiltinFunctionCall(const TargetInfo &TI,
|
||||
unsigned BuiltinID,
|
||||
CallExpr *TheCall) {
|
||||
ASTContext &Context = getASTContext();
|
||||
// vmulh.vv, vmulh.vx, vmulhu.vv, vmulhu.vx, vmulhsu.vv, vmulhsu.vx,
|
||||
// vsmul.vv, vsmul.vx are not included for EEW=64 in Zve64*.
|
||||
switch (BuiltinID) {
|
||||
default:
|
||||
break;
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhsu_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulhu_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vmulh_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu: {
|
||||
ASTContext::BuiltinVectorTypeInfo Info = Context.getBuiltinVectorTypeInfo(
|
||||
TheCall->getType()->castAs<BuiltinType>());
|
||||
|
||||
if (Context.getTypeSize(Info.ElementType) == 64 && !TI.hasFeature("v"))
|
||||
return Diag(TheCall->getBeginLoc(),
|
||||
diag::err_riscv_builtin_requires_extension)
|
||||
<< /* IsExtension */ true << TheCall->getSourceRange() << "v";
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (BuiltinID) {
|
||||
case RISCVVector::BI__builtin_rvv_vsetvli:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3) ||
|
||||
CheckLMUL(TheCall, 2);
|
||||
case RISCVVector::BI__builtin_rvv_vsetvlimax:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
|
||||
CheckLMUL(TheCall, 1);
|
||||
case RISCVVector::BI__builtin_rvv_vget_v: {
|
||||
ASTContext::BuiltinVectorTypeInfo ResVecInfo =
|
||||
Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(
|
||||
TheCall->getType().getCanonicalType().getTypePtr()));
|
||||
ASTContext::BuiltinVectorTypeInfo VecInfo =
|
||||
Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(
|
||||
TheCall->getArg(0)->getType().getCanonicalType().getTypePtr()));
|
||||
unsigned MaxIndex;
|
||||
if (VecInfo.NumVectors != 1) // vget for tuple type
|
||||
MaxIndex = VecInfo.NumVectors;
|
||||
else // vget for non-tuple type
|
||||
MaxIndex = (VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors) /
|
||||
(ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors);
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1);
|
||||
}
|
||||
case RISCVVector::BI__builtin_rvv_vset_v: {
|
||||
ASTContext::BuiltinVectorTypeInfo ResVecInfo =
|
||||
Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(
|
||||
TheCall->getType().getCanonicalType().getTypePtr()));
|
||||
ASTContext::BuiltinVectorTypeInfo VecInfo =
|
||||
Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(
|
||||
TheCall->getArg(2)->getType().getCanonicalType().getTypePtr()));
|
||||
unsigned MaxIndex;
|
||||
if (ResVecInfo.NumVectors != 1) // vset for tuple type
|
||||
MaxIndex = ResVecInfo.NumVectors;
|
||||
else // vset fo non-tuple type
|
||||
MaxIndex = (ResVecInfo.EC.getKnownMinValue() * ResVecInfo.NumVectors) /
|
||||
(VecInfo.EC.getKnownMinValue() * VecInfo.NumVectors);
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1);
|
||||
}
|
||||
// Vector Crypto
|
||||
case RISCVVector::BI__builtin_rvv_vaeskf1_vi_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaeskf2_vi_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaeskf2_vi:
|
||||
case RISCVVector::BI__builtin_rvv_vsm4k_vi_tu: {
|
||||
QualType Op1Type = TheCall->getArg(0)->getType();
|
||||
QualType Op2Type = TheCall->getArg(1)->getType();
|
||||
return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) ||
|
||||
CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type, 128) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
|
||||
}
|
||||
case RISCVVector::BI__builtin_rvv_vsm3c_vi_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsm3c_vi: {
|
||||
QualType Op1Type = TheCall->getArg(0)->getType();
|
||||
return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 256) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
|
||||
}
|
||||
case RISCVVector::BI__builtin_rvv_vaeskf1_vi:
|
||||
case RISCVVector::BI__builtin_rvv_vsm4k_vi: {
|
||||
QualType Op1Type = TheCall->getArg(0)->getType();
|
||||
return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);
|
||||
}
|
||||
case RISCVVector::BI__builtin_rvv_vaesdf_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vaesdf_vs:
|
||||
case RISCVVector::BI__builtin_rvv_vaesdm_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vaesdm_vs:
|
||||
case RISCVVector::BI__builtin_rvv_vaesef_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vaesef_vs:
|
||||
case RISCVVector::BI__builtin_rvv_vaesem_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vaesem_vs:
|
||||
case RISCVVector::BI__builtin_rvv_vaesz_vs:
|
||||
case RISCVVector::BI__builtin_rvv_vsm4r_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vsm4r_vs:
|
||||
case RISCVVector::BI__builtin_rvv_vaesdf_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaesdf_vs_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaesdm_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaesdm_vs_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaesef_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaesef_vs_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaesem_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaesem_vs_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaesz_vs_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsm4r_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsm4r_vs_tu: {
|
||||
QualType Op1Type = TheCall->getArg(0)->getType();
|
||||
QualType Op2Type = TheCall->getArg(1)->getType();
|
||||
return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type, 128) ||
|
||||
CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type, 128);
|
||||
}
|
||||
case RISCVVector::BI__builtin_rvv_vsha2ch_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vsha2cl_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vsha2ms_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vsha2ch_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsha2cl_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsha2ms_vv_tu: {
|
||||
QualType Op1Type = TheCall->getArg(0)->getType();
|
||||
QualType Op2Type = TheCall->getArg(1)->getType();
|
||||
QualType Op3Type = TheCall->getArg(2)->getType();
|
||||
ASTContext::BuiltinVectorTypeInfo Info =
|
||||
Context.getBuiltinVectorTypeInfo(Op1Type->castAs<BuiltinType>());
|
||||
uint64_t ElemSize = Context.getTypeSize(Info.ElementType);
|
||||
if (ElemSize == 64 && !TI.hasFeature("zvknhb"))
|
||||
return Diag(TheCall->getBeginLoc(),
|
||||
diag::err_riscv_builtin_requires_extension)
|
||||
<< /* IsExtension */ true << TheCall->getSourceRange() << "zvknb";
|
||||
|
||||
return CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op1Type,
|
||||
ElemSize * 4) ||
|
||||
CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op2Type,
|
||||
ElemSize * 4) ||
|
||||
CheckInvalidVLENandLMUL(TI, TheCall, SemaRef, Op3Type, ElemSize * 4);
|
||||
}
|
||||
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_i_se:
|
||||
// bit_27_26, bit_24_20, bit_11_7, simm5, sew, log2lmul
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15) ||
|
||||
CheckLMUL(TheCall, 5);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_iv_se:
|
||||
// bit_27_26, bit_11_7, vs2, simm5
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_i:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_i_se:
|
||||
// bit_27_26, bit_24_20, simm5
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_iv:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_iv_se:
|
||||
// bit_27_26, vs2, simm5
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 2, -16, 15);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_ivv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_ivw_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_ivv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_ivw_se:
|
||||
// bit_27_26, vd, vs2, simm5
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 3, -16, 15);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_x_se:
|
||||
// bit_27_26, bit_24_20, bit_11_7, xs1, sew, log2lmul
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
|
||||
CheckLMUL(TheCall, 5);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_xv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_vv_se:
|
||||
// bit_27_26, bit_11_7, vs2, xs1/vs1
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_x:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_x_se:
|
||||
// bit_27_26, bit_24-20, xs1
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_vvv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_xvv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_vvw_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_xvw_se:
|
||||
// bit_27_26, vd, vs2, xs1
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_xv:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_vv:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_xv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_vv_se:
|
||||
// bit_27_26, vs2, xs1/vs1
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_xvv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_vvv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_xvw_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_vvw_se:
|
||||
// bit_27_26, vd, vs2, xs1/vs1
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_fv_se:
|
||||
// bit_26, bit_11_7, vs2, fs1
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1) ||
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 31);
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_fvv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_fvw_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_fvv_se:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_fvw_se:
|
||||
// bit_26, vd, vs2, fs1
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_fv:
|
||||
case RISCVVector::BI__builtin_rvv_sf_vc_v_fv_se:
|
||||
// bit_26, vs2, fs1
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
|
||||
// Check if byteselect is in [0, 3]
|
||||
case RISCV::BI__builtin_riscv_aes32dsi:
|
||||
case RISCV::BI__builtin_riscv_aes32dsmi:
|
||||
case RISCV::BI__builtin_riscv_aes32esi:
|
||||
case RISCV::BI__builtin_riscv_aes32esmi:
|
||||
case RISCV::BI__builtin_riscv_sm4ks:
|
||||
case RISCV::BI__builtin_riscv_sm4ed:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
|
||||
// Check if rnum is in [0, 10]
|
||||
case RISCV::BI__builtin_riscv_aes64ks1i:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 10);
|
||||
// Check if value range for vxrm is in [0, 3]
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vv:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vx:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wv:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wx:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wv:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wx:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wv_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wx_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wx_m:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wv_m:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wx_m:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 3);
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vaaddu_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vaadd_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vasubu_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vasub_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wv_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wx_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wv_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wx_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vsmul_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vssra_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vssrl_vx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclip_wx_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wv_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vnclipu_wx_tumu:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 3);
|
||||
case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfrec7_v_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 4);
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_m:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 4);
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tu:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfsqrt_v_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrec7_v_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_x_f_v_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_xu_f_v_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_x_v_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfcvt_f_xu_v_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_x_f_v_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwcvt_xu_f_v_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_x_f_w_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_xu_f_w_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_x_w_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_xu_w_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfncvt_f_f_w_rm_mu:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 4);
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_m:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfredosum_vs_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfredusum_vs_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwredosum_vs_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfwredusum_vs_rm_tum:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_tumu:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfadd_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfsub_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrsub_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwadd_wf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwsub_wf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmul_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfdiv_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfrdiv_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmul_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmacc_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmacc_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsac_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsac_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmadd_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmadd_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfmsub_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfnmsub_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmacc_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmacc_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwmsac_vf_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vv_rm_mu:
|
||||
case RISCVVector::BI__builtin_rvv_vfwnmsac_vf_rm_mu:
|
||||
return SemaRef.BuiltinConstantArgRange(TheCall, 4, 0, 4);
|
||||
case RISCV::BI__builtin_riscv_ntl_load:
|
||||
case RISCV::BI__builtin_riscv_ntl_store:
|
||||
DeclRefExpr *DRE =
|
||||
cast<DeclRefExpr>(TheCall->getCallee()->IgnoreParenCasts());
|
||||
assert((BuiltinID == RISCV::BI__builtin_riscv_ntl_store ||
|
||||
BuiltinID == RISCV::BI__builtin_riscv_ntl_load) &&
|
||||
"Unexpected RISC-V nontemporal load/store builtin!");
|
||||
bool IsStore = BuiltinID == RISCV::BI__builtin_riscv_ntl_store;
|
||||
unsigned NumArgs = IsStore ? 3 : 2;
|
||||
|
||||
if (SemaRef.checkArgCountAtLeast(TheCall, NumArgs - 1))
|
||||
return true;
|
||||
|
||||
if (SemaRef.checkArgCountAtMost(TheCall, NumArgs))
|
||||
return true;
|
||||
|
||||
// Domain value should be compile-time constant.
|
||||
// 2 <= domain <= 5
|
||||
if (TheCall->getNumArgs() == NumArgs &&
|
||||
SemaRef.BuiltinConstantArgRange(TheCall, NumArgs - 1, 2, 5))
|
||||
return true;
|
||||
|
||||
Expr *PointerArg = TheCall->getArg(0);
|
||||
ExprResult PointerArgResult =
|
||||
SemaRef.DefaultFunctionArrayLvalueConversion(PointerArg);
|
||||
|
||||
if (PointerArgResult.isInvalid())
|
||||
return true;
|
||||
PointerArg = PointerArgResult.get();
|
||||
|
||||
const PointerType *PtrType = PointerArg->getType()->getAs<PointerType>();
|
||||
if (!PtrType) {
|
||||
Diag(DRE->getBeginLoc(), diag::err_nontemporal_builtin_must_be_pointer)
|
||||
<< PointerArg->getType() << PointerArg->getSourceRange();
|
||||
return true;
|
||||
}
|
||||
|
||||
QualType ValType = PtrType->getPointeeType();
|
||||
ValType = ValType.getUnqualifiedType();
|
||||
if (!ValType->isIntegerType() && !ValType->isAnyPointerType() &&
|
||||
!ValType->isBlockPointerType() && !ValType->isFloatingType() &&
|
||||
!ValType->isVectorType() && !ValType->isRVVSizelessBuiltinType()) {
|
||||
Diag(DRE->getBeginLoc(),
|
||||
diag::err_nontemporal_builtin_must_be_pointer_intfltptr_or_vector)
|
||||
<< PointerArg->getType() << PointerArg->getSourceRange();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!IsStore) {
|
||||
TheCall->setType(ValType);
|
||||
return false;
|
||||
}
|
||||
|
||||
ExprResult ValArg = TheCall->getArg(1);
|
||||
InitializedEntity Entity = InitializedEntity::InitializeParameter(
|
||||
Context, ValType, /*consume*/ false);
|
||||
ValArg =
|
||||
SemaRef.PerformCopyInitialization(Entity, SourceLocation(), ValArg);
|
||||
if (ValArg.isInvalid())
|
||||
return true;
|
||||
|
||||
TheCall->setArg(1, ValArg.get());
|
||||
TheCall->setType(Context.VoidTy);
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void SemaRISCV::checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D,
|
||||
const llvm::StringMap<bool> &FeatureMap) {
|
||||
ASTContext::BuiltinVectorTypeInfo Info =
|
||||
SemaRef.Context.getBuiltinVectorTypeInfo(Ty->castAs<BuiltinType>());
|
||||
unsigned EltSize = SemaRef.Context.getTypeSize(Info.ElementType);
|
||||
unsigned MinElts = Info.EC.getKnownMinValue();
|
||||
|
||||
if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Double) &&
|
||||
!FeatureMap.lookup("zve64d"))
|
||||
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve64d";
|
||||
// (ELEN, LMUL) pairs of (8, mf8), (16, mf4), (32, mf2), (64, m1) requires at
|
||||
// least zve64x
|
||||
else if (((EltSize == 64 && Info.ElementType->isIntegerType()) ||
|
||||
MinElts == 1) &&
|
||||
!FeatureMap.lookup("zve64x"))
|
||||
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve64x";
|
||||
else if (Info.ElementType->isFloat16Type() && !FeatureMap.lookup("zvfh") &&
|
||||
!FeatureMap.lookup("zvfhmin"))
|
||||
Diag(Loc, diag::err_riscv_type_requires_extension, D)
|
||||
<< Ty << "zvfh or zvfhmin";
|
||||
else if (Info.ElementType->isBFloat16Type() &&
|
||||
!FeatureMap.lookup("experimental-zvfbfmin"))
|
||||
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zvfbfmin";
|
||||
else if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Float) &&
|
||||
!FeatureMap.lookup("zve32f"))
|
||||
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve32f";
|
||||
// Given that caller already checked isRVVType() before calling this function,
|
||||
// if we don't have at least zve32x supported, then we need to emit error.
|
||||
else if (!FeatureMap.lookup("zve32x"))
|
||||
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve32x";
|
||||
}
|
||||
|
||||
/// Are the two types RVV-bitcast-compatible types? I.e. is bitcasting from the
|
||||
/// first RVV type (e.g. an RVV scalable type) to the second type (e.g. an RVV
|
||||
/// VLS type) allowed?
|
||||
///
|
||||
/// This will also return false if the two given types do not make sense from
|
||||
/// the perspective of RVV bitcasts.
|
||||
bool SemaRISCV::isValidRVVBitcast(QualType srcTy, QualType destTy) {
|
||||
assert(srcTy->isVectorType() || destTy->isVectorType());
|
||||
|
||||
auto ValidScalableConversion = [](QualType FirstType, QualType SecondType) {
|
||||
if (!FirstType->isRVVSizelessBuiltinType())
|
||||
return false;
|
||||
|
||||
const auto *VecTy = SecondType->getAs<VectorType>();
|
||||
return VecTy && VecTy->getVectorKind() == VectorKind::RVVFixedLengthData;
|
||||
};
|
||||
|
||||
return ValidScalableConversion(srcTy, destTy) ||
|
||||
ValidScalableConversion(destTy, srcTy);
|
||||
}
|
||||
|
||||
SemaRISCV::SemaRISCV(Sema &S) : SemaBase(S) {}
|
||||
|
||||
} // namespace clang
|
||||
|
Loading…
x
Reference in New Issue
Block a user